lost_in_translations 1.2.0
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 +7 -0
- data/.gitignore +50 -0
- data/.rspec +4 -0
- data/.rubocop.yml +15 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +97 -0
- data/README.md +203 -0
- data/lib/lost_in_translations.rb +41 -0
- data/lib/lost_in_translations/active_record.rb +27 -0
- data/lib/lost_in_translations/base.rb +20 -0
- data/lib/lost_in_translations/config.rb +5 -0
- data/lib/lost_in_translations/ruby.rb +39 -0
- data/lib/lost_in_translations/translator.rb +29 -0
- data/lib/lost_in_translations/version.rb +5 -0
- data/lost_in_translations.gemspec +32 -0
- data/spec/lost_in_translations/active_record_spec.rb +61 -0
- data/spec/lost_in_translations/base_spec.rb +70 -0
- data/spec/lost_in_translations/lost_in_translations_spec.rb +116 -0
- data/spec/lost_in_translations/ruby_spec.rb +55 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/support/db/test.sqlite3 +0 -0
- data/spec/support/shared_examples/proper_translator.rb +23 -0
- metadata +200 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: bcda78e45d1191420fb5863127b77c5315fa7b46
|
|
4
|
+
data.tar.gz: 6cdf234915545512aac5e751a692986454fcfe27
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 55dd44bafc0005398321643ca0b44cef0ede2dd18365735809aceeeb06acec6e0a0b8201eba40380d2fe0b552738d317633ae9a3d8f6699fd667ba1e817f0bc2
|
|
7
|
+
data.tar.gz: c73c4f621cf6dc45e67fe3ba2901319604dbdb12ff481c01a8600edced13100a8c0d55d4e8e9a97aa1f7df8a3fd1d83851e1271d04a953251f1c0a3e56c050f8
|
data/.gitignore
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
*.gem
|
|
2
|
+
*.rbc
|
|
3
|
+
/.config
|
|
4
|
+
/coverage/
|
|
5
|
+
/InstalledFiles
|
|
6
|
+
/pkg/
|
|
7
|
+
/spec/reports/
|
|
8
|
+
/spec/examples.txt
|
|
9
|
+
/test/tmp/
|
|
10
|
+
/test/version_tmp/
|
|
11
|
+
/tmp/
|
|
12
|
+
|
|
13
|
+
## Specific to RubyMotion:
|
|
14
|
+
.dat*
|
|
15
|
+
.repl_history
|
|
16
|
+
build/
|
|
17
|
+
|
|
18
|
+
## Documentation cache and generated files:
|
|
19
|
+
/.yardoc/
|
|
20
|
+
/_yardoc/
|
|
21
|
+
/doc/
|
|
22
|
+
/rdoc/
|
|
23
|
+
|
|
24
|
+
## Environment normalization:
|
|
25
|
+
/.bundle/
|
|
26
|
+
/vendor/bundle
|
|
27
|
+
/lib/bundler/man/
|
|
28
|
+
|
|
29
|
+
# for a library or gem, you might want to ignore these files since the code is
|
|
30
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
31
|
+
# Gemfile.lock
|
|
32
|
+
# .ruby-version
|
|
33
|
+
.ruby-gemset
|
|
34
|
+
|
|
35
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
|
36
|
+
.rvmrc
|
|
37
|
+
|
|
38
|
+
*.bundle
|
|
39
|
+
*.so
|
|
40
|
+
*.o
|
|
41
|
+
*.a
|
|
42
|
+
mkmf.log
|
|
43
|
+
|
|
44
|
+
.DS_Store
|
|
45
|
+
|
|
46
|
+
# Jetbrains Idea files
|
|
47
|
+
.idea/
|
|
48
|
+
api.iml
|
|
49
|
+
|
|
50
|
+
db/schema.rb
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.3.0
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
lost_in_translations (1.2.0)
|
|
5
|
+
i18n (~> 0.7)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
activemodel (4.2.6)
|
|
11
|
+
activesupport (= 4.2.6)
|
|
12
|
+
builder (~> 3.1)
|
|
13
|
+
activerecord (4.2.6)
|
|
14
|
+
activemodel (= 4.2.6)
|
|
15
|
+
activesupport (= 4.2.6)
|
|
16
|
+
arel (~> 6.0)
|
|
17
|
+
activesupport (4.2.6)
|
|
18
|
+
i18n (~> 0.7)
|
|
19
|
+
json (~> 1.7, >= 1.7.7)
|
|
20
|
+
minitest (~> 5.1)
|
|
21
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
22
|
+
tzinfo (~> 1.1)
|
|
23
|
+
arel (6.0.3)
|
|
24
|
+
ast (2.2.0)
|
|
25
|
+
builder (3.2.2)
|
|
26
|
+
byebug (8.2.5)
|
|
27
|
+
codeclimate-test-reporter (0.4.8)
|
|
28
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
|
29
|
+
coderay (1.1.1)
|
|
30
|
+
diff-lcs (1.2.5)
|
|
31
|
+
docile (1.1.5)
|
|
32
|
+
i18n (0.7.0)
|
|
33
|
+
json (1.8.3)
|
|
34
|
+
method_source (0.8.2)
|
|
35
|
+
minitest (5.9.0)
|
|
36
|
+
parser (2.3.0.6)
|
|
37
|
+
ast (~> 2.2)
|
|
38
|
+
powerpack (0.1.1)
|
|
39
|
+
pry (0.10.3)
|
|
40
|
+
coderay (~> 1.1.0)
|
|
41
|
+
method_source (~> 0.8.1)
|
|
42
|
+
slop (~> 3.4)
|
|
43
|
+
pry-byebug (3.3.0)
|
|
44
|
+
byebug (~> 8.0)
|
|
45
|
+
pry (~> 0.10)
|
|
46
|
+
rainbow (2.1.0)
|
|
47
|
+
rspec (3.4.0)
|
|
48
|
+
rspec-core (~> 3.4.0)
|
|
49
|
+
rspec-expectations (~> 3.4.0)
|
|
50
|
+
rspec-mocks (~> 3.4.0)
|
|
51
|
+
rspec-core (3.4.4)
|
|
52
|
+
rspec-support (~> 3.4.0)
|
|
53
|
+
rspec-expectations (3.4.0)
|
|
54
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
55
|
+
rspec-support (~> 3.4.0)
|
|
56
|
+
rspec-mocks (3.4.1)
|
|
57
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
58
|
+
rspec-support (~> 3.4.0)
|
|
59
|
+
rspec-support (3.4.1)
|
|
60
|
+
rubocop (0.37.2)
|
|
61
|
+
parser (>= 2.3.0.4, < 3.0)
|
|
62
|
+
powerpack (~> 0.1)
|
|
63
|
+
rainbow (>= 1.99.1, < 3.0)
|
|
64
|
+
ruby-progressbar (~> 1.7)
|
|
65
|
+
unicode-display_width (~> 0.3)
|
|
66
|
+
ruby-progressbar (1.7.5)
|
|
67
|
+
simplecov (0.11.2)
|
|
68
|
+
docile (~> 1.1.0)
|
|
69
|
+
json (~> 1.8)
|
|
70
|
+
simplecov-html (~> 0.10.0)
|
|
71
|
+
simplecov-html (0.10.0)
|
|
72
|
+
slop (3.6.0)
|
|
73
|
+
sqlite3 (1.3.11)
|
|
74
|
+
thread_safe (0.3.5)
|
|
75
|
+
tzinfo (1.2.2)
|
|
76
|
+
thread_safe (~> 0.1)
|
|
77
|
+
unicode-display_width (0.3.1)
|
|
78
|
+
|
|
79
|
+
PLATFORMS
|
|
80
|
+
ruby
|
|
81
|
+
|
|
82
|
+
DEPENDENCIES
|
|
83
|
+
activerecord (= 4.2.6)
|
|
84
|
+
byebug (= 8.2.5)
|
|
85
|
+
codeclimate-test-reporter (= 0.4.8)
|
|
86
|
+
lost_in_translations!
|
|
87
|
+
pry-byebug (= 3.3.0)
|
|
88
|
+
rspec (= 3.4.0)
|
|
89
|
+
rubocop (= 0.37.2)
|
|
90
|
+
simplecov (= 0.11.2)
|
|
91
|
+
sqlite3 (= 1.3.11)
|
|
92
|
+
|
|
93
|
+
RUBY VERSION
|
|
94
|
+
ruby 2.3.0p0
|
|
95
|
+
|
|
96
|
+
BUNDLED WITH
|
|
97
|
+
1.12.5
|
data/README.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Lost In Translations
|
|
2
|
+
Super light Translation Ruby Gem agnostic to your framework and source data
|
|
3
|
+
|
|
4
|
+
[](https://codeclimate.com/github/Streetbees/lost_in_translations)
|
|
5
|
+
[](https://codeclimate.com/github/Streetbees/lost_in_translations/coverage)
|
|
6
|
+
[](https://travis-ci.org/Streetbees/lost_in_translations)
|
|
7
|
+
|
|
8
|
+
## 1. Basic Usage
|
|
9
|
+
```ruby
|
|
10
|
+
class User < Struct.new(:title, :first_name, :last_name)
|
|
11
|
+
include LostInTranslations
|
|
12
|
+
|
|
13
|
+
translate :title, :first_name
|
|
14
|
+
|
|
15
|
+
def translation_data
|
|
16
|
+
{
|
|
17
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
18
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
```
|
|
23
|
+
Class method **.translate** will redefine **#title** and **#first_name** instance methods in order to return the values that match the **I18n.locale** and the **attribute name** from the Hash returned by **#translation_data**, otherwise calls the original redefined method.
|
|
24
|
+
|
|
25
|
+
```ruby
|
|
26
|
+
@user = User.new('Cavaleiro', 'Joao', 'Neve')
|
|
27
|
+
|
|
28
|
+
I18n.locale = :fr
|
|
29
|
+
|
|
30
|
+
@user.first_name # returns 'Jean'
|
|
31
|
+
@user.last_name # returns 'Neve'
|
|
32
|
+
@user.title # returns 'Cavaleiro'
|
|
33
|
+
|
|
34
|
+
I18n.with_locale(:en) do
|
|
35
|
+
@user.first_name # returns 'Jon'
|
|
36
|
+
@user.last_name # returns 'Neve'
|
|
37
|
+
@user.title # returns 'Cavaleiro'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
I18n.with_locale(:de) do
|
|
41
|
+
@user.first_name # returns 'Joao'
|
|
42
|
+
@user.last_name # returns 'Neve'
|
|
43
|
+
@user.title # returns 'Cavaleiro'
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Instance method **#translate** is also available:
|
|
48
|
+
```ruby
|
|
49
|
+
@user.translate(:first_name, :fr) # returns 'Jean'
|
|
50
|
+
@user.translate(:first_name, :en) # returns 'Jon'
|
|
51
|
+
@user.translate(:first_name, :de) # returns 'Joao'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 2. Ideal usage
|
|
55
|
+
If your ActiveRecord Model has a json attribute called **translation_data**.
|
|
56
|
+
```ruby
|
|
57
|
+
class CreateUsers < ActiveRecord::Migration
|
|
58
|
+
def up
|
|
59
|
+
create_table :users do |t|
|
|
60
|
+
t.string :title
|
|
61
|
+
t.string :first_name
|
|
62
|
+
t.string :last_name
|
|
63
|
+
t.json :translation_data
|
|
64
|
+
t.timestamps
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
User.create \
|
|
68
|
+
title: 'Cavaleiro',
|
|
69
|
+
first_name: 'Joao',
|
|
70
|
+
last_name: 'Neve'
|
|
71
|
+
translation_data: {
|
|
72
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
73
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
74
|
+
}
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The usage becomes quite simple.
|
|
80
|
+
```ruby
|
|
81
|
+
class User < ActiveRecord::Base
|
|
82
|
+
include LostInTranslations
|
|
83
|
+
|
|
84
|
+
translate :title, :first_name
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
@user = User.find(1)
|
|
88
|
+
|
|
89
|
+
I18n.locale = :fr
|
|
90
|
+
|
|
91
|
+
@user.first_name # returns 'Jean'
|
|
92
|
+
@user.last_name # returns 'Neve'
|
|
93
|
+
@user.title # returns 'Cavaleiro'
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 3. Configuration
|
|
97
|
+
|
|
98
|
+
### 3.1 Your "translation_data" method (in all of your objects) is not called "translation_data"
|
|
99
|
+
```ruby
|
|
100
|
+
LostInTranslations.configure do |config|
|
|
101
|
+
config.translation_data_field = 'my_translation_data_field'
|
|
102
|
+
end
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```ruby
|
|
106
|
+
class User < ActiveRecord::Base
|
|
107
|
+
include LostInTranslations
|
|
108
|
+
|
|
109
|
+
translate :first_name
|
|
110
|
+
|
|
111
|
+
def my_translation_data_field
|
|
112
|
+
{
|
|
113
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
114
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
115
|
+
}
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
I18n.locale = :fr
|
|
120
|
+
|
|
121
|
+
User.find(1).first_name # returns 'Jean'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 3.2 Your "translation_data" method (in a particular object) is not called "translation_data"
|
|
125
|
+
```ruby
|
|
126
|
+
class User < ActiveRecord::Base
|
|
127
|
+
include LostInTranslations
|
|
128
|
+
|
|
129
|
+
translate :first_name
|
|
130
|
+
|
|
131
|
+
self.translation_data_field = :my_translation_data_field
|
|
132
|
+
|
|
133
|
+
def my_translation_data_field
|
|
134
|
+
{
|
|
135
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
136
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
137
|
+
}
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
I18n.locale = :fr
|
|
142
|
+
|
|
143
|
+
User.find(1).first_name # returns 'Jean'
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 3.3 Custom translation mechanism
|
|
147
|
+
```ruby
|
|
148
|
+
class MyTranslator
|
|
149
|
+
def self.translate(object, field, locale)
|
|
150
|
+
translations = #get_data_from_redis_or_yaml_file(object)
|
|
151
|
+
|
|
152
|
+
(translations[locale] || {})[field]
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
```ruby
|
|
158
|
+
LostInTranslations.configure do |config|
|
|
159
|
+
config.translator = MyTranslator
|
|
160
|
+
end
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```ruby
|
|
164
|
+
class User < ActiveRecord::Base
|
|
165
|
+
include LostInTranslations
|
|
166
|
+
|
|
167
|
+
translate :first_name
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
I18n.locale = :fr
|
|
171
|
+
|
|
172
|
+
User.find(1).first_name # returns 'Jean' from redis or yaml file
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Don't forget that you can do the same at the object level
|
|
176
|
+
```ruby
|
|
177
|
+
class User < ActiveRecord::Base
|
|
178
|
+
include LostInTranslations
|
|
179
|
+
|
|
180
|
+
translate :first_name
|
|
181
|
+
|
|
182
|
+
def translation_data
|
|
183
|
+
# get_data_from_redis_or_yaml_file(self)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
I18n.locale = :fr
|
|
188
|
+
|
|
189
|
+
User.find(1).first_name # returns 'Jean' from redis or yaml file
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 4 Instalation
|
|
193
|
+
|
|
194
|
+
Add your application's Gemfile:
|
|
195
|
+
```
|
|
196
|
+
gem 'lost_in_translations'
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
And then execute:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
$> bundle install
|
|
203
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'i18n'
|
|
2
|
+
require 'lost_in_translations/base'
|
|
3
|
+
require 'lost_in_translations/ruby'
|
|
4
|
+
require 'lost_in_translations/config'
|
|
5
|
+
require 'lost_in_translations/translator'
|
|
6
|
+
require 'lost_in_translations/active_record'
|
|
7
|
+
|
|
8
|
+
module LostInTranslations
|
|
9
|
+
|
|
10
|
+
def self.included(base_class)
|
|
11
|
+
if defined?(::ActiveRecord::Base) &&
|
|
12
|
+
base_class.ancestors.include?(::ActiveRecord::Base)
|
|
13
|
+
base_class.include LostInTranslations::ActiveRecord
|
|
14
|
+
else
|
|
15
|
+
base_class.include Ruby
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.config
|
|
20
|
+
@config ||= Config.new('translation_data', Translator)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.translate(*args)
|
|
24
|
+
config.translator.translate(*args)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.define_translation_methods(object, *fields)
|
|
28
|
+
fields.each do |field|
|
|
29
|
+
object.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
30
|
+
def #{field}
|
|
31
|
+
translate(:#{field}, I18n.locale)
|
|
32
|
+
end
|
|
33
|
+
RUBY
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.configure
|
|
38
|
+
yield(config)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module LostInTranslations
|
|
2
|
+
module ActiveRecord
|
|
3
|
+
|
|
4
|
+
module ClassMethods
|
|
5
|
+
|
|
6
|
+
def translate(*fields)
|
|
7
|
+
LostInTranslations.define_translation_methods(self, *fields)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.included(base_class)
|
|
13
|
+
base_class.include Base
|
|
14
|
+
base_class.extend ClassMethods
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def translate(field, locale = I18n.locale)
|
|
18
|
+
LostInTranslations.translate(self, field, locale) ||
|
|
19
|
+
ActiveRecord.call_original_field(self, field)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.call_original_field(object, field)
|
|
23
|
+
object.read_attribute(field)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module LostInTranslations
|
|
2
|
+
module Base
|
|
3
|
+
|
|
4
|
+
def self.included(base_class)
|
|
5
|
+
base_class.extend ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module ClassMethods
|
|
9
|
+
|
|
10
|
+
attr_writer :translation_data_field
|
|
11
|
+
|
|
12
|
+
def translation_data_field
|
|
13
|
+
@translation_data_field ||
|
|
14
|
+
LostInTranslations.config.translation_data_field
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module LostInTranslations
|
|
2
|
+
module Ruby
|
|
3
|
+
|
|
4
|
+
module ClassMethods
|
|
5
|
+
|
|
6
|
+
def translate(*fields)
|
|
7
|
+
fields.each do |field|
|
|
8
|
+
alias_method Ruby.original_field_name(field), field.to_sym
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
LostInTranslations.define_translation_methods(self, *fields)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.included(base_class)
|
|
17
|
+
base_class.include Base
|
|
18
|
+
base_class.extend ClassMethods
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def translate(field, locale = I18n.locale)
|
|
22
|
+
LostInTranslations.translate(self, field, locale) ||
|
|
23
|
+
Ruby.call_original_field(self, field)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.call_original_field(object, field)
|
|
27
|
+
method_name = Ruby.original_field_name(field)
|
|
28
|
+
|
|
29
|
+
return object.send(field) unless object.respond_to?(method_name)
|
|
30
|
+
|
|
31
|
+
object.send(method_name)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.original_field_name(field)
|
|
35
|
+
"original_field_#{field}".to_sym
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module LostInTranslations
|
|
2
|
+
class Translator
|
|
3
|
+
|
|
4
|
+
def self.translate(object, field, locale)
|
|
5
|
+
translations = translations_for(object, locale) || {}
|
|
6
|
+
|
|
7
|
+
translations[field.to_sym] || translations[field.to_s]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.translations_for(object, locale)
|
|
11
|
+
translations = translation_data(object) || {}
|
|
12
|
+
|
|
13
|
+
translations[locale.to_sym] || translations[locale.to_s]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.translation_data(object)
|
|
17
|
+
translation_data_field = object.class.translation_data_field
|
|
18
|
+
|
|
19
|
+
unless object.respond_to?(translation_data_field)
|
|
20
|
+
raise \
|
|
21
|
+
NotImplementedError,
|
|
22
|
+
"#{object.class.name} does not respond to .#{translation_data_field}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
object.send(translation_data_field)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
|
|
5
|
+
require 'lost_in_translations/version'
|
|
6
|
+
|
|
7
|
+
Gem::Specification.new do |gem|
|
|
8
|
+
gem.name = 'lost_in_translations'
|
|
9
|
+
gem.version = LostInTranslations::VERSION
|
|
10
|
+
gem.license = 'MIT'
|
|
11
|
+
gem.authors = ['StreetBees Dev Team']
|
|
12
|
+
gem.email = 'dev@streetbees.com'
|
|
13
|
+
gem.summary = 'Ruby Translation Gem'
|
|
14
|
+
gem.description = 'Super light Translation Ruby Gem agnostic to your framework and source data'
|
|
15
|
+
gem.homepage = 'https://github.com/streetbees/lost_in_translations'
|
|
16
|
+
|
|
17
|
+
gem.files = `git ls-files`.split($/)
|
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
20
|
+
gem.require_paths = ['lib']
|
|
21
|
+
|
|
22
|
+
gem.add_development_dependency 'rspec', '3.4.0'
|
|
23
|
+
gem.add_development_dependency 'byebug', '8.2.5'
|
|
24
|
+
gem.add_development_dependency 'sqlite3', '1.3.11'
|
|
25
|
+
gem.add_development_dependency 'rubocop', '0.37.2'
|
|
26
|
+
gem.add_development_dependency 'simplecov', '0.11.2'
|
|
27
|
+
gem.add_development_dependency 'pry-byebug', '3.3.0'
|
|
28
|
+
gem.add_development_dependency 'activerecord', '4.2.6'
|
|
29
|
+
gem.add_development_dependency 'codeclimate-test-reporter', '0.4.8'
|
|
30
|
+
|
|
31
|
+
gem.add_dependency 'i18n', '~> 0.7'
|
|
32
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LostInTranslations::ActiveRecord do
|
|
4
|
+
|
|
5
|
+
describe '.translate' do
|
|
6
|
+
|
|
7
|
+
context "when translating a field" do
|
|
8
|
+
before do
|
|
9
|
+
@user_class = Class.new(ActiveRecord::Base) do
|
|
10
|
+
self.table_name = 'users'
|
|
11
|
+
|
|
12
|
+
include LostInTranslations::ActiveRecord
|
|
13
|
+
|
|
14
|
+
translate :title, :first_name
|
|
15
|
+
|
|
16
|
+
def translation_data
|
|
17
|
+
{
|
|
18
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
19
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@user_class.create title: 'Cavaleiro', first_name: 'Joao', last_name: 'Neve'
|
|
25
|
+
@user = @user_class.first
|
|
26
|
+
end
|
|
27
|
+
after { @user.destroy }
|
|
28
|
+
|
|
29
|
+
it_behaves_like "a proper translator"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "when a particular field is not translated" do
|
|
33
|
+
before do
|
|
34
|
+
@user_class = Class.new(ActiveRecord::Base) do
|
|
35
|
+
self.table_name = 'users'
|
|
36
|
+
|
|
37
|
+
include LostInTranslations::ActiveRecord
|
|
38
|
+
|
|
39
|
+
translate :title, :first_name
|
|
40
|
+
|
|
41
|
+
def translation_data
|
|
42
|
+
{
|
|
43
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
44
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@user = @user_class.new title: 'Cavaleiro', first_name: 'Joao', last_name: 'Neve'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "#field must return the original data" do
|
|
53
|
+
I18n.with_locale(:en) do
|
|
54
|
+
expect(@user.last_name).to eq 'Neve'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LostInTranslations::Base do
|
|
4
|
+
|
|
5
|
+
describe '.translation_data_field =' do
|
|
6
|
+
|
|
7
|
+
context "when it points to a real method" do
|
|
8
|
+
before do
|
|
9
|
+
@user_class = Struct.new(:first_name, :last_name) do
|
|
10
|
+
include LostInTranslations::Base
|
|
11
|
+
|
|
12
|
+
self.translation_data_field = :translation_json
|
|
13
|
+
|
|
14
|
+
def translation_json
|
|
15
|
+
{
|
|
16
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
17
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
LostInTranslations.define_translation_methods(@user_class, :first_name)
|
|
23
|
+
|
|
24
|
+
@user = @user_class.new('Joao', 'Neve')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "LostInTranslations.translate must return a translation" do
|
|
28
|
+
expect(LostInTranslations.translate(@user, :first_name, :en)).to eq 'Jon'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "calling a field not translated, must return the original data" do
|
|
32
|
+
I18n.with_locale(:en) do
|
|
33
|
+
expect(@user.last_name).to eq 'Neve'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "and the translation data doesn't contain results" do
|
|
38
|
+
it "LostInTranslations.translate must return nil" do
|
|
39
|
+
expect(LostInTranslations.translate(@user, :first_name, :de)).to be_nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "when it DOENS't point to a real method" do
|
|
45
|
+
before do
|
|
46
|
+
@user_class = Struct.new(:first_name, :last_name) do
|
|
47
|
+
include LostInTranslations::Base
|
|
48
|
+
|
|
49
|
+
self.translation_data_field = :translation_json
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
LostInTranslations.define_translation_methods(@user_class, :first_name)
|
|
53
|
+
|
|
54
|
+
@user = @user_class.new('Joao', 'Neve')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "LostInTranslations.translate must raise an error" do
|
|
58
|
+
expect { LostInTranslations.translate(@user, :first_name, :en) }.to raise_error(NotImplementedError)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "calling a field not translated, must return the original data" do
|
|
62
|
+
I18n.with_locale(:en) do
|
|
63
|
+
expect(@user.last_name).to eq 'Neve'
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LostInTranslations do
|
|
4
|
+
|
|
5
|
+
describe "#included" do
|
|
6
|
+
context "when the object inherits from ActiveRecord" do
|
|
7
|
+
before do
|
|
8
|
+
@user_class = Class.new(ActiveRecord::Base) do
|
|
9
|
+
self.table_name = 'users'
|
|
10
|
+
|
|
11
|
+
include LostInTranslations
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "LostInTranslations::ActiveRecord must be included" do
|
|
16
|
+
expect(@user_class.ancestors.include?(LostInTranslations::ActiveRecord)).to be true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when the object DOES NOT inherit from ActiveRecord" do
|
|
21
|
+
before do
|
|
22
|
+
@user_class = Class.new { include LostInTranslations }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "LostInTranslations::Ruby must be included" do
|
|
26
|
+
expect(@user_class.ancestors.include?(LostInTranslations::Ruby)).to be true
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe "#config.translation_data_field" do
|
|
32
|
+
|
|
33
|
+
context "when setting the 'translation_data_field' to a known method" do
|
|
34
|
+
before do
|
|
35
|
+
LostInTranslations.configure do |config|
|
|
36
|
+
config.translation_data_field = 'translation_json'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@user_class = Struct.new(:first_name, :last_name) do
|
|
40
|
+
include LostInTranslations
|
|
41
|
+
|
|
42
|
+
translate :first_name
|
|
43
|
+
|
|
44
|
+
def translation_json
|
|
45
|
+
{ en: { first_name: 'Jon', last_name: 'Snow' } }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@user = @user_class.new('joao', 'neve')
|
|
50
|
+
end
|
|
51
|
+
after { LostInTranslations.config.translation_data_field = 'translation_data' }
|
|
52
|
+
|
|
53
|
+
it "calling a translated field must return a translation" do
|
|
54
|
+
I18n.with_locale(:en) do
|
|
55
|
+
expect(@user.first_name).to eq 'Jon'
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "when setting the 'translation_data_field' to an unknown method" do
|
|
61
|
+
before do
|
|
62
|
+
LostInTranslations.configure do |config|
|
|
63
|
+
config.translation_data_field = 'translation_json'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
@user_class = Struct.new(:first_name, :last_name) do
|
|
67
|
+
include LostInTranslations
|
|
68
|
+
|
|
69
|
+
translate :first_name
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
@user = @user_class.new('joao', 'neve')
|
|
73
|
+
end
|
|
74
|
+
after { LostInTranslations.config.translation_data_field = 'translation_data' }
|
|
75
|
+
|
|
76
|
+
it "calling a translated field, must raise an error" do
|
|
77
|
+
I18n.with_locale(:en) do
|
|
78
|
+
expect { @user.first_name }.to raise_error(NotImplementedError)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "#config.translator" do
|
|
86
|
+
|
|
87
|
+
context "changing the source of the translation_data" do
|
|
88
|
+
before do
|
|
89
|
+
LostInTranslations.configure do |config|
|
|
90
|
+
config.translator = Class.new(LostInTranslations::Translator) do
|
|
91
|
+
def self.translation_data(object)
|
|
92
|
+
{ en: { first_name: 'Jon', last_name: 'Snow' } }
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
@user_class = Struct.new(:first_name, :last_name) do
|
|
98
|
+
include LostInTranslations
|
|
99
|
+
|
|
100
|
+
translate :first_name
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
@user = @user_class.new('joao', 'neve')
|
|
104
|
+
end
|
|
105
|
+
after { LostInTranslations.config.translator = LostInTranslations::Translator }
|
|
106
|
+
|
|
107
|
+
it "calling a translated field must return a translation" do
|
|
108
|
+
I18n.with_locale(:en) do
|
|
109
|
+
expect(@user.first_name).to eq 'Jon'
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LostInTranslations::Ruby do
|
|
4
|
+
|
|
5
|
+
describe '.translate' do
|
|
6
|
+
|
|
7
|
+
context "when translating a field" do
|
|
8
|
+
before do
|
|
9
|
+
@user_class = Struct.new(:title, :first_name, :last_name) do
|
|
10
|
+
include LostInTranslations
|
|
11
|
+
|
|
12
|
+
translate :title, :first_name
|
|
13
|
+
|
|
14
|
+
def translation_data
|
|
15
|
+
{
|
|
16
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
17
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
@user = @user_class.new('Cavaleiro', 'Joao', 'Neve')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it_behaves_like "a proper translator"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when a particular field is not translated" do
|
|
29
|
+
before do
|
|
30
|
+
@user_class = Struct.new(:title, :first_name, :last_name) do
|
|
31
|
+
include LostInTranslations
|
|
32
|
+
|
|
33
|
+
translate :title, :first_name
|
|
34
|
+
|
|
35
|
+
def translation_data
|
|
36
|
+
{
|
|
37
|
+
en: { first_name: 'Jon', last_name: 'Snow' },
|
|
38
|
+
fr: { first_name: 'Jean', last_name: 'Neige' }
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
@user = @user_class.new('Cavaleiro', 'Joao', 'Neve')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "#field must return the original data" do
|
|
47
|
+
I18n.with_locale(:en) do
|
|
48
|
+
expect(@user.last_name).to eq 'Neve'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "codeclimate-test-reporter"
|
|
2
|
+
|
|
3
|
+
CodeClimate::TestReporter.start
|
|
4
|
+
|
|
5
|
+
require "simplecov"
|
|
6
|
+
|
|
7
|
+
SimpleCov.start do
|
|
8
|
+
root("lib/")
|
|
9
|
+
coverage_dir("../tmp/coverage/")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
$: << File.expand_path('../', File.dirname(__FILE__))
|
|
13
|
+
|
|
14
|
+
require 'pry-byebug'
|
|
15
|
+
require 'active_record'
|
|
16
|
+
require 'lost_in_translations'
|
|
17
|
+
|
|
18
|
+
I18n.available_locales = [:en, :pt, :fr, :de]
|
|
19
|
+
I18n.default_locale = :pt
|
|
20
|
+
|
|
21
|
+
ActiveRecord::Base.establish_connection \
|
|
22
|
+
pool: 5,
|
|
23
|
+
timeout: 5000,
|
|
24
|
+
adapter: 'sqlite3',
|
|
25
|
+
database: File.expand_path('../spec/support/db/test.sqlite3', File.dirname(__FILE__))
|
|
26
|
+
|
|
27
|
+
Dir["./spec/**/support/**/*.rb"].each do |file|
|
|
28
|
+
require file
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
RSpec.configure do |config|
|
|
32
|
+
config.run_all_when_everything_filtered = true
|
|
33
|
+
|
|
34
|
+
config.order = 'random'
|
|
35
|
+
end
|
|
Binary file
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
shared_examples_for "a proper translator" do
|
|
2
|
+
it "#field must return a translation" do
|
|
3
|
+
I18n.with_locale(:en) do
|
|
4
|
+
expect(@user.first_name).to eq 'Jon'
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
context "when the translation data doesn't contain the desired language" do
|
|
9
|
+
it "#field must return the original data" do
|
|
10
|
+
I18n.with_locale(:de) do
|
|
11
|
+
expect(@user.first_name).to eq 'Joao'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "when the translation data doesn't contain the desired field" do
|
|
17
|
+
it "#field must return the original data" do
|
|
18
|
+
I18n.with_locale(:en) do
|
|
19
|
+
expect(@user.title).to eq 'Cavaleiro'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: lost_in_translations
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- StreetBees Dev Team
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-07-07 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rspec
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - '='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 3.4.0
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 3.4.0
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: byebug
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - '='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 8.2.5
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - '='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 8.2.5
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: sqlite3
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - '='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 1.3.11
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - '='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 1.3.11
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.37.2
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.37.2
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: simplecov
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - '='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 0.11.2
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - '='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 0.11.2
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: pry-byebug
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - '='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 3.3.0
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - '='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: 3.3.0
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: activerecord
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - '='
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 4.2.6
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - '='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: 4.2.6
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: codeclimate-test-reporter
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - '='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: 0.4.8
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - '='
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: 0.4.8
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: i18n
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0.7'
|
|
132
|
+
type: :runtime
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0.7'
|
|
139
|
+
description: Super light Translation Ruby Gem agnostic to your framework and source
|
|
140
|
+
data
|
|
141
|
+
email: dev@streetbees.com
|
|
142
|
+
executables: []
|
|
143
|
+
extensions: []
|
|
144
|
+
extra_rdoc_files: []
|
|
145
|
+
files:
|
|
146
|
+
- ".gitignore"
|
|
147
|
+
- ".rspec"
|
|
148
|
+
- ".rubocop.yml"
|
|
149
|
+
- ".ruby-version"
|
|
150
|
+
- ".travis.yml"
|
|
151
|
+
- Gemfile
|
|
152
|
+
- Gemfile.lock
|
|
153
|
+
- README.md
|
|
154
|
+
- lib/lost_in_translations.rb
|
|
155
|
+
- lib/lost_in_translations/active_record.rb
|
|
156
|
+
- lib/lost_in_translations/base.rb
|
|
157
|
+
- lib/lost_in_translations/config.rb
|
|
158
|
+
- lib/lost_in_translations/ruby.rb
|
|
159
|
+
- lib/lost_in_translations/translator.rb
|
|
160
|
+
- lib/lost_in_translations/version.rb
|
|
161
|
+
- lost_in_translations.gemspec
|
|
162
|
+
- spec/lost_in_translations/active_record_spec.rb
|
|
163
|
+
- spec/lost_in_translations/base_spec.rb
|
|
164
|
+
- spec/lost_in_translations/lost_in_translations_spec.rb
|
|
165
|
+
- spec/lost_in_translations/ruby_spec.rb
|
|
166
|
+
- spec/spec_helper.rb
|
|
167
|
+
- spec/support/db/test.sqlite3
|
|
168
|
+
- spec/support/shared_examples/proper_translator.rb
|
|
169
|
+
homepage: https://github.com/streetbees/lost_in_translations
|
|
170
|
+
licenses:
|
|
171
|
+
- MIT
|
|
172
|
+
metadata: {}
|
|
173
|
+
post_install_message:
|
|
174
|
+
rdoc_options: []
|
|
175
|
+
require_paths:
|
|
176
|
+
- lib
|
|
177
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
|
+
requirements:
|
|
179
|
+
- - ">="
|
|
180
|
+
- !ruby/object:Gem::Version
|
|
181
|
+
version: '0'
|
|
182
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
|
+
requirements:
|
|
184
|
+
- - ">="
|
|
185
|
+
- !ruby/object:Gem::Version
|
|
186
|
+
version: '0'
|
|
187
|
+
requirements: []
|
|
188
|
+
rubyforge_project:
|
|
189
|
+
rubygems_version: 2.5.1
|
|
190
|
+
signing_key:
|
|
191
|
+
specification_version: 4
|
|
192
|
+
summary: Ruby Translation Gem
|
|
193
|
+
test_files:
|
|
194
|
+
- spec/lost_in_translations/active_record_spec.rb
|
|
195
|
+
- spec/lost_in_translations/base_spec.rb
|
|
196
|
+
- spec/lost_in_translations/lost_in_translations_spec.rb
|
|
197
|
+
- spec/lost_in_translations/ruby_spec.rb
|
|
198
|
+
- spec/spec_helper.rb
|
|
199
|
+
- spec/support/db/test.sqlite3
|
|
200
|
+
- spec/support/shared_examples/proper_translator.rb
|