trendi18n 0.9.2 → 0.9.3
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.
- data/README.rdoc +6 -0
- data/VERSION +1 -1
- data/app/models/translation.rb +20 -3
- data/lib/trendi18n/backend/trendi18n.rb +15 -1
- data/lib/trendi18n/scope_translations.rb +13 -0
- data/rails/init.rb +1 -0
- data/spec/test_application/config/environment.rb +2 -2
- data/spec/test_application/config/locales/fr.yml +2 -0
- data/spec/test_application/features/step_definitions/translations_steps.rb +0 -3
- data/spec/test_application/spec/backend_spec.rb +25 -3
- data/spec/test_application/spec/models/translation_spec.rb +30 -1
- metadata +4 -2
data/README.rdoc
CHANGED
|
@@ -46,6 +46,12 @@ If you want to use trendi18n in your app you should do three steps:
|
|
|
46
46
|
|
|
47
47
|
= Changelog
|
|
48
48
|
|
|
49
|
+
=== 0.9.3
|
|
50
|
+
|
|
51
|
+
* Return all translations form scope, when scope given as a key
|
|
52
|
+
* Trendi18n::Backend::Trendi18n.available_locales use data both from localization files and from database
|
|
53
|
+
* Translation.get_locales return an array of symbols in place of an array of strings
|
|
54
|
+
|
|
49
55
|
=== 0.9.2
|
|
50
56
|
|
|
51
57
|
* Backend reloading system (multi-threading supported)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.3
|
data/app/models/translation.rb
CHANGED
|
@@ -12,6 +12,11 @@ class Translation < ActiveRecord::Base
|
|
|
12
12
|
|
|
13
13
|
@@locales = []
|
|
14
14
|
|
|
15
|
+
# return true if there is no translation with key == name, and there is some translations with scope == name
|
|
16
|
+
def self.scope?(name, locale = I18n.locale.to_s)
|
|
17
|
+
!self.exists?(:key => name, :locale => locale, :scope => nil) && self.exists?(:scope => name, :locale => locale)
|
|
18
|
+
end
|
|
19
|
+
|
|
15
20
|
# return locales which translations are stored in db
|
|
16
21
|
def self.get_locales
|
|
17
22
|
@@locales
|
|
@@ -19,7 +24,7 @@ class Translation < ActiveRecord::Base
|
|
|
19
24
|
|
|
20
25
|
# read locales which translation are stored in db
|
|
21
26
|
def self.set_locales
|
|
22
|
-
@@locales = self.all(:select => "DISTINCT(locale)", :order => "locale ASC").map { |obj| obj.locale }
|
|
27
|
+
@@locales = self.all(:select => "DISTINCT(locale)", :order => "locale ASC").map { |obj| obj.locale.to_sym }
|
|
23
28
|
end
|
|
24
29
|
|
|
25
30
|
# Set @read_time, date and time of first database read on current update.
|
|
@@ -126,9 +131,21 @@ class Translation < ActiveRecord::Base
|
|
|
126
131
|
end
|
|
127
132
|
|
|
128
133
|
# return hash ready to by stored as translation
|
|
129
|
-
def to_translation_hash
|
|
130
|
-
path =
|
|
134
|
+
def to_translation_hash()
|
|
135
|
+
path = []
|
|
136
|
+
path += self.scope.split(".") unless self.scope.nil?
|
|
137
|
+
path << self.key
|
|
131
138
|
return path.reverse.inject(self) {|before, step| { step => before}}
|
|
132
139
|
end
|
|
133
140
|
|
|
141
|
+
# return ready to by stored as translations hash of translations in scope
|
|
142
|
+
def self.scope_to_translation_hash(scope, locale = I18n.locale.to_s)
|
|
143
|
+
children = self.find_by_sql ["SELECT * FROM translations WHERE scope LIKE ? and locale=? ORDER BY id", scope + "%", locale]
|
|
144
|
+
hash = {}
|
|
145
|
+
for child in children
|
|
146
|
+
hash.deep_merge! child.to_translation_hash()
|
|
147
|
+
end
|
|
148
|
+
Trendi18n::ScopeTranslations.new(locale, hash)
|
|
149
|
+
end
|
|
150
|
+
|
|
134
151
|
end
|
|
@@ -10,7 +10,7 @@ module Trendi18n
|
|
|
10
10
|
# return available locales, based on informaton form Translation model
|
|
11
11
|
def available_locales
|
|
12
12
|
Translation.set_read_time
|
|
13
|
-
Translation.get_locales
|
|
13
|
+
Translation.get_locales | nested.available_locales
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# translate key in locale using options
|
|
@@ -27,6 +27,13 @@ module Trendi18n
|
|
|
27
27
|
# read values of scope and default options and delete them form options
|
|
28
28
|
values = options.reject {|name, value| [:scope, :default].include?(name)}
|
|
29
29
|
|
|
30
|
+
|
|
31
|
+
# cache and return all translation from scope if it's used as key
|
|
32
|
+
if Translation.scope?(key_with_scope = [scope, key].delete_if{|x| x.blank?}.join("."), loc = locale.to_s)
|
|
33
|
+
cache_translation(result = Translation.scope_to_translation_hash(key_with_scope, loc))
|
|
34
|
+
return result.to_translation_hash[key.to_s]
|
|
35
|
+
end
|
|
36
|
+
|
|
30
37
|
if key.is_a?(Symbol) # if key is a Symbol
|
|
31
38
|
begin
|
|
32
39
|
return nested.translate(locale, key, options) # use nested translete
|
|
@@ -79,6 +86,13 @@ module Trendi18n
|
|
|
79
86
|
store_translations(translation.locale, translation.to_translation_hash)
|
|
80
87
|
end
|
|
81
88
|
|
|
89
|
+
# cache all translations in scope
|
|
90
|
+
def cache_translations_from_scope(scope_translation)
|
|
91
|
+
for hash in scope_translation.to_translation_hash
|
|
92
|
+
cache_translation(ScopeTranslations.new(scope_translation.locale, hash))
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
82
96
|
end
|
|
83
97
|
end
|
|
84
98
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Trendi18n
|
|
2
|
+
|
|
3
|
+
# Simple class use to caching hash of translations in scope
|
|
4
|
+
class ScopeTranslations
|
|
5
|
+
|
|
6
|
+
attr_accessor :locale, :to_translation_hash
|
|
7
|
+
|
|
8
|
+
def initialize(locale, to_translation_hash)
|
|
9
|
+
@locale, @to_translation_hash = locale, to_translation_hash
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
data/rails/init.rb
CHANGED
|
@@ -39,6 +39,6 @@ Rails::Initializer.run do |config|
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}')]
|
|
43
|
+
config.i18n.default_locale = :en
|
|
44
44
|
end
|
|
@@ -10,9 +10,6 @@ Given /^I have relocalized "([^\"]*)" from "([^\"]*)" to "([^\"]*)"$/ do |key, o
|
|
|
10
10
|
Translation.first(:conditions => {:key => key, :locale => old_locale}).update_attribute('locale', new_locale)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
When /^I reloading locales$/ do
|
|
14
|
-
Translation.set_locales
|
|
15
|
-
end
|
|
16
13
|
|
|
17
14
|
|
|
18
15
|
|
|
@@ -39,6 +39,23 @@ describe Trendi18n::Backend::Trendi18n do
|
|
|
39
39
|
I18n.reload!
|
|
40
40
|
I18n.t("test_key")
|
|
41
41
|
end
|
|
42
|
+
|
|
43
|
+
it "should cache all translations from scope, when scope is used as key" do
|
|
44
|
+
Translation.create!(:key => "key_down", :scope => "testscope", :locale => "en")
|
|
45
|
+
Translation.create!(:key => "key_up", :scope => "testscope", :locale => "en")
|
|
46
|
+
I18n.t(:testscope, :locale => "en")
|
|
47
|
+
Translation.should_not_receive(:lookup)
|
|
48
|
+
I18n.t(:key_down, :scope => "testscope", :locale => "en")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should cache all translations from scope and subscopes, when scope is used as key" do
|
|
52
|
+
Translation.create!(:key => "key_down", :scope => "testscope.subtest", :locale => "en")
|
|
53
|
+
Translation.create!(:key => "key_up", :scope => "testscope", :locale => "en")
|
|
54
|
+
I18n.t(:testscope, :locale => "en")
|
|
55
|
+
Translation.should_not_receive(:lookup)
|
|
56
|
+
I18n.t(:key_down, :scope => "testscope.subtest", :locale => "en")
|
|
57
|
+
end
|
|
58
|
+
|
|
42
59
|
describe "up-to-date status" do
|
|
43
60
|
|
|
44
61
|
it "should be up-to-date when there is no translations" do
|
|
@@ -142,10 +159,15 @@ describe Trendi18n::Backend::Trendi18n do
|
|
|
142
159
|
|
|
143
160
|
end
|
|
144
161
|
|
|
145
|
-
describe "while scope given as a key" do
|
|
146
162
|
|
|
147
|
-
|
|
163
|
+
end
|
|
148
164
|
|
|
149
|
-
|
|
165
|
+
it "should return availables_locales merged form db and files" do
|
|
166
|
+
Translation.create!(:locale => "pl", :key => "al_test", :translation => "al_test_in_polish")
|
|
167
|
+
Translation.set_locales
|
|
168
|
+
I18n.backend.available_locales.include?(:pl).should == true
|
|
169
|
+
I18n.backend.available_locales.include?(:en).should == true # created by before(each)
|
|
170
|
+
I18n.backend.available_locales.include?(:fr).should == true # in localization file
|
|
150
171
|
end
|
|
172
|
+
|
|
151
173
|
end
|
|
@@ -99,7 +99,9 @@ describe Translation do
|
|
|
99
99
|
Translation.create!(:key => "key", :locale => "en")
|
|
100
100
|
Translation.create!(:key => "key", :locale => "nl")
|
|
101
101
|
Translation.set_locales
|
|
102
|
-
Translation.get_locales.should ==
|
|
102
|
+
Translation.get_locales.include?(:en).should == true
|
|
103
|
+
Translation.get_locales.include?(:nl).should == true
|
|
104
|
+
Translation.get_locales.include?(:pl).should == true
|
|
103
105
|
end
|
|
104
106
|
|
|
105
107
|
end
|
|
@@ -111,4 +113,31 @@ describe Translation do
|
|
|
111
113
|
I18n.t("with_count", :count => 2).should == "many (2)"
|
|
112
114
|
end
|
|
113
115
|
|
|
116
|
+
describe "scope recognizing" do
|
|
117
|
+
|
|
118
|
+
it "should recognize something is scope, not key" do
|
|
119
|
+
Translation.create!(:key => "key", :locale => "en", :scope => "scope")
|
|
120
|
+
Translation.scope?("scope", "en").should == true
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should recognize something is key, when scope with the same name exists and key has no scope" do
|
|
124
|
+
Translation.create!(:key => "scope", :locale => "en")
|
|
125
|
+
Translation.create!(:key => "key", :scope => "scope", :locale => "en")
|
|
126
|
+
Translation.scope?("scope", "en").should == false
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should recognize something is scope, when key with the same name exists and has some scope" do
|
|
130
|
+
Translation.create!(:key => "scope", :locale => "en", :scope => "real.scope")
|
|
131
|
+
Translation.create!(:key => "key", :locale => "en", :scope => "scope")
|
|
132
|
+
Translation.scope?("scope", "en").should == true
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should recognize something is scope, when key with the same name exists, but has different locale" do
|
|
136
|
+
Translation.create!(:key => "scope", :locale => "pl")
|
|
137
|
+
Translation.create!(:key => "key", :scope => "scope", :locale => "en")
|
|
138
|
+
Translation.scope?("scope", "pl").should == false
|
|
139
|
+
Translation.scope?("scope", "en").should == true
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
114
143
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: trendi18n
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotr Misiurek
|
|
@@ -11,7 +11,7 @@ autorequire:
|
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
13
|
|
|
14
|
-
date:
|
|
14
|
+
date: 2010-01-15 00:00:00 +01:00
|
|
15
15
|
default_executable:
|
|
16
16
|
dependencies:
|
|
17
17
|
- !ruby/object:Gem::Dependency
|
|
@@ -46,6 +46,7 @@ files:
|
|
|
46
46
|
- lib/trendi18n/backend/trendi18n.rb
|
|
47
47
|
- lib/trendi18n/generator/commands.rb
|
|
48
48
|
- lib/trendi18n/handler.rb
|
|
49
|
+
- lib/trendi18n/scope_translations.rb
|
|
49
50
|
- rails/init.rb
|
|
50
51
|
- spec/test_application/README
|
|
51
52
|
- spec/test_application/Rakefile
|
|
@@ -68,6 +69,7 @@ files:
|
|
|
68
69
|
- spec/test_application/config/initializers/new_rails_defaults.rb
|
|
69
70
|
- spec/test_application/config/initializers/session_store.rb
|
|
70
71
|
- spec/test_application/config/locales/en.yml
|
|
72
|
+
- spec/test_application/config/locales/fr.yml
|
|
71
73
|
- spec/test_application/config/routes.rb
|
|
72
74
|
- spec/test_application/db/migrate/20091208195455_create_translations.rb
|
|
73
75
|
- spec/test_application/db/schema.rb
|