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?
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"
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.
C'est comme ça que je l'ai fait!
Définissez d'abord ma traduction
I18n.t('my_translation', parameter: optional_parameter)
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)
=>"This is my translation"
=> "This is my translation with an optional parameter which value is 1"