easy_translatable 0.1.6 → 0.1.7
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 +4 -4
- data/README.md +1 -2
- data/lib/translatable/active_record/adapter.rb +19 -0
- data/lib/translatable/active_record/instance_methods.rb +101 -32
- data/lib/translatable/active_record/macro.rb +2 -4
- data/lib/translatable/version.rb +1 -1
- data/lib/translatable.rb +7 -4
- metadata +105 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92e6ca6a6f1919678d40513de824e5f10866940d
|
4
|
+
data.tar.gz: 20b38ee4b7dada0802f53fab8077ebc1079e60fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 901ae4e1c1cfd1aa47b14e544f785e4dc595777e2aaf4aba0ecf871584cb7756071867bc08428bda2f6200ab137faa4208a7e42a842f3ca0d08203d16116a6fb
|
7
|
+
data.tar.gz: f779b1fc88db5887f82ad102429f5c50279f368826776fa4a4262a62d35a7d774fd31bf0fce64fd6ebdd4511fe5e7cce9c71442d69969f7f0b8e604b3830fea2
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
# Translatable [](http://badge.fury.io/rb/easy_translatable) [](https://codeclimate.com/github/popox/translatable)
|
2
|
-
|
1
|
+
# Translatable [](http://badge.fury.io/rb/easy_translatable) [](https://codeclimate.com/github/popox/translatable) [](https://travis-ci.org/popox/translatable) [](https://coveralls.io/r/popox/translatable)
|
3
2
|
## Requirements
|
4
3
|
|
5
4
|
* ActiveRecord 3.2
|
@@ -31,6 +31,25 @@ module Translatable
|
|
31
31
|
stash.write(locale, name, value)
|
32
32
|
end
|
33
33
|
|
34
|
+
def save_translations!
|
35
|
+
stash.reject {|locale, attrs| attrs.empty?}.each do |locale, attrs|
|
36
|
+
translations = record.translations_by_locale[locale]
|
37
|
+
attrs.each { |name, value|
|
38
|
+
translation = translations && translations[name] ||
|
39
|
+
record.translations.build(:locale => locale.to_s, :scope => record.class.table_name, :key => name)
|
40
|
+
translation['record_id'] = record.id
|
41
|
+
translation['value'] = value
|
42
|
+
translation.save!
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
reset
|
47
|
+
end
|
48
|
+
|
49
|
+
def reset
|
50
|
+
stash.clear
|
51
|
+
end
|
52
|
+
|
34
53
|
protected
|
35
54
|
|
36
55
|
def fetch_attribute(locale, name, value = nil)
|
@@ -8,50 +8,85 @@ module Translatable
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.included(base)
|
11
|
-
#
|
12
|
-
base.
|
13
|
-
|
14
|
-
|
11
|
+
# Maintian Rails 3.0.x compatibility ..
|
12
|
+
if base.method_defined?(:assign_attributes)
|
13
|
+
base.class_eval %{
|
14
|
+
def assign_attributes(attributes, options = {})
|
15
|
+
with_given_locale(attributes) { super }
|
16
|
+
end
|
17
|
+
}
|
18
|
+
else
|
19
|
+
base.class_eval %{
|
20
|
+
def attributes=(attributes, *args)
|
21
|
+
with_given_locale(attributes) { super }
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_attributes!(attributes, *args)
|
25
|
+
with_given_locale(attributes) { super }
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_attributes(attributes, *args)
|
29
|
+
with_given_locale(attributes) { super }
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def write_attribute(name, value, options = {})
|
37
|
+
if translated?(name) && translate?
|
38
|
+
options = {:locale => Translatable.locale}.merge(options)
|
39
|
+
|
40
|
+
# Dirty tracking, paraphrased from
|
41
|
+
# ActiveRecord::AttributeMethods::Dirty#write_attribute.
|
42
|
+
name_str = name.to_s
|
43
|
+
if attribute_changed?(name_str)
|
44
|
+
# If there's already a change, delete it if this undoes the change.
|
45
|
+
old = changed_attributes[name_str]
|
46
|
+
changed_attributes.delete(name_str) if value == old
|
47
|
+
else
|
48
|
+
# If there's not a change yet, record it.
|
49
|
+
serialized_value = read_attribute(name, options) if self.serialized_attributes.has_key?(name)
|
50
|
+
old = translatable.fetch(options[:locale], name, serialized_value)
|
51
|
+
old = old.clone if old.duplicable?
|
52
|
+
changed_attributes[name_str] = old if value != old
|
15
53
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# options = {:locale => Translatable.locale}.merge(options)
|
23
|
-
#
|
24
|
-
# # Dirty tracking, paraphrased from
|
25
|
-
# # ActiveRecord::AttributeMethods::Dirty#write_attribute.
|
26
|
-
# name_str = name.to_s
|
27
|
-
# if attribute_changed?(name_str)
|
28
|
-
# # If there's already a change, delete it if this undoes the change.
|
29
|
-
# old = changed_attributes[name_str]
|
30
|
-
# changed_attributes.delete(name_str) if value == old
|
31
|
-
# else
|
32
|
-
# # If there's not a change yet, record it.
|
33
|
-
# old = globalize.fetch(options[:locale], name)
|
34
|
-
# old = old.clone if old.duplicable?
|
35
|
-
# changed_attributes[name_str] = old if value != old
|
36
|
-
# end
|
37
|
-
#
|
38
|
-
# translatable.write(options[:locale], name, value)
|
39
|
-
# else
|
40
|
-
# super(name, value)
|
41
|
-
# end
|
42
|
-
#end
|
54
|
+
|
55
|
+
translatable.write(options[:locale], name, value)
|
56
|
+
else
|
57
|
+
super(name, value)
|
58
|
+
end
|
59
|
+
end
|
43
60
|
|
44
61
|
def translate
|
45
62
|
@translate_me = true
|
46
63
|
self
|
47
64
|
end
|
48
65
|
|
66
|
+
def end_translate
|
67
|
+
@translate_me = nil
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
def reload(options = nil)
|
72
|
+
@translate_me = false
|
73
|
+
translation_caches.clear
|
74
|
+
translated_attribute_names.each { |name| @attributes.delete(name.to_s) }
|
75
|
+
translatable.reset
|
76
|
+
super(options)
|
77
|
+
end
|
78
|
+
|
79
|
+
def save(*)
|
80
|
+
@translate_me = false
|
81
|
+
super
|
82
|
+
end
|
83
|
+
|
49
84
|
def translate?
|
50
85
|
!@translate_me.nil? && @translate_me
|
51
86
|
end
|
52
87
|
|
53
88
|
def read_attribute(name, options = {})
|
54
|
-
options = {:translated => true, :locale =>
|
89
|
+
options = {:translated => true, :locale => Translatable.locale}.merge(options)
|
55
90
|
if translated?(name) and options[:translated]
|
56
91
|
serialized_value = super(name) if self.serialized_attributes.has_key?(name)
|
57
92
|
if translate? && (value = translatable.fetch(options[:locale] || Translatable.locale, name, serialized_value))
|
@@ -68,6 +103,22 @@ module Translatable
|
|
68
103
|
self.class.translated?(name)
|
69
104
|
end
|
70
105
|
|
106
|
+
def translated_attributes
|
107
|
+
translated_attribute_names.inject({}) do |attributes, name|
|
108
|
+
attributes.merge(name.to_s => translation.send(name))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# This method is basically the method built into Rails
|
113
|
+
# but we have to pass {:translated => false}
|
114
|
+
def untranslated_attributes
|
115
|
+
attrs = {}
|
116
|
+
attribute_names.each do |name|
|
117
|
+
attrs[name] = read_attribute(name, {:translated => false})
|
118
|
+
end
|
119
|
+
attrs
|
120
|
+
end
|
121
|
+
|
71
122
|
def translation_for(locale, name, build_if_missing = false)
|
72
123
|
unless translation_caches["#{locale}_#{name}"]
|
73
124
|
# Fetch translations from database as those in the translation collection may be incomplete
|
@@ -129,11 +180,29 @@ module Translatable
|
|
129
180
|
attributes.try(:delete, :locale)
|
130
181
|
|
131
182
|
if locale
|
183
|
+
already = translate?
|
184
|
+
translate unless translate?
|
132
185
|
Translatable.with_locale(locale, &block)
|
186
|
+
end_translate unless already
|
133
187
|
else
|
134
188
|
yield
|
135
189
|
end
|
136
190
|
end
|
191
|
+
|
192
|
+
def translations_by_locale(&block)
|
193
|
+
translations.each_with_object(HashWithIndifferentAccess.new) do |t, hash|
|
194
|
+
hash[t.locale] ||= HashWithIndifferentAccess.new
|
195
|
+
hash[t.locale][t.key] = block_given? ? block.call(t) : t
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
protected
|
200
|
+
|
201
|
+
def save_translations!
|
202
|
+
translatable.save_translations!
|
203
|
+
translation_caches.clear
|
204
|
+
end
|
205
|
+
|
137
206
|
end
|
138
207
|
end
|
139
208
|
end
|
@@ -69,10 +69,8 @@ module Translatable
|
|
69
69
|
:extend => HasManyExtensions,
|
70
70
|
:autosave => false
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
#translation_class.instance_eval %{ attr_accessible :lang }
|
72
|
+
after_create :save_translations!
|
73
|
+
after_update :save_translations!
|
76
74
|
end
|
77
75
|
end
|
78
76
|
|
data/lib/translatable/version.rb
CHANGED
data/lib/translatable.rb
CHANGED
@@ -7,7 +7,7 @@ module Translatable
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
def locale
|
10
|
-
I18n.locale
|
10
|
+
read_locale || I18n.locale
|
11
11
|
end
|
12
12
|
|
13
13
|
def locale=(locale)
|
@@ -16,9 +16,12 @@ module Translatable
|
|
16
16
|
|
17
17
|
def with_locale(locale, &block)
|
18
18
|
previous_locale = read_locale
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
begin
|
20
|
+
set_locale(locale)
|
21
|
+
result = yield(locale)
|
22
|
+
ensure
|
23
|
+
set_locale(previous_locale)
|
24
|
+
end
|
22
25
|
result
|
23
26
|
end
|
24
27
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_translatable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Bonaud
|
@@ -25,6 +25,96 @@ dependencies:
|
|
25
25
|
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '3.2'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: database_cleaner
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.6.0
|
35
|
+
- - '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.6.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.6.0
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.6.0
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: mocha
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pathname_local
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: test_declarative
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: friendly_id
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: sqlite3
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
28
118
|
- !ruby/object:Gem::Dependency
|
29
119
|
name: rake
|
30
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,6 +129,20 @@ dependencies:
|
|
39
129
|
- - ~>
|
40
130
|
- !ruby/object:Gem::Version
|
41
131
|
version: '0'
|
132
|
+
- !ruby/object:Gem::Dependency
|
133
|
+
name: rdoc
|
134
|
+
requirement: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
type: :development
|
140
|
+
prerelease: false
|
141
|
+
version_requirements: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
42
146
|
- !ruby/object:Gem::Dependency
|
43
147
|
name: coveralls
|
44
148
|
requirement: !ruby/object:Gem::Requirement
|