以下主要就是教學Django如何製作多國語系。
範例中,我會採用將繁體中文翻譯成英文。
這邊將會有以下幾個步驟
- 在設定中添加翻譯設定
- 編輯需要翻譯的文字
- Model
- View
- Template
- 製作語系檔(.po)
- 編輯翻譯文字
- 編譯語系檔(.mo)
1、在設定檔內新增參數
settings.py
LANGUAGES = [
('en-US', 'English'),
('zh-Hans', '简体中文'),
('zh-Hant', '繁體中文'),
...
]
LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")]`
在預設的情況下, 只有 USE_I18N 是不需要修改的,Django2.0以下用MIDDLEWARE_CLASSES
MIDDLEWAR = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ) LANGUAGE_CODE = 'zh-Hant' USE_I18N = True
其他都需要修改或新增
2、編輯需要翻譯的文字
在新增翻譯文字的時候,有幾種翻譯方式- ugettext_lazy
- ugettext
models較常使用的是ugettext_lazy,view則是ugettext
以下分別示範Model、View、Template三種
models.py
from django.db import models
from django.utils.translation import ugettext_lazy as _
class Profile(models.Model):
name = models.CharField(_("name"), max_length=255)
phone = models.CharField(_("phone"), max_length=6, null=True, blank=True)
views.py
from django.shortcuts import render
from django.utils.translation import ugettext as _
def index(request):
translate_str = _("這裡放需要翻譯的文字")
context = {"translate_str": translate_str}
return render(request, 'index.html', context)
index.html
{% load i18n %}
<body>
<div>
{# 示範第一種方式,不可以放變數 #}
{% trans "翻譯我" %}
{# 示範第二種方式,可以變數 #}
{% blocktrans %}
這裡的文字都會被翻譯,
而且還可以放變數: {{ translate_str }}
{% endblocktrans %}
{# 示範第二種方式,並且加入一些參數#}
{% blocktrans trimmed %}
翻譯上面的方式之後,在製作po檔時會發現都會多換行符號 \n
但是加入 trimmed 之後,這裡的文字翻譯時就不會有\n了
而且一樣可以放變數: {{ translate_str }}
{% endblocktrans %}
</div>
</body>
3、製作語系檔
首先我們要先在專案的根目錄建立叫做locale的資料夾project
--project
--app
--locale
--static
你的資料夾路徑可能會像是以上這樣 示範以英文為需要翻譯的目標語系
執行指令建立語系檔$ python manage.py makemessages -l en_US
此時你的資料夾路徑會像是這樣
project
--project
--app
--locale
----zh_hant
------LC_MESSAGES
--------django.po
--static
出現沒有gettext的問題,請參閱1
4、編輯 po 翻譯檔
在檔案裡面你會看到兩個屬性 msgid、msgstrmsgid是原始文字,而我們的目標是修改msgst
msgid "姓名"
msgstr "name"
msgid "電話"
msgstr "phone"
修改完會像是以上這樣。 2
5、編譯po語系檔
$ python manage.py compilemessages
完成之後,執行就可以翻譯成你製作的語系了。
最後如果還需要能夠在網頁上動態設置語系,那還會需要添加一些連結以及製作切換語系的選單,Django網站有明確的範例https://docs.djangoproject.com/en/1.11/topics/i18n/translation/#miscellaneous
- 發生這個問題可以到 GNU Project 下載之後自己編譯,所有軟體編譯方式大致一樣,可以參考用編譯方式安裝最新的Python 這篇來編譯。 ↩
- 網路上有一些專門編輯po翻譯檔的程式可以更方便去翻譯,例如 Poedit ↩
沒有留言:
張貼留言
對於文章內有任何問題,都可以提出來討論看看哦。