easy_translatable 0.1.6 → 0.1.7

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: 4bf467e734ff69ca81e47edf7fcbb917b59e84a8
4
- data.tar.gz: 76bc1946777bc451dce2f741e519ea9ef338266d
3
+ metadata.gz: 92e6ca6a6f1919678d40513de824e5f10866940d
4
+ data.tar.gz: 20b38ee4b7dada0802f53fab8077ebc1079e60fc
5
5
  SHA512:
6
- metadata.gz: f5c47b00241ee66bf92180d7811fadab41dcf66bf58d117b109a2e6a918488f47c7d7b0fcccba0f1eddc9eae7f3907af518d0ae0cb686bbea70405f6ad27d73c
7
- data.tar.gz: 54cb446e8f2ea1a018014bec4db87b377874e3fb2f64577efb491e14e2924bd714d5d12aa21cb6cdde95e8b2e3c581df41dac431c52456312a30342d167c755f
6
+ metadata.gz: 901ae4e1c1cfd1aa47b14e544f785e4dc595777e2aaf4aba0ecf871584cb7756071867bc08428bda2f6200ab137faa4208a7e42a842f3ca0d08203d16116a6fb
7
+ data.tar.gz: f779b1fc88db5887f82ad102429f5c50279f368826776fa4a4262a62d35a7d774fd31bf0fce64fd6ebdd4511fe5e7cce9c71442d69969f7f0b8e604b3830fea2
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- # Translatable [![Gem Version](https://badge.fury.io/rb/easy_translatable.png)](http://badge.fury.io/rb/easy_translatable) [![Code Climate](https://codeclimate.com/github/popox/translatable.png)](https://codeclimate.com/github/popox/translatable)
2
-
1
+ # Translatable [![Gem Version](https://badge.fury.io/rb/easy_translatable.png)](http://badge.fury.io/rb/easy_translatable) [![Code Climate](https://codeclimate.com/github/popox/translatable.png)](https://codeclimate.com/github/popox/translatable) [![Build Status](https://travis-ci.org/popox/translatable.png)](https://travis-ci.org/popox/translatable) [![Coverage Status](https://coveralls.io/repos/popox/translatable/badge.png)](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
- # only Rails > 3.1.x compatibility
12
- base.class_eval %{
13
- def attributes=(attributes, *args)
14
- with_given_locale(attributes) { super }
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
- end
18
-
19
-
20
- #def write_attribute(name, value, options = {})
21
- # if translated?(name)
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 => nil}.merge(options)
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
- #after_create :save_translations!
73
- #after_update :save_translations!
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
 
@@ -1,3 +1,3 @@
1
1
  module Translatable
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
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
- set_locale(locale)
20
- result = yield(locale)
21
- set_locale(previous_locale)
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.6
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