tr8n_core 4.0.4 → 4.0.5
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/LICENSE +1 -1
- data/README.md +44 -6
- data/lib/tr8n/api_client.rb +109 -0
- data/lib/tr8n/application.rb +14 -96
- data/lib/tr8n/base.rb +7 -2
- data/lib/tr8n/cache.rb +2 -1
- data/lib/tr8n/cache_adapters/cdb.rb +2 -1
- data/lib/tr8n/cache_adapters/file.rb +2 -1
- data/lib/tr8n/cache_adapters/memcache.rb +2 -1
- data/lib/tr8n/cache_adapters/redis.rb +2 -1
- data/lib/tr8n/component.rb +2 -1
- data/lib/tr8n/config.rb +13 -3
- data/lib/tr8n/decorators/base.rb +2 -1
- data/lib/tr8n/decorators/default.rb +2 -1
- data/lib/tr8n/decorators/html.rb +2 -1
- data/lib/tr8n/exception.rb +2 -1
- data/lib/tr8n/language.rb +9 -3
- data/lib/tr8n/language_case.rb +5 -1
- data/lib/tr8n/language_case_rule.rb +2 -1
- data/lib/tr8n/language_context.rb +4 -1
- data/lib/tr8n/language_context_rule.rb +2 -1
- data/lib/tr8n/logger.rb +3 -2
- data/lib/tr8n/rules_engine/evaluator.rb +2 -1
- data/lib/tr8n/rules_engine/parser.rb +2 -1
- data/lib/tr8n/session.rb +21 -7
- data/lib/tr8n/source.rb +3 -2
- data/lib/tr8n/tokens/data.rb +319 -325
- data/lib/tr8n/tokens/data_tokenizer.rb +6 -1
- data/lib/tr8n/tokens/decoration_tokenizer.rb +15 -5
- data/lib/tr8n/tokens/hidden.rb +2 -1
- data/lib/tr8n/tokens/method.rb +4 -3
- data/lib/tr8n/tokens/transform.rb +22 -10
- data/lib/tr8n/translation.rb +6 -8
- data/lib/tr8n/translation_key.rb +11 -9
- data/lib/tr8n/translator.rb +2 -1
- data/lib/tr8n/utils.rb +6 -1
- data/lib/tr8n_core.rb +1 -1
- data/lib/tr8n_core/ext/array.rb +1 -1
- data/lib/tr8n_core/ext/date.rb +1 -1
- data/lib/tr8n_core/ext/fixnum.rb +1 -1
- data/lib/tr8n_core/ext/hash.rb +1 -1
- data/lib/tr8n_core/ext/string.rb +1 -1
- data/lib/tr8n_core/ext/time.rb +1 -1
- data/lib/tr8n_core/generators/cache/base.rb +1 -1
- data/lib/tr8n_core/generators/cache/cdb.rb +1 -1
- data/lib/tr8n_core/generators/cache/file.rb +1 -1
- data/lib/tr8n_core/languages/en-US.json +1362 -0
- data/lib/tr8n_core/version.rb +2 -2
- data/spec/language_case_spec.rb +3 -3
- data/spec/tokens/data_spec.rb +38 -84
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 371fea5f20b7e2f8cfb06f4bda1515060fbb3ab6
|
4
|
+
data.tar.gz: cf0ae840daf16a690b35243f5cb500b2f4c23548
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1235999df54ca3cdcd5e959f1a4c71b6aeb92bae769da08bd3100f2654e81ce59cdbbf329000650edcf2e6dd78675e7e260e26f666048b26c3383f0720c3beb9
|
7
|
+
data.tar.gz: af88480f1e4d56fbd6dad45503d33c99768581a0be32acb19e34abc08d49814c6e6ae5c62f2156859c2afbb12ead7c2ff9c4534393381a8d7ddceef7b84e177c
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -17,6 +17,14 @@ The library works in conjunctions with tr8nhub.com service that provides machine
|
|
17
17
|
In order to use the library, you should sign up at tr8nhub.com, create a new application and copy the application key and secret.
|
18
18
|
|
19
19
|
|
20
|
+
Rails Integration
|
21
|
+
==================
|
22
|
+
|
23
|
+
If you are planning on using Tr8n in a Rails application, you should use tr8n_rails_client_sdk gem instead.
|
24
|
+
|
25
|
+
https://github.com/tr8n/tr8n_rails_clientsdk
|
26
|
+
|
27
|
+
|
20
28
|
Installation
|
21
29
|
==================
|
22
30
|
|
@@ -34,7 +42,7 @@ The library can be invoked from the IRB. To use tr8n client you must require it,
|
|
34
42
|
|
35
43
|
```ruby
|
36
44
|
irb(main)> require 'tr8n_core'
|
37
|
-
irb(main)> app = Tr8n
|
45
|
+
irb(main)> app = Tr8n.session.init(KEY, SECRET)
|
38
46
|
```
|
39
47
|
|
40
48
|
Now you can use the application to get any language registered with your app:
|
@@ -154,7 +162,6 @@ Or in a simpler form:
|
|
154
162
|
[bold: {user}] {user| получил, получила} [link: [bold: {count}] {count| сообщение, сообщения, сообщений}]
|
155
163
|
```
|
156
164
|
|
157
|
-
|
158
165
|
One of the advantages of using TML is the ability to easily switch token values. The above example in a text based email can reuse translations:
|
159
166
|
|
160
167
|
```ruby
|
@@ -189,11 +196,42 @@ irb(main)> russian.translate('This is a new phrase without translations')
|
|
189
196
|
=> "Это новая фраза без перевода"
|
190
197
|
```
|
191
198
|
|
192
|
-
|
199
|
+
Links
|
193
200
|
==================
|
194
201
|
|
195
|
-
|
202
|
+
* Register on TranslationExchange.com: https://translationexchange.com
|
196
203
|
|
197
|
-
|
204
|
+
* Read TranslationExchange's documentation: http://wiki.translationexchange.com
|
205
|
+
|
206
|
+
* Visit TranslationExchange's blog: http://blog.translationexchange.com
|
207
|
+
|
208
|
+
* Follow TranslationExchange on Twitter: https://twitter.com/translationx
|
209
|
+
|
210
|
+
* Connect with TranslationExchange on Facebook: https://www.facebook.com/translationexchange
|
211
|
+
|
212
|
+
* If you have any questions or suggestions, contact us: info@translationexchange.com
|
213
|
+
|
214
|
+
|
215
|
+
Copyright and license
|
216
|
+
==================
|
198
217
|
|
199
|
-
|
218
|
+
Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
219
|
+
|
220
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
221
|
+
a copy of this software and associated documentation files (the
|
222
|
+
"Software"), to deal in the Software without restriction, including
|
223
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
224
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
225
|
+
permit persons to whom the Software is furnished to do so, subject to
|
226
|
+
the following conditions:
|
227
|
+
|
228
|
+
The above copyright notice and this permission notice shall be
|
229
|
+
included in all copies or substantial portions of the Software.
|
230
|
+
|
231
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
232
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
233
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
234
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
235
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
236
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
237
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#++
|
24
|
+
|
25
|
+
require 'faraday'
|
26
|
+
|
27
|
+
class Tr8n::ApiClient < Tr8n::Base
|
28
|
+
API_HOST = 'https://translationexchange.com'
|
29
|
+
API_PATH = '/tr8n/api/'
|
30
|
+
|
31
|
+
attributes :application
|
32
|
+
|
33
|
+
def access_token
|
34
|
+
application.access_token ||= begin
|
35
|
+
api("oauth/request_token",
|
36
|
+
{
|
37
|
+
:client_id => application.key,
|
38
|
+
:client_secret => application.secret,
|
39
|
+
:grant_type => :client_credentials
|
40
|
+
},
|
41
|
+
{
|
42
|
+
:host => application.host
|
43
|
+
}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
application.access_token["access_token"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def get(path, params = {}, opts = {})
|
50
|
+
api(path, params.merge(:access_token => access_token, :t => Time.now.to_i), opts)
|
51
|
+
end
|
52
|
+
|
53
|
+
def post(path, params = {}, opts = {})
|
54
|
+
api(path, params.merge(:access_token => access_token, :t => Time.now.to_i), opts.merge(:method => :post))
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.error?(data)
|
58
|
+
not data["error"].nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
def host
|
62
|
+
application.host || API_HOST
|
63
|
+
end
|
64
|
+
|
65
|
+
def api(path, params = {}, opts = {})
|
66
|
+
Tr8n.logger.trace_api_call(path, params) do
|
67
|
+
conn = Faraday.new(:url => host) do |faraday|
|
68
|
+
faraday.request(:url_encoded) # form-encode POST params
|
69
|
+
# faraday.response :logger # log requests to STDOUT
|
70
|
+
faraday.adapter(Faraday.default_adapter) # make requests with Net::HTTP
|
71
|
+
end
|
72
|
+
|
73
|
+
if opts[:method] == :post
|
74
|
+
response = conn.post("#{API_PATH}#{path}", params)
|
75
|
+
else
|
76
|
+
response = conn.get("#{API_PATH}#{path}", params)
|
77
|
+
end
|
78
|
+
|
79
|
+
data = JSON.parse(response.body)
|
80
|
+
|
81
|
+
unless data["error"].nil?
|
82
|
+
raise Tr8n::Exception.new("Error: #{data["error"]}")
|
83
|
+
end
|
84
|
+
|
85
|
+
process_response(data, opts)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def object_class(opts)
|
90
|
+
return unless opts[:class]
|
91
|
+
opts[:class].is_a?(String) ? opts[:class].constantize : opts[:class]
|
92
|
+
end
|
93
|
+
|
94
|
+
def process_response(data, opts)
|
95
|
+
if data["results"]
|
96
|
+
Tr8n.logger.debug("recieved #{data["results"].size} result(s)")
|
97
|
+
return data["results"] unless object_class(opts)
|
98
|
+
objects = []
|
99
|
+
data["results"].each do |data|
|
100
|
+
objects << object_class(opts).new(data.merge(opts[:attributes] || {}))
|
101
|
+
end
|
102
|
+
return objects
|
103
|
+
end
|
104
|
+
|
105
|
+
return data unless object_class(opts)
|
106
|
+
Tr8n.logger.debug("constructing #{object_class(opts).name}")
|
107
|
+
object_class(opts).new(data.merge(opts[:attributes] || {}))
|
108
|
+
end
|
109
|
+
end
|
data/lib/tr8n/application.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -23,40 +24,16 @@
|
|
23
24
|
|
24
25
|
require 'faraday'
|
25
26
|
|
26
|
-
API_HOST = 'https://tr8nhub.com'
|
27
|
-
API_PATH = '/tr8n/api/'
|
28
|
-
|
29
27
|
class Tr8n::Application < Tr8n::Base
|
30
28
|
attributes :host, :key, :secret, :access_token, :name, :description, :threshold, :default_locale, :default_level
|
31
29
|
has_many :features, :languages, :featured_locales, :sources, :components, :tokens, :css, :shortcuts
|
32
30
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
options[:definition] = true if options[:definition].nil?
|
37
|
-
|
38
|
-
host ||= API_HOST
|
39
|
-
|
40
|
-
Tr8n.cache.reset_version
|
41
|
-
|
42
|
-
Tr8n.logger.info("Initializing application...")
|
43
|
-
|
44
|
-
Tr8n.session.application = Tr8n.cache.fetch(cache_key(key)) do
|
45
|
-
# get access token and store it in the application
|
46
|
-
access_token = api("oauth/request_token", {:client_id => key, :client_secret => secret, :grant_type => :client_credentials}, {:host => host})
|
47
|
-
|
48
|
-
# get application details
|
49
|
-
api("application", {:client_id => key, :definition => options[:definition]}, {:host => host, :access_token => access_token["access_token"], :class => Tr8n::Application, :attributes => {
|
50
|
-
:host => host,
|
51
|
-
:key => key,
|
52
|
-
:secret => secret,
|
53
|
-
:access_token => access_token["access_token"]
|
54
|
-
}})
|
55
|
-
end
|
31
|
+
def fetch
|
32
|
+
update_attributes(api_client.get("application", {:definition => true}))
|
33
|
+
self
|
56
34
|
end
|
57
35
|
|
58
|
-
|
59
|
-
def initialize(attrs = {})
|
36
|
+
def update_attributes(attrs)
|
60
37
|
super
|
61
38
|
|
62
39
|
self.attributes[:languages] = []
|
@@ -99,8 +76,7 @@ class Tr8n::Application < Tr8n::Base
|
|
99
76
|
|
100
77
|
return nil unless fetch
|
101
78
|
|
102
|
-
|
103
|
-
@languages_by_locale[locale] = get("language", {:locale => locale}, {:class => Tr8n::Language, :attributes => {:application => self}})
|
79
|
+
@languages_by_locale[locale] = Tr8n::Language.new(:locale => locale, :application => self).fetch
|
104
80
|
|
105
81
|
if Tr8n.config.cache[:enabled] and not Tr8n.cache.read_only?
|
106
82
|
Tr8n.cache.store(Tr8n::Language.cache_key(locale), @languages_by_locale[locale])
|
@@ -134,7 +110,7 @@ class Tr8n::Application < Tr8n::Base
|
|
134
110
|
return @sources_by_key[key] if @sources_by_key[key]
|
135
111
|
return nil unless register
|
136
112
|
|
137
|
-
@sources_by_key[key] ||= post("source/register", {:source => key}, {:class => Tr8n::Source, :attributes => {:application => self}})
|
113
|
+
@sources_by_key[key] ||= api_client.post("source/register", {:source => key}, {:class => Tr8n::Source, :attributes => {:application => self}})
|
138
114
|
end
|
139
115
|
|
140
116
|
def component(key, register = true)
|
@@ -143,7 +119,7 @@ class Tr8n::Application < Tr8n::Base
|
|
143
119
|
return @components_by_key[key] if @components_by_key[key]
|
144
120
|
return nil unless register
|
145
121
|
|
146
|
-
@components_by_key[key] ||= post("component/register", {:component => key}, {:class => Tr8n::Component, :attributes => {:application => self}})
|
122
|
+
@components_by_key[key] ||= api_client.post("component/register", {:component => key}, {:class => Tr8n::Component, :attributes => {:application => self}})
|
147
123
|
end
|
148
124
|
|
149
125
|
def translation_keys
|
@@ -195,14 +171,14 @@ class Tr8n::Application < Tr8n::Base
|
|
195
171
|
next unless keys.values.any?
|
196
172
|
params << {:source => source, :keys => keys.values.collect{|tkey| tkey.to_hash(:label, :description, :locale, :level)}}
|
197
173
|
end
|
198
|
-
post('source/register_keys', {:source_keys => params.to_json}
|
174
|
+
api_client.post('source/register_keys', {:source_keys => params.to_json})
|
199
175
|
@missing_keys_by_sources = nil
|
200
176
|
end
|
201
177
|
|
202
178
|
def featured_languages
|
203
179
|
@featured_languages ||= begin
|
204
180
|
locales = Tr8n.cache.fetch("featured_locales") do
|
205
|
-
get("application/featured_locales")
|
181
|
+
api_client.get("application/featured_locales")
|
206
182
|
end
|
207
183
|
# use app languages, there is no need for rules for this call
|
208
184
|
(locales.nil? or locales.empty?) ? [] : languages.select{|l| locales.include?(l.locale)}
|
@@ -210,7 +186,7 @@ class Tr8n::Application < Tr8n::Base
|
|
210
186
|
end
|
211
187
|
|
212
188
|
def translators
|
213
|
-
get("application/translators", {}, {:class => Tr8n::Translator, :attributes => {:application => self}})
|
189
|
+
api_client.get("application/translators", {}, {:class => Tr8n::Translator, :attributes => {:application => self}})
|
214
190
|
end
|
215
191
|
|
216
192
|
def default_decoration_token(token)
|
@@ -257,66 +233,8 @@ class Tr8n::Application < Tr8n::Base
|
|
257
233
|
## API Methods
|
258
234
|
#######################################################################################################
|
259
235
|
|
260
|
-
def
|
261
|
-
|
262
|
-
end
|
263
|
-
|
264
|
-
def post(path, params = {}, opts = {})
|
265
|
-
api(path, params, opts.merge(:method => :post))
|
266
|
-
end
|
267
|
-
|
268
|
-
def self.error?(data)
|
269
|
-
not data["error"].nil?
|
270
|
-
end
|
271
|
-
|
272
|
-
def api(path, params = {}, opts = {})
|
273
|
-
#:access_token => access_token,
|
274
|
-
params = params.merge(:client_id => key, :t => Time.now.to_i)
|
275
|
-
self.class.api(path, params, opts.merge(:host => self.host))
|
276
|
-
end
|
277
|
-
|
278
|
-
def self.api(path, params = {}, opts = {})
|
279
|
-
Tr8n.logger.trace_api_call(path, params) do
|
280
|
-
conn = Faraday.new(:url => opts[:host]) do |faraday|
|
281
|
-
faraday.request(:url_encoded) # form-encode POST params
|
282
|
-
# faraday.response :logger # log requests to STDOUT
|
283
|
-
faraday.adapter(Faraday.default_adapter) # make requests with Net::HTTP
|
284
|
-
end
|
285
|
-
|
286
|
-
if opts[:method] == :post
|
287
|
-
response = conn.post("#{API_PATH}#{path}", params)
|
288
|
-
else
|
289
|
-
response = conn.get("#{API_PATH}#{path}", params)
|
290
|
-
end
|
291
|
-
|
292
|
-
data = JSON.parse(response.body)
|
293
|
-
|
294
|
-
unless data["error"].nil?
|
295
|
-
raise Tr8n::Exception.new("Error: #{data["error"]}")
|
296
|
-
end
|
297
|
-
|
298
|
-
process_response(data, opts)
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
def self.object_class(opts)
|
303
|
-
return unless opts[:class]
|
304
|
-
opts[:class].is_a?(String) ? opts[:class].constantize : opts[:class]
|
236
|
+
def api_client
|
237
|
+
@api_client ||= Tr8n::ApiClient.new(:application => self)
|
305
238
|
end
|
306
239
|
|
307
|
-
def self.process_response(data, opts)
|
308
|
-
if data["results"]
|
309
|
-
Tr8n.logger.debug("recieved #{data["results"].size} result(s)")
|
310
|
-
return data["results"] unless object_class(opts)
|
311
|
-
objects = []
|
312
|
-
data["results"].each do |data|
|
313
|
-
objects << object_class(opts).new(data.merge(opts[:attributes] || {}))
|
314
|
-
end
|
315
|
-
return objects
|
316
|
-
end
|
317
|
-
|
318
|
-
return data unless object_class(opts)
|
319
|
-
Tr8n.logger.debug("constructing #{object_class(opts).name}")
|
320
|
-
object_class(opts).new(data.merge(opts[:attributes] || {}))
|
321
|
-
end
|
322
240
|
end
|
data/lib/tr8n/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -26,8 +27,12 @@ class Tr8n::Base
|
|
26
27
|
|
27
28
|
def initialize(attrs = {})
|
28
29
|
@attributes = {}
|
30
|
+
update_attributes(attrs)
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_attributes(attrs = {})
|
29
34
|
attrs.each do |key, value|
|
30
|
-
#
|
35
|
+
#pp [self.class.name, key, self.class.attributes, self.class.attributes.include?(key.to_sym)]
|
31
36
|
next unless self.class.attributes.include?(key.to_sym)
|
32
37
|
@attributes[key.to_sym] = value
|
33
38
|
end
|
data/lib/tr8n/cache.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|
data/lib/tr8n/component.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#--
|
2
|
-
# Copyright (c) 2014 Michael Berkovich,
|
3
|
+
# Copyright (c) 2014 Michael Berkovich, TranslationExchange.com
|
3
4
|
#
|
4
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
# a copy of this software and associated documentation files (the
|