iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 1
0
Modern Web

Ruby礦工的Rails地圖系列 第 1

i18n 搭配model與form的做法

在使用simple_form時,很多人會使用label來命名model的中文,其實可以透過設定model的多語系yml來實作解決這樣的需求。同時,model name本身也可以透過activerecord來設定語系。

一般的做法如下: <%= t("website.title") %>
搭配語系檔的寫法:
zh-TW.yml

"zh-TW":
  website:
    title: "標題"

題外話,在yml檔內zh-TW:"zh-TW":是一樣的
但是後者會美觀一點,所以通常我會選後者,如果沒有「-」時
使用前者就可以了,例如en:
這邊要特別注意,yml檔不接受半形空格以外的縮排
所以如果是用Tab鍵來縮排,很可能會意外爆掉,這點要特別注意!

但假如說有很多個欄位,就要設定非常多次,比如說你可能有按照頁面整理的習慣

"zh-TW":
  admin:
    website:
      title: "標題"
      ...
  backend:
    website:
      title: "標題"
      ...

這個時候,按照model來翻譯欄位,或許是個比較好的選擇
比方說像是這樣

"zh-TW":
  activerecord:
    attributes:
      website:
        title: "標題"
        description: "網站描述"

此時在view的部分,不需要設定lebal,在語系為zh-TW時
就會自動抓到對應的欄位中文名
例如
_form.html.slim

= simple_form_for @website do |f|
  = f.input :title
  ...

不需要寫成= f.input :title, label: t("website.title")
是不是相當方便呢?

另外,Model名稱預設就會是英文,所以可以使用像是這樣的方法
Website.model_name
假如說要增加中文化的語言包,可以這樣設定

"zh-TW":
  activerecord:
    models:
      website:
        one: "網站"
        other: "網站"

這邊需要特別注意的就是,除了一個網站的情況
也需要設定超過一個的時候的中文名稱(因為英文或其他語言會有複數型)
沒有翻譯複數型會直接出錯唷
當然,Model的名稱翻譯也可以使用傳統的語言包設置法

"zh-TW":
  website: "網站"

但如果這樣設定的話,就別忘了至少英文也要一併設定,否則也有可能會出錯唷

en:
  website: "Website"

是不是覺得有些多此一舉呢?
第一天就先講到這邊吧,希望大家都能做好語言包唷。


下一篇
STI , MTI 與多型關聯(Polymorphic Associations) 系列一
系列文
Ruby礦工的Rails地圖30

尚未有邦友留言

立即登入留言