[Mezzanine] 利用 Django 的 Middleware 機制進行多國語系 (I18N) 處理 (使用 JavaScript 的解決方案)

Mezzanine i18n Best Practice (對我們而言最佳的解決方案)
由於 Mezzanine 對多國語系的處理感覺還在起步階段, 而原作者 Stephen McDonald 在一則類似問題中所提出的替代方案 (approch) 為在後台新增多個站台, 並將各國語言分別指向各個站台, 這樣的意思是說, 倘若今天一篇文章需要 16 種的語言翻譯, 就必須要分別上稿至 16 個網站, 按照管理系統的設計, 就是要切換 16 次到不同網站, 然後再分別新增文章......我想如果我們這樣搞的話, 這樣的解決方案可能會被罵死, 因此, 我們決定對這個部分進行一些客製化。

目標:
使用者進入網站時, 判斷最合適語言, 利用 JavaScript (AngularJS) 函數將所需要翻譯的文字進行替換

首先先在 settings.py 裡面新增一個 Middleware:

接著強迫每一個頁面都必須要有 lang 這個 query parameter (除了 static files 和 admin 等):

新增一個 JavaScript 函數 _(key) 讓需要翻譯的文字透過這個函數進行轉換:

最後再加上翻譯檔與 template 的檔案, i18n 的機制的完工了 (備註):

不過這當中我們還有利用一些技巧及為了內部翻譯流程順暢而蓋的輪子(可能算是大車子了...)沒有寫出來, 如果有人有興趣, 說不定可以有機會請搭建車子的強者我同事出來現身說法一下。

備註:由於 Python 蠻多 template engine (樣板引擎) 所預設用的渲染 (render 或叫插入 interpolate) 符號跟 AngularJS 一樣, 所以必須要修改 AngularJS 或是 Python 兩者其一的預設渲染符號。網誌中的範例是如下在 AngularJS 的 config 階段修改 AngularJS 的渲染(插入)符號。

留言