/usr/lib/ruby/1.9.1/gettext/runtime/textdomain_manager.rb is in libgettext-ruby1.9.1 2.1.0-2.1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | =begin
gettext/textdomain_manager - GetText::TextDomainManager class
Copyright (C) 2009 Masao Mutoh
You may redistribute it and/or modify it under the same
license terms as Ruby or LGPL.
=end
require 'gettext/runtime/class_info'
require 'gettext/runtime/textdomain'
require 'gettext/runtime/textdomain_group'
module GetText
module TextDomainManager
@@textdomain_pool = {}
@@textdomain_group_pool = {}
@@output_charset = nil
@@gettext_classes = []
@@singular_message_cache = {}
@@plural_message_cache = {}
@@cached = ! $DEBUG
extend self
# Find textdomain by name
def textdomain_pool(domainname)
@@textdomain_pool[domainname]
end
# Set the value whether cache messages or not.
# true to cache messages, otherwise false.
#
# Default is true. If $DEBUG is false, messages are not checked even if
# this value is true.
def cached=(val)
@@cached = val
TextDomain.cached = val
end
# Return the cached value.
def cached?
TextDomain.cached?
end
# Gets the output charset.
def output_charset
@@output_charset
end
# Sets the output charset.The program can have a output charset.
def output_charset=(charset)
@@output_charset = charset
@@textdomain_pool.each do |key, textdomain|
textdomain.output_charset = charset
end
end
# bind textdomain to the class.
def bind_to(klass, domainname, options = {})
warn "Bind the domain '#{domainname}' to '#{klass}'. " if $DEBUG
charset = options[:output_charset] || self.output_charset
textdomain = create_or_find_textdomain(domainname,options[:path],charset)
target_klass = ClassInfo.normalize_class(klass)
create_or_find_textdomain_group(target_klass).add(textdomain)
@@gettext_classes << target_klass unless @@gettext_classes.include? target_klass
textdomain
end
def each_textdomains(klass) #:nodoc:
lang = Locale.candidates[0]
ClassInfo.related_classes(klass, @@gettext_classes).each do |target|
msg = nil
if group = @@textdomain_group_pool[target]
group.textdomains.each do |textdomain|
yield textdomain, lang
end
end
end
end
# Translates msgid, but if there are no localized text,
# it returns a last part of msgid separeted "div" or whole of the msgid with no "div".
#
# * msgid: the message id.
# * div: separator or nil.
# * Returns: the localized text by msgid. If there are no localized text,
# it returns a last part of msgid separeted "div".
def translate_singluar_message(klass, msgid, div = nil)
klass = ClassInfo.normalize_class(klass)
key = [Locale.current, klass, msgid, div].hash
msg = @@singular_message_cache[key]
return msg if msg and @@cached
# Find messages from related classes.
each_textdomains(klass) do |textdomain, lang|
msg = textdomain.translate_singluar_message(lang, msgid)
break if msg
end
# If not found, return msgid.
msg ||= msgid
if div and msg == msgid
if index = msg.rindex(div)
msg = msg[(index + 1)..-1]
end
end
@@singular_message_cache[key] = msg
end
# This function is similar to the get_singluar_message function
# as it finds the message catalogs in the same way.
# But it takes two extra arguments for plural form.
# The msgid parameter must contain the singular form of the string to be converted.
# It is also used as the key for the search in the catalog.
# The msgid_plural parameter is the plural form.
# The parameter n is used to determine the plural form.
# If no message catalog is found msgid1 is returned if n == 1, otherwise msgid2.
# And if msgid includes "div", it returns a last part of msgid separeted "div".
#
# * msgid: the singular form with "div". (e.g. "Special|An apple", "An apple")
# * msgid_plural: the plural form. (e.g. "%{num} Apples")
# * n: a number used to determine the plural form.
# * div: the separator. Default is "|".
# * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
# "plural-rule" is defined in po-file.
#
# or
#
# * [msgid, msgid_plural] : msgid and msgid_plural an Array
# * n: a number used to determine the plural form.
# * div: the separator. Default is "|".
def translate_plural_message(klass, arg1, arg2, arg3 = "|", arg4 = "|")
klass = ClassInfo.normalize_class(klass)
# parse arguments
if arg1.kind_of?(Array)
msgid = arg1[0]
msgid_plural = arg1[1]
n = arg2
if arg3 and arg3.kind_of? Numeric
raise ArgumentError, _("3rd parmeter is wrong: value = %{number}") % {:number => arg3}
end
div = arg3
else
msgid = arg1
msgid_plural = arg2
n = arg3
div = arg4
end
key = [Locale.current, klass, msgid, msgid_plural, div].hash
msgs = @@plural_message_cache[key]
unless (msgs and @@cached)
# Find messages from related classes.
msgs = nil
each_textdomains(klass) do |textdomain, lang|
msgs = textdomain.translate_plural_message(lang, msgid, msgid_plural)
break if msgs
end
msgs = [[msgid, msgid_plural], TextDomain::DEFAULT_PLURAL_CALC] unless msgs
msgstrs = msgs[0]
if div and msgstrs[0] == msgid and index = msgstrs[0].rindex(div)
msgstrs[0] = msgstrs[0][(index + 1)..-1]
end
@@plural_message_cache[key] = msgs
end
# Return the singular or plural message.
msgstrs = msgs[0]
plural = msgs[1].call(n)
return msgstrs[plural] if plural.kind_of?(Numeric)
return plural ? msgstrs[1] : msgstrs[0]
end
# for testing.
def clear_all_textdomains
@@textdomain_pool = {}
@@textdomain_group_pool = {}
@@gettext_classes = []
clear_caches
end
# for testing.
def clear_caches
@@singular_message_cache = {}
@@plural_message_cache = {}
end
def create_or_find_textdomain_group(klass) #:nodoc:
group = @@textdomain_group_pool[klass]
return group if group
@@textdomain_group_pool[klass] = TextDomainGroup.new
end
def create_or_find_textdomain(name, path, charset)#:nodoc:
textdomain = @@textdomain_pool[name]
return textdomain if textdomain
@@textdomain_pool[name] = TextDomain.new(name, path, charset)
end
end
end
|