Подтвердить что ты не робот

Перевод в .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"

Возможно ли это?

4b9b3361

Ответ 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"

Ответ 2

Я бы сказал, что это возможно, хотя и не рекомендуется. У вас две полностью отдельные строки, основанные на ваших комментариях в ответе @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

Итак, в общем, я бы сказал, что нужно использовать две отдельные целые строки, как в первом примере.

Ответ 3

Так я это сделал!

  • Сначала установите мой перевод

    I18n.t('my_translation', parameter: optional_parameter)
    
  • Проверьте, нет ли значения nil

    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"