2013-05-05 91 views
1

我用我的模型的一些驗證並嘗試將錯誤轉化爲自己的語言Rails 3的自定義驗證與國際化

在這裏,在我的模型誤差TaiSan我有一些只會驗證這樣的:

class TaiSan < ActiveRecord::Base 
attr_accessible :MaTS, :TenTS 
validates_length_of :MaTS, :in => 9..10, :allow_nil => false 
validates_presence_of :MaTS 
validates_uniqueness_of :MaTS 

在控制器和視圖我剛剛離開它是默認(scafford)

在我locales\vi.yml這個樣子的

vi: 
errors: &errors 
    format: ! '%{attribute} %{message}' 
messages: 
    taken: đã tồn tại trong cơ sở dữ liệu 
    blank: không được trống 
    empty: không được rỗng 
    too_long: 
    one: quá dài (tối đa là 1 kí tự) 
    other: quá dài (tối đa là %{count} kí tự) 
    too_short: 
    one: quá ngắn (tối thiểu là 1 kí tự) 
    other: quá ngắn (tối thiểu là %{count} kí tự) 
    wrong_length: 
    one: sai độ dài (phải là 1 kí tự) 
    other: sai độ dài (phải là %{count} kí tự) 

任何其他除外validate_uniqueness_of的錯誤消息做工精細,它被翻譯成我的語言上面定義,但taken:仍然是'...has already been taken'

任何線索什麼我錯過了???非常珍貴任何提示和回答

解決方案

我已經添加vi:後一些代碼locale\vi.yml這樣的:

vi: 
    activerecord: 
    errors: 
     messages: 
     taken: "đã tồn tại" 

現在它工作正常!那麼,爲什麼我必須在唯一性驗證之前添加activerecord,但其他(存在,長度,...)不需要?

回答

0

Rails已經內置了很多不同的語言翻譯,在rails-i18n寶石。這包括越南語。

無論如何......在編寫自定義驗證消息時,請確保指定了正確的嵌套密鑰。

你的翻譯文件應遵循相同的YAML格式作爲默認,如: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/vi.yml

所以對於taken翻譯完整的密鑰將,不en.messages.taken

請注意,您的語言也應在YAML文件中指定爲vi而不是en

+0

由於我的複製粘貼,我的壞,它是'vi'在那裏,它仍然是錯誤的唯一屬性 – WindzSoul 2013-05-05 14:52:38

+0

快速響應,關於'vi'和'en'的問題,我看着你更多鏈接,並找到了上面編輯的解決方案,你能告訴我有什麼區別,我在那裏混淆,再次提前 – WindzSoul 2013-05-05 15:05:35

+0

,你需要正確地嵌套你的密鑰。您不必將它們嵌套在'activerecord'下,但是您需要將它們嵌套在'errors'下。 – sevenseacat 2013-05-06 05:38:48