Rails 4中的区域设置回退无效

时间:2016-03-09 08:55:18

标签: ruby-on-rails ruby rails-i18n chinese-locale

我正在为新加坡,马来西亚,台湾和中国的客户建立一个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正在重置为默认值。

1 个答案:

答案 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]}

我希望这对其他人有帮助。