l10n 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36eedbf1cd75adfb0c60b0d129946830e3a51061
4
- data.tar.gz: 7761e7398936575ac035ed7127f7bad266a79ba2
3
+ metadata.gz: 866b98e1c6683bc7ec991e01d7d2d1ee67311906
4
+ data.tar.gz: 3c5bb6f5e84a1d83839e35d470c9482fb764c9bb
5
5
  SHA512:
6
- metadata.gz: 6a10d2ca1eb7c673c2dd710d09b1a6c991a48d986550f11ea7fa8dacb9acb64efe47711affc4bbea0d7f9aa69981003ffcb41df89f05d3554b01b0c2ad297cb6
7
- data.tar.gz: 2ca30313f972703e11c4e22d1704649cd9c7347b1e33f4c236270a2bc34301674f1ce82b38859fc3392ff8d41fb895173fa5bd5391e229c7118fae0c3ec72025
6
+ metadata.gz: 3b955a86b74e926412306b7e03b7e81c93a781a7f866c0c92de4b1b46d005158e7b8700c572cc9b449fb49345f7dac135c20c2c3e0f44370de257e6a8ee8cbdb
7
+ data.tar.gz: 71f8806d4025bfb63697d44a0e1b76cd8da2a9fccc2b61378135eb9d512a5cef886d7f13b6564e31307dde6958128009258679b71fc0671935c43d8ce780d8b2
@@ -0,0 +1,5 @@
1
+ * 1.1.0 - 2014-12-09
2
+
3
+ - Adding Time#l
4
+ - Adding I18n support for JavaScript
5
+ - Updating README
data/README.md CHANGED
@@ -1,15 +1,15 @@
1
- L10n - I18n that roarrrs
2
- ========================
1
+ # L10n - I18n that roarrrs
3
2
 
3
+ ## Installation
4
4
 
5
- Installation
6
- ------------
5
+ ```ruby
6
+ # Gemfile
7
+ gem 'l10n'
8
+ ```
7
9
 
10
+ ## Setting up your app
8
11
 
9
- Setting up your app
10
- -------------------
11
-
12
- In your language.yml, make sure to have definitions for
12
+ In your <language>.yml, make sure to have definitions for
13
13
 
14
14
  number:
15
15
  precision:
@@ -20,12 +20,135 @@ number:
20
20
 
21
21
  As there is currently a bug in Rails: https://github.com/rails/rails/issues/4420
22
22
 
23
+ ## Features
24
+
25
+ ### ActiveRecord column translations
26
+
27
+ ```ruby
28
+ class Fruit < ActiveRecord::Base
29
+ # columns: name, name_de, name_fr
30
+
31
+ translates :name
32
+ end
33
+
34
+ apple = Fruit.new(name: 'Apple', name_de: 'Apfel', name_fr: 'Pomme')
35
+
36
+ I18n.as(:en) { apple.name_t } => "Apple"
37
+ I18n.as(:de) { apple.name_t } => "Apfel"
38
+ I18n.as(:fr) { apple.name_t } => "Pomme"
39
+
40
+ apple.name_translations => { en: "Apple", de: "Apfel", fr: "Pomme" }
41
+ ```
42
+
43
+ Translated columns also support validation:
44
+
45
+ ```ruby
46
+ class Fruit < ActiveRecord::Base
47
+ translates :name
48
+
49
+ # all translation columns for "name" must be present
50
+ validate :name, translation: true
51
+ end
52
+ ```
53
+
54
+ ### Core extensions
55
+
56
+ #### String and Symbol
57
+
58
+ ```yaml
59
+ # de.yml
60
+ de:
61
+ words:
62
+ one: Eins
63
+ two: Zwei
64
+ three: Drei
65
+ four: Vier
66
+ five: Fünf
67
+
68
+ hello: "Hallo %{name}!"
69
+ ```
70
+
71
+ ```ruby
72
+ I18n.locale = :de
73
+
74
+ 'words.one'.t => 'Eins'
75
+
76
+ 'hello'.t(name: 'Otto') => "Hallo Otto!"
77
+ ```
78
+
79
+ This also works with symbols.
80
+
81
+ #### Formatting of numbers
82
+
83
+ ```ruby
84
+ I18n.as('de') { 1234.5.to_formatted_s } => "1.234,50"
85
+ I18n.as('en') { 1234.5.to_formatted_s } => "1,234.50"
86
+ ```
87
+
88
+ This also works with instances of BigDecimal.
89
+
90
+ #### Localization of decimal separator and delimiter for numbers
91
+
92
+ ```ruby
93
+ I18n.as('de') { 1234.5.to_localized_s } => "1.234,5"
94
+ I18n.as('en') { 1234.5.to_localized_s } => "1,234.5"
95
+ ```
96
+
97
+ #### Localization of decimal separator and delimiter for numeric strings
98
+
99
+ ```ruby
100
+ I18n.as(:de) { Numeric.localize('1,234.50') } => "1.234,50"
101
+ I18n.as(:en) { Numeric.localize('1,234.50') } => "1,234.50"
102
+ ```
103
+
104
+ ### Automatic localization of numeric values in Rails forms and models
105
+
106
+ ```ruby
107
+ # in your template
108
+ <%= form_for @car do |f| %>
109
+ <% f.amount_field :price, precision: 2 %>
110
+ <% end %>
111
+
112
+ # in your controller, or elsewhere
113
+ # params => { car: { price: "12.000,00" } }
114
+
115
+ I18n.locale = :de
116
+ @car = Car.new(params[:car]).price => 12000
117
+
118
+ I18n.locale = :en
119
+ @car = Car.new(params[:car]).price => 12
120
+ ```
121
+
122
+ ### Accept-Language header parsing in ActionDispatch::Request
123
+
124
+ The Accept-Language header will be parsed, and locales will be returned ordered by user preference.
125
+
126
+ ```ruby
127
+ # in your controller
128
+ request.accept_locales => ["en-US", "en", "en-GB"]
129
+ ```
23
130
 
24
- Features
25
- --------
131
+ ### Javascript I18n, interpolation and pluralization
26
132
 
133
+ ```yaml
134
+ # en.yml
135
+ en:
136
+ javascript:
137
+ hello: Hello {name}!
138
+
139
+ apple:
140
+ one: '{count} apple'
141
+ other: '{count} apples'
142
+ ```
27
143
 
28
- ```` ruby
144
+ ```ruby
145
+ # in your application layout
146
+ <%= i18n_script_tag %>
147
+ ```
29
148
 
30
- ````
149
+ ```javascript
150
+ // in any javascript
151
+ "hello".t({ name: "JS" }) => "Hello JS!"
31
152
 
153
+ "apple".t({ count: 4 }) => "5 apples"
154
+ ```
@@ -0,0 +1,33 @@
1
+ var I18n = I18n || {};
2
+
3
+ I18n.translate = function(str, options) {
4
+ options = options || {};
5
+ var fallback = options['fallback'] || ('Translation missing: ' + str); // default is a JS reserved word
6
+ var translation, matches, method, match, interpolation_value;
7
+ var count = options['count'];
8
+ var keys = str.split('.');
9
+ var obj = this.translations;
10
+ while(obj && keys.length) obj = obj[keys.shift()];
11
+ if (obj) {
12
+ if ($.type(obj) == 'object' && count !== undefined) {
13
+ translation = obj[1 == count ? 'one' : 'other'];
14
+ } else {
15
+ translation = obj;
16
+ }
17
+ if ($.type(translation) == 'string' && (matches = translation.match(/{\w+?}/g))) {
18
+ while(match = matches.shift()) {
19
+ method = match.substr(1, match.length - 2);
20
+ interpolation_value = options[method];
21
+ if (interpolation_value == undefined) interpolation_value = ('undefined interpolation value: ' + method);
22
+ translation = translation.replace(new RegExp(match, 'g'), interpolation_value);
23
+ }
24
+ }
25
+ }
26
+ return translation || fallback;
27
+ };
28
+
29
+ I18n.t = function(str, options) {
30
+ return this.translate(str, options);
31
+ };
32
+
33
+ String.prototype.t = function(options){ return(I18n.translate(this, options)); }
@@ -1,4 +1,5 @@
1
1
  require 'i18n'
2
+ require 'date'
2
3
  require 'bigdecimal'
3
4
  require 'action_view'
4
5
  require 'action_dispatch'
@@ -12,7 +13,9 @@ require 'l10n/numeric_column_conversions'
12
13
  require 'l10n/column_translation'
13
14
  require 'l10n/translation_validator'
14
15
  require 'l10n/forms'
16
+ require 'l10n/javascript_helper'
15
17
  require 'l10n/request'
18
+ require 'l10n/engine'
16
19
 
17
20
  files = Dir[File.join(File.dirname(__FILE__), 'locales/*.yml')]
18
21
  I18n.load_path.concat(files)
@@ -1,7 +1,7 @@
1
1
  require 'l10n/core_extensions/object_ext'
2
2
  require 'l10n/core_extensions/string_ext'
3
3
  require 'l10n/core_extensions/symbol_ext'
4
- require 'l10n/core_extensions/date_ext'
4
+ require 'l10n/core_extensions/date_time_ext'
5
5
  require 'l10n/core_extensions/numeric_ext'
6
6
  require 'l10n/core_extensions/big_decimal_ext'
7
7
 
@@ -1,6 +1,6 @@
1
1
  module L10n
2
2
  module CoreExtensions
3
- module DateExt
3
+ module DateTimeExt
4
4
  def localize(*args)
5
5
  I18n.l(self, *args)
6
6
  end
@@ -9,4 +9,5 @@ module L10n
9
9
  end
10
10
  end
11
11
 
12
- Date.send :include, L10n::CoreExtensions::DateExt
12
+ Date.send :include, L10n::CoreExtensions::DateTimeExt
13
+ Time.send :include, L10n::CoreExtensions::DateTimeExt
@@ -0,0 +1,7 @@
1
+ require 'rails/engine'
2
+
3
+ module L10n
4
+ class Engine < ::Rails::Engine
5
+
6
+ end
7
+ end
@@ -2,13 +2,15 @@ module L10n
2
2
  module JavaScriptHelper
3
3
 
4
4
  def i18n_script_tag
5
- javascript_tag(%%
5
+ javascript_tag %<
6
6
  var I18n = I18n || {};
7
7
 
8
8
  I18n.locale = function() {
9
9
  return("#{I18n.locale}");
10
10
  };
11
- %)
11
+
12
+ I18n.translations = #{I18n.t(:javascript).to_json};
13
+ >
12
14
  end
13
15
 
14
16
  end
@@ -1,3 +1,3 @@
1
1
  module L10n
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l10n
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-12 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '4.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: railties
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: sqlite3
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,24 +136,26 @@ dependencies:
122
136
  - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: 0.8.7
125
- description: I18n that roarrrs
139
+ description: Extensions for Rails I18n
126
140
  email: mtgrosser@gmx.net
127
141
  executables: []
128
142
  extensions: []
129
143
  extra_rdoc_files: []
130
144
  files:
145
+ - CHANGELOG
131
146
  - MIT-LICENSE
132
147
  - README.md
133
- - Rakefile
148
+ - app/assets/javascripts/i18n.js
134
149
  - lib/l10n.rb
135
150
  - lib/l10n/column_translation.rb
136
151
  - lib/l10n/core_extensions.rb
137
152
  - lib/l10n/core_extensions/big_decimal_ext.rb
138
- - lib/l10n/core_extensions/date_ext.rb
153
+ - lib/l10n/core_extensions/date_time_ext.rb
139
154
  - lib/l10n/core_extensions/numeric_ext.rb
140
155
  - lib/l10n/core_extensions/object_ext.rb
141
156
  - lib/l10n/core_extensions/string_ext.rb
142
157
  - lib/l10n/core_extensions/symbol_ext.rb
158
+ - lib/l10n/engine.rb
143
159
  - lib/l10n/forms.rb
144
160
  - lib/l10n/i18n_extensions.rb
145
161
  - lib/l10n/inflections.rb
@@ -150,8 +166,9 @@ files:
150
166
  - lib/l10n/version.rb
151
167
  - lib/locales/de.yml
152
168
  - lib/locales/en.yml
153
- homepage: http://rubygems.org/gems/l10n
154
- licenses: []
169
+ homepage: https://github.com/mtgrosser/l10n
170
+ licenses:
171
+ - MIT
155
172
  metadata: {}
156
173
  post_install_message:
157
174
  rdoc_options: []
@@ -172,5 +189,5 @@ rubyforge_project:
172
189
  rubygems_version: 2.2.2
173
190
  signing_key:
174
191
  specification_version: 4
175
- summary: Extensions for Rails I18n
192
+ summary: I18n that roarrrs
176
193
  test_files: []
data/Rakefile DELETED
@@ -1,22 +0,0 @@
1
- require 'rake'
2
- require 'rake/testtask'
3
- require 'rdoc/task'
4
-
5
- desc 'Default: run unit tests.'
6
- task :default => :test
7
-
8
- desc 'Run all tests'
9
- Rake::TestTask.new(:test) do |t|
10
- t.libs << 'lib'
11
- t.test_files = FileList['test/cases/*_test.rb']
12
- t.verbose = true
13
- end
14
-
15
- desc 'Generate documentation'
16
- Rake::RDocTask.new(:rdoc) do |rdoc|
17
- rdoc.rdoc_dir = 'rdoc'
18
- rdoc.title = 'L10n'
19
- rdoc.options << '--line-numbers' << '--inline-source'
20
- rdoc.rdoc_files.include('README')
21
- rdoc.rdoc_files.include('lib/**/*.rb')
22
- end