Django的多语言模型简单实现。
项目描述
Django的多语言模型简单实现。Django-admin集成无需额外配置。支持与django-localeurl集成。
先决条件
Django 1.5, 1.6, 1.7
Python 2.7.+, 3.3.+
安装
注意,需要Django 1.5。不支持早期版本。
安装
PyPI上的最新稳定版本
$ pip install django-slim
bitbucket上的最新稳定版本
$ pip install -e hg+https://bitbucket.org/barseghyanartur/django-slim@stable#egg=django-slim
github上的最新稳定版本
$ pip install -e git+https://github.com/barseghyanartur/django-slim/@stable#egg=django-slim
将INSTALLED_APPS中的slim添加到您的设置模块。
使用和示例
一个详细的示例项目可在https://github.com/barseghyanartur/django-slim/tree/stable/example目录中找到。
在PythonHosted上的文档中有截图(http://pythonhosted.org/django-slim/#screenshots)。
演示
为了能够快速评估django-slim,创建了一个演示应用(附带快速安装程序)(仅限Debian)。按照以下说明,在不到一分钟内运行演示应用。
获取最新的 django_slim_example_app_installer.sh
创建一个新的虚拟环境或切换到现有的虚拟环境,为安装程序赋予执行权限,并运行 django-slim-example-app-install.sh。
$ chmod +x django_slim_example_app_installer.sh
$ ./django_slim_example_app_installer.sh
前往前端/后端并测试应用。
管理员用户名: admin
密码: test
现在,让我们一步一步地审查我们的虚拟示例应用。
settings.py
将 slim 添加到已安装的应用中。
>>> INSTALLED_APPS = ( >>> # ... >>> 'slim', >>> # ... >>> )
添加语言。
>>> LANGUAGES = ( >>> ('en', gettext("English")), # Main language! >>> ('hy', gettext("Armenian")), >>> ('nl', gettext("Dutch")), >>> ('ru', gettext("Russian")), >>> )
example/models.py
>>> from django.db import models >>> >>> from slim import LanguageField, Slim >>> >>> class FooItem(models.Model, Slim): >>> title = models.CharField(_("Title"), max_length=100) >>> slug = models.SlugField(unique=True, verbose_name=_("Slug")) >>> body = models.TextField(_("Body")) >>> language = LanguageField()
example/admin.py
>>> from django.contrib import admin >>> >>> from slim.admin import SlimAdmin >>> >>> class FooItemAdmin(SlimAdmin): >>> list_display = ('title',) >>> fieldsets = ( >>> (None, { >>> 'fields': ('title', 'slug', 'body') >>> }), >>> ) >>> >>> admin.site.register(FooItem, FooItemAdmin)
example/views.py
我们假设语言代码保存在请求对象中(建议使用 django-localeurl 行为)。
>>> from slim import get_language_from_request >>> >>> from example.models import FooItem >>> >>> def browse(request, template_name='foo/browse.html'): >>> language = get_language_from_request(request) >>> queryset = FooItem._default_manager.filter(language=language) >>> >>> # The rest of the code
更多关于ORM过滤的信息
>>> from example.models import FooItem >>> foo = FooItem._default_manager.all()[0] <FooItem: Lorem ipsum>
假设我们有一个这样的记录,并且它已经被翻译成亚美尼亚语(hy)和荷兰语(nl)。原始翻译名为 Lorem ipsum。其他翻译会将语言代码附加到标题上。
>>> armenian_foo = foo.get_translation_for('hy') <FooItem: Lorem ipsum HY> >>> dutch_foo = foo.get_translation_for('nl') <FooItem: Lorem ipsum NL>
如果我们有一个翻译的对象,我们总是可以获取主翻译。
>>> armenian_foo.original_translation == foo True
foo的所有可用翻译
>>> foo.available_translations() [<FooItem: Lorem ipsum HY>, <FooItem: Lorem ipsum NL>]
亚美尼亚语foo的所有可用翻译。
>>> armenian_foo.available_translations() [<FooItem: Lorem ipsum>, <FooItem: Lorem ipsum NL>]
有关工作示例,请参阅https://github.com/barseghyanartur/django-slim/tree/stable/example 目录。
django-localeurl集成
安装
django-localeurl集成在Python 2.6.*和2.7.*中得到完全支持,并在安装django-slim时自动安装。如果您使用Python 3,请安装django-localeurl的分支版本(因为官方版本尚不支持Python 3)。
来自bitbucket的分支版本
$ pip install -e hg+https://bitbucket.org/barseghyanartur/django-localeurl@stable#egg=localeurl
集成
使用 slim.models.decorators.auto_prepend_language 装饰器以便它能够工作。
示例(考虑我们的 FooItem 模型。
>>> from django.core.urlresolvers import reverse >>> >>> from slim.models.decorators import auto_prepend_language >>> >>> class FooItem(models.Model): >>> # Some other code; have in mind previous pieces. >>> @auto_prepend_language >>> def get_absolute_url(self): >>> kwargs = {'slug': self.slug} >>> return reverse('foo.detail', kwargs=kwargs)
不要忘记将 LocaleURLMiddleware 添加到 MIDDLEWARE_CLASSES(作为第一个)。
>>> MIDDLEWARE_CLASSES = ( >>> 'localeurl.middleware.LocaleURLMiddleware', >>> # The rest... >>> )
同时,将 localeurl 添加到 INSTALLED_APPS。
>>> INSTALLED_APPS = ( >>> # Some apps... >>> 'localeurl', >>> # Some more apps... >>> )
许可证
GPL 2.0/LGPL 2.1
支持
有关任何问题,请联系作者部分提供的电子邮件。