dm-validations-i18n 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dm-validations-i18n}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Masaki KOMAGATA"]
12
- s.date = %q{2010-10-04}
12
+ s.date = %q{2010-10-06}
13
13
  s.description = %q{Localize error messages in dm-validations.}
14
14
  s.email = %q{komagata@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -5,7 +5,12 @@ module DataMapper
5
5
  module Validations
6
6
  module I18n
7
7
  class << self
8
+ cattr_accessor :locale
9
+ cattr_accessor :field_name_translator
10
+
8
11
  def localize!(locale)
12
+ self.locale = locale
13
+
9
14
  data = {}
10
15
  load_locale(locale).each do |key, value|
11
16
  data[key.to_sym] = value
@@ -13,6 +18,17 @@ module DataMapper
13
18
  DataMapper::Validations::ValidationErrors.default_error_messages = data
14
19
  end
15
20
 
21
+ def translate_field_name_with(x = nil, &cb)
22
+ self.field_name_translator =
23
+ if (!x && cb)
24
+ FieldNameTranslator::Callback.new(self, &cb)
25
+ elsif (x.is_a? Hash)
26
+ FieldNameTranslator::Hash.new(self, x)
27
+ elsif (x == :rails)
28
+ FieldNameTranslator::Rails.new(self)
29
+ end
30
+ end
31
+
16
32
  def load_locale(locale)
17
33
  load_yml File.join(File.dirname(__FILE__), '..', 'locale', "#{locale}.yml")
18
34
  end
@@ -22,5 +38,53 @@ module DataMapper
22
38
  end
23
39
  end
24
40
  end
41
+
42
+ module FieldNameTranslator
43
+ class Callback
44
+ attr_accessor :context, :callback
45
+
46
+ def initialize(context, &cb)
47
+ self.context = context
48
+ self.callback = cb
49
+ end
50
+
51
+ def translate(field)
52
+ self.callback.call(field)
53
+ end
54
+ end
55
+
56
+ class Hash < Callback
57
+ def initialize(context, x)
58
+ dict = x[context.locale]
59
+
60
+ self.context = context
61
+ self.callback = lambda do |field|
62
+ dict[field.to_s] || field
63
+ end
64
+ end
65
+ end
66
+
67
+ class Rails < Callback
68
+ def initialize(context)
69
+ self.context = context
70
+ self.callback = lambda do |field|
71
+ ::I18n.t(field)
72
+ end
73
+ end
74
+ end
75
+ end
25
76
  end
26
77
  end
78
+
79
+ class DataMapper::Validations::ValidationErrors
80
+ class << self
81
+ def default_error_message_with_localized_field_name(key, field, *values)
82
+ field = DataMapper::Validations::I18n.field_name_translator.translate(field)
83
+ @@default_error_messages[key] % [field, *values].flatten
84
+ end
85
+
86
+ alias :default_error_message_without_localized_field_name :default_error_message
87
+ alias :default_error_message :default_error_message_with_localized_field_name
88
+ end
89
+ end
90
+
@@ -19,4 +19,57 @@ class TestDmValidationsI18n < Test::Unit::TestCase
19
19
  assert_equal '%sがありません。', Foo.default_error_messages[:absent]
20
20
  end
21
21
  end
22
+
23
+ # context 'localized field names with callback' do
24
+ # DataMapper::Validations::I18n.translate_field_name_with do |field_name|
25
+ # assert_equal field_name, 'foo'
26
+ # end
27
+ # end
28
+ # context 'localized field names with rails I18n.t' do
29
+ # # mock I18n.t(field, "dm-validation")
30
+ # DataMapper::Validations::I18n.translate_field_name_with :rails
31
+ # end
32
+
33
+ context 'DataMapper::Validations::ValidationErrors.default_error_message' do
34
+ should "localize field names with Rails way: I18n.t is used." do
35
+ # mock I18n.t
36
+ class ::I18n
37
+ def self.t(x)
38
+ "Dummy I18n.t"
39
+ end
40
+ end
41
+
42
+ DataMapper::Validations::I18n.localize!('zh-TW')
43
+ DataMapper::Validations::I18n.translate_field_name_with :rails
44
+
45
+ assert_equal("Dummy I18n.t 無效", DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :height))
46
+ end
47
+
48
+ should "localize field names with callback" do
49
+ DataMapper::Validations::I18n.localize!('zh-TW')
50
+ DataMapper::Validations::I18n.translate_field_name_with do |field|
51
+ "Dummy"
52
+ end
53
+ assert_equal 'Dummy 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :height)
54
+ end
55
+
56
+ should "localize field names with hash" do
57
+ DataMapper::Validations::I18n.localize!('zh-TW')
58
+ DataMapper::Validations::I18n.translate_field_name_with({'zh-TW' => { "height" => "高度", "weight" => "重量" }})
59
+
60
+ assert_equal '%s 無效', DataMapper::Validations::ValidationErrors.send(:class_variable_get, '@@default_error_messages')[:invalid]
61
+
62
+ assert_equal '高度 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :height)
63
+ assert_equal '重量 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :weight)
64
+
65
+ assert_equal 'length 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :length), "Fallback to original field name if missing the translated version."
66
+ end
67
+
68
+ should "localize field names with hash, even with diffenert setup order." do
69
+ DataMapper::Validations::I18n.translate_field_name_with({'zh-TW' => { "height" => "高度", "weight" => "重量" }})
70
+ DataMapper::Validations::I18n.localize!('zh-TW')
71
+ assert_equal '高度 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :height)
72
+ assert_equal 'length 無效', DataMapper::Validations::ValidationErrors.default_error_message(:invalid, :length), "Fallback to original field name if missing the translated version."
73
+ end
74
+ end
22
75
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-validations-i18n
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Masaki KOMAGATA
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-04 00:00:00 +09:00
18
+ date: 2010-10-06 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency