dm-validations-i18n 0.2.0 → 0.3.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/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