Translation in .yml with optional parameter
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!
First set my translation
I18n.t('my_translation', parameter: optional_parameter)
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"
- if value is nil
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.
Bishma Stornelli
Updated on December 09, 2021Comments
-
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 over 11 yearsYes, it's optional. I want it to change depending if the parameter is present or not. Like in my example above.
-
Yanhao over 11 yearsInstead 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 over 11 yearsNo, 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 almost 6 yearswhere's the translation of "with an optional parameter which value is " come in?....