Parent

R18n::I18n

General class to i18n support in your application. It load Translation and Locale classes and create pretty way to use it.

To get translation you can use same with Translation way – use method with translation’s name or [name] method. Translations will be also loaded for default locale, sublocales from first in locales and general languages for dialects (it will load fr for fr_CA too).

Translations will loaded by loader object, which must have 2 methods:

If you will use default loader (R18n.default_loader) you can pass to I18n only constructor argument for loader:

R18n::I18n.new('en', R18n::Loader::YAML.new('dir/with/translations'))

is a same as:

R18n::I18n.new('en', 'dir/with/translations')

In translation file you can use strings, numbers, floats (any YAML types) and pluralizable values (!!pl). You can use params in string values, which you can replace in program. Just write %1, %2, etc and set it values as method arguments, when you will be get value.

You can use filters for some YAML type or for all strings. See R18n::Filters for details.

R18n contain translations for common words (such as “OK”, “Cancel”, etc) for most supported locales. See base/ dir.

Usage

translations/ru.yml

one: Один

translations/en.yml

one: One
two: Two

example.rb

i18n = R18n::I18n.new(['ru', 'en'], 'translations/')

i18n.one   #=> "Один"
i18n.two   #=> "Two"

i18n.locale.title        #=> "Русский"
i18n.locale.code         #=> "ru"
i18n.locale.ltr?         #=> true

i18n.l -11000.5          #=> "−11 000,5"
i18n.l Time.now          #=> "Вск, 21 сен 2008, 22:10:10 MSD"
i18n.l Time.now, :date   #=> "21.09.2008"
i18n.l Time.now, :time   #=> "22:10"
i18n.l Time.now, '%A'    #=> "Воскресенье"

i18n.yes    #=> "Yes"
i18n.ok     #=> "OK"
i18n.cancel #=> "Cancel"

Attributes

locale[R]

First locale with locale file

locales[R]

User locales, ordered by priority

translation_places[R]

Loaders with translations files

Public Class Methods

convert_places(places) click to toggle source

Load default loader for elements in places with only constructor argument.

# File lib/r18n-core/i18n.rb, line 118
def self.convert_places(places)
  Array(places).map! do |loader|
    if loader.respond_to? :available and loader.respond_to? :load
      loader
    else
      R18n.default_loader.new(loader)
    end
  end
end
default() click to toggle source

Get default locale code

# File lib/r18n-core/i18n.rb, line 96
def self.default
  @@default
end
default=(locale) click to toggle source

Set default locale code to use when any user locales willn't be founded. It should has all translations and locale file.

# File lib/r18n-core/i18n.rb, line 91
def self.default=(locale)
  @@default = locale
end
new(locales, translation_places = nil, opts = {}) click to toggle source

Create i18n for locales with translations from translation_places and locales data. Translations will be also loaded for default locale, sublocales from first in locales and general languages for dialects (it will load fr for fr_CA too).

Locales must be a locale code (RFC 3066) or array, ordered by priority. Translation_places must be a string with path or array.

# File lib/r18n-core/i18n.rb, line 144
def initialize(locales, translation_places = nil, opts = {})
  locales = Array(locales)

  if not locales.empty? and Locale.exists? locales.first
    locales += Locale.load(locales.first).sublocales
  end
  locales << @@default
  locales.each_with_index do |locale, i|
    if locale =~ /[_-]/
      locales.insert(i + 1, locale.match(/([^_-]+)[_-]/)[1])
    end
  end
  locales.map! { |i| i.to_s.downcase }.uniq!
  @locales_codes = locales
  @locales = locales.map { |i| Locale.load(i) }

  if translation_places
    @original_places = translation_places
  else
    @original_places = R18n.extension_places
    @locale = @locales.first
  end

  @translation_places = self.class.convert_places(@original_places)

  if opts[:on_filters] or opts[:off_filters]
    @filters = CustomFilterList.new(opts[:on_filters], opts[:off_filters])
  else
    @filters = GlobalFilterList.instance
  end

  key = translation_cache_key
  if R18n.cache.has_key? key
    @locale, @translation = *R18n.cache[key]
  else
    reload!
  end
end
parse_http(str) click to toggle source

Parse HTTP_ACCEPT_LANGUAGE and return array of user locales

# File lib/r18n-core/i18n.rb, line 101
def self.parse_http(str)
  return [] if str.nil?
  locales = str.split(',')
  locales.map! do |locale|
    locale = locale.split ';q='
    if 1 == locale.size
      [locale[0], 1.0]
    else
      [locale[0], locale[1].to_f]
    end
  end
  locales.sort! { |a, b| b[1] <=> a[1] }
  locales.map! { |i| i[0] }
end

Public Instance Methods

[](name, *params) click to toggle source

Return translation with special name.

Translation can contain variable part. Just set is as %1, %2, etc in translations file and set values in next params.

# File lib/r18n-core/i18n.rb, line 281
def [](name, *params)
  @translation[name, *params]
end
Also aliased as: method_missing
available_locales() click to toggle source

Return Array of locales with available translations.

# File lib/r18n-core/i18n.rb, line 250
def available_locales
  @available ||= R18n.available_locales(@translation_places)
end
filter_list() click to toggle source

Return custom filters list

# File lib/r18n-core/i18n.rb, line 184
def filter_list
  @filters
end
l(object, format = nil, *params) click to toggle source
Alias for: localize
localize(object, format = nil, *params) click to toggle source

Convert object to String, according to the rules of the current locale. It support Fixnum, Bignum, Float, Time, Date and DateTime.

For time classes you can set format in standard strftime form, :full (“01 Jule, 2009”), :human (“yesterday”), :standard (“07/01/09”) or :month for standalone month name. Default format is :standard.

i18n.l -12000.5         #=> "−12,000.5"
i18n.l Time.now         #=> "07/01/09 12:59"
i18n.l Time.now.to_date #=> "07/01/09"
i18n.l Time.now, :human #=> "now"
i18n.l Time.now, :full  #=> "Jule 1st, 2009 12:59"
# File lib/r18n-core/i18n.rb, line 267
def localize(object, format = nil, *params)
  locale.localize(object, format, self, *params)
end
Also aliased as: l
method_missing(name, *params) click to toggle source
Alias for: []
reload!() click to toggle source

Reload translations.

# File lib/r18n-core/i18n.rb, line 200
def reload!
  @available = @available_codes = nil
  @translation_places = self.class.convert_places(@original_places)

  available_in_places = @translation_places.map { |i| [i, i.available] }
  available_in_extensions = R18n.extension_places.map {|i| [i, i.available]}

  unless @locale
    available_in_places.each do |place, available|
      @locales.each do |locale|
        if available.include? locale
          @locale = locale
          break
        end
      end
      break if @locale
    end
  end
  @locale ||= @locales.first
  unless @locale.supported?
    @locales.each do |locale|
      if locale.supported?
        @locale.base = locale
        break
      end
    end
  end

  @translation = Translation.new(@locale, '', :filters => @filters)
  @locales.each do |locale|
    loaded = false
    available_in_places.each do |place, available|
      if available.include? locale
        @translation.merge! place.load(locale), locale
        loaded = true
      end
    end
    if loaded
      available_in_extensions.each do |extension, available|
        if available.include? locale
          @translation.merge! extension.load(locale), locale
        end
      end
    end
  end

  R18n.cache[translation_cache_key] = [@locale, @translation]
end
t() click to toggle source

Return translations.

# File lib/r18n-core/i18n.rb, line 273
def t
  @translation
end
translation_cache_key() click to toggle source

Return unique key for current locales in translation and places.

# File lib/r18n-core/i18n.rb, line 189
def translation_cache_key
  @available_codes ||= @translation_places.inject([]) { |all, i|
    all + i.available }.uniq.map { |i| i.code.downcase }
  (@locales_codes & @available_codes).join(',') + '@' +
    @filters.hash.to_s + '_' +
    R18n.default_loader.hash.to_s + '_' +
    @translation_places.hash.to_s + '_' +
    R18n.extension_places.hash.to_s
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.