iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 28
0

今天是元旦三天連假的最後一天
回到台北房間內,疲倦感瞬間湧現
有相當大的衝動想要洗澡後馬上去睡
可惜的是現在還有三天才完成
果然巨大的考驗都在接近終點處

延續昨天的主題
今天一樣來介紹專案上碰過的實用Gem
i18n-js

先為可能不知道i18n是什麼的朋友解說一下
所謂的i18n是一個縮寫
全名是「Internationalization」
共有20個字母,所以扣除掉開頭i與結尾n,中間共有18個字
所以得名i18n,畢竟每次提到都要寫這麼長的一個字
也是相當相當麻煩的一件事
(你也知道工程師都是很懶惰的)

來看看這個字: International + iza + tion

  • International:國際化
  • ise (iza):轉為動詞,所以整個字Internationalise是「使...國際化」
  • tion:名詞結尾,所以整個字就是「使國際化」的名詞

除了rails 以外
大部份的語言在這個領域,也都是使用這個字
是一個共同的課題
rails內建i18n的支援,詳情參考文件
因為這不是今天的重點,先跳過

但內建的支援主要是針對view的部分
更準確說是針對html的呈現可以使用多國語系
如果js也需要用到不同語系的內容
還需要透過頁面變數或ujs等方式傳遞
其實頗不方便
這個Gem就是可以方便簡單的解決這個複雜的問題

Gemfile

gem "i18n-js", ">= 3.0.0.rc11"

目前最新版本是3.0.0
如果有更新可以考慮用最新版

app/assets/javascripts/application.js

//
// This is optional (in case you have `I18n is not defined` error)
// If you want to put this line, you must put it BEFORE `i18n/translations`
//= require i18n
// Some people even need to add the extension to make it work, see https://github.com/fnando/i18n-js/issues/283
//= require i18n.js
//
// This is a must
//= require i18n/translations

如果有改變i18n.js與translations.js的路徑
記得這邊也要一起更動

layout(html)

<%= javascript_include_tag "i18n" %>
<%= javascript_include_tag "translations" %>

一般而言是放在application.html

在開始使用前
你必須確保translations.js這個檔案有被正確產生
這是將你所有的語系檔定義的內容轉為js物件
所以當你有更動語系檔(例如zh-tw.yml)
理論上這個檔案要即時更新重新編譯
如果沒有,可以執行

rake i18n:js:export

他會強制產生一份新的
這樣就可以使用囉
比方說你的語系檔如下:

#config/locales/zh-tw.yml
zh-tw:
    hello: "你好嗎"

在js的部分只需要像這樣:

#app/assets/javascript/hello.coffee
$ ->
  alert #{I18n.t('hello')}

使用上就像在controller呼叫helper一樣方便
是不是很神奇呢?


上一篇
實用Gem 介紹:taiwan_city
下一篇
實用Gem介紹:country_select
系列文
Ruby礦工的Rails地圖30

尚未有邦友留言

立即登入留言