2012-11-12 8 views
1

한국어 오류 메시지 프로세서를 구현했습니다. 한국어의 경우, 이전의 명사 나 대명사의 소리에 따라 포지션이 다른 형태를 취합니다. 피사체를 표시하는 경우원숭이 패치가없는 사용자 정의 오류 메시지 프로세서

은, 예를 들면, 카 (가)는 자음 다음 난 (이) 사용되는 모음과 다음 사용한다.

예 (하이픈 형태소 경계를 표시하기 위해입니다) :

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이 맞지 않습니다.

답변

0

저는 루비가 좋지 않지만 다음 자바 스크립트 코드는 똑같습니다. 나는 그것이 도움이되기를 바랍니다.

var hasJongsung = function(word) { 
    return !!(word && word[word.length -1].charCodeAt()>=0xAC00 && word[word.length-1].charCodeAt()<=0xD7A3 && (word[word.length -1].charCodeAt()-0xAC00)%28); 
}; 

소스 : http://spectrumdig.blogspot.kr/2012/11/unicode-20.html

관련 문제