1

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個選項需要注入到紅寶石庫,我不知道它是否可能。

請給我一些提示。謝謝。

回答

1

你可以改變ruby(和rails)幾乎所有的行爲。

只需創建配置/初始化中一個新的初始化器文件,是這樣的:

#monkeypatch_i18n.rb 
(i don't know the exact path of active_model/errors.full_messages) 
module ActiveModel 
    module Errors 
    def full_messages 
     #new logic 
    end 
    end 
end 

這將覆蓋默認的方法。

關於, juanma。

編輯: 一個更清潔的解決辦法是:

#lib/monkey_patch_i18n.rb 
module ActiveModel 
     module Errors 
     def full_messages 
      #new logic 
     end 
     end 
    end 

#config/initializers/init_i18n.rb 
require "#{Rails.root}/lib/monkey_patch_i18n.rb" 
相關問題