迁移方案及其生命周期¶
实际迁移是通过运行称为**迁移方案**的 Python 模块来执行的,这些模块包含有关如何迁移字符串、涉及哪些文件、应用哪些转换等的指令。这些方案存储在mozilla-central中。
当 Firefox 的 UI 的一部分迁移到 Fluent 时,应将迁移方案附加到将新字符串添加到.ftl文件的同一补丁中。
迁移方案可能会很快变得过时,因为作为持续开发的一部分,引用的字符串和文件将从存储库中删除。出于这些原因,l10n-drivers 定期清理 mozilla-central 中的fluent_migrations文件夹,只保留 2 个发布版本(Nightly 和 Beta)的方案。
提示
作为开发者,您无需担心更新mozilla-central中已有的迁移方案:如果新的补丁删除了迁移方案中使用的字符串或文件,只需忽略它,因为整个方案将在几个周期内被删除。
如何编写迁移方案¶
迁移方案的文件名应以关联的 Bug 编号开头,并包含 Bug 的简要描述,例如bug_1451992_preferences_applicationManager.py
是用于迁移首选项中的应用程序管理器窗口的迁移方案。您也可以参考mozilla-central中的现有方案以获取灵感。
通用方案结构¶
迁移方案是一个 Python 模块,实现了migrate()
函数,该函数以MigrationContext
作为输入。上下文提供的 API 为
class MigrationContext:
def add_transforms(self, target, reference, transforms):
"""Define transforms for target using reference as template.
`target` is a path of the destination FTL file relative to the
localization directory. `reference` is a path to the template FTL
file relative to the reference directory.
Each transform is an extended FTL node with `Transform` nodes as some
values.
For transforms that merely copy legacy messages or Fluent patterns,
using `fluent.migrate.helpers.transforms_from` is recommended.
"""
迁移方案的框架只是实现了migrate()
函数,调用ctx.add_transforms()
,并且看起来像这样
# coding=utf8
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
from __future__ import absolute_import
def migrate(ctx):
"""Bug 1552333 - Migrate feature to Fluent, part {index}"""
target = 'browser/browser/feature.ftl'
reference = 'browser/browser/feature.ftl'
ctx.add_transforms(
target,
reference,
[], # Actual transforms go here.
)
您可以多次调用ctx.add_transforms()
。特别是,您可以通过使用不同的目标引用对调用ctx.add_transforms()
,在单个迁移方案中创建多个文件中的迁移内容。
此函数的文档字符串将用作 VCS 中的提交消息,因此务必确保 Bug 引用正确,并保留part {index}部分:多个字符串可能有多个作者,并且将在不同的提交中迁移(部分 1、部分 2 等)。
转换¶
迁移的工作是由传递给ctx.add_transforms()
作为最后一个参数的转换完成的。它们是 Fluent fluent.syntax.ast.Message
或Term
的实例,它们的内容可以依赖于现有的翻译源。Message 的框架如下所示
FTL.Message(
id=FTL.Identifier(
name="msg",
),
value=FTL.Pattern(
elements=[
FTL.TextElement(
value="A string",
),
],
),
)
迁移现有的旧版翻译时,您将用COPY(legacy_path, "old_id")
或我们将在下一部分中详细介绍的其变体之一替换FTL.TextElement
。迁移现有的 Fluent 翻译时,FTL.Pattern
将替换为COPY_PATTERN(old_path, "old-id")
。