i18n 0.4.2 → 0.5.0beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of i18n might be problematic. Click here for more details.
- data/CHANGELOG.textile +12 -3
- data/lib/i18n.rb +18 -21
- data/lib/i18n/backend.rb +0 -1
- data/lib/i18n/backend/base.rb +0 -13
- data/lib/i18n/backend/cache.rb +0 -2
- data/lib/i18n/backend/cascade.rb +6 -10
- data/lib/i18n/backend/chain.rb +0 -2
- data/lib/i18n/backend/cldr.rb +1 -2
- data/lib/i18n/backend/fallbacks.rb +0 -2
- data/lib/i18n/backend/gettext.rb +0 -2
- data/lib/i18n/backend/interpolation_compiler.rb +1 -3
- data/lib/i18n/backend/key_value.rb +1 -3
- data/lib/i18n/backend/memoize.rb +1 -3
- data/lib/i18n/backend/pluralization.rb +0 -2
- data/lib/i18n/backend/simple.rb +0 -2
- data/lib/i18n/config.rb +2 -2
- data/lib/i18n/core_ext/string/interpolate.rb +1 -3
- data/lib/i18n/exceptions.rb +29 -6
- data/lib/i18n/gettext.rb +0 -2
- data/lib/i18n/gettext/helpers.rb +0 -1
- data/lib/i18n/locale/fallbacks.rb +0 -2
- data/lib/i18n/locale/tag/parents.rb +0 -2
- data/lib/i18n/locale/tag/rfc4646.rb +0 -2
- data/lib/i18n/locale/tag/simple.rb +0 -2
- data/lib/i18n/tests.rb +12 -0
- data/lib/i18n/tests/basics.rb +54 -0
- data/lib/i18n/tests/defaults.rb +40 -0
- data/lib/i18n/tests/interpolation.rb +133 -0
- data/lib/i18n/tests/link.rb +56 -0
- data/lib/i18n/tests/localization.rb +19 -0
- data/lib/i18n/tests/localization/date.rb +84 -0
- data/lib/i18n/tests/localization/date_time.rb +77 -0
- data/lib/i18n/tests/localization/procs.rb +103 -0
- data/lib/i18n/tests/localization/time.rb +76 -0
- data/lib/i18n/tests/lookup.rb +74 -0
- data/lib/i18n/tests/pluralization.rb +35 -0
- data/lib/i18n/tests/procs.rb +55 -0
- data/lib/i18n/version.rb +1 -1
- metadata +19 -10
- data/lib/i18n/backend/active_record.rb +0 -61
- data/lib/i18n/backend/active_record/missing.rb +0 -65
- data/lib/i18n/backend/active_record/store_procs.rb +0 -38
- data/lib/i18n/backend/active_record/translation.rb +0 -110
data/CHANGELOG.textile
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
h1. Changelog
|
2
2
|
|
3
|
+
h2. 0.5.0
|
4
|
+
|
5
|
+
* "Extract Backend::ActiveRecord to a separate gem":https://github.com/svenfuchs/i18n/commit/197dacebad356b910d69fa69a719c2ad10cf49e6 (see "i18n-active_record":https://github.com/svenfuchs/i18n-active_record)
|
6
|
+
* "Improve exception handling":https://github.com/svenfuchs/i18n/commit/2913ff9a7544f223f60e7d7b32c2a0e1af89812b (deprectates I18n.default_exception_handler)
|
7
|
+
* "Change MissingTranslationData message to 'translation missing: foo.bar'":https://github.com/svenfuchs/i18n/commit/68fdfe47952325411afe5942e971ce10b2bdf900
|
8
|
+
* "Expose MissingTranslationsData#keys method":https://github.com/svenfuchs/i18n/commit/3a37a389ecaac9670355b334e23e775549ee9822
|
9
|
+
* "Improve Cascade#lookup (add default options)":https://github.com/svenfuchs/i18n/commit/0b9a1f2058a2be9543106cc19d08071c359511e1
|
10
|
+
* "Finally remove deprecated interpolation syntax":https://github.com/svenfuchs/i18n/commit/2d43846d2b2a2e596f30fa58ea1c9ddb2243bb64
|
11
|
+
|
3
12
|
h2. 0.4.2 (2010-10-26)
|
4
13
|
|
5
14
|
* "Improve UTF8 handling":http://github.com/svenfuchs/i18n/commit/e8d5820a3b08eeca28de1a2b9c8a6ad2b9e6476c
|
@@ -44,7 +53,7 @@ h2. 0.3.6 (2010-03-23)
|
|
44
53
|
|
45
54
|
h2. 0.3.5 (2010-02-26)
|
46
55
|
|
47
|
-
* "Delegate I18n.normalize_translation_keys to I18n.normalize_keys and deprecate
|
56
|
+
* "Delegate I18n.normalize_translation_keys to I18n.normalize_keys and deprecate
|
48
57
|
the former":http://github.com/svenfuchs/i18n/commit/7284b04d5f5dd9679cb68875515cdd0cdfc96fef
|
49
58
|
|
50
59
|
h2. 0.3.4 (2010-02-25)
|
@@ -93,7 +102,7 @@ h2. 0.3.0 (2009-11-30)
|
|
93
102
|
h2. 0.2.0 (2009-07-12)
|
94
103
|
|
95
104
|
* "Allow using Ruby 1.9 syntax for string interpolation (API addition)":http://github.com/svenfuchs/i18n/commit/c6e0b06d512f2af57199a843a1d8a40241b32861
|
96
|
-
* "Allow configuring the default scope separator, allow to pass a custom scope separator(API addition)":http://github.com/svenfuchs/i18n/commit/5b75bfbc348061adc11e3790187a187275bfd471 (e.g. I18n.t(:'foo|bar', :separator => '|')
|
105
|
+
* "Allow configuring the default scope separator, allow to pass a custom scope separator(API addition)":http://github.com/svenfuchs/i18n/commit/5b75bfbc348061adc11e3790187a187275bfd471 (e.g. I18n.t(:'foo|bar', :separator => '|')
|
97
106
|
* "Pass :format option to #translate for #localize more useful lambda support":http://github.com/svenfuchs/i18n/commit/e277711b3c844fe7589b8d3f9af0f7d1b969a273
|
98
107
|
* "Refactor Simple backend #resolve to #default and #resolve for more consistency. Now allows to pass lambdas as defaults and re-resolve Symbols":http://github.com/svenfuchs/i18n/commit/8c4ce3d923ce5fa73e973fe28217e18165549aba
|
99
108
|
* "Add lambda support to #translate (API addition)":http://github.com/svenfuchs/i18n/commit/c90e62d8f7d3d5b78f34cfe328d871b58884f115
|
@@ -140,4 +149,4 @@ h2. More information
|
|
140
149
|
* "Wiki":http://rails-i18n.org/wiki
|
141
150
|
* "Mailinglist":http://groups.google.com/group/rails-i18n
|
142
151
|
* "About the project/history":http://www.artweb-design.de/2008/7/18/finally-ruby-on-rails-gets-internationalized
|
143
|
-
* "Initial API Intro":http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api
|
152
|
+
* "Initial API Intro":http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api
|
data/lib/i18n.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Authors:: Sven Fuchs (http://www.artweb-design.de),
|
4
2
|
# Joshua Harvey (http://www.workingwithrails.com/person/759-joshua-harvey),
|
5
3
|
# Stephan Soller (http://www.arkanis-development.de/),
|
@@ -16,6 +14,7 @@ module I18n
|
|
16
14
|
autoload :Config, 'i18n/config'
|
17
15
|
autoload :Gettext, 'i18n/gettext'
|
18
16
|
autoload :Locale, 'i18n/locale'
|
17
|
+
autoload :Tests, 'i18n/tests'
|
19
18
|
|
20
19
|
class << self
|
21
20
|
# Gets I18n configuration object.
|
@@ -252,7 +251,6 @@ module I18n
|
|
252
251
|
self.locale = current_locale if tmp_locale
|
253
252
|
end
|
254
253
|
|
255
|
-
|
256
254
|
# Merges the given locale, key and scope into a single array of keys.
|
257
255
|
# Splits keys that contain dots into multiple keys. Makes sure all
|
258
256
|
# keys are Symbols.
|
@@ -270,15 +268,6 @@ module I18n
|
|
270
268
|
# see http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=24280
|
271
269
|
private
|
272
270
|
|
273
|
-
# Handles exceptions raised in the backend. All exceptions except for
|
274
|
-
# MissingTranslationData exceptions are re-raised. When a MissingTranslationData
|
275
|
-
# was caught and the option :raise is not set the handler returns an error
|
276
|
-
# message string containing the key/scope.
|
277
|
-
def default_exception_handler(exception, locale, key, options)
|
278
|
-
return exception.message if MissingTranslationData === exception
|
279
|
-
raise exception
|
280
|
-
end
|
281
|
-
|
282
271
|
# Any exceptions thrown in translate will be sent to the @@exception_handler
|
283
272
|
# which can be a Symbol, a Proc or any other Object.
|
284
273
|
#
|
@@ -297,20 +286,14 @@ module I18n
|
|
297
286
|
# I18n.exception_handler = I18nExceptionHandler.new # an object
|
298
287
|
# I18n.exception_handler.call(exception, locale, key, options) # will be called like this
|
299
288
|
def handle_exception(exception, locale, key, options)
|
300
|
-
case config.exception_handler
|
289
|
+
case handler = options[:exception_handler] || config.exception_handler
|
301
290
|
when Symbol
|
302
|
-
send(
|
291
|
+
send(handler, exception, locale, key, options)
|
303
292
|
else
|
304
|
-
|
293
|
+
handler.call(exception, locale, key, options)
|
305
294
|
end
|
306
295
|
end
|
307
296
|
|
308
|
-
# Deprecated. Will raise a warning in future versions and then finally be
|
309
|
-
# removed. Use I18n.normalize_keys instead.
|
310
|
-
def normalize_translation_keys(locale, key, scope, separator = nil)
|
311
|
-
normalize_keys(locale, key, scope, separator)
|
312
|
-
end
|
313
|
-
|
314
297
|
def normalize_key(key, separator)
|
315
298
|
normalized_key_cache[separator][key] ||=
|
316
299
|
case key
|
@@ -327,5 +310,19 @@ module I18n
|
|
327
310
|
def normalized_key_cache
|
328
311
|
@normalized_key_cache ||= Hash.new { |h,k| h[k] = {} }
|
329
312
|
end
|
313
|
+
|
314
|
+
# DEPRECATED. Use I18n.normalize_keys instead.
|
315
|
+
def normalize_translation_keys(locale, key, scope, separator = nil)
|
316
|
+
puts "I18n.normalize_translation_keys is deprecated. Please use the class I18n.normalize_keys instead."
|
317
|
+
normalize_keys(locale, key, scope, separator)
|
318
|
+
end
|
319
|
+
|
320
|
+
# DEPRECATED. Please use the I18n::ExceptionHandler class instead.
|
321
|
+
def default_exception_handler(exception, locale, key, options)
|
322
|
+
puts "I18n.default_exception_handler is deprecated. Please use the class I18n::ExceptionHandler instead " +
|
323
|
+
"(an instance of which is set to I18n.exception_handler by default)."
|
324
|
+
return exception.message if MissingTranslationData === exception
|
325
|
+
raise exception
|
326
|
+
end
|
330
327
|
end
|
331
328
|
end
|
data/lib/i18n/backend.rb
CHANGED
data/lib/i18n/backend/base.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'yaml'
|
4
2
|
require 'i18n/core_ext/hash'
|
5
3
|
|
@@ -10,7 +8,6 @@ module I18n
|
|
10
8
|
|
11
9
|
RESERVED_KEYS = [:scope, :default, :separator, :resolve, :object, :fallback]
|
12
10
|
RESERVED_KEYS_PATTERN = /%\{(#{RESERVED_KEYS.join("|")})\}/
|
13
|
-
DEPRECATED_INTERPOLATION_SYNTAX_PATTERN = /(\\)?\{\{([^\}]+)\}\}/
|
14
11
|
|
15
12
|
# Accepts a list of paths to translation files. Loads translations from
|
16
13
|
# plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml
|
@@ -150,16 +147,6 @@ module I18n
|
|
150
147
|
def interpolate(locale, string, values = {})
|
151
148
|
return string unless string.is_a?(::String) && !values.empty?
|
152
149
|
|
153
|
-
string = string.gsub(DEPRECATED_INTERPOLATION_SYNTAX_PATTERN) do
|
154
|
-
escaped, key = $1, $2.to_sym
|
155
|
-
if escaped
|
156
|
-
"{{#{key}}}"
|
157
|
-
else
|
158
|
-
warn_syntax_deprecation!(locale, string)
|
159
|
-
"%{#{key}}"
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
150
|
values.each do |key, value|
|
164
151
|
value = value.call(values) if interpolate_lambda?(value, string, key)
|
165
152
|
value = value.to_s unless value.is_a?(::String)
|
data/lib/i18n/backend/cache.rb
CHANGED
data/lib/i18n/backend/cascade.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# EXPERIMENTAL
|
4
|
-
#
|
5
1
|
# The Cascade module adds the ability to do cascading lookups to backends that
|
6
2
|
# are compatible to the Simple backend.
|
7
3
|
#
|
@@ -38,19 +34,19 @@ module I18n
|
|
38
34
|
def lookup(locale, key, scope = [], options = {})
|
39
35
|
return super unless cascade = options[:cascade]
|
40
36
|
|
37
|
+
cascade = { :step => 1 } unless cascade.is_a?(Hash)
|
38
|
+
step = cascade[:step] || 1
|
39
|
+
offset = cascade[:offset] || 1
|
41
40
|
separator = options[:separator] || I18n.default_separator
|
42
41
|
skip_root = cascade.has_key?(:skip_root) ? cascade[:skip_root] : true
|
43
|
-
step = cascade[:step]
|
44
42
|
|
45
|
-
|
46
|
-
|
47
|
-
scope = I18n.normalize_keys(nil, nil, scope, separator) + keys
|
48
|
-
key = scope.slice!(-offset, offset).join(separator)
|
43
|
+
scope = I18n.normalize_keys(nil, key, scope, separator)
|
44
|
+
key = (scope.slice!(-offset, offset) || []).join(separator)
|
49
45
|
|
50
46
|
begin
|
51
47
|
result = super
|
52
48
|
return result unless result.nil?
|
53
|
-
end while !scope.empty? && scope.slice!(-step, step)
|
49
|
+
end while (!scope.empty? || !skip_root) && scope.slice!(-step, step)
|
54
50
|
end
|
55
51
|
end
|
56
52
|
end
|
data/lib/i18n/backend/chain.rb
CHANGED
data/lib/i18n/backend/cldr.rb
CHANGED
data/lib/i18n/backend/gettext.rb
CHANGED
data/lib/i18n/backend/memoize.rb
CHANGED
data/lib/i18n/backend/simple.rb
CHANGED
data/lib/i18n/config.rb
CHANGED
@@ -57,7 +57,7 @@ module I18n
|
|
57
57
|
|
58
58
|
# Return the current exception handler. Defaults to :default_exception_handler.
|
59
59
|
def exception_handler
|
60
|
-
@@exception_handler ||=
|
60
|
+
@@exception_handler ||= ExceptionHandler.new
|
61
61
|
end
|
62
62
|
|
63
63
|
# Sets the exception handler.
|
@@ -83,4 +83,4 @@ module I18n
|
|
83
83
|
@@load_path = load_path
|
84
84
|
end
|
85
85
|
end
|
86
|
-
end
|
86
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
=begin
|
4
2
|
heavily based on Masao Mutoh's gettext String interpolation extension
|
5
3
|
http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb
|
@@ -95,4 +93,4 @@ rescue ArgumentError
|
|
95
93
|
end
|
96
94
|
end
|
97
95
|
end
|
98
|
-
end
|
96
|
+
end
|
data/lib/i18n/exceptions.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
class KeyError < IndexError
|
4
2
|
def initialize(message = nil)
|
5
3
|
super(message || "key not found")
|
@@ -7,6 +5,22 @@ class KeyError < IndexError
|
|
7
5
|
end unless defined?(KeyError)
|
8
6
|
|
9
7
|
module I18n
|
8
|
+
# Handles exceptions raised in the backend. All exceptions except for
|
9
|
+
# MissingTranslationData exceptions are re-raised. When a MissingTranslationData
|
10
|
+
# was caught the handler returns an error message string containing the key/scope.
|
11
|
+
# Note that the exception handler is not called when the option :raise was given.
|
12
|
+
class ExceptionHandler
|
13
|
+
include Module.new {
|
14
|
+
def call(exception, locale, key, options)
|
15
|
+
if exception.is_a?(MissingTranslationData)
|
16
|
+
options[:rescue_format] == :html ? exception.html_message : exception.message
|
17
|
+
else
|
18
|
+
raise exception
|
19
|
+
end
|
20
|
+
end
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
10
24
|
class ArgumentError < ::ArgumentError; end
|
11
25
|
|
12
26
|
class InvalidLocale < ArgumentError
|
@@ -27,13 +41,22 @@ module I18n
|
|
27
41
|
|
28
42
|
class MissingTranslationData < ArgumentError
|
29
43
|
attr_reader :locale, :key, :options
|
44
|
+
|
30
45
|
def initialize(locale, key, opts = nil)
|
31
46
|
@key, @locale, @options = key, locale, opts.dup || {}
|
32
47
|
options.each { |k, v| options[k] = v.inspect if v.is_a?(Proc) }
|
48
|
+
super "translation missing: #{keys.join('.')}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def html_message
|
52
|
+
key = keys.last.to_s.gsub('_', ' ').gsub(/\b('?[a-z])/) { $1.capitalize }
|
53
|
+
%(<span class="translation_missing" title="translation missing: #{keys.join('.')}">#{key}</span>)
|
54
|
+
end
|
33
55
|
|
34
|
-
|
35
|
-
keys
|
36
|
-
|
56
|
+
def keys
|
57
|
+
@keys ||= I18n.normalize_keys(locale, key, options[:scope]).tap do |keys|
|
58
|
+
keys << 'no key' if keys.size < 2
|
59
|
+
end
|
37
60
|
end
|
38
61
|
end
|
39
62
|
|
@@ -68,4 +91,4 @@ module I18n
|
|
68
91
|
super "can not load translations from #{filename}, the file type #{type} is not known"
|
69
92
|
end
|
70
93
|
end
|
71
|
-
end
|
94
|
+
end
|
data/lib/i18n/gettext.rb
CHANGED
data/lib/i18n/gettext/helpers.rb
CHANGED
data/lib/i18n/tests.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module I18n
|
2
|
+
module Tests
|
3
|
+
autoload :Basics, 'i18n/tests/basics'
|
4
|
+
autoload :Defaults, 'i18n/tests/defaults'
|
5
|
+
autoload :Interpolation, 'i18n/tests/interpolation'
|
6
|
+
autoload :Link, 'i18n/tests/link'
|
7
|
+
autoload :Localization, 'i18n/tests/localization'
|
8
|
+
autoload :Lookup, 'i18n/tests/lookup'
|
9
|
+
autoload :Pluralization, 'i18n/tests/pluralization'
|
10
|
+
autoload :Procs, 'i18n/tests/procs'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module I18n
|
2
|
+
module Tests
|
3
|
+
module Basics
|
4
|
+
def teardown
|
5
|
+
I18n.available_locales = nil
|
6
|
+
end
|
7
|
+
|
8
|
+
test "available_locales returns the locales stored to the backend by default" do
|
9
|
+
I18n.backend.store_translations('de', :foo => 'bar')
|
10
|
+
I18n.backend.store_translations('en', :foo => 'foo')
|
11
|
+
|
12
|
+
assert I18n.available_locales.include?(:de)
|
13
|
+
assert I18n.available_locales.include?(:en)
|
14
|
+
end
|
15
|
+
|
16
|
+
test "available_locales can be set to something else independently from the actual locale data" do
|
17
|
+
I18n.backend.store_translations('de', :foo => 'bar')
|
18
|
+
I18n.backend.store_translations('en', :foo => 'foo')
|
19
|
+
|
20
|
+
I18n.available_locales = :foo
|
21
|
+
assert_equal [:foo], I18n.available_locales
|
22
|
+
|
23
|
+
I18n.available_locales = [:foo, 'bar']
|
24
|
+
assert_equal [:foo, :bar], I18n.available_locales
|
25
|
+
|
26
|
+
I18n.available_locales = nil
|
27
|
+
assert I18n.available_locales.include?(:de)
|
28
|
+
assert I18n.available_locales.include?(:en)
|
29
|
+
end
|
30
|
+
|
31
|
+
test "available_locales memoizes when set explicitely" do
|
32
|
+
I18n.backend.expects(:available_locales).never
|
33
|
+
I18n.available_locales = [:foo]
|
34
|
+
I18n.backend.store_translations('de', :bar => 'baz')
|
35
|
+
I18n.reload!
|
36
|
+
assert_equal [:foo], I18n.available_locales
|
37
|
+
end
|
38
|
+
|
39
|
+
test "available_locales delegates to the backend when not set explicitely" do
|
40
|
+
I18n.backend.expects(:available_locales).twice
|
41
|
+
assert_equal I18n.available_locales, I18n.available_locales
|
42
|
+
end
|
43
|
+
|
44
|
+
test "storing a nil value as a translation removes it from the available locale data" do
|
45
|
+
I18n.backend.store_translations(:en, :to_be_deleted => 'bar')
|
46
|
+
assert_equal 'bar', I18n.t(:to_be_deleted, :default => 'baz')
|
47
|
+
|
48
|
+
I18n.cache_store.clear if I18n.respond_to?(:cache_store) && I18n.cache_store
|
49
|
+
I18n.backend.store_translations(:en, :to_be_deleted => nil)
|
50
|
+
assert_equal 'baz', I18n.t(:to_be_deleted, :default => 'baz')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|