aboutsummaryrefslogtreecommitdiffstats
path: root/lib/i18n_fixes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/i18n_fixes.rb')
-rw-r--r--lib/i18n_fixes.rb159
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
+