36

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

这可能吗?

4

4 回答 4

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"
于 2012-11-01T13:43:16.523 回答
19

我会说这是可能的,但不推荐。根据您在@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

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

于 2012-11-02T09:05:06.560 回答
3

我就是这样做的!

  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"
于 2015-08-26T02:39:42.897 回答
1

如果您使用 anumber作为可选参数,请Rails提供更好的处理方式。

例如

  invoice:
    zero: "Great! You have no pending invoices."
    one: "You have only 1 pending invoice."
    other: "You have %{count} pending invoices."
  
  >> t("invoice", count: 0) 
  => Great! You have no pending invoices.

  >> t("invoice", count: 1)
  => You have only 1 pending invoice.

  >> t("invoice", count: 5) 
  => You have 5 pending invoices.
于 2021-12-09T09:43:10.173 回答