Skip to content

Commit

Permalink
Merge branch 'master' into kl_abbr_numbers_pluralization
Browse files Browse the repository at this point in the history
Conflicts:
	lib/twitter_cldr/formatters/numbers/abbreviated/abbreviated_number_formatter.rb
	resources/locales/bn/numbers.yml
	resources/locales/de-CH/numbers.yml
	resources/locales/de/numbers.yml
	resources/locales/es-CO/numbers.yml
	resources/locales/es-MX/numbers.yml
	resources/locales/es-US/numbers.yml
	resources/locales/es/numbers.yml
	resources/locales/eu/numbers.yml
	resources/locales/fr-CA/numbers.yml
	resources/locales/ga/numbers.yml
	resources/locales/he/numbers.yml
	resources/locales/hi/numbers.yml
	resources/locales/it-CH/numbers.yml
	resources/locales/it/numbers.yml
	resources/locales/ko/numbers.yml
	resources/locales/sr/numbers.yml
	resources/locales/ur/numbers.yml
	spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb
  • Loading branch information
KL-7 committed Oct 9, 2014
2 parents 4ba989c + ca98ed8 commit ca8c9cb
Show file tree
Hide file tree
Showing 105 changed files with 9,392 additions and 5,925 deletions.
20 changes: 10 additions & 10 deletions README.md.erb
Expand Up @@ -39,18 +39,18 @@ TwitterCldr patches core Ruby objects like `Fixnum` and `Date` to make localizat

```ruby
# default formatting with to_s
1337.localize(:es).to_s # <%= assert(1337.localize(:es).to_s, "1 337").inspect %>
1337.localize(:es).to_s # <%= assert(1337.localize(:es).to_s, "1.337").inspect %>

# currencies, default USD
1337.localize(:es).to_currency.to_s # <%= assert(1337.localize(:es).to_currency.to_s, "1 337,00 $").inspect %>
1337.localize(:es).to_currency.to_s(:currency => "EUR") # <%= assert(1337.localize(:es).to_currency.to_s(:currency => "EUR"), "1 337,00 €").inspect %>
1337.localize(:es).to_currency.to_s # <%= assert(1337.localize(:es).to_currency.to_s, "1.337,00 $").inspect %>
1337.localize(:es).to_currency.to_s(:currency => "EUR") # <%= assert(1337.localize(:es).to_currency.to_s(:currency => "EUR"), "1.337,00 €").inspect %>

# percentages
1337.localize(:es).to_percent.to_s # <%= assert(1337.localize(:es).to_percent.to_s, "1 337%").inspect %>
1337.localize(:es).to_percent.to_s(:precision => 2) # <%= assert(1337.localize(:es).to_percent.to_s(:precision => 2), "1 337,00%").inspect %>
1337.localize(:es).to_percent.to_s # <%= assert(1337.localize(:es).to_percent.to_s, "1.337 %").inspect %>
1337.localize(:es).to_percent.to_s(:precision => 2) # <%= assert(1337.localize(:es).to_percent.to_s(:precision => 2), "1.337,00 %").inspect %>

# decimals
1337.localize(:es).to_decimal.to_s(:precision => 3) # <%= assert(1337.localize(:es).to_decimal.to_s(:precision => 3) ,"1 337,000").inspect %>
1337.localize(:es).to_decimal.to_s(:precision => 3) # <%= assert(1337.localize(:es).to_decimal.to_s(:precision => 3) ,"1.337,000").inspect %>
```

**Note**: The `:precision` option can be used with all these number formatters.
Expand All @@ -62,7 +62,7 @@ num = TwitterCldr::Localized::LocalizedNumber.new(1337, :es)
num.to_currency.to_s # ...etc
```

<% assert(TwitterCldr::Localized::LocalizedNumber.new(1337, :es).to_currency.to_s, "1 337,00 $") %>
<% assert(TwitterCldr::Localized::LocalizedNumber.new(1337, :es).to_currency.to_s, "1.337,00 $") %>

#### More on Currencies

Expand Down Expand Up @@ -154,7 +154,7 @@ For English (and other languages), you can also specify an ordinal spellout:
```ruby
DateTime.now.localize(:es).to_full_s # <%= assert(datetime.localize(:es).to_full_s, "viernes, 14 de febrero de 2014, 12:20:05 (UTC +00:00)").inspect %>
DateTime.now.localize(:es).to_long_s # <%= assert(datetime.localize(:es).to_long_s, "14 de febrero de 2014, 12:20:05 UTC").inspect %>
DateTime.now.localize(:es).to_medium_s # <%= assert(datetime.localize(:es).to_medium_s, "14/2/2014 12:20:05").inspect %>
DateTime.now.localize(:es).to_medium_s # <%= assert(datetime.localize(:es).to_medium_s, "14 de feb. de 2014 12:20:05").inspect %>
DateTime.now.localize(:es).to_short_s # <%= assert(datetime.localize(:es).to_short_s, "14/2/14 12:20").inspect %>

Time.now.localize(:es).to_full_s # <%= assert(time.localize(:es).to_full_s, "12:20:05 (UTC +00:00)").inspect %>
Expand All @@ -164,7 +164,7 @@ Time.now.localize(:es).to_short_s # <%= assert(time.localize(:e

DateTime.now.localize(:es).to_date.to_full_s # <%= assert(datetime.localize(:es).to_date.to_full_s, "viernes, 14 de febrero de 2014").inspect %>
DateTime.now.localize(:es).to_date.to_long_s # <%= assert(datetime.localize(:es).to_date.to_long_s, "14 de febrero de 2014").inspect %>
DateTime.now.localize(:es).to_date.to_medium_s # <%= assert(datetime.localize(:es).to_date.to_medium_s, "14/2/2014").inspect %>
DateTime.now.localize(:es).to_date.to_medium_s # <%= assert(datetime.localize(:es).to_date.to_medium_s, "14 de feb. de 2014").inspect %>
DateTime.now.localize(:es).to_date.to_short_s # <%= assert(datetime.localize(:es).to_date.to_short_s, "14/2/14").inspect %>
```

Expand All @@ -184,7 +184,7 @@ dt.to_short_s # ...etc
Besides the default date formats, CLDR supports a number of additional ones. The list of available formats varies for each locale. To get a full list, use the `additional_formats` method:

```ruby
# <%= ellipsize(assert(datetime.localize(:ja).additional_formats.sort[0..11], ["EEEEd", "EHm", "EHms", "Ed", "Ehm", "Ehms", "Gy", "GyMMM", "GyMMMEEEEd", "GyMMMEd", "GyMMMd", "H"])) %>
# <%= ellipsize(assert(datetime.localize(:ja).additional_formats.sort[0..11], ["E", "EEEEd", "EHm", "EHms", "Ed", "Ehm", "Ehms", "Gy", "GyMMM", "GyMMMEEEEd", "GyMMMEd", "GyMMMd"])) %>
DateTime.now.localize(:ja).additional_formats
```

Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Expand Up @@ -96,7 +96,7 @@ end
# TODO: 'add_locale' task that creates a new directory and runs all necessary 'update' tasks (+ suggests to run those that depend on JRuby)

namespace :update do
ICU_JAR = './vendor/icu4j-52_1.jar'
ICU_JAR = './vendor/icu4j.jar'

desc 'Import locales resources'
task :locales_resources, :cldr_path do |_, args|
Expand Down
7 changes: 4 additions & 3 deletions lib/twitter_cldr/data_readers/number_data_reader.rb
Expand Up @@ -122,7 +122,7 @@ def valid_type_for?(number, type)
end

def get_key_for(number)
"1#{"0" * (number.to_i.to_s.size - 1)}".to_i
"1#{"0" * (number.to_i.abs.to_s.size - 1)}".to_i
end

def pattern_for_number(pattern, number, decimal)
Expand Down Expand Up @@ -163,7 +163,7 @@ def pattern_for_sign(pattern, sign)
else
case sign
when :negative
"#{symbols[:minus] || '-'}#{pattern}"
"#{symbols[:minus_sign] || '-'}#{pattern}"
else
pattern
end
Expand All @@ -178,7 +178,8 @@ def resource
end

def self.within_abbreviation_range?(number)
NUMBER_MIN <= number && number < NUMBER_MAX
abs_value = number.abs
NUMBER_MIN <= abs_value && abs_value < NUMBER_MAX
end
end
end
Expand Down
Expand Up @@ -9,7 +9,7 @@ class AbbreviatedNumberFormatter < NumberFormatter

def truncate_number(number, decimal_digits)
if TwitterCldr::DataReaders::NumberDataReader.within_abbreviation_range?(number)
factor = [0, number.to_i.to_s.length - decimal_digits].max
factor = [0, number.to_i.abs.to_s.length - decimal_digits].max
number / (10.0 ** factor)
else
number
Expand Down
7 changes: 0 additions & 7 deletions lib/twitter_cldr/formatters/numbers/number_formatter.rb
Expand Up @@ -7,13 +7,6 @@ module TwitterCldr
module Formatters
class NumberFormatter < Formatter

DEFAULT_SYMBOLS = {
:group => ',',
:decimal => '.',
:plus_sign => '+',
:minus_sign => '-'
}

attr_reader :data_reader

def initialize(data_reader)
Expand Down
3 changes: 2 additions & 1 deletion lib/twitter_cldr/formatters/numbers/rbnf.rb
Expand Up @@ -18,6 +18,7 @@ module Rbnf
autoload :RuleGroup, "twitter_cldr/formatters/numbers/rbnf/rule_group"
autoload :RuleParser, "twitter_cldr/formatters/numbers/rbnf/rule_parser"
autoload :Substitution, "twitter_cldr/formatters/numbers/rbnf/substitution"
autoload :Plural, "twitter_cldr/formatters/numbers/rbnf/plural"

class PrivateRuleSetError < StandardError; end

Expand Down Expand Up @@ -100,7 +101,7 @@ def rule_set_name_cache
def rule_set_from_resource(rule_set_data)
RuleSet.new(
rule_set_data[:rules].map do |rule|
Rule.new(rule[:value], rule[:rule], rule[:radix])
Rule.new(rule[:value], rule[:rule], rule[:radix], locale)
end,
rule_set_data[:type],
rule_set_data[:access] || "public"
Expand Down
5 changes: 4 additions & 1 deletion lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb
Expand Up @@ -16,7 +16,6 @@ class << self

def format(number, rule_set, rule_group, locale)
rule = rule_set.rule_for(number)
# puts "#{number}, #{rule.base_value}: '" + rule.rule_text + "'"
formatter = formatter_for(rule, rule_set, rule_group, locale)
result = formatter.format(number, rule)
keep_soft_hyphens ? result : remove_soft_hyphens(result)
Expand Down Expand Up @@ -120,6 +119,10 @@ def semicolon(number, rule, token)
""
end

def plural(number, rule, token)
token.render(number / rule.divisor)
end

protected

def invalid_token_error(token)
Expand Down
49 changes: 49 additions & 0 deletions lib/twitter_cldr/formatters/numbers/rbnf/plural.rb
@@ -0,0 +1,49 @@
# encoding: UTF-8

# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0

module TwitterCldr
module Formatters
module Rbnf

class Plural
def self.from_string(locale, str)
# $(cardinal,one{ tysiąc}few{ tysiące}other{ tysięcy})$
plural_type, cases = str.gsub(/\$\((.*)\)\$/, '\1').split(',')

# one{ tysiąc}few{ tysiące}other{ tysięcy}
cases = cases.scan(/([\w]+)\{([^}]+)\}/).inject({}) do |ret, case_arr|
ret[case_arr.first.to_sym] = case_arr.last
ret
end

new(locale, plural_type.to_sym, cases)
end

attr_reader :locale, :plural_type, :cases

# plural_type = cardinal, etc
# cases = hash of form one: "foo", two: "bar"
def initialize(locale, plural_type, cases)
@locale = locale
@plural_type = plural_type
@cases = cases
end

def render(number)
rule_name = TwitterCldr::Formatters::Plurals::Rules.rule_for(
number, locale, plural_type
)

cases[rule_name] || cases[:other]
end

def type
:plural
end
end

end
end
end
7 changes: 4 additions & 3 deletions lib/twitter_cldr/formatters/numbers/rbnf/rule.rb
Expand Up @@ -14,12 +14,13 @@ class Rule
PROPER_FRACTION = "0.x"
NEGATIVE = "-x"

attr_reader :base_value, :rule_text, :radix
attr_reader :base_value, :rule_text, :radix, :locale

def initialize(base_value, rule_text, radix)
def initialize(base_value, rule_text, radix, locale)
@base_value = base_value
@rule_text = rule_text
@radix = radix
@locale = locale
end

def divisor
Expand Down Expand Up @@ -76,7 +77,7 @@ def tokens
private

def inline_substitutions(tokens)
parser.parse(tokens)
parser.parse(tokens, :locale => locale)
end

def parser
Expand Down
13 changes: 12 additions & 1 deletion lib/twitter_cldr/formatters/numbers/rbnf/rule_parser.rb
Expand Up @@ -12,6 +12,7 @@ class RuleParser < TwitterCldr::Parsers::Parser
private

def do_parse(options)
@locale = options.fetch(:locale, TwitterCldr.locale)
switch([])
end

Expand Down Expand Up @@ -48,6 +49,16 @@ def right_arrow(list)
switch(list)
end

def plural(list)
sub = Plural.from_string(
@locale, current_token.value
)

list << sub
next_token(:plural)
switch(list)
end

def plaintext(list)
add_and_advance(list)
end
Expand Down Expand Up @@ -83,4 +94,4 @@ def descriptor(token)
end
end
end
end
end
2 changes: 1 addition & 1 deletion lib/twitter_cldr/formatters/numbers/rbnf/substitution.rb
Expand Up @@ -27,4 +27,4 @@ def decimal_format

end
end
end
end
4 changes: 2 additions & 2 deletions lib/twitter_cldr/resources/download.rb
Expand Up @@ -7,7 +7,7 @@ module TwitterCldr
module Resources

CLDR_URL = 'http://unicode.org/Public/cldr/26/core.zip'
ICU4J_URL = 'http://download.icu-project.org/files/icu4j/52.1/icu4j-52_1.jar'
ICU4J_URL = 'http://download.icu-project.org/files/icu4j/54.1/icu4j-54_1.jar'

# Use these instead to update collation and tailoring data
# CLDR_URL = 'http://unicode.org/Public/cldr/23.1/core.zip'
Expand Down Expand Up @@ -54,4 +54,4 @@ def download_icu4j_if_necessary(path, url = ICU4J_URL)
end

end
end
end
4 changes: 4 additions & 0 deletions lib/twitter_cldr/resources/locales_resources_importer.rb
Expand Up @@ -57,11 +57,15 @@ def import_components
:merge => true # fill in the gaps, eg fill in sub-locales like en_GB with en
}

locales = Set.new

Cldr::Export.export(export_args) do |component, locale, path|
add_buddhist_calendar(component, locale, path)
process_plurals(component, locale, path)
downcase_territory_codes(component, locale, path)
deep_symbolize(component, locale, path)
locales.add(locale)
STDOUT.write "\r#{locale}, #{locales.size} of #{TwitterCldr.supported_locales.size} total"
end

export_args = {
Expand Down
Expand Up @@ -12,7 +12,7 @@ module Resources
module Uli
class SegmentExceptionsImporter

URL = "http://unicode.org/uli/trac/export/38/trunk/abbrs/json/%{locale}.json"
URL = "http://unicode.org/uli/trac/export/58/trunk/abbrs/json/%{locale}.json"

attr_reader :input_path, :output_path

Expand Down
3 changes: 2 additions & 1 deletion lib/twitter_cldr/tokenizers/numbers/rbnf_tokenizer.rb
Expand Up @@ -37,6 +37,7 @@ def tokenizer
TokenRecognizer.new(:open_bracket, /\[/),
TokenRecognizer.new(:close_bracket, /\]/),
TokenRecognizer.new(:decimal, /[0#][0#,\.]+/),
TokenRecognizer.new(:plural, /\$\(.*\)\$/),

# ending
TokenRecognizer.new(:semicolon, /;/),
Expand All @@ -55,4 +56,4 @@ def tokenizer

end
end
end
end
1 change: 1 addition & 0 deletions resources/locales/af/numbers.yml
Expand Up @@ -108,3 +108,4 @@
:percent_sign: "%"
:plus_sign: "+"
:superscripting_exponent: "×"
:time_separator: ":"
1 change: 1 addition & 0 deletions resources/locales/ar/numbers.yml
Expand Up @@ -208,3 +208,4 @@
:percent_sign: "%"
:plus_sign: "‎+"
:superscripting_exponent: "×"
:time_separator: ":"
1 change: 1 addition & 0 deletions resources/locales/be/numbers.yml
Expand Up @@ -108,3 +108,4 @@
:percent_sign: "%"
:plus_sign: "+"
:superscripting_exponent: "×"
:time_separator: ":"
5 changes: 3 additions & 2 deletions resources/locales/bg/numbers.yml
Expand Up @@ -5,7 +5,7 @@
:currency:
:number_system: "latn"
:patterns:
:default: "#,##0.00 ¤"
:default: "#,##0.00 ¤;(#,##0.00 ¤)"
:unit:
:one: "{0} {1}"
:other: "{0} {1}"
Expand All @@ -21,7 +21,7 @@
:one: "00 хиляди"
:other: "00 хиляди"
100000:
:one: "000 Х"
:one: "000 хиляди"
:other: "000 хиляди"
1000000:
:one: "0 милион"
Expand Down Expand Up @@ -108,3 +108,4 @@
:percent_sign: "%"
:plus_sign: "+"
:superscripting_exponent: "."
:time_separator: ":"
9 changes: 5 additions & 4 deletions resources/locales/bn/numbers.yml
Expand Up @@ -52,11 +52,11 @@
:other: "000 ট্রিলিয়ন"
:short:
1000:
:one: "0K"
:other: "0K"
:one: "0 হাজার"
:other: "0 হাজার"
10000:
:one: "00K"
:other: "00K"
:one: "00 হাজার"
:other: "00 হাজার"
100000:
:one: "0 লাখ"
:other: "0 লাখ"
Expand Down Expand Up @@ -108,3 +108,4 @@
:percent_sign: "%"
:plus_sign: "+"
:superscripting_exponent: "×"
:time_separator: ":"
1 change: 1 addition & 0 deletions resources/locales/ca/numbers.yml
Expand Up @@ -108,3 +108,4 @@
:percent_sign: "%"
:plus_sign: "+"
:superscripting_exponent: "×"
:time_separator: ":"

0 comments on commit ca8c9cb

Please sign in to comment.