tml 5.1.4 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
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