Weblate 中 Fluent 单语格式支持与质量检查配置完整指南
后端开发工具【免费下载链接】weblateWeb based localization tool with tight version control integration.项目地址https://gitcode.com/gh_mirrors/we/weblate点击查看免费下载Fluent 是 Mozilla 主导的面向现代本地化的单语文本格式它强调非对称本地化——一种语言中的简单字符串可以映射为另一种语言中的复杂多形态翻译。Weblate 自 4.8 版本起引入对 Fluent 的原生支持fluent格式文件扩展名.ftl并在 5.0 版本中由 Henry Wilkes 贡献了一整套专门的语法与语义质量检查参见 v5 变更日志。本文以 Fluent 格式文档 为主体结合 格式注册实现、Fluent 检查模块 与对应测试完整说明 Fluent 在 Weblate 中的格式特性、组件配置方式、底层实现原理以及六项专属质量检查的启用与行为帮助你直接在 Weblate 中落地 Fluent 本地化工作流。Fluent 格式与非对称本地化Fluent 是一种单语monolingual文本格式每个翻译文件只包含一种语言的内容字符串以key value形式存在键key与值value同处一个文件而非像 gettext 那样把源语言和目标语言放在同一文件中。其核心设计是支持非对称本地化——源语言中的一个简单字符串在目标语言中可能映射为一个包含多种形态、选择表达式Select Expression甚至多个属性的复杂翻译。这种不对称性对翻译管理系统提出了特殊要求它不仅要保存译文还要保留 Fluent 特有的结构值、属性、引用、选择分支这正是 Weblate 对 Fluent 提供专属检查的原因。在 Weblate 中Fluent 由FluentFormat类注册实现其关键元数据见 ttkit.py属性值说明format_idfluentAPI / 界面中使用的格式标识nameFluent file组件配置中显示的名称loader(fluent, FluentFile)底层依赖 Translate Toolkit 的translate.storage.fluent.FluentFile解析器autoload*.ftl自动识别.ftl扩展名language_formatbcp语言代码使用 BCP 47 规范如cs-CZmimetypetext/x-fluent导出/下载时的 MIME 类型extensionftl标准文件扩展名empty_file_template新翻译文件以空模板创建monolingualTrue单语格式需要单独指定基础语言文件supports_descriptionsTrue支持为字符串添加说明description格式特性总览根据自动生成的格式特性片段 fluent-features.rstWeblate 对 Fluent 的支持能力如下特性支持情况文件扩展名.ftl语言类型单语Monolingual复数支持否Fluent 通过选择表达式实现复数不使用 Weblate 的复数机制描述Descriptions支持说明Explanation不支持上下文Context不支持键即上下文位置Location不支持标志Flags不支持API 标识fluent只读字符串不支持移除过时字符串不支持由该格式附加的检查标志fluent-source-syntax、fluent-target-syntax、fluent-parts、fluent-references、fluent-source-inner-html、fluent-target-inner-html、ignore-xml-tags、ignore-xml-invalid其中最后两项目ignore-xml-tags与ignore-xml-invalid是自动附加的——由于 Fluent 消息的值常被直接当作 HTML 的innerHTML使用通用 XML 检查会产生大量误报因此由 Fluent 专属的fluent-*-inner-html检查取代同时显式忽略 XML 类检查参见 FluentFormat.check_flags 定义。在 Weblate 中配置 Fluent 组件在创建或编辑组件时按以下配置即可启用 Fluent 翻译表格源自 Fluent 格式文档组件字段推荐值文件掩码File masklocales/*/messages.ftl单语基础语言文件Monolingual base language filelocales/en/messages.ftl新翻译模板Template for new translations空Empty文件格式File formatFluent file要点说明文件掩码使用通配符覆盖各语言目录例如locales/*/messages.ftl会匹配locales/cs/messages.ftl、locales/de/messages.ftl等。对应的测试断言EXPECTED_PATH locales/cs-CZ/messages.ftl见 FluentFormatTest印证语言目录使用 BCP 47 语言代码。基础语言文件Fluent 是单语格式必须指定基础语言文件通常为英文Weblate 以其中的键集合作为翻译源。新翻译模板为空新建语言时直接创建空文件而非复制基础语言文件。语言代码language_format bcp意味着语言目录名采用 BCP 47 规范。示例文件解析文档引用的示例文件 weblate/trans/tests/data/cs.ftl 展示了 Fluent 消息的基本形态hello Ahoj světe!\n orangutan Orangutan má %d banán.\n try Zkus Weblate na https://demo.weblate.org/!\n thanks Děkujeme za použití Weblate.可观察到的要点每个条目以键开头如hello等号右侧是值值内可以包含转义序列\n、引号、格式化占位符%d、HTML 内容等这些都属于合法的 Fluent 文本该文件共 4 条消息测试断言COUNT 4、FIND_CONTEXT hello且查找值Ahoj světe!\\n见 FluentFormatTest。此外FLuentFormatTest中NEW_UNIT_MATCH b\nkey Source string验证了新增单元翻译条目时的序列化输出格式为key Source string。底层实现格式加载与写入Weblate 对 Fluent 的支持建立在 Translate Toolkit 的FluentFile之上由FluentFormat继承TTKitFormat桥接。核心实现细节写入时的语法自校验FluentUnit.set_target()见 ttkit.py在写入译文时做了额外的安全处理先保存旧的目标与源值写入新目标值调用self.unit.to_entry()触发序列化从而提前发现任何 Fluent 语法问题一旦序列化抛出异常立即回滚旧内容并重新抛出异常。也就是说翻译者在 Weblate 界面中保存不合法的 Fluent 语法时写入会被拒绝并回滚而不是把损坏的语法写入仓库。底层抛出的FluentContentError在 translation.py 中被识别并作为已处理异常记录仅记录日志不当作崩溃级错误上报对应测试见 test_models.py 中 test_commit_retry_unit_fluent_content_error_uses_handled_logging。键编辑支持与限制从 source_edit.py 看fluent被列入KEY_FORMATS键格式集合意味着在单语模式下允许就地编辑键context/source。但 edit_identity() 明确限制带属性attributes或选择器selectors的 Fluent 消息不允许编辑否则抛出ValidationError(Editing Fluent messages with attributes or selectors is not supported.)。这与 Fluent 复杂消息的内部结构有关——这类消息一旦改变键其嵌套结构难以安全重构。对应测试见 test_source_edit.py 的 test_complex_fluent_edit_rejected。fluent-type 标志FluentUnit.flagsttkit.py会为每个单元附加fluent-type标志取值为Message或Term。fluent-type在 flags.py 中注册为带类型的标志TYPED_FLAGS用于下游检查区分消息与术语。测试断言默认导出标志为fluent-type:Message见 FluentFormatTest。Fluent 专属质量检查默认关闭需手动启用Weblate 5.0 起为 Fluent 提供 6 项专属检查全部默认禁用default_disabled True需在组件的质量检查设置中手动启用。它们注册于 checks/defaults.py实现在 weblate/checks/fluent/ 目录下完整测试见 test_fluent_checks.py约 2900 行覆盖 6 项检查。1. Fluent 源语法检查fluent-source-syntax实现在 syntax.py属于源字符串检查。它使用FluentUnitConverter将源字符串构造成 Fluent 单元并解析若出现语法错误则报错错误信息形如Fluent syntax error: {error}.。测试用例显示大量合法语法不会误报包括普通文本、emoji、test [string]、] test string、test string、含未闭合 HTML 标签的文本test p string、引用{ message }、{ $variable }、函数调用{ FUNCTION($n, val1: hello) }、字面量{ [ }、{ 3 }、转义字符与 Unicode 转义\u27BD、\U01F700、选择表达式{ $var - *[other] ok }等见 test_syntax_ok。2. Fluent 译文语法检查fluent-target-syntax实现在 syntax.py属于译文检查行为与源语法检查一致只是作用在译文上。3. Fluent 部件检查fluent-parts实现在 parts.py。Fluent 消息由多个部件组成一个可选值value消息正文与若干属性attributes。例如# 值 两个属性 This is the Message value .title This is the title attribute .alt This is the alt attribute该检查确保译文与源在部件上一一对应源消息有值则译文必须有值源没有值则译文也不可有源用到的属性译文必须全部出现且不得添加额外属性。该检查不应用于 Term术语——术语永远有值且术语的属性通常与语言相关如语法规则不必在每个翻译中出现。4. Fluent 引用检查fluent-references实现在 references.py。Fluent 消息可以引用其他消息、术语、属性或变量例如Here is a { message }, a { message.attribute } a { -term } and a { $variable }. Within a function { NUMBER($num, minimumFractionDigits: 2) }该检查要求译文使用与源相同集合、相同次数的引用不允许新增或遗漏对消息还会逐一比对每个属性内部的引用。针对选择表达式有专门规则源中的每个变体variant必须在译文中找到引用集合相同的对应变体若变量引用同时出现在选择器的选择器与某个变体内部则其他变体也被视为隐含包含该引用如{ $num - [one] an apple *[other] { $num } apples }中的[one]变体被视为也引用$num仅出现在选择器中的引用通常是术语属性如-term.starts-with-vowel不计入必需引用因为它们不构成最终可见文本且选择表达式的存在本身是语言相关的。5/6. Fluent 源/译文 innerHTML 检查fluent-source-inner-html / fluent-target-inner-html实现在 inner_html.py。Fluent 的值常被直接用作 HTML 元素的innerHTML例如 Fluent DOM 包的使用方式。该检查模拟 HTML5 合规解析器对值进行解析专门捕捉会导致字符串意外丢失的情况——例如误打开未闭合的标签、插入字符引用同时验证有意书写 HTML 时的良好实践闭合标签匹配、字符引用合法、属性值加引号。注意该检查仅作用于消息或术语的值value不作用于属性——属性在 Fluent 中往往是 HTML 属性值可包含任意字符串术语属性则多为语言特性仅在选择器中使用见 inner_html.py 的类文档。以上检查共享同一套基础设施FluentUnitConverterutils.py它依据fluent-type标志判断是 Message 还是 Term标志缺失时按键是否以-开头猜测Fluent 术语的键约定以-开头将翻译单元转换为FluentUnit后进行解析并提供语法错误与部件、引用提取能力。与其他格式的差异与注意事项复数处理Fluent 格式本身不支持 Weblate 的复数机制复数逻辑在 Fluent 内通过选择表达式完成因此supports_plural False。单语配置与 JSON、YAML 等单语格式一样Fluent 组件必须配置单语基础语言文件否则无法确定需要翻译的键集合。键识别变更v4 变更日志提示 Fluent 格式曾调整部分字符串的识别方式升级后可能需要重新核对字符串状态见 docs/changes/v4.rst而 5.0 带来的语法检查改进则在 v5 变更日志 中有记录。启用检查6 项 Fluent 专属检查默认关闭建议在启用 Fluent 组件后于项目/组件质量检查页面打开fluent-source-syntax、fluent-target-syntax与fluent-parts以保证仓库内语法与结构的一致性fluent-*-inner-html仅在消息值确会被当作 HTML 渲染时启用避免对纯文本项目产生不必要干扰。小结Fluent 的单语、非对称特性决定了它不能按传统双语格式处理。Weblate 通过FluentFormat桥接 Translate Toolkit 完成解析与序列化在写入时自校验语法防止损坏文件入库并配套 6 项针对 Fluent 语义的专属质量检查语法、部件、引用、innerHTML覆盖了 Fluent 本地化中最容易出错的环节。按照本文给出的locales/*/messages.ftl 基础语言文件配置即可在 Weblate 中构建一套语法安全、结构可控的 Fluent 翻译流水线如需进一步了解 Fluent 语法本身可参阅 docs/formats/fluent.rst 中指向的 Project Fluent 官方文档链接。赞分享后端开发工具【免费下载链接】weblateWeb based localization tool with tight version control integration.项目地址https://gitcode.com/gh_mirrors/we/weblate点击查看免费下载相关推荐Weblate Flat XML 文件格式深度指南单语 XML 翻译支持与自定义标签配置Weblate Flat XML 文件格式深度指南单语 XML 翻译支持与自定义标签配置 导读 本文聚焦 Weblate 对 Flat XML扁平 XML后端开发工具Weblate 对 PHP strings 文件格式的完整支持指南特性清单、单语工作流与源码实现Weblate 对 PHP strings 文件格式的完整支持指南特性清单、单语工作流与源码实现 PHP stringsPHP 字符串数组是 PHP 项目后端开发工具palera1n iOS 越狱工具A8-A11 从编译到 rootless 上手的完整路径palera1n iOS 越狱工具A8 A11 从编译到 rootless 上手的完整路径 palera1n 是一个基于 checkm8 BootROM 漏洞后端开发工具上一篇WAMR原生API导出终极指南3步实现C/C函数与WASM模块的无缝交互下一篇Blender MCP 插件手把手教程怎么装、怎么配、连不上怎么查创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kun 房间审批机制与私聊权限模式:从确认卡片到沙箱确认窗口的完整安全链路

Kun 房间审批机制与私聊权限模式:从确认卡片到沙箱确认窗口的完整安全链路

人工智能AI Agent自主智能体桌面应用MCP Clients 【免费下载链接】Kun Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI. 项目地址: https://gitcode.com/gh_mirrors/de/Kun 点击查…

2026/10/10 5:24:33 阅读更多 →
go-plugin 入门实战:运行 HashiCorp go-plugin 的 Basic 示例(RPC 插件系统基础流程)

go-plugin 入门实战:运行 HashiCorp go-plugin 的 Basic 示例(RPC 插件系统基础流程)

后端 【免费下载链接】go-plugin Golang plugin system over RPC. 项目地址: https://gitcode.com/gh_mirrors/go/go-plugin 点击查看 免费下载 本指南以 go-plugin 仓库中 examples/basic 示例 为骨架,完整讲解一个基于 net/rpc 的最简插件系统的编译、…

2026/10/10 5:24:33 阅读更多 →
Lingui 自定义消息目录格式器:在 js-lingui 中编写 Custom Formatter 的完整实践

Lingui 自定义消息目录格式器:在 js-lingui 中编写 Custom Formatter 的完整实践

开发工具前端 【免费下载链接】js-lingui 🌍 📖 A readable, automated, and optimized (2 kb) internationalization for JavaScript 项目地址: https://gitcode.com/gh_mirrors/js/js-lingui 点击查看 免费下载 本文基于 js-lingui 官方指…

2026/10/10 5:23:33 阅读更多 →

最新新闻

Neovim在Windows上的轻量级配置指南:从Vim迁移到现代编辑器

Neovim在Windows上的轻量级配置指南:从Vim迁移到现代编辑器

说实话,在Windows上认真折腾Vim这件事,我以前是拒绝的。绝大多数人对Windows版Vim的印象还停留在"命令行里那个古老的文本编辑器",启动慢、配置繁琐、剪贴板不通、中文乱码,随便一条都够劝退的。直到Neovim出现&#xf…

2026/10/10 6:45:03 阅读更多 →
PE结构对齐机制详解:文件对齐、内存对齐与RVA/FOA转换

PE结构对齐机制详解:文件对齐、内存对齐与RVA/FOA转换

1. PE结构学习路上,绕不开的“对齐”概念接触PE结构有一段时间的兄弟应该都有体会:头两三天看DOS头、NT头、节表还挺顺利,一到“对齐”这个概念就开始犯迷糊。文件对齐、磁盘对齐、内存对齐、FileAlignment、SectionAlignment……一堆名词砸过…

2026/10/10 6:45:03 阅读更多 →
TLS 1.3 性能优化实战:降低握手延迟与高并发建连开销

TLS 1.3 性能优化实战:降低握手延迟与高并发建连开销

接手过一个让我印象很深的优化任务:线上接口 P95 延迟卡在 800ms 左右,数据库、业务逻辑、序列化都排查了一个遍,最后用抓包工具一看,好家伙,TLS 握手一次就要占掉 200 多毫秒。高并发下连接复用率稍微一波动&#xff…

2026/10/10 6:45:03 阅读更多 →
Web3.0与开源深度融合:COSCon‘25议程背后的创新路径与开发者机遇

Web3.0与开源深度融合:COSCon‘25议程背后的创新路径与开发者机遇

COSCon‘25的Web3.0开源论坛议程正式发布了。看到这份议程的第一眼,我挺意外的——不是因为它阵容有多大,而是因为它把“Web3.0”和“开源”这两个词真正焊在了一起。过去几年,我参加过不少自称“去中心化生态”的会议,要么是通篇…

2026/10/10 6:45:02 阅读更多 →
Claude Code 配置切换工具 CC Switch:自定义模型接入与多档案管理实战

Claude Code 配置切换工具 CC Switch:自定义模型接入与多档案管理实战

1. 为什么我们需要一个配置切换工具1.1 从一次痛苦的配置修改说起如果你日常使用 Claude Code 作为终端里的主力编程助手,大概率遇到过这样的场景:手头同时维护着两三个不同来源的模型服务,一个是官方默认通道,一个是团队内部自建…

2026/10/10 6:45:02 阅读更多 →
AI写作工具赋能工科生:把图表数据自动转化为技术文档

AI写作工具赋能工科生:把图表数据自动转化为技术文档

2. 技术文档写作的痛点,恰恰是工科生的机会点工科生写技术文档,大概是所有写作场景里最“反人性”的一种。上学时写实验报告、课程设计说明书,工作后写项目方案、测试报告、专利交底书、论文初稿,每一类都需要把实验数据、仿真曲线…

2026/10/10 6:44:02 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →