phrase 0.4.14 → 0.4.15
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 +15 -0
- data/lib/ext/hash.rb +1 -1
- data/lib/generators/phrase/install_generator.rb +1 -1
- data/lib/generators/templates/phrase.rb +4 -4
- data/lib/phrase/adapters/fast_gettext.rb +3 -3
- data/lib/phrase/api/client.rb +27 -27
- data/lib/phrase/api/config.rb +3 -3
- data/lib/phrase/api/exceptions.rb +1 -1
- data/lib/phrase/api/query_params.rb +2 -2
- data/lib/phrase/backend/phrase_service.rb +12 -12
- data/lib/phrase/cache.rb +7 -7
- data/lib/phrase/config.rb +18 -18
- data/lib/phrase/delegate.rb +2 -2
- data/lib/phrase/delegate/fast_gettext.rb +1 -1
- data/lib/phrase/delegate/i18n.rb +26 -26
- data/lib/phrase/formats.rb +15 -13
- data/lib/phrase/formats/csv.rb +1 -1
- data/lib/phrase/formats/custom.rb +2 -2
- data/lib/phrase/formats/gettext.rb +1 -1
- data/lib/phrase/formats/ini.rb +1 -1
- data/lib/phrase/formats/json.rb +1 -1
- data/lib/phrase/formats/node_json.rb +23 -0
- data/lib/phrase/formats/php_array.rb +1 -1
- data/lib/phrase/formats/plist.rb +1 -1
- data/lib/phrase/formats/properties.rb +1 -1
- data/lib/phrase/formats/properties_xml.rb +1 -1
- data/lib/phrase/formats/qt_phrase_book.rb +1 -1
- data/lib/phrase/formats/qt_translation_source.rb +2 -2
- data/lib/phrase/formats/resx.rb +1 -1
- data/lib/phrase/formats/resx_windowsphone.rb +1 -1
- data/lib/phrase/formats/simple_json.rb +2 -2
- data/lib/phrase/formats/strings.rb +4 -4
- data/lib/phrase/formats/tmx.rb +2 -2
- data/lib/phrase/formats/xliff.rb +2 -2
- data/lib/phrase/formats/xml.rb +6 -6
- data/lib/phrase/formats/yaml.rb +2 -2
- data/lib/phrase/formats/yaml_symfony.rb +2 -2
- data/lib/phrase/tool.rb +2 -2
- data/lib/phrase/tool/commands.rb +1 -1
- data/lib/phrase/tool/commands/base.rb +14 -14
- data/lib/phrase/tool/commands/init.rb +4 -4
- data/lib/phrase/tool/commands/pull.rb +13 -13
- data/lib/phrase/tool/commands/show_help.rb +1 -1
- data/lib/phrase/tool/commands/show_version.rb +3 -3
- data/lib/phrase/tool/commands/tags.rb +1 -1
- data/lib/phrase/tool/config.rb +3 -3
- data/lib/phrase/tool/encoding_detector.rb +3 -3
- data/lib/phrase/tool/locale.rb +8 -8
- data/lib/phrase/tool/options.rb +3 -3
- data/lib/phrase/tool/options_factory.rb +11 -11
- data/lib/phrase/tool/tag_validator.rb +2 -2
- data/lib/phrase/version.rb +1 -1
- data/lib/phrase/view_helpers.rb +2 -2
- metadata +66 -37
data/lib/phrase/delegate.rb
CHANGED
@@ -5,7 +5,7 @@ module Phrase::Delegate
|
|
5
5
|
def to_s
|
6
6
|
"#{decorated_key_name}"
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def self.log(message)
|
10
10
|
message = "phrase: #{message}"
|
11
11
|
if defined?(Rails) and Rails.respond_to?(:logger)
|
@@ -14,7 +14,7 @@ module Phrase::Delegate
|
|
14
14
|
$stderr.puts message
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
protected
|
19
19
|
def decorated_key_name
|
20
20
|
"#{Phrase.prefix}phrase_#{normalized_display_key}#{Phrase.suffix}"
|
data/lib/phrase/delegate/i18n.rb
CHANGED
@@ -8,19 +8,19 @@ require 'set'
|
|
8
8
|
|
9
9
|
class Phrase::Delegate::I18n < Phrase::Delegate::Base
|
10
10
|
attr_accessor :key, :display_key, :options, :api_client, :fallback_keys, :original_args
|
11
|
-
|
11
|
+
|
12
12
|
def initialize(key, options={}, original_args=nil)
|
13
13
|
@display_key = @key = key
|
14
14
|
@options = options
|
15
15
|
@original_args = original_args
|
16
|
-
|
16
|
+
|
17
17
|
@fallback_keys = []
|
18
|
-
|
18
|
+
|
19
19
|
extract_fallback_keys
|
20
20
|
identify_key_to_display if @fallback_keys.any?
|
21
21
|
super(decorated_key_name)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def method_missing(*args, &block)
|
25
25
|
self.class.log "Trying to execute missing method ##{args.first} on key #{@key}"
|
26
26
|
|
@@ -38,7 +38,7 @@ class Phrase::Delegate::I18n < Phrase::Delegate::Base
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
private
|
43
43
|
def identify_key_to_display
|
44
44
|
key_names = [@key] | @fallback_keys
|
@@ -51,28 +51,28 @@ private
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
def find_keys_within_phrase(key_names)
|
56
56
|
key_names_to_check_against_api = key_names - pre_fetched(key_names)
|
57
57
|
pre_cached(key_names) | key_names_returned_from_api_for(key_names_to_check_against_api)
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def pre_cached(key_names)
|
61
61
|
warm_translation_key_names_cache unless cache.cached?(:translation_key_names)
|
62
62
|
pre_cached_key_names = key_names.select { |key_name| key_name_precached?(key_name) }
|
63
63
|
pre_cached_key_names
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def pre_fetched(key_names)
|
67
67
|
key_names.select { |key_name| covered_by_initial_caching?(key_name) }
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def key_name_precached?(key_name)
|
71
71
|
covered = covered_by_initial_caching?(key_name)
|
72
|
-
in_cache = key_name_is_in_cache?(key_name)
|
73
|
-
covered && in_cache
|
72
|
+
in_cache = key_name_is_in_cache?(key_name)
|
73
|
+
covered && in_cache
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
def key_names_returned_from_api_for(key_names)
|
77
77
|
if key_names.size > 0
|
78
78
|
api_client.find_keys_by_name(key_names).map { |key| key["name"] }
|
@@ -80,15 +80,15 @@ private
|
|
80
80
|
[]
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def key_name_is_in_cache?(key_name)
|
85
85
|
cache.get(:translation_key_names).include?(key_name)
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def covered_by_initial_caching?(key_name)
|
89
89
|
key_name.start_with?(*Phrase.cache_key_segments_initial)
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
def extract_fallback_keys
|
93
93
|
fallback_items = []
|
94
94
|
if @options.has_key?(:default)
|
@@ -98,16 +98,16 @@ private
|
|
98
98
|
fallback_items << @options[:default]
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
fallback_items.each do |item|
|
103
103
|
process_fallback_item(item)
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
def scoped(item)
|
108
108
|
@options.has_key?(:scope) ? "#{@options[:scope]}.#{item}" : item
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
def process_fallback_item(item)
|
112
112
|
if item.kind_of?(Symbol)
|
113
113
|
entry = scoped(item.to_s)
|
@@ -121,7 +121,7 @@ private
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
def translation_or_subkeys
|
126
126
|
begin
|
127
127
|
api_client.translate(@key)
|
@@ -129,33 +129,33 @@ private
|
|
129
129
|
self.class.log "Server Error: #{e.message}"
|
130
130
|
end
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
def api_client
|
134
134
|
@api_client ||= Phrase::Api::Client.new(Phrase.auth_token)
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
def cache
|
138
138
|
Thread.current[:phrase_cache] ||= build_cache
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
def build_cache
|
142
142
|
cache = Phrase::Cache.new
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
def warm_translation_key_names_cache
|
146
146
|
cache.set(:translation_key_names, prefetched_key_names)
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
def prefetched_key_names
|
150
150
|
prefetched = Set.new
|
151
|
-
Phrase.cache_key_segments_initial.each do |segment|
|
151
|
+
Phrase.cache_key_segments_initial.each do |segment|
|
152
152
|
result = api_client.translate(segment)
|
153
153
|
prefetched.add(segment) if result.is_a?(String)
|
154
154
|
prefetched = prefetched.merge(key_names_from_nested(segment, result))
|
155
155
|
end
|
156
156
|
prefetched
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
def key_names_from_nested(segment, data)
|
160
160
|
key_names = Set.new
|
161
161
|
Phrase::HashFlattener.flatten(data, nil) do |key, value|
|
data/lib/phrase/formats.rb
CHANGED
@@ -16,6 +16,7 @@ module Phrase
|
|
16
16
|
autoload :Resx, 'phrase/formats/resx'
|
17
17
|
autoload :ResxWindowsphone, 'phrase/formats/resx_windowsphone'
|
18
18
|
autoload :SimpleJson, 'phrase/formats/simple_json'
|
19
|
+
autoload :NodeJson, 'phrase/formats/node_json'
|
19
20
|
autoload :Strings, 'phrase/formats/strings'
|
20
21
|
autoload :Xml, 'phrase/formats/xml'
|
21
22
|
autoload :Tmx, 'phrase/formats/tmx'
|
@@ -23,7 +24,7 @@ module Phrase
|
|
23
24
|
autoload :Yaml, 'phrase/formats/yaml'
|
24
25
|
autoload :YamlSymfony, 'phrase/formats/yaml_symfony'
|
25
26
|
autoload :PhpArray, 'phrase/formats/php_array'
|
26
|
-
|
27
|
+
|
27
28
|
class Base
|
28
29
|
def self.supports_extension?(extension)
|
29
30
|
self.extensions.map(&:to_s).include?(extension.to_s)
|
@@ -36,19 +37,19 @@ module Phrase
|
|
36
37
|
def self.directory_for_locale(locale)
|
37
38
|
"./"
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
def self.filename_for_locale(locale)
|
41
42
|
raise "not implemented"
|
42
43
|
end
|
43
|
-
|
44
|
+
|
44
45
|
def self.extract_locale_name_from_file_path(file_path)
|
45
46
|
nil
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
def self.default_locale_name
|
49
50
|
Phrase::Tool::Locale.find_default_locale.try(:name)
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
def self.locale_aware?
|
53
54
|
false
|
54
55
|
end
|
@@ -56,7 +57,7 @@ module Phrase
|
|
56
57
|
def self.target_directory
|
57
58
|
"phrase/locales/"
|
58
59
|
end
|
59
|
-
|
60
|
+
|
60
61
|
def self.config
|
61
62
|
@config ||= get_config
|
62
63
|
end
|
@@ -67,7 +68,7 @@ module Phrase
|
|
67
68
|
end
|
68
69
|
private_class_method :config
|
69
70
|
end
|
70
|
-
|
71
|
+
|
71
72
|
SUPPORTED_FORMATS = {
|
72
73
|
custom: Phrase::Formats::Custom,
|
73
74
|
json: Phrase::Formats::Json,
|
@@ -83,6 +84,7 @@ module Phrase
|
|
83
84
|
resx: Phrase::Formats::Resx,
|
84
85
|
resx_windowsphone: Phrase::Formats::ResxWindowsphone,
|
85
86
|
simple_json: Phrase::Formats::SimpleJson,
|
87
|
+
node_json: Phrase::Formats::NodeJson,
|
86
88
|
strings: Phrase::Formats::Strings,
|
87
89
|
xml: Phrase::Formats::Xml,
|
88
90
|
tmx: Phrase::Formats::Tmx,
|
@@ -109,34 +111,34 @@ module Phrase
|
|
109
111
|
handler = handler_class_for_format(format_name)
|
110
112
|
custom_handler.target_directory || handler.target_directory
|
111
113
|
end
|
112
|
-
|
114
|
+
|
113
115
|
def self.directory_for_locale_in_format(locale, format_name)
|
114
116
|
handler = handler_class_for_format(format_name)
|
115
117
|
custom_directory = custom_handler.directory_for_locale(locale, format_name)
|
116
118
|
custom_directory || handler.directory_for_locale(locale)
|
117
119
|
end
|
118
|
-
|
120
|
+
|
119
121
|
def self.filename_for_locale_in_format(locale, format_name)
|
120
122
|
handler = handler_class_for_format(format_name)
|
121
123
|
custom_filename = custom_handler.filename_for_locale(locale, format_name)
|
122
124
|
custom_filename || handler.filename_for_locale(locale)
|
123
125
|
end
|
124
|
-
|
126
|
+
|
125
127
|
def self.file_format_exposes_locale?(file_path)
|
126
128
|
format = guess_possible_file_format_from_file_path(file_path)
|
127
129
|
format.nil? ? false : handler_class_for_format(format).locale_aware?
|
128
130
|
end
|
129
|
-
|
131
|
+
|
130
132
|
def self.detect_locale_name_from_file_path(file_path)
|
131
133
|
format = guess_possible_file_format_from_file_path(file_path)
|
132
134
|
format.nil? ? nil : handler_class_for_format(format).extract_locale_name_from_file_path(file_path)
|
133
135
|
end
|
134
|
-
|
136
|
+
|
135
137
|
def self.handler_class_for_format(format_name)
|
136
138
|
SUPPORTED_FORMATS.fetch(format_name.to_sym)
|
137
139
|
end
|
138
140
|
private_class_method :handler_class_for_format
|
139
|
-
|
141
|
+
|
140
142
|
def self.guess_possible_file_format_from_file_path(file_path)
|
141
143
|
extension = extension_from_file_path(file_path)
|
142
144
|
possible_format = SUPPORTED_FORMATS.keys.find do |format|
|
data/lib/phrase/formats/csv.rb
CHANGED
@@ -9,10 +9,10 @@ class Phrase::Formats::Custom < Phrase::Formats::Base
|
|
9
9
|
|
10
10
|
def self.filename_for_locale(locale, format)
|
11
11
|
setting = config.locale_filename
|
12
|
-
return unless setting
|
12
|
+
return unless setting
|
13
13
|
parse(setting, locale, format)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.target_directory
|
17
17
|
config.target_directory
|
18
18
|
end
|
data/lib/phrase/formats/ini.rb
CHANGED
data/lib/phrase/formats/json.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Phrase
|
4
|
+
module Formats
|
5
|
+
class NodeJson < Phrase::Formats::Base
|
6
|
+
def self.filename_for_locale(locale)
|
7
|
+
"#{locale.name}.js"
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.locale_aware?
|
11
|
+
false
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.extensions
|
15
|
+
[:js]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.target_directory
|
19
|
+
'locales/'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/phrase/formats/plist.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
module Phrase
|
4
|
-
module Formats
|
4
|
+
module Formats
|
5
5
|
class QtTranslationSource < Phrase::Formats::Base
|
6
6
|
def self.filename_for_locale(locale)
|
7
7
|
"phrase.#{locale.name}.ts"
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def self.locale_aware?
|
11
11
|
true
|
12
12
|
end
|
data/lib/phrase/formats/resx.rb
CHANGED