我正在为新加坡,马来西亚,台湾和中国的客户建立一个Rails 4网站。
说中文的马来西亚人的语言区域代码为zh-MY
。
我希望保留一组zh-CN
(简体中文)语言环境文件,并zh-MY
回退到zh-CN
。
只是zh
不正确,因为zh-TW
(繁体中文)是台湾使用的,而且zh-CN
之间存在很大差异。
所以这是我的config/application.rb
文件as per the Rails Guide。
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require "i18n/backend/fallbacks"
module MyAwesomeApp
class Application < Rails::Application
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
# all translations from config/locales/**/*.rb,yml are auto loaded.
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
# The default locale is :en
config.i18n.default_locale = :en
# See http://guides.rubyonrails.org/i18n.html#localized-views for a discussion of
# how language codes fall-back.
config.i18n.available_locales = [:en, :'zh-CN', :'zh-TW', :'en-SG', :'en-MY', :'zh-MY']
I18n.fallbacks.map(:'zh-MY' => :'zh-CN')
end
end
但这根本行不通。
当我实际将区域设置设置为:zh-MY
时,它不会回退到:zh-CN
而是回到:en
我错过了什么?
更新:
如果我puts "I18n.fallbacks #{I18n.fallbacks}"
,则说I18n.fallbacks {}
。显然I18n.fallbacks.map
失败了。
更新
根据评论中的建议,我在检查I18n.fallbacks[:'zh-MY']
之后在下一行查看了I18n.fallbacks
,并返回[:"zh-MY", :zh, :"zh-CN", :en]
更新
在我的binding.pry
中使用application controller
我已检查过区域设置等并观察:
[1] pry(#<ServicesController>)> I18n.locale
=> :"zh-MY"
[2] pry(#<ServicesController>)> I18n.fallbacks
=> {:en=>[:en], :"zh-MY"=>[:"zh-MY", :zh, :en]}
因此,在启动Rails应用程序和调用控制器的set_locale
方法之间,I18n.fallbacks
正在重置为默认值。
答案 0 :(得分:5)
不要问我为什么,但这有效,尽管官方文件说的是。
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require "i18n/backend/fallbacks"
Bundler.require(*Rails.groups)
module MyAwesomeApp
class Application < Rails::Application
# all translations from config/locales/**/*.rb,yml are auto loaded.
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
# The default locale is :en
config.i18n.default_locale = :en
# See http://guides.rubyonrails.org/i18n.html#localized-views for a
# mostly correct discussion of how language codes fall-back.
config.i18n.available_locales = [:en, :'zh-CN', :'zh-TW', :'en-SG', :'en-MY', :'zh-MY']
config.i18n.fallbacks = {:'zh-MY' => :'zh-CN'}
end
end
删除I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
并通过config.i18n.fallbacks = {:'zh-MY' => :'zh-CN'}
而不是I18n.fallbacks.map(:'zh-MY' => :'zh-CN')
设置后备广告,这一切都可以完美运行。
现在在我的控制器中,与第3个问题更新中讨论的断点相同:
[1] pry(#<ServicesController>)> I18n.fallbacks
=> {:en=>[:en], :"zh-MY"=>[:"zh-MY", :zh, :"zh-CN", :en]}
我希望这对其他人有帮助。