_locales 文件夹,并校验每个声明的 locale 都有一份 messages.json。它会把 locale JSON 资源输出到针对每个浏览器的构建产物中。在开发期,它会捕获任意 locale 文件的编辑,而无需完全重启。
模板示例
action-locales

_locales 支持来查看本地化的扩展元数据与 UI 字符串。
Locale 能力
期望的目录结构
manifest.json 中的 default_locale 应当映射到一个存在的 _locales/<default>/messages.json。
传统布局:_locales 放在 manifest 旁边
即使你的 manifest 位于 src/ 之类的子文件夹中,项目根目录仍然是 _locales 的规范位置。放在嵌套 manifest 旁边的 _locales 文件夹依然能构建。编译器会输出一条 LocalesLayoutWarning,要求你把它移到根目录。浏览器从扩展根目录读取 locale,所以放在根目录与最终发布的产物一致。
manifest.json 中的 locales 声明示例
下面演示了如何在 manifest.json 中声明 locales:
_locales 文件夹中为每个 locale 包含 JSON 文件:
messages.json 文件示例
用于翻译的 messages.json 文件示例:
输出路径
Extension.js 会把 locale JSON 文件输出到:开发期行为
- Extension.js 会把 locale JSON 文件加入编译依赖并监视它们。
- Locale 变更会触发扩展的重载行为(硬重载),而不是组件式的热模块替换(HMR)。
- 当必需的 locale 文件缺失或无效时,Extension.js 会以可操作的诊断信息让校验失败。
校验行为
Extension.js 会校验:- 存在
_locales文件夹但 manifest 中没有default_locale会让构建失败,因为浏览器会拒绝这种组合 _locales/<default>及其messages.json是否存在- 每个 locale 的
messages.json的 JSON 合法性 - manifest 中的
__MSG_*__引用是否与默认 locale 的键匹配
__MSG_*__ 扫描有两个细节:
- 预定义的
@@消息,例如__MSG_@@ui_locale__,是豁免的,因为它们由浏览器提供。 - 消息键内部允许出现
@字符,这与 Chrome 对消息名的语法一致。
排查缺失的 locale 键
如果 manifest 使用了__MSG_extension_description__,请确保默认 locale 文件包含 extension_description:
打包行为
当你使用--zip 或 --zip-source 构建时,Extension.js 会在打包时再次检查默认 locale。声明了 default_locale 却没有对应 messages.json 的 manifest 会产生一条警告,因为应用商店会拒绝缺少默认 locale 的包。
zip 文件名来自 manifest 中的 name。__MSG_*__ 形式的 name 会依据默认 locale 的 messages.json 解析,因此归档文件带的是翻译后的名字,而不是占位符。
最佳实践
- 保持
messages.json的键在各 locale 之间一致。 - 先更新默认 locale,然后再把键扩散到其他 locale。
- 在持续集成(CI)中校验 locale JSON,在打包前发现损坏的文件。
- 把
_locales放在项目根目录,这也是浏览器和打包步骤读取的位置。
下一步
- 在 dev 更新行为 中了解更新结果。
- 继续阅读 开发中的 JSON。
- 进一步了解 manifest 开发行为。

