国际多元化

我想能够在国际轨道上翻译i18n中的多个string。 一个string可以是:

You have 2 kids 

要么

 You have 1 kid 

我知道我可以使用复数forms的辅助方法,但是我想把它embedded到i18n的翻译中,这样我就不用在将来的任何时候搞乱我的观点。 我读到:count翻译为复数,但我找不到任何真正的资源如何实现。

注意我知道我可以在一个转换string中传递一个variables。 我也试过类似的东西:

 <%= t 'misc.kids', :kids_num => pluralize(1, 'kid') %> 

哪些工作正常,但有一个相同的想法的根本问题。 我需要在pluralize助手中指定string'kid' 。 我不想这样做,因为这会导致未来的问题。 相反,我想把所有东西都放在翻译中,而不是在视图中。

我怎样才能做到这一点 ?

尝试这个:

en.yml

 en: misc: kids: zero: no kids one: 1 kid other: %{count} kids 

在一个视图中:

 You have <%= t('misc.kids', :count => 4) %> 

更新多语言的答案(用Rails 3.0.7testing):

文件 config/initializers/pluralization.rb

 require "i18n/backend/pluralization" I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization) 

文件 config/locales/plurals.rb

 {:ru => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| if n == 1 :one else if [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) && ![22, 23, 24].include?(n % 100) :few else :other end end } } } } } #More rules in this file: https://github.com/svenfuchs/i18n/blob/master/test/test_data/locales/plurals.rb #(copy the file into `config/locales`) 

文件 config/locales/en.yml

 en: kids: zero: en_zero one: en_one other: en_other 

文件 config/locales/ru.yml

 ru: kids: zero: ru_zero one: ru_one few: ru_few other: ru_other 

testing

 $ rails c >> I18n.translate :kids, :count => 1 => "en_one" >> I18n.translate :kids, :count => 3 => "en_other" >> I18n.locale = :ru => :ru >> I18n.translate :kids, :count => 1 => "ru_one" >> I18n.translate :kids, :count => 3 => "ru_few" #works! yay! >> I18n.translate :kids, :count => 5 => "ru_other" #works! yay! 

我希望说俄语的Ruby on Rails程序员可以find这个。 只是想分享我自己非常精确的俄罗斯多元化公式。 它基于Unicode规范 。 这里只是config/locales/plurals.rb文件的内容,其他的一切和上面的回答一样。

 {:ru => { :i18n => { :plural => { :keys => [:zero, :one, :few, :many], :rule => lambda { |n| if n == 0 :zero elsif ( ( n % 10 ) == 1 ) && ( ( n % 100 != 11 ) ) # 1, 21, 31, 41, 51, 61... :one elsif ( [2, 3, 4].include?(n % 10) \ && ![12, 13, 14].include?(n % 100) ) # 2-4, 22-24, 32-34... :few elsif ( (n % 10) == 0 || \ ![5, 6, 7, 8, 9].include?(n % 10) || \ ![11, 12, 13, 14].include?(n % 100) ) # 0, 5-20, 25-30, 35-40... :many end } } } } } 

母语人士可以享受111121 。 这里的testing结果:

  • 零:0запросов/куриц/яблок
  • one:1запрос/курица/яблоко
  • 很less:3запроса/курицы/яблока
  • 很多:5запросов/куриц/яблок
  • 一:101запрос/курица/яблоко
  • 很less:102запроса/курицы/яблока
  • 很多:105запросов/куриц/яблок
  • 很多:111запросов/куриц/яблок
  • 很多:119запросов/куриц/яблок
  • 一:121запрос/курица/яблоко
  • 很less:122запроса/курицы/яблока
  • 很多:125запросов/куриц/яблок

感谢您的初步答复!

首先,记住复数forms的数量取决于语言 ,英文有两个,罗马尼亚语有三个,阿拉伯语有六个!

如果你想能够正确使用复数forms,你必须使用gettext

对于Ruby和rails,你应该检查这个http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html

Rails 3使用CLDR考虑和计数插值variables来强有力地处理这个问题。 请参阅http://guides.rubyonrails.org/i18n.html#pluralization

 # in view t('actors', :count => @movie.actors.size) # locales file, ie config/locales/en.yml en: actors: one: Actor other: Actors 

实际上,这是一种繁琐的国际方式的替代scheme。 该解决scheme被称为Tr8n。

你上面的代码只是:

  <%= tr("You have {num || kid}", num: 1) %> 

而已。 无需从您的代码中提取您的密钥,并将其保存在资源包中,无需为每种语言实现复数规则。 Tr8n为所有语言提供数字上下文规则。 它还带有性别规则,列表规则和语言案例。

上面的翻译键的完整定义实际上是这样的:

  <%= tr("You have {num:number || one: kid, other: kids}", num: 1) %> 

但是由于我们要节省空间和时间,num会自动映射到数字规则,并且不需要为规则值提供所有选项。 Tr8n配备了多种function和inflectors,将为您在飞行中的工作。

你的钥匙在俄罗斯的翻译,只会是:

  "У вас есть {num || ребенок, ребенка, детей}" 

顺便说一句,您的翻译在具有性别特定规则的语言中是不准确的。 例如,在希伯来语中,您实际上必须为您的示例指定至less2个翻译,因为根据查看用户的性别,“您”将有所不同。 Tr8n处理得很好。 这里是一个希伯来语翻译的音译:

  "Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}} "Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}} "Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}} "Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}} 

所以在这种情况下,你的单个英文键需要4个翻译。 所有的翻译都是在上下文中完成的 – 你不必打破这个句子。 Tr8n有一个基于语言和上下文将一个键映射到多个翻译的机制 – 所有这些都是在飞行中完成的。

最后一件事。 如果你不得不使数量大胆一些呢? 这只是:

 <%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %> 

以防万一你想在以后重新定义你的“大胆” – 这将是非常容易的 – 你不需要通过所有的YAML文件,并改变它们 – 你只是在一个地方。

要了解更多,请看看这里:

https://github.com/tr8n/tr8n_rails_clientsdk

披露:我是Tr8n框架及其所有库的开发者和维护者。

英语

它只是开箱即用

en.yml

 en: kid: one: '1 kid' other: '%{count} kids' 

用法(当然,您可以在视图文件中跳过I18n):

 > I18n.t :kid, count: 1 => "1 kid" > I18n.t :kid, count: 3 => "3 kids" 

俄语(和其他复数forms的语言)

安装rails-18n gem并将翻译添加到.yml文件中,如下例所示 :

ru.yml

 ru kid: zero: 'нет детей' one: '%{count} ребенок' few: '%{count} ребенка' many: '%{count} детей' other: 'дети' 

用法:

 > I18n.t :kid, count: 0 => "нет детей" > I18n.t :kid, count: 1 => "1 ребенок" > I18n.t :kid, count: 3 => "3 ребенка" > I18n.t :kid, count: 5 => "5 детей" > I18n.t :kid, count: 21 => "21 ребенок" > I18n.t :kid, count: 114 => "114 детей" > I18n.t :kid, count: '' => "дети"