迁移方案及其生命周期

实际迁移是通过运行称为**迁移方案**的 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.MessageTerm的实例,它们的内容可以依赖于现有的翻译源。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")