globalize 5.0.1 → 5.1.0.beta1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f79ee6b19f357cae4c848d662d6f081a6375b8c
4
- data.tar.gz: 1f4fe986e59139c19acd2c2eac58b7598213ed85
3
+ metadata.gz: a08ebfb553ad5faf8e55d1b120bbafd8571327e2
4
+ data.tar.gz: b30cca9abefcb65933dcbff2ace3040f40cbfea7
5
5
  SHA512:
6
- metadata.gz: 5f9894c0da31c4734117700845576c612e24a9c4575fc19370c87f788837ea6bf0968fe46c51d094c9a75d0fc39d1c7204b2b581716a5663a5a82ef901ae12de
7
- data.tar.gz: c6ee550b86c3cec2e43443d11791b88a03c0d541cb1791a1b3aed249f664297ca96b0721823322c78ba8a869e4b82508727b70889d8c47b4a83f86caa6505a64
6
+ metadata.gz: ead976f8983d5477cce5d9e518f48997c7fdedb3abd057a79946fda0828943672069e286c3c9deff5d5ef53f8faebf24a3081f4e4bb323f9e9e5375fe95af5a8
7
+ data.tar.gz: 7dd8d873d8492109cffa6561d6a57829f8b7d737f8125dd200a853ac11bcb6f8774c615b5cdd3c024223d81a6841c1c0d9d79481f6a77c11328d4ad363e9c4de
@@ -1,5 +1,12 @@
1
1
  # Globalize Changelog
2
2
 
3
+ ## 5.1.0 (unreleased)
4
+
5
+ * Replaced `after_` callbacks with `before_` callbacks and set `autosave: true` by default. [#341](https://github.com/globalize/globalize/pull/341) by [Andrew Volozhanin](https://github.com/scarfacedeb)
6
+ * Add [RequestStore](https://github.com/steveklabnik/request_store) to make Globalize thread-safe again [#420](https://github.com/globalize/globalize/pull/420)
7
+ * Join the translations table when ordering by translated attributes (https://github.com/globalize/globalize/pull/447). (thanks [Thomas Maas](https://github.com/thomasmaas) & [Michal Cichra](https://github.com/mikz)).
8
+ * Add `unique` to `with_translation` to prevent duplicates if fallbacks are defined and the queried locale is not the fallback language. [#489](https://github.com/globalize/globalize/pull/489) by [krisdigital](https://github.com/krisdigital)
9
+
3
10
  ## 5.0.1 (2015-02-15)
4
11
 
5
12
  * Don't touch table when model is loaded. [#412](https://github.com/globalize/globalize/pull/412)
@@ -74,7 +81,12 @@
74
81
 
75
82
  * Backport scope support on uniqueness validation from 4.0, drop support for ActiveRecord < 3.1, fixes [#324](https://github.com/globalize/globalize/issues/324).
76
83
 
84
+ ## 3.0.5 (2015-04-24)
85
+
86
+ * Now working properly with the squeel library. (thanks [Toru Mori](https://github.com/torumori)). See [#437](https://github.com/globalize/globalize/pull/437)
87
+
77
88
  ## 3.0.4 (2014-01-08)
89
+
78
90
  * Extract all versioning-related code to separate [globalize-versioning](https://github.com/globalize/globalize-versioning) gem.
79
91
 
80
92
  ## 3.0.3 (2013-12-26)
data/Gemfile CHANGED
@@ -1,12 +1,26 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ gem "pry"
6
+
7
+ eval File.read(File.expand_path("../gemfiles/.gemfile.database-config.rb", __FILE__))
8
+
5
9
  platforms :rbx do
6
- gem 'rubysl', '~> 2.0'
10
+ gem "rubysl", "~> 2.0"
11
+ gem "rubinius-developer_tools"
7
12
  end
8
13
 
9
- group :test do
10
- gem 'pry'
11
- gem 'pry-nav'
14
+ platforms :jruby do
15
+ if !ENV['TRAVIS'] || ENV['DB'] == 'sqlite3'
16
+ gem 'activerecord-jdbcsqlite3-adapter', git: "https://github.com/jruby/activerecord-jdbc-adapter"
17
+ end
18
+
19
+ if !ENV['TRAVIS'] || ENV['DB'] == 'mysql'
20
+ gem 'activerecord-jdbcmysql-adapter', git: "https://github.com/jruby/activerecord-jdbc-adapter"
21
+ end
22
+
23
+ if !ENV['TRAVIS'] || %w(postgres postgresql).include?(ENV['DB'])
24
+ gem 'activerecord-jdbcpostgresql-adapter', git: "https://github.com/jruby/activerecord-jdbc-adapter"
25
+ end
12
26
  end
@@ -1,52 +1,88 @@
1
+ GIT
2
+ remote: https://github.com/jruby/activerecord-jdbc-adapter
3
+ revision: 8c734333384b0e2c49eb3c331fdebc28726d8248
4
+ specs:
5
+ activerecord-jdbc-adapter (1.4.0.dev-java)
6
+ jar-dependencies (~> 0.1.13)
7
+ activerecord-jdbcmysql-adapter (1.4.0.dev)
8
+ activerecord-jdbc-adapter (~> 1.4.0.dev)
9
+ jdbc-mysql (>= 5.1.22)
10
+ activerecord-jdbcpostgresql-adapter (1.4.0.dev)
11
+ activerecord-jdbc-adapter (~> 1.4.0.dev)
12
+ jdbc-postgres (>= 9.1)
13
+ activerecord-jdbcsqlite3-adapter (1.4.0.dev)
14
+ activerecord-jdbc-adapter (~> 1.4.0.dev)
15
+ jdbc-sqlite3 (>= 3.7.2, < 3.9)
16
+ jdbc-mysql (5.1.39)
17
+ jdbc-postgres (9.4.1206)
18
+ jdbc-sqlite3 (3.8.11.2)
19
+
1
20
  PATH
2
21
  remote: .
3
22
  specs:
4
- globalize (5.0.1)
5
- activemodel (>= 4.2.0, < 4.3)
6
- activerecord (>= 4.2.0, < 4.3)
23
+ globalize (5.1.0)
24
+ activemodel (>= 4.2, < 5.1)
25
+ activerecord (>= 4.2, < 5.1)
26
+ request_store (~> 1.0)
7
27
 
8
28
  GEM
9
29
  remote: https://rubygems.org/
10
30
  specs:
11
- activemodel (4.2.0)
12
- activesupport (= 4.2.0)
13
- builder (~> 3.1)
14
- activerecord (4.2.0)
15
- activemodel (= 4.2.0)
16
- activesupport (= 4.2.0)
17
- arel (~> 6.0)
18
- activesupport (4.2.0)
31
+ activemodel (5.0.0)
32
+ activesupport (= 5.0.0)
33
+ activerecord (5.0.0)
34
+ activemodel (= 5.0.0)
35
+ activesupport (= 5.0.0)
36
+ arel (~> 7.0)
37
+ activesupport (5.0.0)
38
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
39
  i18n (~> 0.7)
20
- json (~> 1.7, >= 1.7.7)
21
40
  minitest (~> 5.1)
22
- thread_safe (~> 0.3, >= 0.3.4)
23
41
  tzinfo (~> 1.1)
24
- ansi (1.4.3)
25
- arel (6.0.0)
42
+ ansi (1.5.0)
43
+ arel (7.0.0)
26
44
  builder (3.2.2)
27
- coderay (1.1.0)
28
- database_cleaner (1.4.0)
45
+ coderay (1.1.1)
46
+ concurrent-ruby (1.0.2)
47
+ concurrent-ruby (1.0.2-java)
48
+ database_cleaner (1.5.3)
49
+ ffi (1.9.14-java)
29
50
  ffi2-generators (0.1.1)
30
51
  i18n (0.7.0)
31
- json (1.8.2)
52
+ jar-dependencies (0.1.15)
53
+ json (1.8.3)
54
+ json (1.8.3-java)
32
55
  method_source (0.8.2)
33
- minitest (5.5.1)
34
- minitest-reporters (1.0.8)
56
+ minitest (5.9.0)
57
+ minitest-reporters (1.1.10)
35
58
  ansi
36
59
  builder
37
60
  minitest (>= 5.0)
38
61
  ruby-progressbar
39
- pry (0.10.1)
62
+ mysql2 (0.4.4)
63
+ pg (0.18.4)
64
+ pry (0.10.4)
40
65
  coderay (~> 1.1.0)
41
66
  method_source (~> 0.8.1)
42
67
  slop (~> 3.4)
43
- pry-nav (0.2.4)
44
- pry (>= 0.9.10, < 0.11.0)
45
- rake (10.4.2)
46
- rb-readline (0.5.2)
47
- rdoc (4.2.0)
48
- ruby-progressbar (1.7.1)
49
- rubysl (2.1.0)
68
+ pry (0.10.4-java)
69
+ coderay (~> 1.1.0)
70
+ method_source (~> 0.8.1)
71
+ slop (~> 3.4)
72
+ spoon (~> 0.0)
73
+ rake (11.2.2)
74
+ rdoc (4.2.2)
75
+ json (~> 1.4)
76
+ request_store (1.3.1)
77
+ rubinius-coverage (2.1)
78
+ rubinius-debugger (2.4)
79
+ rubinius-developer_tools (2.0.0)
80
+ rubinius-coverage (~> 2.0)
81
+ rubinius-debugger (~> 2.0)
82
+ rubinius-profiler (~> 2.0)
83
+ rubinius-profiler (2.1)
84
+ ruby-progressbar (1.8.1)
85
+ rubysl (2.2.0)
50
86
  rubysl-abbrev (~> 2.0)
51
87
  rubysl-base64 (~> 2.0)
52
88
  rubysl-benchmark (~> 2.0)
@@ -131,6 +167,7 @@ GEM
131
167
  rubysl-tmpdir (~> 2.0)
132
168
  rubysl-tsort (~> 2.0)
133
169
  rubysl-un (~> 2.0)
170
+ rubysl-unicode_normalize (~> 2.0)
134
171
  rubysl-uri (~> 2.0)
135
172
  rubysl-weakref (~> 2.0)
136
173
  rubysl-webrick (~> 2.0)
@@ -142,17 +179,17 @@ GEM
142
179
  rubysl-benchmark (2.0.1)
143
180
  rubysl-bigdecimal (2.0.2)
144
181
  rubysl-cgi (2.0.1)
145
- rubysl-cgi-session (2.0.1)
182
+ rubysl-cgi-session (2.1.0)
146
183
  rubysl-cmath (2.0.0)
147
184
  rubysl-complex (2.0.0)
148
185
  rubysl-continuation (2.0.0)
149
- rubysl-coverage (2.0.3)
186
+ rubysl-coverage (2.1)
150
187
  rubysl-csv (2.0.2)
151
188
  rubysl-english (~> 2.0)
152
189
  rubysl-curses (2.0.1)
153
- rubysl-date (2.0.8)
190
+ rubysl-date (2.0.9)
154
191
  rubysl-delegate (2.0.1)
155
- rubysl-digest (2.0.3)
192
+ rubysl-digest (2.0.8)
156
193
  rubysl-drb (2.0.1)
157
194
  rubysl-e2mmap (2.0.0)
158
195
  rubysl-english (2.0.0)
@@ -175,8 +212,7 @@ GEM
175
212
  rubysl-io-nonblock (2.0.0)
176
213
  rubysl-io-wait (2.0.0)
177
214
  rubysl-ipaddr (2.0.0)
178
- rubysl-irb (2.1.0)
179
- rb-readline (~> 0.5)
215
+ rubysl-irb (2.1.1)
180
216
  rubysl-e2mmap (~> 2.0)
181
217
  rubysl-mathn (~> 2.0)
182
218
  rubysl-thread (~> 2.0)
@@ -184,7 +220,7 @@ GEM
184
220
  rubysl-mathn (2.0.0)
185
221
  rubysl-matrix (2.1.0)
186
222
  rubysl-e2mmap (~> 2.0)
187
- rubysl-mkmf (2.0.1)
223
+ rubysl-mkmf (2.1)
188
224
  rubysl-fileutils (~> 2.0)
189
225
  rubysl-shellwords (~> 2.0)
190
226
  rubysl-monitor (2.0.0)
@@ -203,19 +239,19 @@ GEM
203
239
  rubysl-observer (2.0.0)
204
240
  rubysl-open-uri (2.0.0)
205
241
  rubysl-open3 (2.0.0)
206
- rubysl-openssl (2.2.1)
242
+ rubysl-openssl (2.8.0)
207
243
  rubysl-optparse (2.0.1)
208
244
  rubysl-shellwords (~> 2.0)
209
- rubysl-ostruct (2.0.4)
210
- rubysl-pathname (2.1.0)
245
+ rubysl-ostruct (2.1.0)
246
+ rubysl-pathname (2.3)
211
247
  rubysl-prettyprint (2.0.3)
212
248
  rubysl-prime (2.0.1)
213
249
  rubysl-profile (2.0.0)
214
- rubysl-profiler (2.0.1)
250
+ rubysl-profiler (2.1)
215
251
  rubysl-pstore (2.0.0)
216
252
  rubysl-pty (2.0.3)
217
253
  rubysl-rational (2.0.1)
218
- rubysl-resolv (2.1.0)
254
+ rubysl-resolv (2.1.2)
219
255
  rubysl-rexml (2.0.4)
220
256
  rubysl-rinda (2.0.1)
221
257
  rubysl-rss (2.0.0)
@@ -224,14 +260,15 @@ GEM
224
260
  rubysl-set (2.0.1)
225
261
  rubysl-shellwords (2.0.0)
226
262
  rubysl-singleton (2.0.0)
227
- rubysl-socket (2.0.1)
228
- rubysl-stringio (2.0.0)
263
+ rubysl-socket (2.1.2)
264
+ rubysl-fcntl (~> 2.0)
265
+ rubysl-stringio (2.1.0)
229
266
  rubysl-strscan (2.0.0)
230
267
  rubysl-sync (2.0.0)
231
268
  rubysl-syslog (2.1.0)
232
269
  ffi2-generators (~> 0.1)
233
270
  rubysl-tempfile (2.0.1)
234
- rubysl-thread (2.0.2)
271
+ rubysl-thread (2.0.3)
235
272
  rubysl-thwait (2.0.0)
236
273
  rubysl-time (2.0.3)
237
274
  rubysl-timeout (2.0.0)
@@ -240,6 +277,7 @@ GEM
240
277
  rubysl-un (2.0.0)
241
278
  rubysl-fileutils (~> 2.0)
242
279
  rubysl-optparse (~> 2.0)
280
+ rubysl-unicode_normalize (2.0)
243
281
  rubysl-uri (2.0.0)
244
282
  rubysl-weakref (2.0.0)
245
283
  rubysl-webrick (2.0.0)
@@ -247,22 +285,34 @@ GEM
247
285
  rubysl-yaml (2.1.0)
248
286
  rubysl-zlib (2.0.1)
249
287
  slop (3.6.0)
250
- sqlite3 (1.3.10)
251
- thread_safe (0.3.4)
288
+ spoon (0.0.4)
289
+ ffi
290
+ sqlite3 (1.3.11)
291
+ thread_safe (0.3.5)
292
+ thread_safe (0.3.5-java)
252
293
  tzinfo (1.2.2)
253
294
  thread_safe (~> 0.1)
254
295
 
255
296
  PLATFORMS
297
+ java
256
298
  ruby
257
299
 
258
300
  DEPENDENCIES
259
- database_cleaner (~> 1.4.0)
301
+ activerecord-jdbcmysql-adapter!
302
+ activerecord-jdbcpostgresql-adapter!
303
+ activerecord-jdbcsqlite3-adapter!
304
+ database_cleaner
260
305
  globalize!
261
306
  minitest
262
307
  minitest-reporters
308
+ mysql2
309
+ pg
263
310
  pry
264
- pry-nav
265
311
  rake
266
312
  rdoc
313
+ rubinius-developer_tools
267
314
  rubysl (~> 2.0)
268
315
  sqlite3
316
+
317
+ BUNDLED WITH
318
+ 1.13.4
@@ -9,6 +9,8 @@ You can chat with us using Gitter:
9
9
  Globalize builds on the [I18n API in Ruby on Rails](http://guides.rubyonrails.org/i18n.html)
10
10
  to add model translations to ActiveRecord models.
11
11
 
12
+ In other words, a way to translate actual user-generated content, for example; a single blog post with multiple translations.
13
+
12
14
  ## Requirements
13
15
 
14
16
  * ActiveRecord >= 4.2.0 (see below for installation with ActiveRecord 3.x)
@@ -28,6 +30,15 @@ When using bundler put this in your Gemfile:
28
30
  gem 'globalize', '~> 5.0.0'
29
31
  ```
30
32
 
33
+ You have to use branch **master** to work with Rails 5.
34
+
35
+ Put in your Gemfile
36
+
37
+ ```ruby
38
+ gem 'globalize', git: 'https://github.com/globalize/globalize'
39
+ gem 'activemodel-serializers-xml'
40
+ ```
41
+
31
42
  To use the version of globalize for ActiveRecord 4.0 or 4.1, specify:
32
43
 
33
44
  ```ruby
@@ -80,19 +91,24 @@ and `drop_translation_table!` inside the `change` instance method.
80
91
 
81
92
  ### Creating translation tables
82
93
 
83
- ***Do not use the `change` method, use `up` and `down`!***
94
+ Also note that before you can create a translation table, you have to define the translated attributes via `translates` in your model as shown above.
84
95
 
85
96
  ```ruby
86
97
  class CreatePosts < ActiveRecord::Migration
87
- def up
98
+ def change
88
99
  create_table :posts do |t|
89
100
  t.timestamps
90
101
  end
91
- Post.create_translation_table! :title => :string, :text => :text
92
- end
93
- def down
94
- drop_table :posts
95
- Post.drop_translation_table!
102
+
103
+ reversible do |dir|
104
+ dir.up do
105
+ Post.create_translation_table! :title => :string, :text => :text
106
+ end
107
+
108
+ dir.down do
109
+ Post.drop_translation_table!
110
+ end
111
+ end
96
112
  end
97
113
  end
98
114
  ```
@@ -101,16 +117,21 @@ Also, you can pass options for specific columns. Here’s an example:
101
117
 
102
118
  ```ruby
103
119
  class CreatePosts < ActiveRecord::Migration
104
- def up
120
+ def change
105
121
  create_table :posts do |t|
106
122
  t.timestamps
107
123
  end
108
- Post.create_translation_table! :title => :string,
109
- :text => {:type => :text, :null => false, :default => 'abc'}
110
- end
111
- def down
112
- drop_table :posts
113
- Post.drop_translation_table!
124
+
125
+ reversible do |dir|
126
+ dir.up do
127
+ Post.create_translation_table! :title => :string,
128
+ :text => {:type => :text, :null => false, :default => 'abc'}
129
+ end
130
+
131
+ dir.down do
132
+ Post.drop_translation_table!
133
+ end
134
+ end
114
135
  end
115
136
  end
116
137
  ```
@@ -130,6 +151,31 @@ model's attributes as they were before the translation was applied. Here's an
130
151
  example (which assumes you already have a model called `Post` and its table
131
152
  exists):
132
153
 
154
+ ```ruby
155
+ class TranslatePosts < ActiveRecord::Migration
156
+ def change
157
+ reversible do |dir|
158
+ dir.up do
159
+ Post.create_translation_table!({
160
+ :title => :string,
161
+ :text => :text
162
+ }, {
163
+ :migrate_data => true
164
+ })
165
+ end
166
+
167
+ dir.down do
168
+ Post.drop_translation_table! :migrate_data => true
169
+ end
170
+ end
171
+ end
172
+ end
173
+ ```
174
+
175
+ NOTE: Make sure you drop the translated columns from the parent table after all your data is safely migrated.
176
+
177
+ To automatically remove the translated columns from the parent table after the data migration, please use option `remove_source_columns`.
178
+
133
179
  ```ruby
134
180
  class TranslatePosts < ActiveRecord::Migration
135
181
  def self.up
@@ -137,7 +183,8 @@ class TranslatePosts < ActiveRecord::Migration
137
183
  :title => :string,
138
184
  :text => :text
139
185
  }, {
140
- :migrate_data => true
186
+ :migrate_data => true,
187
+ :remove_source_columns => true
141
188
  })
142
189
  end
143
190
 
@@ -147,7 +194,19 @@ class TranslatePosts < ActiveRecord::Migration
147
194
  end
148
195
  ```
149
196
 
150
- NOTE: Make sure you drop the translated columns from the parent table after all your data is safely migrated.
197
+
198
+ In order to use a specific locale for migrated data, you can use `I18n.with_locale`:
199
+
200
+ ```ruby
201
+ I18n.with_locale(:bo) do
202
+ Post.create_translation_table!({
203
+ :title => :string,
204
+ :text => :text
205
+ }, {
206
+ :migrate_data => true
207
+ })
208
+ end
209
+ ```
151
210
 
152
211
  ## Adding additional fields to the translation table
153
212
 
@@ -155,12 +214,16 @@ In order to add a new field to an existing translation table, you can use `add_t
155
214
 
156
215
  ```ruby
157
216
  class AddAuthorToPost < ActiveRecord::Migration
158
- def up
159
- Post.add_translation_fields! author: :text
160
- end
161
-
162
- def down
163
- remove_column :post_translations, :author
217
+ def change
218
+ reversible do |dir|
219
+ dir.up do
220
+ Post.add_translation_fields! author: :text
221
+ end
222
+
223
+ dir.down do
224
+ remove_column :post_translations, :author
225
+ end
226
+ end
164
227
  end
165
228
  end
166
229
  ```
@@ -176,6 +239,18 @@ Because globalize uses the `:locale` key to specify the locale during
176
239
  mass-assignment, you should avoid having a `locale` attribute on the parent
177
240
  model.
178
241
 
242
+ ## Known Issues
243
+
244
+ If you're getting the `ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "column_name" violates not-null constraint` error, the only known way to deal with it as of now is to remove not-null constraint for the globalized columns:
245
+
246
+ ```ruby
247
+ class RemoveNullConstraintsFromResources < ActiveRecord::Migration
248
+ def change
249
+ change_column_null :resources, :column_name, true
250
+ end
251
+ end
252
+ ```
253
+
179
254
  ## Versioning with Globalize
180
255
 
181
256
  See the [globalize-versioning](https://github.com/globalize/globalize-versioning) gem.
@@ -327,23 +402,29 @@ def cache_key
327
402
  end
328
403
  ```
329
404
 
405
+ ## Thread-safety
406
+
407
+ Globalize uses [request_store](https://github.com/steveklabnik/request_store) gem to clean up thread-global variable after every request.
408
+ RequestStore includes a Railtie that will configure everything properly for Rails 3+ apps.
409
+
410
+ If you're not using Rails, you may need to consult a RequestStore's [README](https://github.com/steveklabnik/request_store#no-rails-no-problem) to configure it.
411
+
412
+ ## Tutorials and articles
413
+ * [Go Global with Rails and I18n](http://www.sitepoint.com/go-global-rails-i18n/) - introductory article about i18n in Rails (Ilya Bodrov)
414
+
330
415
  ## Official Globalize extensions
331
416
 
332
- * [globalize-accessors](https://github.com/globalize/globalize-accessors) - Replacement for [easy_globalize_3_accessors](https://github.com/paneq/easy_globalize3_accessors) compatible with Globalize 3.x and 4.x.
333
- * [globalize-versioning](https://github.com/globalize/globalize-versioning) - Versioning support for using Globalize with [`paper_trail`](https://github.com/airblade/paper_trail).
417
+ * [globalize-accessors](https://github.com/globalize/globalize-accessors) - generator of accessor methods for models. *(e.g. title_en, title_cz)*
418
+ * [globalize-versioning](https://github.com/globalize/globalize-versioning) - versioning support for using Globalize with [`paper_trail`](https://github.com/airblade/paper_trail). (compatible with Globalize 3.x and 4.x)
334
419
 
335
- ## Alternative Solutions
420
+ ## Alternative solutions
336
421
 
337
- * [Veger's fork](http://github.com/veger/globalize2) - uses default AR schema for the default locale, delegates to the translations table for other locales only
338
- * [TranslatableColumns](http://github.com/iain/translatable_columns) - have multiple languages of the same attribute in a model (Iain Hecker)
339
- * [Traco](https://github.com/barsoom/traco) - A newer take on using multiple columns in the same model (Barsoom)
340
- * [localized_record](http://github.com/glennpow/localized_record) - allows records to have localized attributes without any modifications to the database (Glenn Powell)
341
- * [model_translations](http://github.com/janne/model_translations) - Minimal implementation of Globalize2 style model translations (Jan Andersson)
342
- * [hstore_translate](http://github.com/robworley/hstore_translate) - Rails I18n library for ActiveRecord model/data translation using PostgreSQL's hstore datatype (Rob Worley)
422
+ * [Traco](https://github.com/barsoom/traco) - use multiple columns in the same model (Barsoom)
423
+ * [Mobility](https://github.com/shioyama/mobility) - pluggable translation framework supporting many strategies, including translatable columns, translation tables and hstore/jsonb (Chris Salzberg)
424
+ * [hstore_translate](https://github.com/cfabianski/hstore_translate) - use PostgreSQL's hstore datatype to store translations, instead of separate translation tables (Cédric Fabianski)
425
+ * [json_translate](https://github.com/cfabianski/json_translate) - use PostgreSQL's json/jsonb datatype to store translations, instead of separate translation tables (Cédric Fabianski)
426
+ * [Trasto](https://github.com/yabawock/trasto) - store translations directly in the model in a Postgres Hstore column
343
427
 
344
428
  ## Related solutions
345
429
 
346
- * [globalize2_versioning](http://github.com/joshmh/globalize2_versioning) - acts_as_versioned style versioning for globalize2 (Joshua Harvey)
347
- * [i18n_multi_locales_validations](http://github.com/ZenCocoon/i18n_multi_locales_validations) - multi-locales attributes validations to validates attributes from globalize2 translations models (Sébastien Grosjean)
348
- * [migrate_from_globalize1](http://gist.github.com/120867) - migrate model translations from Globalize1 to globalize2 (Tomasz Stachewicz)
349
- * [batch_translations](http://github.com/rilla/batch_translations) - allow saving multiple globalize2 translations in the same request (Jose Alvarez Rilla)
430
+ * [friendly_id-globalize](https://github.com/norman/friendly_id-globalize) - lets you use Globalize to translate slugs (Norman Clarke)