Skip to content

如何給 Pelican 增加 Jinja2 過濾器

Published: 3 分鐘

雖然這個部落格主要語言是正體中文,但偶爾會需要將英文轉成中文來顯示。例如:將導覽路徑(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 擴充功能並無法用來翻譯英文成中文,反過來倒是可以。最後,山姆鍋選擇撰寫一個過濾器來達到目的。

參考資料

  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

郭信義 (Sam Kuo)

奔騰網路科技技術長,專長分散式系統、Web 應用與雲端服務架構、設計、開發、部署與維運。工作之餘,喜歡關注自由軟體的發展與應用,偶爾寫一下部落格文章。