Translation in .yml with optional parameter

拥有回忆 提交于 2019-12-06 16:34:36

问题


I want to make a translation my_translation with an optional parameter. For example:

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

Is this possible?


回答1:


Yes, definitely. You just write the translations like this:

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

Is the parameter really optional? In above translation, you have to provide all parameters.

UPDATE: Sorry, I answered too soon. I don't think it's easy to do. Maybe the easiest way is like this:

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



回答2:


I would say it is possible, though not recommended. You have two completely separate strings, based on your comments in @Yanhao's answer, and I would say they should be two separate entries in your yaml file:

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

Since the existence of the date determines which string to display, you could perhaps test for its existence in in the params hash in a controller method, assign the title to a variable, and then use it in a view. Perhaps something like:

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

If you want behaviour exactly as you have described, you'd need two yaml entries anyway, and you'd have extra convolution, and you'd be doing a I18n no-no by creating a string by concatenating two strings together, which assumes a fixed grammatical sentence structure (not to mention this drives translators up the wall):

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

with code something like this:

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

So, in summary, I'd say go with two separate whole strings, like in the first example.




回答3:


This is the way i did it!

  1. First set my translation

    I18n.t('my_translation', parameter: optional_parameter)
    
  2. Check if value is nil

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


来源:https://stackoverflow.com/questions/13178268/translation-in-yml-with-optional-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!