Django, i18N, l10N
今天
• 什麼是 i18N 跟 l10N
• Python 怎麼做
• Django 怎麼做
i18n, 國際化• internationalization
• 太⻑⾧長了, 就改成 iXXn, XX 就是⻑⾧長度
l10N 本地化
• localization ⽐比照辦理
詳細的意義
• (From Wiki)
• 國際化(i18n) 意味著產品有適⽤用於任何地⽅方的「潛⼒力」
• 在地化(l10N)則是為了更適合於「特定」地⽅方的使⽤用
簡化版 i18N + l10Nsimple.py
python simple.py
Hi 世界
LANG=en_US.UTF-8 python simple.py
Hello World
簡化版 i18N + l10N
實務上需要的功能
• 單數複數?
• May 是五⽉月天還是五⽉月花? Order 是順序還是訂單?
• ⼯工作流程如何標準化?
• 數字,⽇日期的格式
更難的問題
• ⽂文化,圖⽚片,習慣
• ⽂文字⽅方向
Gnu gettext
• gnu 的 gettext 可以幫助我們做 i18N, l10N。並且可以⽀支援 C, Java, Python, PHP… 等等語⾔言
• 使⽤用 gettext 可以⾃自已建⽴立 i18N, l10 的流程
• django 基於 gettext,有⼀一套很簡潔的流程
Gettext 包含
• xgettext 讀取你的程式,產⽣生訊息檔
• msgfmt 把訊息檔變成 2 進位格式,供你的程式讀取
使⽤用 gettext 的流程
• 寫好程式,程式內使⽤用字串的地⽅方,請⽤用 _() 圍住
• 執⾏行 xgettext 新增/更新訊息檔
• 使⽤用 msgfmt 編譯訊息檔
• 執⾏行程式看看
xgettext and pythonexample.py
訊息以語系做分別. ├── example.py └── zh_TW.UTF-8 └── LC_MESSAGES └── example.mo
指令• 產⽣生訊息 xgettext -p zh_TW.UTF-8/LC_MESSAGES/ -d
example example.py
• 加⼊入新字串
• 更新訊息 xgettext -j -p zh_TW.UTF-8/LC_MESSAGES/ -d example example.py
• 編譯訊息 msgfmt zh_TW.UTF-8/LC_MESSAGES/example.po -o zh_TW.UTF-8/LC_MESSAGES/example.mo
DEMO
• 程式碼是 pure_python/example.py
xgettext 的貼⼼心
• 若是有漏翻的,會先以 key 擋著
• 可以簡易做出訊息檔
Used In Django
• 剛剛有點苦, Django 會幫你簡化使⽤用⽅方式
Django
Django
locale
settings
LocaleMiddleWare
存放訊息檔
LOCALE_PATHSLANGUAGE_CODE
Request
get user language
preference
基本 settingLOCALE_PATHS:
每個 app 可以有⾃自已的訊息檔,我們也可以⾃自已增加額外的訊息檔的位置。 設定⽅方式跟 TEMPLATE_DIR 很像
LANGUAGE_CODE:
如果你的網站的使⽤用者沒有設定語⾔言,就以這個做預設值。 在 1.8 之後 中⽂文是 zh-Hant ,規則是 語⾔言-字體 1.7 以前,是⽤用 zh-TW (可以不⽤用管⼤大⼩小寫 )
這個設定 dash 是擺中間
Middleware
session middle ware 要擺第⼀一,因為才能知道 user 的選擇
locale middle ware 會分析 accept langue request header
Template 實做記得 load i18n
trans 後⾯面加 key
Used With View
import ugettext as _
習慣使⽤用 _ , ⽤用 ugettext 也是可以的
Used With Model
再把 admin.py 補起來。 你會發現 Order 沒有如你所願翻成功
要改⽤用 ugettext_lazy
Why
• Python 的運作模式,是⼀一開始⼀一定會執⾏行程式⼀一次。
• verbose_name 在⼀一開始啟動,就被決定了...
• lazy 結尾的版本,會每⼀一次存取都取值
DEMO• demo flow
• demo with Browser language order
• Make Message:
• django-admin.py makemessages -l zh_TW
• Compile Message
• django-admin.py compilemessages
Used With javaScript
• ⼤大家已經有概念,所有的字串都要即時取值。
• django 可以幫你產⽣生合適的 js code. 讓你使⽤用⽅方式跟剛剛講的幾呼⼀一樣。
• django-admin makemessages -d djangojs -l zh_TW
• djangojs 很重要,是指定 domain. 除了產⽣生的訊息檔案不同之外,他不會去掃描 python 檔了,⽽而是掃 javaScript 檔
DEMO
• Demo of JS
Further Reading
• 單複數的處理
• django-statici18n