phraseapp-in-context-editor-ruby 1.4.0 → 2.0.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 +4 -4
- data/.github/workflows/test.yml +7 -11
- data/.gitignore +0 -1
- data/.tool-versions +1 -1
- data/CODEOWNERS +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +241 -0
- data/Guardfile +13 -13
- data/README.md +81 -51
- data/RELEASING.md +10 -0
- data/lib/generators/phraseapp_in_context_editor/install_generator.rb +3 -9
- data/lib/generators/phraseapp_in_context_editor/templates/phraseapp_in_context_editor.rb +9 -17
- data/lib/phraseapp-in-context-editor-ruby/adapters/fast_gettext.rb +20 -20
- data/lib/phraseapp-in-context-editor-ruby/adapters/i18n.rb +10 -10
- data/lib/phraseapp-in-context-editor-ruby/backend_service.rb +12 -99
- data/lib/phraseapp-in-context-editor-ruby/config.rb +13 -50
- data/lib/phraseapp-in-context-editor-ruby/delegate/fast_gettext.rb +13 -15
- data/lib/phraseapp-in-context-editor-ruby/delegate/i18n_delegate.rb +4 -50
- data/lib/phraseapp-in-context-editor-ruby/delegate.rb +13 -14
- data/lib/phraseapp-in-context-editor-ruby/engine.rb +5 -6
- data/lib/phraseapp-in-context-editor-ruby/view_helpers.rb +25 -19
- data/lib/phraseapp-in-context-editor-ruby.rb +15 -54
- data/phraseapp-in-context-editor-ruby.gemspec +18 -33
- metadata +27 -101
- data/lib/generators/phraseapp_in_context_editor/templates/README +0 -10
- data/lib/phraseapp-in-context-editor-ruby/api_collection.rb +0 -41
- data/lib/phraseapp-in-context-editor-ruby/api_wrapper.rb +0 -59
- data/lib/phraseapp-in-context-editor-ruby/cache.rb +0 -37
- data/lib/phraseapp-in-context-editor-ruby/displayable_key_identifier.rb +0 -46
- data/lib/phraseapp-in-context-editor-ruby/fallback_keys_fetcher.rb +0 -44
- data/lib/phraseapp-in-context-editor-ruby/hash_flattener.rb +0 -53
- data/lib/phraseapp-in-context-editor-ruby/key_names_cache.rb +0 -53
- data/lib/phraseapp-in-context-editor-ruby/version.rb +0 -5
@@ -1,43 +1,28 @@
|
|
1
|
-
#
|
2
|
-
lib = File.expand_path('../lib/', __FILE__)
|
3
|
-
$:.unshift lib unless $:.include?(lib)
|
4
|
-
|
5
|
-
require 'phraseapp-in-context-editor-ruby/version'
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
7
3
|
Gem::Specification.new do |s|
|
8
4
|
s.name = "phraseapp-in-context-editor-ruby"
|
9
|
-
s.version =
|
5
|
+
s.version = "2.0.0"
|
10
6
|
s.platform = Gem::Platform::RUBY
|
11
|
-
s.required_ruby_version =
|
12
|
-
s.authors = ["
|
7
|
+
s.required_ruby_version = ">= 3.2.0"
|
8
|
+
s.authors = ["Phrase"]
|
13
9
|
s.email = ["info@phrase.com"]
|
14
10
|
s.homepage = "https://phrase.com"
|
15
|
-
s.summary =
|
16
|
-
s.licenses = [
|
17
|
-
s.description =
|
11
|
+
s.summary = "Translation management solution for web and mobile applications"
|
12
|
+
s.licenses = ["MIT"]
|
13
|
+
s.description = "Phrase In-Context-Editor allows you to edit translations directly on the website. More information: phrase.com"
|
18
14
|
s.required_rubygems_version = ">= 1.3.6"
|
19
|
-
|
20
|
-
|
15
|
+
git_files = begin
|
16
|
+
`git ls-files | grep -v spec/`.split("\n")
|
17
|
+
rescue
|
18
|
+
""
|
19
|
+
end
|
21
20
|
s.files = git_files
|
22
|
-
s.test_files = s.files.grep(%r{^(spec)/})
|
23
21
|
s.require_paths = ["lib"]
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
s.
|
30
|
-
s.add_dependency('phraseapp-ruby', '~> 1.3')
|
31
|
-
s.add_dependency('request_store', '~> 1.3')
|
32
|
-
s.add_development_dependency('rspec', '~> 3.2')
|
33
|
-
s.add_development_dependency('webmock', '~> 1.21')
|
34
|
-
s.add_development_dependency('vcr', '~> 2.9')
|
35
|
-
s.add_development_dependency('timecop', '~> 0.7')
|
36
|
-
if RUBY_VERSION < '2.2'
|
37
|
-
s.add_development_dependency('mime-types', '< 3.0') # for 1.9.3 to work
|
38
|
-
s.add_development_dependency('rails', '~> 4.2')
|
39
|
-
else
|
40
|
-
s.add_development_dependency('rails', '>= 4.2', '< 5.1')
|
41
|
-
end
|
42
|
-
s.add_development_dependency('github_changelog_generator')
|
22
|
+
s.add_dependency("json", "~> 2.0")
|
23
|
+
s.add_dependency("i18n", "~> 1.0")
|
24
|
+
s.add_dependency("request_store", "~> 1.2")
|
25
|
+
s.add_development_dependency("rspec", "~> 3.0")
|
26
|
+
s.add_development_dependency("rails", "~> 7.0")
|
27
|
+
s.add_development_dependency("github_changelog_generator", "~> 1.16")
|
43
28
|
end
|
metadata
CHANGED
@@ -1,167 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phraseapp-in-context-editor-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
autorequire:
|
7
|
+
- Phrase
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.8'
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
19
|
+
version: '2.0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.8'
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
26
|
+
version: '2.0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: i18n
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0.6'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0.6'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: phraseapp-ruby
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
50
30
|
requirements:
|
51
31
|
- - "~>"
|
52
32
|
- !ruby/object:Gem::Version
|
53
|
-
version: '1.
|
33
|
+
version: '1.0'
|
54
34
|
type: :runtime
|
55
35
|
prerelease: false
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
57
37
|
requirements:
|
58
38
|
- - "~>"
|
59
39
|
- !ruby/object:Gem::Version
|
60
|
-
version: '1.
|
40
|
+
version: '1.0'
|
61
41
|
- !ruby/object:Gem::Dependency
|
62
42
|
name: request_store
|
63
43
|
requirement: !ruby/object:Gem::Requirement
|
64
44
|
requirements:
|
65
45
|
- - "~>"
|
66
46
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1.
|
47
|
+
version: '1.2'
|
68
48
|
type: :runtime
|
69
49
|
prerelease: false
|
70
50
|
version_requirements: !ruby/object:Gem::Requirement
|
71
51
|
requirements:
|
72
52
|
- - "~>"
|
73
53
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1.
|
54
|
+
version: '1.2'
|
75
55
|
- !ruby/object:Gem::Dependency
|
76
56
|
name: rspec
|
77
57
|
requirement: !ruby/object:Gem::Requirement
|
78
58
|
requirements:
|
79
59
|
- - "~>"
|
80
60
|
- !ruby/object:Gem::Version
|
81
|
-
version: '3.
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '3.2'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: webmock
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '1.21'
|
61
|
+
version: '3.0'
|
96
62
|
type: :development
|
97
63
|
prerelease: false
|
98
64
|
version_requirements: !ruby/object:Gem::Requirement
|
99
65
|
requirements:
|
100
66
|
- - "~>"
|
101
67
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
68
|
+
version: '3.0'
|
103
69
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
70
|
+
name: rails
|
105
71
|
requirement: !ruby/object:Gem::Requirement
|
106
72
|
requirements:
|
107
73
|
- - "~>"
|
108
74
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
75
|
+
version: '7.0'
|
110
76
|
type: :development
|
111
77
|
prerelease: false
|
112
78
|
version_requirements: !ruby/object:Gem::Requirement
|
113
79
|
requirements:
|
114
80
|
- - "~>"
|
115
81
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
82
|
+
version: '7.0'
|
117
83
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
84
|
+
name: github_changelog_generator
|
119
85
|
requirement: !ruby/object:Gem::Requirement
|
120
86
|
requirements:
|
121
87
|
- - "~>"
|
122
88
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
89
|
+
version: '1.16'
|
124
90
|
type: :development
|
125
91
|
prerelease: false
|
126
92
|
version_requirements: !ruby/object:Gem::Requirement
|
127
93
|
requirements:
|
128
94
|
- - "~>"
|
129
95
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: rails
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - ">="
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '4.2'
|
138
|
-
- - "<"
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version: '5.1'
|
141
|
-
type: :development
|
142
|
-
prerelease: false
|
143
|
-
version_requirements: !ruby/object:Gem::Requirement
|
144
|
-
requirements:
|
145
|
-
- - ">="
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
version: '4.2'
|
148
|
-
- - "<"
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: '5.1'
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
name: github_changelog_generator
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
154
|
-
requirements:
|
155
|
-
- - ">="
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
|
-
type: :development
|
159
|
-
prerelease: false
|
160
|
-
version_requirements: !ruby/object:Gem::Requirement
|
161
|
-
requirements:
|
162
|
-
- - ">="
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: '0'
|
96
|
+
version: '1.16'
|
165
97
|
description: 'Phrase In-Context-Editor allows you to edit translations directly on
|
166
98
|
the website. More information: phrase.com'
|
167
99
|
email:
|
@@ -175,40 +107,34 @@ files:
|
|
175
107
|
- ".package-licenses.yml"
|
176
108
|
- ".tool-versions"
|
177
109
|
- CHANGELOG.md
|
110
|
+
- CODEOWNERS
|
178
111
|
- Gemfile
|
112
|
+
- Gemfile.lock
|
179
113
|
- Guardfile
|
180
114
|
- LICENSE
|
181
115
|
- README.md
|
116
|
+
- RELEASING.md
|
182
117
|
- cacert.pem
|
183
118
|
- config/license-decisions.yml
|
184
119
|
- config/license_finder.yml
|
185
120
|
- lib/generators/phraseapp_in_context_editor/install_generator.rb
|
186
|
-
- lib/generators/phraseapp_in_context_editor/templates/README
|
187
121
|
- lib/generators/phraseapp_in_context_editor/templates/phraseapp_in_context_editor.rb
|
188
122
|
- lib/phraseapp-in-context-editor-ruby.rb
|
189
123
|
- lib/phraseapp-in-context-editor-ruby/adapters/fast_gettext.rb
|
190
124
|
- lib/phraseapp-in-context-editor-ruby/adapters/i18n.rb
|
191
|
-
- lib/phraseapp-in-context-editor-ruby/api_collection.rb
|
192
|
-
- lib/phraseapp-in-context-editor-ruby/api_wrapper.rb
|
193
125
|
- lib/phraseapp-in-context-editor-ruby/backend_service.rb
|
194
|
-
- lib/phraseapp-in-context-editor-ruby/cache.rb
|
195
126
|
- lib/phraseapp-in-context-editor-ruby/config.rb
|
196
127
|
- lib/phraseapp-in-context-editor-ruby/delegate.rb
|
197
128
|
- lib/phraseapp-in-context-editor-ruby/delegate/fast_gettext.rb
|
198
129
|
- lib/phraseapp-in-context-editor-ruby/delegate/i18n_delegate.rb
|
199
|
-
- lib/phraseapp-in-context-editor-ruby/displayable_key_identifier.rb
|
200
130
|
- lib/phraseapp-in-context-editor-ruby/engine.rb
|
201
|
-
- lib/phraseapp-in-context-editor-ruby/fallback_keys_fetcher.rb
|
202
|
-
- lib/phraseapp-in-context-editor-ruby/hash_flattener.rb
|
203
|
-
- lib/phraseapp-in-context-editor-ruby/key_names_cache.rb
|
204
|
-
- lib/phraseapp-in-context-editor-ruby/version.rb
|
205
131
|
- lib/phraseapp-in-context-editor-ruby/view_helpers.rb
|
206
132
|
- phraseapp-in-context-editor-ruby.gemspec
|
207
133
|
homepage: https://phrase.com
|
208
134
|
licenses:
|
209
135
|
- MIT
|
210
136
|
metadata: {}
|
211
|
-
post_install_message:
|
137
|
+
post_install_message:
|
212
138
|
rdoc_options: []
|
213
139
|
require_paths:
|
214
140
|
- lib
|
@@ -216,15 +142,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
216
142
|
requirements:
|
217
143
|
- - ">="
|
218
144
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
145
|
+
version: 3.2.0
|
220
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
147
|
requirements:
|
222
148
|
- - ">="
|
223
149
|
- !ruby/object:Gem::Version
|
224
150
|
version: 1.3.6
|
225
151
|
requirements: []
|
226
|
-
rubygems_version: 3.
|
227
|
-
signing_key:
|
152
|
+
rubygems_version: 3.4.13
|
153
|
+
signing_key:
|
228
154
|
specification_version: 4
|
229
155
|
summary: Translation management solution for web and mobile applications
|
230
156
|
test_files: []
|
@@ -1,10 +0,0 @@
|
|
1
|
-
===============================================================================
|
2
|
-
Welcome to PhraseApp!
|
3
|
-
|
4
|
-
PhraseApp is the translation management solution for web and mobile applications. Collaborate with your team, find professional translators and stay on top of the process.
|
5
|
-
|
6
|
-
How awesome would it be if translators could simply browse your website and edit text along the way? Our In-Context Editor offers just that. It provides translators with useful contextual information which improves overall translation quality.
|
7
|
-
|
8
|
-
Login: https://phraseapp.com/account/login
|
9
|
-
Documentation: https://help.phraseapp.com/translate-website-and-app-content/use-in-context-editor-to-translate/translate-directly-on-your-website
|
10
|
-
===============================================================================
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module PhraseApp
|
2
|
-
module InContextEditor
|
3
|
-
class ApiCollection
|
4
|
-
def initialize(api_client, action, ids=[], query=nil)
|
5
|
-
raise "PhraseApp API client can't handle action #{action}" unless api_client.respond_to?(action)
|
6
|
-
|
7
|
-
@api_client = api_client
|
8
|
-
@action = action
|
9
|
-
@ids = ids
|
10
|
-
@query = query
|
11
|
-
end
|
12
|
-
|
13
|
-
def collection
|
14
|
-
results = []
|
15
|
-
page = 1
|
16
|
-
per_page = 100
|
17
|
-
paginated, err = send_request(page, per_page)
|
18
|
-
results << paginated
|
19
|
-
|
20
|
-
while paginated.size == per_page
|
21
|
-
break if page > 100
|
22
|
-
|
23
|
-
page = page + 1
|
24
|
-
paginated, err = send_request(page, per_page)
|
25
|
-
results << paginated if paginated.present?
|
26
|
-
end
|
27
|
-
|
28
|
-
results.flatten.uniq
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
def send_request(page, per_page)
|
33
|
-
if @query.present?
|
34
|
-
@api_client.send(@action, *@ids, page, per_page, @query)
|
35
|
-
else
|
36
|
-
@api_client.send(@action, *@ids, page, per_page)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'phraseapp-in-context-editor-ruby/api_collection'
|
2
|
-
|
3
|
-
module PhraseApp
|
4
|
-
module InContextEditor
|
5
|
-
class ApiWrapper
|
6
|
-
def initialize
|
7
|
-
@api_client = PhraseApp::InContextEditor.api_client
|
8
|
-
end
|
9
|
-
|
10
|
-
def default_locale
|
11
|
-
@default_locale ||= select_default_locale
|
12
|
-
end
|
13
|
-
|
14
|
-
def default_translation(key)
|
15
|
-
params = PhraseApp::RequestParams::TranslationsByKeyParams.new
|
16
|
-
translations = PhraseApp::InContextEditor::ApiCollection.new(@api_client, "translations_by_key", project_and_key_id(key), params).collection
|
17
|
-
return unless translations.present?
|
18
|
-
|
19
|
-
translations.select{ |translation| translation.locale["id"] == default_locale.id }
|
20
|
-
end
|
21
|
-
|
22
|
-
def keys_with_prefix(prefix)
|
23
|
-
params = PhraseApp::RequestParams::KeysSearchParams.new(q:"#{prefix}*")
|
24
|
-
keys_list(params)
|
25
|
-
end
|
26
|
-
|
27
|
-
def keys_by_names(names)
|
28
|
-
names = names.join(',')
|
29
|
-
params = PhraseApp::RequestParams::KeysSearchParams.new(:q => "name:#{names}")
|
30
|
-
keys_list(params)
|
31
|
-
end
|
32
|
-
|
33
|
-
def keys_list(params)
|
34
|
-
PhraseApp::InContextEditor::ApiCollection.new(@api_client, "keys_search", project_id, params).collection
|
35
|
-
end
|
36
|
-
|
37
|
-
def blacklisted_keys
|
38
|
-
PhraseApp::InContextEditor::ApiCollection.new(@api_client, "blacklisted_keys_list", project_id).collection.map{ |rule| rule.name }
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def select_default_locale
|
44
|
-
locales = PhraseApp::InContextEditor::ApiCollection.new(@api_client, "locales_list", project_id).collection
|
45
|
-
return unless locales.present?
|
46
|
-
|
47
|
-
locales.select{ |loc| loc.default }.first
|
48
|
-
end
|
49
|
-
|
50
|
-
def project_id
|
51
|
-
[PhraseApp::InContextEditor.project_id]
|
52
|
-
end
|
53
|
-
|
54
|
-
def project_and_key_id(key)
|
55
|
-
project_id << key.id
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
require 'phraseapp-in-context-editor-ruby'
|
4
|
-
|
5
|
-
module PhraseApp
|
6
|
-
module InContextEditor
|
7
|
-
class Cache
|
8
|
-
attr_accessor :lifetime
|
9
|
-
|
10
|
-
def initialize(args={})
|
11
|
-
@store = {}
|
12
|
-
@lifetime = args.fetch(:lifetime, PhraseApp::InContextEditor.cache_lifetime)
|
13
|
-
end
|
14
|
-
|
15
|
-
def cached?(cache_key)
|
16
|
-
@store.has_key?(cache_key) && !expired?(cache_key)
|
17
|
-
end
|
18
|
-
|
19
|
-
def get(cache_key)
|
20
|
-
begin
|
21
|
-
@store.fetch(cache_key)[:payload]
|
22
|
-
rescue
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def set(cache_key, value)
|
28
|
-
@store[cache_key] = {timestamp: Time.now, payload: value}
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
def expired?(cache_key)
|
33
|
-
@store.fetch(cache_key)[:timestamp] < (Time.now - @lifetime)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,46 +0,0 @@
|
|
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
|
@@ -1,44 +0,0 @@
|
|
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
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
module PhraseApp
|
3
|
-
module InContextEditor
|
4
|
-
module HashFlattener
|
5
|
-
FLATTEN_SEPARATOR = "."
|
6
|
-
SEPARATOR_ESCAPE_CHAR = "\001"
|
7
|
-
|
8
|
-
def self.flatten(hash, escape, previous_key=nil, &block)
|
9
|
-
hash.each_pair do |key, value|
|
10
|
-
key = escape_default_separator(key) if escape
|
11
|
-
current_key = [previous_key, key].compact.join(FLATTEN_SEPARATOR).to_sym
|
12
|
-
yield current_key, value
|
13
|
-
flatten(value, escape, current_key, &block) if value.is_a?(Hash)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.expand_flat_hash(flat_hash, prefix=nil)
|
18
|
-
flat_hash ||= []
|
19
|
-
result = flat_hash.map do |key, value|
|
20
|
-
key = key.gsub(/#{prefix}[\.]?/, '') if prefix
|
21
|
-
to_nested_hash(key, value)
|
22
|
-
end
|
23
|
-
|
24
|
-
result = result.inject({}) { |hash, subhash| hash.deep_merge!(subhash) }
|
25
|
-
result
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.to_nested_hash key, value
|
29
|
-
if contains_only_dots?(key) or starts_with_dot?(key) or ends_with_dot?(key)
|
30
|
-
{key.to_sym => value}
|
31
|
-
else
|
32
|
-
key.to_s.split(".").reverse.inject(value) { |hash, part| {part.to_sym => hash} }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.contains_only_dots?(string)
|
37
|
-
string.to_s.gsub(/\./, "").length == 0
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.starts_with_dot?(string)
|
41
|
-
string.to_s.start_with?(".")
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.ends_with_dot?(string)
|
45
|
-
string.to_s.end_with?(".")
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.escape_default_separator(key)
|
49
|
-
key.to_s.tr(FLATTEN_SEPARATOR, SEPARATOR_ESCAPE_CHAR)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,53 +0,0 @@
|
|
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
|
-
RequestStore.store[:phraseapp_cache] ||= PhraseApp::InContextEditor::Cache.new
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|