Rails 4中的本地化回退不起作用

4
我正在为新加坡、马来西亚、台湾和中国的客户建立一个Rails 4网站。
一个说中文的马来西亚人的区域代码是“zh-MY”。
我想保留一个基本的“zh-CN”(简体中文)语言环境文件,并让“zh-MY”回退到“zh-CN”。
仅有“zh”是不正确的,因为台湾使用的是“zh-TW”(繁体中文),与“zh-CN”存在很大的差异。
所以这里是我的“config/application.rb”文件,按照Rails指南的要求
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之后,我立即查看了 I18n.fallbacks[:'zh-MY'],它返回了 [:"zh-MY", :zh, :"zh-CN", :en]

更新: 在我的application controller中添加了一个 binding.pry,检查了语言环境等,并观察到以下信息:

[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 被重置为默认值。


您正在使用未知的区域设置,不确定默认后端是否支持它们。 - prusswan
它们都是常见的本地化代码,并通过 available_locales 进行设置。 - Dave Sag
你从 I18n.fallbacks[:'zh-MY'] 中得到什么? - prusswan
这很奇怪。I18n.fallbacks{},但 I18n.fallbacks[:'zh-MY'] 返回 [:"zh-MY", :zh, :"zh-CN", :en] - Dave Sag
1个回答

6
不要问我为什么,但这个方法有效,尽管官方文档说不行。
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]}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接