Method: GetText::TextDomainManager#translate_plural_message

Defined in:
lib/gettext/runtime/textdomain_manager.rb

#translate_plural_message(klass, arg1, arg2, arg3 = "|", arg4 = "|") ⇒ Object

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 “|”.



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
# File 'lib/gettext/runtime/textdomain_manager.rb', line 139

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