1. 程式人生 > >Django第十五篇-----國際化

Django第十五篇-----國際化

目錄

基本定義

國際化

本地化

區域設定名稱

語言程式碼

訊息檔案

翻譯字串

格式檔案

國際化模板程式碼

trans 模板標籤

其他標籤

 實現方式說明


基本定義

國際化

指為任何區域設定提供支援的程式設計過程。這個過程通常由軟體開發者處理。國際化包括標記可翻譯的文字(例如 UI 元素和錯誤訊息);抽象日期和時間的顯示方式,兼顧不同的區域標準;支援不同的時區;以及在程式碼中不對使用者的區域位置做任何假設。國際化經常縮寫為 I18N。(數字 18 表示省略了開頭的 I 和末尾的 N 之間的 18 個字母。)

本地化

指把國際化的程式翻譯成特定區域的語言。這個過程通常由翻譯人員處理。本地化有時縮寫為 L10N。

區域設定名稱

ll 形式的語言規範碼,或者 ll_CC 形式的語言和國家規範碼。例如: it 、 de_AT 、 es 、 pt_BR 。語言部分始終小寫,國家部分始終大寫。中間以一個下劃線分開。

語言程式碼

表示語言的名稱。瀏覽器在 Accept-Language 首部中使用這種格式指定接受的語言。例如: it 、 de-at 、es 、 pt-br 。語言程式碼一般使用小寫字母表示,但是 Accept-Language 首部不區分大小寫。分隔符是一個連字元。

訊息檔案

表示一種語言的純文字檔案,包含所有可翻譯的字串,以及目標語言的表述。訊息檔案的副檔名是.po 。

翻譯字串

可以翻譯的文字串。

格式檔案

定義目標區域設定所用資料格式的 Python 模組。

國際化模板程式碼

Django 模板使用兩個模板標籤翻譯,而且與在 Python 程式碼中的句法稍有不同。若想在模板中訪問那兩個標籤,在模板頂部寫上 {% load i18n %} 。與其他模板標籤一樣,每個需要翻譯的模板都要有這麼一個 load 標籤,即便是擴充套件自已經載入了 i18n 標籤的模板也是如此。

trans 模板標籤

{% trans %} 模板標籤既能用於翻譯不變的字串(放在單引號或雙引號中),也能用於翻譯變數的內容:

<title>{% trans "This is the title." %}</title>
<title>{% trans myvar %}</title>

如果指定 noop 選項,會查詢變數,但不翻譯。這麼做只是為了佔位,而把翻譯留到未來某個時刻:

<title>{% trans "myvar" noop %}</title>

行間翻譯在背後呼叫 ugettext() 函式。

如果傳給 trans 標籤的是一個模板變數,在執行時首先把變數解析成字串,然後在訊息目錄中查詢那個字串。

在 {% trans %} 標籤中,不能內插模板變數。如果需要變數中的字串(佔位符),使用 {% blocktrans%} 。如果想獲取翻譯後的字串,但不將其顯示出來,使用下述句法:

{% trans "This is the title" as the_title %}

在實際運用中,如果需要在多個地方使用翻譯後的字串,或者作為引數傳給別的模板標籤或過濾器,就可以這麼做:

{% trans "starting point" as start %}
{% trans "end point" as end %}
{% trans "La Grande Boucle" as race %}
<h1>
<a href="/" title="{% blocktrans %}Back to '{{ race }}' homepage{% endblocktrans %}">{{ race
}}</a>
</h1>
<p>
{% for stage in tour_stages %}
{% cycle start end %}: {{ stage }}{% if forloop.counter|divisibleby:2 %}<br />{% else %},
{% endif %}
{% endfor %}
</p>

其他標籤

這些標籤也需要 {% load i18n %} 。

• {% get_available_languages as LANGUAGES %} 返回一個元組列表,元組的第一個元素是語言程式碼,第二個元素是語言名稱(翻譯成當前啟用的語言)。
• {% get_current_language as LANGUAGE_CODE %} 返回一個字串,表示當前使用者選擇的語言。例如:en-us 。(參見 18.10.2 節。)
• {% get_current_language_bidi as LANGUAGE_BIDI %} 返回當前區域設定的書寫方向。為 True 時,表示由右向左書寫的語言,如希伯來語和阿拉伯語;為 False 時,表示由左向右書寫的語言,如英語、法語、德語,等等。

 實現方式說明

Django 的翻譯機制採用 Python 標準庫中的 gettext 模組。如果你瞭解 gettext ,將會發現 Django 處理翻譯的方式有些特別之處:

• 字串域是 django 或 djangojs 。域用於區分不同程式在同一個位置(通常是 /usr/share/locale/ )儲存的訊息檔案。 django 域針對 Python 和模板程式碼的翻譯字串,載入到全域性翻譯目錄中。 djangojs 域只針對 JavaScript 翻譯目錄,目的是讓 JavaScript 翻譯目錄儘量保持小體積。
• Django 不單獨使用 xgettext ,而是使用 Python 對 xgettext 和 msgfmt 的包裝程式。這樣做基本上是為了操作方便。