Skip to content

Commit

Permalink
Support Vietnamese (#152)
Browse files Browse the repository at this point in the history
* support Vietnamese
  • Loading branch information
duyetpt authored and jlduran committed Nov 29, 2017
1 parent e03daa8 commit 5415d86
Show file tree
Hide file tree
Showing 18 changed files with 304 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

### Features
* Your contribution here.
* Add support for Vietnamese language

## 0.11.2 (August 14, 2017)

Expand Down
10 changes: 10 additions & 0 deletions README.rdoc
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ Converte números em letras utilizando a biblioteca I18n.
I18n.with_locale(:cs) { 42.to_words }
=> "čtyřicetdva"

I18n.with_locale(:vi) { 42.to_words }
=> "bốn mươi hai"

21.to_words
=> "twenty-one"
=> "veintiuno"
Expand All @@ -100,6 +103,7 @@ Converte números em letras utilizando a biblioteca I18n.
=> "tjugo-en"
=> "dvacetjedna"
=> "vinte e um"
=> "hai mươi mốt"

231.to_words
=> "two hundred thirty-one"
Expand All @@ -119,6 +123,7 @@ Converte números em letras utilizando a biblioteca I18n.
=> "två hundra trettio-en"
=> "dvě stě třicetjedna"
=> "duzentos e trinta e um"
=> "hai trăm ba mươi mốt"

4030.to_words
=> "four thousand thirty"
Expand All @@ -137,6 +142,7 @@ Converte números em letras utilizando a biblioteca I18n.
=> "vierthousanddertig"
=> "fyra tusen trettio"
=> "čtyři tisíce třicet"
=> "bốn nghìn không trăm ba mươi"

1000100.to_words
=> "one million one hundred"
Expand All @@ -155,6 +161,7 @@ Converte números em letras utilizando a biblioteca I18n.
=> "één miljoen honderd"
=> "en miljoner en hundra"
=> "jeden milión jedno sto"
=> "một triệu một trăm"

1000000000000000000000000000000000.to_words
=> "one decillion"
Expand Down Expand Up @@ -184,6 +191,7 @@ Converte números em letras utilizando a biblioteca I18n.
=> ["üks", "kaks", "kolm"]
=> ["ერთი", "ორი", "სამი"]
=> ["jedna", "dva", "tři"]
=> ["một", "hai", "ba"]

[11, 22, 133].to_words
=> ["eleven", "twenty-two", "one hundred thirty-three"]
Expand All @@ -202,13 +210,15 @@ Converte números em letras utilizando a biblioteca I18n.
=> ["elf", "tweeentwintig", "honderddrieendertig"]
=> ["elva", "tjugo-två", "en hundra trettio-tre"]
=> ["jedenáct", "dvacetdva", "jedno sto třicettři"]
=> ["mười một", "hai mươi hai", "một trăm ba mươi ba"]

21.77.to_words
=> "twenty-one and seventy-seven hundredths"
=> "двадцать одна целая и семьдесят семь сотых"
=> "двадцять одна цiла i сiмдесят сiм сотих"
=> "huszonegy egész hetvenhét század"
=> "twenty-one point seven seven"
=> "hai mươi mốt phẩy bảy mươi bảy"

== Language options / Языковые опции

Expand Down
13 changes: 13 additions & 0 deletions lib/numbers_and_words/i18n/locales/numbers.vi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
vi:
numbers:
ones: ['không', 'một', 'hai', 'ba', 'bốn', 'năm', 'sáu', 'bảy', 'tám', 'chín']
teens: [_, 'mười một', 'mười hai', 'mười ba', 'mười bốn', 'mười lăm', 'mười sáu', 'mười bảy', 'thứ mười tám', 'mười chín']
tens: [_, 'mười', 'hai mươi', 'ba mươi', 'bốn mươi', 'năm mươi', 'sáu mươi', 'bảy mươi', 'tám mươi', 'chín mươi']
hundreds: 'trăm'
mega: [_, 'nghìn', 'triệu', 'tỷ', 'nghìn tỷ', 'triệu tỷ']
units:
tens:
one: 'mốt'
five: 'lăm'
ones_union: 'linh'
micro_separator: 'phẩy'
1 change: 1 addition & 0 deletions lib/numbers_and_words/strategies/array_joiner/languages.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
require 'numbers_and_words/strategies/array_joiner/languages/ua'
require 'numbers_and_words/strategies/array_joiner/languages/pt-BR'
require 'numbers_and_words/strategies/array_joiner/languages/cs'
require 'numbers_and_words/strategies/array_joiner/languages/vi'

module NumbersAndWords
module Strategies
Expand Down
10 changes: 10 additions & 0 deletions lib/numbers_and_words/strategies/array_joiner/languages/vi.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module NumbersAndWords
module Strategies
module ArrayJoiner
module Languages
class Vi < Base
end
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
require 'numbers_and_words/strategies/figures_converter/decorators/hu'
require 'numbers_and_words/strategies/figures_converter/decorators/ua'
require 'numbers_and_words/strategies/figures_converter/decorators/cs'
require 'numbers_and_words/strategies/figures_converter/decorators/vi'

module NumbersAndWords
module Strategies
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require 'numbers_and_words/strategies/figures_converter/decorators/vi/base'
require 'numbers_and_words/strategies/figures_converter/decorators/vi/fractional'
require 'numbers_and_words/strategies/figures_converter/decorators/vi/integral'
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
module NumbersAndWords
module Strategies
module FiguresConverter
module Decorators
module Vi
class Base < Decorators::Base
end
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
module NumbersAndWords
module Strategies
module FiguresConverter
module Decorators
module Vi
class Fractional < Base
end
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
module NumbersAndWords
module Strategies
module FiguresConverter
module Decorators
module Vi
class Integral < Base
end
end
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
require 'numbers_and_words/strategies/figures_converter/languages/families/cyrillic'
require 'numbers_and_words/strategies/figures_converter/languages/ru'
require 'numbers_and_words/strategies/figures_converter/languages/ua'
require 'numbers_and_words/strategies/figures_converter/languages/vi'

module NumbersAndWords
module Strategies
Expand Down
96 changes: 96 additions & 0 deletions lib/numbers_and_words/strategies/figures_converter/languages/vi.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
module NumbersAndWords
module Strategies
module FiguresConverter
module Languages
class Vi < Base
def print_words
value = super
remove_billion_noice(value)
end

def strings_logic
if fractional?
if fraction_number_zeros_leading.zero?
@options.options[:integeral] = true
integeral_string_logic
else
fractional_with_zero_leading_string_logic
end
else
integeral_string_logic
end
end

def fractional_with_zero_leading_string_logic
leading_zeros = [0] * fraction_number_zeros_leading
(@figures + leading_zeros).map(&:to_words)
end

def integeral_string_logic
if @figures.capacity_count
number_without_capacity_to_words + complex_number_to_words
elsif hundreds?
hundreds_number_to_words
elsif @figures.tens || @figures.ones
simple_number_to_words
else
[]
end
end

def hundreds?
@figures.hundreds ||
(@figures.size == 3 && (@figures.teens || @figures.tens || @figures.ones))
end

def hundreds(options = {})
if @figures.hundreds.to_i.zero?
translate :hundreds, 0, options
else
super
end
end

def ones(options = {})
if @figures.capacity_length >= 2
ones_union(options)
else
super
end
end

def ones_union(options = {})
translate :ones_union, @figures.ones, options
end

def fractional?
!@options.options[:fractional].nil? && !@options.options[:integeral]
end

def fraction_length
return 0 unless @options.options[:fractional]
@options.options[:fractional][:length]
end

def fraction_number_zeros_leading
fraction_length - @figures.length
end

def remove_billion_noice(value)
parts = value.split(billion_unit).map(&:strip)
if value.end_with?(billion_unit)
parts.insert(-1, billion_unit).join(' ')
else
return value if parts.size <= 2
parts.insert(-2, billion_unit).join(' ')
end
end

def billion_unit
translate :mega, 3
end
end
end
end
end
end
1 change: 1 addition & 0 deletions lib/numbers_and_words/translations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
require 'numbers_and_words/translations/pt-BR'
require 'numbers_and_words/translations/ka'
require 'numbers_and_words/translations/cs'
require 'numbers_and_words/translations/vi'

module NumbersAndWords
module Translations
Expand Down
21 changes: 21 additions & 0 deletions lib/numbers_and_words/translations/vi.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module NumbersAndWords
module Translations
class Vi < Base
include NumbersAndWords::Translations::Families::Latin
include NumbersAndWords::Translations::Extensions::FractionSignificance
def ones_of_tens(number, options = {})
return t(%i[units tens one].join('.')) if number == 1
return t(%i[units tens five].join('.')) if number == 5
ones(number, options)
end

def tens_with_ones(numbers, options = {})
[tens(numbers[1]), ones_of_tens(numbers[0], options)].join options[:separator] || ' '
end

def ones_union(number, options = {})
[t(:ones_union), ones(number, options)].join options[:separator] || ' '
end
end
end
end
30 changes: 30 additions & 0 deletions spec/numbers_and_words/array/fixture_examples/vi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
to_words:
simple_example:
?
- 1
- 2
- 3
:
- một
- hai
- ba
complex_example:
?
- 101
- 21
- 13
:
- một trăm linh một
- hai mươi mốt
- mười ba
complex_example_with_options:
options:
:remove_zero: true
?
- 0.1
- 0.31
- 0.012
:
- không phẩy một
- không phẩy ba mươi mốt
- không phẩy không một hai
19 changes: 19 additions & 0 deletions spec/numbers_and_words/float/fixture_examples/vi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
to_words:
fractional:
0.1: không phẩy một
0.7: không phẩy bảy
0.01: không phẩy không một
0.012: không phẩy không một hai
0.77: không phẩy bảy mươi bảy
0.777: không phẩy bảy trăm bảy mươi bảy
0.7777: không phẩy bảy nghìn bảy trăm bảy mươi bảy
0.77777: không phẩy bảy mươi bảy nghìn bảy trăm bảy mươi bảy
0.777777: không phẩy bảy trăm bảy mươi bảy nghìn bảy trăm bảy mươi bảy
0.7777777: không phẩy bảy triệu bảy trăm bảy mươi bảy nghìn bảy trăm bảy mươi bảy
0.77777777: không phẩy bảy mươi bảy triệu bảy trăm bảy mươi bảy nghìn bảy trăm bảy mươi bảy
0.777777777: không phẩy bảy trăm bảy mươi bảy triệu bảy trăm bảy mươi bảy nghìn bảy trăm bảy mươi bảy
0.2935174315119: không phẩy hai nghìn chín trăm ba mươi lăm tỷ một trăm bảy mươi bốn triệu ba trăm mười lăm nghìn một trăm mười chín
21.77: hai mươi mốt phẩy bảy mươi bảy
111.999: một trăm mười một phẩy chín trăm chín mươi chín
4242.7463: bốn nghìn hai trăm bốn mươi hai phẩy bảy nghìn bốn trăm sáu mươi ba
4242.07463: bốn nghìn hai trăm bốn mươi hai phẩy không bảy bốn sáu ba
Loading

0 comments on commit 5415d86

Please sign in to comment.