diff options
Diffstat (limited to 'lib/i18n_fixes.rb')
-rw-r--r-- | lib/i18n_fixes.rb | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/lib/i18n_fixes.rb b/lib/i18n_fixes.rb new file mode 100644 index 000000000..fad258a72 --- /dev/null +++ b/lib/i18n_fixes.rb @@ -0,0 +1,159 @@ +# Some of the monkeypatches in this file should possibly be submitted +# as patches, but most are here because they should go away when we +# upgrade to Rails 3.x + +# override behaviour in fast_gettext/translation.rb +# so that we can interpolate our translation strings nicely + +def _(key, options = {}) + translation = FastGettext._(key) || key + gettext_interpolate(translation, options) +end + +INTERPOLATION_RESERVED_KEYS = %w(scope default) +MATCH = /(\\\\)?\{\{([^\}]+)\}\}/ + +def gettext_interpolate(string, values) + return string unless string.is_a?(String) + if values.is_a?(Hash) + string.gsub(MATCH) do + escaped, pattern, key = $1, $2, $2.to_sym + + if escaped + pattern + elsif INTERPOLATION_RESERVED_KEYS.include?(pattern) + raise ReservedInterpolationKey.new(pattern, string) + elsif !values.include?(key) + raise MissingInterpolationArgument.new(pattern, string) + else + values[key].to_s + end + end + else + reserved_keys = if defined?(I18n::RESERVED_KEYS) # rails 3+ + I18n::RESERVED_KEYS + else + I18n::Backend::Base::RESERVED_KEYS + end + + string % values.except(*reserved_keys) + end +end + + +module I18n + # used by Globalize plugin. + # XXX much of this stuff should (might?) be in newer versions of Rails + @@fallbacks = nil + class << self + # Returns the current fallbacks implementation. Defaults to +I18n::Locale::Fallbacks+. + def fallbacks + @@fallbacks ||= I18n::Locale::Fallbacks.new + end + end + + module Locale + module Tag + class Simple + class << self + def tag(tag) + new(tag) + end + end + + attr_reader :tag + + def initialize(*tag) + @tag = tag.join('-').to_sym + end + + def subtags + @subtags = tag.to_s.split('-').map { |subtag| subtag.to_s } + end + + def to_sym + tag + end + + def to_s + tag.to_s + end + + def to_a + subtags + end + + def parent + @parent ||= begin + segs = to_a.compact + segs.length > 1 ? self.class.tag(*segs[0..(segs.length-2)].join('-')) : nil + end + end + + def self_and_parents + @self_and_parents ||= [self] + parents + end + + def parents + @parents ||= ([parent] + (parent ? parent.parents : [])).compact + end + + + end + end + class Fallbacks < Hash + def initialize(*mappings) + @map = {} + map(mappings.pop) if mappings.last.is_a?(Hash) + self.defaults = mappings.empty? ? [I18n.default_locale.to_sym] : mappings + end + + def defaults=(defaults) + @defaults = defaults.map { |default| compute(default, false) }.flatten + end + attr_reader :defaults + + def [](locale) + raise InvalidLocale.new(locale) if locale.nil? + locale = locale.to_sym + super || store(locale, compute(locale)) + end + + def map(mappings) + mappings.each do |from, to| + from, to = from.to_sym, Array(to) + to.each do |_to| + @map[from] ||= [] + @map[from] << _to.to_sym + end + end + end + + protected + + def compute(tags, include_defaults = true) + result = Array(tags).collect do |tag| + tags = I18n::Locale::Tag::Simple.tag(tag).self_and_parents.map! { |t| t.to_sym } + tags.each { |_tag| tags += compute(@map[_tag]) if @map[_tag] } + tags + end.flatten + result.push(*defaults) if include_defaults + result.uniq.compact + end + end + autoload :Fallbacks, 'i18n/locale/fallbacks' + end +end + + +# this monkeypatch corrects inconsistency with gettext_i18n_rails +# where the latter deals with strings but rails i18n deals with +# symbols for locales +module GettextI18nRails + class Backend + def available_locales + FastGettext.available_locales.map{|l| l.to_sym} || [] + end + end +end + |