最近公司準備擴張海外業務,所以要給 Django 系統添加 國際化與本土化 支持。國際化一般簡稱 i18n ,代表 Internationalization 中 i 和 n 有 18 個字母;本地化簡稱 L10n ,表示 Localization 中 l 和 n 中有 10 個字母。有趣的一點是,一般會用小寫的 i 和大寫的 L 防止混淆。
簡單來說:i18n 是為國際化搭建框架,L10n 是針對不同地區的適配。舉個簡單的例子:
i18n:
datetime.now().strftime('%Y/%m/%d') # before i18ndatetime.now().strftime(timeformat) # after i18n
L10n:
timeformat = { 'cn': '%Y/%m/%d', 'us': '%m/%d/%Y', 'fr': '%d/%m/%Y', ...}
更加具體的定義可以看https://www.w3.org/International/questions/qa-i18n的解釋。
i18n 的范圍非常廣,包括多語言、時區、貨幣單位、單復數、字符編碼甚至是文字閱讀順序(RTL)等等。這篇文章只關注 i18n 的多語言 方面。
↑ 阿拉伯語的 windows 系統,文字甚至界面的方向都與中文版的相反
基本步驟
Django 作為一個大而全的框架,已經提供了一套多語言的解決方案,我稍微對比了一下,并沒能找到在 Django 體系下比官方方案還好用的庫。Django 的方案可以簡單分為四步:
下面我們詳細來看看
第一步:配置
首先在 settings.py 中加入這幾個內容
LOCALE_PATHS = ( os.path.join(__file__, 'language'),)MIDDLEWARE = ( ... 'django.middleware.locale.LocaleMiddleware', ...)LANGUAGES = ( ('en', 'English'), ('zh', '中文'),)
LOCALE_PATHS
:指定下面第三步和第四步生成文件的位置。老版的 Django 需要手動新建好這個目錄。
LocaleMiddleware
:可以讓 Django 識別并選擇合適的語言。
LANGUAGES
:指定了這個工程能提供哪些語言。
第二步:標記文本
之前沒有多語言的需要,所以大家在 AJAX 相應代碼中直接寫了中文,比如這樣:
return JsonResponse({"msg": "內容過長", "code": 1, "data": None})
現在需要多語言了,就需要告訴 Django 哪些內容是需要翻譯的。對于上面的例子來說,就是寫成這樣:
from django.utils.translation import gettext as _return JsonResponse({"msg": _("內容過長"), "code": 1, "data": None})
這里使用 gettext
函數將原本的字符串包裹起來,這樣的話,Django 就可以根據當前語言返回合適的字符串。一般會使用單個下劃線 _
提高可讀性。
因為我司幾乎所有前后端通信都使用 AJAX,所以并沒有怎么用上 Django 的模板功能(順便一提,我司前端使用的多語言工具是 i18next )。不過在這里也一并寫下 Django 模板的標記方法:
新聞熱點
疑難解答