'에러메시지 한글화'에 해당되는 글 1건

  1. [2006/11/23] Ruby on Rails에서 error_messages_for 함수 사용시 에러 메시지 한글화 (2)

Ruby on Rails에서 error_messages_for 함수 사용시 에러 메시지 한글화

[Development]
에러 메시지를 한글화하는데 있어서, 크게 세가지 정도의 문제점을 생각해 볼 수 있다.

첫째는 에러메시지 자체가 영어로 되어있다는 점이다.
Rails에서 Model 클래스에 validation을 설정하면 ActiveRecord::Base#save 시에 validation이
check되면서, error 메시지를 Base의 errors 객체에 설정하게 되어있다. 이 메시지는
ActiveRecord::Errors의 @@default_error_messages 라는 class 변수에 선언이 되어 있고,
accessor가 설정되어있다. 따라서 이 문제는 ActiveRecord::Errors의 default_error_messages를
재설정함으로써 해결할 수 있다.

두번째는 필드명의 한글화이다. Rails에서 최종적으로 full message를 만드는
ActiveRecord::Errors#full_messages를 보면 Base 클래스의 human_attribute_name 메서드를
사용함을 알 수 있다. 이는 String#human_name 메서드를 이용해서 'my_name'이라는 속성명을
'My Name'으로 바꾸어준다. 따라서 human_attribute_name  클래스를 override 하여야 한다.

마지막으로 조사의 처리이다. 영어에서는 속성명과 에러메시지를 붙이기만 하면 문장이 되지만,
한글에서는 속성명에 적당한 조사를 넣어주어야 한다. 이 문제를 해결하려면
Ruby에서 한글 자소 분리 (초성, 중성, 종성)에서 사용한 로직을 이용해서, 각각의 경우에
따른 조사를 붙여야 한다.

User 라는 Model 클래스가 있다고 가정하면
  1. class String
  2.   @@josas = {'이' => '가', '은' => '는', '을' => '를', '과' => '와'}
  3.   def with_josa(josa)
  4.     if separate.last =~ /[aeiou]/i separate.last == ''
  5.       self + @@josas[josa]
  6.     else 
  7.       self + josa
  8.     end
  9.   end
  10. end
  11. class ActiveRecord::Base
  12.   # 필드명을 저장하는 class variable
  13.   @@field_name = {}
  14.   cattr_accessor :field_name
  15.   class << self
  16.     # Base.human_attribute_name override
  17.     def human_attribute_name(attribute_key_name)
  18.       name = @@field_name[attribute_key_name].with_josa('은') attribute_key_name.humanize
  19.     end
  20.    
  21.     # 필드명을 등록하는 class method.
  22.     def register_attr_name(attr_hsh = {})
  23.       @@field_name.merge!(attr_hsh.stringify_keys)
  24.     end
  25.   end
  26. end
  27. ActiveRecord::Errors.default_error_messages = {
  28.   :inclusion => "리스트에 포함되지 않습니다.",
  29.   :exclusion => "제한되었습니다.",
  30.   :invalid => "유효하지 않습니다.",
  31.   :confirmation => "확인과 맞지 않습니다.",
  32.   :accepted  => "반드시 동의하셔야 합니다.",
  33.   :empty => "비어있을 수 없습니다.",
  34.   :blank => "공백일 수 없습니다.",
  35.   :too_long => "최대 %d 문자 이하이어야 합니다.",
  36.   :too_short => "최소한 %d 문자 이상이어야 합니다.",
  37.   :wrong_length => "정확히 %d 문자이어야 합니다.",
  38.   :taken => "이미 사용되고 있습니다.",
  39.   :not_a_number => "숫자가 아닙니다."
  40. }
  41. class User < ActiveRecord::Base
  42.   register_attr_name(:username => '아이디', :nickname => '닉네임')
  43.   # ...
  44. end

이렇게 설정할 경우, <%= error_messages_for :user %> 에서 적절한 한글 메시지를 볼 수 있게 된다.
2006/11/23 20:34 2006/11/23 20:34