zendesk_apps_tools 1.6.0 → 1.7.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.
- data/lib/zendesk_apps_tools/translate.rb +57 -52
- data/templates/translation.erb.tt +4 -4
- metadata +4 -6
- data/features/translate.feature +0 -36
@@ -2,35 +2,58 @@ require 'thor'
|
|
2
2
|
require 'json'
|
3
3
|
require 'zendesk_apps_tools/common'
|
4
4
|
require 'zendesk_apps_tools/locale_identifier'
|
5
|
+
require 'zendesk_apps_support'
|
6
|
+
require 'yaml'
|
5
7
|
|
6
8
|
module ZendeskAppsTools
|
7
9
|
class Translate < Thor
|
8
10
|
include Thor::Shell
|
9
11
|
include Thor::Actions
|
10
12
|
include ZendeskAppsTools::Common
|
13
|
+
include ZendeskAppsSupport::BuildTranslation
|
11
14
|
|
12
|
-
CHARACTERS_TO_ESCAPE = %w[ " ]
|
13
15
|
LOCALE_ENDPOINT = "https://support.zendesk.com/api/v2/locales/agent.json"
|
14
16
|
|
15
|
-
desc '
|
16
|
-
|
17
|
-
|
17
|
+
desc 'to_yml', 'Create Zendesk translation file from en.json'
|
18
|
+
method_option :path, :default => './', :required => false
|
19
|
+
def to_yml
|
20
|
+
setup_path(options[:path]) if options[:path]
|
21
|
+
manifest = JSON.parse(File.open("#{destination_root}/manifest.json").read)
|
18
22
|
app_name = manifest['name']
|
19
23
|
|
20
24
|
unless app_name
|
21
25
|
app_name = get_value_from_stdin('What is the name of this app?', :error_msg => "Invalid name, try again:")
|
22
26
|
end
|
23
27
|
|
24
|
-
|
28
|
+
en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)
|
25
29
|
|
26
|
-
|
30
|
+
package = en_json["app"]["package"]
|
31
|
+
say('No package defined inside en.json! Abort.', :red) and exit 1 unless package
|
32
|
+
en_json["app"].delete("package")
|
33
|
+
|
34
|
+
write_yml(en_json, app_name, package)
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'to_json', 'Convert Zendesk translation yml to I18n formatted json'
|
38
|
+
method_option :path, :default => './', :required => false
|
39
|
+
def to_json
|
40
|
+
setup_path(options[:path]) if options[:path]
|
41
|
+
en_yml = YAML.load_file("#{destination_root}/translations/en.yml")
|
42
|
+
en_yml['parts'][0]['translation']['key'] =~ /^txt.apps.([^\.]+)/
|
43
|
+
package = $1
|
44
|
+
translations = en_yml['parts'].map { |part| part['translation'] }
|
45
|
+
en_json = array_to_nested_hash(translations)['txt']['apps'][package]
|
46
|
+
en_json['app']['package'] = package
|
47
|
+
|
48
|
+
write_json("translations/en.json", en_json)
|
27
49
|
end
|
28
50
|
|
29
51
|
desc 'update', 'Update translation files from Zendesk'
|
52
|
+
method_option :path, :default => './', :required => false
|
30
53
|
def update(request_builder = Faraday.new)
|
54
|
+
setup_path(options[:path]) if options[:path]
|
31
55
|
app_package = get_value_from_stdin("What is the package name for this app? (without app_)", :valid_regex => /^[a-z_]+$/, :error_msg => "Invalid package name, try again:")
|
32
56
|
|
33
|
-
user = "#{user}/token"
|
34
57
|
key_prefix = "txt.apps.#{app_package}."
|
35
58
|
|
36
59
|
say("Fetching translations...")
|
@@ -40,12 +63,12 @@ module ZendeskAppsTools
|
|
40
63
|
locales = JSON.parse(locale_response.body)["locales"]
|
41
64
|
|
42
65
|
locales.each do |locale|
|
43
|
-
locale_url
|
66
|
+
locale_url = "#{locale["url"]}?include=translations&packages=app_#{app_package}"
|
44
67
|
locale_response = api_request(locale_url, request_builder).body
|
45
|
-
translations
|
68
|
+
translations = JSON.parse(locale_response)['locale']['translations']
|
46
69
|
|
47
70
|
locale_name = ZendeskAppsTools::LocaleIdentifier.new(locale['locale']).language_id
|
48
|
-
write_json(locale_name, nest_translations_hash(translations, key_prefix))
|
71
|
+
write_json("#{destination_root}/translations/#{locale_name}.json", nest_translations_hash(translations, key_prefix))
|
49
72
|
end
|
50
73
|
say("Translations updated", :green)
|
51
74
|
|
@@ -60,17 +83,21 @@ module ZendeskAppsTools
|
|
60
83
|
|
61
84
|
no_commands do
|
62
85
|
|
63
|
-
def
|
64
|
-
|
86
|
+
def setup_path(path)
|
87
|
+
@destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
|
88
|
+
end
|
89
|
+
|
90
|
+
def write_json(filename, translations_hash)
|
91
|
+
create_file(filename, JSON.pretty_generate(translations_hash))
|
65
92
|
end
|
66
93
|
|
67
94
|
def nest_translations_hash(translations_hash, key_prefix)
|
68
95
|
result = {}
|
69
96
|
|
70
97
|
translations_hash.each do |full_key, value|
|
71
|
-
parts
|
98
|
+
parts = full_key.gsub(key_prefix, '').split('.')
|
72
99
|
parts_count = parts.size - 1
|
73
|
-
context
|
100
|
+
context = result
|
74
101
|
|
75
102
|
parts.each_with_index do |part, i|
|
76
103
|
|
@@ -86,52 +113,30 @@ module ZendeskAppsTools
|
|
86
113
|
result
|
87
114
|
end
|
88
115
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
@
|
95
|
-
|
96
|
-
@app_name = app_name
|
97
|
-
@package_name = package
|
116
|
+
def write_yml(en_json, app_name, package_name)
|
117
|
+
titles = to_flattened_namespaced_hash(en_json, I18N_TITLE_KEY)
|
118
|
+
values = to_flattened_namespaced_hash(en_json, I18N_VALUE_KEY)
|
119
|
+
@translations = titles.each { |k, v| titles[k] = {"title" => v, "value" => escape_special_characters(values[k]) }}
|
120
|
+
@app_name = app_name
|
121
|
+
@package_name = package_name
|
98
122
|
template(File.join(Translate.source_root, 'templates/translation.erb.tt'), "translations/en.yml")
|
99
123
|
end
|
100
124
|
|
101
|
-
def
|
102
|
-
|
103
|
-
translations.each do |key, value|
|
104
|
-
CHARACTERS_TO_ESCAPE.each do |char|
|
105
|
-
result[key] = value.gsub(char, "\\#{char}")
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
result
|
125
|
+
def escape_special_characters(v)
|
126
|
+
v.gsub('"', '\"')
|
110
127
|
end
|
111
128
|
|
112
|
-
def
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
keys
|
117
|
-
|
118
|
-
|
119
|
-
if hash_or_value[key].is_a?(Hash)
|
120
|
-
get_translations_for(hash_or_value, key, keys, translations)
|
121
|
-
keys = keys[0...-1]
|
122
|
-
else
|
123
|
-
translation_key = (keys + [key]).join('.')
|
124
|
-
translations[translation_key] = hash_or_value[key]
|
125
|
-
end
|
126
|
-
|
129
|
+
def array_to_nested_hash(array)
|
130
|
+
array.inject({}) do |result, item|
|
131
|
+
keys = item['key'].split('.')
|
132
|
+
current = result
|
133
|
+
keys[0..-2].each do |key|
|
134
|
+
current = (current[key] ||= {})
|
127
135
|
end
|
128
|
-
|
129
|
-
|
136
|
+
current[keys[-1]] = {'title' => item['title'], 'value' => item['value']}
|
137
|
+
result
|
130
138
|
end
|
131
|
-
|
132
|
-
translations
|
133
139
|
end
|
134
|
-
|
135
140
|
end
|
136
141
|
end
|
137
142
|
end
|
@@ -5,9 +5,9 @@ packages:
|
|
5
5
|
- app_<%= @package_name %>
|
6
6
|
|
7
7
|
parts:
|
8
|
-
<% @
|
8
|
+
<% @translations.each do |key, title_value| -%>
|
9
9
|
- translation:
|
10
10
|
key: "txt.apps.<%= @package_name %>.<%= key %>"
|
11
|
-
title: ""
|
12
|
-
value: "<%= value %>"
|
13
|
-
<% end %>
|
11
|
+
title: "<%= title_value["title"] %>"
|
12
|
+
value: "<%= title_value["value"] %>"
|
13
|
+
<% end %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zendesk_apps_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-11-28 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: thor
|
@@ -85,7 +85,7 @@ dependencies:
|
|
85
85
|
requirements:
|
86
86
|
- - ~>
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: 1.7.
|
88
|
+
version: 1.7.1
|
89
89
|
type: :runtime
|
90
90
|
prerelease: false
|
91
91
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -93,7 +93,7 @@ dependencies:
|
|
93
93
|
requirements:
|
94
94
|
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.7.
|
96
|
+
version: 1.7.1
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: cucumber
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,7 +191,6 @@ files:
|
|
191
191
|
- features/package.feature
|
192
192
|
- features/step_definitions/app_steps.rb
|
193
193
|
- features/support/env.rb
|
194
|
-
- features/translate.feature
|
195
194
|
- features/validate.feature
|
196
195
|
homepage: http://github.com/zendesk/zendesk_apps_tools
|
197
196
|
licenses:
|
@@ -225,5 +224,4 @@ test_files:
|
|
225
224
|
- features/package.feature
|
226
225
|
- features/step_definitions/app_steps.rb
|
227
226
|
- features/support/env.rb
|
228
|
-
- features/translate.feature
|
229
227
|
- features/validate.feature
|
data/features/translate.feature
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
Feature: Translate app strings
|
2
|
-
As a Zendesk admin
|
3
|
-
To enable many languages
|
4
|
-
I want to be able to map between json and yaml
|
5
|
-
|
6
|
-
Scenario: Attempt to generate invalid package name
|
7
|
-
Given an app is created in directory "tmp/aruba"
|
8
|
-
When I run "cd tmp/aruba && zat translate create" command with the following details:
|
9
|
-
| package name | This is wrong |
|
10
|
-
Then the command output should contain "Invalid package name, try again:"
|
11
|
-
|
12
|
-
Scenario: Generate template yaml from en.json
|
13
|
-
Given an app is created in directory "tmp/aruba"
|
14
|
-
And the fixture "quote_character_translation.json" is used for "translations/en.json"
|
15
|
-
When I run "cd tmp/aruba && zat translate create" command with the following details:
|
16
|
-
| package name | test_package |
|
17
|
-
Then the app file "tmp/aruba/translations/en.yml" is created with:
|
18
|
-
"""
|
19
|
-
---
|
20
|
-
title: "John Test App"
|
21
|
-
packages:
|
22
|
-
- default
|
23
|
-
- app_test_package
|
24
|
-
|
25
|
-
parts:
|
26
|
-
- translation:
|
27
|
-
key: "txt.apps.test_package.app.description"
|
28
|
-
title: ""
|
29
|
-
value: "Play the famous zen tunes in your help desk."
|
30
|
-
- translation:
|
31
|
-
key: "txt.apps.test_package.app.name"
|
32
|
-
title: ""
|
33
|
-
value: "Buddha \"Machine\""
|
34
|
-
|
35
|
-
"""
|
36
|
-
|