韓国語用のカスタムエラーメッセージプロセッサを実装しました。韓国語では、前置詞は前置詞または代名詞の音に応じて異なる形を取ります。
たとえば、主題をマークする場合、母音の後にka(가)が使用され、子音の後にi(이)が使用されます。
例(ハイフンは形態素の境界を示します):
Romanization: sakwa-ka ppalkah-ta.
Gloss: Apple-SUBJECT red-PRESENT.
Translation: Apple is red.
Romanization: phainayphul-i tal-ta.
Gloss: Pineapple-SUBJECT sweet-PRESENT.
Translation: Pineapple is sweet.
したがって、ActiveModel::Errorsに実装されている標準のエラーメッセージシステムは韓国語には適していません。重複を多く作成するメッセージに属性を含めるか(「Aは空白」、「Bは空白」、「Cは空白」など)、属性の後に後置詞を付けることは避けてください。ぎこちない文章。
ActiveModel :: Errorsにモンキーパッチを適用generate_message
し、この問題を解決するために変更しました。以下は、現在私のRailsアプリにあるコード(Gist )です。config/initializers
# encoding: UTF-8
# Original article: http://dailyupgrade.me/post/6806676778/rubyonrails-full-messages-for-korean
# Modified to support more postpositions and client_side_validations gem.
#
# Add Korean translations like this:
# ko:
# errors:
# format: "%{message}"
# messages:
# blank: "%{attribute}((이)) 입력되지 않았습니다"
# taken: "이미 사용 중인 %{attribute}입니다"
# invalid: "잘못된 %{attribute}입니다"
# too_short: "%{attribute}((이)) 너무 짧습니다"
#
class Korean
POSTPOSITIONS = {"은" => "는", "이" => "가", "을" => "를", "과" => "와", "으로" => "로"}
def self.select_postposition(last_letter, postposition)
return postposition unless last_letter >= "가" && last_letter <= "힣"
final = last_letter.mb_chars.last.decompose[2]
if final.nil?
# 받침 없음
POSTPOSITIONS[postposition] || postposition
elsif final == "ㄹ" && (postposition == "으로" || postposition == "로")
# 'ㄹ 받침 + (으)로'를 위한 특별 규칙
"로"
else
# 받침 있음
POSTPOSITIONS.invert[postposition] || postposition
end
end
end
module ActiveModel
class Errors
old_generate_message = instance_method("generate_message")
define_method("generate_message") do |attribute, type = :invalid, options = {}|
msg = old_generate_message.bind(self).(attribute, type, options)
return msg unless I18n.locale == :ko
msg.gsub(/(?<=(.{1}))\(\((은|는|이|가|을|를|과|와|으로|로)\)\)/) do
Korean.select_postposition $1, $2
end
end
end
end
私の最初の質問は、モンキーパッチなしで同じ目標を達成することが可能かどうかです。私はRails(およびRubyも)に慣れていないので、より良い解決策を思い付くことができませんでした。
2番目の質問は、Railsアプリからこのコードを抽出し、それを別のgemにすることです。私は宝石の開発に歯を食いしばっており、最近最初の宝石を作りました。このコードを宝石のどこに置くべきですか?config/initializers
正しくないようです。