phraseapp-in-context-editor-ruby 1.0.2 → 1.0.3

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: 604cd00f00973ae2d407cb71c7a30368f9bea5ad
4
- data.tar.gz: 29d19946b640f989bede4f58f901de106f514235
3
+ metadata.gz: 01523b055b91761df927cdf84848aef55c6290ed
4
+ data.tar.gz: 784a66ff617287b86f09610e775164ea10dfa20b
5
5
  SHA512:
6
- metadata.gz: 828075464a99ba279d918bfb7402b47fd76d669cb425cfb031af26d1e267525eba43f24f56234c3dae3ccc65b8e0d5901c2d91cd148af78be141626ca8bb058b
7
- data.tar.gz: 1d4af8782257326396c0847adc79161389b8e3f0bdd5872c7e6954af83de303a0e3e34eaf97d369d89ef4245778efdce282c17cfdd3c89da3866eb101a7b26f1
6
+ metadata.gz: 0a54b0688e2c1fba44dc024ab69c712dcd3bebec6148767b0a412603a4d72ef595fa18bccc2e9ff38e4153aedad9dd8f3341ef609c5a32b5f9f3e3d03703158a
7
+ data.tar.gz: a35d23543c9f8c2c8c21a11b3b077a398406c3266435581b50ae92d996eecc225d552d851ed2f2cf75bb2d9ebbc7d5b363ca1798a9625d00ae6e005ff5d8d5ad
data/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Change Log
2
+
3
+ ## [v1.0.2](https://github.com/phrase/phraseapp-in-context-editor-ruby/tree/v1.0.2) (2015-10-12)
4
+ [Full Changelog](https://github.com/phrase/phraseapp-in-context-editor-ruby/compare/v1.0.1...v1.0.2)
5
+
6
+ **Closed issues:**
7
+
8
+ - Method missing error [\#5](https://github.com/phrase/phraseapp-in-context-editor-ruby/issues/5)
9
+
10
+ **Merged pull requests:**
11
+
12
+ - 18n delegate refactoring [\#6](https://github.com/phrase/phraseapp-in-context-editor-ruby/pull/6) ([segitty](https://github.com/segitty))
13
+
14
+ ## [v1.0.1](https://github.com/phrase/phraseapp-in-context-editor-ruby/tree/v1.0.1) (2015-10-07)
15
+ [Full Changelog](https://github.com/phrase/phraseapp-in-context-editor-ruby/compare/v1.0.0...v1.0.1)
16
+
17
+ **Closed issues:**
18
+
19
+ - Two translations in one HTML element [\#4](https://github.com/phrase/phraseapp-in-context-editor-ruby/issues/4)
20
+ - Why PhraseApp In-Context Editor can be enabled/disabled only for entire application? [\#3](https://github.com/phrase/phraseapp-in-context-editor-ruby/issues/3)
21
+ - Why Access Token is mandatory in configuration for In-Context Editor? [\#2](https://github.com/phrase/phraseapp-in-context-editor-ruby/issues/2)
22
+ - Problems chaneging suffix and prefix [\#1](https://github.com/phrase/phraseapp-in-context-editor-ruby/issues/1)
23
+
24
+ ## [v1.0.0](https://github.com/phrase/phraseapp-in-context-editor-ruby/tree/v1.0.0) (2015-08-21)
25
+
26
+
27
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
@@ -70,6 +70,14 @@ module PhraseApp
70
70
  config.js_host
71
71
  end
72
72
 
73
+ def js_path
74
+ config.js_path
75
+ end
76
+
77
+ def js_options
78
+ config.js_options
79
+ end
80
+
73
81
  def api_host
74
82
  config.api_host
75
83
  end
@@ -1,6 +1,6 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  require 'phraseapp-in-context-editor-ruby/api_collection'
3
- require 'phraseapp-in-context-editor-ruby/delegate/i18n'
3
+ require 'phraseapp-in-context-editor-ruby/delegate/i18n_delegate'
4
4
 
5
5
  module PhraseApp
6
6
  module InContextEditor
@@ -64,8 +64,9 @@ module PhraseApp
64
64
  def phraseapp_delegate_for(args)
65
65
  key = given_key_from_args(args)
66
66
  return nil unless present?(key)
67
+
67
68
  options = args[1].nil? ? {} : args[1]
68
- PhraseApp::InContextEditor::Delegate::I18n.new(key, options, args)
69
+ PhraseApp::InContextEditor::Delegate::I18nDelegate.new(key, options, args)
69
70
  end
70
71
 
71
72
  def extract_normalized_key_from_args(args)
@@ -93,6 +93,22 @@ module PhraseApp
93
93
  @@js_use_ssl = js_use_ssl
94
94
  end
95
95
 
96
+ def js_path
97
+ @@js_path ||= "/assets/in-context-editor/2.0/app.js"
98
+ end
99
+
100
+ def js_path=(js_path)
101
+ @@js_path = js_path
102
+ end
103
+
104
+ def js_options
105
+ @@js_options ||= {}
106
+ end
107
+
108
+ def js_options=(js_options)
109
+ @@js_options = js_options
110
+ end
111
+
96
112
  def cache_key_segments_initial
97
113
  @@cache_key_segments_initial ||= ["simple_form"]
98
114
  end
@@ -0,0 +1,79 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require 'phraseapp-in-context-editor-ruby/cache'
4
+ require 'phraseapp-in-context-editor-ruby/hash_flattener'
5
+ require 'phraseapp-in-context-editor-ruby/delegate'
6
+ require 'phraseapp-in-context-editor-ruby/api_wrapper'
7
+ require 'phraseapp-in-context-editor-ruby/displayable_key_identifier'
8
+
9
+ require 'set'
10
+
11
+ module PhraseApp
12
+ module InContextEditor
13
+ module Delegate
14
+ class I18nDelegate < Base
15
+ attr_accessor :key, :display_key, :options, :api_client, :fallback_keys, :original_args
16
+
17
+ def initialize(key, options={}, original_args=nil)
18
+ @key = key
19
+ @options = options
20
+ @original_args = original_args
21
+ @display_key = DisplayableKeyIdentifier.new(api_wrapper).identify(@key, @options)
22
+ super(decorated_key_name)
23
+ end
24
+
25
+ def method_missing(*args, &block)
26
+ self.class.log "Trying to execute missing method ##{args.first} on key #{@key}"
27
+ if @key.respond_to?(args.first)
28
+ to_s.send(*args)
29
+ else
30
+ data = translation_or_subkeys
31
+ if data.respond_to?(args.first)
32
+ data.send(*args, &block)
33
+ else
34
+ self.class.log "You tried to execute the missing method ##{args.first} on key #{@key} which is not supported. Please make sure you treat your translations as strings only."
35
+ original_translation = ::I18n.translate_without_phraseapp(*@original_args)
36
+ original_translation.send(*args, &block)
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def translation_or_subkeys
44
+ keys = api_wrapper.keys_with_prefix(@key)
45
+ return nil unless keys.present?
46
+
47
+ if keys.size == 1
48
+ translation_content_for_key(keys.first)
49
+ else
50
+ translation_hash = keys.inject({}) do |hash, key|
51
+ hash[key.name] = translation_content_for_key(key)
52
+ hash
53
+ end
54
+
55
+ PhraseApp::InContextEditor::HashFlattener.expand_flat_hash(translation_hash, @key)
56
+ end
57
+ end
58
+
59
+ def translation_content_for_key(key)
60
+ default_translations = api_wrapper.default_translation(key)
61
+ return unless default_translations.present?
62
+
63
+ if key.plural
64
+ default_translations.inject({}) do |hash, translation|
65
+ hash[translation.plural_suffix.to_sym] = translation.content
66
+ hash
67
+ end
68
+ else
69
+ default_translations.first.content
70
+ end
71
+ end
72
+
73
+ def api_wrapper
74
+ @api_wrapper ||= InContextEditor::ApiWrapper.new
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,46 @@
1
+ require 'phraseapp-in-context-editor-ruby/fallback_keys_fetcher'
2
+ require 'phraseapp-in-context-editor-ruby/key_names_cache'
3
+
4
+ module PhraseApp
5
+ module InContextEditor
6
+ class DisplayableKeyIdentifier
7
+ attr_reader :api_wrapper, :key_names_cache
8
+
9
+ def initialize(api_wrapper)
10
+ @api_wrapper = api_wrapper
11
+ @key_names_cache = KeyNamesCache.new(@api_wrapper)
12
+ end
13
+
14
+ def identify(key_name, options)
15
+ fallback_key_names = FallbackKeysFetcher.extract_fallback_keys(key_name, options)
16
+ return key_name if fallback_key_names.empty?
17
+
18
+ key_names = [key_name] | fallback_key_names
19
+ available_key_names = find_keys_within_phraseapp(key_names)
20
+
21
+ key_names.each do |item|
22
+ if available_key_names.include?(item)
23
+ return item
24
+ end
25
+ end
26
+
27
+ return key_name
28
+ end
29
+
30
+ private
31
+
32
+ def find_keys_within_phraseapp(key_names)
33
+ key_names_to_check_against_api = key_names - @key_names_cache.pre_fetched(key_names)
34
+ @key_names_cache.pre_cached(key_names) | key_names_returned_from_api_for(key_names_to_check_against_api)
35
+ end
36
+
37
+ def key_names_returned_from_api_for(key_names)
38
+ if key_names.size > 0
39
+ api_wrapper.keys_by_names(key_names).map { |key| key.name }
40
+ else
41
+ []
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,44 @@
1
+ module PhraseApp
2
+ module InContextEditor
3
+ class FallbackKeysFetcher
4
+
5
+ def self.extract_fallback_keys(key, options)
6
+ fallback_items = []
7
+ if options.has_key?(:default)
8
+ if options[:default].kind_of?(Array)
9
+ fallback_items = options[:default]
10
+ else
11
+ fallback_items << options[:default]
12
+ end
13
+ end
14
+
15
+ return fallback_items.map{ |item| process_fallback_item(item, key, options) }.flatten.uniq
16
+ end
17
+
18
+ def self.process_fallback_item(item, key, options)
19
+ fallback_keys = []
20
+ if item.kind_of?(Symbol)
21
+ fallback_key_name = item.to_s
22
+ if options.has_key?(:scope)
23
+ if options[:scope].is_a?(Array)
24
+ fallback_key_name = "#{options[:scope].join(".")}.#{item}"
25
+ else
26
+ fallback_key_name = "#{options[:scope]}.#{item}"
27
+ end
28
+ end
29
+ fallback_keys << fallback_key_name
30
+
31
+ if key == "helpers.label.#{fallback_key_name}" # http://apidock.com/rails/v3.1.0/ActionView/Helpers/FormHelper/label
32
+ fallback_keys << "activerecord.attributes.#{fallback_key_name}"
33
+ end
34
+
35
+ if key.start_with?("simple_form.") # special treatment for simple form
36
+ fallback_keys << "activerecord.attributes.#{item}"
37
+ end
38
+ end
39
+
40
+ return fallback_keys
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+ module PhraseApp
2
+ module InContextEditor
3
+ class KeyNamesCache
4
+ attr_reader :api_wrapper
5
+
6
+ def initialize(api_wrapper)
7
+ @api_wrapper = api_wrapper
8
+ end
9
+
10
+ def pre_cached(key_names)
11
+ unless cache.cached?(:translation_key_names)
12
+ cache.set(:translation_key_names, prefetched_key_names)
13
+ end
14
+
15
+ return key_names.select { |key_name| key_name_precached?(key_name) }
16
+ end
17
+
18
+ def pre_fetched(key_names)
19
+ key_names.select { |key_name| covered_by_initial_caching?(key_name) }
20
+ end
21
+
22
+ private
23
+
24
+ def prefetched_key_names
25
+ prefetched = Set.new
26
+ PhraseApp::InContextEditor.cache_key_segments_initial.each do |prefix|
27
+ api_wrapper.keys_with_prefix(prefix).each do |key|
28
+ prefetched.add(key.name)
29
+ end
30
+ end
31
+ prefetched
32
+ end
33
+
34
+ def covered_by_initial_caching?(key_name)
35
+ key_name.start_with?(*PhraseApp::InContextEditor.cache_key_segments_initial)
36
+ end
37
+
38
+ def key_name_is_in_cache?(key_name)
39
+ cache.get(:translation_key_names).include?(key_name)
40
+ end
41
+
42
+ def key_name_precached?(key_name)
43
+ covered = covered_by_initial_caching?(key_name)
44
+ in_cache = key_name_is_in_cache?(key_name)
45
+ return covered && in_cache
46
+ end
47
+
48
+ def cache
49
+ Thread.current[:phraseapp_cache] ||= PhraseApp::InContextEditor::Cache.new
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  module PhraseApp
2
2
  module InContextEditor
3
- VERSION = "1.0.2"
3
+ VERSION = "1.0.3"
4
4
  end
5
5
  end
@@ -6,20 +6,24 @@ module PhraseApp
6
6
  def phraseapp_in_context_editor_js(opts={})
7
7
  return "" unless PhraseApp::InContextEditor.enabled?
8
8
 
9
- opts = opts.nil? ? {} : opts.inject({}) { |conf, (k,v)| conf[k.to_s] = v; conf} # stringify to reduce possible errors when passing symbols
9
+ # stringify to reduce possible errors when passing symbols
10
+ js_default_options = PhraseApp::InContextEditor.js_options.inject({}) { |conf, (k,v)| conf[k.to_s] = v; conf}
11
+ opts = opts.nil? ? {} : opts.inject({}) { |conf, (k,v)| conf[k.to_s] = v; conf}
12
+
13
+ # js options
10
14
  configuration = {
11
15
  'projectId' => PhraseApp::InContextEditor.project_id,
12
16
  'prefix' => PhraseApp::InContextEditor.prefix,
13
17
  'suffix' => PhraseApp::InContextEditor.suffix,
14
18
  'apiBaseUrl' => "#{PhraseApp::InContextEditor.api_host}/api/v2",
15
- }.merge(opts)
19
+ }.merge(js_default_options).merge(opts)
16
20
 
17
21
  snippet = <<-eos
18
22
  <script>
19
23
  window.PHRASEAPP_CONFIG = #{configuration.to_json};
20
24
  (function() {
21
25
  var phraseapp = document.createElement('script'); phraseapp.type = 'text/javascript'; phraseapp.async = true;
22
- phraseapp.src = ['#{PhraseApp::InContextEditor.js_use_ssl ? 'https' : 'http'}://', '#{PhraseApp::InContextEditor.js_host}/assets/in-context-editor/2.0/app.js?', new Date().getTime()].join('');
26
+ phraseapp.src = ['#{PhraseApp::InContextEditor.js_use_ssl ? 'https' : 'http'}://', '#{PhraseApp::InContextEditor.js_host}#{PhraseApp::InContextEditor.js_path}?', new Date().getTime()].join('');
23
27
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(phraseapp, s);
24
28
  })();
25
29
  </script>
@@ -28,4 +28,5 @@ Gem::Specification.new do |s|
28
28
  s.add_development_dependency('vcr', '~> 2.9')
29
29
  s.add_development_dependency('timecop', '~> 0.7')
30
30
  s.add_development_dependency('rails', '~> 4.2')
31
+ s.add_development_dependency('github_changelog_generator')
31
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phraseapp-in-context-editor-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dynport GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-09 00:00:00.000000000 Z
11
+ date: 2016-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '4.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: github_changelog_generator
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: 'PhraseApp In-Context-Editor allows you to edit translations directly
126
140
  on the website. More information: phraseapp.com'
127
141
  email:
@@ -132,6 +146,7 @@ extra_rdoc_files: []
132
146
  files:
133
147
  - ".gitignore"
134
148
  - ".travis.yml"
149
+ - CHANGELOG.md
135
150
  - Gemfile
136
151
  - Guardfile
137
152
  - LICENSE
@@ -150,9 +165,12 @@ files:
150
165
  - lib/phraseapp-in-context-editor-ruby/config.rb
151
166
  - lib/phraseapp-in-context-editor-ruby/delegate.rb
152
167
  - lib/phraseapp-in-context-editor-ruby/delegate/fast_gettext.rb
153
- - lib/phraseapp-in-context-editor-ruby/delegate/i18n.rb
168
+ - lib/phraseapp-in-context-editor-ruby/delegate/i18n_delegate.rb
169
+ - lib/phraseapp-in-context-editor-ruby/displayable_key_identifier.rb
154
170
  - lib/phraseapp-in-context-editor-ruby/engine.rb
171
+ - lib/phraseapp-in-context-editor-ruby/fallback_keys_fetcher.rb
155
172
  - lib/phraseapp-in-context-editor-ruby/hash_flattener.rb
173
+ - lib/phraseapp-in-context-editor-ruby/key_names_cache.rb
156
174
  - lib/phraseapp-in-context-editor-ruby/version.rb
157
175
  - lib/phraseapp-in-context-editor-ruby/view_helpers.rb
158
176
  - phraseapp-in-context-editor-ruby.gemspec
@@ -176,8 +194,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
194
  version: 1.3.6
177
195
  requirements: []
178
196
  rubyforge_project: phraseapp-in-context-editor-ruby
179
- rubygems_version: 2.2.1
197
+ rubygems_version: 2.4.8
180
198
  signing_key:
181
199
  specification_version: 4
182
200
  summary: Translation management solution for web and mobile applications
183
201
  test_files: []
202
+ has_rdoc:
@@ -1,192 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- require 'phraseapp-in-context-editor-ruby/cache'
4
- require 'phraseapp-in-context-editor-ruby/hash_flattener'
5
- require 'phraseapp-in-context-editor-ruby/delegate'
6
- require 'phraseapp-in-context-editor-ruby/api_wrapper'
7
- require 'set'
8
-
9
- module PhraseApp
10
- module InContextEditor
11
- module Delegate
12
- class I18n < Base
13
- attr_accessor :key, :display_key, :options, :api_client, :fallback_keys, :original_args
14
-
15
- def initialize(key, options={}, original_args=nil)
16
- @display_key = @key = key
17
- @options = options
18
- @original_args = original_args
19
-
20
- @fallback_keys = []
21
-
22
- extract_fallback_keys
23
- identify_key_to_display if @fallback_keys.any?
24
- super(decorated_key_name)
25
- end
26
-
27
- def method_missing(*args, &block)
28
- self.class.log "Trying to execute missing method ##{args.first} on key #{@key}"
29
- if @key.respond_to?(args.first)
30
- to_s.send(*args)
31
- else
32
- data = translation_or_subkeys
33
- if data.respond_to?(args.first)
34
- data.send(*args, &block)
35
- else
36
- self.class.log "You tried to execute the missing method ##{args.first} on key #{@key} which is not supported. Please make sure you treat your translations as strings only."
37
- original_translation = ::I18n.translate_without_phraseapp(*@original_args)
38
- original_translation.send(*args, &block)
39
- end
40
- end
41
- end
42
-
43
- private
44
- def identify_key_to_display
45
- key_names = [@key] | @fallback_keys
46
- available_key_names = find_keys_within_phraseapp(key_names)
47
- @display_key = @key
48
- key_names.each do |item|
49
- if available_key_names.include?(item)
50
- @display_key = item
51
- break
52
- end
53
- end
54
- end
55
-
56
- def find_keys_within_phraseapp(key_names)
57
- key_names_to_check_against_api = key_names - pre_fetched(key_names)
58
- pre_cached(key_names) | key_names_returned_from_api_for(key_names_to_check_against_api)
59
- end
60
-
61
- def pre_cached(key_names)
62
- warm_translation_key_names_cache unless cache.cached?(:translation_key_names)
63
- pre_cached_key_names = key_names.select { |key_name| key_name_precached?(key_name) }
64
- pre_cached_key_names
65
- end
66
-
67
- def pre_fetched(key_names)
68
- key_names.select { |key_name| covered_by_initial_caching?(key_name) }
69
- end
70
-
71
- def key_name_precached?(key_name)
72
- covered = covered_by_initial_caching?(key_name)
73
- in_cache = key_name_is_in_cache?(key_name)
74
- covered && in_cache
75
- end
76
-
77
- def key_names_returned_from_api_for(key_names)
78
- if key_names.size > 0
79
- api_wrapper.keys_by_names(key_names).map{ |key| key.name }
80
- else
81
- []
82
- end
83
- end
84
-
85
- def key_name_is_in_cache?(key_name)
86
- cache.get(:translation_key_names).include?(key_name)
87
- end
88
-
89
- def covered_by_initial_caching?(key_name)
90
- key_name.start_with?(*PhraseApp::InContextEditor.cache_key_segments_initial)
91
- end
92
-
93
- def extract_fallback_keys
94
- fallback_items = []
95
- if @options.has_key?(:default)
96
- if @options[:default].kind_of?(Array)
97
- fallback_items = @options[:default]
98
- else
99
- fallback_items << @options[:default]
100
- end
101
- end
102
-
103
- fallback_items.each do |item|
104
- process_fallback_item(item)
105
- end
106
- end
107
-
108
- def scoped(item)
109
- @options.has_key?(:scope) ? "#{@options[:scope]}.#{item}" : item
110
- end
111
-
112
- def process_fallback_item(item)
113
- if item.kind_of?(Symbol)
114
- entry = scoped(item.to_s)
115
- @fallback_keys << entry
116
- if @key == "helpers.label.#{entry}" # http://apidock.com/rails/v3.1.0/ActionView/Helpers/FormHelper/label
117
- @fallback_keys << "activerecord.attributes.#{entry}"
118
- end
119
-
120
- if @key.start_with?("simple_form.") # special treatment for simple form
121
- @fallback_keys << "activerecord.attributes.#{item.to_s}"
122
- end
123
- end
124
- end
125
-
126
- def translation_or_subkeys
127
- keys = api_wrapper.keys_with_prefix(@key)
128
- return nil unless keys.present?
129
-
130
- if keys.size == 1
131
- translation_content_for_key(keys.first)
132
- else
133
- translation_hash = keys.inject({}) do |hash, key|
134
- hash[key.name] = translation_content_for_key(key)
135
- hash
136
- end
137
-
138
- PhraseApp::InContextEditor::HashFlattener.expand_flat_hash(translation_hash, @key)
139
- end
140
- end
141
-
142
- def cache
143
- Thread.current[:phraseapp_cache] ||= build_cache
144
- end
145
-
146
- def build_cache
147
- cache = PhraseApp::InContextEditor::Cache.new
148
- end
149
-
150
- def warm_translation_key_names_cache
151
- cache.set(:translation_key_names, prefetched_key_names)
152
- end
153
-
154
- def prefetched_key_names
155
- prefetched = Set.new
156
- PhraseApp::InContextEditor.cache_key_segments_initial.each do |prefix|
157
- api_wrapper.keys_with_prefix(prefix).each do |key|
158
- prefetched.add(key.name)
159
- end
160
- end
161
- prefetched
162
- end
163
-
164
- def key_names_from_nested(segment, data)
165
- key_names = Set.new
166
- PhraseApp::InContextEditor::HashFlattener.flatten(data, nil) do |key, value|
167
- key_names.add("#{segment}.#{key}") unless value.is_a?(Hash)
168
- end unless (data.is_a?(String) || data.nil?)
169
- key_names
170
- end
171
-
172
- def translation_content_for_key(key)
173
- default_translations = api_wrapper.default_translation(key)
174
- return unless default_translations.present?
175
-
176
- if key.plural
177
- default_translations.inject({}) do |hash, translation|
178
- hash[translation.plural_suffix.to_sym] = translation.content
179
- hash
180
- end
181
- else
182
- default_translations.first.content
183
- end
184
- end
185
-
186
- def api_wrapper
187
- @api_wrapper ||= InContextEditor::ApiWrapper.new
188
- end
189
- end
190
- end
191
- end
192
- end