globalize 5.0.1 → 5.1.0.beta1

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: 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)