上一篇介紹過 errors
對於處理翻譯的 attribute 部分,接著來聊聊 message 的部分。
首先第一個大原則:傳入 symbol 才會翻譯,傳入 string 則不會
把上一篇的範例 code MyCls
拿來用:
class MyCls
include ActiveModel::Model
attr_accessor :name
end
接著我可能在某些 validation method 裡面往 errors 裡面塞入訊息:
obj = MyCls.new
obj.errors.add(:name, :blank)
obj.errors.add(:name, "My custom message of NAME")
obj.errors.add(:base, "My custom message of BASE")
obj.errors.add(:name, :hello)
依序得到 error message 如下:
Name can't be blank
:blank
是 Rails 內建的 error message,給 presence 用的,所以能翻譯得出來
Name My custom message of NAME
要注意的是英文語法的部分,因為翻譯出來會先冠上 attribute name,所以自訂義 error message 的部分開頭要小寫比較好。
My custom message of BASE
:base
則沒有上述這煩惱,因為 :base
會直接被忽略不秀出來。
translation missing: en.activemodel.errors.models.my_cls.attributes.name.hello
如果你想要自行規劃翻譯檔,看到這串 translation missing,可能很直覺就想要照他的結構去規劃像這樣:
en:
activemodel:
errors:
models:
my_cls:
attributes:
name:
hello: "Hello"
這樣規劃不是不行,但如果你想要共用翻譯的話,還有更好用的結構。
下一篇結合前一篇的 attribute 部分一起來聊聊翻譯的 yaml 檔可以怎樣規劃。