寫著寫著就已經30天了,但如果只寫一些言不及義的感言不就太沒意思了嗎,
現在的網站已經長成還不錯的形狀了,那今天我們可以再來畫龍點睛一下,
做一個國際友好的功能!「多國語言」
i18n 原文是 「internationalization」,
大概基於工程師都很懶,又可以讓大家方便好念,
而原文的i到n之間有18的英文字,所以就簡稱 i18n,
這是一個 Rails 內建的功能,那其實 Rails 預設的語言是 en 也就是英文,
那這個設定就是在之前有提到的 config 資料夾裡面的 locales目錄裡面,
裡面就有一個預設的檔案 en.yml
,那看到這個副檔名 .yml 表示該檔案是使用 YAML 格式來呈現
那我們要做中文就可以新增一個叫 tw.yml
的檔案,或是 zh-tw.yaml
zh 是 ZhongHua(中華) 的音譯。
然後裡面就可以開始從自己想打的地方來寫
那這個檔案的最上層一定是這個語言的黨名
接著可以放 model 名去管理,但其實這裡的名除了最上層的 tw 都是可以自訂的,
tw:
user:
login: 登入
logout: 登出
sign_up: 註冊
password: 密碼
navbar:
artice: 文章
tag: 標籤
那也要記得,同時也要製作一份在英文版的地方,
這樣才不會在換語言的時候找不到對應的翻譯,
en:
user:
login: Login
logout: Logout
sign_up: Sign Up
password: Password
navbar:
artice: Article
tag: Tag
那在 view 想要顯示的地方呢,只需要這樣寫
# 需要印出登入的字的話
<%= t("user.login") %>
在 中文版
裡面就會出現 "登入" 的字樣
效果等同於 <%= "登入" %>英文版
中,就會是 Login
其實就有點像 partial render 的用法,
這樣一大個好處就是,在維護上,如果某個物件要更改名稱的話,
只需要改 yml 檔裡面的設定就好,在網站上一個一個改不就累死,還有會漏掉的風險,
所以即便不需要其他國的語言,寫這個設定也是滿方便管理維護的。
那這裡還有一個非常魔法的寫法,就是搭配 helper 使用!
缺點是這 個就必須遵從 rails 的規則來寫,
格式有一丁點錯誤的話就什麼都不會出現
還有這個設定只可以給限定的 from helper 來使用,無法像自訂義那樣重複使用,
但好處就是,我們在 form 的地方可以什麼註解都不寫,他就會自動對應到正確的欄位進行顯示,
進而讓程式碼看起來更乾淨。
他的寫法順序是長這樣
tw - helper - 顯示的tag - modle - 欄位
tw:
helper:
lable:
article:
title: 標題
content: 內文
user:
name: 名字
email: 信箱
password: 密碼
submit:
user:
create: 註冊
update: 更新
article:
create: 發表文章
update: 更新文章
這樣在 view 的 form 裡面,所有的字串都可以不用寫,
譬如 user 的
<%= form_with(model: @user, data: { turbo: false }) do |f| %>
<div>
<%= f.label :name%>
<%= f.text_field :name%>
</div>
<div>
<%= f.label :email%>
<%= f.email_field :email%>
</div>
<div>
<%= f.label :password%>
<%= f.password_field :password%>
</div>
<%= f.submit %>
<% end %>
只要這樣寫就可以直接吃的到雙語的版本,
在基本的設定檔都寫好了之後,就只差在要如何切換跟判斷預設語言了!
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0 # 這是原本就預設好的版本
# 這行是設定我們預設的語言,抓不到時區的話,預設都是使用 tw 的版本
config.i18n.default_locale = :tw
# 這個是設定,我的語言只接受這兩個參數
I18n.available_locales = [:tw, :en]
# 這就是設定預設的時區
config.time_zone = 'Taipei'
# 這行是 如果沒有明確指定時區,就會從你的電腦去抓你正在使用的本地時區。
config.active_record.default_timezone = :local
# config.eager_load_paths << Rails.root.join("extras")
end
class ApplicationController < ActionController::Base
# callback 方法,你在執行特定 action 的前後執行這個方法
around_action :switch_locale
def switch_locale(&action)
# 使用指定的語言,或者是,預設的語言
locale = params[:locale] || I18n.default_locale
# 在執行每個 action 時,將指定的語言區域應用到該 action 中。
I18n.with_locale(locale, &action)
end
end
最後我們可以來做一個切換的按鈕
可以放在 navbar 或 footer 的部分
<%= link_to "中文版", :controller => controller_name, :action => action_name, :locale => "tw" %>
<%= link_to "English", :controller => controller_name, :action => action_name, :locale => "en" %>
這樣在點擊中文版或英文版的同時就可以切換到不同的語言!
這樣我們的網站就大功告成啦!!!
在這也感謝各位看了我30天的破文,如有錯誤或不夠精準之處,
在此跟看文學習的各位下跪 OTZ,也請各位鞭小力一點,謝謝大家!!