web_translate_it 2.6.3 → 2.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.
- checksums.yaml +4 -4
- data/bin/wti +87 -87
- data/examples/locale.rb +2 -0
- data/generators/webtranslateit/webtranslateit_generator.rb +3 -1
- data/history.md +13 -0
- data/lib/web_translate_it/auto_fetch.rb +4 -0
- data/lib/web_translate_it/command_line.rb +39 -28
- data/lib/web_translate_it/configuration.rb +8 -4
- data/lib/web_translate_it/connection.rb +4 -0
- data/lib/web_translate_it/project.rb +8 -3
- data/lib/web_translate_it/string.rb +6 -2
- data/lib/web_translate_it/term.rb +6 -2
- data/lib/web_translate_it/term_translation.rb +4 -0
- data/lib/web_translate_it/translation.rb +4 -0
- data/lib/web_translate_it/translation_file.rb +6 -2
- data/lib/web_translate_it/util/array_util.rb +2 -0
- data/lib/web_translate_it/util/hash_util.rb +4 -0
- data/lib/web_translate_it/util/string_util.rb +2 -0
- data/lib/web_translate_it/util.rb +19 -16
- data/lib/web_translate_it.rb +2 -0
- data/readme.md +10 -21
- metadata +3 -73
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6cef77421b30d347178a38e6fe50300e44d41a2c47fe46736ad79d76bc891374
|
|
4
|
+
data.tar.gz: e3d93cec2762262b06a8eb5aa2f71a901eb5ba77ff09b1e2f85462f765617501
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 154b48ea91ca07bc107ff3b551678bf152a791db84432be020d1e3f3444c7f0830f303f5a222947fdbf1178638648df973f1c2ff8755c8db30e22c8916808c75
|
|
7
|
+
data.tar.gz: 1bbf7533a388aeec98f9d0541c1839d95d18ed99d0cf2ccb4bb6400cb0852ddd8d98d04e4d29315b55c05790e70095db5d5a418ac47a1b47234ca84da495cf5b
|
data/bin/wti
CHANGED
|
@@ -34,93 +34,93 @@ end
|
|
|
34
34
|
|
|
35
35
|
command = ARGV.shift # get the subcommand
|
|
36
36
|
command_options = case command
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
37
|
+
when 'pull'
|
|
38
|
+
Optimist.options do
|
|
39
|
+
banner <<~BANNER
|
|
40
|
+
wti pull [filename] - Pull target language file(s)
|
|
41
|
+
[options] are:
|
|
42
|
+
BANNER
|
|
43
|
+
opt :locale, 'ISO code of locale(s) to pull, space-separated', type: :string
|
|
44
|
+
opt :all, 'Pull all files'
|
|
45
|
+
opt :force, 'Force pull (bypass conditional requests to WTI)'
|
|
46
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
47
|
+
opt :debug, 'Display debug information'
|
|
48
|
+
end
|
|
49
|
+
when 'push'
|
|
50
|
+
Optimist.options do
|
|
51
|
+
banner <<~BANNER
|
|
52
|
+
wti push [filename] - Push master language file(s)
|
|
53
|
+
[options] are:
|
|
54
|
+
BANNER
|
|
55
|
+
opt :locale, 'ISO code of locale(s) to push, space-separated', type: :string
|
|
56
|
+
opt :target, 'Upload all target files'
|
|
57
|
+
opt :force, 'Force push (bypass conditional requests to WTI)'
|
|
58
|
+
opt :low_priority, 'WTI will process this file with a low priority'
|
|
59
|
+
opt :merge, 'Force WTI to merge this file'
|
|
60
|
+
opt :ignore_missing, 'Force WTI to not obsolete missing strings'
|
|
61
|
+
opt :minor, 'Minor Changes. When pushing a master file, prevents target translations to be flagged as `to_verify`.'
|
|
62
|
+
opt :label, 'Apply a label to the changes', type: :string
|
|
63
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
64
|
+
opt :all, 'DEPRECATED -- See `wti push --target` instead'
|
|
65
|
+
opt :debug, 'Display debug information'
|
|
66
|
+
end
|
|
67
|
+
when 'add'
|
|
68
|
+
Optimist.options do
|
|
69
|
+
banner 'wti add filename - Create and push a new master language file'
|
|
70
|
+
opt :low_priority, 'WTI will process this file with a low priority'
|
|
71
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
72
|
+
opt :debug, 'Display debug information'
|
|
73
|
+
end
|
|
74
|
+
when 'rm'
|
|
75
|
+
Optimist.options do
|
|
76
|
+
banner 'wti rm filename - Delete a master language file'
|
|
77
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
78
|
+
opt :debug, 'Display debug information'
|
|
79
|
+
end
|
|
80
|
+
when 'mv'
|
|
81
|
+
Optimist.options do
|
|
82
|
+
banner 'wti mv filename - Moves a master language file and its target files'
|
|
83
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
84
|
+
opt :debug, 'Display debug information'
|
|
85
|
+
end
|
|
86
|
+
when 'addlocale'
|
|
87
|
+
Optimist.options do
|
|
88
|
+
banner 'wti addlocale localename - Add a new locale to the project'
|
|
89
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
90
|
+
opt :debug, 'Display debug information'
|
|
91
|
+
end
|
|
92
|
+
when 'rmlocale'
|
|
93
|
+
Optimist.options do
|
|
94
|
+
banner 'wti rmlocale localename Delete a locale from the project'
|
|
95
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
96
|
+
opt :debug, 'Display debug information'
|
|
97
|
+
end
|
|
98
|
+
when 'status'
|
|
99
|
+
Optimist.options do
|
|
100
|
+
banner "wti status [filename] - Fetch and display project statistics.\nReturns 100 if untranslated segments exist in project\nReturns 101 if unproofread segments exist in project."
|
|
101
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
102
|
+
opt :debug, 'Display debug information'
|
|
103
|
+
end
|
|
104
|
+
when 'init'
|
|
105
|
+
Optimist.options do
|
|
106
|
+
banner 'wti init [api_token] - Configure your project to sync'
|
|
107
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
108
|
+
opt :debug, 'Display debug information'
|
|
109
|
+
end
|
|
110
|
+
when 'match'
|
|
111
|
+
Optimist.options do
|
|
112
|
+
banner 'wti match - Display matching of local files with File Manager'
|
|
113
|
+
opt :config, 'Path to a configuration file', short: '-c', default: '.wti'
|
|
114
|
+
opt :debug, 'Display debug information'
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
if command.nil?
|
|
118
|
+
puts show_commands
|
|
119
|
+
exit
|
|
120
|
+
else
|
|
121
|
+
Optimist.die "Unknown subcommand #{command.inspect}"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
124
|
|
|
125
125
|
begin
|
|
126
126
|
WebTranslateIt::Connection.turn_debug_on if command_options.debug
|
data/examples/locale.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require File.expand_path("#{File.dirname(__FILE__)}/lib/insert_commands.rb")
|
|
2
2
|
|
|
3
3
|
class WebtranslateitGenerator < Rails::Generator::Base
|
|
4
|
+
|
|
4
5
|
def add_options!(opt)
|
|
5
6
|
opt.on('-k', '--api-key=key', String, 'Your Web Translate It API key') { |v| options[:api_key] = v }
|
|
6
7
|
end
|
|
@@ -14,7 +15,7 @@ class WebtranslateitGenerator < Rails::Generator::Base
|
|
|
14
15
|
if options[:api_key]
|
|
15
16
|
project_details = YAML.load WebTranslateIt::Project.fetch_info(options[:api_key])
|
|
16
17
|
m.template '.wti', '.wti',
|
|
17
|
-
assigns: {
|
|
18
|
+
assigns: {api_key: options[:api_key], project: project_details['project']}
|
|
18
19
|
m.append_to 'Rakefile', "require 'web_translate_it' rescue LoadError"
|
|
19
20
|
end
|
|
20
21
|
end
|
|
@@ -23,4 +24,5 @@ class WebtranslateitGenerator < Rails::Generator::Base
|
|
|
23
24
|
def api_key_configured?
|
|
24
25
|
File.exist?('config/translations.yml')
|
|
25
26
|
end
|
|
27
|
+
|
|
26
28
|
end
|
data/history.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
## Version 2.7.0 / 2022-10-10
|
|
2
|
+
|
|
3
|
+
* New: Ability to see translation statistics per file.
|
|
4
|
+
- `wti status` gives the whole translation project statistics.
|
|
5
|
+
- `wti status path/to/file` gives the file translation statistics.
|
|
6
|
+
* Update readme file (installation instructions and add link to Docker package).
|
|
7
|
+
* Fix Rspec ExampleWording offences.
|
|
8
|
+
|
|
9
|
+
## Version 2.6.4 / 2022-09-22
|
|
10
|
+
|
|
11
|
+
* Move development dependencies to Gemfile and commit Gemfile.lock to version control.
|
|
12
|
+
* wti now sends a `User-Agent` header.
|
|
13
|
+
|
|
1
14
|
## Version 2.6.3 / 2022-06-14
|
|
2
15
|
|
|
3
16
|
* Fix deprecation warning. #181
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
# Class to automatically fetch the last translations from Web Translate It
|
|
3
4
|
# for every page requested.
|
|
4
5
|
# This can be used as a rack middleware.
|
|
@@ -8,6 +9,7 @@ module WebTranslateIt
|
|
|
8
9
|
# config.middleware.use "WebTranslateIt::AutoFetch"
|
|
9
10
|
#
|
|
10
11
|
class AutoFetch
|
|
12
|
+
|
|
11
13
|
def initialize(app)
|
|
12
14
|
@app = app
|
|
13
15
|
end
|
|
@@ -27,5 +29,7 @@ module WebTranslateIt
|
|
|
27
29
|
def valid_request?(env)
|
|
28
30
|
env['PATH_INFO'] !~ /\.(js|css|jpeg|jpg|gif|png|woff)$/
|
|
29
31
|
end
|
|
32
|
+
|
|
30
33
|
end
|
|
34
|
+
|
|
31
35
|
end
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
class CommandLine # rubocop:todo Metrics/ClassLength
|
|
4
|
+
|
|
3
5
|
require 'fileutils'
|
|
4
6
|
require 'set'
|
|
5
7
|
attr_accessor :configuration, :global_options, :command_options, :parameters
|
|
6
8
|
|
|
7
|
-
def initialize(command, command_options,
|
|
9
|
+
def initialize(command, command_options, _global_options, parameters, project_path) # rubocop:todo Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
8
10
|
self.command_options = command_options
|
|
9
11
|
self.parameters = parameters
|
|
10
12
|
unless command == 'init'
|
|
11
13
|
message = case command
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
14
|
+
when 'pull'
|
|
15
|
+
'Pulling files'
|
|
16
|
+
when 'push'
|
|
17
|
+
'Pushing files'
|
|
18
|
+
when 'add'
|
|
19
|
+
'Creating master files'
|
|
20
|
+
when 'rm'
|
|
21
|
+
'Deleting files'
|
|
22
|
+
when 'mv'
|
|
23
|
+
'Moving files'
|
|
24
|
+
when 'addlocale'
|
|
25
|
+
'Adding locale'
|
|
26
|
+
when 'rmlocale'
|
|
27
|
+
'Deleting locale'
|
|
28
|
+
else
|
|
29
|
+
'Gathering information'
|
|
30
|
+
end
|
|
29
31
|
throb do
|
|
30
32
|
print " #{message}"
|
|
31
33
|
self.configuration = WebTranslateIt::Configuration.new(project_path, configuration_file_path)
|
|
@@ -107,10 +109,10 @@ module WebTranslateIt
|
|
|
107
109
|
WebTranslateIt::Connection.new(configuration.api_key) do |http|
|
|
108
110
|
fetch_locales_to_push(configuration).each do |locale|
|
|
109
111
|
files = if parameters.any?
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
configuration.files.find_all { |file| parameters.include?(file.file_path) }.sort { |a, b| a.file_path <=> b.file_path }
|
|
113
|
+
else
|
|
114
|
+
configuration.files.find_all { |file| file.locale == locale }.sort { |a, b| a.file_path <=> b.file_path }
|
|
115
|
+
end
|
|
114
116
|
if files.empty?
|
|
115
117
|
puts "Couldn't find any local files registered on WebTranslateIt to push."
|
|
116
118
|
else
|
|
@@ -295,10 +297,10 @@ module WebTranslateIt
|
|
|
295
297
|
end
|
|
296
298
|
FileUtils.mkpath(path.split('/')[0..path.split('/').size - 2].join('/')) unless path.split('/').size == 1
|
|
297
299
|
project = if RUBY_VERSION >= '3.1'
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
300
|
+
YAML.safe_load WebTranslateIt::Project.fetch_info(api_key), permitted_classes: [Time]
|
|
301
|
+
else
|
|
302
|
+
YAML.load WebTranslateIt::Project.fetch_info(api_key)
|
|
303
|
+
end
|
|
302
304
|
project_info = project['project']
|
|
303
305
|
if File.exist?(path) && !File.writable?(path)
|
|
304
306
|
puts StringUtil.failure("Error: `#{path}` file is not writable.")
|
|
@@ -351,8 +353,15 @@ module WebTranslateIt
|
|
|
351
353
|
true
|
|
352
354
|
end
|
|
353
355
|
|
|
354
|
-
def status # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
355
|
-
|
|
356
|
+
def status # rubocop:todo Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
357
|
+
if parameters.any?
|
|
358
|
+
file = configuration.files.find { |f| parameters.first.strip == f.file_path }
|
|
359
|
+
abort "File '#{parameters.first}' not found." unless file
|
|
360
|
+
|
|
361
|
+
file_id = file.master_id || file.id
|
|
362
|
+
puts "Statistics for '#{parameters.first}':"
|
|
363
|
+
end
|
|
364
|
+
stats = YAML.load(Project.fetch_stats(configuration.api_key, file_id))
|
|
356
365
|
completely_translated = true
|
|
357
366
|
completely_proofread = true
|
|
358
367
|
stats.each do |locale, values|
|
|
@@ -470,5 +479,7 @@ module WebTranslateIt
|
|
|
470
479
|
puts "\r\e[0G#\e[?25h"
|
|
471
480
|
end
|
|
472
481
|
end
|
|
482
|
+
|
|
473
483
|
end
|
|
484
|
+
|
|
474
485
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
# Handles the configuration of your project, both via the the configuration file
|
|
3
4
|
# and via the API.
|
|
4
5
|
# Implementation example, assuming you have a valid .wti file:
|
|
@@ -6,6 +7,7 @@ module WebTranslateIt
|
|
|
6
7
|
# configuration = WebTranslateIt::Configuration.new
|
|
7
8
|
#
|
|
8
9
|
class Configuration
|
|
10
|
+
|
|
9
11
|
require 'yaml'
|
|
10
12
|
require 'fileutils'
|
|
11
13
|
require 'erb'
|
|
@@ -24,10 +26,10 @@ module WebTranslateIt
|
|
|
24
26
|
self.after_push = configuration['after_push']
|
|
25
27
|
self.ignore_files = configuration['ignore_files']
|
|
26
28
|
project_info = if RUBY_VERSION >= '3.1.0'
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
YAML.safe_load WebTranslateIt::Project.fetch_info(api_key), permitted_classes: [Time]
|
|
30
|
+
else
|
|
31
|
+
YAML.load WebTranslateIt::Project.fetch_info(api_key)
|
|
32
|
+
end
|
|
31
33
|
set_locales_to_ignore(configuration)
|
|
32
34
|
set_locales_needed(configuration)
|
|
33
35
|
set_files(project_info['project'])
|
|
@@ -116,5 +118,7 @@ module WebTranslateIt
|
|
|
116
118
|
def parse_erb_in_configuration
|
|
117
119
|
ERB.new(File.read(File.expand_path(path_to_config_file, path))).result
|
|
118
120
|
end
|
|
121
|
+
|
|
119
122
|
end
|
|
123
|
+
|
|
120
124
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
require 'English'
|
|
2
2
|
module WebTranslateIt
|
|
3
|
+
|
|
3
4
|
class Project
|
|
5
|
+
|
|
4
6
|
def self.fetch_info(api_key) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
5
7
|
success = true
|
|
6
8
|
tries ||= 3
|
|
@@ -29,12 +31,13 @@ module WebTranslateIt
|
|
|
29
31
|
success
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
def self.fetch_stats(api_key) # rubocop:todo Metrics/MethodLength
|
|
34
|
+
def self.fetch_stats(api_key, file_id = nil) # rubocop:todo Metrics/MethodLength
|
|
35
|
+
url = file_id.nil? ? "/api/projects/#{api_key}/stats.yaml" : "/api/projects/#{api_key}/stats.yaml?file=#{file_id}"
|
|
33
36
|
success = true
|
|
34
37
|
tries ||= 3
|
|
35
38
|
begin
|
|
36
39
|
WebTranslateIt::Connection.new(api_key) do |http|
|
|
37
|
-
request = Net::HTTP::Get.new(
|
|
40
|
+
request = Net::HTTP::Get.new(url)
|
|
38
41
|
WebTranslateIt::Util.add_fields(request)
|
|
39
42
|
return Util.handle_response(http.request(request), true)
|
|
40
43
|
end
|
|
@@ -56,7 +59,7 @@ module WebTranslateIt
|
|
|
56
59
|
begin
|
|
57
60
|
request = Net::HTTP::Post.new("/api/projects/#{Connection.api_key}/locales")
|
|
58
61
|
WebTranslateIt::Util.add_fields(request)
|
|
59
|
-
request.set_form_data({
|
|
62
|
+
request.set_form_data({'id' => locale_code}, ';')
|
|
60
63
|
Util.handle_response(Connection.http_connection.request(request), true)
|
|
61
64
|
rescue Timeout::Error
|
|
62
65
|
puts 'Request timeout. Will retry in 5 seconds.'
|
|
@@ -88,5 +91,7 @@ module WebTranslateIt
|
|
|
88
91
|
end
|
|
89
92
|
success
|
|
90
93
|
end
|
|
94
|
+
|
|
91
95
|
end
|
|
96
|
+
|
|
92
97
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
class String # rubocop:todo Metrics/ClassLength
|
|
4
|
+
|
|
3
5
|
require 'multi_json'
|
|
4
6
|
|
|
5
7
|
attr_accessor :id, :key, :plural, :type, :dev_comment, :word_count, :status, :category, :labels, :file,
|
|
@@ -265,7 +267,7 @@ module WebTranslateIt
|
|
|
265
267
|
success
|
|
266
268
|
end
|
|
267
269
|
|
|
268
|
-
def to_json(with_translations = false) # rubocop:todo Metrics/AbcSize
|
|
270
|
+
def to_json(with_translations = false) # rubocop:todo Metrics/AbcSize
|
|
269
271
|
hash = {
|
|
270
272
|
'id' => id,
|
|
271
273
|
'key' => key,
|
|
@@ -278,12 +280,14 @@ module WebTranslateIt
|
|
|
278
280
|
'file' => file
|
|
279
281
|
}
|
|
280
282
|
if translations.any? && with_translations
|
|
281
|
-
hash.update({
|
|
283
|
+
hash.update({'translations' => []})
|
|
282
284
|
translations.each do |translation|
|
|
283
285
|
hash['translations'].push(translation.to_hash)
|
|
284
286
|
end
|
|
285
287
|
end
|
|
286
288
|
MultiJson.dump(hash)
|
|
287
289
|
end
|
|
290
|
+
|
|
288
291
|
end
|
|
292
|
+
|
|
289
293
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
class Term # rubocop:todo Metrics/ClassLength
|
|
4
|
+
|
|
3
5
|
require 'net/https'
|
|
4
6
|
require 'multi_json'
|
|
5
7
|
|
|
@@ -255,19 +257,21 @@ module WebTranslateIt
|
|
|
255
257
|
success
|
|
256
258
|
end
|
|
257
259
|
|
|
258
|
-
def to_json(with_translations = false)
|
|
260
|
+
def to_json(with_translations = false)
|
|
259
261
|
hash = {
|
|
260
262
|
'id' => id,
|
|
261
263
|
'text' => text,
|
|
262
264
|
'description' => description
|
|
263
265
|
}
|
|
264
266
|
if translations.any? && with_translations
|
|
265
|
-
hash.update({
|
|
267
|
+
hash.update({'translations' => []})
|
|
266
268
|
translations.each do |translation|
|
|
267
269
|
hash['translations'].push(translation.to_hash)
|
|
268
270
|
end
|
|
269
271
|
end
|
|
270
272
|
MultiJson.dump(hash)
|
|
271
273
|
end
|
|
274
|
+
|
|
272
275
|
end
|
|
276
|
+
|
|
273
277
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
# A TranslationFile is the representation of a master language file
|
|
3
4
|
# on Web Translate It.
|
|
4
5
|
#
|
|
@@ -6,6 +7,7 @@ module WebTranslateIt
|
|
|
6
7
|
# If you pass a Locale to the master language file you will be able to
|
|
7
8
|
# manipulate a _target_ language file.
|
|
8
9
|
class TranslationFile # rubocop:todo Metrics/ClassLength
|
|
10
|
+
|
|
9
11
|
require 'net/https'
|
|
10
12
|
require 'net/http/post/multipart'
|
|
11
13
|
require 'time'
|
|
@@ -99,7 +101,7 @@ module WebTranslateIt
|
|
|
99
101
|
if File.exist?(file_path)
|
|
100
102
|
if force || (remote_checksum != local_checksum)
|
|
101
103
|
File.open(file_path) do |file|
|
|
102
|
-
params = {
|
|
104
|
+
params = {'file' => Multipart::Post::UploadIO.new(file, 'text/plain', file.path), 'merge' => merge, 'ignore_missing' => ignore_missing, 'label' => label, 'low_priority' => low_priority, 'minor_changes' => minor_changes}
|
|
103
105
|
params['name'] = destination_path unless destination_path.nil?
|
|
104
106
|
params['rename_others'] = rename_others
|
|
105
107
|
request = Net::HTTP::Put::Multipart.new(api_url, params)
|
|
@@ -150,7 +152,7 @@ module WebTranslateIt
|
|
|
150
152
|
display.push "#{StringUtil.checksumify(local_checksum.to_s)}..[ ]"
|
|
151
153
|
if File.exist?(file_path)
|
|
152
154
|
File.open(file_path) do |file|
|
|
153
|
-
request = Net::HTTP::Post::Multipart.new(api_url_for_create, {
|
|
155
|
+
request = Net::HTTP::Post::Multipart.new(api_url_for_create, {'name' => file_path, 'file' => Multipart::Post::UploadIO.new(file, 'text/plain', file.path), 'low_priority' => low_priority})
|
|
154
156
|
WebTranslateIt::Util.add_fields(request)
|
|
155
157
|
display.push Util.handle_response(http_connection.request(request))
|
|
156
158
|
puts ArrayUtil.to_columns(display)
|
|
@@ -239,5 +241,7 @@ module WebTranslateIt
|
|
|
239
241
|
''
|
|
240
242
|
end
|
|
241
243
|
end
|
|
244
|
+
|
|
242
245
|
end
|
|
246
|
+
|
|
243
247
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
class HashUtil
|
|
2
|
+
|
|
2
3
|
def self.to_params(hash) # rubocop:todo Metrics/MethodLength
|
|
3
4
|
params = ''
|
|
4
5
|
stack = []
|
|
@@ -24,9 +25,11 @@ class HashUtil
|
|
|
24
25
|
params.chop! # trailing &
|
|
25
26
|
params
|
|
26
27
|
end
|
|
28
|
+
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
class Hash
|
|
32
|
+
|
|
30
33
|
# Destructively convert all keys to strings.
|
|
31
34
|
def stringify_keys!
|
|
32
35
|
keys.each do |key|
|
|
@@ -34,4 +37,5 @@ class Hash
|
|
|
34
37
|
end
|
|
35
38
|
self
|
|
36
39
|
end
|
|
40
|
+
|
|
37
41
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
class StringUtil
|
|
2
|
+
|
|
2
3
|
def self.backward_truncate(str)
|
|
3
4
|
return '...' << str[str.length - 50 + 3..str.length] if str.length > 50
|
|
4
5
|
|
|
@@ -26,4 +27,5 @@ class StringUtil
|
|
|
26
27
|
def self.important(str)
|
|
27
28
|
WebTranslateIt::Util.can_display_colors? ? "\e[1m#{str}\e[0m" : str
|
|
28
29
|
end
|
|
30
|
+
|
|
29
31
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module WebTranslateIt
|
|
2
|
+
|
|
2
3
|
# A few useful functions
|
|
3
4
|
class Util
|
|
5
|
+
|
|
4
6
|
require 'multi_json'
|
|
5
7
|
|
|
6
8
|
# Return a string representing the gem version
|
|
@@ -41,8 +43,7 @@ module WebTranslateIt
|
|
|
41
43
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
42
44
|
|
|
43
45
|
def self.add_fields(request)
|
|
44
|
-
request.add_field('
|
|
45
|
-
request.add_field('X-Client-Version', version)
|
|
46
|
+
request.add_field('User-Agent', "wti v#{version}")
|
|
46
47
|
request.add_field('Content-Type', 'application/json')
|
|
47
48
|
end
|
|
48
49
|
|
|
@@ -51,26 +52,26 @@ module WebTranslateIt
|
|
|
51
52
|
|
|
52
53
|
def self.ask_yes_no(question, default = nil) # rubocop:todo Metrics/MethodLength
|
|
53
54
|
qstr = case default
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
when nil
|
|
56
|
+
'yn'
|
|
57
|
+
when true
|
|
58
|
+
'Yn'
|
|
59
|
+
else
|
|
60
|
+
'yN'
|
|
61
|
+
end
|
|
61
62
|
|
|
62
63
|
result = nil
|
|
63
64
|
|
|
64
65
|
while result.nil?
|
|
65
66
|
result = ask("#{question} [#{qstr}]")
|
|
66
67
|
result = case result
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
when /^[Yy].*/
|
|
69
|
+
true
|
|
70
|
+
when /^[Nn].*/
|
|
71
|
+
false
|
|
72
|
+
when '', nil
|
|
73
|
+
default
|
|
74
|
+
end
|
|
74
75
|
end
|
|
75
76
|
|
|
76
77
|
result
|
|
@@ -96,5 +97,7 @@ module WebTranslateIt
|
|
|
96
97
|
def self.can_display_colors?
|
|
97
98
|
!RUBY_PLATFORM.downcase.include?('mingw32')
|
|
98
99
|
end
|
|
100
|
+
|
|
99
101
|
end
|
|
102
|
+
|
|
100
103
|
end
|
data/lib/web_translate_it.rb
CHANGED
|
@@ -16,6 +16,7 @@ require 'web_translate_it/project'
|
|
|
16
16
|
require 'English'
|
|
17
17
|
|
|
18
18
|
module WebTranslateIt
|
|
19
|
+
|
|
19
20
|
def self.fetch_translations # rubocop:todo Metrics/AbcSize
|
|
20
21
|
config = Configuration.new
|
|
21
22
|
locale = I18n.locale.to_s
|
|
@@ -28,4 +29,5 @@ module WebTranslateIt
|
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
end
|
|
32
|
+
|
|
31
33
|
end
|
data/readme.md
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
[RubyDoc](https://www.rubydoc.info/gems/web_translate_it/) |
|
|
4
4
|
[Report a bug](https://github.com/webtranslateit/webtranslateit/issues) |
|
|
5
5
|
[Support](https://webtranslateit.com/support) |
|
|
6
|
-
[WebTranslateIt.com Homepage](https://webtranslateit.com)
|
|
6
|
+
[WebTranslateIt.com Homepage](https://webtranslateit.com) |
|
|
7
|
+
[Docker Package](https://github.com/webtranslateit/wti-docker/pkgs/container/wti-docker)
|
|
7
8
|
|
|
8
9
|
wti lets you easily sync your language files with [WebTranslateIt.com](https://webtranslateit.com), a web-based tool to translation software.
|
|
9
10
|
|
|
@@ -11,7 +12,7 @@ wti lets you easily sync your language files with [WebTranslateIt.com](https://w
|
|
|
11
12
|
|
|
12
13
|
### wti...
|
|
13
14
|
|
|
14
|
-
* wti is a **command-line tool**. It works on all operating systems: Windows, Linux, MacOS X...
|
|
15
|
+
* wti is a **command-line tool**. It works on all operating systems: Windows, Linux, MacOS X, ... It is also available as a [Docker package](https://github.com/webtranslateit/wti-docker/pkgs/container/wti-docker).
|
|
15
16
|
* wti is really easy to use. It was inspired by git. Use `wti push` and `wti pull` to sync your language files with WebTranslateIt.com.
|
|
16
17
|
|
|
17
18
|
### Optionally, wti does...
|
|
@@ -24,12 +25,12 @@ wti lets you easily sync your language files with [WebTranslateIt.com](https://w
|
|
|
24
25
|
|
|
25
26
|
## Installation
|
|
26
27
|
|
|
27
|
-
You will also need ruby to run `wti`. On Linux or a Mac, it’s already installed. Install [RubyInstaller](http://rubyinstaller.org/) if you’re using Windows. [See detailed installation instructions for Windows users](https://github.com/webtranslateit/webtranslateit/wiki/Install-wti-on-Windows).
|
|
28
|
+
You will also need ruby to run `wti`. We require ruby version 2.6 or newer. On Linux or a Mac, it’s already installed. Install [RubyInstaller](http://rubyinstaller.org/) if you’re using Windows. [See detailed installation instructions for Windows users](https://github.com/webtranslateit/webtranslateit/wiki/Install-wti-on-Windows).
|
|
28
29
|
|
|
29
30
|
``` bash
|
|
30
31
|
$ gem install web_translate_it
|
|
31
|
-
Fetching: web_translate_it-2.
|
|
32
|
-
Successfully installed web_translate_it-2.
|
|
32
|
+
Fetching: web_translate_it-2.6.4.gem (100%)
|
|
33
|
+
Successfully installed web_translate_it-2.6.4
|
|
33
34
|
1 gem installed
|
|
34
35
|
```
|
|
35
36
|
|
|
@@ -37,26 +38,14 @@ At this point you should have the `wti` executable working:
|
|
|
37
38
|
|
|
38
39
|
``` bash
|
|
39
40
|
$ wti -v
|
|
40
|
-
wti version 2.
|
|
41
|
+
wti version 2.6.4
|
|
41
42
|
```
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
``` bash
|
|
46
|
-
$ wti
|
|
47
|
-
If 'wti' is not a typo you can use command-not-found to lookup the package that contains it, like this:
|
|
48
|
-
cnf wti
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
The reason is that the wti file is named in another way: `/usr/bin/wti.ruby2.1` so you will have to create a symlink to make wti run.
|
|
52
|
-
|
|
53
|
-
``` bash
|
|
54
|
-
# ln -s /usr/bin/wti.ruby2.1 /usr/bin/wti
|
|
55
|
-
```
|
|
44
|
+
We also provide `wti` as a Docker packages. [See our packages and instructions to install](https://github.com/webtranslateit/wti-docker/pkgs/container/wti-docker).
|
|
56
45
|
|
|
57
46
|
## Configuration
|
|
58
47
|
|
|
59
|
-
Now that
|
|
48
|
+
Now that `wti` is installed, you’ll have to configure your project. Basically, `wti` is to be run on a project root directory, and looks for a `.wti` file containing your project information. The command `wti init` lets your create your `.wti` file.
|
|
60
49
|
|
|
61
50
|
``` bash
|
|
62
51
|
$ wti init proj_pvt_V8skdjsdDDA4
|
|
@@ -217,7 +206,7 @@ There are 4 hooks:
|
|
|
217
206
|
* `before_push`
|
|
218
207
|
* `after_push`
|
|
219
208
|
|
|
220
|
-
Check the [sample `.wti`](https://github.com/webtranslateit/webtranslateit/blob/
|
|
209
|
+
Check the [sample `.wti`](https://github.com/webtranslateit/webtranslateit/blob/main/examples/.wti#L21-L28) file for implementation.
|
|
221
210
|
|
|
222
211
|
## Exit codes
|
|
223
212
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: web_translate_it
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Edouard Briere
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-10-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: multi_json
|
|
@@ -52,76 +52,6 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '3.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: guard-rspec
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: guard-rubocop
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: rspec
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: 2.6.0
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: 2.6.0
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: rubocop
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: simplecov
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - ">="
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0'
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
55
|
description: A Command Line Interface tool to push and pull language files to WebTranslateIt.com.
|
|
126
56
|
email: support@webtranslateit.com
|
|
127
57
|
executables:
|
|
@@ -184,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
184
114
|
- !ruby/object:Gem::Version
|
|
185
115
|
version: '0'
|
|
186
116
|
requirements: []
|
|
187
|
-
rubygems_version: 3.
|
|
117
|
+
rubygems_version: 3.3.21
|
|
188
118
|
signing_key:
|
|
189
119
|
specification_version: 4
|
|
190
120
|
summary: A CLI tool to sync locale files with WebTranslateIt.com.
|