iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
自我挑戰組

Rails 手工打造自己的部落格 系列 第 30

Rails 手工打造自己的部落格 30 - 多國語言i18n

  • 分享至 

  • xImage
  •  

寫著寫著就已經30天了,但如果只寫一些言不及義的感言不就太沒意思了嗎,
現在的網站已經長成還不錯的形狀了,那今天我們可以再來畫龍點睛一下,
做一個國際友好的功能!「多國語言」

多國語言 i18n

i18n 原文是 「internationalization」,
大概基於工程師都很懶,又可以讓大家方便好念,
而原文的i到n之間有18的英文字,所以就簡稱 i18n,

這是一個 Rails 內建的功能,那其實 Rails 預設的語言是 en 也就是英文,

那這個設定就是在之前有提到的 config 資料夾裡面的 locales目錄裡面,
裡面就有一個預設的檔案 en.yml,那看到這個副檔名 .yml 表示該檔案是使用 YAML 格式來呈現

  • YAML 格式
    YAML(YAML Ain't Markup Language)是一種人類易讀的資料序列化格式,通常用於設定檔、配置檔、資料交換等。YAML 的語法簡潔清晰,以縮排來表示結構,並且不需要使用大量的符號或標記。

那我們要做中文就可以新增一個叫 tw.yml 的檔案,或是 zh-tw.yaml
zh 是 ZhongHua(中華) 的音譯。

然後裡面就可以開始從自己想打的地方來寫
那這個檔案的最上層一定是這個語言的黨名
接著可以放 model 名去管理,但其實這裡的名除了最上層的 tw 都是可以自訂的,

tw.yml

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

那在 view 想要顯示的地方呢,只需要這樣寫

# 需要印出登入的字的話
<%= t("user.login") %>

中文版 裡面就會出現 "登入" 的字樣
效果等同於 <%= "登入" %>
英文版中,就會是 Login
其實就有點像 partial render 的用法,
這樣一大個好處就是,在維護上,如果某個物件要更改名稱的話,
只需要改 yml 檔裡面的設定就好,在網站上一個一個改不就累死,還有會漏掉的風險,
所以即便不需要其他國的語言,寫這個設定也是滿方便管理維護的。

那這裡還有一個非常魔法的寫法,就是搭配 helper 使用!

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 %>

只要這樣寫就可以直接吃的到雙語的版本,

區域設定

在基本的設定檔都寫好了之後,就只差在要如何切換跟判斷預設語言了!

  1. 第一步我們先去config / application.rb 裡面做設定
  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
  1. 再來就要去 application controller 控制器去設定操作語言的地方
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,也請各位鞭小力一點,謝謝大家!!


上一篇
Rails 手工打造自己的部落格 29 站內通知
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言