I18n從utf-8格式化的yml中讀取,翻譯將從utf-8轉換爲utf-8。ActiveModel中的編碼問題::錯誤
我的遺留代碼很大程度上依賴於::加載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和non-utf-8的組合,並且當它們一起時做適當的轉換。
2)找到一種方法來枚舉錯誤消息(類似於full_messages),但是具有不同的實現。我試圖查看ActiveModel :: errors的API,並找不到內部API,以便我可以枚舉錯誤。
3)改變I18n.t默認行爲,所以它返回非UTF-8。
4)修改ActiveModel :: Errors.full_messages,使其返回非UTF-8。
第二個選項實際上是最好的選擇,但我不知道如何像full_messages一樣枚舉錯誤消息。我無法找到任何公共API來返回錯誤的內部數據結構?
最後2個選項需要注入到紅寶石庫,我不知道它是否可能。
請給我一些提示。謝謝。