transilator 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -8
- data/lib/transilator.rb +27 -0
- data/lib/transilator/active_record_extensions.rb +14 -2
- data/lib/transilator/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ca38e76b1e55e598e90bf1f09d4bba64d82bb5f
|
4
|
+
data.tar.gz: 7aed382a01858d6d9c7ed3d865cc088448b134a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a03646844e4bc24feb1757d15a5f927de6b18e13a77ad5abcf6ceb70c0d264e18b1a0237b9322268e0b7bce2f34418477f8428c75b58784bb59a55714bf89bf7
|
7
|
+
data.tar.gz: 2e3da9b600c787519a73abc2701f5ac09d39941361cd2dcffceb2bda329ebf34cb2aaa636b9ac684363ab489c3f211adad5ee27b5e6c34f3a391d71f4bf789fa
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Transilator
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![CircleCI](https://circleci.com/gh/hendricius/transilator.svg?style=svg)](https://circleci.com/gh/hendricius/transilator)
|
4
4
|
|
5
5
|
Transilator makes storing translations for database records painless.
|
6
6
|
|
@@ -32,11 +32,11 @@ You may need to create migration for your model as usual. Assuming you have no
|
|
32
32
|
table yet, create the table:
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
create_table :posts do |t|
|
36
|
+
t.hstore :title # note for this to work you need to enable the hstore extension in your database.
|
37
|
+
t.jsonb :summary # this is the suggested way.
|
38
|
+
t.timestamps
|
39
|
+
end
|
40
40
|
```
|
41
41
|
|
42
42
|
Then adjust your model and integrate transilator:
|
@@ -49,6 +49,8 @@ end
|
|
49
49
|
|
50
50
|
Thats it!
|
51
51
|
|
52
|
+
**Basic usage**
|
53
|
+
|
52
54
|
Now you are able to translate values for the attributes :title and :description per locale:
|
53
55
|
|
54
56
|
```ruby
|
@@ -71,10 +73,28 @@ post.title_en = 'I have no idea what I am doing'
|
|
71
73
|
post.title_en #=> I have no idea what I am doing
|
72
74
|
```
|
73
75
|
|
76
|
+
You can pass the values directly during initialisation of an object:
|
77
|
+
```ruby
|
78
|
+
Post.new(title: {en: 'The German', de: 'Serr German'})
|
79
|
+
```
|
80
|
+
|
81
|
+
**Fallbacks**
|
82
|
+
|
83
|
+
You can setup fallbacks in case you are missing data from one language. Then
|
84
|
+
the next language is used based on the order in the fallbacks array.
|
85
|
+
|
86
|
+
Create an initializer `initializers/transilator.rb` in your rails app.
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
Transilator.configure do |config|
|
90
|
+
config.locale_fallbacks = { "de" => ["en", "at"] }
|
91
|
+
end
|
92
|
+
```
|
74
93
|
|
75
|
-
|
94
|
+
Now in case we wouldn't have a German translation we fallback to English. If
|
95
|
+
we have no English translation then we will proceed and try our Austrian
|
96
|
+
translation. If that doesn't work then empty string is returned.
|
76
97
|
|
77
|
-
Post.new(title: {en: 'The German', de: 'Serr German'})
|
78
98
|
|
79
99
|
## Performance ##
|
80
100
|
|
data/lib/transilator.rb
CHANGED
@@ -2,4 +2,31 @@ require "transilator/version"
|
|
2
2
|
require "transilator/active_record_extensions"
|
3
3
|
|
4
4
|
module Transilator
|
5
|
+
class << self
|
6
|
+
attr_accessor :configuration
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.configure
|
10
|
+
self.configuration ||= Configuration.new
|
11
|
+
yield(configuration)
|
12
|
+
end
|
13
|
+
|
14
|
+
# returns the config object
|
15
|
+
def self.config
|
16
|
+
self.configuration = Configuration.new unless self.configuration
|
17
|
+
self.configuration
|
18
|
+
end
|
19
|
+
|
20
|
+
class Configuration
|
21
|
+
attr_accessor :locale_fallbacks
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@locale_fallbacks = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
# returns an array with fallbacks for the given locale
|
28
|
+
def get_fallbacks_for_locale(locale)
|
29
|
+
locale_fallbacks[locale] || []
|
30
|
+
end
|
31
|
+
end
|
5
32
|
end
|
@@ -5,14 +5,26 @@ module Transilator
|
|
5
5
|
|
6
6
|
def transilator(*args)
|
7
7
|
|
8
|
-
|
9
8
|
args.each do |attribute|
|
10
9
|
|
11
10
|
# read the attribute from the hstore attribute and return it.
|
12
11
|
#
|
13
12
|
# returns the attribute or an empty string if the attribute is nil
|
14
13
|
define_method attribute do
|
15
|
-
|
14
|
+
locale = I18n.locale.to_s
|
15
|
+
attribute_value_hash = (self[attribute] || {})
|
16
|
+
value = (attribute_value_hash)[locale] || ""
|
17
|
+
# we have a value, so let's abort.
|
18
|
+
return value unless value.empty?
|
19
|
+
# now implement our fallback mechanism
|
20
|
+
fallbacks_for_locale = Transilator.config.get_fallbacks_for_locale(locale)
|
21
|
+
return value if fallbacks_for_locale.empty?
|
22
|
+
# now do the magic for figuring out the fallback
|
23
|
+
fallback_locale_to_use = fallbacks_for_locale.find {|f| (attribute_value_hash)[f] }
|
24
|
+
# no fallback that can be used found.
|
25
|
+
return "" unless fallback_locale_to_use
|
26
|
+
# return our value or an empty string
|
27
|
+
attribute_value_hash[fallback_locale_to_use] || ""
|
16
28
|
end
|
17
29
|
|
18
30
|
# set the attribute on the model on the hstore hash
|
data/lib/transilator/version.rb
CHANGED