localizable 1.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.
- data/README +50 -0
- data/lib/localizable.rb +95 -0
- metadata +46 -0
data/README
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Localizable gives you an easy way to define localizable fields in your
|
|
2
|
+
MongoMapper::Document or MongoMapper::EmbeddedDocument.
|
|
3
|
+
|
|
4
|
+
Example class definition:
|
|
5
|
+
|
|
6
|
+
class Dummy
|
|
7
|
+
|
|
8
|
+
include MongoMapper::Document
|
|
9
|
+
include Localizable
|
|
10
|
+
|
|
11
|
+
localized_key :fieldname
|
|
12
|
+
localized_key :integer_field, Integer
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Assignment and fetching:
|
|
18
|
+
|
|
19
|
+
obj = Dummy.new
|
|
20
|
+
obj.fieldname = {
|
|
21
|
+
'en' => 'test 1',
|
|
22
|
+
'nl' => 'test 2'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
obj.fieldname('en)' # returns 'test 1'
|
|
26
|
+
obj.fieldname('nl') # returns 'test 2'
|
|
27
|
+
|
|
28
|
+
obj.integer_field = {
|
|
29
|
+
'en => '1',
|
|
30
|
+
'nl' => '2'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
obj.integer_field('en') # returns 1
|
|
34
|
+
obj.integer_field('nl') # returns 2
|
|
35
|
+
|
|
36
|
+
You can define how to fetch the default locale and how to convert the locale
|
|
37
|
+
to a string (it assumes that string is given in the assignment)
|
|
38
|
+
|
|
39
|
+
Localizable.fetch_default_locale = Proc.new do
|
|
40
|
+
Locale.first({ :default => true })
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Localizable.locale_to_string = Proc.new do |locale|
|
|
44
|
+
locale.slug # assuming this is a string value
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
obj.fieldname # returns 'test 1' when Locale.first({ :default => true }).slug == 'en'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
data/lib/localizable.rb
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
module Localizable
|
|
2
|
+
|
|
3
|
+
def self.reset
|
|
4
|
+
@default_locale_fetcher = nil
|
|
5
|
+
@locale_to_string = Proc.new do |l|
|
|
6
|
+
l.to_s
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.fetch_default_locale= (default_locale_fetcher)
|
|
11
|
+
@default_locale_fetcher = default_locale_fetcher
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.fetch_default_locale
|
|
15
|
+
raise 'no default locale fetcher defined' unless @default_locale_fetcher
|
|
16
|
+
@default_locale_fetcher.call
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.locale_to_string (locale)
|
|
20
|
+
@locale_to_string ||= Proc.new do |l|
|
|
21
|
+
l.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@locale_to_string.call(locale)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.locale_to_string= (locale_to_string)
|
|
28
|
+
@locale_to_string = locale_to_string
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.included(model)
|
|
32
|
+
|
|
33
|
+
model.class_eval do
|
|
34
|
+
extend ClassMethods
|
|
35
|
+
include InstanceMethods
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
module ClassMethods
|
|
41
|
+
|
|
42
|
+
def localized_key (fieldname, type = String)
|
|
43
|
+
key "#{fieldname}_values".to_sym, Hash
|
|
44
|
+
localized_type[fieldname] = type
|
|
45
|
+
|
|
46
|
+
self.class_eval <<-end_eval
|
|
47
|
+
|
|
48
|
+
def #{fieldname} (locale = nil, default_text = '')
|
|
49
|
+
fetch_localized_value :#{fieldname}, locale, default_text
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def #{fieldname}= (mapping)
|
|
53
|
+
store_localized_values :#{fieldname}, mapping
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end_eval
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def localized_type
|
|
61
|
+
@localized_type ||= {}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
module InstanceMethods
|
|
67
|
+
|
|
68
|
+
def fetch_localized_value (fieldname, locale, default_text)
|
|
69
|
+
field = "#{fieldname}_values".to_sym
|
|
70
|
+
locale ||= Localizable.fetch_default_locale
|
|
71
|
+
locale_str = Localizable.locale_to_string(locale)
|
|
72
|
+
|
|
73
|
+
if self[field].key?(locale_str)
|
|
74
|
+
localized_type[fieldname].from_mongo(self[field][locale_str])
|
|
75
|
+
else
|
|
76
|
+
default_text
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def store_localized_values (fieldname, mapping)
|
|
81
|
+
field = "#{fieldname}_values".to_sym
|
|
82
|
+
|
|
83
|
+
mapping.each do |locale, value|
|
|
84
|
+
self[field][locale] = localized_type[fieldname].to_mongo(value)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def localized_type
|
|
89
|
+
self.class.localized_type
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: localizable
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '1.0'
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Stefaan Colman
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2011-11-18 00:00:00.000000000 Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: An easy way to localize fields of MongoMapper::Document classes
|
|
15
|
+
email:
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lib/localizable.rb
|
|
21
|
+
- README
|
|
22
|
+
homepage:
|
|
23
|
+
licenses: []
|
|
24
|
+
post_install_message:
|
|
25
|
+
rdoc_options: []
|
|
26
|
+
require_paths:
|
|
27
|
+
- lib
|
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
29
|
+
none: false
|
|
30
|
+
requirements:
|
|
31
|
+
- - ! '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
35
|
+
none: false
|
|
36
|
+
requirements:
|
|
37
|
+
- - ! '>='
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
40
|
+
requirements: []
|
|
41
|
+
rubyforge_project:
|
|
42
|
+
rubygems_version: 1.8.11
|
|
43
|
+
signing_key:
|
|
44
|
+
specification_version: 3
|
|
45
|
+
summary: Localize your models
|
|
46
|
+
test_files: []
|