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', )
In 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')), ('en', 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 虚拟环境中操作
transmeta 为每个模型中定义的每个可翻译字段创建一个可用于每种可用语言的字段。字段名称以语言代码后缀结尾,例如:description_es、description_en 等。此外,它还创建了一个 field_name 获取器,用于在活动语言中检索字段值。
让我们在 Python 虚拟环境中玩一会儿,以便更好地理解它是如何工作的。
>>> 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 的一个隐藏错误。
下载
项目详情
django-transmeta-0.7.3.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 709e76430aeb5ee1ccf1c2d968ebd90fd1d4ffe8d35c1c0b313a7ee200bb9a50 |
|
MD5 | 874f7815923acf1ff42f428ff68812fd |
|
BLAKE2b-256 | 01c73fa679b042949f9664512b09067ca5d7a070891d31016eeaa66abb97f909 |