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

我想用可选参数进行翻译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" 

这可能吗?

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

 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" 

我会说这是可能的,虽然不推荐。 你有两个完全独立的字符串,根据你在@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 

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

这就是我做的方式!

  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"