한국어 오류 메시지 프로세서를 구현했습니다. 한국어의 경우, 이전의 명사 나 대명사의 소리에 따라 포지션이 다른 형태를 취합니다. 피사체를 표시하는 경우원숭이 패치가없는 사용자 정의 오류 메시지 프로세서
은, 예를 들면, 카 (가)는 자음 다음 난 (이) 사용되는 모음과 다음 사용한다.
예 (하이픈 형태소 경계를 표시하기 위해입니다) :
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 :: 오류에서 구현 된 표준 오류 메시지 시스템은 한국어에 적합하지 않다. ("A는 공백", "B는 공백", "C는 공백", ...), 또는 종종 어렵거나 속성이되는 속성 뒤에 위치를 피하십시오 어색한 문장.
나는이 문제를 해결하기 위해 ActiveModel :: Errors를 패치하고 generate_message
을 수정했습니다. 다음은 코드 (Gist)이며, 현재 내 Rails 앱에서 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도)에 익숙하지 않기 때문에 더 나은 해결책을 찾을 수 없었다.
두 번째 질문은 내 Rails 앱에서이 코드를 추출하여 별도의 보석으로 만드는 것입니다. 나는 보석을 개발하는 것에 내 이빨을 절단하고 있으며 최근에는 my first gem을 만들었습니다. 이 코드를 어느 위치에 보관해야합니까? config/initializers
이 맞지 않습니다.