Django自帶的多語言方案過於笨重,各類繁瑣的設置以後,還要建立編輯po文件,編譯成mo文件。Django原本就是一個很適合敏捷開發的框架,在翻譯問題這麼折騰就太不Pythonic了。本文介紹使用localeurl和mothertongue來實現多語言支持,經過localurl實現URL的語言前綴,經過mothertougue來翻譯相應的字段。數據庫
安裝localeurl和mothertongue模塊django
pip install django-localeurl
pip install django-mothertongueapp
在settings.py文件中開啓i18n支持,app列表中添加localeurl和mothertongue框架
TIME_ZONE = 'America/Chicago' #時區的選擇沒有影響語言的顯示
USE_I18N = True #開啓i18n支持,默認是開啓的
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('en')), #不加url前綴時默認顯示的語言
('zh', ugettext('zh')),
)
PREFIX_DEFAULT_LOCALE = True #見下文的說明
LOCALEURL_USE_ACCEPT_LANGUAGE = True
MIDDLEWARE_CLASSES = (
#最好是加在middleware列表的第一行
'localeurl.middleware.LocaleURLMiddleware',
)
INSTALLED_APPS = (
#添加localeurl和mothertongue
'localeurl',
'mothertongue',
)
#添加必要的模板處理器
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.core.context_processors.i18n',
"mothertongue.context_processors.router",
"django.contrib.auth.context_processors.auth",網站
PREFIX_DEFAULT_LOCALE是設定當使用默認語言(本例中是en,英語)時否顯示url前綴,建議調試時設置爲True。LOCALEURL_USE_ACCEPT_LANGUAGE設定是否使用header的Accept-Language,若是設置爲True,程序會自動分析訪客使用的語言,來顯示相應的翻譯結果。google
本例將創建一個名爲translate的應用,其中有Article這個models,裏面包含title和content兩個字段,在後臺能夠添加中英文兩種語言:url
首先修改models.py,須要創建兩個class,將MothertongueModelTranslate做爲參數傳入第一個class,第二個class名是在第一個class名後加上Translation:翻譯
from django.db import models
from django.conf import settings
from django.utils.translation import get_language, ugettext, ugettext_lazy as _
from mothertongue.models import MothertongueModelTranslate
class Article(MothertongueModelTranslate):
title = models.CharField(_('title'), max_length=16 )
content = models.TextField(_('content'), blank=True )
translations = models.ManyToManyField('ArticleTranslation',
blank=True, verbose_name=_('translations'))
translated_fields = ['title','content',]
def __unicode__(self):
return u'%s' % self.title
class ArticleTranslation(models.Model):
article_instance = models.ForeignKey('Article', verbose_name=_('article'))
#在下拉菜單中就不會顯示默認語言了
language = models.CharField(max_length=16, choices=settings.LANGUAGES[1:])
title = models.CharField(_('title'), max_length=16)
content = models.TextField(_('content'), blank=True)
def __unicode__(self):
return u'%s' % self.調試
而後在admin.py裏註冊這個模塊:code
from django.contrib import admin
from django.conf import settings
from dmyz.translate.models import Article, ArticleTranslation
class ArticleTranslationInline(admin.StackedInline):
model = ArticleTranslation
extra = 1
#admin界面的翻譯部分顯示幾個輸入框
max_num = len(settings.LANGUAGES)-1
fieldsets = (
(None, {
'fields': ['language',]
}),
('Translation', {
'fields': ['title','content'],
'classes': ['collapse',],
}),
)
class ArticleAdmin(admin.ModelAdmin):
fields = ['title', 'content',]
inlines = (ArticleTranslationInline,)
admin.site.register(Article, ArticleAdmin
最後再把url和view設置好,調出數據進行顯示,這步和django基本操做徹底同樣,沒有什麼須要特殊設置的,因此只把模板文件的代碼放上來:
<h3>{{article.title|safe}}</h3>
{{article.content|safe}}
{% if mothertongue_language_nav %}
<ul>
{% for item in mothertongue_language_nav %}
<li>
<a href="{{ item.url }}">{{ item.name }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
當用戶經過不一樣url訪問網站時,就會顯示不一樣的語言了:
以上就是整個設置了,目前只能對數據庫中的內容進行翻譯,還不能翻譯templates上的內容(或者我沒有發現?),但對於小項目來講也是足夠了的。嘗試調用google的翻譯接口,對一些簡單的單詞進行翻譯,在填入英文時自動翻譯成中文,效果還不錯。總之算是對於翻譯另外一個方案,若是各位有更優的作法歡迎留言=)
# 做者微博:http://weibo.com/perchouli