如果翻译缺失,请回到默认语言

在一个国际化的Rails(2.3.5)应用程序,我想显示从默认语言环境,而不是“翻译缺失”的翻译 – 有一张票,但它似乎仍然悬而未决:

https://rails.lighthouseapp.com/projects/8994/tickets/2637-patch-i18n-look-up-a-translation-with-the-default-locale-when-its-missed-with-another-specific-现场

例如(取自票证),带有两个翻译文件en.yml和es.yml:

en: hello: 'hello' hello_world: 'hello world' es: hello_world: 'hola mundo' 

当我执行这个代码:

 I18n.t :hello, :locale => :es 

Rails返回“hello”,而不是“翻译缺失”的跨度。

由于票证仍然未决,我怎么能实现这个function? 我知道我可以通过改变我所有的I18n.t调用来获得:default选项,但是如果我能避免,我宁愿不必去浏览所有的视图! 因为这是一个补丁,我想我可以将它应用到Rails冰冻gem上,但是如果可以的话,我宁愿避免。

如果您使用的是Rails 2 ,只要您使用最新的I18n gem,请将其添加到初始化程序中:

 I18n.backend.class.send(:include, I18n::Backend::Fallbacks) 

然后你可以添加像这样的回退:

 I18n.fallbacks.map('es' => 'en') 

现在没有必要使用单独的i18n gem,在普通的Rails 3.0.6及更高版本(含5.0)的安装中, fallbacks值可以是下列之一

 # application.rb # rails will fallback to config.i18n.default_locale translation config.i18n.fallbacks = true # rails will fallback to en, no matter what is set as config.i18n.default_locale config.i18n.fallbacks = [:en] # fallbacks value can also be a hash - a map of fallbacks if you will # missing translations of es and fr languages will fallback to english # missing translations in german will fallback to french ('de' => 'fr') config.i18n.fallbacks = {'es' => 'en', 'fr' => 'en', 'de' => 'fr'} 

我认为最简单的就是把它添加到你的configuration文件(例如application.rb)中:

  config.i18n.fallbacks = true 

对于en-US,en-CA等区域语言环境非常有用,因为它们可以自动回退到语言环境en。

正如Jimmy所指出的那样,您甚至可以通过以下方式改变回退机制:

 I18n.fallbacks.map('es' => 'en') 

如果你不想将这个补丁应用到你的Rails gem上,你可以创build你自己的包含补丁的代码,并将它们与gem混合。

在查看补丁时,需要在两处更新代码(第三位是testing部分)。

第一部分( i18n.rb )是一个模块,所以通过编写一个包含这样的文件的文件

 module I18n @@use_default_locale_on_missing_translation = false ...etc... end 

你可以添加修改后的代码。 第二个文件( simple.rb )可以用类似的方法更新,除了它是你正在更新的类。

在创build包含修改的2个文件后,您需要将这两个文件包含在application.rb中或类似的位置上。 而Rails的gem代码应该更新您的自定义代码。