How to set a cn locale to rails app? - ruby-on-rails

I trying to add a chinese language.I was used gem rails i18n, and when I make that
I18n.locale = :cn
console show me an error
I18n::InvalidLocale: :cn is not a valid locale
or that
I18n.locale = :"zh-CN"
locale do not working
how fix it?

You need to change the following line to false in application.rb
config.i18n.enforce_available_locales = false

Related

Remove automated ?locale=en in URL

Every URL generated in my Rails app has ?locale=en appended to it. I don't understand it and I don't want it. How can I remove it?
I do not set "default_url_options" in application_controller.rb
Here is the content of my config/application.rb
config.i18n.available_locales = %i[en es]
config.i18n.default_locale = :en
config.i18n.fallbacks = [I18n.default_locale]
config.i18n.fallbacks = true
My Setup:
- Rails 6.0.2.2
- Ruby 2.7.0
- Globalize gem

Rails 4.2 - how to turn off I18n error `translation missing` on views

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/

Heroku: to_datetime does not take into account the rails' i18n.locale

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.

Is it possible to make rails i18n locales fallback to each other?

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.

Heroku and i18n Problems

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

Resources