跳转到主要内容

简单Django模型翻译,无需复杂的技巧,具有良好的管理集成。

项目描述

https://github.com/django-parler/django-parler/actions/workflows/tests.yaml/badge.svg https://readthedocs.org/projects/django-parler/badge/?version=stable https://img.shields.io/pypi/v/django-parler.svg https://img.shields.io/pypi/l/django-parler.svg https://img.shields.io/codecov/c/github/django-parler/django-parler/master.svg

django-parler

简单Django模型翻译,无需复杂的技巧。

特性

  • 良好的管理集成。

  • 像常规属性一样访问翻译后的属性。

  • 自动回退到默认语言。

  • 为翻译字段提供单独的表格,与 django-hvad 兼容。

  • 与其他组件兼容良好,支持 django-polymorphicdjango-mptt 等组件。

    • 没有ORM查询技巧。

    • 易于与自定义Manager或QuerySet类结合使用。

    • 在需要时,可以轻松手动构建翻译模型。

有关更多详细信息,请参阅文档

简要概述

安装 django-parler

可以使用以下方式安装此包

pip install django-parler

添加以下设置

INSTALLED_APPS += (
    'parler',
)

可选地,还可以配置管理界面选项卡

PARLER_LANGUAGES = {
    None: (
        {'code': 'en',},
        {'code': 'en-us',},
        {'code': 'it',},
        {'code': 'nl',},
    ),
    'default': {
        'fallback': 'en',             # defaults to PARLER_DEFAULT_LANGUAGE_CODE
        'hide_untranslated': False,   # the default; let .active_translations() return fallbacks too.
    }
}

在运行使用站点框架的多站点项目时,将 None 替换为 SITE_ID。每个 SITE_ID 都可以添加到字典中的额外条目。

确保您的项目已配置为多语言。限制 LANGUAGES 设置可能很有用。例如

from django.utils.translation import gettext_lazy as _

LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', _("English")),
    ('en-us', _("US English")),
    ('it', _('Italian')),
    ('nl', _('Dutch')),
    ('fr', _('French')),
    ('es', _('Spanish')),
)

默认情况下,回退语言与 LANGUAGE_CODE 相同。可以在设置中更改回退语言

PARLER_DEFAULT_LANGUAGE_CODE = 'en'

创建模型

使用 TranslatedFields 包装器,可以将模型字段标记为可翻译

from django.db import models
from parler.models import TranslatableModel, TranslatedFields

class MyModel(TranslatableModel):
    translations = TranslatedFields(
        title = models.CharField(_("Title"), max_length=200)
    )

    def __unicode__(self):
        return self.title

访问字段

可翻译字段可以像常规字段一样使用

>>> object = MyModel.objects.all()[0]
>>> object.get_current_language()
'en'
>>> object.title
u'cheese omelet'

>>> object.set_current_language('fr')       # Only switches
>>> object.title = "omelette du fromage"    # Translation is created on demand.
>>> object.save()

内部,django-parler 将翻译字段存储在单独的模型中,每个语言一行。

过滤翻译

要查询翻译字段,请使用 .translated() 方法

MyObject.objects.translated(title='cheese omelet')

要访问当前和可能回退语言的对象,请使用

MyObject.objects.active_translations(title='cheese omelet')

这返回被认为是“活动”的语言中的对象,这些是

  • 当前语言

  • 当在 PARLER_LANGUAGES 设置中设置 hide_untranslated=False 时,回退语言。

更改语言

可以指示查询集返回特定语言的对象

>>> objects = MyModel.objects.language('fr').all()
>>> objects[0].title
u'omelette du fromage'

这仅设置对象的语言。默认情况下,使用当前的Django语言。

使用 object.get_current_language()object.set_current_language() 来更改单个对象的语言。有一个上下文管理器来完成此操作

from parler.utils.context import switch_language

with switch_language(model, 'fr'):
    print model.title

还有一个用于查询特定字段的函数

model.safe_translation_getter('title', language_code='fr')

高级功能

此包还包括

  • 手动创建 TranslatedFieldsModel

  • 用于内联支持的表单类。

  • 用于切换语言、创建/更新可翻译对象的视图类。

  • 用于语言切换按钮的模板标签。

  • 用于处理翻译字段的ORM方法。

  • 支持管理内联。

有关更多详细信息,请参阅文档

特别说明

  • 使用 ModelAdmin.prepopulated_fields 不起作用,但可以使用 get_prepopulated_fields() 作为解决方案。

  • 由于 ORM限制,翻译字段的查询应在单个 .translated(..).active_translations(..) 调用中执行。

  • 通常需要 .active_translations(..) 方法调用 .distinct() 以避免相同对象的重复结果。

待办事项

  • 当前列表代码针对每个对象执行一个查询。这需要减少。

  • 最好,如果与ORM一起使用,则模型上的 TranslatedField 代理应表现得像 RelatedField

请为此改进或这些领域做出贡献!

贡献

本模块旨在通用。如果对其中任何内容不满意或认为不够灵活,请告诉我们。我们很高兴改进它!

如果您有任何其他有价值的贡献、建议或想法,也请告诉我们,因为我们会考虑它。我们也欢迎拉取请求。:-)

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

django-parler-2.3.tar.gz (69.2 kB 查看哈希值)

上传时间

构建分布

django_parler-2.3-py3-none-any.whl (83.3 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面