tml 5.1.4 → 5.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4a9a78a9ef6974fe0a3fa94d61eff6e3a46cfd4
4
- data.tar.gz: c7d7048f4bd19193b965841ebaa2dce4df5a30c1
3
+ metadata.gz: f9015ca0a3d1822fed10c823c64a1a903cfda847
4
+ data.tar.gz: 2706039cc562814eabda1d87f962af80238615d2
5
5
  SHA512:
6
- metadata.gz: 8204a7e9fa2db257d53445beb0ed0dd7ad1c7f207b49ac5c98e8b3d80e86c6849486ff5a7c31c43476551eb8f904f1e4a1a46621bf733c73dbf14d5b70511361
7
- data.tar.gz: 7bf3bfb7c10d0b9cb288926ab23c2c5c4af9ade547306afef0164489b54c5ff8b4664cd8aa49ecd096d9458e5c2716d9340f877cbeb5de4df79448e74ad53bf4
6
+ metadata.gz: 3faa10615d43f63cd29f05d631ce1c2c2da7c142f57b1cb9196031c0619cdc2f12af9262ca17ae89e220310e512e29b0a89e4fb92e0a0859b8d12c34b34fa917
7
+ data.tar.gz: fb89ecb8a4d7e5a268e5b3523edb61c29e7a7218e7fd4a1162387cd0dd1454468b2af8142ebe37f6670c60428804a08a554b0b1301c331fd72a5835568c294d1
@@ -73,7 +73,7 @@ class Tml::Api::Client < Tml::Base
73
73
  end
74
74
 
75
75
  def get_cache_version
76
- execute_request('applications/current/version', {}, {:raw => true})
76
+ execute_request('projects/current/version', {}, {:raw => true})
77
77
  end
78
78
 
79
79
  def verify_cache_version
@@ -128,12 +128,18 @@ class Tml::Api::Client < Tml::Base
128
128
  data
129
129
  end
130
130
 
131
+ def live_translations_request?(cache_key)
132
+ return if cache_key.blank?
133
+ return unless Tml.session.block_option(:live)
134
+ cache_key.index('sources') or cache_key.index('keys')
135
+ end
136
+
131
137
  def enable_cache?(opts)
132
138
  return false unless opts[:method] == :get
133
139
  return false if opts[:cache_key].nil?
134
140
  return false unless Tml.cache.enabled?
141
+ return false if live_translations_request?(opts[:cache_key])
135
142
  return false if Tml.session.inline_mode?
136
- return false if Tml.session.block_option(:live) and opts[:cache_key].index('sources')
137
143
  true
138
144
  end
139
145
 
@@ -290,6 +296,8 @@ class Tml::Api::Client < Tml::Base
290
296
  # params = params.merge(param => "##filtered##") if params[param]
291
297
  #end
292
298
 
299
+ path = "#{path[0] == '/' ? '' : '/'}#{path}"
300
+
293
301
  if opts[:method] == :post
294
302
  Tml.logger.debug("post: #{opts[:host]}#{path}")
295
303
  else
@@ -311,7 +311,7 @@ class Tml::Application < Tml::Base
311
311
  end
312
312
 
313
313
  def api_client
314
- @api_client ||= Tml::Api::Client.new(application: self)
314
+ @api_client ||= Tml.config.api_client_class.new(application: self)
315
315
  end
316
316
 
317
317
  def postoffice
data/lib/tml/config.rb CHANGED
@@ -80,13 +80,14 @@ module Tml
80
80
 
81
81
  # Used by Rails and Sinatra extensions
82
82
  attr_accessor :current_locale_method, :current_user_method, :translator_options, :i18n_backend
83
- attr_accessor :invalidator, :agent
83
+ attr_accessor :invalidator, :agent, :api_client_class
84
84
 
85
85
  # Used for IRB only
86
86
  attr_accessor :submit_missing_keys_realtime
87
87
 
88
88
  def initialize
89
89
  @enabled = true
90
+ @api_client_class = Tml::Api::Client
90
91
  @default_level = 0
91
92
  @format = :html
92
93
  @subdomains = false
@@ -418,7 +419,7 @@ module Tml
418
419
  end
419
420
 
420
421
  def default_day_name(index)
421
- "" + default_day_names[index]
422
+ '' + default_day_names[index]
422
423
  end
423
424
 
424
425
  def default_abbr_day_names
@@ -32,25 +32,28 @@
32
32
 
33
33
  class Tml::Decorators::Base < Tml::Base
34
34
 
35
- def self.decorator
36
- # can alternate based on the format in the config
37
- Tml.config.decorator_class.new
35
+ def self.decorator(options = {})
36
+ decorator_klass = Tml.config.decorator_class
37
+ if options[:decorator]
38
+ decorator_klass = "Tml::Decorators::#{options[:decorator].camelcase}".constantize
39
+ end
40
+ decorator_klass.new
38
41
  end
39
42
 
40
43
  def decorate(translated_label, translation_language, target_language, translation_key, options = {})
41
- raise Tml::Exception.new('Must be implemented by the extending class')
44
+ translated_label
42
45
  end
43
46
 
44
47
  def decorate_language_case(language_case, rule, original, transformed, options = {})
45
- raise Tml::Exception.new('Must be implemented by the extending class')
48
+ transformed
46
49
  end
47
50
 
48
51
  def decorate_token(token, value, options = {})
49
- raise Tml::Exception.new('Must be implemented by the extending class')
52
+ value
50
53
  end
51
54
 
52
55
  def decorate_element(token, value, options = {})
53
- raise Tml::Exception.new('Must be implemented by the extending class')
56
+ value
54
57
  end
55
58
 
56
59
  def inline_mode?
@@ -32,20 +32,4 @@
32
32
 
33
33
  class Tml::Decorators::Default < Tml::Decorators::Base
34
34
 
35
- def decorate(translated_label, translation_language, target_language, translation_key, options = {})
36
- translated_label
37
- end
38
-
39
- def decorate_language_case(language_case, rule, original, transformed, options = {})
40
- transformed
41
- end
42
-
43
- def decorate_token(token, value, options = {})
44
- value
45
- end
46
-
47
- def decorate_element(token, value, options = {})
48
- value
49
- end
50
-
51
35
  end
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+ #--
3
+ # Copyright (c) 2015 Translation Exchange, Inc
4
+ #
5
+ # _______ _ _ _ ______ _
6
+ # |__ __| | | | | (_) | ____| | |
7
+ # | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
8
+ # | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
9
+ # | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
10
+ # |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
11
+ # __/ |
12
+ # |___/
13
+ # Permission is hereby granted, free of charge, to any person obtaining
14
+ # a copy of this software and associated documentation files (the
15
+ # "Software"), to deal in the Software without restriction, including
16
+ # without limitation the rights to use, copy, modify, merge, publish,
17
+ # distribute, sublicense, and/or sell copies of the Software, and to
18
+ # permit persons to whom the Software is furnished to do so, subject to
19
+ # the following conditions:
20
+ #
21
+ # The above copyright notice and this permission notice shall be
22
+ # included in all copies or substantial portions of the Software.
23
+ #
24
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
+ #++
32
+
33
+ class Tml::Decorators::Json < Tml::Decorators::Base
34
+
35
+ def decorate(translated_label, translation_language, target_language, translation_key, options = {})
36
+ #Tml.logger.info("Decorating #{translated_label} of #{translation_language.locale} to #{target_language.locale}")
37
+
38
+ data = {
39
+ original: {
40
+ label: translation_key.label,
41
+ locale: translation_key.locale
42
+ },
43
+ translation: {
44
+ label: translated_label,
45
+ locale: translation_language.locale,
46
+ },
47
+ options: options,
48
+ target_locale: target_language.locale
49
+ }
50
+
51
+ if options[:locked]
52
+ data[:status] = 'locked'
53
+ elsif translation_language == translation_key.language
54
+ if options[:pending]
55
+ data[:status] = 'pending'
56
+ else
57
+ data[:status] = 'not_translated'
58
+ end
59
+ elsif translation_language == target_language
60
+ data[:status] = 'translated'
61
+ else
62
+ data[:status] = 'fallback'
63
+ end
64
+
65
+ data
66
+ end
67
+
68
+
69
+ end
data/lib/tml/ext/array.rb CHANGED
@@ -83,4 +83,14 @@ class Array
83
83
  result.tml_translated
84
84
  end
85
85
 
86
+ def tml_translated
87
+ return self if frozen?
88
+ @tml_translated = true
89
+ self
90
+ end
91
+
92
+ def tml_translated?
93
+ @tml_translated
94
+ end
95
+
86
96
  end
data/lib/tml/ext/hash.rb CHANGED
@@ -96,4 +96,14 @@ class Hash
96
96
  end
97
97
  end
98
98
 
99
+ def tml_translated
100
+ return self if frozen?
101
+ @tml_translated = true
102
+ self
103
+ end
104
+
105
+ def tml_translated?
106
+ @tml_translated
107
+ end
108
+
99
109
  end
data/lib/tml/language.rb CHANGED
@@ -54,7 +54,6 @@ class Tml::Language < Tml::Base
54
54
  self
55
55
  end
56
56
 
57
-
58
57
  def update_attributes(attrs)
59
58
  super
60
59
 
@@ -142,7 +141,7 @@ class Tml::Language < Tml::Base
142
141
  :translations => []
143
142
  })
144
143
 
145
- # Tml.logger.info("Translating " + params[:label] + " from: " + translation_key.locale.inspect + " to " + locale.inspect)
144
+ # Tml.logger.info("Translating #{params[:label]} from: #{translation_key.locale.inspect} to #{locale.inspect}")
146
145
 
147
146
  params[:tokens] ||= {}
148
147
  params[:tokens][:viewing_user] ||= Tml.session.current_user
@@ -156,16 +155,24 @@ class Tml::Language < Tml::Base
156
155
  ).tml_translated
157
156
  end
158
157
 
158
+ # if translations have already been cached in the application, use them
159
159
  cached_translations = application.cached_translations(locale, translation_key.key)
160
160
  if cached_translations
161
161
  translation_key.set_translations(locale, cached_translations)
162
162
  return translation_key.translate(self, params[:tokens], params[:options]).tml_translated
163
163
  end
164
164
 
165
+ # each key translations will be loaded directly from the API
166
+ if Tml.session.block_option(:by_key)
167
+ translation_key.fetch_translations(locale)
168
+ return translation_key.translate(self, params[:tokens], params[:options]).tml_translated
169
+ end
170
+
171
+ # fetch translations grouped by source
165
172
  source_key = current_source(options)
166
173
  current_source_path = source_path
167
174
 
168
- # Dynamic sources are never registered under the parent source
175
+ # Dynamic sources are never registered under the parent source for fast retrieval
169
176
  if Tml.session.block_option(:dynamic)
170
177
  current_source_path = source_key
171
178
  else
@@ -88,6 +88,40 @@ class Tml::TranslationKey < Tml::Base
88
88
  self
89
89
  end
90
90
 
91
+ def self.cache_key(locale, key)
92
+ File.join(locale, 'keys', key)
93
+ end
94
+
95
+ # update translations in the key
96
+ def update_translations(locale, data)
97
+ set_translations(locale, application.cache_translations(
98
+ locale,
99
+ key,
100
+ data.is_a?(Hash) ? data['translations'] : data
101
+ ))
102
+ end
103
+
104
+ # fetch translations for a specific translation key
105
+ def fetch_translations(locale)
106
+ self.translations ||= {}
107
+ return if self.translations[locale]
108
+
109
+ # Tml.logger.debug("Fetching translations for #{label}")
110
+
111
+ results = self.application.api_client.get(
112
+ "translation_keys/#{self.key}/translations",
113
+ {:locale => locale, :per_page => 10000},
114
+ {:cache_key => Tml::TranslationKey.cache_key(locale, self.key)}
115
+ ) || []
116
+
117
+ update_translations(locale, results)
118
+
119
+ self
120
+ rescue Tml::Exception => ex
121
+ self.translations = {}
122
+ self
123
+ end
124
+
91
125
  ###############################################################
92
126
  ## Translation Methods
93
127
  ###############################################################
@@ -100,12 +134,12 @@ class Tml::TranslationKey < Tml::Base
100
134
  def find_first_valid_translation(language, token_values)
101
135
  translations = translations_for_language(language)
102
136
 
103
- translations.sort! { |x,y| x.precedence <=> y.precedence }
137
+ translations.sort! { |x, y| x.precedence <=> y.precedence }
104
138
 
105
139
  translations.each do |translation|
106
140
  return translation if translation.matches_rules?(token_values)
107
141
  end
108
-
142
+
109
143
  nil
110
144
  end
111
145
 
@@ -115,7 +149,7 @@ class Tml::TranslationKey < Tml::Base
115
149
  end
116
150
 
117
151
  translation = find_first_valid_translation(language, token_values)
118
- decorator = Tml::Decorators::Base.decorator
152
+ decorator = Tml::Decorators::Base.decorator(options)
119
153
 
120
154
  if translation
121
155
  options[:locked] = translation.locked
@@ -160,7 +194,7 @@ class Tml::TranslationKey < Tml::Base
160
194
 
161
195
  # if the translations engine is disabled
162
196
  def self.substitute_tokens(label, token_values, language, options = {})
163
- return label.to_s if options[:skip_substitution]
197
+ return label.to_s if options[:skip_substitution]
164
198
  Tml::TranslationKey.new(:label => label.to_s).substitute_tokens(label.to_s, token_values, language, options)
165
199
  end
166
200
 
data/lib/tml/version.rb CHANGED
@@ -30,5 +30,5 @@
30
30
  #++
31
31
 
32
32
  module Tml
33
- VERSION = '5.1.4'
33
+ VERSION = '5.2.1'
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tml
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.4
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Berkovich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-03 00:00:00.000000000 Z
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -61,6 +61,7 @@ files:
61
61
  - lib/tml/decorators/base.rb
62
62
  - lib/tml/decorators/default.rb
63
63
  - lib/tml/decorators/html.rb
64
+ - lib/tml/decorators/json.rb
64
65
  - lib/tml/exception.rb
65
66
  - lib/tml/ext/array.rb
66
67
  - lib/tml/ext/date.rb