class R18n::Locale
Information about locale (language, country and other special variant
preferences). Locale was named by RFC 3066. For
example, locale for French speaking people in Canada will be
fr-CA
.
Locale classes are placed in
R18n::Locales
module and storage install locales/
dir.
Each locale has sublocales
– often known languages for people
from this locale. For example, many Belorussians know Russian and English.
If there is’t translation for Belorussian, it will be searched in Russian
and next in English translations.
Usage¶ ↑
Get Russian locale and print it information
ru = R18n.locale('ru') ru.title #=> "Русский" ru.code #=> "ru" ru.ltr? #=> true
Available data¶ ↑
-
code
– locale RFC 3066 code; -
title
– locale name on it language; -
ltr?
– true on left-to-right writing direction, false for Arabic and Hebrew); -
sublocales
– often known languages for people from this locale; -
week_start
– does week start from:monday
or:sunday
.
You can see more available data about locale in samples in
locales/
dir.
Constants
- LOCALES_DIR
Public Class Methods
Codes of all available locales.
# File lib/r18n-core/locale.rb, line 63 def self.available Dir.glob(File.join(LOCALES_DIR, '*.rb')).map do |i| File.basename(i, '.rb') end end
Is locale
has info file.
# File lib/r18n-core/locale.rb, line 70 def self.exists?(locale) File.exists?(File.join(LOCALES_DIR, locale.to_s + '.rb')) end
Load locale by RFC 3066 code
.
# File lib/r18n-core/locale.rb, line 75 def self.load(code) original = code.to_s.gsub(/[^-_a-zA-Z]/, '') code = original.gsub('_', '-').downcase @@loaded[code] ||= begin if exists? code require LOCALES_DIR.join("#{code}.rb").to_s name = code.gsub(/[\w\d]+/) { |i| i.capitalize }.gsub('-', '') eval('R18n::Locales::' + name).new else UnsupportedLocale.new(original) end end end
Set locale properties
. Locale class
will have methods for each propetry name, which return propetry value:
class R18n::Locales::En < R18n::Locale set title: 'English', code: 'en' end locale = R18n::Locales::En.new locale.title #=> "English" locale.code #=> "en"
# File lib/r18n-core/locale.rb, line 101 def self.set(properties) properties.each_pair do |key, value| define_method(key) { value } end end
Public Instance Methods
Is another locale has same code.
# File lib/r18n-core/locale.rb, line 130 def ==(locale) self.class == locale.class end
Locale RFC 3066 code.
# File lib/r18n-core/locale.rb, line 108 def code name = self.class.name.split('::').last lang, culture = name.match(/([A-Z][a-z]+)([A-Z]\w+)?/).captures lang.downcase + (culture ? '-' + culture.upcase : '') end
Format date
in most official form. For example, “December
31st, 2009”. For special cases you can replace it in locale’s class. If
year
is false date will be without year.
# File lib/r18n-core/locale.rb, line 286 def format_date_full(date, year = true, *params) format = full_format format = year_format.sub('_', format) if year strftime(date, format) end
Format date
in human usable form. For example “5 days ago” or
“yesterday”. In now
you can set base time, which be used to
get relative time. For special cases you can replace it in locale’s class.
# File lib/r18n-core/locale.rb, line 260 def format_date_human(date, i18n, now = Date.today, *params) days = (date - now).to_i case days when -6..-2 i18n.human_time.days_ago(days.abs) when -1 i18n.human_time.yesterday when 0 i18n.human_time.today when 1 i18n.human_time.tomorrow when 2..6 i18n.human_time.after_days(days) else format_date_full(date, date.year != now.year) end end
Format date
in compact form. For example, “12/31/09”.
# File lib/r18n-core/locale.rb, line 279 def format_date_standard(date, *params) strftime(date, date_format) end
Returns the float in String form, according to the rules of the locale. It will also put real typographic minus.
# File lib/r18n-core/locale.rb, line 189 def format_float(float) decimal = number_decimal self.format_integer(float.to_i) + decimal + float.to_s.split('.').last end
Returns the integer in String form, according to the rules of the locale. It will also put real typographic minus.
# File lib/r18n-core/locale.rb, line 177 def format_integer(integer) str = integer.to_s str[0] = '−' if 0 > integer # Real typographic minus group = number_group str.gsub(/(\d)(?=(\d\d\d)+(?!\d))/) do |match| match + group end end
Format time
and set date
# File lib/r18n-core/locale.rb, line 219 def format_time(date, time) strftime(time, time_format).sub('_', date.to_s) end
Format time
in most official form. For example, “December
31st, 2009 12:59”. For special cases you can replace it in locale’s class.
# File lib/r18n-core/locale.rb, line 253 def format_time_full(time, *params) format_time(format_date_full(time), time) end
Format time
in human usable form. For example “5 minutes ago”
or “yesterday”. In now
you can set base time, which be used to
get relative time. For special cases you can replace it in locale’s class.
# File lib/r18n-core/locale.rb, line 226 def format_time_human(time, i18n, now = Time.now, *params) minutes = (time - now) / 60.0 diff = minutes.abs if (diff > 24 * 60) or (time.mday != now.mday and diff > 12 * 24) format_time(format_date_human(time.to_date, i18n, now.to_date), time) else if -1 < minutes and 1 > minutes i18n.human_time.now elsif 60 <= minutes i18n.human_time.after_hours((diff / 60.0).floor) elsif -60 >= minutes i18n.human_time.hours_ago((diff / 60.0).floor) elsif 0 < minutes i18n.human_time.after_minutes(minutes.round) else i18n.human_time.minutes_ago(minutes.round.abs) end end end
Format time
in compact form. For example, “12/31/09 12:59”.
# File lib/r18n-core/locale.rb, line 247 def format_time_standard(time, *params) format_time(format_date_standard(time), time) end
Human readable locale code and title.
# File lib/r18n-core/locale.rb, line 140 def inspect "Locale #{code} (#{title})" end
Convert object
to String. 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
.
# File lib/r18n-core/locale.rb, line 151 def localize(obj, format = nil, *params) case obj when Integer format_integer(obj) when Float, BigDecimal format_float(obj.to_f) when Time, DateTime, Date return strftime(obj, format) if format.is_a? String return month_standalone[obj.month - 1] if :month == format return obj.to_s if :human == format and not params.first.is_a? I18n type = obj.is_a?(Date) ? 'date' : 'time' format = :standard unless format unless [:human, :full, :standard].include? format raise ArgumentError, "Unknown time formatter #{format}" end send "format_#{type}_#{format}", obj, *params else obj.to_s end end
Is locale has left-to-right write direction.
# File lib/r18n-core/locale.rb, line 127 def ltr?; true; end
# File lib/r18n-core/locale.rb, line 123 def month_abbrs; month_names; end
# File lib/r18n-core/locale.rb, line 122 def month_standalone; month_names; end
Return pluralization type for n
items. This is simple form.
For special cases you can replace it in locale’s class.
# File lib/r18n-core/locale.rb, line 294 def pluralize(n) case n when 0 0 when 1 1 else 'n' end end
Same that Time.strftime
, but translate months and week days
names. In time
you can use Time, DateTime or Date object. In
format
you can use standard strftime
format.
# File lib/r18n-core/locale.rb, line 197 def strftime(time, format) translated = '' format.scan(/%[EO]?.|./o) do |c| case c.sub(/^%[EO]?(.)$/o, '%\1') when '%A' translated << wday_names[time.wday] when '%a' translated << wday_abbrs[time.wday] when '%B' translated << month_names[time.month - 1] when '%b' translated << month_abbrs[time.month - 1] when '%p' translated << (time.hour < 12 ? time_am : time_pm) else translated << c end end time.strftime(translated) end
Is locale has information file. In this class always return true.
# File lib/r18n-core/locale.rb, line 135 def supported? true end
# File lib/r18n-core/locale.rb, line 124 def wday_abbrs; wday_names; end