Translation in .yml with optional parameter

28,265

Solution 1

Yes, definitely. You just write the translations like this:

my_translation: This is my translation with an optional parameter which value is %{parameter}

Is the parameter really optional? In above translation, you have to provide all parameters.

UPDATE: Sorry, I answered too soon. I don't think it's easy to do. Maybe the easiest way is like this:

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

Solution 2

I would say it is possible, though not recommended. You have two completely separate strings, based on your comments in @Yanhao's answer, and I would say they should be two separate entries in your yaml file:

report_name: My report
report_name_with_date: My report on %{date}

Since the existence of the date determines which string to display, you could perhaps test for its existence in in the params hash in a controller method, assign the title to a variable, and then use it in a view. Perhaps something like:

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

If you want behaviour exactly as you have described, you'd need two yaml entries anyway, and you'd have extra convolution, and you'd be doing a I18n no-no by creating a string by concatenating two strings together, which assumes a fixed grammatical sentence structure (not to mention this drives translators up the wall):

report_name_with_date: My report%{on_date}
on_date: on %{date}

with code something like this:

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

So, in summary, I'd say go with two separate whole strings, like in the first example.

Solution 3

This is the way i did it!

  1. First set my translation

    I18n.t('my_translation', parameter: optional_parameter)
    
  2. Check if value is nil

    optional_parameter = value.nil? "" : "with an optional parameter which value is #{value}"
    I18n.t('my_translation', parameter: optional_parameter)
    
    • if value is nil =>"This is my translation"
    • if value is 1 => "This is my translation with an optional parameter which value is 1"

Solution 4

If you're using a number as an optional argument, Rails provides a better way to handle it.

e.g.

  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.
Share:
28,265
Bishma Stornelli
Author by

Bishma Stornelli

Updated on December 09, 2021

Comments

  • Bishma Stornelli
    Bishma Stornelli over 2 years

    I want to make a translation my_translation with an optional parameter. For example:

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

    Is this possible?

  • Bishma Stornelli
    Bishma Stornelli over 11 years
    Yes, it's optional. I want it to change depending if the parameter is present or not. Like in my example above.
  • Yanhao
    Yanhao over 11 years
    Instead of being present or not, can the parameter always being passed? This way it'll be possible to do it with pluralization. BTW, are those values numbers?
  • Bishma Stornelli
    Bishma Stornelli over 11 years
    No, it's a title of a report. I want to pass a date so it could be "My report on %{date}" if the parameter is passed or just "My report" if it's not.
  • Tetsujin no Oni
    Tetsujin no Oni almost 6 years
    where's the translation of "with an optional parameter which value is " come in?....