Transmeta是Django模型中可翻译内容的应用程序。
项目描述
简介
Transmeta是Django模型中可翻译内容的应用程序。每种语言都会在数据库级别自动存储和管理在不同的列中。
功能
带有可翻译字段的自动模式创建。
可翻译字段集成到Django的admin界面中。
命令用于同步数据库模式以添加新的可翻译字段和新的语言。
使用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壳中运行
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')), )
如果您使用的是具有原生迁移的 Django 版本(版本 1.7 或更高),您可以使用
$ ./manage.py makemigrations $ ./manage.py migrate
来更改您的数据库。否则,执行特殊的 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
完成了!
添加新的可翻译字段
现在,想象一下,在几个月使用这个网络应用(创建了多本书)之后,您需要使书的价格可翻译(例如,因为书的价格取决于货币)。
为此,首先将 price 添加到模型的可翻译字段列表中
class Book(models.Model): ... price = models.FloatField() class Meta: translate = ('description', 'body', 'price', )
同样,如果您使用的是具有原生迁移的 Django 版本(版本 1.7 或更高),按照上述方法运行 makemigrations;否则调用 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 = '---'
请注意,sync_transmeta_db 不完全支持 SQLite。
管理集成
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.6 (2020-02-12)
在 PyPI 上作为 django-transmeta-eh
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 中的一个小错误(UnboundLocalError: local variable 'f' referenced before assignment)
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)
在模型中使用 ugettext_lazy 的 verbose_name 时,使其与 Django 1.2 和 1.3 兼容,同时修复了 Django 1.1 中的一个隐藏错误
下载
项目详情
下载文件
下载适用于您平台的自定义文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分发
django-transmeta-eh-0.7.6.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cbe504f73e6c7cfed5c23d883db6c28efe2f2e0cdddf33a68c343d1fd862fa01 |
|
MD5 | 785c7cfba2ebdb529a1fbeb793cee015 |
|
BLAKE2b-256 | 966abb22c8e57623be63e76a4e6a7215cd141d644e8acb8a780ee39b90c6cf2a |