雖然這個部落格主要語言是正體中文,但偶爾會需要將英文轉成中文來顯示。例如:將導覽路徑 (breadcrumb) 轉成中文,但在網址路徑中維持使用英文。 要達到這個目的,使用 Jinja 2 模板的過濾器 (filter) 應該是個簡單方案。本文山姆鍋說明如何增加一個客製化過濾器, 來將模板中部分的英文字串對應到中文。

Jinja 過濾器簡介

Jinja 2 的過濾器可以用來修改主題模板中的變數,過濾器以管道符號( |) 分隔,多個過濾器可以串連在一起,例如: {{ name|striptags|title }} 。實作上,過濾器只是單純的 Python 函式,用來轉換參數。

客製化過濾器

山姆鍋定義了 customer_filters.py 作為所有客製化過濾器的模組,其中定義一個過濾器 mytrans , 負責將英文對應到中文字串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
_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 的部分內容:

1
2
3
4
5
6
7
import os
import sys
sys.path.append(os.curdir)

import custom_filters

JINJA_FILTERS = {'mytrans': custom_filters.mytrans, }

在主題樣板中套用過濾器

要在主題樣板中套用我們開發的過濾器,只需要按照 Jinja 2[^1] 的語法即可。如下面範例:

1
<li class="active">{{ category|mytrans }}</li>

結語

本來山姆鍋以為需要使用 Jinja 2 的 i18n 擴充功能,不過後來稍微研究一下,因為部落格使用正體中文作為預設語言,使用 i18n 擴充功能並無法用來翻譯英文成中文,反過來倒是可以。最後,山姆鍋選擇撰寫一個過濾器來達到目的。

參考資料

  1. Jinja 2: http://jinja2.readthedocs.org/en/latest/intro.html

  2. How to add a custom Jinja filter to Pelican: http://linkpeek.com/blog/how-to-add-a-custom-jinja-filter-to-pelican.html