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

可以随时使用多语言模型窗体 同时使用语言(不仅仅是在管理员中)。基本上,它只是 禁用 自动路由 到当前活动语言。

安装

  1. 语言 添加到您的 已安装的应用程序设置中。
  2. 确保 语言设置包含站点的所有语言。
  3. < > >

    添加新语言
      < DL>
      将新语言附加到 语言设置中。
      < DD>UL>
    1. 你应该避免更改主要语言(即列表中的第一种语言)。如果这样做,则必须迁移该列中的数据。
    2. < 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')
      
      2
      < > >

运行测试

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许可证授权的。有关详细信息,请参见许可文件。 基本上,你可以随意使用这些代码,但是如果 你的电脑爆炸了。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
jstl中循环内部的java方法   java如何以编程方式查找iOS应用程序的堆内存?   java JPA列注释   http Java在Web浏览器中显示HttpResponse的内容   ssl Java如何接受我的自签名证书而不必将其添加到Java信任库   java解析bufferedReader数据,在某些字符处停止   java将具有多个属性的对象映射到另一个对象,然后收集到列表   java是否可以将抽象方法的返回类型设置为与类相同?   java Android导航抽屉,带有菜单图标而非后退按钮   如何在JavaSpringMVC中防止会话重放攻击?   是VB。NET SmtpClient API受限于Java SendMail?   跨多线程/节点的java会话管理   来自Eclipse的java maven项目   使用已解析Java DOM XML中的元素添加新元素