gettext_activerecord 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +55 -0
- data/ChangeLog +4 -0
- data/README.rdoc +172 -0
- data/Rakefile +110 -0
- data/data/locale/bg/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/bs/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/ca/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/cs/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/de/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/el/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/eo/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/es/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/et/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/fr/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/hr/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/hu/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/it/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/ja/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/ko/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/lv/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/nb/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/nl/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/pt_BR/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/ru/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/sr/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/ua/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/vi/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/zh/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/data/locale/zh_TW/LC_MESSAGES/gettext_activerecord.mo +0 -0
- data/lib/gettext_activerecord/base.rb +66 -0
- data/lib/gettext_activerecord/i18n.rb +27 -0
- data/lib/gettext_activerecord/migration.rb +16 -0
- data/lib/gettext_activerecord/parser.rb +216 -0
- data/lib/gettext_activerecord/schema_definitions.rb +28 -0
- data/lib/gettext_activerecord/tools.rb +25 -0
- data/lib/gettext_activerecord/validations.rb +189 -0
- data/lib/gettext_activerecord/version.rb +12 -0
- data/lib/gettext_activerecord.rb +19 -0
- data/po/bg/gettext_activerecord.po +115 -0
- data/po/bs/gettext_activerecord.po +125 -0
- data/po/ca/gettext_activerecord.po +116 -0
- data/po/cs/gettext_activerecord.po +124 -0
- data/po/de/gettext_activerecord.po +117 -0
- data/po/el/gettext_activerecord.po +115 -0
- data/po/eo/gettext_activerecord.po +116 -0
- data/po/es/gettext_activerecord.po +116 -0
- data/po/et/gettext_activerecord.po +116 -0
- data/po/fr/gettext_activerecord.po +118 -0
- data/po/gettext_activerecord.pot +113 -0
- data/po/hr/gettext_activerecord.po +125 -0
- data/po/hu/gettext_activerecord.po +116 -0
- data/po/it/gettext_activerecord.po +122 -0
- data/po/ja/gettext_activerecord.po +116 -0
- data/po/ko/gettext_activerecord.po +123 -0
- data/po/lv/gettext_activerecord.po +116 -0
- data/po/nb/gettext_activerecord.po +117 -0
- data/po/nl/gettext_activerecord.po +123 -0
- data/po/pt_BR/gettext_activerecord.po +117 -0
- data/po/ru/gettext_activerecord.po +117 -0
- data/po/sr/gettext_activerecord.po +117 -0
- data/po/test.rb +8 -0
- data/po/ua/gettext_activerecord.po +120 -0
- data/po/vi/gettext_activerecord.po +116 -0
- data/po/zh/gettext_activerecord.po +119 -0
- data/po/zh_TW/gettext_activerecord.po +119 -0
- data/replace.rb +21 -0
- data/sample/README.rdoc +9 -0
- data/sample/Rakefile +32 -0
- data/sample/book.rb +3 -0
- data/sample/config/database.yml +3 -0
- data/sample/data/locale/ja/LC_MESSAGES/sample_ar.mo +0 -0
- data/sample/db/development.sqlite3 +0 -0
- data/sample/db/schema.rb +5 -0
- data/sample/locale/ja/LC_MESSAGES/sample_ar.mo +0 -0
- data/sample/po/ja/sample_ar.po +29 -0
- data/sample/po/sample_ar.pot +29 -0
- data/sample/sample.rb +22 -0
- data/test/Rakefile +43 -0
- data/test/db/migrate.rb +41 -0
- data/test/db/sqlite.rb +8 -0
- data/test/helper.rb +38 -0
- data/test/locale/ja/LC_MESSAGES/active_record.mo +0 -0
- data/test/models/book.rb +3 -0
- data/test/models/developer.rb +5 -0
- data/test/models/inept_wizard.rb +3 -0
- data/test/models/reply.rb +40 -0
- data/test/models/topic.rb +68 -0
- data/test/models/user.rb +3 -0
- data/test/models/wizard.rb +5 -0
- data/test/po/active_record.pot +388 -0
- data/test/po/ja/active_record.po +387 -0
- data/test/test_parser.rb +95 -0
- data/test/test_validations.rb +2575 -0
- data/test/vendor/repair_helper.rb +50 -0
- data/test.rb +2 -0
- metadata +268 -0
@@ -0,0 +1,216 @@
|
|
1
|
+
=begin
|
2
|
+
lib/gettext_activerecord/parser.rb - parser for ActiveRecord
|
3
|
+
|
4
|
+
Copyright (C) 2005-2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
|
9
|
+
$Id$
|
10
|
+
=end
|
11
|
+
|
12
|
+
require 'gettext'
|
13
|
+
require 'gettext/tools/rgettext'
|
14
|
+
require 'gettext/parser/ruby'
|
15
|
+
|
16
|
+
include GetText
|
17
|
+
|
18
|
+
ActiveRecord::Base.instance_eval do
|
19
|
+
alias inherited_without_log inherited
|
20
|
+
|
21
|
+
@@active_record_classes_list = []
|
22
|
+
|
23
|
+
def inherited(subclass)
|
24
|
+
puts "registering an ActiveRecord model for later processing: #{subclass}" if $DEBUG
|
25
|
+
active_record_classes_list << "#{subclass}"
|
26
|
+
inherited_without_log(subclass)
|
27
|
+
end
|
28
|
+
|
29
|
+
def active_record_classes_list
|
30
|
+
@@active_record_classes_list
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset_active_record_classes_list
|
34
|
+
@@active_record_classes_list = []
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module GetText
|
39
|
+
module ActiveRecordParser
|
40
|
+
extend GetText
|
41
|
+
include GetText
|
42
|
+
bindtextdomain "gettext_activerecord"
|
43
|
+
|
44
|
+
@config = {
|
45
|
+
:db_yml => "config/database.yml",
|
46
|
+
:db_mode => "development",
|
47
|
+
:activerecord_classes => ["ActiveRecord::Base"],
|
48
|
+
:untranslate_classes => ["ActiveRecord::Base", "ActiveRecord::SessionStore::Session"],
|
49
|
+
:untranslate_columns => ["id"],
|
50
|
+
:use_classname => true,
|
51
|
+
}
|
52
|
+
|
53
|
+
@ar_re = nil
|
54
|
+
|
55
|
+
module_function
|
56
|
+
def require_rails(file) # :nodoc:
|
57
|
+
begin
|
58
|
+
require file
|
59
|
+
rescue MissingSourceFile
|
60
|
+
$stderr.puts _("'%{file}' is not found.") % {:file => file}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Sets some preferences to parse ActiveRecord files.
|
65
|
+
#
|
66
|
+
# * config: a Hash of the config. It can takes some values below:
|
67
|
+
# * :use_classname - If true, the msgids of ActiveRecord become "ClassName|FieldName" (e.g. "Article|Title"). Otherwise the ClassName is not used (e.g. "Title"). Default is true.
|
68
|
+
# * :db_yml - the path of database.yml. Default is "config/database.yml".
|
69
|
+
# * :db_mode - the mode of the database. Default is "development"
|
70
|
+
# * :activerecord_classes - an Array of the superclass of the models. The classes should be String value. Default is ["ActiveRecord::Base"]
|
71
|
+
# * :untranslate_classes - an Array of the modules/class names which is ignored as the msgid.
|
72
|
+
# * :untranslate_columns - an Array of the column names which is ignored as the msgid.
|
73
|
+
# * :adapter - the options for ActiveRecord::Base.establish_connection. If this value is set, :db_yml option is ignored.
|
74
|
+
# * :host - ditto
|
75
|
+
# * :username - ditto
|
76
|
+
# * :password - ditto
|
77
|
+
# * :database - ditto
|
78
|
+
# * :socket - ditto
|
79
|
+
# * :encoding - ditto
|
80
|
+
#
|
81
|
+
# "ClassName|FieldName" uses GetText.sgettext. So you don't need to translate the left-side of "|".
|
82
|
+
# See <Documents for Translators for more details(http://www.yotabanana.com/hiki/ruby-gettext-translate.html)>.
|
83
|
+
def init(config)
|
84
|
+
puts "\nconfig: #{config.inspect}\n\n" if $DEBUG
|
85
|
+
if config
|
86
|
+
config.each{|k, v|
|
87
|
+
@config[k] = v
|
88
|
+
}
|
89
|
+
end
|
90
|
+
@ar_re = /class.*(#{@config[:activerecord_classes].join("|")})/
|
91
|
+
end
|
92
|
+
|
93
|
+
def translatable_class?(klass)
|
94
|
+
if klass.is_a?(Class) && klass < ActiveRecord::Base
|
95
|
+
if klass.untranslate_all? || klass.abstract_class? || @config[:untranslate_classes].include?(klass.name)
|
96
|
+
false
|
97
|
+
else
|
98
|
+
true
|
99
|
+
end
|
100
|
+
else
|
101
|
+
true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def translatable_column?(klass, columnname)
|
106
|
+
! (klass.untranslate?(columnname) || @config[:untranslate_columns].include?(columnname))
|
107
|
+
end
|
108
|
+
|
109
|
+
def parse(file, targets = []) # :nodoc:
|
110
|
+
puts "parse file #{file}" if $DEBUG
|
111
|
+
|
112
|
+
GetText.locale = "en"
|
113
|
+
old_constants = Object.constants
|
114
|
+
begin
|
115
|
+
eval(open(file).read, TOPLEVEL_BINDING)
|
116
|
+
rescue
|
117
|
+
$stderr.puts _("Ignored '%{file}'. Solve dependencies first.") % {:file => file}
|
118
|
+
$stderr.puts $!
|
119
|
+
end
|
120
|
+
#loaded_constants = Object.constants - old_constants
|
121
|
+
loaded_constants = ActiveRecord::Base.active_record_classes_list
|
122
|
+
ActiveRecord::Base.reset_active_record_classes_list
|
123
|
+
loaded_constants.each do |classname|
|
124
|
+
klass = eval(classname, TOPLEVEL_BINDING)
|
125
|
+
if translatable_class?(klass)
|
126
|
+
puts "processing class #{klass.name}" if $DEBUG
|
127
|
+
add_target(targets, file, ActiveSupport::Inflector.singularize(klass.table_name.gsub(/_/, " ")))
|
128
|
+
unless klass.class_name == classname
|
129
|
+
add_target(targets, file, ActiveSupport::Inflector.singularize(classname.gsub(/_/, " ").downcase))
|
130
|
+
end
|
131
|
+
begin
|
132
|
+
klass.columns.each do |column|
|
133
|
+
if translatable_column?(klass, column.name)
|
134
|
+
if @config[:use_classname]
|
135
|
+
msgid = classname + "|" + klass.human_attribute_name(column.name)
|
136
|
+
else
|
137
|
+
msgid = klass.human_attribute_name(column.name)
|
138
|
+
end
|
139
|
+
add_target(targets, file, msgid)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
rescue
|
143
|
+
$stderr.puts _("No database is available.")
|
144
|
+
$stderr.puts $!
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
if RubyParser.target?(file)
|
149
|
+
targets = RubyParser.parse(file, targets)
|
150
|
+
end
|
151
|
+
targets.uniq!
|
152
|
+
targets
|
153
|
+
end
|
154
|
+
|
155
|
+
def add_target(targets, file, msgid) # :nodoc:
|
156
|
+
file_lineno = "#{file}:-"
|
157
|
+
key_existed = targets.assoc(msgid)
|
158
|
+
if key_existed
|
159
|
+
unless targets[targets.index(key_existed)].include?(file_lineno)
|
160
|
+
targets[targets.index(key_existed)] = key_existed << file_lineno
|
161
|
+
end
|
162
|
+
else
|
163
|
+
targets << [msgid, "#{file}:-"]
|
164
|
+
end
|
165
|
+
targets
|
166
|
+
end
|
167
|
+
|
168
|
+
def target?(file) # :nodoc:
|
169
|
+
init(nil) unless @ar_re
|
170
|
+
data = IO.readlines(file)
|
171
|
+
data.each do |v|
|
172
|
+
if @ar_re =~ v
|
173
|
+
unless ActiveRecord::Base.connected?
|
174
|
+
begin
|
175
|
+
require 'rubygems'
|
176
|
+
rescue LoadError
|
177
|
+
$stderr.puts _("rubygems are not found.") if $DEBUG
|
178
|
+
end
|
179
|
+
begin
|
180
|
+
ENV["RAILS_ENV"] = @config[:db_mode]
|
181
|
+
require 'config/boot.rb'
|
182
|
+
require 'config/environment.rb'
|
183
|
+
require_rails 'activesupport'
|
184
|
+
require_rails 'gettext_activerecord'
|
185
|
+
rescue LoadError
|
186
|
+
require_rails 'rubygems'
|
187
|
+
gem 'activerecord'
|
188
|
+
require_rails 'activesupport'
|
189
|
+
require_rails 'active_record'
|
190
|
+
require_rails 'activesupport'
|
191
|
+
require_rails 'gettext_activerecord'
|
192
|
+
end
|
193
|
+
begin
|
194
|
+
yaml = YAML.load(IO.read(@config[:db_yml]))
|
195
|
+
if yaml[@config[:db_mode]]
|
196
|
+
ActiveRecord::Base.establish_connection(yaml[@config[:db_mode]])
|
197
|
+
else
|
198
|
+
ActiveRecord::Base.establish_connection(yaml)
|
199
|
+
end
|
200
|
+
rescue
|
201
|
+
if @config[:adapter]
|
202
|
+
ActiveRecord::Base.establish_connection(@config)
|
203
|
+
else
|
204
|
+
return false
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
return true
|
209
|
+
end
|
210
|
+
end
|
211
|
+
false
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
RGetText.add_parser(GetText::ActiveRecordParser)
|
216
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
=begin
|
2
|
+
lib/gettext_activerecord/schema_definitions.rb - GetText for ActiveRecord::ConnectionAdapters::Column
|
3
|
+
|
4
|
+
Copyright (C) 2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
|
9
|
+
=end
|
10
|
+
|
11
|
+
module ActiveRecord #:nodoc:
|
12
|
+
module ConnectionAdapters #:nodoc:
|
13
|
+
# An abstract definition of a column in a table.
|
14
|
+
class Column
|
15
|
+
attr_accessor :table_class
|
16
|
+
alias :human_name_witout_localized :human_name
|
17
|
+
|
18
|
+
def human_name_with_gettext_activerecord
|
19
|
+
if table_class
|
20
|
+
table_class.human_attribute_name(@name)
|
21
|
+
else
|
22
|
+
@name.humanize
|
23
|
+
end
|
24
|
+
end
|
25
|
+
alias_method_chain :human_name, :gettext_activerecord
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
=begin
|
2
|
+
tools.rb - Utility functions
|
3
|
+
|
4
|
+
Copyright (C) 2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
=end
|
9
|
+
|
10
|
+
require 'gettext/tools'
|
11
|
+
require 'gettext_activerecord'
|
12
|
+
require 'gettext_activerecord/parser'
|
13
|
+
|
14
|
+
module GetText
|
15
|
+
extend self
|
16
|
+
|
17
|
+
alias :create_mofiles_org :create_mofiles
|
18
|
+
alias :update_pofiles_org :update_pofiles
|
19
|
+
|
20
|
+
def update_pofiles(textdomain, files, app_version, options = {})
|
21
|
+
GetText::ActiveRecordParser.init(options)
|
22
|
+
GetText.update_pofiles_org(textdomain, files, app_version, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
=begin
|
2
|
+
lib/gettext_activerecord/validations.rb - GetText for ActiveRecord
|
3
|
+
|
4
|
+
Copyright (C) 2006-2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
|
9
|
+
$Id$
|
10
|
+
=end
|
11
|
+
|
12
|
+
module ActiveRecord #:nodoc:
|
13
|
+
class RecordInvalid < ActiveRecordError #:nodoc:
|
14
|
+
attr_reader :record
|
15
|
+
include GetText
|
16
|
+
bindtextdomain "gettext_activerecord"
|
17
|
+
|
18
|
+
def initialize(record)
|
19
|
+
@record = record
|
20
|
+
super(_("Validation failed: %{error_messages}") %
|
21
|
+
{:error_messages => @record.errors.full_messages.join(", ")})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module Validations # :nodoc:
|
26
|
+
class << self
|
27
|
+
def real_included(base)
|
28
|
+
base.extend ClassMethods
|
29
|
+
base.class_eval{
|
30
|
+
include GetText
|
31
|
+
def gettext(str) #:nodoc:
|
32
|
+
_(str)
|
33
|
+
end
|
34
|
+
class << self
|
35
|
+
def human_attribute_name_with_gettext_activerecord(attribute_key_name) #:nodoc:
|
36
|
+
s_("#{self}|#{attribute_key_name.humanize}")
|
37
|
+
end
|
38
|
+
alias_method_chain :human_attribute_name, :gettext_activerecord
|
39
|
+
|
40
|
+
def human_attribute_table_name_for_error(table_name) #:nodoc:
|
41
|
+
_(table_name.gsub(/_/, " "))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if respond_to? :included
|
49
|
+
class << self
|
50
|
+
def included_with_gettext_activerecord(base) # :nodoc:
|
51
|
+
unless base <= ActiveRecord::Base
|
52
|
+
included_without_gettext_activerecord(base)
|
53
|
+
end
|
54
|
+
real_included(base)
|
55
|
+
end
|
56
|
+
alias_method_chain :included, :gettext_activerecord
|
57
|
+
end
|
58
|
+
else
|
59
|
+
class << self
|
60
|
+
# Since rails-1.2.0.
|
61
|
+
def append_features_with_gettext_activerecord(base) # :nodoc:
|
62
|
+
unless base <= ActiveRecord::Base
|
63
|
+
append_features_without_gettext_activerecord(base)
|
64
|
+
end
|
65
|
+
real_included(base)
|
66
|
+
end
|
67
|
+
alias_method_chain :append_features, :gettext_activerecord
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# activerecord-1.14.3/lib/active_record/validations.rb
|
73
|
+
class Errors #:nodoc:
|
74
|
+
include GetText
|
75
|
+
|
76
|
+
textdomain "gettext_activerecord"
|
77
|
+
|
78
|
+
class << self
|
79
|
+
include GetText
|
80
|
+
|
81
|
+
def default_error_messages_with_gettext_activerecord
|
82
|
+
@@default_error_messages || {}
|
83
|
+
end
|
84
|
+
alias_method_chain :default_error_messages, :gettext_activerecord
|
85
|
+
|
86
|
+
# To use other backends, gettext_activerecord doesn't use backend architecture.
|
87
|
+
# You can use GetText with other backends.
|
88
|
+
@@default_error_messages = {
|
89
|
+
:inclusion => N_("%{attribute} is not included in the list"),
|
90
|
+
:exclusion => N_("%{attribute} is reserved"),
|
91
|
+
:invalid => N_("%{attribute} is invalid"),
|
92
|
+
:confirmation => N_("%{attribute} doesn't match confirmation"),
|
93
|
+
:accepted => N_("%{attribute} must be accepted"),
|
94
|
+
:empty => N_("%{attribute} can't be empty"),
|
95
|
+
:blank => N_("%{attribute} can't be blank"),
|
96
|
+
:too_long => N_("%{attribute} is too long (maximum is %{count} characters)"),
|
97
|
+
:too_short => N_("%{attribute} is too short (minimum is %{count} characters)"),
|
98
|
+
:wrong_length => N_("%{attribute} is the wrong length (should be %{count} characters)"),
|
99
|
+
:taken => N_("%{attribute} has already been taken"),
|
100
|
+
:not_a_number => N_("%{attribute} is not a number"),
|
101
|
+
:greater_than => N_("%{attribute} must be greater than %{count}"),
|
102
|
+
:greater_than_or_equal_to => N_("%{attribute} must be greater than or equal to %{count}"),
|
103
|
+
:equal_to => N_("%{attribute} must be equal to %{count}"),
|
104
|
+
:less_than => N_("%{attribute} must be less than %{count}"),
|
105
|
+
:less_than_or_equal_to => N_("%{attribute} must be less than or equal to %{count}"),
|
106
|
+
:odd => N_("%{attribute} must be odd"),
|
107
|
+
:even => N_("%{attribute} must be even")
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
def each_with_gettext_activerecord #:nodoc:
|
112
|
+
@errors.each_key { |attr| @errors[attr].each { |msg| yield attr, localize_error_message(attr, msg, false) } }
|
113
|
+
end
|
114
|
+
alias_method_chain :each, :gettext_activerecord
|
115
|
+
|
116
|
+
# Returns error messages.
|
117
|
+
# * Returns nil, if no errors are associated with the specified attribute.
|
118
|
+
# * Returns the error message, if one error is associated with the specified attribute.
|
119
|
+
# * Returns an array of error messages, if more than one error is associated with the specified attribute.
|
120
|
+
# And for GetText,
|
121
|
+
# * If the error messages include %{fn}, it returns formatted text such as "foo %{fn}" => "foo Field"
|
122
|
+
# * else, the error messages are prepended the field name such as "foo" => "foo" (Same as default behavior).
|
123
|
+
# Note that this behaviour is different from full_messages.
|
124
|
+
def on_with_gettext_activerecord(attribute)
|
125
|
+
# e.g.) foo field: "%{fn} foo" => "Foo foo", "foo" => "foo".
|
126
|
+
errors = localize_error_messages(false)[attribute.to_s]
|
127
|
+
return nil if errors.nil?
|
128
|
+
errors.size == 1 ? errors.first : errors
|
129
|
+
end
|
130
|
+
alias_method_chain :on, :gettext_activerecord
|
131
|
+
alias :[] :on
|
132
|
+
|
133
|
+
# Returns all the full error messages in an array.
|
134
|
+
# * If the error messages include %{fn}, it returns formatted text such as "foo %{fn}" => "foo Field"
|
135
|
+
# * else, the error messages are prepended the field name such as "foo" => "Field foo" (Same as default behavior).
|
136
|
+
# As L10n, first one is recommanded because the order of subject,verb and others are not same in languages.
|
137
|
+
def full_messages_with_gettext_activerecord
|
138
|
+
full_messages = []
|
139
|
+
errors = localize_error_messages
|
140
|
+
errors.each_key do |attr|
|
141
|
+
errors[attr].each do |msg|
|
142
|
+
next if msg.nil?
|
143
|
+
full_messages << msg
|
144
|
+
end
|
145
|
+
end
|
146
|
+
full_messages
|
147
|
+
end
|
148
|
+
alias_method_chain :full_messages, :gettext_activerecord
|
149
|
+
|
150
|
+
private
|
151
|
+
def localize_error_message(attr, obj, append_field) # :nodoc:
|
152
|
+
msgid, count, value = obj, 0, ""
|
153
|
+
if obj.kind_of? Hash
|
154
|
+
msgid = obj[:default].select{|v| v.is_a? String}[0]
|
155
|
+
unless msgid
|
156
|
+
symbol = obj[:default][0].to_s.split(".").last.to_sym
|
157
|
+
msgid = @@default_error_messages[symbol]
|
158
|
+
end
|
159
|
+
attr, count, value = obj[:attribute], obj[:count], obj[:value]
|
160
|
+
end
|
161
|
+
msgstr = @base.gettext(msgid)
|
162
|
+
msgstr = _(msgid) if msgstr == msgid
|
163
|
+
msgstr = msgstr.gsub("%{fn}", "%{attribute}").gsub("%d", "%{count}").gsub("%{val}", "%{value}") # for backward compatibility.
|
164
|
+
if attr == "base"
|
165
|
+
full_message = msgstr
|
166
|
+
elsif /%\{attribute\}/ =~ msgstr
|
167
|
+
full_message = msgstr % {:attribute => @base.class.human_attribute_name(attr)}
|
168
|
+
elsif append_field
|
169
|
+
full_message = @base.class.human_attribute_name(attr) + " " + msgstr
|
170
|
+
else
|
171
|
+
full_message = msgstr
|
172
|
+
end
|
173
|
+
full_message % {:count => count, :value => value}
|
174
|
+
end
|
175
|
+
|
176
|
+
def localize_error_messages(append_field = true) # :nodoc:
|
177
|
+
# e.g.) foo field: "%{fn} foo" => "Foo foo", "foo" => "Foo foo".
|
178
|
+
errors = {}
|
179
|
+
each_without_gettext_activerecord {|attr, msg|
|
180
|
+
next if msg.nil?
|
181
|
+
errors[attr] ||= []
|
182
|
+
errors[attr] << localize_error_message(attr, msg, append_field)
|
183
|
+
}
|
184
|
+
errors
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
=begin
|
2
|
+
version - version information of gettext_activerecord.
|
3
|
+
|
4
|
+
Copyright (C) 2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
=end
|
9
|
+
module GetTextActiveRecord
|
10
|
+
RAILS_VERSION = "2.3.2"
|
11
|
+
VERSION = "2.0.0"
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
=begin
|
2
|
+
gettext_activerecord.rb - GetText for ActiveRecord
|
3
|
+
|
4
|
+
Copyright (C) 2009 Masao Mutoh
|
5
|
+
|
6
|
+
You may redistribute it and/or modify it under the same
|
7
|
+
license terms as Ruby.
|
8
|
+
|
9
|
+
=end
|
10
|
+
|
11
|
+
require 'gettext'
|
12
|
+
require 'active_record'
|
13
|
+
require 'gettext_activerecord/migration'
|
14
|
+
require 'gettext_activerecord/schema_definitions'
|
15
|
+
require 'gettext_activerecord/validations'
|
16
|
+
require 'gettext_activerecord/base'
|
17
|
+
require 'gettext_activerecord/i18n'
|
18
|
+
require 'gettext_activerecord/version'
|
19
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
#
|
2
|
+
# a po-file for Ruby-GetText-Package and Ruby on Rails.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005,2006 Masao Mutoh
|
5
|
+
# This file is distributed under the same license as the Ruby-GetText-Package.
|
6
|
+
#
|
7
|
+
# Georgi Stoimenov <georgistoimenov@abv.bg>, 2008
|
8
|
+
#
|
9
|
+
msgid ""
|
10
|
+
msgstr ""
|
11
|
+
"Project-Id-Version: gettext_activerecord 0.1.0\n"
|
12
|
+
"POT-Creation-Date: 2009-02-09 01:48+0900\n"
|
13
|
+
"PO-Revision-Date: 2008-07-11 11:35+0300\n"
|
14
|
+
"Last-Translator: Sava Chankov <sava.chankov@gmail.com>\n"
|
15
|
+
"Language-Team: Bulgarian <ruby-on-rails-bulgaria@googlegroups.com>\n"
|
16
|
+
"MIME-Version: 1.0\n"
|
17
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
18
|
+
"Content-Transfer-Encoding: 8bit\n"
|
19
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
20
|
+
|
21
|
+
#: lib/gettext_activerecord/parser.rb:60
|
22
|
+
msgid "'%{file}' is not found."
|
23
|
+
msgstr ""
|
24
|
+
|
25
|
+
#: lib/gettext_activerecord/parser.rb:104
|
26
|
+
msgid "Ignored '%{file}'. Solve dependencies first."
|
27
|
+
msgstr ""
|
28
|
+
|
29
|
+
#: lib/gettext_activerecord/parser.rb:131
|
30
|
+
msgid "No database is available."
|
31
|
+
msgstr ""
|
32
|
+
|
33
|
+
#: lib/gettext_activerecord/parser.rb:167
|
34
|
+
msgid "rubygems are not found."
|
35
|
+
msgstr ""
|
36
|
+
|
37
|
+
#: lib/gettext_activerecord/active_record.rb:27
|
38
|
+
msgid "Validation failed: %{error_messages}"
|
39
|
+
msgstr "Неуспешна валидация: %{error_messages}"
|
40
|
+
|
41
|
+
#: lib/gettext_activerecord/active_record.rb:218
|
42
|
+
msgid "%{attribute} is not included in the list"
|
43
|
+
msgstr "Полето „%{attribute}“ не е в списъка"
|
44
|
+
|
45
|
+
#: lib/gettext_activerecord/active_record.rb:219
|
46
|
+
msgid "%{attribute} is reserved"
|
47
|
+
msgstr "Полето „%{attribute}“ е резервирано"
|
48
|
+
|
49
|
+
#: lib/gettext_activerecord/active_record.rb:220
|
50
|
+
msgid "%{attribute} is invalid"
|
51
|
+
msgstr "Полето „%{attribute}“ е невалидно"
|
52
|
+
|
53
|
+
#: lib/gettext_activerecord/active_record.rb:221
|
54
|
+
msgid "%{attribute} doesn't match confirmation"
|
55
|
+
msgstr "%{attribute} не съвпада"
|
56
|
+
|
57
|
+
#: lib/gettext_activerecord/active_record.rb:222
|
58
|
+
msgid "%{attribute} must be accepted"
|
59
|
+
msgstr "Полето „%{attribute}“ трябва бъде прието"
|
60
|
+
|
61
|
+
#: lib/gettext_activerecord/active_record.rb:223
|
62
|
+
msgid "%{attribute} can't be empty"
|
63
|
+
msgstr "Полето „%{attribute}“ не може да е празно"
|
64
|
+
|
65
|
+
#: lib/gettext_activerecord/active_record.rb:224
|
66
|
+
msgid "%{attribute} can't be blank"
|
67
|
+
msgstr "Полето „%{attribute}“ не може да е празно"
|
68
|
+
|
69
|
+
#: lib/gettext_activerecord/active_record.rb:225
|
70
|
+
msgid "%{attribute} is too long (maximum is %{count} characters)"
|
71
|
+
msgstr "Полето „%{attribute}“ е много дълго (максимумът е %{count} символа)"
|
72
|
+
|
73
|
+
#: lib/gettext_activerecord/active_record.rb:226
|
74
|
+
msgid "%{attribute} is too short (minimum is %{count} characters)"
|
75
|
+
msgstr "Полето „%{attribute}“ е много късо (минимумът е %{count} символа)"
|
76
|
+
|
77
|
+
#: lib/gettext_activerecord/active_record.rb:227
|
78
|
+
msgid "%{attribute} is the wrong length (should be %{count} characters)"
|
79
|
+
msgstr "Полето „%{attribute}“ е с неправилна дължина (трябва да е %{count} символа)"
|
80
|
+
|
81
|
+
#: lib/gettext_activerecord/active_record.rb:228
|
82
|
+
msgid "%{attribute} has already been taken"
|
83
|
+
msgstr "Полето „%{attribute}“ е вече заето"
|
84
|
+
|
85
|
+
#: lib/gettext_activerecord/active_record.rb:229
|
86
|
+
msgid "%{attribute} is not a number"
|
87
|
+
msgstr "Полето „%{attribute}“ не е число"
|
88
|
+
|
89
|
+
#: lib/gettext_activerecord/active_record.rb:230
|
90
|
+
msgid "%{attribute} must be greater than %{count}"
|
91
|
+
msgstr "Полето „%{attribute}“ трябва бъде по-голямо от %{count}"
|
92
|
+
|
93
|
+
#: lib/gettext_activerecord/active_record.rb:231
|
94
|
+
msgid "%{attribute} must be greater than or equal to %{count}"
|
95
|
+
msgstr "Полето „%{attribute}“ трябва бъде по-голямо или равно на %{count}"
|
96
|
+
|
97
|
+
#: lib/gettext_activerecord/active_record.rb:232
|
98
|
+
msgid "%{attribute} must be equal to %{count}"
|
99
|
+
msgstr "Полето „%{attribute}“ трябва бъде равно на %{count}"
|
100
|
+
|
101
|
+
#: lib/gettext_activerecord/active_record.rb:233
|
102
|
+
msgid "%{attribute} must be less than %{count}"
|
103
|
+
msgstr "Полето „%{attribute}“ трябва бъде по-малко от %{count}"
|
104
|
+
|
105
|
+
#: lib/gettext_activerecord/active_record.rb:234
|
106
|
+
msgid "%{attribute} must be less than or equal to %{count}"
|
107
|
+
msgstr "Полето „%{attribute}“ трябва бъде по-малко или равно на %{count}"
|
108
|
+
|
109
|
+
#: lib/gettext_activerecord/active_record.rb:235
|
110
|
+
msgid "%{attribute} must be odd"
|
111
|
+
msgstr "Полето „%{attribute}“ трябва бъде нечетно"
|
112
|
+
|
113
|
+
#: lib/gettext_activerecord/active_record.rb:236
|
114
|
+
msgid "%{attribute} must be even"
|
115
|
+
msgstr "Полето „%{attribute}“ трябва бъде четно"
|