localeapp 0.6.9 → 0.6.10

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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # master
2
+
3
+ # Version 0.6.10
4
+
5
+ * Don't send the :default param with a MissingTranslation when not in
6
+ the default locale.
7
+ * Cache MissingTranslations so that they're not sent multiple times.
8
+
9
+ # Version 0.6.9
10
+
11
+ * Make rack a dependency as we actually use it (Thanks @martoche)
12
+
1
13
  # Version 0.6.8
2
14
 
3
15
  * Don't load any yaml that may contain insecure content
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubyforge
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  platform :jruby do
data/Gemfile.i18n_037 CHANGED
@@ -1,4 +1,4 @@
1
- source :rubyforge
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  gem 'i18n', '0.3.7'
data/Gemfile.i18n_050 CHANGED
@@ -1,4 +1,4 @@
1
- source :rubyforge
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  gem 'i18n', '0.5.0'
data/Gemfile.i18n_060 CHANGED
@@ -1,4 +1,4 @@
1
- source :rubyforge
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  gem 'i18n', '~> 0.6.0'
data/README.md CHANGED
@@ -79,8 +79,9 @@ existing translations do:
79
79
  This will queue importing the file. The projects pages on localeapp.com will
80
80
  automatically refresh so you can see the import progress.
81
81
 
82
- If you've more than one locale to import you can zip up the yml files. Both
83
- localeapp.com and the localeapp import command accept zip files.
82
+ If you've more than one locale to import you can import all files in a directory :
83
+
84
+ localeapp push config/locales/
84
85
 
85
86
  ## Default Rails Translations
86
87
 
@@ -153,6 +154,13 @@ can be disabled in a similar way to polling and sending:
153
154
 
154
155
  config.reloading_environments = []
155
156
 
157
+ ### Caching
158
+
159
+ To prevent localeapp from sending translations every time they are missing,
160
+ add this config setting:
161
+
162
+ config.cache_missing_translations = true
163
+
156
164
  ## Inviting other developers and translators
157
165
 
158
166
  You can invite other developers and translators via localeapp.com. Developers
@@ -74,6 +74,10 @@ module Localeapp
74
74
  # default: true
75
75
  attr_accessor :raise_on_insecure_yaml
76
76
 
77
+ # Enable or disable the missing translation cache
78
+ # default: false
79
+ attr_accessor :cache_missing_translations
80
+
77
81
  def initialize
78
82
  defaults.each do |setting, value|
79
83
  send("#{setting}=", value)
@@ -4,10 +4,11 @@ module I18n::Backend::Base
4
4
  def default(locale, object, subject, options = {})
5
5
  result = default_without_handler(locale, object, subject, options)
6
6
  case subject # case is what i18n gem uses here so doing the same
7
- when Array
7
+ when Array, Symbol
8
8
  # Do nothing, we only send missing translations with text defaults
9
9
  else
10
- Localeapp.missing_translations.add(locale, object, subject, options)
10
+ value = locale == I18n.default_locale ? subject : nil
11
+ Localeapp.missing_translations.add(locale, object, value, options)
11
12
  end
12
13
  return result
13
14
  end
@@ -2,6 +2,12 @@ module Localeapp
2
2
  MissingTranslationRecord = Struct.new(:key, :locale, :description, :options)
3
3
 
4
4
  class MissingTranslations
5
+ @cached_keys = []
6
+
7
+ class << self
8
+ attr_accessor :cached_keys
9
+ end
10
+
5
11
  def initialize
6
12
  @translations = Hash.new { |h, k| h[k] = {} }
7
13
  end
@@ -15,23 +21,33 @@ module Localeapp
15
21
  @translations[locale]
16
22
  end
17
23
 
18
- # This method will get cleverer so we don't resend keys we've
19
- # already sent, or send multiple times for the same locale etc.
20
- # For now it's pretty dumb
21
24
  def to_send
22
25
  data = []
23
26
  # need the sort to make specs work under 1.8
24
27
  @translations.sort { |a, b| a.to_s <=> b.to_s }.each do |locale, records|
25
28
  records.each do |key, record|
26
- missing_data = {}
27
- missing_data[:key] = key
28
- missing_data[:locale] = locale
29
+ next if cached?(key)
30
+ cache(key)
31
+ missing_data = {:key => key, :locale => locale, :options => record.options}
29
32
  missing_data[:description] = record.description if record.description
30
- missing_data[:options] = record.options
31
33
  data << missing_data
32
34
  end
33
35
  end
34
36
  data
35
37
  end
38
+
39
+ private
40
+
41
+ def cached_keys
42
+ self.class.cached_keys
43
+ end
44
+
45
+ def cached?(key)
46
+ Localeapp.configuration.cache_missing_translations && cached_keys.include?(key)
47
+ end
48
+
49
+ def cache(key)
50
+ cached_keys << key if Localeapp.configuration.cache_missing_translations
51
+ end
36
52
  end
37
53
  end
@@ -43,7 +43,7 @@ module Localeapp
43
43
  private
44
44
 
45
45
  def generate_yaml(translations)
46
- if defined? Psych
46
+ if defined?(Psych) && defined?(Psych::VERSION)
47
47
  Psych.dump(translations, :line_width => -1)[4..-1].sub(/\.\.\.\n$/, '')
48
48
  else
49
49
  translations.ya2yaml[5..-1]
@@ -1,3 +1,3 @@
1
1
  module Localeapp
2
- VERSION = "0.6.9"
2
+ VERSION = "0.6.10"
3
3
  end
data/localeapp.gemspec CHANGED
@@ -22,11 +22,11 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency('i18n')
23
23
  s.add_dependency('json')
24
24
  s.add_dependency('rest-client')
25
+ s.add_dependency('rack')
25
26
  s.add_dependency('ya2yaml')
26
27
  s.add_dependency('gli')
27
28
 
28
29
  s.add_development_dependency('rake')
29
- s.add_development_dependency('rack')
30
30
  s.add_development_dependency('rspec', '2.11.0')
31
31
  s.add_development_dependency('yard', '0.6.7')
32
32
  s.add_development_dependency('RedCloth', '4.2.9')
@@ -7,26 +7,46 @@ end
7
7
  describe I18n::Backend::Base, '#default' do
8
8
  let(:klass) { Klass.new }
9
9
 
10
- it "adds translations to missing translations to send to Locale" do
10
+ def allow_sending
11
11
  with_configuration(:sending_environments => ['my_env'], :environment_name => 'my_env' ) do
12
- Localeapp.missing_translations.should_receive(:add).with(:en, 'foo', 'bar', :baz => 'bam')
13
- klass.default(:en, 'foo', 'bar', :baz => 'bam')
12
+ yield
14
13
  end
15
14
  end
16
15
 
17
- describe "when subject is an array" do
18
- it "doesn't send anything" do
19
- with_configuration(:sending_environments => ['my_env'], :environment_name => 'my_env' ) do
20
- Localeapp.missing_translations.should_not_receive(:add).with(:en, 'foo', 'not missing', :baz => 'bam')
16
+ describe "when subject is a String" do
17
+ it "adds translations to missing translations to send to Locale" do
18
+ allow_sending do
19
+ Localeapp.missing_translations.should_receive(:add).with(:en, 'foo', 'bar', :baz => 'bam')
20
+ klass.default(:en, 'foo', 'bar', :baz => 'bam')
21
+ end
22
+ end
23
+
24
+ it "strips the subject when the translation is not in the default locale" do
25
+ allow_sending do
26
+ Localeapp.missing_translations.should_receive(:add).with(:fr, 'foo', nil, :baz => 'bam')
27
+ klass.default(:fr, 'foo', 'bar', :baz => 'bam')
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "when subject is an Array" do
33
+ it "doesn't send anything to Locale" do
34
+ allow_sending do
35
+ Localeapp.missing_translations.should_not_receive(:add)
21
36
  I18n.stub!(:translate) do |subject, _|
22
- if subject == :not_missing
23
- "not missing"
24
- else
25
- nil
26
- end
37
+ subject == :not_missing ? "not missing" : nil
27
38
  end
28
39
  klass.default(:en, 'foo', [:missing, :not_missing], :baz => 'bam')
29
40
  end
30
41
  end
31
42
  end
43
+
44
+ describe "when subject is a Symbol" do
45
+ it "doesn't send anything to Locale" do
46
+ allow_sending do
47
+ Localeapp.missing_translations.should_not_receive(:add)
48
+ klass.default(:en, 'foo', :other_key, :baz => 'bam')
49
+ end
50
+ end
51
+ end
32
52
  end
@@ -19,6 +19,17 @@ describe Localeapp::ExceptionHandler, '#call(exception, locale, key, options)' d
19
19
  I18n.t(['foo', 'bar'])
20
20
  end
21
21
 
22
+ it "handles when the default is a Symbol that can be resolved" do
23
+ I18n.backend.store_translations(:en, {:default_symbol_test => 'is resolved'})
24
+ Localeapp.missing_translations.should_not_receive(:add)
25
+ I18n.t(:foo, :default => :default_symbol_test).should == 'is resolved'
26
+ end
27
+
28
+ it "handles when the default is a Symbol that can't be resolved" do
29
+ Localeapp.missing_translations.should_receive(:add).with(:en, :foo, nil, {:default => :bar})
30
+ I18n.t(:foo, :default => :bar)
31
+ end
32
+
22
33
  it "handles missing translation exception" do
23
34
  expect {
24
35
  exception = Localeapp::I18nMissingTranslationException.new(:en, 'foo', {})
@@ -28,4 +28,28 @@ describe Localeapp::MissingTranslations, "#to_send" do
28
28
  to_send[1][:description].should == 'baz'
29
29
  to_send[1][:options].should == {}
30
30
  end
31
+
32
+ it "doesn't send the same key twice when cache_missing_translations is true" do
33
+ with_configuration(:cache_missing_translations => true) do
34
+ translation_a = Localeapp::MissingTranslations.new
35
+ translation_a.add(:es, 'foobybar')
36
+ translation_a.to_send.size.should == 1
37
+
38
+ translation_b = Localeapp::MissingTranslations.new
39
+ translation_b.add(:en, 'foobybar')
40
+ translation_a.to_send.size.should == 0
41
+ end
42
+ end
43
+
44
+ it "can send the same key twice when cache_missing_translations is false" do
45
+ with_configuration(:cache_missing_translations => false) do
46
+ translation_a = Localeapp::MissingTranslations.new
47
+ translation_a.add(:es, 'foobybar')
48
+ translation_a.to_send.size.should == 1
49
+
50
+ translation_b = Localeapp::MissingTranslations.new
51
+ translation_b.add(:en, 'foobybar')
52
+ translation_a.to_send.size.should == 1
53
+ end
54
+ end
31
55
  end
@@ -98,7 +98,7 @@ describe Localeapp::Updater, ".update(data)" do
98
98
  File.exist?(File.join(@yml_dir, 'ja.yml')).should be_false
99
99
  end
100
100
 
101
- if defined?(Psych) && Psych::VERSION >= "1.1.0" && !RUBY_PLATFORM == 'jruby'
101
+ if defined?(Psych) && defined?(Psych::VERSION) && Psych::VERSION >= "1.1.0" && !RUBY_PLATFORM == 'jruby'
102
102
  it "doesn't try to wrap long lines in the output" do
103
103
  do_update({
104
104
  'translations' => {
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: localeapp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 9
10
- version: 0.6.9
9
+ - 10
10
+ version: 0.6.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christopher Dell
@@ -16,10 +16,12 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-01-15 00:00:00 Z
19
+ date: 2013-06-25 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: i18n
23
+ type: :runtime
24
+ prerelease: false
23
25
  version_requirements: &id001 !ruby/object:Gem::Requirement
24
26
  none: false
25
27
  requirements:
@@ -29,11 +31,11 @@ dependencies:
29
31
  segments:
30
32
  - 0
31
33
  version: "0"
32
- type: :runtime
33
34
  requirement: *id001
34
- prerelease: false
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: json
37
+ type: :runtime
38
+ prerelease: false
37
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
38
40
  none: false
39
41
  requirements:
@@ -43,11 +45,11 @@ dependencies:
43
45
  segments:
44
46
  - 0
45
47
  version: "0"
46
- type: :runtime
47
48
  requirement: *id002
48
- prerelease: false
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rest-client
51
+ type: :runtime
52
+ prerelease: false
51
53
  version_requirements: &id003 !ruby/object:Gem::Requirement
52
54
  none: false
53
55
  requirements:
@@ -57,11 +59,11 @@ dependencies:
57
59
  segments:
58
60
  - 0
59
61
  version: "0"
60
- type: :runtime
61
62
  requirement: *id003
62
- prerelease: false
63
63
  - !ruby/object:Gem::Dependency
64
- name: ya2yaml
64
+ name: rack
65
+ type: :runtime
66
+ prerelease: false
65
67
  version_requirements: &id004 !ruby/object:Gem::Requirement
66
68
  none: false
67
69
  requirements:
@@ -71,11 +73,11 @@ dependencies:
71
73
  segments:
72
74
  - 0
73
75
  version: "0"
74
- type: :runtime
75
76
  requirement: *id004
76
- prerelease: false
77
77
  - !ruby/object:Gem::Dependency
78
- name: gli
78
+ name: ya2yaml
79
+ type: :runtime
80
+ prerelease: false
79
81
  version_requirements: &id005 !ruby/object:Gem::Requirement
80
82
  none: false
81
83
  requirements:
@@ -85,11 +87,11 @@ dependencies:
85
87
  segments:
86
88
  - 0
87
89
  version: "0"
88
- type: :runtime
89
90
  requirement: *id005
90
- prerelease: false
91
91
  - !ruby/object:Gem::Dependency
92
- name: rake
92
+ name: gli
93
+ type: :runtime
94
+ prerelease: false
93
95
  version_requirements: &id006 !ruby/object:Gem::Requirement
94
96
  none: false
95
97
  requirements:
@@ -99,11 +101,11 @@ dependencies:
99
101
  segments:
100
102
  - 0
101
103
  version: "0"
102
- type: :development
103
104
  requirement: *id006
104
- prerelease: false
105
105
  - !ruby/object:Gem::Dependency
106
- name: rack
106
+ name: rake
107
+ type: :development
108
+ prerelease: false
107
109
  version_requirements: &id007 !ruby/object:Gem::Requirement
108
110
  none: false
109
111
  requirements:
@@ -113,11 +115,11 @@ dependencies:
113
115
  segments:
114
116
  - 0
115
117
  version: "0"
116
- type: :development
117
118
  requirement: *id007
118
- prerelease: false
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: rspec
121
+ type: :development
122
+ prerelease: false
121
123
  version_requirements: &id008 !ruby/object:Gem::Requirement
122
124
  none: false
123
125
  requirements:
@@ -129,11 +131,11 @@ dependencies:
129
131
  - 11
130
132
  - 0
131
133
  version: 2.11.0
132
- type: :development
133
134
  requirement: *id008
134
- prerelease: false
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: yard
137
+ type: :development
138
+ prerelease: false
137
139
  version_requirements: &id009 !ruby/object:Gem::Requirement
138
140
  none: false
139
141
  requirements:
@@ -145,11 +147,11 @@ dependencies:
145
147
  - 6
146
148
  - 7
147
149
  version: 0.6.7
148
- type: :development
149
150
  requirement: *id009
150
- prerelease: false
151
151
  - !ruby/object:Gem::Dependency
152
152
  name: RedCloth
153
+ type: :development
154
+ prerelease: false
153
155
  version_requirements: &id010 !ruby/object:Gem::Requirement
154
156
  none: false
155
157
  requirements:
@@ -161,11 +163,11 @@ dependencies:
161
163
  - 2
162
164
  - 9
163
165
  version: 4.2.9
164
- type: :development
165
166
  requirement: *id010
166
- prerelease: false
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: aruba
169
+ type: :development
170
+ prerelease: false
169
171
  version_requirements: &id011 !ruby/object:Gem::Requirement
170
172
  none: false
171
173
  requirements:
@@ -177,11 +179,11 @@ dependencies:
177
179
  - 5
178
180
  - 1
179
181
  version: 0.5.1
180
- type: :development
181
182
  requirement: *id011
182
- prerelease: false
183
183
  - !ruby/object:Gem::Dependency
184
184
  name: fakeweb
185
+ type: :development
186
+ prerelease: false
185
187
  version_requirements: &id012 !ruby/object:Gem::Requirement
186
188
  none: false
187
189
  requirements:
@@ -193,9 +195,7 @@ dependencies:
193
195
  - 3
194
196
  - 0
195
197
  version: 1.3.0
196
- type: :development
197
198
  requirement: *id012
198
- prerelease: false
199
199
  description: Synchronizes i18n translation keys and content with localeapp.com so you don't have to manage translations by hand.
200
200
  email:
201
201
  - chris@tigrish.com
@@ -320,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
320
  requirements: []
321
321
 
322
322
  rubyforge_project: localeapp
323
- rubygems_version: 1.8.24
323
+ rubygems_version: 1.8.6
324
324
  signing_key:
325
325
  specification_version: 3
326
326
  summary: Easy i18n translation management with localeapp.com