跳转到主要内容

Transmeta是一个用于Django模型中可翻译内容的应用程序。

项目描述

简介

https://badge.fury.io/py/django-transmeta.png https://pypip.in/d/django-transmeta/badge.png

Transmeta是用于Django模型中可翻译内容的程序。每种语言都自动在数据库级别的不同列中存储和管理。

功能

  • 带有可翻译字段的自动架构创建。

  • 可翻译字段集成到Django管理界面中。

  • 命令同步数据库架构以添加新的可翻译字段和新的语言。

使用Transmeta

创建可翻译模型

看看这个模型

class Book(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    body = models.TextField(default='')
    price = models.FloatField()

假设你想使descriptionbody可翻译。使用transmeta后的模型是

from transmeta import TransMeta

class Book(models.Model):
    __metaclass__ = TransMeta

    title = models.CharField(max_length=200)
    description = models.TextField()
    body = models.TextField(default='')
    price = models.FloatField()

    class Meta:
        translate = ('description', 'body', )

在python 3

from transmeta import TransMeta

class Book(models.Model, metaclass=transmeta.TransMeta):

    title = models.CharField(max_length=200)
    description = models.TextField()
    body = models.TextField(default='')
    price = models.FloatField()

    class Meta:
        translate = ('description', 'body', )

请确保您已在 settings.py 中设置了默认和可用语言。

LANGUAGE_CODE = 'es'

ugettext = lambda s: s # dummy ugettext function, as django's docs say

LANGUAGES = (
    ('es', ugettext('Spanish')),
    ('en', ugettext('English')),
)

注意事项

  • 您可能想在您的网站上设置默认语言,但这不是transmeta的默认语言。您可以在设置中设置此变量。

    TRANSMETA_DEFAULT_LANGUAGE = 'it'
  • 语言也是如此。

    TRANSMETA_LANGUAGES = (
        ('es', ugettext('Spanish')),
        ('en', ugettext('English')),
        ('it', ugettext('Italian')),
    )

这是使用 ./manage.py sqlall 命令生成的SQL。

BEGIN;
CREATE TABLE "fooapp_book" (
    "id" serial NOT NULL PRIMARY KEY,
    "title" varchar(200) NOT NULL,
    "description_en" text,
    "description_es" text NOT NULL,
    "body_es" text NOT NULL,
    "body_en" text NOT NULL,
    "price" double precision NOT NULL
)
;
COMMIT;

注意事项

  • transmeta为每种语言创建一个列。不用担心未来需要新语言,transmeta为您解决了这个问题。

  • 如果某个字段是 null=False 且没有默认值,transmeta将只为默认语言创建一个 NOT NULL 字段。其他次要语言的字段将是可空的。在管理应用中,主语言是必需的,而其他字段是可选的(带有 blank=True)。这样做是因为内容翻译的正常方法是首先在主语言中添加内容,然后再让翻译者翻译成其他语言。

  • 您可以使用 ./manage.py syncdb 命令创建数据库模式。

在Python shell中运行

transmeta为模型中定义的每个可翻译字段创建每个可用语言的字段。字段名后缀为语言简码,例如:description_esdescription_en 等。此外,它还创建一个 field_name 获取器,用于检索活动语言中的字段值。

让我们在Python shell中玩一会儿,以更好地理解这是如何工作的。

>>> from fooapp.models import Book
>>> b = Book.objects.create(description_es=u'mi descripcion', description_en=u'my description')
>>> b.description
u'my description'
>>> from django.utils.translation import activate
>>> activate('es')
>>> b.description
u'mi descripcion'
>>> b.description_en
u'my description'

添加新语言

如果您需要向现有语言添加新语言,只需更改您的settings.py并让transmeta再次同步数据库。例如,要将法语添加到我们的项目中,您需要将其添加到settings.py中的LANGUAGES。

LANGUAGES = (
    ('es', ugettext('Spanish')),
    ('en', ugettext('English')),
    ('fr', ugettext('French')),
)

并执行特殊的 sync_transmeta_db 命令。

$ ./manage.py sync_transmeta_db

This languages can change in "description" field from "fooapp.book" model: fr

SQL to synchronize "fooapp.book" schema:
   ALTER TABLE "fooapp_book" ADD COLUMN "description_fr" text

Are you sure that you want to execute the previous SQL: (y/n) [n]: y
Executing SQL... Done

This languages can change in "body" field from "fooapp.book" model: fr

SQL to synchronize "fooapp.book" schema:
   ALTER TABLE "fooapp_book" ADD COLUMN "body_fr" text

Are you sure that you want to execute the previous SQL: (y/n) [n]: y
Executing SQL... Done

完成了!

添加新可翻译字段

现在想象一下,在几个月使用这个Web应用(创建了许多书籍)之后,您需要使书籍价格可翻译(例如,因为书籍价格取决于货币)。

为此,首先将 price 添加到模型的可翻译字段列表中。

class Book(models.Model):
    ...
    price = models.FloatField()

    class Meta:
        translate = ('description', 'body', 'price', )

现在剩下的只是调用 sync_transmeta_db 命令以更新数据库模式。

$ ./manage.py sync_transmeta_db

This languages can change in "price" field from "fooapp.book" model: es, en

SQL to synchronize "fooapp.book" schema:
    ALTER TABLE "fooapp_book" ADD COLUMN "price_es" double precision
    UPDATE "fooapp_book" SET "price_es" = "price"
    ALTER TABLE "fooapp_book" ALTER COLUMN "price_es" SET NOT NULL
    ALTER TABLE "fooapp_book" ADD COLUMN "price_en" double precision
    ALTER TABLE "fooapp_book" DROP COLUMN "price"

Are you sure that you want to execute the previous SQL: (y/n) [n]: y
Executing SQL...Done

这个命令到底做了什么?

sync_transmeta_db 命令不仅为新的可翻译字段创建新的数据库列,它还将从旧 price 字段复制数据到一种语言中,这就是为什么命令会要求您提供实际数据的目标语言字段。确保LANGUAGE_CODE和LANGUAGES(或TRANSMETA_DEFAULT_LANGUAGE、TRANSMETA_LANGUAGES)设置有正确的值非常重要。

您还可以在想要添加语言到网站或更改transmeta中的默认语言时执行此命令。在这种情况下,您可以在设置文件中定义一个变量。

TRANSMETA_VALUE_DEFAULT = '---'

管理集成

transmeta透明地将所有可翻译字段显示在管理界面中。这是因为模型实际上有多个字段(每个语言一个)。

在管理中更改表单字段是一个相当常见的任务,transmeta包括 canonical_fieldname 工具函数来一次为所有语言字段应用这些更改。以下是一个示例来说明这一点。

from transmeta import canonical_fieldname

class BookAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(BookAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        db_fieldname = canonical_fieldname(db_field)
        if db_fieldname == 'description':
            # this applies to all description_* fields
            field.widget = MyCustomWidget()
        elif field.name == 'body_es':
            # this applies only to body_es field
            field.widget = MyCustomWidget()
        return field

作者

transmeta是在Yaco Systems创建的,最初用于Turismo Andaluz。

Transmeta的作者有:

变更历史

0.7.3 (2013-09-02)

  • 更新元信息

0.7.2 (2013-09-02)

  • 项目已迁移到github

0.7.1 (2013-09-02)

  • 添加清单

0.7.0 (2013-09-02)

  • 兼容Python3

  • 修复readme文件

0.6.11 (2013-08-20)

  • 添加了get_mandatory_fieldname函数。

0.6.10 (2013-03-18)

  • 新增TRANSMETA_MANDATORY_LANGUAGE设置,用于控制模型中哪个字段将不为NULL。

0.6.9 (2012-10-24)

  • 支持方法get_field_language中下划线字段名

0.6.8 (2012-06-22)

  • 修复了命令sync_transmeta_db中的一个小错误(未绑定本地变量错误:在分配之前引用了局部变量‘f’)

0.6.7 (2012-03-20)

  • 更改transmeta标签的表示(verbose_name)

0.6.6 (2012-02-06)

  • 在命令sync_transmeta_db中进行了改进和易用性提升

  • 修复了一些错误

  • 文档

0.6.5 (2012-01-13)

  • 在命令sync_transmeta_db中进行了改进和易用性提升

  • 与最新版本的django兼容(sync_transmeta_db命令)

  • 与mysql兼容(sync_transmeta_db命令)

0.6.4 (2011-11-29)

  • 修复了模型中继承的错误

0.6.3 (2011-11-29)

  • 允许使用TRANSMETA_LANGUAGES设置

  • 为sync_transmeta_db添加了两个选项:-y(对所有都假设是“是”)和-d(默认语言代码)

0.6.2 (2011-03-22)

  • 当默认区域设置为具有拼写变体的es-ES或en-US时,可以正常工作。

0.6.1 (2011-03-17)

  • get_all_translatable_fields没有返回正确的元组。存在继承问题。

0.6.0 (2011-02-24)

  • 当在模型verbose_name中使用ugettext_lazy时,使其与Django 1.2和1.3兼容,修复了隐藏的错误,同时也修复了Django 1.1的问题

下载

项目详情


下载文件

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

源分布

django-transmeta-edw-0.7.3.tar.gz (13.1 kB 查看哈希值)

上传时间

构建分布

django_transmeta_edw-0.7.3-py2.py3-none-any.whl (14.9 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

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