使用可选参数在.yml中进行翻译

时间:2012-11-01 13:38:43

标签: ruby-on-rails internationalization yaml

我想使用可选参数制作翻译my_translation。例如:

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

这可能吗?

3 个答案:

答案 0 :(得分:36)

是的,当然。你只需写下这样的翻译:

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

参数真的是可选的吗?在上面的翻译中,您必须提供所有参数。

更新:对不起,我回答得太早了。我认为这很容易。也许最简单的方法就是这样:

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

答案 1 :(得分:18)

我会说这是可能的,虽然不推荐。你有两个完全独立的字符串,基于你在@Yanhao回答中的评论,我想说它们应该是你的yaml文件中的两个单独的条目:

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

由于date的存在决定了要显示的字符串,您可以在控制器方法的params哈希中测试它的存在,将标题赋给变量,然后使用它在一个视图中。也许是这样的事情:

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

如果你想要完全按照你所描述的行为,你需要两个yaml条目,你有额外的卷积,你要做的I18n no-no通过将两个字符串连接在一起创建一个字符串,这假设一个固定的语法句子结构(更不用说这会驱动翻译人员):

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

代码如下:

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

因此,总而言之,我会说两个单独的整个字符串,就像在第一个例子中一样。

答案 2 :(得分:4)

这就是我做的方式!

  1. 首先设置我的翻译

    I18n.t('my_translation', parameter: optional_parameter)
    
  2. 检查值是否为零

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