雖然這個部落格主要語言是正體中文,但偶爾會需要將英文轉成中文來顯示。例如:將導覽路徑(breadcrumb)轉成中文,但在網址路徑中維持使用英文。 要達到這個目的,使用 Jinja 2 ⎘ 模板的過濾器(filter)應該是個簡單方案。本文山姆鍋說明如何增加一個客製化過濾器, 來將模板中部分的英文字串對應到中文。
Jinja 過濾器簡介
Jinja 2 ⎘ 的過濾器可以用來修改主題模板中的變數,過濾器以管道符號( |
) 分隔,多個過濾器可以串連在一起,例如: {% raw %}{{ name|striptags|title }} {% endraw %}。實作上,過濾器只是單純的 Python 函式,用來轉換參數。
客製化過濾器
山姆鍋定義了 customer_filters.py
作為所有客製化過濾器的模組,其中定義一個過濾器 mytrans
, 負責將英文對應到中文字串。
_trans = {
'categories': '文章分類',
'software-development': '軟體開發',
'service-operations': '服務運營',
'customer-support': '客戶服務',
'teamwork': '團隊合作',
'others': '其他文章',
}
def mytrans(s):
""" Translates the given string to its translation, or return it if no mapping is found. """
global _trans
r = _trans.get(s)
return r if r else s
設定 Pelican 加入過濾器
Pelican 設定檔中的 JINJA_FILTERS
可以用來新增客製化的過濾器,不過需要引入(import) custom_filters.py 模組先。為了讓 Pelicanconf.py 可以引入該模組,我們同時需要將目前路徑加入系統的引入路徑中(sys.path)。
下面是片段展示 pelicanconf.py 的部分內容:
import os
import sys
sys.path.append(os.curdir)
import custom_filters
JINJA_FILTERS = {'mytrans': custom_filters.mytrans, }
在主題樣板中套用過濾器
要在主題樣板中套用我們開發的過濾器,只需要按照 Jinja 2[^1] 的語法即可。如下面範例:
<li class="active">{{ category|mytrans }}</li>
結語
本來山姆鍋以為需要使用 Jinja 2 的 i18n 擴充功能,不過後來稍微研究一下,因為部落格使用正體中文作為預設語言,使用 i18n 擴充功能並無法用來翻譯英文成中文,反過來倒是可以。最後,山姆鍋選擇撰寫一個過濾器來達到目的。
參考資料
-
Jinja 2: http://jinja2.readthedocs.org/en/latest/intro.html ⎘
-
How to add a custom Jinja filter to Pelican: http://linkpeek.com/blog/how-to-add-a-custom-jinja-filter-to-pelican.html ⎘