globalize3 0.2.0.beta1 → 0.2.0.beta3

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- globalize3 (0.2.0.beta1)
4
+ globalize3 (0.2.0.beta2)
5
5
  activemodel (>= 3.0.0)
6
6
  activerecord (>= 3.0.0)
7
7
  paper_trail (~> 2)
@@ -10,12 +10,12 @@ GEM
10
10
  remote: http://rubygems.org/
11
11
  specs:
12
12
  abstract (1.0.0)
13
- actionmailer (3.0.7)
14
- actionpack (= 3.0.7)
15
- mail (~> 2.2.15)
16
- actionpack (3.0.7)
17
- activemodel (= 3.0.7)
18
- activesupport (= 3.0.7)
13
+ actionmailer (3.0.9)
14
+ actionpack (= 3.0.9)
15
+ mail (~> 2.2.19)
16
+ actionpack (3.0.9)
17
+ activemodel (= 3.0.9)
18
+ activesupport (= 3.0.9)
19
19
  builder (~> 2.1.2)
20
20
  erubis (~> 2.6.6)
21
21
  i18n (~> 0.5.0)
@@ -23,19 +23,19 @@ GEM
23
23
  rack-mount (~> 0.6.14)
24
24
  rack-test (~> 0.5.7)
25
25
  tzinfo (~> 0.3.23)
26
- activemodel (3.0.7)
27
- activesupport (= 3.0.7)
26
+ activemodel (3.0.9)
27
+ activesupport (= 3.0.9)
28
28
  builder (~> 2.1.2)
29
29
  i18n (~> 0.5.0)
30
- activerecord (3.0.7)
31
- activemodel (= 3.0.7)
32
- activesupport (= 3.0.7)
33
- arel (~> 2.0.2)
30
+ activerecord (3.0.9)
31
+ activemodel (= 3.0.9)
32
+ activesupport (= 3.0.9)
33
+ arel (~> 2.0.10)
34
34
  tzinfo (~> 0.3.23)
35
- activeresource (3.0.7)
36
- activemodel (= 3.0.7)
37
- activesupport (= 3.0.7)
38
- activesupport (3.0.7)
35
+ activeresource (3.0.9)
36
+ activemodel (= 3.0.9)
37
+ activesupport (= 3.0.9)
38
+ activesupport (3.0.9)
39
39
  archive-tar-minitar (0.5.2)
40
40
  arel (2.0.10)
41
41
  builder (2.1.2)
@@ -54,29 +54,31 @@ GEM
54
54
  mime-types (1.16)
55
55
  mocha (0.9.10)
56
56
  rake
57
- paper_trail (2.2.4)
57
+ paper_trail (2.2.9)
58
58
  rails (~> 3)
59
59
  pathname_local (0.0.2)
60
- polyglot (0.3.1)
60
+ polyglot (0.3.2)
61
61
  rack (1.2.3)
62
62
  rack-mount (0.6.14)
63
63
  rack (>= 1.0.0)
64
64
  rack-test (0.5.7)
65
65
  rack (>= 1.0)
66
- rails (3.0.7)
67
- actionmailer (= 3.0.7)
68
- actionpack (= 3.0.7)
69
- activerecord (= 3.0.7)
70
- activeresource (= 3.0.7)
71
- activesupport (= 3.0.7)
66
+ rails (3.0.9)
67
+ actionmailer (= 3.0.9)
68
+ actionpack (= 3.0.9)
69
+ activerecord (= 3.0.9)
70
+ activeresource (= 3.0.9)
71
+ activesupport (= 3.0.9)
72
72
  bundler (~> 1.0)
73
- railties (= 3.0.7)
74
- railties (3.0.7)
75
- actionpack (= 3.0.7)
76
- activesupport (= 3.0.7)
73
+ railties (= 3.0.9)
74
+ railties (3.0.9)
75
+ actionpack (= 3.0.9)
76
+ activesupport (= 3.0.9)
77
77
  rake (>= 0.8.7)
78
+ rdoc (~> 3.4)
78
79
  thor (~> 0.14.4)
79
80
  rake (0.8.7)
81
+ rdoc (3.9.2)
80
82
  ruby-debug-base19 (0.11.25)
81
83
  columnize (>= 0.3.1)
82
84
  linecache19 (>= 0.5.11)
@@ -90,9 +92,10 @@ GEM
90
92
  sqlite3-ruby (1.3.2)
91
93
  test_declarative (0.0.5)
92
94
  thor (0.14.6)
93
- treetop (1.4.9)
95
+ treetop (1.4.10)
96
+ polyglot
94
97
  polyglot (>= 0.3.1)
95
- tzinfo (0.3.27)
98
+ tzinfo (0.3.29)
96
99
 
97
100
  PLATFORMS
98
101
  ruby
@@ -39,6 +39,10 @@ post.title # => גלובאלייז2 שולט!
39
39
 
40
40
  In order to make this work, you'll need to add the appropriate translation tables. Globalize3 comes with a handy helper method to help you do this. It's called @create_translation_table!@. Here's an example:
41
41
 
42
+ <em>Note that if you're using rails ~> 3.1.0.rc migrations has only the <tt>change</tt> instance method</em>
43
+
44
+ h3. Rails 3.0
45
+
42
46
  <pre><code>
43
47
  class CreatePosts < ActiveRecord::Migration
44
48
  def self.up
@@ -54,6 +58,25 @@ class CreatePosts < ActiveRecord::Migration
54
58
  end
55
59
  </code></pre>
56
60
 
61
+ h3. Rails ~> 3.1.0.rc
62
+
63
+ <em>Do not use the change method</em>
64
+
65
+ <pre><code>
66
+ class CreatePosts < ActiveRecord::Migration
67
+ def up
68
+ create_table :posts do |t|
69
+ t.timestamps
70
+ end
71
+ Post.create_translation_table! :title => :string, :text => :text
72
+ end
73
+ def down
74
+ drop_table :posts
75
+ Post.drop_translation_table!
76
+ end
77
+ end
78
+ </code></pre>
79
+
57
80
  Note that the ActiveRecord model @Post@ must already exist and have a @translates@ directive listing the translated fields.
58
81
 
59
82
  h2. Migrating existing data to and from the translated version
@@ -95,6 +118,64 @@ Please also note that @update_attribute@ currently hides itself from dirty track
95
118
 
96
119
  Also, please see the tests in test/globalize3/versioning_test.rb for some current gotchas.
97
120
 
121
+ h2. I18n fallbacks for empty translations
122
+
123
+ It is possible to enable fallbacks for empty translations. It will depend on the configuration setting you have set for I18n translations in your Rails config.
124
+
125
+ You can enable them by adding the next line to @config/application.rb@ (or only @config/environments/production.rb@ if you only want them in production)
126
+
127
+ <pre><code>config.i18n.fallbacks = true</code></pre>
128
+
129
+ By default, globalize3 will only use fallbacks when your translation model does not exist or the translation value for the item you've requested is @nil@. However it is possible to also use fallbacks for @blank@ translations by adding @:fallbacks_for_empty_translations => true@ to the @translates@ method.
130
+
131
+ <pre><code>
132
+ class Post < ActiveRecord::Base
133
+ translates :title, :name
134
+ end
135
+
136
+ puts post.translations.inspect
137
+ # => [#<Post::Translation id: 1, post_id: 1, locale: "en", title: "Globalize3 rocks!", name: "Globalize3">, #<Post::Translation id: 2, post_id: 1, locale: "nl", title: '', name: nil>]
138
+
139
+ I18n.locale = :en
140
+ post.title # => 'Globalize3 rocks!'
141
+ post.name # => 'Globalize3'
142
+
143
+ I18n.locale = :nl
144
+ post.title # => ''
145
+ post.name # => 'Globalize3'
146
+ </code></pre>
147
+ <pre><code>
148
+ class Post < ActiveRecord::Base
149
+ translates :title, :name, :fallbacks_for_empty_translations => true
150
+ end
151
+
152
+ puts post.translations.inspect
153
+ # => [#<Post::Translation id: 1, post_id: 1, locale: "en", title: "Globalize3 rocks!", name: "Globalize3">, #<Post::Translation id: 2, post_id: 1, locale: "nl", title: '', name: nil>]
154
+
155
+ I18n.locale = :en
156
+ post.title # => 'Globalize3 rocks!'
157
+ post.name # => 'Globalize3'
158
+
159
+ I18n.locale = :nl
160
+ post.title # => 'Globalize3 rocks!'
161
+ post.name # => 'Globalize3'
162
+ </code></pre>
163
+
164
+
165
+ h2. Scoping objects by those with translations
166
+
167
+ To only return objects that have a translation for the given locale we can use the `with_translations` scope. This will only return records that have a translations for the passed in locale.
168
+
169
+ <pre><code>
170
+
171
+ Post.with_translations('en') # => [#<Post::Translation id: 1, post_id: 1, locale: "en", title: "Globalize3 rocks!", name: "Globalize3">, #<Post::Translation id: 2, post_id: 1, locale: "nl", title: '', name: nil>]
172
+
173
+ Post.with_translations(I18n.locale) # => [#<Post::Translation id: 1, post_id: 1, locale: "en", title: "Globalize3 rocks!", name: "Globalize3">, #<Post::Translation id: 2, post_id: 1, locale: "nl", title: '', name: nil>]
174
+
175
+ Post.with_translations('de') # => []
176
+
177
+ </code></pre>
178
+
98
179
  h2. Changes since Globalize2
99
180
 
100
181
  * `translation_table_name` was renamed to `translations_table_name`
@@ -7,9 +7,10 @@ module Globalize
7
7
  options = attr_names.extract_options!
8
8
  options[:table_name] ||= "#{table_name.singularize}_translations"
9
9
 
10
- class_attribute :translated_attribute_names, :translation_options
10
+ class_attribute :translated_attribute_names, :translation_options, :fallbacks_for_empty_translations
11
11
  self.translated_attribute_names = attr_names.map(&:to_sym)
12
12
  self.translation_options = options
13
+ self.fallbacks_for_empty_translations = options[:fallbacks_for_empty_translations]
13
14
 
14
15
  include InstanceMethods
15
16
  extend ClassMethods, Migration
@@ -23,7 +23,7 @@ module Globalize
23
23
  Globalize.fallbacks(locale).each do |fallback|
24
24
  value = fetch_stash(fallback, name) || fetch_attribute(fallback, name)
25
25
 
26
- if value
26
+ unless fallbacks_for?(value)
27
27
  set_metadata(value, :locale => fallback, :requested_locale => locale)
28
28
  return value
29
29
  end
@@ -41,6 +41,7 @@ module Globalize
41
41
  attrs.each { |name, value| translation[name] = value }
42
42
  translation.save!
43
43
  end
44
+ record.translations.each(&:reload)
44
45
  record.translations.reset
45
46
  stash.clear
46
47
  end
@@ -84,6 +85,14 @@ module Globalize
84
85
  class << object; attr_accessor :translation_metadata end
85
86
  object.translation_metadata ||= {}
86
87
  end
88
+
89
+ def fallbacks_for?(object)
90
+ object.nil? || (fallbacks_for_empty_translations? && object.blank?)
91
+ end
92
+
93
+ def fallbacks_for_empty_translations?
94
+ record.fallbacks_for_empty_translations
95
+ end
87
96
  end
88
97
  end
89
98
  end
@@ -113,7 +113,9 @@ module Globalize
113
113
  def translation_for(locale)
114
114
  @translation_caches ||= {}
115
115
  unless @translation_caches[locale]
116
- _translation = translations.with_locale(locale).first
116
+ # Enumberable#detect is better since we have the translations collection (already) loaded
117
+ # using either Model.includes(:translations) or Model.with_translations
118
+ _translation = translations.detect{|t| t.locale.to_s == locale.to_s}
117
119
  _translation ||= translations.build(:locale => locale)
118
120
  @translation_caches[locale] = _translation
119
121
  end
@@ -1,3 +1,3 @@
1
1
  module Globalize3
2
- VERSION = '0.2.0.beta1'
2
+ VERSION = '0.2.0.beta3'
3
3
  end
metadata CHANGED
@@ -1,8 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: globalize3
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 62196357
4
5
  prerelease: 6
5
- version: 0.2.0.beta1
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ - beta
11
+ - 3
12
+ version: 0.2.0.beta3
6
13
  platform: ruby
7
14
  authors:
8
15
  - Sven Fuchs
@@ -13,8 +20,7 @@ autorequire:
13
20
  bindir: bin
14
21
  cert_chain: []
15
22
 
16
- date: 2011-05-26 00:00:00 +12:00
17
- default_executable:
23
+ date: 2011-08-16 00:00:00 Z
18
24
  dependencies:
19
25
  - !ruby/object:Gem::Dependency
20
26
  name: activerecord
@@ -24,6 +30,11 @@ dependencies:
24
30
  requirements:
25
31
  - - ">="
26
32
  - !ruby/object:Gem::Version
33
+ hash: 7
34
+ segments:
35
+ - 3
36
+ - 0
37
+ - 0
27
38
  version: 3.0.0
28
39
  type: :runtime
29
40
  version_requirements: *id001
@@ -35,6 +46,11 @@ dependencies:
35
46
  requirements:
36
47
  - - ">="
37
48
  - !ruby/object:Gem::Version
49
+ hash: 7
50
+ segments:
51
+ - 3
52
+ - 0
53
+ - 0
38
54
  version: 3.0.0
39
55
  type: :runtime
40
56
  version_requirements: *id002
@@ -46,6 +62,9 @@ dependencies:
46
62
  requirements:
47
63
  - - ~>
48
64
  - !ruby/object:Gem::Version
65
+ hash: 7
66
+ segments:
67
+ - 2
49
68
  version: "2"
50
69
  type: :runtime
51
70
  version_requirements: *id003
@@ -57,6 +76,11 @@ dependencies:
57
76
  requirements:
58
77
  - - "="
59
78
  - !ruby/object:Gem::Version
79
+ hash: 15
80
+ segments:
81
+ - 0
82
+ - 5
83
+ - 2
60
84
  version: 0.5.2
61
85
  type: :development
62
86
  version_requirements: *id004
@@ -68,6 +92,9 @@ dependencies:
68
92
  requirements:
69
93
  - - ">="
70
94
  - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
71
98
  version: "0"
72
99
  type: :development
73
100
  version_requirements: *id005
@@ -79,6 +106,9 @@ dependencies:
79
106
  requirements:
80
107
  - - ">="
81
108
  - !ruby/object:Gem::Version
109
+ hash: 3
110
+ segments:
111
+ - 0
82
112
  version: "0"
83
113
  type: :development
84
114
  version_requirements: *id006
@@ -90,17 +120,23 @@ dependencies:
90
120
  requirements:
91
121
  - - ">="
92
122
  - !ruby/object:Gem::Version
123
+ hash: 3
124
+ segments:
125
+ - 0
93
126
  version: "0"
94
127
  type: :development
95
128
  version_requirements: *id007
96
129
  - !ruby/object:Gem::Dependency
97
- name: ruby-debug19
130
+ name: ruby-debug
98
131
  prerelease: false
99
132
  requirement: &id008 !ruby/object:Gem::Requirement
100
133
  none: false
101
134
  requirements:
102
135
  - - ">="
103
136
  - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
104
140
  version: "0"
105
141
  type: :development
106
142
  version_requirements: *id008
@@ -112,6 +148,9 @@ dependencies:
112
148
  requirements:
113
149
  - - ">="
114
150
  - !ruby/object:Gem::Version
151
+ hash: 3
152
+ segments:
153
+ - 0
115
154
  version: "0"
116
155
  type: :development
117
156
  version_requirements: *id009
@@ -147,7 +186,6 @@ files:
147
186
  - LICENSE
148
187
  - Rakefile
149
188
  - README.textile
150
- has_rdoc: true
151
189
  homepage: http://github.com/svenfuchs/globalize3
152
190
  licenses: []
153
191
 
@@ -161,17 +199,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
199
  requirements:
162
200
  - - ">="
163
201
  - !ruby/object:Gem::Version
202
+ hash: 3
203
+ segments:
204
+ - 0
164
205
  version: "0"
165
206
  required_rubygems_version: !ruby/object:Gem::Requirement
166
207
  none: false
167
208
  requirements:
168
209
  - - ">"
169
210
  - !ruby/object:Gem::Version
211
+ hash: 25
212
+ segments:
213
+ - 1
214
+ - 3
215
+ - 1
170
216
  version: 1.3.1
171
217
  requirements: []
172
218
 
173
219
  rubyforge_project: "[none]"
174
- rubygems_version: 1.6.2
220
+ rubygems_version: 1.8.6
175
221
  signing_key:
176
222
  specification_version: 3
177
223
  summary: "Rails I18n: de-facto standard library for ActiveRecord 3 model/data translation"