1

韓国語用のカスタムエラーメッセージプロセッサを実装しました。韓国語では、前置詞は前置詞または代名詞の音に応じて異なる形を取ります。

たとえば、主題をマークする場合、母音の後に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正しくないようです。

4

1 に答える 1