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_PATTERN
和 TransformPattern
的第二个参数标识一个模式,因此使用消息标识符不会将整个消息(及其所有属性)迁移,而只会迁移其值。
转换 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
以用多个节点替换自身。