traco 0.2.6 → 0.3.1
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.markdown +13 -1
- data/lib/traco/localized_reader.rb +14 -18
- data/lib/traco/translates.rb +14 -5
- data/lib/traco/version.rb +1 -1
- data/spec/traco_spec.rb +24 -2
- metadata +20 -15
data/README.markdown
CHANGED
@@ -36,7 +36,7 @@ Declare these columns in the model:
|
|
36
36
|
|
37
37
|
You can still use your accessors like `title_sv` and `title_sv=` in forms, validations and other code, but you also get:
|
38
38
|
|
39
|
-
`#title`:
|
39
|
+
`#title`: Shows the title in the current locale. If blank, falls back to default locale. Otherwise nil.
|
40
40
|
|
41
41
|
`#title=`: Assigns the title to the column for the current locale, if present. Raises if the column doesn't exist.
|
42
42
|
|
@@ -56,6 +56,18 @@ You can still use your accessors like `title_sv` and `title_sv=` in forms, valid
|
|
56
56
|
And the equivalent methods for `body`, of course.
|
57
57
|
|
58
58
|
|
59
|
+
### Disable fallback
|
60
|
+
|
61
|
+
if you specify
|
62
|
+
|
63
|
+
class Post < ActiveRecord::Base
|
64
|
+
translates :title, :body,
|
65
|
+
fallback: false
|
66
|
+
end
|
67
|
+
|
68
|
+
then `#title` will return `nil` if there is no translation in the current locale, instead of falling back to the default locale.
|
69
|
+
|
70
|
+
|
59
71
|
## Installation
|
60
72
|
|
61
73
|
Add this to your `Gemfile` if you use Bundler 1.1+:
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Traco
|
2
2
|
class LocalizedReader
|
3
|
-
def initialize(record, column)
|
3
|
+
def initialize(record, column, options)
|
4
4
|
@record = record
|
5
5
|
@column = column
|
6
|
+
@fallback = options[:fallback]
|
6
7
|
end
|
7
8
|
|
8
9
|
def value
|
9
|
-
|
10
|
+
locales_to_try.each do |locale|
|
10
11
|
value = @record.send("#{@column}_#{locale}")
|
11
12
|
return value if value.present?
|
12
13
|
end
|
@@ -16,24 +17,19 @@ module Traco
|
|
16
17
|
|
17
18
|
private
|
18
19
|
|
19
|
-
def
|
20
|
-
@
|
21
|
-
locale_sort_value(locale)
|
22
|
-
}
|
20
|
+
def locales_to_try
|
21
|
+
@locales_to_try ||= locale_chain & locales_for_column
|
23
22
|
end
|
24
23
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# Sort the rest alphabetically.
|
35
|
-
locale.to_s
|
36
|
-
end
|
24
|
+
def locale_chain
|
25
|
+
chain = []
|
26
|
+
chain << I18n.locale
|
27
|
+
chain << I18n.default_locale if @fallback
|
28
|
+
chain
|
29
|
+
end
|
30
|
+
|
31
|
+
def locales_for_column
|
32
|
+
@record.class.locales_for_column(@column)
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
data/lib/traco/translates.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Traco
|
2
2
|
module Translates
|
3
3
|
def translates(*columns)
|
4
|
+
options = columns.extract_options!
|
4
5
|
set_up_once
|
5
|
-
store_as_translatable_columns columns.map(&:to_sym)
|
6
|
+
store_as_translatable_columns columns.map(&:to_sym), options
|
6
7
|
end
|
7
8
|
|
8
9
|
private
|
@@ -18,19 +19,27 @@ module Traco
|
|
18
19
|
self.translatable_columns = []
|
19
20
|
end
|
20
21
|
|
21
|
-
def store_as_translatable_columns(columns)
|
22
|
+
def store_as_translatable_columns(columns, options)
|
23
|
+
fallback = options.fetch(:fallback, true)
|
24
|
+
|
22
25
|
self.translatable_columns |= columns
|
23
26
|
|
24
27
|
columns.each do |column|
|
25
|
-
define_localized_reader column
|
28
|
+
define_localized_reader column, :fallback => fallback
|
26
29
|
define_localized_writer column
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
30
|
-
def define_localized_reader(column)
|
33
|
+
def define_localized_reader(column, options)
|
34
|
+
fallback = options[:fallback]
|
35
|
+
|
31
36
|
define_method(column) do
|
32
37
|
@localized_readers ||= {}
|
33
|
-
@localized_readers[column] ||= Traco::LocalizedReader.new(
|
38
|
+
@localized_readers[column] ||= Traco::LocalizedReader.new(
|
39
|
+
self,
|
40
|
+
column,
|
41
|
+
:fallback => fallback
|
42
|
+
)
|
34
43
|
@localized_readers[column].value
|
35
44
|
end
|
36
45
|
end
|
data/lib/traco/version.rb
CHANGED
data/spec/traco_spec.rb
CHANGED
@@ -76,10 +76,10 @@ describe Post, "#title" do
|
|
76
76
|
post.title.should == "Halloa"
|
77
77
|
end
|
78
78
|
|
79
|
-
it "should fall back to any other locale if default locale is blank" do
|
79
|
+
it "should not fall back to any other locale if default locale is blank" do
|
80
80
|
post.title_sv = " "
|
81
81
|
post.title_en = ""
|
82
|
-
post.title.should
|
82
|
+
post.title.should be_nil
|
83
83
|
end
|
84
84
|
|
85
85
|
it "should return nil if all are blank" do
|
@@ -97,6 +97,28 @@ describe Post, "#title" do
|
|
97
97
|
post.title.should == "title"
|
98
98
|
post.body.should == "body"
|
99
99
|
end
|
100
|
+
|
101
|
+
context "with :fallback => false" do
|
102
|
+
let(:post) {
|
103
|
+
Post.new(:title_sv => "Hej", :title_en => "Halloa")
|
104
|
+
}
|
105
|
+
|
106
|
+
before do
|
107
|
+
Post.translates :title, fallback: false
|
108
|
+
I18n.default_locale = :en
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should not fall back to the default locale if locale has no column" do
|
112
|
+
I18n.locale = :ru
|
113
|
+
post.title.should be_nil
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should not fall back to the default locale if blank" do
|
117
|
+
I18n.locale = :sv
|
118
|
+
post.title_sv = " "
|
119
|
+
post.title.should be_nil
|
120
|
+
end
|
121
|
+
end
|
100
122
|
end
|
101
123
|
|
102
124
|
describe Post, "#title=" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70244124230460 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70244124230460
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sqlite3
|
27
|
-
requirement: &
|
27
|
+
requirement: &70244124230040 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70244124230040
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70244124213140 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70244124213140
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70244124212720 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70244124212720
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: guard
|
60
|
-
requirement: &
|
60
|
+
requirement: &70244124212300 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70244124212300
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: guard-rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &70244124211880 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70244124211880
|
80
80
|
description:
|
81
81
|
email:
|
82
82
|
- henrik@barsoom.se
|
@@ -113,12 +113,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
113
|
- - ! '>='
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0'
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
hash: 2678658822643103053
|
116
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
120
|
none: false
|
118
121
|
requirements:
|
119
122
|
- - ! '>='
|
120
123
|
- !ruby/object:Gem::Version
|
121
124
|
version: '0'
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
hash: 2678658822643103053
|
122
128
|
requirements: []
|
123
129
|
rubyforge_project:
|
124
130
|
rubygems_version: 1.8.5
|
@@ -130,4 +136,3 @@ test_files:
|
|
130
136
|
- spec/app/sv.yml
|
131
137
|
- spec/spec_helper.rb
|
132
138
|
- spec/traco_spec.rb
|
133
|
-
has_rdoc:
|