【问题标题】:i18n dynamic interpolation argumentsi18n 动态插值参数
【发布时间】:2013-09-30 16:09:09
【问题描述】:

假设我有一个由分号分隔的多个部分组成的字段 (;)。例如,这将如下所示:

'range_numeric; 10; 100'
'length_numeric; 5'

第一部分将是翻译的关键,任何后续部分将是要填充到文本中的插值。基本上它是作为命名参数传递的,但我不想为每个插值值定义键,我正在尝试使用I18n,如下所示:

en:
 length_numeric: "%{1} digits"
 range_numeric: "%{1} - %{2} digits"

我试图传递如下插值:

t(:range_numeric, 10, 100) # returns "%{1} - %{2} digits" 

那么,这样可以吗?有什么建议 ?

【问题讨论】:

  • 如果你已经有一个序列:range_numeric, 10, 100(或数组[:range_numeric, 10, 100]),那么这意味着你用分号提到你的格式与问题无关。问题应该显示相应的数组。请只写与问题相关的内容。

标签: ruby-on-rails ruby rails-i18n


【解决方案1】:

您可以通过数组项的位置将数组转换为哈希:

values = [10, 100]
mapped_values = Hash[(0...values.size).map(&:to_s).map(&:to_sym).zip(values)]
t(:range_numeric, mapped_values)

(插值键将从 0 %{0} 开始)

【讨论】:

  • 为了避免索引从0开始你可以写(1..values.size)代替(0...values.size),这也更清楚,IMO。
  • 这样做的想法是没有插值键的传递参数。不过谢谢你,好建议
【解决方案2】:

我不知道如何与 rails 交互,但是用数组插入字符串很容易。使用%s 进行简单的字符串替换。您甚至可以通过使用适当的格式语法进行更精细的控制。

"%s - %s digits" % [10, 100]
# => "10 - 100 digits"

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多