Linguao的目标是使模型转换变得简单,它的设计使您能够按照预期使用内置的Django特性(查询API、模型表单、管理等)。
django-linguo的Python项目详细描述
语言
语言旨在使模型翻译变得容易。它旨在让您使用 内置django特性(查询api、模型表单、管理等)。 Linguao相对容易地与现有代码集成,并执行 翻译检索逻辑透明(类似于ugettext)。它做到这一点 通过为每种语言创建附加列并使用代理属性 让它对你透明。
功能
- 根据当前活动的自动引用正确的翻译 语言。
- 允许您正常使用django orm(无需担心哪些字段是 可翻译,Linguao为您解答。
- 通过基于 主动语言。
- 支持Django版本1.4.9到1.7.1
- 综合测试覆盖率
用法
子类 多语言模型 并定义 翻译 属性:
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')
多语言管理器允许您透明地执行筛选和 在可翻译字段上排序(更多信息见下文)。
假设您的 语言设置是这样的…
LANGUAGES = ( ('en', ugettext('English')), ('fr', ugettext('French')), )
然后,您可以这样做:
创建产品: 它自动设置当前活动的值 语言。
from django.utils import translation # import the translation package translation.activate('en') product = Product.objects.create( name='English Name', description='English description', price=10 )
翻译该产品上的字段 。
product.translate(language='fr', name='French Name', description='French description' ) product.save() # You don't have to specify price, because it is not a translatable field
如果切换语言,它将自动检索相应的 转换后的值。
translation.activate('fr') product.name -> 'French Name' product.description -> 'French description'
如果您 修改可翻译字段,它将自动将其分配给 当前活动语言。
translation.activate('fr') product.name = 'New French Name' product.save() translation.activate('en') product.name # This remains untouched in English -> 'English Name'
无论语言如何,未翻译字段都将具有相同的值 我们正在营业。
translation.activate('en') product.price = 99 product.save() translation.activate('fr') product.price -> 99
查询数据库
过滤和排序 的工作原理与您预期的一样。它将 使用所用语言进行筛选/排序。你需要有 多语言管理器 在模型上,以便此功能正常工作。
translation.activate('fr') Product.objects.filter(name='French Name').order_by('name')
多语言模型的模型窗体
从自动保存窗体的角度看,模型窗体的工作是透明的 当前活动语言的数据。但是,如果要编辑多个 同时使用的语言(例如, 名称 , 名称 ,等等)参见下面的部分 关于"管理模型表单"。
class ProductForm(forms.ModelForm): class Meta: fields = ('name', 'description', 'price',) model = Product
保存表单时,它会自动将表单数据保存到 当前活动语言
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')0
管理模型表单(同时编辑多种语言)
在管理员中,您最可能希望包含每种语言的字段(例如。 名称 , 名称 等)。在这种情况下,您必须子类 多语言模型表单 并将其用作管理表单。
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')1
可以随时使用多语言模型窗体 同时使用语言(不仅仅是在管理员中)。基本上,它只是 禁用 自动路由 到当前活动语言。
安装
- 将 语言 添加到您的 已安装的应用程序设置中。
- 确保 语言设置包含站点的所有语言。 < > >
- 将新语言附加到 语言设置中。 < DD>UL>
- 你应该避免更改主要语言(即列表中的第一种语言)。如果这样做,则必须迁移该列中的数据。
- 生成迁移(因为新字段将添加到模型):
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')
2
< > >
添加新语言
< DL>
< DL>
运行测试
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')3
故障排除
如果在生成迁移时遇到此消息:
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')4
这意味着您的一个或多个型号上有 blank=false,default=none 。
幕后(工作原理)
对于标记为可翻译的每个字段, 语言 将创建额外的 每个附加语言的数据库字段。
例如,如果您将以下字段标记为可翻译…
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')5
…你有三种语言(en,fr,de)。您的模型将具有以下数据库字段:
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')6
在实例化的模型上,"name"变成一个适当的 属性 获取/设置与我们的语言匹配的相应字段的值。 正在使用。
例如,如果当前语言是"fr"…
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')7
…这将设置 product.name_fr (而不是 product.name )
数据库过滤之所以有效,是因为多语言查询集重写了查询。
例如,如果当前语言是"fr",我们运行以下查询…
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')8
…它将被重写为…
from linguo.models import MultilingualModel from linguo.managers import MultilingualManager class Product(MultilingualModel): name = models.CharField(max_length=255, verbose_name=_('name')) description = models.TextField(verbose_name=_('description')) price = models.FloatField(verbose_name=_('price')) objects = MultilingualManager() class Meta: # name and description are translatable fields translate = ('name', 'description')9
许可证
此应用程序是根据BSD许可证授权的。有关详细信息,请参见许可文件。 基本上,你可以随意使用这些代码,但是如果 你的电脑爆炸了。