Django 多語言翻譯輕量解決方案

Django自帶的多語言方案過於笨重,各類繁瑣的設置以後,還要建立編輯po文件,編譯成mo文件。Django原本就是一個很適合敏捷開發的框架,在翻譯問題這麼折騰就太不Pythonic了。本文介紹使用localeurl和mothertongue來實現多語言支持,經過localurl實現URL的語言前綴,經過mothertougue來翻譯相應的字段。數據庫

Install

安裝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

Usage

本例將創建一個名爲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訪問網站時,就會顯示不一樣的語言了:

Epilogue

以上就是整個設置了,目前只能對數據庫中的內容進行翻譯,還不能翻譯templates上的內容(或者我沒有發現?),但對於小項目來講也是足夠了的。嘗試調用google的翻譯接口,對一些簡單的單詞進行翻譯,在填入英文時自動翻譯成中文,效果還不錯。總之算是對於翻譯另外一個方案,若是各位有更優的作法歡迎留言=)

# 做者微博:http://weibo.com/perchouli

相關文章
相關標籤/搜索