I'm having trouble getting i18n to work on heroku.
I set:
I18n.default_locale = :de
in my environment.rb
and the translation is in config/locales/de.yml
works perfect on my local machines but not so on Heroku.
On heroku everything is in english.
I don't think I need a special gem like i18n gem, cause I don't have it on my local machine either.
Maybe someone has a solution to this?
Try to set the default local like this in your config.environment.rb:
Rails::Initializer.run do |config|
# ...
config.i18n.default_locale = :de
end
The only solution I found that worked for me, on heroku, was setting it manually in the application controller.
application_controller.rb
before_filter :set_locale
def set_locale
I18n.locale = 'fr-QC' || I18n.default_locale
end
cheers
Related
After upgrading to Rails 5.2, (edit: using "5.2.0.rc1") I now have ?locale=en being added to my urls when I use a path constructed from path_helper (like login_path). How do I stop Rails from adding the locale to my urls? I don't need them, ever.
My controller:
```
#home_controller.rb
def index
redirect_to login_path
end
```
Application.rb
```
require_relative 'boot'
require 'rails/all'
Bundler.require(*Rails.groups)
module MyApp
class Application < Rails::Application
config.assets.initialize_on_precompile = false
config.generators do |g|
g.fixture_replacement :rspec
g.fixture_replacement :factory_bot
end
end
end
```
What Happens:
It redirects me to localhost:3000/login?locale=en
It seems like somewhere along the line in Rails 5 the path_helper regressed to no longer omit optional params like locale when constructing URLs. Only thing to do is wait for a PR to fix it. Looks like a lot have been made but unclear if they have been merged or if the fix exists in 5.2.1
https://github.com/rails/rails/pull/32526
https://github.com/rails/rails/pull/32382
https://github.com/rails/rails/pull/33846
In our Rails 4.2 app views, there is I18n error whenever there is no key found in zh-CN file:
translation missing: zh-CN.no key
Here is in local.rb under config/initializers/:
I18n.default_locale = 'zh-CN' if Rails.env.production? || Rails.env.development?
We would like to turn off this error and prevent it from showing on views. There is a post about the error for Rails 3. However the solutions are not working with Rails 4.2. Also config.i18n.fallbacks = false/true does not do the trick.
You must add both a fallback locale and a fallback language.
config.i18n.default_locale = :en
config.i18n.fallbacks = true
This should force I18n to fallback to english. I use it extensively on a Rails 4.1 app, I'm not sure if something changed over it for 4.2 though.
We can config I18n callbacks in Rails application. For example, when zh-CN translation missing, I18n will fallback to en. Configuration in my Rails 4.2.2 application like below:
config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
config.i18n.default_locale = :"zh-CN"
config.i18n.fallbacks = true
config/initializers/i18n.rb
Rails.configuration.after_initialize do
I18n.fallbacks.map(:"zh-CN" => :en)
end
Reference doc:
https://github.com/svenfuchs/i18n/wiki/Fallbacks
http://web.archive.org/web/20151019133539/paulgoscicki.com/archives/2015/02/enabling-i18n-locale-fallbacks-in-rails/
Edit: (to be clear and to the point)
I want the following to work on heroku: "11/13/2011".to_datetime, meaning I need the dates to be in english format. Thanks
I've set this the i18n locale in my application.rb
config.i18n.default_locale = :en
config.i18n.locale = :en
In the heroku console:
I18n.locale
=> :en
So it seems like it's set correctly.
But when I do:
"11/13/2011".to_datetime
=> ArgumentError: invalid date
Noooo!
Do you have any idea of what I'm doing wrong here?
Thanks.
The i18n config had nothing to do with my problem.
Just a ruby version "problem".
I was working with ruby 1.8.7 in my local env, and heroku was at 1.9.x.
Rails 1.9 assumes EU format, 1.8.7 does not.
I'm using Rails 3 with Globalize3 0.2.0.beta4
Ideally I need :fr to fallback to :en and vice versa.
There are cases when only a French translation is available and I need to show it even if the locale is :en.
I tried
config.i18n.fallbacks = { :fr => :en, :en => :fr }
but somewhat unsurprisingly it causes a stack level too deep error.
I'm changing my answer.
To enable fallbacks, add the following to your environment.rb file:
#support for locale fallbacks
require "i18n/backend/fallbacks"
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
Then, you can enable circular fallbacks like you were trying to, eg:
config.i18n.fallbacks = {'en' => 'fr', 'fr' => 'en'}
In this case, if something is missing in the en locale, it'll check the fr locale, and then the other way around. I don't get any errors running this.
Source: http://batsov.com/articles/2012/09/12/setting-up-fallback-locale-s-in-rails-3/
If you pass an array of locales they will be set as default fallbacks for all locales.
config.i18n.fallbacks = [:en, :fr]
Unfortunately, I haven't found a way to set up just two locales to fall back to each other.
In the end I monkey patched Globalize3. Not great as I have to update the patch whenever the site needs a new locale, but hey, it worked.
module Globalize
class << self
def fallbacks(locale = self.locale)
case locale
when :en then [:en, :fr]
when :fr then [:fr, :en]
end
end
end
end
This seems to have changed to this:
Globalize.fallbacks = {:en => [:en, :fr], :fr => [:fr, :en]}
Got from the official docs:
https://github.com/globalize/globalize#fallback-locales-to-each-other
In latest i18n gem (0.7.0) I have found it necessary to define fallback locales like this (in config/application.rb):
# Custom I18n fallbacks
config.after_initialize do
I18n.fallbacks = I18n::Locale::Fallbacks.new(at: :"de-DE", ch: :"de-DE", gb: :"en-US")
end
You also need to set config.i18n.fallbacks = true in all config/environments/*.rb files.
I'm using Rails 2.3.6 and I18n. Everything works fine except that I18n is using the wrong locale when sending emails. In fact it renders the following code using en.yml instead of it.yml, although my default locale is it.
Can you help me?
class UserMailer < ActionMailer::Base
default_url_options[:host] = GAME_CONFIG["domain"]
def password_reset_instructions(user)
subject I18n.translate("email_messages.lost_password.subject")
from "#{GAME_CONFIG["name"]} <no-reply##{GAME_CONFIG["domain"]}>"
recipients user.email
sent_on Time.now
body :edit_password_reset_url => edit_password_reset_url(user.perishable_token)
end
end
In my production server if I try to check for the current locale I get:
I18n.default_locale
:it
I18n.locale
:it
I discovered that this is normal behavior and I can fix this specifing :locale => ":it"