class GetText::Tools::MsgInit::CLDRPluralsConverter

Public Class Methods

new(language) click to toggle source
# File lib/gettext/tools/msginit.rb, line 373
def initialize(language)
  @language = language

end

Public Instance Methods

convert() click to toggle source
# File lib/gettext/tools/msginit.rb, line 378
def convert
  n_plurals = nil
  expression = nil
  if defined?(Datasets::CLDRPlurals)
    plurals = Datasets::CLDRPlurals.new
    plurals.each do |locale|
      next unless locale.name == @language
      n_plurals, expression = convert_plural_rules(locale.rules)
      break
    end
  end
  "nplurals=#{n_plurals}; plural=#{expression};"
end

Private Instance Methods

compact_equal_values(values) click to toggle source
# File lib/gettext/tools/msginit.rb, line 573
def compact_equal_values(values)
  if values == [0, 1]
    [0..1]
  else
    values
  end
end
convert_plural_condition(condition) click to toggle source
# File lib/gettext/tools/msginit.rb, line 445
def convert_plural_condition(condition)
  case condition[0]
  when :and
    gettext_condition = nil
    condition[1..-1].each do |sub_condition|
      sub_gettext_condition = convert_plural_condition(sub_condition)
      case sub_gettext_condition
      when String
        if gettext_condition.is_a?(String)
          gettext_condition << " && #{sub_gettext_condition}"
        else
          gettext_condition = sub_gettext_condition
        end
      when TrueClass
        unless gettext_condition.is_a?(String)
          gettext_condition = true
        end
      when FalseClass
        return false
      else
        raise "unknown value #{sub_gettext_condition.inspect}"
      end
    end
    gettext_condition
  when :or
    gettext_condition = false
    condition[1..-1].each do |sub_condition|
      sub_gettext_condition = convert_plural_condition(sub_condition)
      case sub_gettext_condition
      when String
        if gettext_condition.is_a?(String)
          gettext_condition << " || #{sub_gettext_condition}"
        else
          gettext_condition = sub_gettext_condition
        end
      when TrueClass
        return true
      when FalseClass
      else
        raise "unknown value #{sub_gettext_condition.inspect}"
      end
    end
    gettext_condition
  when :equal
    left = convert_plural_condition(condition[1])
    right = condition[2]
    case left
    when String
      right = compact_equal_values(right)
      gettext_conditions = right.collect do |right_value|
        case right_value
        when Range
          if right_value.begin.zero?
            "(#{left} <= #{right_value.end})"
          else
            "(#{left} >= #{right_value.begin} && " +
              "#{left} <= #{right_value.end})"
          end
        else
          "(#{left} == #{right_value})"
        end
      end
      if gettext_conditions.size == 1
        gettext_conditions[0]
      else
        gettext_conditions.join(" || ")
      end
    when 0
      if right.include?(0)
        true
      else
        false
      end
    else
      false
    end
  when :not_equal
    left = convert_plural_condition(condition[1])
    right = condition[2]
    case left
    when String
      right = compact_equal_values(right)
      gettext_conditions = right.collect do |right_value|
        case right_value
        when Range
          "(#{left} < #{right_value.begin} || " +
            "#{left} > #{right_value.end})"
        else
          "(#{left} != #{right_value})"
        end
      end
      if gettext_conditions.size == 1
        gettext_conditions[0]
      else
        gettext_conditions = gettext_conditions.collect do |gettext_condition|
          "(#{gettext_condition})"
        end
        gettext_conditions.join(" && ")
      end
    when 0
      if right.include?(0)
        false
      else
        true
      end
    else
      false
    end
  when :mod
    left = convert_plural_condition(condition[1])
    right = condition[2]
    case left
    when "n"
      "(n % #{right})"
    else
      false
    end
  when "n", "i"
    "n"
  when "v", "w"
    0
  when "f", "t", "c", "e"
    false
  else
    raise "unknown operator: #{condition[0].inspect}"
  end
end
convert_plural_rules(rules) click to toggle source
# File lib/gettext/tools/msginit.rb, line 393
def convert_plural_rules(rules)
  n_plurals = 1
  conditions = []
  order = [
    "one",
    "zero",
    "two",
    "few",
    "many",
    "other",
  ]
  rules = rules.reject do |rule|
    rule.integer_samples.nil?
  end
  rules = rules.sort_by do |rule|
    order.index(rule.count)
  end
  rules[0..-2].each do |rule|
    next if rule.condition.nil?
    condition = convert_plural_condition(rule.condition)
    next if condition.nil?
    next if condition == false
    n_plurals += 1
    conditions << condition
  end
  expression = ""
  case conditions.size
  when 0
    expression << "0"
  when 1
    condition = conditions[0]
    case condition
    when "(n == 1)"
      expression << "n != 1"
    when "(n <= 1)"
      expression << "n > 1"
    else
      expression << "#{condition} ? 1 : 0"
    end
  else
    (conditions.size + 1).times do |i|
      if i == conditions.size
        expression << i.to_s
      else
        condition = conditions[i]
        expression << "#{condition} ? #{i} : "
      end
    end
  end
  [n_plurals, expression]
end