Top Banner
Django, i18N, l10N
31

I18n

Jan 13, 2017

Download

Technology

Tim 陳耀光
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: I18n

Django, i18N, l10N

Page 2: I18n

今天

• 什麼是 i18N 跟 l10N

• Python 怎麼做

• Django 怎麼做

Page 3: I18n

i18n, 國際化• internationalization

• 太⻑⾧長了, 就改成 iXXn, XX 就是⻑⾧長度

Page 4: I18n

l10N 本地化

• localization ⽐比照辦理

Page 5: I18n

詳細的意義

• (From Wiki)

• 國際化(i18n) 意味著產品有適⽤用於任何地⽅方的「潛⼒力」

• 在地化(l10N)則是為了更適合於「特定」地⽅方的使⽤用

Page 6: I18n

簡化版 i18N + l10Nsimple.py

Page 7: I18n

python simple.py

Hi 世界

LANG=en_US.UTF-8 python simple.py

Hello World

簡化版 i18N + l10N

Page 8: I18n

實務上需要的功能

• 單數複數?

• May 是五⽉月天還是五⽉月花? Order 是順序還是訂單?

• ⼯工作流程如何標準化?

• 數字,⽇日期的格式

Page 9: I18n

更難的問題

• ⽂文化,圖⽚片,習慣

• ⽂文字⽅方向

Page 10: I18n

Gnu gettext

• gnu 的 gettext 可以幫助我們做 i18N, l10N。並且可以⽀支援 C, Java, Python, PHP… 等等語⾔言

• 使⽤用 gettext 可以⾃自已建⽴立 i18N, l10 的流程

• django 基於 gettext,有⼀一套很簡潔的流程

Page 11: I18n

Gettext 包含

• xgettext 讀取你的程式,產⽣生訊息檔

• msgfmt 把訊息檔變成 2 進位格式,供你的程式讀取

Page 12: I18n

訊息檔

Page 13: I18n

使⽤用 gettext 的流程

• 寫好程式,程式內使⽤用字串的地⽅方,請⽤用 _() 圍住

• 執⾏行 xgettext 新增/更新訊息檔

• 使⽤用 msgfmt 編譯訊息檔

• 執⾏行程式看看

Page 14: I18n

xgettext and pythonexample.py

Page 15: I18n

訊息以語系做分別. ├── example.py └── zh_TW.UTF-8 └── LC_MESSAGES └── example.mo

Page 16: I18n

指令• 產⽣生訊息 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

Page 17: I18n

DEMO

• 程式碼是 pure_python/example.py

Page 18: I18n

xgettext 的貼⼼心

• 若是有漏翻的,會先以 key 擋著

• 可以簡易做出訊息檔

Page 19: I18n

Used In Django

• 剛剛有點苦, Django 會幫你簡化使⽤用⽅方式

Page 20: I18n

Django

Django

locale

settings

LocaleMiddleWare

存放訊息檔

LOCALE_PATHSLANGUAGE_CODE

Request

get user language

preference

Page 21: I18n

基本 settingLOCALE_PATHS:

每個 app 可以有⾃自已的訊息檔,我們也可以⾃自已增加額外的訊息檔的位置。 設定⽅方式跟 TEMPLATE_DIR 很像

LANGUAGE_CODE:

如果你的網站的使⽤用者沒有設定語⾔言,就以這個做預設值。 在 1.8 之後 中⽂文是 zh-Hant ,規則是 語⾔言-字體 1.7 以前,是⽤用 zh-TW (可以不⽤用管⼤大⼩小寫 )

這個設定 dash 是擺中間

Page 22: I18n

Middleware

 session middle ware 要擺第⼀一,因為才能知道 user 的選擇

locale middle ware 會分析 accept langue request header

Page 23: I18n

Template 實做記得 load i18n

trans 後⾯面加 key

Page 24: I18n

Used With View

import ugettext as _

習慣使⽤用 _ , ⽤用 ugettext 也是可以的

Page 25: I18n

Used With Model

再把 admin.py 補起來。 你會發現 Order 沒有如你所願翻成功

要改⽤用 ugettext_lazy

Page 26: I18n

Why

• Python 的運作模式,是⼀一開始⼀一定會執⾏行程式⼀一次。

• verbose_name 在⼀一開始啟動,就被決定了...

• lazy 結尾的版本,會每⼀一次存取都取值

Page 27: I18n

DEMO• demo flow

• demo with Browser language order

• Make Message:

• django-admin.py makemessages -l zh_TW

• Compile Message

• django-admin.py compilemessages

Page 28: I18n

Used With javaScript

• ⼤大家已經有概念,所有的字串都要即時取值。

• django 可以幫你產⽣生合適的 js code. 讓你使⽤用⽅方式跟剛剛講的幾呼⼀一樣。

Page 29: I18n

• django-admin makemessages -d djangojs -l zh_TW

• djangojs 很重要,是指定 domain. 除了產⽣生的訊息檔案不同之外,他不會去掃描 python 檔了,⽽而是掃 javaScript 檔

Page 30: I18n

DEMO

• Demo of JS

Page 31: I18n

Further Reading

• 單複數的處理

• django-statici18n