Fluent 到 Fluent 的迁移

在迁移现有的 Fluent 消息时,可以使用 COPY_PATTERN 直接复制源代码,或者通过扩展 TransformPattern 访问者类来应用字符串替换和其他更改。

这些转换适用于单个 Fluent 模式,即 Fluent 消息的主体或其属性之一。

复制 Fluent 模式

例如,考虑一个修改现有消息以将原始值移动到 alt 属性的补丁。

原始消息

about-logins-icon = Warning icon
    .title = Breached website

新消息

about-logins-breach-icon =
    .alt = Warning icon
    .title = Breached website

这种类型的更改需要一个新的消息标识符,这反过来会导致现有翻译丢失。可以使用以下方法迁移现有的翻译内容:

from fluent.migrate import COPY_PATTERN

ctx.add_transforms(
    "browser/browser/aboutLogins.ftl",
    "browser/browser/aboutLogins.ftl",
    transforms_from(
"""
about-logins-breach-icon =
    .alt = {COPY_PATTERN(from_path, "about-logins-icon")}
    .title = {COPY_PATTERN(from_path, "about-logins-icon.title")}
""",from_path="browser/browser/aboutLogins.ftl"),
)

在此特定情况下,目标文件和源文件相同。点表示法用于访问属性:about-logins-icon.title 匹配具有标识符 about-logins-icon 的消息的 title 属性,而仅使用 about-logins-icon 则匹配消息的值。

警告

COPY_PATTERNTransformPattern 的第二个参数标识一个模式,因此使用消息标识符不会将整个消息(及其所有属性)迁移,而只会迁移其值。

转换 Fluent 模式

要对 Fluent 消息应用更改,可以扩展 TransformPattern 类以创建转换。这是一个功能强大的通用工具,COPY_PATTERN 是最简单的扩展,它不对源代码应用任何转换。

例如,考虑一个复制现有消息以去除其 HTML 内容以用作 ARIA 值的补丁。

原始消息

videocontrols-label =
    { $position }<span data-l10n-name="duration"> / { $duration }</span>

新消息

videocontrols-scrubber =
    .aria-valuetext = { $position } / { $duration }

可以使用以下方法应用迁移以创建此新消息:

from fluent.migrate.transforms import TransformPattern
import fluent.syntax.ast as FTL

class STRIP_SPAN(TransformPattern):
    def visit_TextElement(self, node):
        node.value = re.sub("</?span[^>]*>", "", node.value)
        return node

def migrate(ctx):
    path = "toolkit/toolkit/global/videocontrols.ftl"
    ctx.add_transforms(
        path,
        path,
        [
            FTL.Message(
                id=FTL.Identifier("videocontrols-scrubber"),
                attributes=[
                    FTL.Attribute(
                        id=FTL.Identifier("aria-valuetext"),
                        value=STRIP_SPAN(path, "videocontrols-label"),
                    ),
                ],
            ),
        ],
    )

请注意,transforms_from 实用程序不支持 STRIP_SPAN 等自定义扩展,因此需要显式定义转换列表。

在内部,TransformPattern 扩展了 fluent.syntax Transformer,后者定义了此处使用的 FTL AST。作为一项特定的便利,模式元素访问者(例如 visit_TextElement)允许返回 FTL.Pattern 以用多个节点替换自身。