phrase 0.3.1 → 0.3.2
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/.gitignore +4 -1
- data/Guardfile +29 -0
- data/README.md +1 -1
- data/lib/phrase.rb +8 -9
- data/lib/phrase/adapters/fast_gettext.rb +22 -0
- data/lib/phrase/adapters/i18n.rb +11 -0
- data/lib/phrase/api/client.rb +1 -1
- data/lib/phrase/backend/phrase_service.rb +2 -2
- data/lib/phrase/delegate.rb +13 -165
- data/lib/phrase/delegate/fast_gettext.rb +27 -0
- data/lib/phrase/delegate/i18n.rb +159 -0
- data/lib/phrase/tool.rb +1 -1
- data/lib/phrase/tool/commands/base.rb +1 -1
- data/lib/phrase/tool/commands/init.rb +13 -5
- data/lib/phrase/tool/commands/pull.rb +11 -8
- data/lib/phrase/tool/commands/push.rb +11 -2
- data/lib/phrase/tool/config.rb +55 -1
- data/lib/phrase/tool/encoding_detector.rb +4 -2
- data/lib/phrase/tool/formats.rb +33 -4
- data/lib/phrase/tool/formats/base.rb +23 -1
- data/lib/phrase/tool/formats/custom.rb +38 -0
- data/lib/phrase/tool/formats/gettext.rb +14 -2
- data/lib/phrase/tool/formats/gettext_pot.rb +11 -0
- data/lib/phrase/tool/formats/ini.rb +4 -0
- data/lib/phrase/tool/formats/json.rb +4 -0
- data/lib/phrase/tool/formats/plist.rb +5 -1
- data/lib/phrase/tool/formats/properties.rb +4 -0
- data/lib/phrase/tool/formats/qt_phrase_book.rb +4 -0
- data/lib/phrase/tool/formats/qt_translation_source.rb +4 -0
- data/lib/phrase/tool/formats/resx.rb +4 -0
- data/lib/phrase/tool/formats/strings.rb +9 -1
- data/lib/phrase/tool/formats/xliff.rb +4 -0
- data/lib/phrase/tool/formats/xml.rb +7 -4
- data/lib/phrase/tool/formats/yaml.rb +4 -0
- data/lib/phrase/tool/options.rb +13 -52
- data/lib/phrase/tool/options_factory.rb +77 -0
- data/lib/phrase/version.rb +1 -1
- metadata +74 -21
@@ -10,14 +10,22 @@ class Phrase::Tool::Formats::Strings < Phrase::Tool::Formats::Base
|
|
10
10
|
"Localizable.strings"
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.target_directory
|
14
|
+
"./"
|
15
|
+
end
|
16
|
+
|
13
17
|
def self.extract_locale_name_from_file_path(file_path)
|
14
18
|
file_path.scan(/\/([a-zA-Z\-_]*).lproj\//i).first.try(:first)
|
15
19
|
end
|
16
20
|
|
21
|
+
def self.locale_aware?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
17
25
|
def self.formatted(name)
|
18
26
|
return name unless name.include?("-")
|
19
27
|
parts = name.split("-")
|
20
28
|
"#{parts.first}_#{parts.last.upcase}"
|
21
29
|
end
|
22
30
|
private_class_method :formatted
|
23
|
-
end
|
31
|
+
end
|
@@ -13,6 +13,10 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
|
|
13
13
|
def self.filename_for_locale(locale)
|
14
14
|
"strings.xml"
|
15
15
|
end
|
16
|
+
|
17
|
+
def self.target_directory
|
18
|
+
"res/"
|
19
|
+
end
|
16
20
|
|
17
21
|
def self.extract_locale_name_from_file_path(file_path)
|
18
22
|
return default_locale_name if file_path.scan(/\/values\/strings.xml/i).first
|
@@ -24,10 +28,9 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
|
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
|
-
def self.
|
28
|
-
|
31
|
+
def self.locale_aware?
|
32
|
+
true
|
29
33
|
end
|
30
|
-
private_class_method :default_locale_name
|
31
34
|
|
32
35
|
def self.formatted(name)
|
33
36
|
return name unless name.include?("-")
|
@@ -35,4 +38,4 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
|
|
35
38
|
"#{parts.first}-r#{parts.last.upcase}"
|
36
39
|
end
|
37
40
|
private_class_method :formatted
|
38
|
-
end
|
41
|
+
end
|
data/lib/phrase/tool/options.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
-
require '
|
3
|
+
require File.expand_path('../options_factory', __FILE__)
|
4
4
|
|
5
5
|
class Phrase::Tool::Options
|
6
|
-
|
7
6
|
def initialize(args, command="")
|
8
7
|
@command = command
|
8
|
+
# specify all possible arguments here
|
9
9
|
@data = {
|
10
10
|
default: {
|
11
11
|
version: false,
|
@@ -13,7 +13,13 @@ class Phrase::Tool::Options
|
|
13
13
|
},
|
14
14
|
init: {
|
15
15
|
secret: "",
|
16
|
-
default_locale: "en"
|
16
|
+
default_locale: "en",
|
17
|
+
domain: "phrase",
|
18
|
+
default_target: nil,
|
19
|
+
format: nil,
|
20
|
+
locale_filename: nil,
|
21
|
+
locale_directory: nil,
|
22
|
+
target_directory: nil
|
17
23
|
},
|
18
24
|
push: {
|
19
25
|
tags: [],
|
@@ -21,8 +27,8 @@ class Phrase::Tool::Options
|
|
21
27
|
locale: nil
|
22
28
|
},
|
23
29
|
pull: {
|
24
|
-
format:
|
25
|
-
target:
|
30
|
+
format: nil,
|
31
|
+
target: nil
|
26
32
|
}
|
27
33
|
}
|
28
34
|
options.parse!(args)
|
@@ -37,55 +43,10 @@ class Phrase::Tool::Options
|
|
37
43
|
private
|
38
44
|
|
39
45
|
def options
|
40
|
-
|
41
|
-
when :init
|
42
|
-
OptionParser.new do |opts|
|
43
|
-
opts.on("--secret=YOUR_AUTH_TOKEN", String, "Your auth token") do |secret|
|
44
|
-
@data[command_name][:secret] = secret
|
45
|
-
end
|
46
|
-
|
47
|
-
opts.on("--default-locale=en", String, "The default locale for your application") do |default_locale|
|
48
|
-
@data[command_name][:default_locale] = default_locale
|
49
|
-
end
|
50
|
-
end
|
51
|
-
when :push
|
52
|
-
OptionParser.new do |opts|
|
53
|
-
opts.on("--tags=foo,bar", Array, "List of tags for phrase push (separated by comma)") do |tags|
|
54
|
-
@data[command_name][:tags] = tags
|
55
|
-
end
|
56
|
-
|
57
|
-
opts.on("-R", "--recursive", "Push files in subfolders as well (recursively)") do |recursive|
|
58
|
-
@data[command_name][:recursive] = true
|
59
|
-
end
|
60
|
-
|
61
|
-
opts.on("--locale=en", String, "Locale of the translations your file contain (required for formats that do not include the name of the locale in the file content)") do |locale|
|
62
|
-
@data[command_name][:locale] = locale
|
63
|
-
end
|
64
|
-
end
|
65
|
-
when :pull
|
66
|
-
OptionParser.new do |opts|
|
67
|
-
opts.on("--format=yml", String, "See documentation for list of allowed locales") do |format|
|
68
|
-
@data[command_name][:format] = format
|
69
|
-
end
|
70
|
-
|
71
|
-
opts.on("--target=./phrase/locales", String, "Target folder to store locale files") do |target|
|
72
|
-
@data[command_name][:target] = target
|
73
|
-
end
|
74
|
-
end
|
75
|
-
else
|
76
|
-
OptionParser.new do |opts|
|
77
|
-
opts.on_tail("-v", "--version", "Show version number") do |version|
|
78
|
-
@data[:default][:version] = true
|
79
|
-
end
|
80
|
-
|
81
|
-
opts.on_tail("-h", "--help", "Show help") do |help|
|
82
|
-
@data[:default][:help] = true
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
46
|
+
OptionsFactory.options_for(command_name, @data)
|
86
47
|
end
|
87
48
|
|
88
49
|
def command_name
|
89
50
|
@command_name ||= (@command.present? and @data.has_key?(@command.to_sym)) ? @command.to_sym : :default
|
90
51
|
end
|
91
|
-
end
|
52
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
class OptionsFactory
|
4
|
+
def self.options_for(command, options)
|
5
|
+
OptionParser.new do |opts|
|
6
|
+
self.send(command, opts, options[command])
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.init(opts, set)
|
11
|
+
opts.on("--secret=YOUR_AUTH_TOKEN", String, "Your auth token") do |secret|
|
12
|
+
set[:secret] = secret
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("--default-locale=en", String, "The default locale for your application") do |default_locale|
|
16
|
+
set[:default_locale] = default_locale
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("--default-format=json", String, "The default format for locale files") do |format|
|
20
|
+
set[:format] = format
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on("--domain=phrase", String, "The default domain or app prefix for locale files") do |domain|
|
24
|
+
set[:domain] = domain
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("--locale-directory=./", String, "The directory naming for locale files, e.g ./<locale.name>/ for subfolders with 'en' or 'de'") do |locale_directory|
|
28
|
+
set[:locale_directory] = locale_directory
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("--locale-filename=<domain>.<format>", String, "The filename for locale files") do |locale_filename|
|
32
|
+
set[:locale_filename] = locale_filename
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("--default-target=phrase/locales/", String, "The default target directory for locale files") do |target_directory|
|
36
|
+
set[:target_directory] = target_directory
|
37
|
+
end
|
38
|
+
end
|
39
|
+
private_class_method :init
|
40
|
+
|
41
|
+
def self.push(opts, set)
|
42
|
+
opts.on("--tags=foo,bar", Array, "List of tags for phrase push (separated by comma)") do |tags|
|
43
|
+
set[:tags] = tags
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on("-R", "--recursive", "Push files in subfolders as well (recursively)") do |recursive|
|
47
|
+
set[:recursive] = true
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on("--locale=en", String, "Locale of the translations your file contain (required for formats that do not include the name of the locale in the file content)") do |locale|
|
51
|
+
set[:locale] = locale
|
52
|
+
end
|
53
|
+
end
|
54
|
+
private_class_method :push
|
55
|
+
|
56
|
+
def self.pull(opts, set)
|
57
|
+
opts.on("--format=yml", String, "See documentation for list of allowed locales") do |format|
|
58
|
+
set[:format] = format
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.on("--target=./phrase/locales", String, "Target folder to store locale files") do |target|
|
62
|
+
set[:target] = target
|
63
|
+
end
|
64
|
+
end
|
65
|
+
private_class_method :pull
|
66
|
+
|
67
|
+
def self.default(opts, set)
|
68
|
+
opts.on_tail("-v", "--version", "Show version number") do |version|
|
69
|
+
set[:version] = true
|
70
|
+
end
|
71
|
+
|
72
|
+
opts.on_tail("-h", "--help", "Show help") do |help|
|
73
|
+
set[:help] = true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
private_class_method :default
|
77
|
+
end
|
data/lib/phrase/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phrase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: addressable
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 2.2.8
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.2.8
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: colorize
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: json
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: rspec
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: i18n
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: '0'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: webmock
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ! '>='
|
@@ -87,10 +117,15 @@ dependencies:
|
|
87
117
|
version: '0'
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: vcr
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ! '>='
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: '0'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
143
|
name: timecop
|
104
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ! '>='
|
@@ -109,7 +149,12 @@ dependencies:
|
|
109
149
|
version: '0'
|
110
150
|
type: :development
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
113
158
|
description: phrase allows you to edit translations in-place on the page itself. More
|
114
159
|
information at phraseapp.com
|
115
160
|
email:
|
@@ -122,12 +167,15 @@ files:
|
|
122
167
|
- .gitignore
|
123
168
|
- Gemfile
|
124
169
|
- Gemfile.lock
|
170
|
+
- Guardfile
|
125
171
|
- LICENSE
|
126
172
|
- README.md
|
127
173
|
- Rakefile
|
128
174
|
- bin/phrase
|
129
175
|
- cacert.pem
|
130
176
|
- lib/phrase.rb
|
177
|
+
- lib/phrase/adapters/fast_gettext.rb
|
178
|
+
- lib/phrase/adapters/i18n.rb
|
131
179
|
- lib/phrase/api.rb
|
132
180
|
- lib/phrase/api/client.rb
|
133
181
|
- lib/phrase/api/config.rb
|
@@ -138,6 +186,8 @@ files:
|
|
138
186
|
- lib/phrase/cache.rb
|
139
187
|
- lib/phrase/config.rb
|
140
188
|
- lib/phrase/delegate.rb
|
189
|
+
- lib/phrase/delegate/fast_gettext.rb
|
190
|
+
- lib/phrase/delegate/i18n.rb
|
141
191
|
- lib/phrase/engine.rb
|
142
192
|
- lib/phrase/hash_flattener.rb
|
143
193
|
- lib/phrase/tool.rb
|
@@ -152,7 +202,9 @@ files:
|
|
152
202
|
- lib/phrase/tool/encoding_detector.rb
|
153
203
|
- lib/phrase/tool/formats.rb
|
154
204
|
- lib/phrase/tool/formats/base.rb
|
205
|
+
- lib/phrase/tool/formats/custom.rb
|
155
206
|
- lib/phrase/tool/formats/gettext.rb
|
207
|
+
- lib/phrase/tool/formats/gettext_pot.rb
|
156
208
|
- lib/phrase/tool/formats/ini.rb
|
157
209
|
- lib/phrase/tool/formats/json.rb
|
158
210
|
- lib/phrase/tool/formats/plist.rb
|
@@ -166,6 +218,7 @@ files:
|
|
166
218
|
- lib/phrase/tool/formats/yaml.rb
|
167
219
|
- lib/phrase/tool/locale.rb
|
168
220
|
- lib/phrase/tool/options.rb
|
221
|
+
- lib/phrase/tool/options_factory.rb
|
169
222
|
- lib/phrase/tool/tag_validator.rb
|
170
223
|
- lib/phrase/version.rb
|
171
224
|
- lib/phrase/view_helpers.rb
|
@@ -190,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
243
|
version: 1.3.6
|
191
244
|
requirements: []
|
192
245
|
rubyforge_project: phrase
|
193
|
-
rubygems_version: 1.8.
|
246
|
+
rubygems_version: 1.8.24
|
194
247
|
signing_key:
|
195
248
|
specification_version: 3
|
196
249
|
summary: The best way to manage i18n.
|