yaml-translator 0.8.4 → 0.9.0

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: 6c3823177cd2f7fc6b6ac035050c40ee885962c9
4
- data.tar.gz: 127e2ee94b6e7424827ffbe1504a8813d5d6c075
3
+ metadata.gz: da4cda7e0c0b4e1d18d9263bc51e018e660b0902
4
+ data.tar.gz: 66dbc7e06c1561486815e1e0c266cbaf54146057
5
5
  SHA512:
6
- metadata.gz: bf35cb1c0a3c2b55bdf0d30e1c2d6c29108479beccc2400ffcb52373206f96c2a815de35c96e551b9a1eef95501795b83bc1c89f31a91a6989e7dd38f98cb31c
7
- data.tar.gz: 9a610c0172e17f92cfd0eb42290d95fcd6d9d35d561410e053961d54722160157030857d47a3c5a406d851e42b31bbe5c684c76758c1a08dfee828514a1171ad
6
+ metadata.gz: 92b3ccd4969f1df29d8a95b7110e2ecf24d04fb0066b5803e5ace67193a92ad3d6ba99c8992adb4b413c61bb317c6c543efe3016870a808df441de16ff9e2fe2
7
+ data.tar.gz: ac073cf2fb71577ecc7376c5e1a4799c8de9ad37668220543e9f120f02284e01b62ff2bb58cf25daaa697c0cbbfa54cb081293772ed1e71fdf9bd55c13d92392
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yaml-translator (0.8.4)
4
+ yaml-translator (0.9.0)
5
5
  diff-lcs
6
6
  easy_translate
7
7
 
data/README.md CHANGED
@@ -48,6 +48,13 @@ diff_locale = translator.file("/path/to/before/en.yml").diff("/path/to/after/en.
48
48
  diff_locale.to(:ja).save
49
49
  ```
50
50
 
51
+ translate into multiple languages
52
+
53
+ ```ruby
54
+ diff_locale = translator.file("/path/to/before/en.yml").diff("/path/to/after/en.yml")
55
+ diff_locale.all(%w(ja en)).each { |r| r.save }
56
+ ```
57
+
51
58
  ## Run the test
52
59
 
53
60
  bundle install
@@ -1,5 +1,4 @@
1
1
  require 'yaml-translator/version'
2
- require 'yaml-translator/structure'
3
2
  require 'yaml-translator/locale'
4
3
  require 'yaml-translator/context'
5
4
  require 'yaml-translator/key_path'
@@ -3,6 +3,9 @@ require 'easy_translate'
3
3
  module YamlTranslator
4
4
  module Adapters
5
5
  class GoogleTranslateAdapter < BaseAdapter
6
+ # Translate for locale texts
7
+ # @param [Hash] locale texts of translate target
8
+ # @return [Hash] locale texts
6
9
  def translate(values, options={})
7
10
  keys = []
8
11
  texts = []
@@ -1,6 +1,9 @@
1
1
  module YamlTranslator
2
2
  module Adapters
3
3
  class NoopAdapter < BaseAdapter
4
+ # Always return the text before translation
5
+ # @param [Hash] locale texts of translate target
6
+ # @return [Hash] locale texts
4
7
  def translate(values, options={})
5
8
  values
6
9
  end
@@ -4,8 +4,13 @@ module YamlTranslator
4
4
  @locale = locale
5
5
  @translator = translator
6
6
  end
7
- def to(lang)
8
- @translator.translate(@locale, to: lang)
7
+
8
+ def to(target)
9
+ @locale.translate(@translator, to: target)
10
+ end
11
+
12
+ def all(targets)
13
+ targets.map { |target| @locale.translate(@translator, to: target) }
9
14
  end
10
15
  end
11
16
 
@@ -1,37 +1,50 @@
1
1
  require 'yaml'
2
+ require 'ostruct'
2
3
  require 'diff/lcs'
3
4
 
4
5
  module YamlTranslator
5
- class Locale
6
+ class Locale < OpenStruct
7
+ attr_reader :lang
6
8
 
7
- attr_reader :lang, :values
9
+ class << self
10
+ def load(s)
11
+ self.new(YAML.load(s))
12
+ end
8
13
 
9
- def initialize(values, lang)
10
- @lang = lang
11
- @values = values
14
+ def load_file(file)
15
+ load(File.open(file, &:read))
16
+ end
17
+ end
18
+
19
+ def initialize(config)
20
+ super(config)
21
+ @lang = config.keys.first.to_sym # FIXME check support language
12
22
  end
13
23
 
14
24
  def translate(translator, options={})
15
- translator.translate(self, options)
25
+ result = {}
26
+ values = to_h
27
+ translated_values = translator.translate(compact_of(values[@lang]), options)
28
+ result[options[:to]] = tree_of(translated_values)
29
+ Locale.new(result)
16
30
  end
17
31
 
18
- def diff(other)
32
+ def diff(other_locale)
19
33
  before_seq = to_single_key_hash.map { |k, v| "#{k}: #{v}" }
20
- after_seq = other.to_single_key_hash.map { |k, v| "#{k}: #{v}" }
34
+ after_seq = other_locale.to_single_key_hash.map { |k, v| "#{k}: #{v}" }
21
35
  diffs = Diff::LCS.diff(before_seq, after_seq).flatten.map do |operation|
22
36
  type, position, element = *operation
23
37
  next if type == '-'
24
38
  key, text = *element.split(':')
25
39
  [key, text.strip]
26
40
  end
27
- single_key_hash = Hash[diffs.compact]
28
- Locale.new(single_key_hash.to_tree, lang)
41
+ Locale.new(tree_of(Hash[diffs.compact]))
29
42
  end
30
43
 
31
- def merge(locale)
44
+ def merge(other_locale)
32
45
  s = to_single_key_hash
33
- o = locale.to_single_key_hash
34
- Locale.new(s.merge(o).to_tree, lang)
46
+ o = other_locale.to_single_key_hash
47
+ Locale.new(tree_of(s.merge(o)))
35
48
  end
36
49
 
37
50
  def merge_to(locale)
@@ -56,27 +69,55 @@ module YamlTranslator
56
69
  save(dir)
57
70
  end
58
71
 
72
+ # Covert to a flatten hash
59
73
  def to_single_key_hash
60
- values.to_single_key
74
+ compact_of(to_h, KeyPath.new)
61
75
  end
62
76
 
63
77
  def to_s
64
- YAML.dump(values)
78
+ YAML.dump(tree_of(compact_of(to_h)))
65
79
  end
66
80
 
67
- class << self
68
- def load(s)
69
- yaml = YAML.load(s)
70
- lang = yaml.keys.first # FIXME check support language
71
- self.new(yaml, lang)
72
- end
81
+ private
73
82
 
74
- def load_file(file)
75
- load(File.open(file, &:read))
83
+ # Covert to a flatten hash
84
+ def compact_of(values={}, path=KeyPath.new)
85
+ result = {}
86
+ values.each_with_index do |(i, v)|
87
+ path.move_to(i)
88
+ if v.is_a?(Hash)
89
+ result.merge!(compact_of(v, path))
90
+ else
91
+ result[path.to_s] = v
92
+ end
93
+ path.leave
76
94
  end
95
+ result
77
96
  end
78
97
 
79
- private
98
+ # Returning the flattened structure to the tree structure
99
+ #
100
+ # @param [Hash] values flatten Hash
101
+ # @return [Hash] translated hash
102
+ def tree_of(values)
103
+ result = {}
104
+ current = result
105
+ values.each do |k, v|
106
+ keys = k.to_s.split('.')
107
+ last_key = keys.pop
108
+ keys.each do |ks|
109
+ current = if current.key?(ks)
110
+ current[ks]
111
+ else
112
+ current[ks] = {}
113
+ current[ks]
114
+ end
115
+ end
116
+ current[last_key] = v
117
+ current = result
118
+ end
119
+ result
120
+ end
80
121
 
81
122
  def write_file(file_path)
82
123
  File.write(file_path, to_s)
@@ -12,16 +12,10 @@ module YamlTranslator
12
12
 
13
13
  # Translate target
14
14
  #
15
- # @param [Locale] locale of translate target
16
- # @return [Locale] locale
17
- def translate(locale, options={})
18
- translated = @adapter.translate(locale.to_single_key_hash, options)
19
- translated_tree = translated.to_tree
20
-
21
- result = {}
22
- result[options[:to].to_s] = translated_tree[locale.lang]
23
-
24
- Locale.new(result, options[:to])
15
+ # @param [Hash] locale texts of translate target
16
+ # @return [Hash] locale texts
17
+ def translate(locale_texts, options={})
18
+ @adapter.translate(locale_texts, options)
25
19
  end
26
20
 
27
21
  def string(s)
@@ -1,3 +1,3 @@
1
1
  module YamlTranslator
2
- VERSION = '0.8.4'
2
+ VERSION = '0.9.0'
3
3
  end
@@ -0,0 +1,16 @@
1
+ describe YamlTranslator::Context do
2
+ let(:lang_file) { File.join(File.dirname(__FILE__), '/../fixtures/en.yml') }
3
+ let(:locale) { YamlTranslator::Locale.load_file(lang_file) }
4
+ let(:adapter) { YamlTranslator::Adapters::NoopAdapter.new }
5
+ let(:translator) { YamlTranslator::Translator.new(adapter) }
6
+
7
+ describe '#all' do
8
+ let(:context) { YamlTranslator::Context.new(locale, translator) }
9
+ subject { context.all(%w(ja en)) }
10
+ it 'should be translate all' do
11
+ expect(subject.size).to eq(2)
12
+ expect(subject[0].lang).to eq(:ja)
13
+ expect(subject[1].lang).to eq(:en)
14
+ end
15
+ end
16
+ end
@@ -13,7 +13,7 @@ describe YamlTranslator::Locale do
13
13
  describe '#load' do
14
14
  it 'should be load from string' do
15
15
  locale = YamlTranslator::Locale.load(lang_file_content)
16
- expect(locale.lang).to eq('en')
16
+ expect(locale.lang).to eq(:en)
17
17
  end
18
18
  end
19
19
 
@@ -27,7 +27,7 @@ describe YamlTranslator::Locale do
27
27
  end
28
28
  it 'should be return flatten hash' do
29
29
  diff_locale = before_locale.diff(after_locale)
30
- expect(diff_locale.lang).to eq('en')
30
+ expect(diff_locale.lang).to eq(:en)
31
31
  expect(diff_locale.to_single_key_hash).to eq(single_key_hash)
32
32
  end
33
33
  end
@@ -50,14 +50,14 @@ describe YamlTranslator::Locale do
50
50
  let(:merge_target_file) { File.join(File.dirname(__FILE__), '/../fixtures/merge_target.yml') }
51
51
  it 'should be merge to yaml file' do
52
52
  merged = locale.merge_to_file(merge_target_file)
53
- expect(merged.values['en']['target']).to eq('bar')
53
+ expect(merged['en']['target']).to eq('bar')
54
54
  end
55
55
  end
56
56
 
57
57
  describe '#merge_to_s' do
58
58
  it 'should be merge to yaml formatted string' do
59
59
  merged = locale.merge_to_s("---\nen:\n merge_to_s: ok?")
60
- expect(merged.values['en']['merge_to_s']).to eq('ok?')
60
+ expect(merged['en']['merge_to_s']).to eq('ok?')
61
61
  end
62
62
  end
63
63
 
@@ -7,7 +7,7 @@ describe YamlTranslator::Translator do
7
7
  it 'translate files' do
8
8
  result = translator.file(path).to(:ja)
9
9
  expect(result.lang).to eq(:ja)
10
- expect(result.values).to eq(expected_locale.values)
10
+ expect(result.config).to eq(expected_locale.config)
11
11
  end
12
12
  end
13
13
  context 'when zh-CN' do
@@ -16,7 +16,7 @@ describe YamlTranslator::Translator do
16
16
  it 'translate files' do
17
17
  result = translator.file(path).to(:'zh-CN')
18
18
  expect(result.lang).to eq(:'zh-CN')
19
- expect(result.values).to eq(expected_locale.values)
19
+ expect(result.config).to eq(expected_locale.config)
20
20
  end
21
21
  end
22
22
  end
@@ -28,7 +28,7 @@ describe YamlTranslator::Translator do
28
28
  it 'translate yaml string' do
29
29
  result = translator.string(yaml_source).to(:ja)
30
30
  expect(result.lang).to eq(:ja)
31
- expect(result.values).to eq(expected_locale.values)
31
+ expect(result.config).to eq(expected_locale.config)
32
32
  end
33
33
  end
34
34
  context 'when zh-CN' do
@@ -37,7 +37,7 @@ describe YamlTranslator::Translator do
37
37
  it 'translate yaml string' do
38
38
  result = translator.string(yaml_source).to(:'zh-CN')
39
39
  expect(result.lang).to eq(:'zh-CN')
40
- expect(result.values).to eq(expected_locale.values)
40
+ expect(result.config).to eq(expected_locale.config)
41
41
  end
42
42
  end
43
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml-translator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noritaka Horio
@@ -165,9 +165,6 @@ files:
165
165
  - lib/yaml-translator/context.rb
166
166
  - lib/yaml-translator/key_path.rb
167
167
  - lib/yaml-translator/locale.rb
168
- - lib/yaml-translator/structure.rb
169
- - lib/yaml-translator/structure/single_key.rb
170
- - lib/yaml-translator/structure/tree.rb
171
168
  - lib/yaml-translator/translator.rb
172
169
  - lib/yaml-translator/version.rb
173
170
  - spec/fixtures/diff/after/en.yml
@@ -178,9 +175,8 @@ files:
178
175
  - spec/fixtures/zh-CN.yml
179
176
  - spec/helpers/locale_helper.rb
180
177
  - spec/spec_helper.rb
178
+ - spec/yaml-translator/context_spec.rb
181
179
  - spec/yaml-translator/locale_spec.rb
182
- - spec/yaml-translator/structure/single_key.rb
183
- - spec/yaml-translator/structure/tree_spec.rb
184
180
  - spec/yaml-translator/translator_spec.rb
185
181
  - spec/yaml_translator_spec.rb
186
182
  - yaml-translator.gemspec
@@ -217,8 +213,7 @@ test_files:
217
213
  - spec/fixtures/zh-CN.yml
218
214
  - spec/helpers/locale_helper.rb
219
215
  - spec/spec_helper.rb
216
+ - spec/yaml-translator/context_spec.rb
220
217
  - spec/yaml-translator/locale_spec.rb
221
- - spec/yaml-translator/structure/single_key.rb
222
- - spec/yaml-translator/structure/tree_spec.rb
223
218
  - spec/yaml-translator/translator_spec.rb
224
219
  - spec/yaml_translator_spec.rb
@@ -1,5 +0,0 @@
1
- require 'yaml-translator/structure/tree'
2
- require 'yaml-translator/structure/single_key'
3
-
4
- Hash.include YamlTranslator::Structure::Tree
5
- Hash.include YamlTranslator::Structure::SingleKey
@@ -1,27 +0,0 @@
1
- module YamlTranslator
2
- module Structure
3
- module SingleKey
4
- # Covert to a flatten hash
5
- def to_single_key
6
- compact_of(self, KeyPath.new)
7
- end
8
-
9
- private
10
-
11
- # Covert to a flatten hash
12
- def compact_of(values={}, path=KeyPath.new)
13
- result = {}
14
- values.each_with_index do |(i, v)|
15
- path.move_to(i)
16
- if v.is_a?(Hash)
17
- result.merge!(compact_of(v, path))
18
- else
19
- result[path.to_s] = v
20
- end
21
- path.leave
22
- end
23
- result
24
- end
25
- end
26
- end
27
- end
@@ -1,35 +0,0 @@
1
- module YamlTranslator
2
- module Structure
3
- module Tree
4
- def to_tree
5
- tree_of(self)
6
- end
7
-
8
- private
9
-
10
- # Returning the flattened structure to the tree structure
11
- #
12
- # @param [Hash] values flatten Hash
13
- # @return [Hash] translated hash
14
- def tree_of(values)
15
- result = {}
16
- current = result
17
- values.each do |k, v|
18
- keys = k.split('.')
19
- last_key = keys.pop
20
- keys.each do |ks|
21
- current = if current.key?(ks)
22
- current[ks]
23
- else
24
- current[ks] = {}
25
- current[ks]
26
- end
27
- end
28
- current[last_key] = v
29
- current = result
30
- end
31
- result
32
- end
33
- end
34
- end
35
- end
@@ -1,8 +0,0 @@
1
- describe YamlTranslator::Structure::SingleKey do
2
- let(:tree) { { en: { foo: 'bar' } } }
3
- describe '#to_single_key' do
4
- it 'should be return single key hash' do
5
- expect(tree.to_single_key).to eq({ 'en.foo' => 'bar' })
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- describe YamlTranslator::Structure::Tree do
2
- let(:single_key) { { 'en.foo' => 'bar' } }
3
- describe '#to_tree' do
4
- it 'should be return tree hash' do
5
- expect(single_key.to_tree.to_s).to eq({ 'en' => { 'foo' => 'bar' } }.to_s)
6
- end
7
- end
8
- end