web-dev-qa-db-fra.com

Traduction en .yml avec paramètre optionnel

Je veux faire une traduction my_translation avec un paramètre facultatif. Par exemple:

> I18n.t('my_translation')
=> "This is my translation"
> I18n.t('my_translation', parameter: 1)
=> "This is my translation with an optional parameter which value is 1"

Est-ce possible?

33
Bishma Stornelli

Oui définitivement. Vous écrivez juste les traductions comme ceci:

my_translation: This is my translation with an optional parameter which value is %{parameter}

Le paramètre est-il vraiment facultatif? Dans la traduction ci-dessus, vous devez fournir tous les paramètres.

MISE À JOUR: Désolé, j'ai répondu trop tôt. Je ne pense pas que ce soit facile à faire. Peut-être que le moyen le plus simple est comme ceci:

> I18n.t('my_translation1')
=> "This is my translation"
> I18n.t('my_translation2', parameter: 1)
=> "This is my translation with an optional parameter which value is 1"
36
Yanhao

Je dirais que c'est possible, mais pas recommandé. Vous avez deux chaînes complètement distinctes, basées sur vos commentaires dans la réponse de @ Yanhao, et je dirais qu'elles devraient être deux entrées distinctes dans votre fichier yaml:

report_name: My report
report_name_with_date: My report on %{date}

Étant donné que l'existence de date détermine la chaîne à afficher, vous pouvez peut-être tester son existence dans le hachage params dans une méthode de contrôleur, attribuer le titre à une variable, puis l'utiliser dans une vue. Peut-être quelque chose comme:

report_date = params[:report_date]
if report_date && report_date.is_a?(Date)
  @report_name = I18n.t('report_name_with_date', date: report_date.to_s)
else
  @report_name = I18n.t('report_name')
end

Si vous voulez un comportement exactement comme vous l'avez décrit, vous aurez quand même besoin de deux entrées yaml, et vous aurez une convolution supplémentaire, et vous feriez un I18n non -non en créant une chaîne en concaténant deux chaînes ensemble, ce qui suppose une structure de phrase grammaticale fixe (sans parler de cela conduit les traducteurs vers le haut du mur):

report_name_with_date: My report%{on_date}
on_date: on %{date}

avec du code quelque chose comme ceci:

report_date = params[:report_date]
if report_date && report_date.is_a?(Date)
  on_date = I18n.t('on_date', date: report_date.to_s)
  @report_name = I18n.t('report_name_with_date', on_date: " #{on_date}")
else
  @report_name = I18n.t('report_name_with_date', on_date: nil)
end

Donc, en résumé, je dirais aller avec deux chaînes entières distinctes, comme dans le premier exemple.

19
Paul Fioravanti

C'est comme ça que je l'ai fait!

  1. Définissez d'abord ma traduction

    I18n.t('my_translation', parameter: optional_parameter)
    
  2. Vérifiez si la valeur est nulle

    optional_parameter = value.nil? "" : "with an optional parameter which value is #{value}"
    I18n.t('my_translation', parameter: optional_parameter)
    
    • si la valeur est nulle =>"This is my translation"
    • si la valeur est 1 => "This is my translation with an optional parameter which value is 1"
4