前言

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

Jinja 過濾器簡介

Jinja 2 的過濾器可以用來修改主題模板中的變數 , 過濾器以管道符號 ( | ) 分隔 , 多個過濾器可以串連在一起 , 例如 : {{ name|striptags|title }} 。 實作上 , 過濾器只是單純的 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 的語法即可 。 如下面範例 :

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

結語

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