91 votes

i18n la Pluralisation

Je veux être en mesure de traduire la marque du pluriel des chaînes dans i18n dans les rails. Une chaîne peut être :

You have 2 kids 
or 
You have 1 kid

Je sais que je peux l'utiliser au pluriel méthode d'aide, mais je veux intégrer cette i18n des traductions, ce que je n'ai pas à gâcher avec mon point de vue à tout moment dans l'avenir. J'ai lu que :le comte est en quelque sorte utilisé dans les traductions du pluriel, mais je ne trouve pas de ressources réelles sur la manière dont il est mis en œuvre.

Remarquez que je sais que je peux passer une variable dans une chaîne de traduction. J'ai aussi essayé quelque chose comme :

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

Qui fonctionne très bien, mais a un problème fondamental de la même idée. J'ai besoin de spécifier la chaîne de caractères "gamin" dans la de mettre le pluriel helper. Je ne veux pas le faire parce que cela conduira à la vue des problèmes dans l'avenir. Au lieu de cela, je veux tout garder dans la traduction et rien dans la vue.

Comment puis-je le faire ?

183voto

Zabba Points 26372

Essayez ceci:

en.yml :

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

Dans une vue:

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

Mise à jour de réponse pour les langues avec plusieurs pluralisation (testé avec des Rails 3.0.7):

Fichier config/initializers/pluralization.rb:

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

Fichier 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`)

Fichier config/locales/en.yml:

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

Fichier config/locales/ru.yml:

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

Test:

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

11voto

sorin Points 23747

Tout d'abord, rappelez-vous que le nombre de formes de pluriel dépend de la langue, pour l'anglais il y a deux, pour le roumain il y a 3 et pour l'arabe il y a 6 !.

Si vous voulez être en mesure de l'utiliser correctement les formes au pluriel, vous devez utiliser gettext.

Pour Ruby et rails, vous devriez vérifier ce http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html

8voto

lukewendling Points 959

Rails 3 poignées de ce robuste avec CLDR considération et le comte d'interpolation de variable. Voir http://guides.rubyonrails.org/i18n.html#pluralization

# in view
t('actors', :count => @movie.actors.size)

# locales file, i.e. config/locales/en.yml
en:
  actors:
    one: Actor
    other: Actors

5voto

Il est en fait une alternative à la lourdeur de l'i18n approche. La solution est appelée Tr8n.

Votre code ci-dessus serait tout simplement:

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

C'est tout. Pas besoin d'extraire vos clés à partir de votre code et de les maintenir en ressources, pas besoin de mettre en œuvre la pluralisation des règles pour chaque langue. Tr8n vient avec le contexte numérique des règles pour toutes les langues. Il est également livré avec le genre de règles, les règles de liste et de la langue des cas.

La définition complète de la traduction ci-dessus clé serait effectivement ressembler à ceci:

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

Mais depuis que nous voulons économiser de l'espace et du temps, num est automatiquement adressé numériques règles et il n'est pas nécessaire de fournir toutes les options pour les valeurs de la règle. Tr8n est livré avec pluralizers et inflectors qui va faire le travail pour vous à la volée.

La traduction de votre clé en russe, serait tout simplement:

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

Par ailleurs, votre traduction serait inexact dans les langues qui ont le sexe des règles spécifiques. Par exemple, en hébreu, vous auriez fait devez spécifier au moins 2 traductions pour ton exemple, comme "Vous" serait différent en fonction du sexe de l'affichage de l'utilisateur. Tr8n le gère très bien. Voici une translittération de l'hébreu traductions:

 "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}}

Si votre seul anglais de la clé, dans ce cas, les besoins 4 traductions. Toutes les traductions sont effectuées dans un contexte d' - vous n'avez pas à casser la phrase. Tr8n a un mécanisme à la carte l'une des clés de multiples traductions basées sur la langue et le contexte - tout se fait à la volée.

Une dernière chose. Que faire si vous aviez à faire le décompte de la partie en gras? Il serait tout simplement:

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

Juste au cas où vous voulez redéfinir votre "bold" plus tard, il serait très facile - vous n'avez pas à aller à travers tous vos fichiers YAML et de le modifier, - vous venez de le faire en un seul endroit.

Pour en savoir plus, veuillez jeter un oeil ici:

https://github.com/tr8n/tr8n_rails_clientsdk

Divulgation: je suis le développeur et le responsable de Tr8n cadre et l'ensemble de ses bibliothèques.

-1voto

Francisco Alvarado Points 2057

Je pense que la meilleure chose que vous pourriez faire est d'utiliser un message aussi générique que possible, de sorte que comprend la possibilité à la fois le singulier, le duel et le pluriel nombre d'éléments. C'est, quelque chose comme:

Nombre d'enfants que vous avez: 1 (2, 3, etc)

De cette façon, vous permettra d'éviter d'autres problèmes potentiels avec la pluralisation du nombre d'éléments dans le i18n dans l'avenir, ainsi que d'autres temps et d'efforts à essayer de trouver une solution qui peut ne pas être possible pour tous les cas.

Cela couvre aussi le cas de certaines langues n'est pas seulement important si c'est 1 ou plusieurs éléments, mais l'important est de savoir si c'est 1, ou 2, ou plus de 2 éléments, tels que: le Gaélique Écossais, le slovène, et d'autres langues slaves. Ce cas particulier est connu comme double.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X