1. ホーム
  2. ruby-on-rails

[解決済み] i18nの複数化

2023-03-20 22:20:47

質問

railsの国際化で複数形の文字列を翻訳できるようにしたいです。文字列は、:

You have 2 kids

または

You have 1 kid

pluralizeヘルパーメソッドを使えばいいのは分かっているのですが、将来的にいつビューがおかしくなってもいいように、国際化翻訳でこれを埋め込みたいのです。私は、次のように読みました。 :count が何らかの形で複数形の翻訳に使用されることを読みましたが、それがどのように実装されるかについての実際のリソースを見つけることができません。

私は翻訳文字列で変数を渡すことができることを知っていることに注意してください。私はまた、次のようなことを試しました。

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

これは問題なく動作しますが、同じアイデアの根本的な問題があります。文字列を指定する必要がある '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.7でテスト済み)。

ファイル 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

テスト :

$ 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!