简单的django模型翻译没有讨厌的黑客,具有良好的管理集成。
django-parler的Python项目详细描述
django parler
简单的django模型翻译没有讨厌的黑客。
功能:
- 很好的管理集成。
- 访问转换的属性,如常规属性。
- 自动回退到默认语言。
- 与django-hvad兼容的翻译字段的单独表。
- 与他人相处融洽,兼容django-polymorphic,django-mptt等:
- 没有orm查询黑客。
- 易于与自定义管理器或QuerySet类结合。
- 在需要的时候,很容易手工构建翻译模型。
有关详细信息,请参见documentation。
简要概述
安装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设置可能很有用。例如:
fromdjango.utils.translationimportugettext_lazyas_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包装器,可以将模型字段标记为可翻译:
fromdjango.dbimportmodelsfromparler.modelsimportTranslatableModel,TranslatedFieldsclassMyModel(TranslatableModel):translations=TranslatedFields(title=models.CharField(_("Title"),max_length=200))def__unicode__(self):returnself.title
访问字段
可翻译字段可以像常规字段一样使用:
>>>object=MyModel.objects.all()[0]>>>object.get_current_language()'en'>>>object.titleu'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时的回退语言。
更改语言
可以指示queryset以特定语言返回对象:
>>>objects=MyModel.objects.language('fr').all()>>>objects[0].titleu'omelette du fromage'
这只设置对象的语言。 默认情况下,使用当前的django语言。
使用object.get_current_language()和object.set_current_language() 更改单个对象上的语言。 有一个上下文管理器可以临时执行此操作:
fromparler.utils.contextimportswitch_languagewithswitch_language(model,'fr'):printmodel.title
以及一个只查询特定字段的函数:
model.safe_translation_getter('title',language_code='fr')
高级功能
此套餐还包括:
- 手动创建TranslatedFieldsModel!
- 用于内联支持的窗体类。
- 用于切换语言、创建/更新可翻译对象的视图类。
- 语言切换按钮的模板标记。
- 处理转换字段的ORM方法。
- 管理内联支持。
有关详细信息,请参见documentation。
特殊注释
- 使用ModelAdmin.prepopulated_fields不起作用,但是可以使用get_prepopulated_fields()作为解决方法。
- 由于ORM restrictions 对已翻译字段的查询应在单个.translated(..)或.active_translations(..)调用中执行。
- .active_translations(..)方法通常需要.distinct()调用,以避免同一对象的重复结果。
待办事项
- 列表代码当前对每个对象执行一个查询。这需要减少。
- 最好,模型上的TranslatedField代理的行为应该类似于RelatedField, 如果这也能很好地配合orm的话。
请贡献你的改进或在这些领域的工作!
贡献
本模块设计为通用模块。万一你有什么不喜欢的, 或者认为它不够灵活,请让我们知道。我们很乐意改进它!
如果你有其他有价值的贡献、建议或想法, 请也让我们知道,因为我们会调查的。 也欢迎拉取请求。:-)