i18n-tasks 0.7.2 → 0.7.3

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: 1da0127b4f5d5823790e0b3e95609d72bc5d89ce
4
- data.tar.gz: 4b3444adf44532e8c4cfa4906658f23f95f385c3
3
+ metadata.gz: ace77283059f5ec38fb4cf6eb85d51fa72ee175f
4
+ data.tar.gz: 2a9dc502ce2169a6c0e31a100346ff8ce8602c95
5
5
  SHA512:
6
- metadata.gz: 7d914cabb6ace1ccf7f1eebf8dd68cd885a8929713edc095aebb7073e771cf06bb0ddcce78e1ff6df51562bc68ee11d8e6b1110f3120ad6d3093f985ae44fcb2
7
- data.tar.gz: 2b8add28adae0c70a297e253dd104bc5877f95a68c4b5d16038f99d313b088b6268da15ca6e052e099be69308cfd2b758428ba276e64d94fdfb6e8cad6fbe2af
6
+ metadata.gz: fbb5e12fdd92b788e8f88fd755195bc7d6040e22221b7d7087d16e5d011bfae89109a6fe425fbcdab4d264955ddcd5c2877f17e66ebd663396f48aa3faeabead
7
+ data.tar.gz: bcf27a97b3fee099d9c1826f69e892060518e0fcc4d84ae89f64a4f638300e9faa4b6504396ddfe558153a1f689ecb21f6b683c581789354772dc38da275c662
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.7.3
2
+
3
+ * New task `translate-tree`
4
+ * Bugs fixed: [nil values and Google Translate](https://github.com/glebm/i18n-tasks/issues/85), [config file encoding issue](#82).
5
+
1
6
  ## 0.7.2
2
7
 
3
8
  * i18n-tasks now analyses itself! `internal_locale` setting has been added, that controls i18n-tasks reporting language.
data/README.md CHANGED
@@ -25,7 +25,7 @@ i18n-tasks can be used with any project using [i18n][i18n-gem] (default in Rails
25
25
  Add to Gemfile:
26
26
 
27
27
  ```ruby
28
- gem 'i18n-tasks', '~> 0.7.2'
28
+ gem 'i18n-tasks', '~> 0.7.3'
29
29
  ```
30
30
 
31
31
  Copy default [configuration file](#configuration) (optional):
@@ -346,6 +346,14 @@ ignore:
346
346
  ### Google Translate
347
347
 
348
348
  `i18n-tasks translate-missing` requires a Google Translate API key, get it at [Google API Console](https://code.google.com/apis/console).
349
+
350
+ Where this key is depends on your Google API console:
351
+
352
+ * Old console: API Access -> Simple API Access -> Key for server apps.
353
+ * New console: Project -> APIS & AUTH -> Credentials -> Public API access -> Key for server applications.
354
+
355
+ In both cases, you may need to create the key if it doesn't exist.
356
+
349
357
  Put the key in `GOOGLE_TRANSLATE_API_KEY` environment variable or in the config file.
350
358
 
351
359
  ```yaml
@@ -6,7 +6,7 @@ base_locale: en
6
6
  # locales: [en, es, fr]
7
7
 
8
8
  ## i18n-tasks report locale, default: en, available: en, ru
9
- internal_locale: ru
9
+ internal_locale: en
10
10
 
11
11
  # Read and write locale data
12
12
  data:
@@ -57,6 +57,7 @@ en:
57
57
  add_missing: add missing keys to locale data
58
58
  remove_unused: remove unused keys
59
59
  eq_base: show translations equal to base value
60
+ tree_translate: Google Translate a tree to root locales
60
61
  tree_merge: merge trees
61
62
  tree_filter: filter tree by key pattern
62
63
  tree_rename_key: rename tree node
@@ -75,8 +76,8 @@ en:
75
76
  data_format: 'Data format: %{valid_text}. %{default_text}.'
76
77
  keys: List of keys separated by commas (,), spaces, or newlines.
77
78
  locales_filter: 'Comma-separated list of locale(s) to process. Default: all. Special: base.'
78
- locales_to_translate_from: 'Locale to translate from (default: base)'
79
79
  locale: 'Locale. Default: base'
80
+ locale_to_translate_from: 'Locale to translate from (default: base)'
80
81
  confirm: Confirm automatically
81
82
  nostdin: Do not read from stdin
82
83
  strict: Do not infer dynamic key usage such as `t("category.\#{category.name}")`
@@ -67,6 +67,7 @@ ru:
67
67
  gem_path: "показать путь к ruby gem"
68
68
  irb: "начать REPL сессию в контексте i18n-tasks"
69
69
  xlsx_report: "сохранить недостающие и неиспользуемые переводы в Excel-файл"
70
+ tree_translate: "Перевести дерево при помощи Google Translate на язык корневых узлов"
70
71
  args:
71
72
  default_text: "По умолчанию: %{value}"
72
73
  default_all: "По умолчанию: все"
@@ -76,7 +77,7 @@ ru:
76
77
  keys: "Список ключей, разделенных запятыми (,), пробелами или символами новой строки."
77
78
  locales_filter: "Список языков для обработки, разделенный запятыми (,). По умолчанию: все.
78
79
  Специальное значение: base."
79
- locales_to_translate_from: "Язык с которого переводить (по умолчанию: base)"
80
+ locale_to_translate_from: "Язык, с которого переводить (по умолчанию: base)"
80
81
  locale: "Язык. По умолчанию: base"
81
82
  confirm: "Подтвердить автоматом"
82
83
  nostdin: "Не читать дерево из стандартного ввода"
@@ -22,16 +22,11 @@ module I18n::Tasks
22
22
  cmd :translate_missing,
23
23
  args: '[locale ...]',
24
24
  desc: proc { I18n.t('i18n_tasks.cmd.desc.translate_missing') },
25
- opt: [cmd_opt(:locales),
26
- cmd_opt(:locale).merge(short: :f, long: :from=, desc: proc {
27
- I18n.t('i18n_tasks.cmd.args.desc.locales_to_translate_from') }),
28
- cmd_opt(:out_format).except(:short)]
25
+ opt: cmd_opts(:locales, :locale_to_translate_from) << cmd_opt(:out_format).except(:short)
29
26
 
30
27
  def translate_missing(opt = {})
31
- from = opt[:from]
32
- translated = (opt[:locales] - [from]).inject i18n.empty_forest do |result, locale|
33
- result.merge! i18n.google_translate_forest i18n.missing_tree(locale, from), from, locale
34
- end
28
+ missing = i18n.missing_diff_forest opt[:locales], opt[:from]
29
+ translated = i18n.google_translate_forest missing, opt[:from]
35
30
  i18n.data.merge! translated
36
31
  log_stderr I18n.t('i18n_tasks.translate_missing.translated', count: translated.leaves.count)
37
32
  print_forest translated, opt
@@ -4,6 +4,18 @@ module I18n::Tasks
4
4
  module Tree
5
5
  include Command::Collection
6
6
 
7
+ cmd :tree_translate,
8
+ args: '[tree]',
9
+ desc: proc { I18n.t('i18n_tasks.cmd.desc.tree_translate') },
10
+ opt: cmd_opts(:locale_to_translate_from) << cmd_opt(:data_format).except(:short)
11
+
12
+ def tree_translate(opts = {})
13
+ forest = opt_forest_arg_or_stdin!(opts)
14
+ from = opts[:from]
15
+ translated = i18n.google_translate_forest(forest, from)
16
+ print_forest translated, opts
17
+ end
18
+
7
19
  cmd :tree_merge,
8
20
  args: '[tree ...]',
9
21
  desc: proc { I18n.t('i18n_tasks.cmd.desc.tree_merge') },
@@ -7,7 +7,7 @@ module I18n::Tasks
7
7
  cmd_opt :locales, {
8
8
  short: :l,
9
9
  long: :locales=,
10
- desc: I18n.t('i18n_tasks.cmd.args.desc.locales_filter'),
10
+ desc: proc { I18n.t('i18n_tasks.cmd.args.desc.locales_filter') },
11
11
  conf: {as: Array, delimiter: /\s*[+:,]\s*/, default: 'all', argument: true, optional: false},
12
12
  parse: :parse_locales
13
13
  }
@@ -15,11 +15,16 @@ module I18n::Tasks
15
15
  cmd_opt :locale, {
16
16
  short: :l,
17
17
  long: :locale=,
18
- desc: I18n.t('i18n_tasks.cmd.args.desc.locale'),
18
+ desc: proc { I18n.t('i18n_tasks.cmd.args.desc.locale') },
19
19
  conf: {default: 'base', argument: true, optional: false},
20
20
  parse: :parse_locale
21
21
  }
22
22
 
23
+ cmd_opt :locale_to_translate_from, cmd_opt(:locale).merge(
24
+ short: :f,
25
+ long: :from=,
26
+ desc: proc { I18n.t('i18n_tasks.cmd.args.desc.locale_to_translate_from') })
27
+
23
28
  def parse_locales(opt, key = :locales)
24
29
  argv = Array(opt[:arguments]) + Array(opt[key])
25
30
  locales = if argv == ['all'] || argv == 'all' || argv.blank?
@@ -4,10 +4,12 @@ require 'i18n/tasks/html_keys'
4
4
 
5
5
  module I18n::Tasks
6
6
  module GoogleTranslation
7
- def google_translate_forest(forest, from, to)
8
- list = forest.key_values(root: true)
9
- values = google_translate_list(list, to: to, from: from).map(&:last)
10
- Data::Tree::Siblings.from_flat_pairs list.map(&:first).zip(values)
7
+
8
+ def google_translate_forest(forest, from)
9
+ forest.inject empty_forest do |result, root|
10
+ translated = google_translate_list(root.key_values(root: true), to: root.key, from: from)
11
+ result.merge! Data::Tree::Siblings.from_flat_pairs(translated)
12
+ end
11
13
  end
12
14
 
13
15
  # @param [Array] list of [key, value] pairs
@@ -42,7 +44,7 @@ Get the key at https://code.google.com/apis/console.')
42
44
  end
43
45
 
44
46
  def to_values(list)
45
- list.map { |l| dump_value l[1] }.flatten
47
+ list.map { |l| dump_value l[1] }.flatten.compact
46
48
  end
47
49
 
48
50
  def from_values(list, translated_values)
@@ -52,21 +54,28 @@ Get the key at https://code.google.com/apis/console.')
52
54
  end
53
55
 
54
56
  def dump_value(value)
55
- if value.is_a?(Array)
56
- # dump recursively
57
- value.map { |v| dump_value v }
58
- else
59
- replace_interpolations value
57
+ case value
58
+ when Array
59
+ # dump recursively
60
+ value.map { |v| dump_value v }
61
+ when String
62
+ replace_interpolations value
63
+ else
64
+ value
60
65
  end
61
66
  end
62
67
 
63
68
  def parse_value(untranslated, each_translated)
64
- if untranslated.is_a?(Array)
65
- # implode array
66
- untranslated.map { |from| parse_value(from, each_translated) }
67
- else
68
- value = each_translated.next
69
- restore_interpolations untranslated, value
69
+ case untranslated
70
+ when Array
71
+ # implode array
72
+ untranslated.map { |from| parse_value(from, each_translated) }
73
+ when String
74
+ restore_interpolations untranslated, each_translated.next
75
+ when NilClass
76
+ nil
77
+ else
78
+ each_translated.next
70
79
  end
71
80
  end
72
81
 
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
  module I18n
3
3
  module Tasks
4
- VERSION = '0.7.2'
4
+ VERSION = '0.7.3'
5
5
  end
6
6
  end
@@ -6,12 +6,12 @@ describe 'Google Translation' do
6
6
  include I18n::Tasks::GoogleTranslation
7
7
 
8
8
  tests = [
9
- text_test = ['key', "Hello - %{user} O'neill!", "Hola - %{user} O'neill!"],
10
- html_test = ['html-key.html', "Hello - <b>%{user} O'neill</b>", "Hola - <b>%{user} O'neill</b>"],
11
- array_test = ['array-key', ['Hello.', 'Goodbye.'], ['Hola.', 'Adiós.']]
9
+ nil_value_test = ['nil-value-key', nil, nil],
10
+ text_test = ['key', "Hello - %{user} O'neill!", "Hola - %{user} O'neill!"],
11
+ html_test = ['html-key.html', "Hello - <b>%{user} O'neill</b>", "Hola - <b>%{user} O'neill</b>"],
12
+ array_test = ['array-key', ['Hello.', nil, '', 'Goodbye.'], ['Hola.', nil, '', 'Adiós.']]
12
13
  ]
13
14
 
14
-
15
15
  if ENV['GOOGLE_TRANSLATE_API_KEY']
16
16
  describe 'real world test' do
17
17
  delegate :i18n_cmd, :i18n_task, :in_test_app_dir, to: :TestCodebase
@@ -41,13 +41,14 @@ describe 'Google Translation' do
41
41
  in_test_app_dir do
42
42
  task.data[:en] = build_tree('en' => {
43
43
  'common' => {
44
- 'a' => 'λ',
45
- 'hello' => text_test[1],
46
- 'hello_html' => html_test[1],
47
- 'array_key' => array_test[1]
44
+ 'a' => 'λ',
45
+ 'hello' => text_test[1],
46
+ 'hello_html' => html_test[1],
47
+ 'array_key' => array_test[1],
48
+ 'nil-value-key' => nil_value_test[1]
48
49
  }
49
50
  })
50
- task.data[:es] = build_tree('es' =>{
51
+ task.data[:es] = build_tree('es' => {
51
52
  'common' => {
52
53
  'a' => 'λ',
53
54
  }
@@ -57,6 +58,7 @@ describe 'Google Translation' do
57
58
  expect(task.t('common.hello', 'es')).to eq(text_test[2])
58
59
  expect(task.t('common.hello_html', 'es')).to eq(html_test[2])
59
60
  expect(task.t('common.array_key', 'es')).to eq(array_test[2])
61
+ expect(task.t('nil-value-key', 'es')).to eq(nil_value_test[2])
60
62
  expect(task.t('common.a', 'es')).to eq('λ')
61
63
  end
62
64
  end
@@ -1,4 +1,4 @@
1
- # i18n-tasks finds and manages missing and unused translations https://github.com/glebm/i18n-tasks
1
+ # i18n-tasks finds and manages missing and unused translations https://github.com/glebm/i18n-tasks
2
2
 
3
3
  base_locale: en
4
4
  ## i18n-tasks detects locales automatically from the existing locale files
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-01 00:00:00.000000000 Z
11
+ date: 2014-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubis
@@ -331,7 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
331
331
  version: '0'
332
332
  requirements: []
333
333
  rubyforge_project:
334
- rubygems_version: 2.2.2
334
+ rubygems_version: 2.4.1
335
335
  signing_key:
336
336
  specification_version: 4
337
337
  summary: Manage localization and translation with the awesome power of static analysis