i18n-complements 0.0.14 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.rdoc +1 -1
- data/lib/i18n-complements.rb +1 -15
- data/lib/i18n/complements.rb +14 -0
- data/lib/{i18n-complements → i18n/complements}/core_extension.rb +10 -10
- data/lib/{i18n-complements → i18n/complements}/localize_extension.rb +19 -20
- data/lib/i18n/complements/numisma.rb +97 -0
- data/lib/{i18n-complements → i18n/complements}/numisma/currencies.yml +0 -0
- data/lib/i18n/complements/numisma/currency.rb +81 -0
- data/lib/i18n/complements/version.rb +5 -0
- data/test/helper.rb +24 -2
- data/test/test_booleans.rb +4 -6
- data/test/test_currencies.rb +39 -44
- data/test/test_currency_rates.rb +15 -19
- data/test/test_extensions.rb +8 -11
- data/test/test_numbers.rb +34 -32
- data/test/test_strings.rb +7 -9
- metadata +40 -11
- data/lib/i18n-complements/numisma.rb +0 -107
- data/lib/i18n-complements/numisma/currency.rb +0 -82
- data/lib/i18n-complements/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16d692a49edce3b47b6a8ada497b8146cd1205ec
|
4
|
+
data.tar.gz: 8cf691d258e71da95029badf9114c5d9b9f5d969
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 253e77f53716e54ca9bb917c2d7a2900fd3242c82768b13c0025dafdc9934aab9d448141d349d6419878287812dec382c425f4d3e4eead2067259c1ced36b282
|
7
|
+
data.tar.gz: 9d5867df77df878ae0bece031e7adff3872e3c10f05f3e570ea80b13ebb18b26dd2e9577883ce9204b39bb30cd0dc875e4f8ed380407fae211fec6124623d318
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
=
|
1
|
+
= I18n::Complements
|
2
2
|
{<img src="https://badge.fury.io/rb/i18n-complements.png" alt="Gem Version" />}[http://badge.fury.io/rb/i18n-complements]
|
3
3
|
{<img src="https://api.travis-ci.org/ekylibre/i18n-complements.png?branch=master"/>}[https://travis-ci.org/ekylibre/i18n-complements]
|
4
4
|
{<img src="https://gemnasium.com/ekylibre/i18n-complements.png"/>}[https://gemnasium.com/ekylibre/i18n-complements]
|
data/lib/i18n-complements.rb
CHANGED
@@ -1,15 +1 @@
|
|
1
|
-
require 'i18n'
|
2
|
-
require 'i18n-complements/numisma'
|
3
|
-
require 'i18n-complements/localize_extension'
|
4
|
-
require 'i18n-complements/core_extension'
|
5
|
-
require 'i18n-complements/version'
|
6
|
-
|
7
|
-
module I18n
|
8
|
-
|
9
|
-
class InvalidCurrency < ArgumentError
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
module I18nComplements
|
15
|
-
end
|
1
|
+
require 'i18n/complements'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module I18n
|
4
|
+
class InvalidCurrency < ArgumentError
|
5
|
+
end
|
6
|
+
|
7
|
+
module Complements
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'i18n/complements/numisma'
|
12
|
+
require 'i18n/complements/localize_extension'
|
13
|
+
require 'i18n/complements/core_extension'
|
14
|
+
require 'i18n/complements/version'
|
@@ -4,12 +4,12 @@ class ::String
|
|
4
4
|
def translate(options = {})
|
5
5
|
I18n.translate(self, options)
|
6
6
|
end
|
7
|
-
alias
|
7
|
+
alias t translate
|
8
8
|
|
9
9
|
def localize(options = {})
|
10
10
|
I18n.localize(self, options)
|
11
11
|
end
|
12
|
-
alias
|
12
|
+
alias l localize
|
13
13
|
|
14
14
|
def to_currency
|
15
15
|
I18n.currencies(self)
|
@@ -20,10 +20,10 @@ class ::Symbol
|
|
20
20
|
def translate(options = {})
|
21
21
|
I18n.translate(self, options)
|
22
22
|
end
|
23
|
-
alias
|
23
|
+
alias t translate
|
24
24
|
|
25
25
|
def to_currency
|
26
|
-
I18n.currencies(
|
26
|
+
I18n.currencies(to_s)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -31,40 +31,40 @@ class ::TrueClass
|
|
31
31
|
def localize(options = {})
|
32
32
|
I18n.localize(self, options)
|
33
33
|
end
|
34
|
-
alias
|
34
|
+
alias l localize
|
35
35
|
end
|
36
36
|
|
37
37
|
class ::FalseClass
|
38
38
|
def localize(options = {})
|
39
39
|
I18n.localize(self, options)
|
40
40
|
end
|
41
|
-
alias
|
41
|
+
alias l localize
|
42
42
|
end
|
43
43
|
|
44
44
|
class ::Numeric
|
45
45
|
def localize(options = {})
|
46
46
|
I18n.localize(self, options)
|
47
47
|
end
|
48
|
-
alias
|
48
|
+
alias l localize
|
49
49
|
end
|
50
50
|
|
51
51
|
class ::Date
|
52
52
|
def localize(options = {})
|
53
53
|
I18n.localize(self, options)
|
54
54
|
end
|
55
|
-
alias
|
55
|
+
alias l localize
|
56
56
|
end
|
57
57
|
|
58
58
|
class ::DateTime
|
59
59
|
def localize(options = {})
|
60
60
|
I18n.localize(self, options)
|
61
61
|
end
|
62
|
-
alias
|
62
|
+
alias l localize
|
63
63
|
end
|
64
64
|
|
65
65
|
class ::Time
|
66
66
|
def localize(options = {})
|
67
67
|
I18n.localize(self, options)
|
68
68
|
end
|
69
|
-
alias
|
69
|
+
alias l localize
|
70
70
|
end
|
@@ -1,54 +1,53 @@
|
|
1
1
|
module I18n
|
2
2
|
module Backend
|
3
|
-
|
4
3
|
class Simple
|
5
|
-
|
6
4
|
def localize_with_complements(locale, object, format = nil, options = {})
|
7
|
-
|
8
5
|
if object.respond_to?(:strftime)
|
9
6
|
format ||= :default
|
10
7
|
return localize_without_complements(locale, object, format, options)
|
11
8
|
elsif object.respond_to?(:abs)
|
12
9
|
if currency = options[:currency]
|
13
|
-
raise I18n::InvalidCurrency.new("Currency #{currency
|
14
|
-
return
|
10
|
+
raise I18n::InvalidCurrency.new("Currency #{currency} does not exist.") unless I18n::Complements::Numisma[currency.to_s]
|
11
|
+
return I18n::Complements::Numisma[currency.to_s].localize(object, locale: locale)
|
15
12
|
else
|
16
|
-
formatter = I18n.translate('number.format'.to_sym, :
|
13
|
+
formatter = I18n.translate('number.format'.to_sym, locale: locale, default: {})
|
17
14
|
if formatter.is_a?(Proc)
|
18
15
|
return formatter[object]
|
19
16
|
elsif formatter.is_a?(Hash)
|
20
|
-
formatter = {:
|
17
|
+
formatter = { format: '%n', separator: '.', delimiter: '', precision: 3 }.merge(formatter).merge(options)
|
21
18
|
format = formatter[:format]
|
22
|
-
negative_format = formatter[:negative_format] ||
|
19
|
+
negative_format = formatter[:negative_format] || '-' + format
|
23
20
|
|
24
21
|
if object.to_f < 0
|
25
22
|
format = negative_format
|
26
23
|
object = object.abs
|
27
24
|
end
|
28
|
-
|
25
|
+
|
29
26
|
value = object.to_s.split(/\./)
|
30
|
-
integrals
|
27
|
+
integrals = value[0].to_s
|
28
|
+
decimals = value[1].to_s
|
31
29
|
value = integrals.gsub(/^0+[1-9]+/, '').gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{formatter[:delimiter]}")
|
32
|
-
decimals =
|
33
|
-
unless decimals.to_s
|
34
|
-
|
35
|
-
|
30
|
+
decimals = '0' if decimals.to_s.match(/^\s*$/) && object.is_a?(Float)
|
31
|
+
unless decimals.to_s =~ /^\s*$/
|
32
|
+
after = decimals.gsub(/0+$/, '').ljust(formatter[:precision], '0').scan(/.{1,3}/).join(formatter[:delimiter])
|
33
|
+
unless after =~ /\A[[:space:]]*\z/
|
34
|
+
value << formatter[:separator] + after
|
35
|
+
end
|
36
36
|
end
|
37
37
|
return format.gsub(/%n/, value).gsub(/%s/, "\u{00A0}")
|
38
38
|
end
|
39
39
|
end
|
40
|
-
elsif object.is_a?(TrueClass)
|
41
|
-
return I18n.translate("boolean.human.#{object
|
40
|
+
elsif object.is_a?(TrueClass) || object.is_a?(FalseClass)
|
41
|
+
return I18n.translate("boolean.human.#{object}_class", locale: locale)
|
42
42
|
elsif object.is_a?(String)
|
43
|
-
return object
|
43
|
+
return object
|
44
44
|
else
|
45
45
|
raise ArgumentError, "Object must be a Numeric, TrueClass, FalseClass, String, Date, DateTime or Time object. #{object.class.name}:#{object.inspect} given."
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
alias localize_without_complements localize
|
50
|
+
alias localize localize_with_complements
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# This module aimed to structure and controls currencies through the application
|
2
|
+
# It represents the international monetary system with all its currencies like specified in ISO 4217
|
3
|
+
# Numisma comes from latin: It designs here the "science of money"
|
4
|
+
require 'net/http'
|
5
|
+
require 'yaml'
|
6
|
+
require 'i18n/complements/numisma/currency'
|
7
|
+
|
8
|
+
module I18n
|
9
|
+
module Complements
|
10
|
+
module Numisma
|
11
|
+
class << self
|
12
|
+
def currencies
|
13
|
+
@@currencies
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the path to currencies file
|
17
|
+
def currencies_file
|
18
|
+
# Rails.root.join("config", "currencies.yml")
|
19
|
+
File.join(File.dirname(__FILE__), 'numisma', 'currencies.yml')
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns a hash with active currencies only
|
23
|
+
def active_currencies
|
24
|
+
x = {}
|
25
|
+
for code, currency in @@currencies
|
26
|
+
x[code] = currency if currency.active
|
27
|
+
end
|
28
|
+
x
|
29
|
+
end
|
30
|
+
|
31
|
+
# Shorcut to get currency
|
32
|
+
def [](currency_code)
|
33
|
+
@@currencies[currency_code]
|
34
|
+
end
|
35
|
+
|
36
|
+
def currency_rate(from, to)
|
37
|
+
raise InvalidCurrency.new(":from currency is unknown (#{from.class}:#{from.inspect})") if Numisma[from].nil?
|
38
|
+
raise InvalidCurrency.new(":to currency is unknown (#{to.class}:#{to.inspect})") if Numisma[to].nil?
|
39
|
+
rate = nil
|
40
|
+
begin
|
41
|
+
uri = URI('http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate')
|
42
|
+
response = Net::HTTP.post_form(uri, 'FromCurrency' => from, 'ToCurrency' => to)
|
43
|
+
doc = ::LibXML::XML::Parser.string(response.body).parse
|
44
|
+
rate = doc.root.content.to_f
|
45
|
+
rescue
|
46
|
+
uri = URI("http://download.finance.yahoo.com/d/quotes.csv?s=#{from}#{to}=X&f=l1")
|
47
|
+
response = Net::HTTP.get(uri)
|
48
|
+
rate = response.strip.to_f
|
49
|
+
end
|
50
|
+
rate
|
51
|
+
end
|
52
|
+
|
53
|
+
# Load currencies
|
54
|
+
def load_currencies
|
55
|
+
@@currencies = {}
|
56
|
+
for code, details in YAML.load_file(currencies_file)
|
57
|
+
currency = Currency.new(code, details.inject({}) { |h, p| h[p[0].to_sym] = p[1]; h })
|
58
|
+
@@currencies[currency.code] = currency
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Finally load all currencies
|
64
|
+
load_currencies
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class << self
|
69
|
+
def currencies(currency_code)
|
70
|
+
I18n::Complements::Numisma.currencies[currency_code.to_s]
|
71
|
+
end
|
72
|
+
|
73
|
+
def active_currencies
|
74
|
+
I18n::Complements::Numisma.active_currencies
|
75
|
+
end
|
76
|
+
|
77
|
+
def available_currencies
|
78
|
+
I18n::Complements::Numisma.currencies
|
79
|
+
end
|
80
|
+
|
81
|
+
def currency_label(currency_code)
|
82
|
+
if currency = I18n::Complements::Numisma.currencies[currency_code.to_s]
|
83
|
+
currency.label
|
84
|
+
else
|
85
|
+
return "Unknown currency: #{currency_code}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def currency_rate(from, to)
|
90
|
+
I18n::Complements::Numisma.currency_rate(from, to)
|
91
|
+
end
|
92
|
+
|
93
|
+
def currencies_file
|
94
|
+
I18n::Complements::Numisma.currencies_file
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
File without changes
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module I18n
|
2
|
+
module Complements
|
3
|
+
module Numisma
|
4
|
+
class Currency
|
5
|
+
attr_reader :code, :active, :cash, :countries, :number, :precision, :unit
|
6
|
+
|
7
|
+
def initialize(code, options = {})
|
8
|
+
@code = code.strip # .upcase
|
9
|
+
@active = (options[:active] ? true : false)
|
10
|
+
@cash = options[:cash].to_a.collect(&:to_f).sort
|
11
|
+
@countries = options[:countries].to_a.collect(&:to_s).sort.collect(&:to_sym)
|
12
|
+
@number = options[:number].to_i
|
13
|
+
@precision = options[:precision].to_i
|
14
|
+
@unit = (options[:unit].nil? ? nil : options[:unit].to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
::I18n.translate("currencies.#{code}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def label
|
22
|
+
::I18n.translate('labels.currency_with_code', code: code, name: name, default: '%{name} (%{code})')
|
23
|
+
end
|
24
|
+
|
25
|
+
def round(value, _options = {})
|
26
|
+
precision = self.precision
|
27
|
+
if RUBY_VERSION =~ /^1\.8/
|
28
|
+
magnitude = 10**precision
|
29
|
+
return (value * magnitude).to_i.to_f * magnitude
|
30
|
+
else
|
31
|
+
return value.round(precision)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def ==(other_currency)
|
36
|
+
code == other_currency.code
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_currency
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
# Produces a amount of the currency with the locale parameters
|
44
|
+
# TODO: Find a better way to specify number formats which are more complex that the default Rails use
|
45
|
+
def localize(amount, options = {})
|
46
|
+
return unless amount
|
47
|
+
|
48
|
+
# options.symbolize_keys!
|
49
|
+
|
50
|
+
defaults = I18n.translate('number.format'.to_sym, locale: options[:locale], default: {})
|
51
|
+
defaultt = I18n.translate('number.currency.format'.to_sym, locale: options[:locale], default: {})
|
52
|
+
defaultt[:negative_format] ||= ('-' + defaultt[:format]) if defaultt[:format]
|
53
|
+
formatcy = I18n.translate("number.currency.formats.#{code}".to_sym, locale: options[:locale], default: {})
|
54
|
+
formatcy[:negative_format] ||= '-' + formatcy[:format] if formatcy[:format]
|
55
|
+
|
56
|
+
formatter = {}
|
57
|
+
formatter[:separator] = formatcy[:separator] || defaultt[:separator] || defaults[:separator] || ','
|
58
|
+
formatter[:delimiter] = formatcy[:delimiter] || defaultt[:delimiter] || defaults[:delimiter] || ''
|
59
|
+
formatter[:precision] = formatcy[:precision] || precision || defaultt[:precision] || 3
|
60
|
+
format = formatcy[:format] || defaultt[:format] || '%n-%u' # defaults[:format] ||
|
61
|
+
negative_format = formatcy[:negative_format] || defaultt[:negative_format] || defaults[:negative_format] || '-' + format
|
62
|
+
unit = formatcy[:unit] || self.unit || code
|
63
|
+
|
64
|
+
if amount.to_f < 0
|
65
|
+
format = negative_format # options.delete(:negative_format)
|
66
|
+
amount = amount.respond_to?('abs') ? amount.abs : amount.sub(/^-/, '')
|
67
|
+
end
|
68
|
+
|
69
|
+
value = amount.to_s
|
70
|
+
integers, decimals = value.split(/\./)
|
71
|
+
value = integers.gsub(/^0+[1-9]+/, '').gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{formatter[:delimiter]}")
|
72
|
+
unless decimals.to_s =~ /^\s*$/
|
73
|
+
value << formatter[:separator]
|
74
|
+
value << decimals.gsub(/0+$/, '').ljust(formatter[:precision], '0').scan(/.{1,3}/).join(formatter[:delimiter])
|
75
|
+
end
|
76
|
+
format.gsub(/%n/, value).gsub(/%u/, unit).gsub(/%s/, "\u{00A0}")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/test/helper.rb
CHANGED
@@ -2,13 +2,35 @@ require 'coveralls'
|
|
2
2
|
Coveralls.wear!
|
3
3
|
|
4
4
|
require 'bundler/setup'
|
5
|
-
require '
|
5
|
+
require 'minitest/autorun'
|
6
6
|
|
7
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
8
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
9
9
|
|
10
10
|
require 'i18n-complements'
|
11
11
|
|
12
|
-
|
12
|
+
Dir[File.join(File.dirname(__FILE__), 'locales', '*.yml')].each do |file|
|
13
13
|
I18n.backend.load_translations(file)
|
14
14
|
end
|
15
|
+
|
16
|
+
module I18n
|
17
|
+
module Complements
|
18
|
+
class TestCase < Minitest::Test
|
19
|
+
def setup
|
20
|
+
I18n.locale = ENV['LOCALE'] || :eng
|
21
|
+
end
|
22
|
+
|
23
|
+
def assert_nothing_raised(*_args)
|
24
|
+
yield
|
25
|
+
end
|
26
|
+
|
27
|
+
def assert_raise(exception)
|
28
|
+
yield
|
29
|
+
rescue Exception => e
|
30
|
+
assert_equal exception, e.class
|
31
|
+
else
|
32
|
+
refute
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/test/test_booleans.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestBooleans <
|
5
|
-
|
4
|
+
class TestBooleans < I18n::Complements::TestCase
|
6
5
|
def test_localization
|
7
6
|
assert_nothing_raised do
|
8
7
|
I18n.localize(true)
|
@@ -20,15 +19,14 @@ class TestBooleans < Test::Unit::TestCase
|
|
20
19
|
|
21
20
|
assert_nothing_raised do
|
22
21
|
false.localize
|
23
|
-
end
|
22
|
+
end
|
24
23
|
|
25
24
|
assert_nothing_raised do
|
26
25
|
true.l
|
27
26
|
end
|
28
|
-
|
27
|
+
|
29
28
|
assert_nothing_raised do
|
30
29
|
false.l
|
31
|
-
end
|
30
|
+
end
|
32
31
|
end
|
33
|
-
|
34
32
|
end
|
data/test/test_currencies.rb
CHANGED
@@ -1,67 +1,65 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestCurrencies <
|
5
|
-
|
4
|
+
class TestCurrencies < I18n::Complements::TestCase
|
6
5
|
def test_localization_with_currency
|
7
6
|
assert_nothing_raised do
|
8
|
-
::I18n.localize(14.5, :
|
7
|
+
::I18n.localize(14.5, currency: :JPY)
|
9
8
|
end
|
10
9
|
|
11
10
|
assert_nothing_raised do
|
12
|
-
::I18n.localize(14.5, :
|
11
|
+
::I18n.localize(14.5, currency: 'JPY')
|
13
12
|
end
|
14
|
-
|
13
|
+
|
15
14
|
assert_raise(I18n::InvalidCurrency) do
|
16
|
-
::I18n.localize(14.5, :
|
15
|
+
::I18n.localize(14.5, currency: 'jPY')
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def test_localization_with_currency_with_core_extensions
|
21
20
|
assert_nothing_raised do
|
22
|
-
14.5.localize(:
|
21
|
+
14.5.localize(currency: :JPY)
|
23
22
|
end
|
24
23
|
|
25
24
|
assert_nothing_raised do
|
26
|
-
14.5.l(:
|
25
|
+
14.5.l(currency: :JPY)
|
27
26
|
end
|
28
27
|
|
29
28
|
assert_nothing_raised do
|
30
|
-
|
29
|
+
13_546.localize(currency: :JPY)
|
31
30
|
end
|
32
|
-
|
31
|
+
|
33
32
|
assert_nothing_raised do
|
34
|
-
|
33
|
+
13_546.l(currency: :JPY)
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
assert_raise(I18n::InvalidCurrency) do
|
38
|
-
14.5.l(:
|
39
|
-
end
|
37
|
+
14.5.l(currency: 'jPY')
|
38
|
+
end
|
40
39
|
|
41
40
|
assert_raise(I18n::InvalidCurrency) do
|
42
|
-
14.5.l(:
|
43
|
-
end
|
41
|
+
14.5.l(currency: 'JPYXX')
|
42
|
+
end
|
44
43
|
end
|
45
|
-
|
44
|
+
|
46
45
|
def test_number_formatting_with_currency
|
47
|
-
number =
|
48
|
-
assert_equal "¥413,500", ::I18n.localize(number, :
|
49
|
-
assert_equal "413\u{00A0}500\u{00A0}¥", ::I18n.localize(number, :
|
50
|
-
assert_equal "413,500円", ::I18n.localize(number, :
|
51
|
-
assert_equal "€0.325,1", ::I18n.localize(0.3251, :
|
52
|
-
assert_equal "0,325\u{00A0}1\u{00A0}F", ::I18n.localize(0.3251, :
|
53
|
-
assert_equal "€123,852.325,1", ::I18n.localize(
|
46
|
+
number = 413_500
|
47
|
+
assert_equal "¥413,500", ::I18n.localize(number, locale: :eng, currency: 'JPY')
|
48
|
+
assert_equal "413\u{00A0}500\u{00A0}¥", ::I18n.localize(number, locale: :fra, currency: 'JPY')
|
49
|
+
assert_equal "413,500円", ::I18n.localize(number, locale: :jpn, currency: 'JPY')
|
50
|
+
assert_equal "€0.325,1", ::I18n.localize(0.3251, locale: :eng, currency: 'EUR')
|
51
|
+
assert_equal "0,325\u{00A0}1\u{00A0}F", ::I18n.localize(0.3251, locale: :fra, currency: 'FRF')
|
52
|
+
assert_equal "€123,852.325,1", ::I18n.localize(123_852.3251, locale: :eng, currency: 'EUR')
|
54
53
|
end
|
55
54
|
|
56
55
|
def test_number_formatting_with_currency_with_core_extensions
|
57
|
-
|
58
|
-
|
59
|
-
assert_equal(money[0].l(:locale
|
56
|
+
[:eng, :fra, :jpn].each do |locale|
|
57
|
+
[[413_500, 'JPY'], [1425.23, 'USD'], [0.96, 'EUR']].each do |money|
|
58
|
+
assert_equal(money[0].l(locale: locale, currency: money[1]), ::I18n.localize(money[0], locale: locale, currency: money[1]))
|
60
59
|
end
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
64
|
-
|
65
63
|
def test_listing_of_currencies
|
66
64
|
assert_nothing_raised do
|
67
65
|
::I18n.active_currencies
|
@@ -71,32 +69,32 @@ class TestCurrencies < Test::Unit::TestCase
|
|
71
69
|
::I18n.available_currencies
|
72
70
|
end
|
73
71
|
|
74
|
-
assert ::I18n.active_currencies.size <= ::I18n.available_currencies.size,
|
72
|
+
assert ::I18n.active_currencies.size <= ::I18n.available_currencies.size, 'Available currencies cannot be less numerous than active currencies'
|
75
73
|
end
|
76
74
|
|
77
75
|
def test_currency_properties
|
78
76
|
assert !::I18n.currencies(:JPY).nil?
|
79
|
-
assert !::I18n.currencies(
|
80
|
-
assert ::I18n.currencies(
|
77
|
+
assert !::I18n.currencies('JPY').nil?
|
78
|
+
assert ::I18n.currencies('JPy').nil?
|
81
79
|
|
82
|
-
assert !::I18n.currencies(
|
83
|
-
assert !::I18n.currencies(
|
80
|
+
assert !::I18n.currencies('USD').nil?
|
81
|
+
assert !::I18n.currencies('EUR').nil?
|
84
82
|
|
85
|
-
assert ::I18n.currencies(
|
83
|
+
assert ::I18n.currencies('JPYXX').nil?
|
86
84
|
|
87
85
|
assert_nothing_raised do
|
88
|
-
::I18n.currency_label(
|
86
|
+
::I18n.currency_label('JPY')
|
89
87
|
end
|
90
|
-
assert !::I18n.currency_label(
|
88
|
+
assert !::I18n.currency_label('JPY').match(/Unknown/)
|
91
89
|
end
|
92
|
-
|
90
|
+
|
93
91
|
def test_currency_properties_with_core_extensions
|
94
92
|
assert_nothing_raised do
|
95
93
|
:JPY.to_currency.name
|
96
94
|
end
|
97
|
-
|
95
|
+
|
98
96
|
assert_nothing_raised do
|
99
|
-
|
97
|
+
'USD'.to_currency.name
|
100
98
|
end
|
101
99
|
|
102
100
|
assert_nothing_raised do
|
@@ -106,15 +104,12 @@ class TestCurrencies < Test::Unit::TestCase
|
|
106
104
|
assert_nothing_raised do
|
107
105
|
:JPY.to_currency.to_currency.to_currency.name
|
108
106
|
end
|
109
|
-
|
107
|
+
|
110
108
|
assert_equal :JPY.to_currency, :JPY.to_currency.to_currency
|
111
109
|
|
112
110
|
currency = :JPY.to_currency
|
113
|
-
|
111
|
+
|
114
112
|
assert_equal currency, currency.to_currency
|
115
113
|
assert_equal currency.to_currency, currency.to_currency.to_currency
|
116
114
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
120
115
|
end
|
data/test/test_currency_rates.rb
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestCurrencies <
|
5
|
-
|
4
|
+
class TestCurrencies < I18n::Complements::TestCase
|
6
5
|
def test_conversion_rate
|
7
|
-
|
8
|
-
|
9
|
-
I18nComplements::Numisma.currency_rate(:EUR, "JPY")
|
6
|
+
assert_raise I18n::InvalidCurrency do
|
7
|
+
I18n::Complements::Numisma.currency_rate(:EUR, 'JPY')
|
10
8
|
end
|
11
|
-
|
12
|
-
assert_raise
|
13
|
-
|
9
|
+
|
10
|
+
assert_raise I18n::InvalidCurrency do
|
11
|
+
I18n::Complements::Numisma.currency_rate('EUR', :JPY)
|
14
12
|
end
|
15
|
-
|
16
|
-
assert_raise
|
17
|
-
|
13
|
+
|
14
|
+
assert_raise I18n::InvalidCurrency do
|
15
|
+
I18n::Complements::Numisma.currency_rate(:EUR, :JPY)
|
18
16
|
end
|
19
17
|
|
20
|
-
r1 =
|
21
|
-
r2 =
|
18
|
+
r1 = I18n::Complements::Numisma.currency_rate('EUR', 'JPY')
|
19
|
+
r2 = I18n::Complements::Numisma.currency_rate('JPY', 'EUR')
|
22
20
|
assert 0.01 >= 1 - (r1 * r2).round(2), "EUR -> JPY: #{r1}, JPY -> EUR: #{r2}, #{r1 * r2}, #{(r1 * r2).round(2)}"
|
23
|
-
|
24
|
-
rate = I18nComplements::Numisma.currency_rate("EUR", "JPY")
|
25
|
-
assert !rate.nil?, "Rate cannot be nil"
|
26
|
-
assert rate != 0, "Rate cannot be null"
|
27
|
-
end
|
28
|
-
|
29
21
|
|
22
|
+
rate = I18n::Complements::Numisma.currency_rate('EUR', 'JPY')
|
23
|
+
assert !rate.nil?, 'Rate cannot be nil'
|
24
|
+
assert rate != 0, 'Rate cannot be null'
|
25
|
+
end
|
30
26
|
end
|
data/test/test_extensions.rb
CHANGED
@@ -1,29 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestExtensions <
|
5
|
-
|
4
|
+
class TestExtensions < I18n::Complements::TestCase
|
6
5
|
def setup
|
7
6
|
I18n.locale = :eng
|
8
7
|
end
|
9
8
|
|
10
9
|
def test_string_translation
|
11
|
-
assert_equal
|
12
|
-
assert_equal I18n.translate(
|
13
|
-
assert_equal I18n.translate(
|
10
|
+
assert_equal 'My example is so short', I18n.translate('my_example')
|
11
|
+
assert_equal I18n.translate('my_example'), 'my_example'.translate
|
12
|
+
assert_equal I18n.translate('my_example'), 'my_example'.t
|
14
13
|
|
15
|
-
assert_equal
|
16
|
-
assert_equal I18n.translate(
|
17
|
-
assert_equal I18n.translate(
|
14
|
+
assert_equal 'My example is short', I18n.translate('my.example')
|
15
|
+
assert_equal I18n.translate('my.example'), 'my.example'.translate
|
16
|
+
assert_equal I18n.translate('my.example'), 'my.example'.t
|
18
17
|
end
|
19
18
|
|
20
19
|
def test_symbol_translation
|
21
|
-
assert_equal
|
20
|
+
assert_equal 'My example is so short', I18n.translate(:my_example)
|
22
21
|
assert_equal I18n.translate(:my_example), :my_example.translate
|
23
22
|
assert_equal I18n.translate(:my_example), :my_example.t
|
24
23
|
end
|
25
24
|
|
26
|
-
|
27
25
|
def test_date_localization
|
28
26
|
date = Date.civil(1999, 12, 31)
|
29
27
|
|
@@ -71,5 +69,4 @@ class TestExtensions < Test::Unit::TestCase
|
|
71
69
|
|
72
70
|
assert_equal I18n.localize(time), time.l
|
73
71
|
end
|
74
|
-
|
75
72
|
end
|
data/test/test_numbers.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestNumbers <
|
5
|
-
|
4
|
+
class TestNumbers < I18n::Complements::TestCase
|
6
5
|
def test_localization
|
7
6
|
assert_nothing_raised do
|
8
7
|
I18n.localize(14.5)
|
9
8
|
end
|
10
9
|
|
11
10
|
assert_nothing_raised do
|
12
|
-
I18n.localize(
|
11
|
+
I18n.localize(413_500)
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
@@ -19,72 +18,75 @@ class TestNumbers < Test::Unit::TestCase
|
|
19
18
|
end
|
20
19
|
|
21
20
|
assert_nothing_raised do
|
22
|
-
|
23
|
-
end
|
21
|
+
413_500.localize
|
22
|
+
end
|
24
23
|
|
25
24
|
assert_nothing_raised do
|
26
25
|
14.5.l
|
27
26
|
end
|
28
27
|
|
29
28
|
assert_nothing_raised do
|
30
|
-
|
31
|
-
end
|
29
|
+
413_500.l
|
30
|
+
end
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
def test_number_formatting
|
35
34
|
# Integer
|
36
35
|
number = 3
|
37
|
-
assert_equal
|
38
|
-
assert_equal
|
36
|
+
assert_equal '3', I18n.localize(number, locale: :eng)
|
37
|
+
assert_equal '3', I18n.localize(number, locale: :fra)
|
39
38
|
|
40
39
|
# Integer > 1000
|
41
|
-
number =
|
42
|
-
assert_equal
|
43
|
-
assert_equal "21\u{00A0}145", I18n.localize(number, :
|
40
|
+
number = 21_145
|
41
|
+
assert_equal '21,145', I18n.localize(number, locale: :eng)
|
42
|
+
assert_equal "21\u{00A0}145", I18n.localize(number, locale: :fra)
|
44
43
|
|
45
44
|
# Float without integers with decimals
|
46
45
|
number = 0.5
|
47
|
-
assert_equal
|
48
|
-
assert_equal
|
46
|
+
assert_equal '0.500', I18n.localize(number, locale: :eng)
|
47
|
+
assert_equal '0,500', I18n.localize(number, locale: :fra)
|
49
48
|
|
50
49
|
# Float without decimals
|
51
50
|
number = 3.0
|
52
|
-
assert_equal
|
53
|
-
assert_equal
|
51
|
+
assert_equal '3.000', I18n.localize(number, locale: :eng)
|
52
|
+
assert_equal '3,000', I18n.localize(number, locale: :fra)
|
53
|
+
|
54
|
+
# Float without decimals and no precision
|
55
|
+
number = 5.0
|
56
|
+
assert_equal '5', I18n.localize(number, locale: :eng, precision: 0)
|
57
|
+
assert_equal '5', I18n.localize(number, locale: :fra, precision: 0)
|
54
58
|
|
55
59
|
# Float
|
56
60
|
number = 14.53
|
57
|
-
assert_equal
|
58
|
-
assert_equal
|
61
|
+
assert_equal '14.530', I18n.localize(number, locale: :eng)
|
62
|
+
assert_equal '14,530', I18n.localize(number, locale: :fra)
|
59
63
|
|
60
64
|
# Float > 1000
|
61
65
|
number = 2114.5
|
62
|
-
assert_equal
|
63
|
-
assert_equal "2\u{00A0}114,500", I18n.localize(number, :
|
66
|
+
assert_equal '2,114.500', I18n.localize(number, locale: :eng)
|
67
|
+
assert_equal "2\u{00A0}114,500", I18n.localize(number, locale: :fra)
|
64
68
|
|
65
69
|
# Float without integers with decimals < 0.001
|
66
70
|
number = 0.41421356
|
67
|
-
assert_equal
|
68
|
-
assert_equal "0,414\u{00A0}213\u{00A0}56", I18n.localize(number, :
|
71
|
+
assert_equal '0.414,213,56', I18n.localize(number, locale: :eng)
|
72
|
+
assert_equal "0,414\u{00A0}213\u{00A0}56", I18n.localize(number, locale: :fra)
|
69
73
|
|
70
74
|
# Float without integers with decimals < 0.001
|
71
75
|
number = 3.1415926
|
72
|
-
assert_equal
|
73
|
-
assert_equal "3,141\u{00A0}592\u{00A0}6", I18n.localize(number, :
|
76
|
+
assert_equal '3.141,592,6', I18n.localize(number, locale: :eng)
|
77
|
+
assert_equal "3,141\u{00A0}592\u{00A0}6", I18n.localize(number, locale: :fra)
|
74
78
|
|
75
79
|
# Float without integers with decimals < 0.001
|
76
|
-
number =
|
77
|
-
assert_equal
|
78
|
-
assert_equal "62\u{00A0}951\u{00A0}413,141\u{00A0}592\u{00A0}6", I18n.localize(number, :
|
80
|
+
number = 62_951_413.1415926
|
81
|
+
assert_equal '62,951,413.141,592,6', I18n.localize(number, locale: :eng)
|
82
|
+
assert_equal "62\u{00A0}951\u{00A0}413,141\u{00A0}592\u{00A0}6", I18n.localize(number, locale: :fra)
|
79
83
|
end
|
80
84
|
|
81
85
|
def test_number_formatting_with_core_extensions
|
82
86
|
for locale in [:eng, :fra, :jpn]
|
83
|
-
for number in [3,
|
84
|
-
assert_equal(number.l(:
|
87
|
+
for number in [3, 21_145, 0.5, 3.0, 14.53, 2144.5, 0.41421356, 3.1415926, 62_951_413.1415926]
|
88
|
+
assert_equal(number.l(locale: locale), I18n.localize(number, locale: locale))
|
85
89
|
end
|
86
90
|
end
|
87
|
-
|
88
91
|
end
|
89
|
-
|
90
92
|
end
|
data/test/test_strings.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class TestStrings <
|
5
|
-
|
4
|
+
class TestStrings < I18n::Complements::TestCase
|
6
5
|
def test_localization
|
7
6
|
assert_nothing_raised do
|
8
|
-
I18n.localize(
|
7
|
+
I18n.localize('This is a test sentence')
|
9
8
|
end
|
10
9
|
|
11
10
|
assert_nothing_raised do
|
@@ -13,26 +12,25 @@ class TestStrings < Test::Unit::TestCase
|
|
13
12
|
end
|
14
13
|
|
15
14
|
assert_nothing_raised do
|
16
|
-
I18n.localize(
|
15
|
+
I18n.localize('')
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def test_localization_with_core_extensions
|
21
20
|
assert_nothing_raised do
|
22
|
-
|
21
|
+
'This is a test sentence'.localize
|
23
22
|
end
|
24
23
|
|
25
24
|
assert_nothing_raised do
|
26
25
|
"C'est une phrase d'exemple axée sur les caractères spéciaux".localize
|
27
|
-
end
|
26
|
+
end
|
28
27
|
|
29
28
|
assert_nothing_raised do
|
30
|
-
|
29
|
+
'This is a test sentence'.l
|
31
30
|
end
|
32
31
|
|
33
32
|
assert_nothing_raised do
|
34
33
|
"C'est une phrase d'exemple axée sur les caractères spéciaux".l
|
35
|
-
end
|
34
|
+
end
|
36
35
|
end
|
37
|
-
|
38
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n-complements
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice Texier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -28,16 +28,44 @@ dependencies:
|
|
28
28
|
name: coveralls
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.6.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.6.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: term-ansicolor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,12 +91,13 @@ files:
|
|
63
91
|
- LICENSE
|
64
92
|
- README.rdoc
|
65
93
|
- lib/i18n-complements.rb
|
66
|
-
- lib/i18n
|
67
|
-
- lib/i18n
|
68
|
-
- lib/i18n
|
69
|
-
- lib/i18n
|
70
|
-
- lib/i18n
|
71
|
-
- lib/i18n
|
94
|
+
- lib/i18n/complements.rb
|
95
|
+
- lib/i18n/complements/core_extension.rb
|
96
|
+
- lib/i18n/complements/localize_extension.rb
|
97
|
+
- lib/i18n/complements/numisma.rb
|
98
|
+
- lib/i18n/complements/numisma/currencies.yml
|
99
|
+
- lib/i18n/complements/numisma/currency.rb
|
100
|
+
- lib/i18n/complements/version.rb
|
72
101
|
- test/helper.rb
|
73
102
|
- test/locales/eng.yml
|
74
103
|
- test/locales/fra.yml
|
@@ -99,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
128
|
version: '0'
|
100
129
|
requirements: []
|
101
130
|
rubyforge_project:
|
102
|
-
rubygems_version: 2.
|
131
|
+
rubygems_version: 2.4.5.1
|
103
132
|
signing_key:
|
104
133
|
specification_version: 4
|
105
134
|
summary: I18n missing functionnalities
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# This module aimed to structure and controls currencies through the application
|
2
|
-
# It represents the international monetary system with all its currencies like specified in ISO 4217
|
3
|
-
# Numisma comes from latin: It designs here the "science of money"
|
4
|
-
require 'net/http'
|
5
|
-
require 'yaml'
|
6
|
-
require 'i18n-complements/numisma/currency'
|
7
|
-
|
8
|
-
module I18nComplements
|
9
|
-
module Numisma
|
10
|
-
|
11
|
-
class << self
|
12
|
-
|
13
|
-
def currencies
|
14
|
-
@@currencies
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
# Returns the path to currencies file
|
19
|
-
def currencies_file
|
20
|
-
# Rails.root.join("config", "currencies.yml")
|
21
|
-
File.join(File.dirname(__FILE__), "numisma", "currencies.yml")
|
22
|
-
end
|
23
|
-
|
24
|
-
# Returns a hash with active currencies only
|
25
|
-
def active_currencies
|
26
|
-
x = {}
|
27
|
-
for code, currency in @@currencies
|
28
|
-
x[code] = currency if currency.active
|
29
|
-
end
|
30
|
-
return x
|
31
|
-
end
|
32
|
-
|
33
|
-
# Shorcut to get currency
|
34
|
-
def [](currency_code)
|
35
|
-
@@currencies[currency_code]
|
36
|
-
end
|
37
|
-
|
38
|
-
def currency_rate(from, to)
|
39
|
-
raise ArgumentError.new(":from currency is unknown (#{from.class}:#{from.inspect})") if Numisma[from].nil?
|
40
|
-
raise ArgumentError.new(":to currency is unknown (#{to.class}:#{to.inspect})") if Numisma[to].nil?
|
41
|
-
rate = nil
|
42
|
-
begin
|
43
|
-
uri = URI("http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate")
|
44
|
-
response = Net::HTTP.post_form(uri, 'FromCurrency' => from, 'ToCurrency' => to)
|
45
|
-
doc = ::LibXML::XML::Parser.string(response.body).parse
|
46
|
-
rate = doc.root.content.to_f
|
47
|
-
rescue
|
48
|
-
uri = URI("http://download.finance.yahoo.com/d/quotes.csv?s=#{from}#{to}=X&f=l1")
|
49
|
-
response = Net::HTTP.get(uri)
|
50
|
-
rate = response.strip.to_f
|
51
|
-
end
|
52
|
-
return rate
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
# Load currencies
|
57
|
-
def load_currencies
|
58
|
-
@@currencies = {}
|
59
|
-
for code, details in YAML.load_file(self.currencies_file)
|
60
|
-
|
61
|
-
currency = Currency.new(code, details.inject({}){|h, p| h[p[0].to_sym] = p[1]; h})
|
62
|
-
@@currencies[currency.code] = currency
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Finally load all currencies
|
68
|
-
load_currencies
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
module ::I18n
|
74
|
-
|
75
|
-
class << self
|
76
|
-
|
77
|
-
def currencies(currency_code)
|
78
|
-
I18nComplements::Numisma.currencies[currency_code.to_s]
|
79
|
-
end
|
80
|
-
|
81
|
-
def active_currencies
|
82
|
-
I18nComplements::Numisma.active_currencies
|
83
|
-
end
|
84
|
-
|
85
|
-
def available_currencies
|
86
|
-
I18nComplements::Numisma.currencies
|
87
|
-
end
|
88
|
-
|
89
|
-
def currency_label(currency_code)
|
90
|
-
if currency = I18nComplements::Numisma.currencies[currency_code.to_s]
|
91
|
-
currency.label
|
92
|
-
else
|
93
|
-
return "Unknown currency: #{currency_code}"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def currency_rate(from, to)
|
98
|
-
I18nComplements::Numisma.currency_rate(from, to)
|
99
|
-
end
|
100
|
-
|
101
|
-
def currencies_file
|
102
|
-
I18nComplements::Numisma.currencies_file
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
module I18nComplements
|
2
|
-
module Numisma
|
3
|
-
|
4
|
-
class Currency
|
5
|
-
attr_reader :code, :active, :cash, :countries, :number, :precision, :unit
|
6
|
-
|
7
|
-
def initialize(code, options = {})
|
8
|
-
@code = code.strip # .upcase
|
9
|
-
@active = (options[:active] ? true : false)
|
10
|
-
@cash = options[:cash].to_a.collect{|x| x.to_f}.sort
|
11
|
-
@countries = options[:countries].to_a.collect{|x| x.to_s}.sort.collect{|x| x.to_sym}
|
12
|
-
@number = options[:number].to_i
|
13
|
-
@precision = options[:precision].to_i
|
14
|
-
@unit = (options[:unit].nil? ? nil : options[:unit].to_s)
|
15
|
-
end
|
16
|
-
|
17
|
-
def name
|
18
|
-
::I18n.translate("currencies.#{self.code}")
|
19
|
-
end
|
20
|
-
|
21
|
-
def label
|
22
|
-
::I18n.translate("labels.currency_with_code", :code=>self.code, :name=>self.name, :default=>"%{name} (%{code})")
|
23
|
-
end
|
24
|
-
|
25
|
-
def round(value, options={})
|
26
|
-
precision = self.precision
|
27
|
-
if RUBY_VERSION.match(/^1\.8/)
|
28
|
-
magnitude = 10**precision
|
29
|
-
return (value * magnitude).to_i.to_f*magnitude
|
30
|
-
else
|
31
|
-
return value.round(precision)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def ==(other_currency)
|
36
|
-
self.code == other_currency.code
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_currency
|
40
|
-
self
|
41
|
-
end
|
42
|
-
|
43
|
-
# Produces a amount of the currency with the locale parameters
|
44
|
-
# TODO: Find a better way to specify number formats which are more complex that the default Rails use
|
45
|
-
def localize(amount, options={})
|
46
|
-
return unless amount
|
47
|
-
|
48
|
-
# options.symbolize_keys!
|
49
|
-
|
50
|
-
defaults = I18n.translate('number.format'.to_sym, :locale => options[:locale], :default => {})
|
51
|
-
defaultt = I18n.translate('number.currency.format'.to_sym, :locale => options[:locale], :default => {})
|
52
|
-
defaultt[:negative_format] ||= ("-" + defaultt[:format]) if defaultt[:format]
|
53
|
-
formatcy = I18n.translate("number.currency.formats.#{self.code}".to_sym, :locale => options[:locale], :default => {})
|
54
|
-
formatcy[:negative_format] ||= "-" + formatcy[:format] if formatcy[:format]
|
55
|
-
|
56
|
-
formatter = {}
|
57
|
-
formatter[:separator] = formatcy[:separator] || defaultt[:separator] || defaults[:separator] || ','
|
58
|
-
formatter[:delimiter] = formatcy[:delimiter] || defaultt[:delimiter] || defaults[:delimiter] || ''
|
59
|
-
formatter[:precision] = formatcy[:precision] || self.precision || defaultt[:precision] || 3
|
60
|
-
format = formatcy[:format] || defaultt[:format] || "%n-%u" # defaults[:format] ||
|
61
|
-
negative_format = formatcy[:negative_format] || defaultt[:negative_format] || defaults[:negative_format] || "-" + format
|
62
|
-
unit = formatcy[:unit] || self.unit || self.code
|
63
|
-
|
64
|
-
if amount.to_f < 0
|
65
|
-
format = negative_format # options.delete(:negative_format)
|
66
|
-
amount = amount.respond_to?("abs") ? amount.abs : amount.sub(/^-/, '')
|
67
|
-
end
|
68
|
-
|
69
|
-
value = amount.to_s
|
70
|
-
integers, decimals = value.split(/\./)
|
71
|
-
value = integers.gsub(/^0+[1-9]+/, '').gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{formatter[:delimiter]}")
|
72
|
-
unless decimals.to_s.match(/^\s*$/)
|
73
|
-
value << formatter[:separator]
|
74
|
-
value << decimals.gsub(/0+$/, '').ljust(formatter[:precision], '0').scan(/.{1,3}/).join(formatter[:delimiter])
|
75
|
-
end
|
76
|
-
return format.gsub(/%n/, value).gsub(/%u/, unit).gsub(/%s/, "\u{00A0}")
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|