Аргументы динамической интерполяции i18n

Допустим, у меня есть поле, состоящее из нескольких частей, разделенных точкой с запятой (;). Например, это будет выглядеть следующим образом:

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

Итак, возможно ли это сделать таким образом? Какие-либо предложения ?


person Talgat Medetbekov    schedule 25.09.2013    source источник
comment
Если у вас уже есть последовательность :range_numeric, 10, 100 (или массив [:range_numeric, 10, 100]), то это означает, что ваше упоминание о вашем формате с точкой с запятой не имеет отношения к вопросу. Вместо этого вопрос должен отображать соответствующие массивы. Пожалуйста, пишите только то, что имеет отношение к вопросу.   -  person sawa    schedule 25.09.2013


Ответы (2)


Я не знаю, как взаимодействовать с рельсами, но интерполировать строку с массивом легко. Используйте %s для простой замены строки. Вы можете даже лучше контролировать, используя соответствующий синтаксис формата.

"%s - %s digits" % [10, 100]
# => "10 - 100 digits"
person sawa    schedule 25.09.2013

Вы можете преобразовать массив в хеш по положению элементов массива:

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

(Ключи интерполяции начинаются с 0 %{0})

person spas    schedule 25.09.2013
comment
Чтобы избежать индекса, начинающегося с 0, вы можете написать (1..values.size) вместо (0...values.size), это также более понятно, ИМО. - person toro2k; 25.09.2013
comment
Идея сделать это заключается в передаче аргументов без ключей интерполяции. Но спасибо, хорошее предложение - person Talgat Medetbekov; 25.09.2013