i18n-tasks 0.2.0 → 0.2.1

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: b4c2dfceb8ce78b38a271f5b2ee5afda329cd15d
4
- data.tar.gz: 89936d161a3e2b826164658bb64b7816dbda0a6a
3
+ metadata.gz: 191973eaa9d7a29ea1b149eef1ce61c2d79f8c4c
4
+ data.tar.gz: 8cdd8e2e5408577ce0abf3b7d78bb90c43834bd2
5
5
  SHA512:
6
- metadata.gz: ed3cec3d3aadfac2f0d30b8b707cb8b5f46dfd1e063c283546be4222644757906c736aeceb4860c5a31319a6a799acf7056d444acda15d99d94ca4389e30c3f0
7
- data.tar.gz: 2781e4bf20a94badc077233c21e9d4fa0fe9a2dda74e76ff05429e4833b13bc265868528fb8d9d9c8fce07a32161ca70d7acac5c2b00981ee640dd6e061dbbb8
6
+ metadata.gz: acefe02918495e2091ac389e985491eb14542f7b54f94e8301d1aa0333e814b69ddc361d796f1a898084ddd48ab1393650cc34102e71c16a1f8917d1e2d2d741
7
+ data.tar.gz: 53c49f375246c3dc38e7c63b9a8ed27e99cb42fc2f709557cdf63040d6d4635b7ad7cff2c165887adbba042ef44e853dc6b08110af63f947eff890dea0d67603
data/.travis.yml CHANGED
@@ -3,4 +3,7 @@ rvm:
3
3
  - 2.0.0
4
4
  - 1.9.3
5
5
  - jruby
6
- - rbx
6
+ - rbx-19mode
7
+ matrix:
8
+ allow_failures:
9
+ - rvm: rbx-19mode
data/README.md CHANGED
@@ -3,23 +3,50 @@
3
3
 
4
4
  Rails I18n tasks to find missing / unused translations and more. Works with slim / coffee / haml etc.
5
5
 
6
- ![i18n-screenshot](https://raw.github.com/glebm/i18n-tasks/master/doc/img/i18n-tasks.png "i18n-tasks output screenshot")
6
+ ![i18n-screenshot](https://raw.github.com/glebm/i18n-tasks/master/doc/img/i18n-tasks.gif "i18n-tasks output screenshot")
7
7
 
8
8
  ## Usage
9
9
 
10
10
  Use `rake -T i18n` to get the list of tasks with descriptions. These are [the tasks](/lib/tasks/i18n-tasks.rake) available:
11
11
 
12
- Rake Task | Summary
13
- :---------------------------------------------- |:------------------------------------------------------------------
14
- i18n:missing | Show missing translations.
15
- i18n:unused | Show unused translations.
16
- i18n:normalize | Normalize translation data: sort by name and file.
17
- i18n:fill:add_missing *[value = key.humanize]* | Add missing `key: value` to base locale.
18
- i18n:fill:with_base *[locales = all - base]* | Add missing `key: base value` to each non-base locale.
19
- i18n:fill:with_google *[locales = all - base]* | Add missing `key: Google Translated value` to each non-base locale.
20
- i18n:fill:with_blanks *[locales = all]* | Add `key: ''` for missing keys to each locale.
21
-
22
- The `i18n:unused` task will detect pattern translations and not report them, e.g.:
12
+ There are reports for missing and unused translations:
13
+ ```bash
14
+ rake i18n:missing
15
+ rake i18n:unused
16
+ ```
17
+
18
+ To add the keys that are not in the base locale data but detected in the source do:
19
+ ```bash
20
+ # add missing keys to the base locale data (I18n.default_locale)
21
+ # values set to key.humanize
22
+ rake i18n:add_missing
23
+ # or set all values to the task argument
24
+ rake i18n:add_missing[OhNoesMissing]
25
+ ```
26
+
27
+ Prefill empty translations using Google Translate:
28
+ ```bash
29
+ rake i18n:fill:google_translate
30
+ # this task and the ones below can also accept specific locales:
31
+ rake i18n:fill:google_translate[es+de]
32
+ ```
33
+ Prefill using values from the base locale - `I8n.default_locale`:
34
+ ```bash
35
+ rake i18n:fill:base_value
36
+ ```
37
+ Add just blank yaml keys - `key: ''` for all missing and untranslated keys:
38
+ ```bash
39
+ rake i18n:fill:blanks
40
+ ```
41
+
42
+ i18n-tasks sorts the keys and writes them to their respective files:
43
+ ```bash
44
+ # this happens automatically on any i18n:fill:* task
45
+ rake i18n:normalize
46
+ ```
47
+
48
+
49
+ `i18n:unused` will detect pattern translations and not report them, e.g.:
23
50
 
24
51
  ```ruby
25
52
  t 'category.' + category.key # 'category.arts_and_crafts' considered used
@@ -36,7 +63,7 @@ For more examples see [the tests](/spec/i18n_tasks_spec.rb).
36
63
  Simply add to Gemfile:
37
64
 
38
65
  ```ruby
39
- gem 'i18n-tasks', '~> 0.2.0'
66
+ gem 'i18n-tasks', '~> 0.2.1'
40
67
  ```
41
68
 
42
69
  ## Configuration
Binary file
@@ -1,6 +1,8 @@
1
1
  require 'find'
2
2
 
3
3
  module I18n::Tasks::SourceKeys
4
+ DEFAULT_PATTERN = /\bt[( ]\s*(:?".+?"|:?'.+?'|:\w+)/
5
+
4
6
  # find all keys in the source (relative keys are returned in absolutized)
5
7
  # @return [Array<String>]
6
8
  def find_source_keys
@@ -27,8 +29,6 @@ module I18n::Tasks::SourceKeys
27
29
  find_source_keys.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }.map { |k| k.split(/\.?#/)[0].presence }.compact
28
30
  end
29
31
 
30
- protected
31
-
32
32
  # grep config, also from config/i18n-tasks.yml
33
33
  # @return [Hash{String => String,Hash,Array}]
34
34
  def search_config
@@ -42,7 +42,7 @@ module I18n::Tasks::SourceKeys
42
42
  conf[:paths] = %w(app/) if conf[:paths].blank?
43
43
  conf[:include] = Array(conf[:include]) if conf[:include].present?
44
44
  conf[:exclude] = Array(conf[:exclude])
45
- conf[:pattern] ||= conf[:pattern].present? ? Regexp.new(conf[:pattern]) : /\bt[( ]\s*(.)((?<=").+?(?=")|(?<=').+?(?=')|(?<=:)\w+\b)/
45
+ conf[:pattern] ||= conf[:pattern].present? ? Regexp.new(conf[:pattern]) : DEFAULT_PATTERN
46
46
  end
47
47
  end
48
48
  end
@@ -66,10 +66,9 @@ module I18n::Tasks::SourceKeys
66
66
  keys = []
67
67
  File.open(path, 'rb') do |f|
68
68
  while (line = f.gets)
69
- line.scan(search_config[:pattern]) do |t, key|
70
- if key.start_with? '.'
71
- key = absolutize_key(key, path)
72
- end
69
+ line.scan(search_config[:pattern]) do |match|
70
+ key = parse_key(match)
71
+ key = absolutize_key(key, path) if key.start_with? '.'
73
72
  if key =~ /^[\w.\#{}]+$/
74
73
  keys << key
75
74
  end
@@ -78,4 +77,12 @@ module I18n::Tasks::SourceKeys
78
77
  end
79
78
  keys
80
79
  end
80
+
81
+ private
82
+ def parse_key(match)
83
+ key = match[0]
84
+ key.slice!(0) if ':' == key[0]
85
+ key = key[1..-2] if %w(' ").include?(key[0])
86
+ key
87
+ end
81
88
  end
@@ -1,5 +1,5 @@
1
1
  module I18n
2
2
  module Tasks
3
- VERSION = '0.2.0'
3
+ VERSION = '0.2.1'
4
4
  end
5
5
  end
@@ -18,21 +18,22 @@ namespace :i18n do
18
18
  normalize_store!
19
19
  end
20
20
 
21
+ desc 'add <key: placeholder || key.humanize> to the base locale'
22
+ task :add_missing, [:placeholder] => 'i18n:setup' do |t, args|
23
+ normalize_store!
24
+ i18n_tasks.fill_blanks!(base_locale) { |keys|
25
+ keys.map { |key|
26
+ args[:placeholder] || key.split('.').last.to_s.humanize
27
+ }
28
+ }
29
+ end
30
+
31
+
21
32
  desc 'fill translations with values'
22
33
  namespace :fill do
23
34
 
24
- desc 'add <key: placeholder || key.humanize> to the base locale'
25
- task :add_missing, [:placeholder] => 'i18n:setup' do |t, args|
26
- normalize_store!
27
- i18n_tasks.fill_blanks!(base_locale) { |keys|
28
- keys.map { |key|
29
- args[:placeholder] || key.split('.').last.to_s.humanize
30
- }
31
- }
32
- end
33
-
34
35
  desc 'add <key: ""> to each locale'
35
- task :with_blanks, [:locales] => 'i18n:setup' do |t, args|
36
+ task :blanks, [:locales] => 'i18n:setup' do |t, args|
36
37
  normalize_store!
37
38
  [base_locale, *non_base_locales].each do |locale|
38
39
  fill_blanks!(locale) { |blank_keys| blank_keys.map { '' } }
@@ -40,7 +41,7 @@ namespace :i18n do
40
41
  end
41
42
 
42
43
  desc 'add <key: Google Translated value> to each non-base locale, uses env GOOGLE_TRANSLATE_API_KEY'
43
- task :with_google, [:locales] => 'i18n:setup' do |t, args|
44
+ task :google_translate, [:locales] => 'i18n:setup' do |t, args|
44
45
  normalize_store!
45
46
  non_base_locales(args).each do |locale|
46
47
  fill_blanks!(locale) { |blank_keys|
@@ -50,7 +51,7 @@ namespace :i18n do
50
51
  end
51
52
 
52
53
  desc 'add <key: base value> to each non-base locale'
53
- task :with_base, [:locales] => 'i18n:setup' do |t, args|
54
+ task :base_value, [:locales] => 'i18n:setup' do |t, args|
54
55
  normalize_store!
55
56
  non_base_locales(args).each do |locale|
56
57
  fill_blanks!(locale) { |blank_keys| blank_keys.map { |k| t(k) } }
@@ -11,3 +11,4 @@ p = t 'numeric.a'
11
11
  p = t 'plural.a', count: 2
12
12
  p = t 'devise.a'
13
13
  p = t :missing_symbol_key
14
+ p #{t :"missing_symbol.key_two"} #{t :'missing_symbol.key_three'}
@@ -6,10 +6,11 @@ describe 'rake i18n' do
6
6
  it 'detects missing or identical' do
7
7
  TestCodebase.capture_stderr do
8
8
  TestCodebase.rake_result('i18n:missing').should be_i18n_keys %w(
9
- en.used_but_missing.a en.missing_symbol_key en.relative.index.missing
9
+ en.used_but_missing.a en.relative.index.missing
10
10
  es.missing_in_es.a es.blank_in_es.a es.same_in_es.a
11
+ en.missing_symbol_key en.missing_symbol.key_two en.missing_symbol.key_three
11
12
  )
12
- end.should =~ /Missing keys and translations \(6\)/
13
+ end.should =~ /Missing keys and translations \(8\)/
13
14
  end
14
15
  end
15
16
 
@@ -32,9 +33,15 @@ describe 'rake i18n' do
32
33
  end
33
34
 
34
35
  describe 'fill:' do
35
- it 'with_base' do
36
+ it 'add missing' do
37
+ TestCodebase.in_test_app_dir { YAML.load_file('config/locales/en.yml')['en']['used_but_missing'].should be_nil }
38
+ TestCodebase.rake_result('i18n:add_missing')
39
+ TestCodebase.in_test_app_dir { YAML.load_file('config/locales/en.yml')['en']['used_but_missing']['a'].should == 'A' }
40
+ end
41
+
42
+ it 'base_value' do
36
43
  TestCodebase.in_test_app_dir { YAML.load_file('config/locales/es.yml')['es']['missing_in_es'].should be_nil }
37
- TestCodebase.rake_result('i18n:fill:with_base')
44
+ TestCodebase.rake_result('i18n:fill:base_value')
38
45
  TestCodebase.in_test_app_dir {
39
46
  YAML.load_file('config/locales/es.yml')['es']['missing_in_es']['a'].should == 'EN_TEXT'
40
47
  YAML.load_file('config/locales/devise.en.yml')['en']['devise']['a'].should == 'EN_TEXT'
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Source keys' do
4
+ let!(:task) { I18n::Tasks::BaseTask.new }
5
+ describe 'pattern' do
6
+ let!(:pattern) { task.search_config[:pattern] }
7
+
8
+ ['t "a.b"', "t 'a.b'", 't("a.b")', "t('a.b')",
9
+ "t('a.b', :arg => val)", "t('a.b', arg: val)",
10
+ "t :a_b", "t :'a.b'", 't :"a.b"', "t(:ab)", "t(:'a.b')", 't(:"a.b")'].each do |s|
11
+ it "matches #{s}" do
12
+ pattern.should match s
13
+ end
14
+ end
15
+
16
+ ["t \"a.b'", "t a.b"].each do |s|
17
+ it "does not match #{s}" do
18
+ pattern.should_not match s
19
+ end
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
@@ -136,7 +136,7 @@ files:
136
136
  - LICENSE.txt
137
137
  - README.md
138
138
  - Rakefile
139
- - doc/img/i18n-tasks.png
139
+ - doc/img/i18n-tasks.gif
140
140
  - i18n-tasks.gemspec
141
141
  - lib/i18n/tasks.rb
142
142
  - lib/i18n/tasks/base_task.rb
@@ -163,6 +163,7 @@ files:
163
163
  - spec/fixtures/config/i18n-tasks.yml
164
164
  - spec/i18n_tasks_spec.rb
165
165
  - spec/readme_spec.rb
166
+ - spec/source_keys_spec.rb
166
167
  - spec/spec_helper.rb
167
168
  - spec/support/fixtures.rb
168
169
  - spec/support/i18n_tasks_output_matcher.rb
@@ -200,6 +201,7 @@ test_files:
200
201
  - spec/fixtures/config/i18n-tasks.yml
201
202
  - spec/i18n_tasks_spec.rb
202
203
  - spec/readme_spec.rb
204
+ - spec/source_keys_spec.rb
203
205
  - spec/spec_helper.rb
204
206
  - spec/support/fixtures.rb
205
207
  - spec/support/i18n_tasks_output_matcher.rb
Binary file