i18n 0.4.0 → 1.14.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +0 -0
  3. data/README.md +127 -0
  4. data/lib/i18n/backend/base.rb +189 -111
  5. data/lib/i18n/backend/cache.rb +58 -22
  6. data/lib/i18n/backend/cache_file.rb +36 -0
  7. data/lib/i18n/backend/cascade.rb +9 -10
  8. data/lib/i18n/backend/chain.rb +95 -42
  9. data/lib/i18n/backend/fallbacks.rb +68 -22
  10. data/lib/i18n/backend/flatten.rb +13 -8
  11. data/lib/i18n/backend/gettext.rb +33 -25
  12. data/lib/i18n/backend/interpolation_compiler.rb +12 -14
  13. data/lib/i18n/backend/key_value.rb +112 -10
  14. data/lib/i18n/backend/lazy_loadable.rb +184 -0
  15. data/lib/i18n/backend/memoize.rb +13 -7
  16. data/lib/i18n/backend/metadata.rb +12 -6
  17. data/lib/i18n/backend/pluralization.rb +64 -25
  18. data/lib/i18n/backend/simple.rb +44 -18
  19. data/lib/i18n/backend/transliterator.rb +43 -33
  20. data/lib/i18n/backend.rb +5 -3
  21. data/lib/i18n/config.rb +91 -10
  22. data/lib/i18n/exceptions.rb +118 -22
  23. data/lib/i18n/gettext/helpers.rb +14 -4
  24. data/lib/i18n/gettext/po_parser.rb +7 -7
  25. data/lib/i18n/gettext.rb +6 -5
  26. data/lib/i18n/interpolate/ruby.rb +53 -0
  27. data/lib/i18n/locale/fallbacks.rb +33 -26
  28. data/lib/i18n/locale/tag/parents.rb +8 -8
  29. data/lib/i18n/locale/tag/rfc4646.rb +0 -2
  30. data/lib/i18n/locale/tag/simple.rb +2 -4
  31. data/lib/i18n/locale.rb +2 -0
  32. data/lib/i18n/middleware.rb +17 -0
  33. data/lib/i18n/tests/basics.rb +58 -0
  34. data/lib/i18n/tests/defaults.rb +52 -0
  35. data/lib/i18n/tests/interpolation.rb +167 -0
  36. data/lib/i18n/tests/link.rb +66 -0
  37. data/lib/i18n/tests/localization/date.rb +122 -0
  38. data/lib/i18n/tests/localization/date_time.rb +103 -0
  39. data/lib/i18n/tests/localization/procs.rb +118 -0
  40. data/lib/i18n/tests/localization/time.rb +103 -0
  41. data/lib/i18n/tests/localization.rb +19 -0
  42. data/lib/i18n/tests/lookup.rb +81 -0
  43. data/lib/i18n/tests/pluralization.rb +35 -0
  44. data/lib/i18n/tests/procs.rb +66 -0
  45. data/lib/i18n/tests.rb +14 -0
  46. data/lib/i18n/utils.rb +55 -0
  47. data/lib/i18n/version.rb +3 -1
  48. data/lib/i18n.rb +200 -87
  49. metadata +64 -56
  50. data/CHANGELOG.textile +0 -135
  51. data/README.textile +0 -93
  52. data/lib/i18n/backend/active_record/missing.rb +0 -65
  53. data/lib/i18n/backend/active_record/store_procs.rb +0 -38
  54. data/lib/i18n/backend/active_record/translation.rb +0 -93
  55. data/lib/i18n/backend/active_record.rb +0 -61
  56. data/lib/i18n/backend/cldr.rb +0 -100
  57. data/lib/i18n/core_ext/hash.rb +0 -29
  58. data/lib/i18n/core_ext/string/interpolate.rb +0 -98
data/CHANGELOG.textile DELETED
@@ -1,135 +0,0 @@
1
- h1. Changelog
2
-
3
- h2. master
4
-
5
- h2. 0.4.0 (2010-05-27)
6
-
7
- * "The localization proc also receives the object as option":http://github.com/svenfuchs/i18n/commit/4a8cd9fa660daaa3078e24c5851353ca377d9213
8
-
9
- h2. 0.4.0.beta1 (2010-05-03)
10
-
11
- * "Renamed Fast backend to Memoize backend":http://github.com/svenfuchs/i18n/commit/f7f7dc12c00a19d3876223771e14f8671ff313cd
12
-
13
- * "Deprecate {{}} as interpolation syntax":http://github.com/svenfuchs/i18n/commit/8894ee521ef5788c415b625a6daf522af4c416e0
14
-
15
- * "Allow nil translation to be stored again":http://github.com/svenfuchs/i18n/commit/f2074f1e82d10c2e9a801c8cc2f2a0c7c30703ba
16
-
17
- h2. 0.4.0.beta (2010-04-30)
18
-
19
- * "Added a KeyValue backend":http://github.com/svenfuchs/i18n/commit/28ca5f53ade7f545f8c0804e93564d4686b416a4
20
-
21
- * "Added transliteration support":http://github.com/svenfuchs/i18n/commit/928fdb4794959e779e90f360eb01ba043672d8d5
22
-
23
- * "Create Flatten backend module to aid handling flatten translations":http://github.com/svenfuchs/i18n/commit/2ec9d6998aa8facd7b15a3ef47a96cf2471cd8a1
24
-
25
- * "Decouple the external separator (used when storing translations) from the internal separator in Fast and ActiveRecord backends":http://github.com/svenfuchs/i18n/commit/274cb4daa0ca5e3b2bd23b45eb7f9fc58f75a79d
26
-
27
- h2. 0.3.7 (2010-04-17)
28
-
29
- * "Speed up I18n.normalize_keys by caching reused normalizations and producing less garbage":http://github.com/svenfuchs/i18n/commit/819dac0fea9c29e6545801aa107e63e355728cd4
30
-
31
- h2. 0.3.6 (2010-03-23)
32
-
33
- * "Move gettext po parser to lib":http://github.com/svenfuchs/i18n/commit/b2f038663b55727ac2327e6f07a46ba5d69d600c
34
-
35
- * "Move I18n configuration to I18n.config":http://github.com/svenfuchs/i18n/commit/4a7baea86663ead8c681008c3e80a622f0546b07
36
-
37
- h2. 0.3.5 (2010-02-26)
38
-
39
- * "Delegate I18n.normalize_translation_keys to I18n.normalize_keys and deprecate
40
- the former":http://github.com/svenfuchs/i18n/commit/7284b04d5f5dd9679cb68875515cdd0cdfc96fef
41
-
42
- h2. 0.3.4 (2010-02-25)
43
-
44
- * "Rename I18n.normalize_translation_keys to I18n.normalize_keys and finally make it public":http://github.com/svenfuchs/i18n/commit/20b05fe5802df6c90fb70a4e3760b2b851b791b3
45
-
46
- * "Added CLDR supoprt":http://github.com/svenfuchs/i18n/commit/860eadf671a231e7f5dffb1bb27fa318ff7a8786
47
-
48
- h2. 0.3.3 (2009-12-29)
49
-
50
- * "Use lib/i18n/version":http://github.com/svenfuchs/i18n/commit/ff426c8e7a2438b814cb303adadec292dacb752e
51
-
52
- * "Added a benchmark suite":http://github.com/svenfuchs/i18n/commit/f9b5b9b113097724638bdab96862ffa404e67e70
53
-
54
- * "Ensure links can be handled recursively":http://github.com/svenfuchs/i18n/commit/2c50bd209f3fc24fe9dfa694c81be64340f09b7d
55
-
56
- * "Make sure we can lookup false values as translation data":http://github.com/svenfuchs/i18n/commit/561c82ba4b8921d03bfdf56cb2d0c2f287629001
57
-
58
- * "Added Fast backend module":http://github.com/svenfuchs/i18n/commit/bd2f09f0a251ca793b0e8ecc7e32177a2f091c23
59
-
60
- * "Added InterpolationCompiler backend module":http://github.com/svenfuchs/i18n/commit/91810887d1abfb28996a9183bc9004678290d28b
61
-
62
- h2. 0.3.2 (2009-12-12)
63
-
64
- * "Added Cascade backend":http://github.com/svenfuchs/i18n/commit/8009aef293e9ef8564c9005090d8380feabcaf6f
65
-
66
- h2. 0.3.1 (2009-12-11)
67
-
68
- * "Add PoParser to gemspec":http://github.com/svenfuchs/i18n/commit/d6b2763f39c932f66adb039b96882a472f883c51
69
- * "Enable custom separators for ActiveRecord backend":http://github.com/svenfuchs/i18n/commit/9341d3fcfc951cc31807ba672d2b5d90909ef3e5
70
- * "Pass interpolation values to interpolation procs":http://github.com/svenfuchs/i18n/commit/39c2ed8fbad645671cd5520ce7ad0aeefe2b0cca
71
- * "Fix that ngettext supports keys with dots":http://github.com/svenfuchs/i18n/commit/7362a43c34364d500de8899cfcca6bf1a5e6d1c8
72
-
73
- h2. 0.3.0 (2009-11-30)
74
-
75
- * "Gettext backend and helpers":http://github.com/svenfuchs/i18n/commit/35a1740d2f10b808548af352006950da4017e374
76
- * "Metadata module":http://github.com/svenfuchs/i18n/commit/2677208555179b36fcbe958c0e8bc642cf5bc020
77
- * "Basic ActiveRecord backend":http://github.com/svenfuchs/i18n/commit/786632d0b42de423ecf0969622efc87f1691e2a2
78
- * "Set encoding to UTF8 for all files":http://github.com/svenfuchs/i18n/commit/9be3d4a311b5bf583eec5d39986176cc40c112f2
79
- * "Chain backend":http://github.com/svenfuchs/i18n/commit/08259ffb88b3005403648d77bc1cbca0b92f3cf5
80
- * "Backend/cache implementation":http://github.com/svenfuchs/i18n/commit/e7bf15351cd2e27f5972eb40e65a5dd6f4a0feed
81
- * "Pluralization module":http://github.com/svenfuchs/i18n/commit/9ca4c9ed52d4706566a6abeb2d78722dcc5d4764
82
- * "add and adapt Globalize2 fallback implementation":http://github.com/svenfuchs/i18n/commit/1b37a303b27d6222b17162804b06323e5628768f
83
- * "move Simple backend implementation to a Base backend class and extend Simple from Base.":http://github.com/svenfuchs/i18n/commit/32ddc80a04e6aa247f6d6613bde7f78c73396cb4
84
-
85
- h2. 0.2.0 (2009-07-12)
86
-
87
- * "Allow using Ruby 1.9 syntax for string interpolation (API addition)":http://github.com/svenfuchs/i18n/commit/c6e0b06d512f2af57199a843a1d8a40241b32861
88
- * "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 => '|')
89
- * "Pass :format option to #translate for #localize more useful lambda support":http://github.com/svenfuchs/i18n/commit/e277711b3c844fe7589b8d3f9af0f7d1b969a273
90
- * "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
91
- * "Add lambda support to #translate (API addition)":http://github.com/svenfuchs/i18n/commit/c90e62d8f7d3d5b78f34cfe328d871b58884f115
92
- * "Add lambda support to #localize (API addition)":http://github.com/svenfuchs/i18n/commit/9d390afcf33f3f469bb95e6888147152f6cc7442
93
-
94
- h2. 0.1.3 (2009-02-27)
95
-
96
- * "Remove unnecessary string encoding handling in the i18n simple backend which made the backend break on Ruby 1.9":http://github.com/svenfuchs/i18n/commit/4c3a970783861a94f2e89f46714fb3434e4f4f8d
97
-
98
- h2. 0.1.2 (2009-01-09)
99
-
100
- * "added #available_locales (returns an array of locales for which translations are available)":http://github.com/svenfuchs/i18n/commit/411f8fe7c8f3f89e9b6b921fa62ed66cb92f3af4
101
- * "flatten load_path before using it so that a nested array of paths won't throw up":http://github.com/svenfuchs/i18n/commit/d473a068a2b90aba98135deb225d6eb6d8104d70
102
-
103
- h2. 0.1.1 (2008-11-20)
104
-
105
- * "Use :'en' as a default locale (in favor of :'en-US')":http://github.com/svenfuchs/i18n/commit/c4b10b246aecf7da78cb2568dd0d2ab7e6b8a230
106
- * "Add #reload! to Simple backend":http://github.com/svenfuchs/i18n/commit/36dd2bd9973b9e1559728749a9daafa44693e964
107
-
108
- h2. 0.1.0 (2008-10-25)
109
-
110
- * "Fix Simple backend to distinguish false from nil values":http://github.com/svenfuchs/i18n/commit/39d9a47da14b5f3ba126af48923af8c30e135166
111
- * "Add #load_path to public api, add initialize to simple backend and remove #load_translations from public api":http://github.com/svenfuchs/i18n/commit/c4c5649e6bc8f020f1aaf5a5470bde048e22c82d
112
- * "Speed up Backend::Simple#interpolate":http://github.com/svenfuchs/i18n/commit/9e1ac6bf8833304e036323ec9932b9f33c468a35
113
- * "Remove #populate and #store_translations from public API":http://github.com/svenfuchs/i18n/commit/f4e514a80be7feb509f66824ee311905e2940900
114
- * "Use :other instead of :many as a plural key":http://github.com/svenfuchs/i18n/commit/0f8f20a2552bf6a2aa758d8fdd62a7154e4a1bf6
115
- * "Use a class instead of a module for Simple backend":http://github.com/svenfuchs/i18n/commit/08f051aa61320c17debde24a83268bc74e33b995
116
- * "Make Simple backend #interpolate deal with non-ASCII string encodings":http://github.com/svenfuchs/i18n/commit/d84a3f3f55543c084d5dc5d1fed613b8df148789
117
- * "Fix default arrays of non-existant keys returning the default array":http://github.com/svenfuchs/i18n/commit/6c04ca86c87f97dc78f07c2a4023644e5ba8b839
118
-
119
- h2. Initial implementation (June/July 2008)
120
-
121
- Initial implementation by "Sven Fuchs":http://www.workingwithrails.com/person/9963-sven-fuchs based on previous discussion/consensus of the rails-i18n team (alphabetical order) and many others:
122
-
123
- * "Matt Aimonetti":http://railsontherun.com
124
- * "Sven Fuchs":http://www.workingwithrails.com/person/9963-sven-fuchs
125
- * "Joshua Harvey":http://www.workingwithrails.com/person/759-joshua-harvey
126
- * "Saimon Moore":http://saimonmoore.net
127
- * "Stephan Soller":http://www.arkanis-development.de
128
-
129
- h2. More information
130
-
131
- * "Homepage":http://rails-i18n.org
132
- * "Wiki":http://rails-i18n.org/wiki
133
- * "Mailinglist":http://groups.google.com/group/rails-i18n
134
- * "About the project/history":http://www.artweb-design.de/2008/7/18/finally-ruby-on-rails-gets-internationalized
135
- * "Initial API Intro":http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api
data/README.textile DELETED
@@ -1,93 +0,0 @@
1
- h1. Ruby I18n
2
-
3
- Ruby Internationalization and localization solution.
4
-
5
- Features:
6
-
7
- * translation and localization
8
- * interpolation of values to translations (Ruby 1.9 compatible syntax)
9
- * pluralization (CLDR compatible)
10
- * customizable transliteration to ASCII
11
- * flexible defaults
12
- * bulk lookup
13
- * lambdas as translation data
14
- * custom key/scope separator
15
- * custom exception handlers
16
- * extensible architecture with a swappable backend
17
-
18
- Pluggable features:
19
-
20
- * Cache
21
- * Pluralization: lambda pluralizers stored as translation data
22
- * Locale fallbacks, RFC4647 compliant (optionally: RFC4646 locale validation)
23
- * Gettext support
24
- * Translation metadata
25
-
26
- Alternative backends:
27
-
28
- * Chain
29
- * ActiveRecord (optionally: ActiveRecord::Missing and ActiveRecord::StoreProcs)
30
- * KeyValue (uses active_support/json and cannot store procs)
31
-
32
- For more information and lots of resources see: "http://rails-i18n.org/wiki":http://rails-i18n.org/wiki
33
-
34
- h2. Installation
35
-
36
- gem install i18n
37
-
38
- h3. Installation on Rails < 2.3.5 (deprecated)
39
-
40
- Up to version 2.3.4 Rails will not accept i18n gems > 0.1.3. There is an unpacked
41
- gem inside of active_support/lib/vendor which gets loaded unless gem 'i18n', '~> 0.1.3'.
42
- This requirement is relaxed in "6da03653":http://github.com/rails/rails/commit/6da03653
43
-
44
- The new i18n gem can be loaded from vendor/plugins like this:
45
-
46
- def reload_i18n!
47
- raise "Move to i18n version 0.2.0 or greater" if Rails.version > "2.3.4"
48
-
49
- $:.grep(/i18n/).each { |path| $:.delete(path) }
50
- I18n::Backend.send :remove_const, "Simple"
51
- $: << Rails.root.join('vendor', 'plugins', 'i18n', 'lib').to_s
52
- end
53
-
54
- Then you can `reload_i18n!` inside an i18n initializer.
55
-
56
- h2. Tests
57
-
58
- You can run tests both with
59
-
60
- * `rake test` or just `rake`
61
- * run any test file directly, e.g. `ruby test/api/simple_test.rb`
62
- * run all tests with `ruby test/all.rb`
63
-
64
- The structure of the test suite is a bit unusual as it uses modules to reuse
65
- particular tests in different test cases.
66
-
67
- The reason for this is that we need to enforce the I18n API across various
68
- combinations of extensions. E.g. the Simple backend alone needs to support
69
- the same API as any combination of feature and/or optimization modules included
70
- to the Simple backend. We test this by reusing the same API defition (implemented
71
- as test methods) in test cases with different setups.
72
-
73
- You can find the test cases that enforce the API in test/api. And you can find
74
- the API definition test methods in test/api/tests.
75
-
76
- All other test cases (e.g. as defined in test/backend, test/core\_ext) etc.
77
- follow the usual test setup and should be easy to grok.
78
-
79
- h2. Authors
80
-
81
- * "Sven Fuchs":http://www.artweb-design.de
82
- * "Joshua Harvey":http://www.workingwithrails.com/person/759-joshua-harvey
83
- * "Stephan Soller":http://www.arkanis-development.de
84
- * "Saimon Moore":http://saimonmoore.net
85
- * "Matt Aimonetti":http://railsontherun.com
86
-
87
- h2. Contributors
88
-
89
- http://github.com/svenfuchs/i18n/contributors
90
-
91
- h2. License
92
-
93
- MIT License. See the included MIT-LICENSE file.
@@ -1,65 +0,0 @@
1
- # This extension stores translation stub records for missing translations to
2
- # the database.
3
- #
4
- # This is useful if you have a web based translation tool. It will populate
5
- # the database with untranslated keys as the application is being used. A
6
- # translator can then go through these and add missing translations.
7
- #
8
- # Example usage:
9
- #
10
- # I18n::Backend::Chain.send(:include, I18n::Backend::ActiveRecord::Missing)
11
- # I18n.backend = I18nChainBackend.new(I18n::Backend::ActiveRecord.new, I18n::Backend::Simple.new)
12
- #
13
- # Stub records for pluralizations will also be created for each key defined
14
- # in i18n.plural.keys.
15
- #
16
- # For example:
17
- #
18
- # # en.yml
19
- # en:
20
- # i18n:
21
- # plural:
22
- # keys: [:zero, :one, :other]
23
- #
24
- # # pl.yml
25
- # pl:
26
- # i18n:
27
- # plural:
28
- # keys: [:zero, :one, :few, :other]
29
- #
30
- # It will also persist interpolation keys in Translation#interpolations so
31
- # translators will be able to review and use them.
32
- module I18n
33
- module Backend
34
- class ActiveRecord
35
- module Missing
36
- def store_default_translations(locale, key, options = {})
37
- count, scope, default, separator = options.values_at(:count, *Base::RESERVED_KEYS)
38
- separator ||= I18n.default_separator
39
-
40
- keys = I18n.normalize_keys(locale, key, scope, separator)[1..-1]
41
- key = keys.join(separator || I18n.default_separator)
42
-
43
- unless ActiveRecord::Translation.locale(locale).lookup(key).exists?
44
- interpolations = options.reject { |name, value| Base::RESERVED_KEYS.include?(name) }.keys
45
- keys = count ? I18n.t('i18n.plural.keys', :locale => locale).map { |k| [key, k].join(separator) } : [key]
46
- keys.each { |key| store_default_translation(locale, key, interpolations) }
47
- end
48
- end
49
-
50
- def store_default_translation(locale, key, interpolations)
51
- translation = ActiveRecord::Translation.new :locale => locale.to_s, :key => key
52
- translation.interpolations = interpolations
53
- translation.save
54
- end
55
-
56
- def translate(locale, key, options = {})
57
- super
58
- rescue I18n::MissingTranslationData => e
59
- self.store_default_translations(locale, key, options)
60
- raise e
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,38 +0,0 @@
1
- # This module is intended to be mixed into the ActiveRecord backend to allow
2
- # storing Ruby Procs as translation values in the database.
3
- #
4
- # I18n.backend = I18n::Backend::ActiveRecord.new
5
- # I18n::Backend::ActiveRecord::Translation.send(:include, I18n::Backend::ActiveRecord::StoreProcs)
6
- #
7
- # The StoreProcs module requires the ParseTree and ruby2ruby gems and therefor
8
- # was extracted from the original backend.
9
- #
10
- # ParseTree is not compatible with Ruby 1.9.
11
-
12
- begin
13
- require 'ruby2ruby'
14
- require 'parse_tree'
15
- require 'parse_tree_extensions'
16
- rescue LoadError => e
17
- puts "can't use StoreProcs because: #{e.message}"
18
- end
19
-
20
- module I18n
21
- module Backend
22
- class ActiveRecord
23
- module StoreProcs
24
- def value=(v)
25
- case v
26
- when Proc
27
- write_attribute(:value, v.to_ruby)
28
- write_attribute(:is_proc, true)
29
- else
30
- write_attribute(:value, v)
31
- end
32
- end
33
-
34
- Translation.send(:include, self) if method(:to_s).respond_to?(:to_ruby)
35
- end
36
- end
37
- end
38
- end
@@ -1,93 +0,0 @@
1
- require 'active_record'
2
-
3
- module I18n
4
- module Backend
5
- # ActiveRecord model used to store actual translations to the database.
6
- #
7
- # This model expects a table like the following to be already set up in
8
- # your the database:
9
- #
10
- # create_table :translations do |t|
11
- # t.string :locale
12
- # t.string :key
13
- # t.text :value
14
- # t.text :interpolations
15
- # t.boolean :is_proc, :default => false
16
- # end
17
- #
18
- # This model supports to named scopes :locale and :lookup. The :locale
19
- # scope simply adds a condition for a given locale:
20
- #
21
- # I18n::Backend::ActiveRecord::Translation.locale(:en).all
22
- # # => all translation records that belong to the :en locale
23
- #
24
- # The :lookup scope adds a condition for looking up all translations
25
- # that either start with the given keys (joined by an optionally given
26
- # separator or I18n.default_separator) or that exactly have this key.
27
- #
28
- # # with translations present for :"foo.bar" and :"foo.baz"
29
- # I18n::Backend::ActiveRecord::Translation.lookup(:foo)
30
- # # => an array with both translation records :"foo.bar" and :"foo.baz"
31
- #
32
- # I18n::Backend::ActiveRecord::Translation.lookup([:foo, :bar])
33
- # I18n::Backend::ActiveRecord::Translation.lookup(:"foo.bar")
34
- # # => an array with the translation record :"foo.bar"
35
- #
36
- # When the StoreProcs module was mixed into this model then Procs will
37
- # be stored to the database as Ruby code and evaluated when :value is
38
- # called.
39
- #
40
- # Translation = I18n::Backend::ActiveRecord::Translation
41
- # Translation.create \
42
- # :locale => 'en'
43
- # :key => 'foo'
44
- # :value => lambda { |key, options| 'FOO' }
45
- # Translation.find_by_locale_and_key('en', 'foo').value
46
- # # => 'FOO'
47
- class ActiveRecord
48
- class Translation < ::ActiveRecord::Base
49
- set_table_name 'translations'
50
- attr_protected :is_proc, :interpolations
51
-
52
- serialize :value
53
- serialize :interpolations, Array
54
-
55
- scope_method = ::ActiveRecord::VERSION::MAJOR == 2 ? :named_scope : :scope
56
-
57
- send scope_method, :locale, lambda { |locale|
58
- { :conditions => { :locale => locale.to_s } }
59
- }
60
-
61
- send scope_method, :lookup, lambda { |keys, *separator|
62
- column_name = connection.quote_column_name('key')
63
- keys = Array(keys).map! { |key| key.to_s }
64
-
65
- unless separator.empty?
66
- warn "[DEPRECATION] Giving a separator to Translation.lookup is deprecated. " <<
67
- "You can change the internal separator by overwriting FLATTEN_SEPARATOR."
68
- end
69
-
70
- namespace = "#{keys.last}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%"
71
- { :conditions => ["#{column_name} IN (?) OR #{column_name} LIKE ?", keys, namespace] }
72
- }
73
-
74
- def self.available_locales
75
- Translation.find(:all, :select => 'DISTINCT locale').map { |t| t.locale.to_sym }
76
- end
77
-
78
- def interpolates?(key)
79
- self.interpolations.include?(key) if self.interpolations
80
- end
81
-
82
- def value
83
- if is_proc
84
- Kernel.eval(read_attribute(:value))
85
- else
86
- value = read_attribute(:value)
87
- value == 'f' ? false : value
88
- end
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,61 +0,0 @@
1
- require 'i18n/backend/base'
2
- require 'i18n/backend/active_record/translation'
3
-
4
- module I18n
5
- module Backend
6
- class ActiveRecord
7
- autoload :Missing, 'i18n/backend/active_record/missing'
8
- autoload :StoreProcs, 'i18n/backend/active_record/store_procs'
9
- autoload :Translation, 'i18n/backend/active_record/translation'
10
-
11
- module Implementation
12
- include Base, Flatten
13
-
14
- def available_locales
15
- begin
16
- Translation.available_locales
17
- rescue ::ActiveRecord::StatementInvalid
18
- []
19
- end
20
- end
21
-
22
- def store_translations(locale, data, options = {})
23
- escape = options.fetch(:escape, true)
24
- flatten_translations(locale, data, escape, false).each do |key, value|
25
- Translation.locale(locale).lookup(expand_keys(key)).delete_all
26
- Translation.create(:locale => locale.to_s, :key => key.to_s, :value => value)
27
- end
28
- end
29
-
30
- protected
31
-
32
- def lookup(locale, key, scope = [], options = {})
33
- key = normalize_flat_keys(locale, key, scope, options[:separator])
34
- result = Translation.locale(locale).lookup(key).all
35
-
36
- if result.empty?
37
- nil
38
- elsif result.first.key == key
39
- result.first.value
40
- else
41
- chop_range = (key.size + FLATTEN_SEPARATOR.size)..-1
42
- result = result.inject({}) do |hash, r|
43
- hash[r.key.slice(chop_range)] = r.value
44
- hash
45
- end
46
- result.deep_symbolize_keys
47
- end
48
- end
49
-
50
- # For a key :'foo.bar.baz' return ['foo', 'foo.bar', 'foo.bar.baz']
51
- def expand_keys(key)
52
- key.to_s.split(FLATTEN_SEPARATOR).inject([]) do |keys, key|
53
- keys << [keys.last, key].compact.join(FLATTEN_SEPARATOR)
54
- end
55
- end
56
- end
57
-
58
- include Implementation
59
- end
60
- end
61
- end
@@ -1,100 +0,0 @@
1
- # encoding: utf-8
2
- require 'cldr'
3
-
4
- module I18n
5
- module Backend
6
- module Cldr
7
- include ::Cldr::Format
8
-
9
- def localize(locale, object, format = :default, options = {})
10
- options[:as] ||= detect_type(object, options)
11
- send(:"format_#{options[:as]}", locale, object, format, options)
12
- end
13
-
14
- def format_decimal(locale, object, format = :default, options = {})
15
- formatter(locale, :decimal, format).apply(object, options)
16
- end
17
-
18
- def format_integer(locale, object, format = :default, options = {})
19
- format_object(number, options.merge(:precision => 0))
20
- end
21
-
22
- def format_currency(locale, object, format = :default, options = {})
23
- options.merge!(:currency => lookup_currency(locale, options[:currency], object)) if options[:currency].is_a?(Symbol)
24
- formatter(locale, :currency, format).apply(object, options)
25
- end
26
-
27
- def format_percent(locale, object, format = :default, options = {})
28
- formatter(locale, :percent, format).apply(object, options)
29
- end
30
-
31
- def format_date(locale, object, format = :default, options = {})
32
- formatter(locale, :date, format).apply(object, options)
33
- end
34
-
35
- def format_time(locale, object, format = :default, options = {})
36
- formatter(locale, :time, format).apply(object, options)
37
- end
38
-
39
- def format_datetime(locale, object, format = :default, options = {})
40
- key = :"calendars.gregorian.formats.datetime.#{format}.pattern"
41
- date = I18n.l(object, :format => options[:date_format] || format, :locale => locale, :as => :date)
42
- time = I18n.l(object, :format => options[:time_format] || format, :locale => locale, :as => :time)
43
- I18n.t(key, :date => date, :time => time, :locale => locale, :raise => true)
44
- end
45
-
46
- protected
47
-
48
- def detect_type(object, options)
49
- options.has_key?(:currency) ? :currency : case object
50
- when ::Numeric
51
- :decimal
52
- when ::Date, ::DateTime, ::Time
53
- object.class.name.downcase.to_sym
54
- else
55
- raise_unspecified_format_type!
56
- end
57
- end
58
-
59
- def formatter(locale, type, format)
60
- (@formatters ||= {})[:"#{locale}.#{type}.#{format}"] ||= begin
61
- format = lookup_format(locale, type, format)
62
- data = lookup_format_data(locale, type)
63
- ::Cldr::Format.const_get(type.to_s.camelize).new(format, data)
64
- end
65
- end
66
-
67
- def lookup_format(locale, type, format)
68
- key = case type
69
- when :date, :time, :datetime
70
- :"calendars.gregorian.formats.#{type}.#{format}.pattern"
71
- else
72
- :"numbers.formats.#{type}.patterns.#{format || :default}"
73
- end
74
- I18n.t(key, :locale => locale, :raise => true)
75
- end
76
-
77
- def lookup_format_data(locale, type)
78
- key = case type
79
- when :date, :time, :datetime
80
- :'calendars.gregorian'
81
- else
82
- :'numbers.symbols'
83
- end
84
- I18n.t(key, :locale => locale, :raise => true)
85
- end
86
-
87
- def lookup_currency(locale, currency, count)
88
- I18n.t(:"currencies.#{currency}", :locale => locale, :count => count)
89
- end
90
-
91
- def raise_unspecified_format_type!
92
- raise ArgumentError.new("You have to specify a format type, e.g. :as => :number.")
93
- end
94
-
95
- def raise_unspecified_currency!
96
- raise ArgumentError.new("You have to specify a currency, e.g. :currency => 'EUR'.")
97
- end
98
- end
99
- end
100
- end
@@ -1,29 +0,0 @@
1
- class Hash
2
- def slice(*keep_keys)
3
- h = {}
4
- keep_keys.each { |key| h[key] = fetch(key) }
5
- h
6
- end unless Hash.method_defined?(:slice)
7
-
8
- def except(*less_keys)
9
- slice(*keys - less_keys)
10
- end unless Hash.method_defined?(:except)
11
-
12
- def deep_symbolize_keys
13
- inject({}) { |result, (key, value)|
14
- value = value.deep_symbolize_keys if value.is_a?(Hash)
15
- result[(key.to_sym rescue key) || key] = value
16
- result
17
- }
18
- end unless Hash.method_defined?(:deep_symbolize_keys)
19
-
20
- # deep_merge_hash! by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
21
- MERGER = proc do |key, v1, v2|
22
- Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2
23
- end
24
-
25
- def deep_merge!(data)
26
- merge!(data, &MERGER)
27
- end unless Hash.method_defined?(:deep_merge!)
28
- end
29
-