I18nはutf-8形式のymlから読み取り、translateはutf-8からutf-8に変換します。ActiveModel :: Errorsでのエンコードの問題
私のレガシーコードがActiveModelに大きく依存している:: Errors.full_messages、
例えば、
ビューで# note: the message is not utf-8 encoding
validates_length_of :title,:maximum => 2,:message => 'abc'.encode("shift_jis")
を、それが使用しています:
item.errors.full_messages.each do |msg|
end
をエラーのようなものになります。
I18n.t(:title) + " " + 'abc'
は、実際には、full_message関数で、実際のソースコードがあるようなもの:
def full_message(attribute, message)
return message if attribute == :base
attr_name = attribute.to_s.tr('.', '_').humanize
attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
I18n.t(:"errors.format", {
default: "%{attribute} %{message}",
attribute: attr_name,
message: message
})
end
問題は、次のようになる:%{属性}はUTF-8であり、%{メッセージ}はUTF-8ではありません、 full_messageを呼び出すときにエラーが発生します。
あり私は考えることができるいくつかのソリューションです:
1)UTF-8にエラーメッセージを変更するには(非UTF-8である他の文字列がたくさんある)ので、私が対処しなければなりませんutf-8と非utf-8の組み合わせをソースコード内のどこにでも持ち、一緒になると適切な変換を行います。
2)(full_messagesに似た)エラーメッセージを列挙する方法を見つけますが、実装は異なります。 ActiveModel :: errorsのAPIを調べようとしましたが、エラーを列挙できるように内部APIが見つかりませんでした。
3)I18n.tのデフォルト動作を変更して、utf-8以外を返します。
4)ActiveModel :: Errors.full_messagesを変更して、utf-8以外を返します。
実際には2番目のオプションが最適ですが、エラーメッセージをfull_messagesと同じ方法で列挙する方法がわかりません。エラーの内部データ構造を返すパブリックAPIを見つけることができませんでしたか?
最後の2つのオプションは、可能かどうかわからないrubyライブラリへの注入が必要です。
いくつかのヒントを教えてください。ありがとう。