Module: Num2words::Locales::BG

Defined in:
lib/num2words/locales/bg.rb

Constant Summary collapse

ONES_MASC =
I18n.t("num2words.ones_masc", locale: :bg)
ONES_FEM =
I18n.t("num2words.ones_fem", locale: :bg)
TEENS =
I18n.t("num2words.teens", locale: :bg)
TENS =
I18n.t("num2words.tens", locale: :bg)
HUNDREDS =
I18n.t("num2words.hundreds", locale: :bg)
SCALES =
I18n.t("num2words.scales", locale: :bg)
FRACTIONS =
I18n.t("num2words.fractions", locale: :bg)
GRAMMAR =
I18n.t("num2words.grammar", locale: :bg)
DATE =
I18n.t("num2words.date", locale: :bg)
DATE_TEMPLATE =
I18n.t("num2words.date.template", locale: :bg)
TIME =
I18n.t("num2words.time", locale: :bg)
TIME_TEMPLATE =
I18n.t("num2words.time.template", locale: :bg)
DATETIME_TEMPLATE =
I18n.t("num2words.datetime.template", locale: :bg)
ORDINALS =
I18n.t("num2words.numbers.ordinals", locale: :bg)

Class Method Summary collapse

Class Method Details

.cardinal(number, feminine: false) ⇒ Object



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
# File 'lib/num2words/locales/bg.rb', line 103

def cardinal(number, feminine: false)
  integer_value = Integer(number)
  negative = integer_value.negative?
  integer_value = integer_value.abs

  return (feminine ? ONES_FEM[0] : ONES_MASC[0]) if integer_value.zero?

  groups = integer_value.to_s
                        .chars.reverse.each_slice(3).map(&:reverse)
                        .map(&:join).map!(&:to_i).reverse

  group_phrases = []
  groups.each_with_index do |group_value, index|
    next if group_value.zero?

    scale_idx = groups.size - index - 1
    group_feminine = feminine_group?(scale_idx) || feminine
    group_words = triple_to_words(group_value, scale_idx, feminine: group_feminine)
    group_words.shift if scale_idx == 1 && group_value == 1
    group_phrases << [group_words.join(" "), scale_idx, group_value]
  end

  result = join_groups(group_phrases)
  negative ? [minus_word, result].join(" ") : result
end

.date_day(day, format:, date_case:) ⇒ Object



76
77
78
79
# File 'lib/num2words/locales/bg.rb', line 76

def date_day(day, format:, date_case:)
  gender = date_case.to_sym == :genitive ? :masculine : :neuter
  ordinal(day, :nominative, gender: gender)
end

.date_year(year, format:) ⇒ Object



81
82
83
# File 'lib/num2words/locales/bg.rb', line 81

def date_year(year, format:)
  ordinal(year, :nominative)
end

.default_fraction_wordObject



42
43
44
# File 'lib/num2words/locales/bg.rb', line 42

def default_fraction_word
  GRAMMAR[:default_fraction]
end

.feminine_group?(scale_idx) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/num2words/locales/bg.rb', line 26

def feminine_group?(scale_idx)
  scale_idx == 1
end

.fraction_joiner(joiner) ⇒ Object



38
39
40
# File 'lib/num2words/locales/bg.rb', line 38

def fraction_joiner(joiner)
  joiner.to_sym == :and ? "и" : GRAMMAR[:conjunction]
end

.fraction_numerator_feminine?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/num2words/locales/bg.rb', line 30

def fraction_numerator_feminine?
  true
end

.integer_to_words(number, feminine: false) ⇒ Object



46
47
48
# File 'lib/num2words/locales/bg.rb', line 46

def integer_to_words(number, feminine: false)
  cardinal(number, feminine: feminine)
end

.join_groups(group_phrases) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/num2words/locales/bg.rb', line 137

def join_groups(group_phrases)
  return "" if group_phrases.empty?

  phrases = group_phrases.map(&:first)
  last_scale_idx = group_phrases[-1][1]
  last_value = group_phrases[-1][2]

  if group_phrases.size > 1 && last_scale_idx.zero? && last_value < 100
    [phrases[0...-1].join(" "), phrases[-1]].join(" и ")
  else
    phrases.join(" ")
  end
end

.join_with_conjunction(words, value) ⇒ Object



133
134
135
# File 'lib/num2words/locales/bg.rb', line 133

def join_with_conjunction(words, value)
  words.empty? ? value : "и #{value}"
end

.minus_wordObject



34
35
36
# File 'lib/num2words/locales/bg.rb', line 34

def minus_word
  GRAMMAR[:minus]
end

.ordinal(value, format, gender: :masculine) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/num2words/locales/bg.rb', line 85

def ordinal(value, format, gender: :masculine)
  ordinals = ORDINALS[format]
  gender_data = ordinals[gender] || ordinals[:masculine]

  return gender_data[value - 1] if value.between?(1, gender_data.length)

  if value > 31
    thousands = (value / 100) * 100
    last_two = value % 100
    base_year = cardinal(thousands)
    last_ordinal = gender_data[last_two - 1] || cardinal(last_two)

    return [base_year, last_ordinal].join(" ")
  end

  cardinal(value)
end

.pluralize(number, singular, few, plural) ⇒ Object



129
130
131
# File 'lib/num2words/locales/bg.rb', line 129

def pluralize(number, singular, few, plural)
  number.abs == 1 ? singular : few
end

.triple_to_words(number, scale_idx, feminine: false) ⇒ Object



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
# File 'lib/num2words/locales/bg.rb', line 50

def triple_to_words(number, scale_idx, feminine: false)
  words = []

  hundreds = number / 100
  rest = number % 100

  words << HUNDREDS[hundreds] if hundreds.positive?

  if rest.between?(10, 19)
    words << join_with_conjunction(words, TEENS[rest - 10])
  else
    tens = rest / 10
    ones = rest % 10

    if tens >= 2
      tens_words = TENS[tens]
      words << (ones.positive? ? "#{tens_words} и #{feminine ? ONES_FEM[ones] : ONES_MASC[ones]}" : tens_words)
    elsif ones.positive?
      words << join_with_conjunction(words, feminine ? ONES_FEM[ones] : ONES_MASC[ones])
    end
  end

  words << pluralize(number, *SCALES[scale_idx]) unless scale_idx.zero?
  words.compact
end