Method: I18n::Base#translate
- Defined in:
- lib/i18n.rb
#translate(key = nil, throw: false, raise: false, locale: nil, **options) ⇒ Object Also known as: t
Translates, pluralizes and interpolates a given key using a given locale, scope, and default, as well as interpolation values.
LOOKUP
Translation data is organized as a nested hash using the upper-level keys as namespaces. E.g., ActionView ships with the translation: :date => {:formats => {:short => "%b %d"}}
.
Translations can be looked up at any level of this hash using the key argument and the scope option. E.g., in this example I18n.t :date
returns the whole translations hash {:formats => {:short => "%b %d"}}
.
Key can be either a single key or a dot-separated key (both Strings and Symbols work). E.g., the short format can be looked up using both:
I18n.t 'date.formats.short'
I18n.t :'date.formats.short'
Scope can be either a single key, a dot-separated key or an array of keys or dot-separated keys. Keys and scopes can be combined freely. So these examples will all look up the same short date format:
I18n.t 'date.formats.short'
I18n.t 'formats.short', :scope => 'date'
I18n.t 'short', :scope => 'date.formats'
I18n.t 'short', :scope => %w(date formats)
INTERPOLATION
Translations can contain interpolation variables which will be replaced by values passed to #translate as part of the options hash, with the keys matching the interpolation variable names.
E.g., with a translation :foo => "foo %{bar}"
the option value for the key bar
will be interpolated into the translation:
I18n.t :foo, :bar => 'baz' # => 'foo baz'
PLURALIZATION
Translation data can contain pluralized translations. Pluralized translations are arrays of singular/plural versions of translations like ['Foo', 'Foos']
.
Note that I18n::Backend::Simple
only supports an algorithm for English pluralization rules. Other algorithms can be supported by custom backends.
This returns the singular version of a pluralized translation:
I18n.t :foo, :count => 1 # => 'Foo'
These both return the plural version of a pluralized translation:
I18n.t :foo, :count => 0 # => 'Foos'
I18n.t :foo, :count => 2 # => 'Foos'
The :count
option can be used both for pluralization and interpolation. E.g., with the translation :foo => ['%{count} foo', '%{count} foos']
, count will be interpolated to the pluralized translation:
I18n.t :foo, :count => 1 # => '1 foo'
DEFAULTS
This returns the translation for :foo
or default
if no translation was found:
I18n.t :foo, :default => 'default'
This returns the translation for :foo
or the translation for :bar
if no translation for :foo
was found:
I18n.t :foo, :default => :bar
Returns the translation for :foo
or the translation for :bar
or default
if no translations for :foo
and :bar
were found.
I18n.t :foo, :default => [:bar, 'default']
BULK LOOKUP
This returns an array with the translations for :foo
and :bar
.
I18n.t [:foo, :bar]
Can be used with dot-separated nested keys:
I18n.t [:'baz.foo', :'baz.bar']
Which is the same as using a scope option:
I18n.t [:foo, :bar], :scope => :baz
LAMBDAS
Both translations and defaults can be given as Ruby lambdas. Lambdas will be called and passed the key and options.
E.g. assuming the key :salutation
resolves to:
lambda { |key, | [:gender] == 'm' ? "Mr. #{[:name]}" : "Mrs. #{[:name]}" }
Then I18n.t(:salutation, :gender => 'w', :name => 'Smith')
will result in “Mrs. Smith”.
Note that the string returned by lambda will go through string interpolation too, so the following lambda would give the same result:
lambda { |key, | [:gender] == 'm' ? "Mr. %{name}" : "Mrs. %{name}" }
It is recommended to use/implement lambdas in an “idempotent” way. E.g. when a cache layer is put in front of I18n.translate it will generate a cache key from the argument values passed to #translate. Therefore your lambdas should always return the same translations/values per unique combination of argument values.
Ruby 2.7+ keyword arguments warning
This method uses keyword arguments. There is a breaking change in ruby that produces warning with ruby 2.7 and won’t work as expected with ruby 3.0 The “hash” parameter must be passed as keyword argument.
Good:
I18n.t(:salutation, :gender => 'w', :name => 'Smith')
I18n.t(:salutation, **{ :gender => 'w', :name => 'Smith' })
I18n.t(:salutation, **any_hash)
Bad:
I18n.t(:salutation, { :gender => 'w', :name => 'Smith' })
I18n.t(:salutation, any_hash)
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/i18n.rb', line 211 def translate(key = nil, throw: false, raise: false, locale: nil, **) # TODO deprecate :raise locale ||= config.locale raise Disabled.new('t') if locale == false enforce_available_locales!(locale) backend = config.backend if key.is_a?(Array) key.map do |k| translate_key(k, throw, raise, locale, backend, ) end else translate_key(key, throw, raise, locale, backend, ) end end |