has_translations 0.3.1 → 0.3.2
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.md +1 -1
- data/Rakefile +1 -1
- data/has_translations.gemspec +54 -0
- data/lib/has_translations.rb +19 -13
- data/test/has_translations_test.rb +14 -2
- data/test/schema.rb +2 -3
- metadata +9 -8
data/README.md
CHANGED
data/Rakefile
CHANGED
|
@@ -31,7 +31,7 @@ begin
|
|
|
31
31
|
gemspec.email = "dmitry.polushkin@gmail.com"
|
|
32
32
|
gemspec.homepage = "http://github.com/dmitry/has_translations"
|
|
33
33
|
gemspec.authors = ["Dmitry Polushkin"]
|
|
34
|
-
gemspec.version = '0.3.
|
|
34
|
+
gemspec.version = '0.3.2'
|
|
35
35
|
end
|
|
36
36
|
rescue LoadError
|
|
37
37
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = %q{has_translations}
|
|
8
|
+
s.version = "0.3.2"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Dmitry Polushkin"]
|
|
12
|
+
s.date = %q{2011-02-04}
|
|
13
|
+
s.description = %q{Create translations for your ActiveRecord models. Uses delegate pattern. Fully tested and used in a several production sites.}
|
|
14
|
+
s.email = %q{dmitry.polushkin@gmail.com}
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"README.md"
|
|
17
|
+
]
|
|
18
|
+
s.files = [
|
|
19
|
+
"MIT-LICENSE",
|
|
20
|
+
"README.md",
|
|
21
|
+
"Rakefile",
|
|
22
|
+
"generators/has_translations/USAGE",
|
|
23
|
+
"generators/has_translations/has_translations_generator.rb",
|
|
24
|
+
"has_translations.gemspec",
|
|
25
|
+
"init.rb",
|
|
26
|
+
"install.rb",
|
|
27
|
+
"lib/has_translations.rb",
|
|
28
|
+
"tasks/has_translations_tasks.rake",
|
|
29
|
+
"test/.gitignore",
|
|
30
|
+
"test/has_translations_test.rb",
|
|
31
|
+
"test/schema.rb",
|
|
32
|
+
"test/test_helper.rb",
|
|
33
|
+
"uninstall.rb"
|
|
34
|
+
]
|
|
35
|
+
s.homepage = %q{http://github.com/dmitry/has_translations}
|
|
36
|
+
s.require_paths = ["lib"]
|
|
37
|
+
s.rubygems_version = %q{1.5.0}
|
|
38
|
+
s.summary = %q{Create translations for your ActiveRecord models.}
|
|
39
|
+
s.test_files = [
|
|
40
|
+
"test/has_translations_test.rb",
|
|
41
|
+
"test/schema.rb",
|
|
42
|
+
"test/test_helper.rb"
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
if s.respond_to? :specification_version then
|
|
46
|
+
s.specification_version = 3
|
|
47
|
+
|
|
48
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
49
|
+
else
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
data/lib/has_translations.rb
CHANGED
|
@@ -89,15 +89,23 @@ class ActiveRecord::Base
|
|
|
89
89
|
|
|
90
90
|
translation_class_name = "#{self.model_name}Translation"
|
|
91
91
|
translation_class = translation_class_name.constantize
|
|
92
|
-
belongs_to = self.model_name.demodulize.
|
|
92
|
+
belongs_to = self.model_name.demodulize.underscore.to_sym
|
|
93
93
|
|
|
94
94
|
write_inheritable_attribute :has_translations_options, options
|
|
95
95
|
class_inheritable_reader :has_translations_options
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
locale =
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
def find_or_create_translation(locale)
|
|
98
|
+
locale = locale.to_s
|
|
99
|
+
(find_translation(locale) || self.translations.new).tap do |t|
|
|
100
|
+
t.locale = locale
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def find_or_build_translation(locale)
|
|
105
|
+
locale = locale.to_s
|
|
106
|
+
(find_translation(locale) || self.translations.build).tap do |t|
|
|
107
|
+
t.locale = locale
|
|
108
|
+
end
|
|
101
109
|
end
|
|
102
110
|
|
|
103
111
|
def translation(locale, fallback=has_translations_options[:fallback])
|
|
@@ -107,7 +115,7 @@ class ActiveRecord::Base
|
|
|
107
115
|
|
|
108
116
|
def all_translations
|
|
109
117
|
t = I18n.available_locales.map do |locale|
|
|
110
|
-
[locale,
|
|
118
|
+
[locale, find_or_create_translation(locale)]
|
|
111
119
|
end
|
|
112
120
|
ActiveSupport::OrderedHash[t]
|
|
113
121
|
end
|
|
@@ -128,7 +136,7 @@ class ActiveRecord::Base
|
|
|
128
136
|
if options[:writer]
|
|
129
137
|
attrs.each do |name|
|
|
130
138
|
send :define_method, "#{name}=" do |value|
|
|
131
|
-
translation = find_or_build_translation(I18n.locale
|
|
139
|
+
translation = find_or_build_translation(I18n.locale)
|
|
132
140
|
translation.send(:"#{name}=", value)
|
|
133
141
|
end
|
|
134
142
|
end
|
|
@@ -140,12 +148,10 @@ class ActiveRecord::Base
|
|
|
140
148
|
translation_class.validates_presence_of :locale
|
|
141
149
|
translation_class.validates_uniqueness_of :locale, :scope => :"#{belongs_to}_id"
|
|
142
150
|
|
|
143
|
-
# Rails
|
|
144
|
-
if
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
named_scope :translated, lambda { |locale| {:conditions => ["#{translation_class.table_name}.locale = ?", locale.to_s], :joins => :translations} }
|
|
148
|
-
end
|
|
151
|
+
# Workaround to support Rails 2
|
|
152
|
+
scope_method = if ActiveRecord::VERSION::MAJOR < 3 then :named_scope else :scope end
|
|
153
|
+
|
|
154
|
+
send scope_method, :translated, lambda { |locale| {:conditions => ["#{translation_class.table_name}.locale = ?", locale.to_s], :joins => :translations} }
|
|
149
155
|
|
|
150
156
|
private
|
|
151
157
|
|
|
@@ -23,7 +23,10 @@ class HasTranslationsTest < Test::Unit::TestCase
|
|
|
23
23
|
|
|
24
24
|
def test_reader_text_for_a_given_locale
|
|
25
25
|
article = Article.create!
|
|
26
|
-
article_translation = ArticleTranslation.
|
|
26
|
+
article_translation = ArticleTranslation.new(:description => 'desc', :text => 'text')
|
|
27
|
+
article_translation.article = article
|
|
28
|
+
article_translation.locale = 'en'
|
|
29
|
+
article_translation.save!
|
|
27
30
|
assert_not_equal article.text, article_translation.text
|
|
28
31
|
I18n.locale = :en
|
|
29
32
|
assert_equal article.text, article_translation.text
|
|
@@ -45,7 +48,10 @@ class HasTranslationsTest < Test::Unit::TestCase
|
|
|
45
48
|
def test_translations_association_and_translations
|
|
46
49
|
article = Article.create!
|
|
47
50
|
assert_equal [], article.translations
|
|
48
|
-
article_translation = ArticleTranslation.
|
|
51
|
+
article_translation = ArticleTranslation.new(:description => 'описание', :text => 'текст')
|
|
52
|
+
article_translation.article = article
|
|
53
|
+
article_translation.locale = 'ru'
|
|
54
|
+
article_translation.save!
|
|
49
55
|
assert_equal [], article.translations
|
|
50
56
|
assert_equal [article_translation], article.reload.translations
|
|
51
57
|
assert_equal 'текст', article.text
|
|
@@ -57,6 +63,12 @@ class HasTranslationsTest < Test::Unit::TestCase
|
|
|
57
63
|
assert_equal [], ArticleTranslation.all
|
|
58
64
|
end
|
|
59
65
|
|
|
66
|
+
def test_all_translation_works_fine_with_attr_accessible
|
|
67
|
+
article = Article.create!
|
|
68
|
+
t = article.all_translations
|
|
69
|
+
assert_equal 'ru', t[:ru].locale
|
|
70
|
+
end
|
|
71
|
+
|
|
60
72
|
def test_translation_validations
|
|
61
73
|
article_translation = ArticleTranslation.create(:description => 'description', :text => 'text')
|
|
62
74
|
assert article_translation.errors[:locale].present?
|
data/test/schema.rb
CHANGED
|
@@ -22,15 +22,14 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
class ArticleTranslation < ActiveRecord::Base
|
|
25
|
+
attr_accessible :description, :text
|
|
25
26
|
end
|
|
26
|
-
|
|
27
27
|
class Article < ActiveRecord::Base
|
|
28
28
|
translations :description, :text, :writer => true
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
class TeamTranslation < ActiveRecord::Base
|
|
32
32
|
end
|
|
33
|
-
|
|
34
33
|
class Team < ActiveRecord::Base
|
|
35
34
|
translations :text, :fallback => true, :nil => nil
|
|
36
|
-
end
|
|
35
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: has_translations
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
5
|
-
prerelease:
|
|
4
|
+
hash: 23
|
|
5
|
+
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 3
|
|
9
|
-
-
|
|
10
|
-
version: 0.3.
|
|
9
|
+
- 2
|
|
10
|
+
version: 0.3.2
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Dmitry Polushkin
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date:
|
|
18
|
+
date: 2011-02-04 00:00:00 +00:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies: []
|
|
21
21
|
|
|
@@ -33,6 +33,7 @@ files:
|
|
|
33
33
|
- Rakefile
|
|
34
34
|
- generators/has_translations/USAGE
|
|
35
35
|
- generators/has_translations/has_translations_generator.rb
|
|
36
|
+
- has_translations.gemspec
|
|
36
37
|
- init.rb
|
|
37
38
|
- install.rb
|
|
38
39
|
- lib/has_translations.rb
|
|
@@ -47,8 +48,8 @@ homepage: http://github.com/dmitry/has_translations
|
|
|
47
48
|
licenses: []
|
|
48
49
|
|
|
49
50
|
post_install_message:
|
|
50
|
-
rdoc_options:
|
|
51
|
-
|
|
51
|
+
rdoc_options: []
|
|
52
|
+
|
|
52
53
|
require_paths:
|
|
53
54
|
- lib
|
|
54
55
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
@@ -72,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
72
73
|
requirements: []
|
|
73
74
|
|
|
74
75
|
rubyforge_project:
|
|
75
|
-
rubygems_version: 1.
|
|
76
|
+
rubygems_version: 1.5.0
|
|
76
77
|
signing_key:
|
|
77
78
|
specification_version: 3
|
|
78
79
|
summary: Create translations for your ActiveRecord models.
|