Transmeta是一个用于Django模型中可翻译内容的应用程序。
项目描述
简介
Transmeta是用于Django模型中可翻译内容的程序。每种语言都自动在数据库级别的不同列中存储和管理。
功能
带有可翻译字段的自动架构创建。
可翻译字段集成到Django管理界面中。
命令同步数据库架构以添加新的可翻译字段和新的语言。
使用Transmeta
创建可翻译模型
看看这个模型
class Book(models.Model): title = models.CharField(max_length=200) description = models.TextField() body = models.TextField(default='') price = models.FloatField()
假设你想使description和body可翻译。使用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_es、description_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
变更历史
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的问题
下载
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
哈希值 for django_transmeta_edw-0.7.3-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 76bb71dd9870057344778bc6b45db00a69df5631e8608cf4382265826de4afd8 |
|
MD5 | 13f22b5a0458fdb3ea356db34401ebe0 |
|
BLAKE2b-256 | d2042425109c9ea4131fd2a0a7772519607854410d1e8816698080ceef11dc24 |