首页
学习
活动
专区
圈层
工具
发布

i18n复数
EN

Stack Overflow用户
提问于 2011-05-29 13:06:53
回答 7查看 51.1K关注 0票数 91

我希望能够在rails中翻译i18n中的复数字符串。字符串可以是:

代码语言:javascript
复制
You have 2 kids

代码语言:javascript
复制
You have 1 kid

我知道我可以使用method helper方法,但我想将其嵌入到i18n翻译中,这样我就不会在未来的任何时候搞砸我的视图。我读到:count以某种方式用于复数的翻译,但我找不到任何关于它是如何实现的真正资源。

请注意,我知道我可以在转换字符串中传递变量。我还尝试了一些类似的东西:

代码语言:javascript
复制
<%= t 'misc.kids', :kids_num => pluralize(1, 'kid') %>

它工作得很好,但有一个基本的问题,就是同样的想法。我需要在'kid' helper中指定字符串'kid'。我不想这样做,因为这会导致未来的视图问题。相反,我想保留翻译中的所有内容,而不是视图中的任何内容。

我该怎么做呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-29 13:13:55

试试这个:

en.yml

代码语言:javascript
复制
en:
  misc:
    kids:
      zero: no kids
      one: 1 kid
      other: %{count} kids

在视图中:

代码语言:javascript
复制
You have <%= t('misc.kids', :count => 4) %>

针对具有多个复数形式的语言的更新答案(使用Rails 3.0.7测试):

文件 config/initializers/pluralization.rb

代码语言:javascript
复制
require "i18n/backend/pluralization" 
I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)

文件 config/locales/plurals.rb

代码语言:javascript
复制
{: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

代码语言:javascript
复制
en:
  kids:
    zero: en_zero
    one: en_one
    other: en_other

文件 config/locales/ru.yml

代码语言:javascript
复制
ru:
  kids:
    zero: ru_zero
    one: ru_one
    few: ru_few
    other: ru_other

测试

代码语言:javascript
复制
$ 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! 
票数 181
EN

Stack Overflow用户

发布于 2014-11-18 02:55:21

我希望讲俄语的Ruby on Rails程序员能找到这一点。只想分享我自己非常精确的俄语复数公式。它是基于Unicode Specs的。这里只是config/locales/plurals.rb文件的内容,其他的一切都应该和上面的答案一样。

代码语言:javascript
复制
{: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这样的大小写。下面是测试结果:

零:0запросов/куриц/яблок

  • one: 1запрос/курица/яблоко

  • few: 3запроса/курицы/яблока

  • many: 5запросов/куриц/яблок

  • one: 101запрос/курица/яблоко

  • few: 102запроса/курицы/яблока

  • many: 105запросов/куриц/яблок

  • many: 111запросов/куриц/яблок

  • many: 119запросов/куриц/яблок

  • one: 121запрос/курица/яблоко

  • few: 122
  • /яблока
  • many: 125запросов/куриц/яблок

感谢您的初步答复!

票数 39
EN

Stack Overflow用户

发布于 2011-05-29 14:07:17

首先,记住复数形式的数量取决于语言,英语有两种,罗马尼亚语有3种,阿拉伯语有6种!

如果你想正确地使用复数形式,你必须使用gettext

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6166064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档