附加组件

附加组件提供了自定义和自动化翻译工作流程的方法。管理员可以从每个相应翻译项目或部件的 操作附加组件 菜单添加和管理附加组件。也可以在 管理界面 中进行全站范围的附加组件安装。

提示

您也可以使用 APIDEFAULT_ADDONSinstall_addon 来配置附加组件。

可从附加组件管理或用 API 运行默认启用手动触发的附加组件。结果记录于附加组件活动日志中。

../_images/addons.webp

触发附加组件的事件

附加组件安装

当附加组件被安装时触发。

部件更新

每当下列部件中发生更改时被触发:

  • 仓库中字符串被改变。

  • 添加了字符串。

  • 添加了新翻译。

每天

每日触发,但附加组件通常根据 BACKGROUND_TASKS 设置在部件间分割每天的载荷。

事件变化

更改事件创建后触发。

手动触发

Triggered when an add-on is run manually from add-on management or the API.

添加并提交新翻译

新翻译被添加和提交后即刻触发。

提交更改后

提交更改后即刻触发。

推送仓库到上游后

仓库被推送到上游后即刻触发。

仓库删除后

删除翻译后立即触发。

拉取新更改

每当新更改从上游被拉取后触发。

提交更改前

提交更改前触发。

推送仓库到上游前

在仓库被推送到上游之前。

尝试更新仓库

尝试更新仓库前触发。

保存字符串

字符串被保存后即刻触发。

Unit post-sync

字符串与 VCS 同步后触发。

保存新创建字符串

新建字符串被保存后即刻触发。

内置附加组件

自动翻译

附加组件 ID:

weblate.autotranslate.autotranslate

配置:

mode

自动翻译模式

可用选项:

suggest

添加为建议

translate

添加为译文

fuzzy

添加为“需要编辑”

q

查询

请注意,翻译所有字符串将丢弃所有现有的译文。

auto_source

自动翻译的来源

可用选项:

others

其他翻译部件

mt

机器翻译

component

部件

输入要用作来源的部件的标识符,留空则使用当前项目中的所有部件。

engines

机器翻译引擎

机器翻译引擎

threshold

匹配分数阈值

触发器:

附加组件安装, 部件更新, 每天, 事件变化

使用机器翻译或其他部件自动翻译字符串。

JavaScript 本地化 CDN

Added in version 4.2.

附加组件 ID:

weblate.cdn.cdnjs

配置:

threshold

译文阈值

已翻译字符串的百分比必须达到多少才能让一种语言的翻译被包括进来。

css_selector

CSS 选择器

检测可本地化元素的 CSS 选择器。

cookie_name

语言 Cookie 名称

存储语言偏好的 Cookie 的名称。

files

从 HTML 文件中提取字符串

当前仓库或远程 URL 中要解析可翻译字符串的文件名列表。

触发器:

附加组件安装, 每天, 提交更改后, 拉取新更改

将译文发布到 JavaScript 或 HTML 本地化中使用的内容分发网络。

可以用于本地化静态 HTML 网页,或者在 JavaScript 代码中加载本地化文件。

为你的部件生成一个唯一的 URL,你可以将其包含在 HTML 页面中以本地化它们。详情见 使用 Weblate CDN 翻译 HTML 和 JavaScript

备注

此附加组件需在 Weblate 服务器上进行附加配置。LOCALIZE_CDN_PATH 配置生成的文件(在文件系统中)的写入位置,LOCALIZE_CDN_URL 定义从何处提供这些文件(URL)。Weblate 本身不提供这些文件,你必须设置外部源(通常使用 CDN 服务)。

此附加组件在 Hosted Weblate 上配置并通过 https://weblate-cdn.com/ 提供文件。

移除空白字符串

Added in version 4.4.

附加组件 ID:

weblate.cleanup.blank

配置:

此附加组件无配置。

触发器:

附加组件安装, 提交更改后, 拉取新更改

从翻译文件中删除没有译文的字符串。

使用此方法可以使翻译文件中不存在任何空字符串(例如,如果您的本地化库将它们显示为缺失,而不是退回到源字符串)。

清理翻译文件

附加组件 ID:

weblate.cleanup.generic

配置:

此附加组件无配置。

触发器:

附加组件安装, 拉取新更改, 提交更改前

更新所有翻译文件以匹配单语言译文模版文件。对于大多数文件格式来说,这意味着移除译文模版文件中不再出现的旧翻译条目。

对于包含翻译字符串外的其他内容格式(如 HTML 文件Windows RC 文件OpenDocument 格式),这也会使翻译文件与基文件同步。

添加缺少的语言

附加组件 ID:

weblate.consistency.languages

配置:

此附加组件无配置。

触发器:

附加组件安装, 每天, 添加并提交新翻译

确保对一个项目内所有部件使用一致的一组语言。

备注

不考虑分享自其他项目的部件。

每隔 24 小时,和在 Weblate 中加入新语言时,会检查一次缺失的语言。

不像其他多数附加组件,这个附加组件影响整个项目。

提示

自动翻译 自动翻译新添加的字符串。

部件发现

附加组件 ID:

weblate.discovery.discovery

配置:

match

用于匹配翻译文件的正则表达式

正则表达式必须定义部件和语言的命名群组。

file_format

文件格式

文件格式

name_template

自定义部件名称

使用 Django 模板语法。此模板必须包含 {{ component }}。

base_file_template

指定单语种译文模版文件名

双语翻译文件请留空。设置后,此模板必须包括 {{ component }}。

new_base_template

为新的翻译条目指定翻译模版文件

请指定模板文件,新语言的翻译文档将会套用该模板。对于 gettext 格式,请选择 .pot 文件。此模板必须包含 {{ component }}。

intermediate_template

中间语言文件

中间翻译文件的文件名。在大多数情况下,这是开发者提供的翻译文件,用于创建实际的源字符串。此模板必须包含 {{ component }}。

language_regex

语言筛选

扫描文件掩码时用于筛选翻译文件的正则表达式。

copy_addons

将主部件的附加组件克隆到新创建的部件

remove

删除不存在文件的部件

触发器:

附加组件安装, 拉取新更改

根据版本控制系统中文件更改的情况来自动添加或删除项目部件。

此匹配使用允许复杂配置的正则表达式完成,但需要知晓一些正则表达式的知识。匹配翻译文件的正则表达式必须包含两个命名组以匹配部件和语言,所有正则表达式的命名组均可用作模板字段中的变量。

“发现”要求

To discover a component successfully, the configuration has to do all of the following:

  • The regular expression must define component and language named groups.

  • Template fields used to name or locate per-component files must include {{ component }}, so the rendered value actually changes for each discovered component.

  • For monolingual formats, the component must contain a file matching base_file_template and at least one translation file matching match.

Worked example: news_<lang>.md

This is a common filename-based language variant layout:

  • docs/news_en.md

  • docs/news_cs.md

  • docs/guide_en.md

Use the Filename-based language variants preset for a starting point, then choose the matching file format and review the populated values.

正则表达式:

(?:(?P<path>.*/))?(?P<component>.+?)_(?P<language>[A-Za-z]{2,3}(?:[_-][A-Za-z0-9]+)*)\.(?P<extension>[^/.]+)

部件名称:

{{ component }}

发现的文件掩码:
  • docs/news_*.md

  • docs/guide_*.md

In this example, {{ component }} resolves to the basename before the language suffix, so docs/news_en.md, docs/news_pt_BR.md, and docs/news_pt-BR.md all become the news component.

您可以在所有文件名字段中使用 Django 模板标记,例如:

{{ component }}

解析自 component 匹配组的部件名

{{ component|title }}

首字母大写的部件文件名

{{ path }}: {{ component }}

来自正则表达式的自定义匹配群

点击 保存 后,将显示匹配部件的预览,您可以从中检查配置是否真正符合您的需求:

../_images/addon-discovery.webp

部件发现示例

The worked example above covers the most common filename-based variant layout. The following examples show other repository structures you can match.

每种语言一个文件夹

每种语言各使用一个文件夹并在其中包含相应部件的翻译文件。

正则表达式:

(?P<language>[^/.]*)/(?P<component>[^/]*)\.po

匹配文件:
  • cs/application.po

  • cs/website.po

  • de/application.po

  • de/website.po

Gettext 语言环境布局

存储 gettext PO 文件时使用常用结构。

正则表达式:

locale/(?P<language>[^/.]*)/LC_MESSAGES/(?P<component>[^/]*)\.po

匹配文件:
  • locale/cs/LC_MESSAGES/application.po

  • locale/cs/LC_MESSAGES/website.po

  • locale/de/LC_MESSAGES/application.po

  • locale/de/LC_MESSAGES/website.po

复杂文件名

同时在文件名处使用部件名和语言名。

正则表达式:

src/locale/(?P<component>[^/]*)\.(?P<language>[^/.]*)\.po

匹配文件:
  • src/locale/application.cs.po

  • src/locale/website.cs.po

  • src/locale/application.de.po

  • src/locale/website.de.po

重复的语言码

在路径和文件名中使用的语言名称。

正则表达式:

locale/(?P<language>[^/.]*)/(?P<component>[^/]*)/(?P=language)\.po

匹配文件:
  • locale/cs/application/cs.po

  • locale/cs/website/cs.po

  • locale/de/application/de.po

  • locale/de/website/de.po

分开的 Android 字符串

Android 资源字符串,分成几个文件。

正则表达式:

res/values-(?P<language>[^/.]*)/strings-(?P<component>[^/]*)\.xml

匹配文件:
  • res/values-cs/strings-about.xml

  • res/values-cs/strings-help.xml

  • res/values-de/strings-about.xml

  • res/values-de/strings-help.xml

匹配多个路径

有 Java 属性翻译的多模块 Maven 项目。

正则表达式:

(?P<originalHierarchy>.+/)(?P<component>[^/]*)/src/main/resources/ApplicationResources_(?P<language>[^/.]*)\.properties

部件名称:

{{ originalHierarchy }}: {{ component }}

匹配文件:
  • parent/module1/submodule/src/main/resources/ApplicationResources_fr.properties

  • parent/module1/submodule/src/main/resources/ApplicationResource_es.properties

  • parent/module2/src/main/resources/ApplicationResource_de.properties

  • parent/module2/src/main/resources/ApplicationResource_ro.properties

提示

部件发现附加组件使用 Weblate 内部网址。这是在多个部件之间共享版本控制系统设置的便捷方式。链接的部件使用主部件的本地仓库,其设置方法是将 weblate://project/main-component 填入各部件的 源代码仓库 字段(在 操作设置版本控制系统)。这也节省了配置和系统资源的时间。

提示

添加缺少的语言 确保新部件包含完整的可翻译语言集。

Fedora Messaging

Added in version 5.15.

附加组件 ID:

weblate.fedora_messaging.publish

配置:

events

更改事件

更改事件

amqp_host

AMQP 代理主机

要连接的 AMQP 代理.

amqp_ssl

对 AMQP 连接使用 SSL

ca_cert

CA 证书

PEM 编码的 CA 证书捆绑包,用于验证服务器呈现的证书。

client_key

客户端 SSL 密钥

PEM 编码的客户端私有 SSL 密钥。

client_cert

客户端 SSL 证书

PEM 编码的客户端 SSL 证书。

触发器:

事件变化

发送通知到兼容 Fedora Messaging 的 AMQP 交换。

Fedora Messaging 是基于 AMQP 的发布者,用于处理 Weblate 中发生的所有更改。您可以使用它来挂钩 Weblate 中发生的更改的附加服务。

消息标题

所有消息均有标题 weblate.<action>.<project>.<component>.<translation>。操作是含下划线而非空格的操作文本表示,例如 resource_update,所有其他部分都是可选的,代表对象标识串或语言代码。

消息正文

正文由下列字段组成(假定事件中有这些字段):

change_id

更改的数字 ID

action

更改的冗长名称。

timestamp

ISO 格式的时间戳

target

更改的新值(如字符串的新翻译)

old

更改的旧值(如字符串之前额翻译)

source

源字符串.

url

查看相关对象的绝对 URL。

author

作者的用户名(进行接受建议等操作时,可以不同于用户名)

user

临时用户名

project

项目标识串

component

部件标识串

translation

翻译语言代码

消息标头

有几个额外字段也可用于路由:

action

更改的冗长名称。

project

项目标识串

component

部件标识串

示例消息

仓库合并事件:

{
  "id": 1,
  "action": "Merged repository",
  "timestamp": "2017-06-15T11:30:47.325000+00:00",
  "url": "http://example.com/projects/test/test/",
  "component": "test"
}

新源字符串事件:

{
  "id": 2,
  "action": "New source string",
  "timestamp": "2017-06-15T11:30:47.372000+00:00",
  "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e",
  "component": "test",
  "translation": "cs",
  "source": ["Hello, world!\n"]
}

资源更新事件:

{
  "id": 6,
  "action": "Resource update",
  "timestamp": "2017-06-15T11:30:47.410000+00:00",
  "url": "http://example.com/projects/test/test/cs/",
  "project": "test",
  "component": "test",
  "translation": "cs"
}
{
  "id": 7,
  "action": "Resource update",
  "timestamp": "2017-06-15T11:30:47.510000+00:00",
  "url": "http://example.com/projects/test/test/de/",
  "project": "test",
  "component": "test",
  "translation": "de"
}
{
  "id": 8,
  "action": "Resource update",
  "timestamp": "2017-06-15T11:30:47.595000+00:00",
  "url": "http://example.com/projects/test/test/it/",
  "project": "test",
  "component": "test",
  "translation": "it"
}

项目删除事件:

{
  "id": 9,
  "action": "Removed project",
  "timestamp": "2019-10-17T15:57:08.559420+00:00",
  "target": "test",
  "user": "testuser"
}

新贡献者事件:

{
  "id": 11,
  "action": "New contributor",
  "timestamp": "2019-10-17T15:57:08.759960+00:00",
  "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e",
  "author": "testuser",
  "user": "testuser",
  "project": "test",
  "component": "test",
  "translation": "cs",
  "source": ["Hello, world!\n"]
}

新译文事件:

{
  "id": 12,
  "action": "New translation",
  "timestamp": "2019-10-17T15:57:08.772591+00:00",
  "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e",
  "target": ["Ahoj svete!\n"],
  "author": "testuser",
  "user": "testuser",
  "project": "test",
  "component": "test",
  "translation": "cs",
  "source": ["Hello, world!\n"]
}

批量编辑

附加组件 ID:

weblate.flags.bulk

配置:

q

查询

state

要设置的状态

可用选项:

-1

请勿更改

10

需要编辑

11

需要编辑(需要重写)

12

需要编辑(需要检查)

20

已翻译

30

已核准

add_flags

要添加的翻译标记

remove_flags

要删除的翻译标记

add_labels

要添加的标签

remove_labels

要删除的标签

触发器:

附加组件安装, 部件更新

批量编辑标记、标签或字符串状态。

示例:

自动给新字符串添加标签

搜索查询

NOT has:label

要添加的标签

近期

应用商店元数据文件 所有更新日志字符串标记为只读

搜索查询

language:en AND key:changelogs/

要添加的翻译标记

read-only

将特定字符串标记为只读

搜索查询

source:r"^\`\`[.a-zA-Z0-9_-]*\`\`$" AND language:en

要添加的翻译标记

read-only

将未更改的译文标记为“需要重写”

附加组件 ID:

weblate.flags.same_edit

配置:

此附加组件无配置。

触发器:

保存新创建字符串

每当从版本控制系统导入新的可翻译字符串并与源字符串匹配时,就会在 Weblate 中标记为需要重写。对于包含未翻译字符串的源字符串的文件格式尤其有用。

提示

您可能还想通过在 翻译标记 中添加 strict-same 标记来加强 未更改的译文 检查。

参见

翻译状态

将新的源字符串标记为“需要检查”

附加组件 ID:

weblate.flags.source_edit

配置:

此附加组件无配置。

触发器:

保存新创建字符串

每当一个新的源字符串从版本控制系统中导入时,它将在 Weblate 中被标记为需要检查。这样就可以简单地筛选并编辑开发者编写的源字符串。

参见

翻译状态

将新译文标记为“需要重写”

附加组件 ID:

weblate.flags.target_edit

配置:

此附加组件无配置。

触发器:

保存新创建字符串

每当一个新的可翻译字符串从版本控制系统中导入时,它将在 Weblate 中被标记为需要重写。这样就可以简单地筛选并编辑开发者创建的翻译。

参见

翻译状态

将仓库中更新的译文标记为“需要重写”

附加组件 ID:

weblate.flags.target_repo_update

配置:

此附加组件无配置。

触发器:

Unit post-sync

每当一个字符串翻译在版本控制系统中被更改后,它会在 Weblate 中被标记为需要重写。如果翻译文件经常被手动更新或由外部服务更新,此功能尤其有用。

参见

翻译状态

用原文填充只读字符串

Added in version 4.18.

附加组件 ID:

weblate.generate.fill_read_only

配置:

此附加组件无配置。

触发器:

附加组件安装, 部件更新, 每天

将源字符串内容用作只读字符串的译文。

统计数据生成器

附加组件 ID:

weblate.generate.generate

配置:

filename

所生成文件的名称

template

所生成文件的内容

触发器:

附加组件安装, 提交更改前

生成一个包含关于翻译状态详细信息的文件。

你可以在文件名和内容中使用 Django 模板,详细的标记说明请参见 模板标记

例如为每个翻译生成一个摘要文件:

所生成文件的名称

locale/{{ language_code }}.json

内容
{
   "language": "{{ language_code }}",
   "strings": "{{ stats.all }}",
   "translated": "{{ stats.translated }}",
   "last_changed": "{{ stats.last_changed }}",
   "last_author": "{{ stats.last_author }}",
}

参见

模板标记

用原文预填充译文

Added in version 4.11.

附加组件 ID:

weblate.generate.prefill

配置:

此附加组件无配置。

触发器:

附加组件安装, 部件更新, 每天

用源字符串填充翻译字符串。

部件中所有未翻译的字符串将被填充为源字符串,并被标记为需要编辑。当你的翻译文件中不能兼容空字符串时请使用这个功能。.. AUTOGENERATED START: weblate.generate.pseudolocale .. 此部分由 ./manage.py list_addons 自动生成。不要手动编辑。

假语言环境(Pseudolocale)生成

Added in version 4.5.

附加组件 ID:

weblate.generate.pseudolocale

配置:

source

源字符串

target

目标译文

此翻译中的所有字符串都将被覆盖

prefix

前置静态文本

var_prefix

前置变量文本

suffix

后置静态文本

var_suffix

后置变量文本

var_multiplier

变量文本乘数

根据源字符串的长度确定变量文本的重复次数。

include_readonly

包含只读字符串

触发器:

附加组件安装, 部件更新, 每天

通过向源字符串添加前缀和后缀自动生成翻译。

伪 locale 对于查找未准备好进行本地化的字符串很有用。这是通过修改所有可翻译的源字符串来实现的,使得在用伪 locale 语言运行应用程序时很容易发现未修改的字符串。

也可以查找其本地化对应项可能不适合布局的字符串。

使用可变部分可以寻找那些在本地化后可能不适合用户界面的字符串-它根据源字符串的长度来扩展文本。可变文本是以文本的长度乘以乘数来重复的。例如 Hello world 带可变文本 _ 和变量乘数1将变为 Hello world___________ - 即该可变文本对源字符串中的每个字符都重复一次。

将使用以下模式生成字符串:

前置静态文本 前置变量文本 源字符串 后置变量文本 后置静态文本

提示

可以使用真正的语言进行检测,但在 Weblate 中有专用的假语言环境——en_XAar_XB

提示

您可以使用此附加组件来开始翻译到现有语言或类似语言的新语言环境。将翻译添加到部件后,请遵循附加组件。示例:如果您有 fr 的翻译并想开始翻译 fr_CA,只需将 fr 设置为源,将 fr_CA 设置为目标,并将前缀和后缀留空。

一旦您有新的翻译填重,请卸载附加组件,以防止 Weblate 更改复制后的翻译。

在注释中添加贡献信息

附加组件 ID:

weblate.gettext.authors

配置:

此附加组件无配置。

触发器:

提交更改前

更新 PO 文件标头的注释部分,以包含贡献者名字和贡献年份。

PO 文件标头如下所示:

# Michal Čihař <michal@weblate.org>, 2012, 2018, 2019, 2020.
# Pavel Borecki <pavel@example.com>, 2018, 2019.
# Filip Hron <filip@example.com>, 2018, 2019.
# anonymous <noreply@weblate.org>, 2019.

更新“配置文件”中的 ALL_LINGUAS 变量

附加组件 ID:

weblate.gettext.configure

配置:

此附加组件无配置。

触发器:

附加组件安装, 每天, 添加并提交新翻译, 仓库删除后

当添加或删除译文时,更新“configure”、“configure.in”或“configure.ac”文件中的 ALL_LINGUAS 变量。

添加或删除翻译时,更新 configureconfigure.in 或任何 configure.ac 文件中的 ALL_LINGUAS 变量。

自定义 gettext 输出

Removed in version 5.13: 文件格式参数 替代。

更新 POT 文件(Django)

Added in version 5.17.

附加组件 ID:

weblate.gettext.django

配置:

interval

更新频率

刷新部件时附加组件更新 POT 文件的频率。

可用选项:

daily

每天

weekly

每周

monthly

每月

normalize_header

正常化 POT 标头

更新 gettext 标头并替换占位符 POT 注释。

触发器:

附加组件安装, 手动触发, 拉取新更改

用 Django 的内置 makemessages 命令更新 gettext 模板。

更新 LINGUAS 文件

附加组件 ID:

weblate.gettext.linguas

配置:

此附加组件无配置。

触发器:

附加组件安装, 每天, 添加并提交新翻译, 仓库删除后

添加或删除译文时更新 LINGUAS 文件。

更新 POT 文件(Meson)

Added in version 5.17.

附加组件 ID:

weblate.gettext.meson

配置:

interval

更新频率

刷新部件时附加组件更新 POT 文件的频率。

可用选项:

daily

每天

weekly

每周

monthly

每月

normalize_header

正常化 POT 标头

更新 gettext 标头并替换占位符 POT 注释。

comment_mode

代码注释

选择 xgettext 是不提取注释、提取所有注释,还是只提取特定标签标记的注释。

可用选项:

off

不提取注释

all

提取所有注释

tagged

提取带标签的注释

comment_tag

注释标签

使用标签注释模式时为提取注释而传递给 xgettext 的标签。

checks

xgettext 检查

要为提取的消息而启用的额外的 xgettext 验证检查。

可用选项:

ellipsis-unicode

ellipsis-unicode

space-ellipsis

space-ellipsis

quote-unicode

quote-unicode

bullet-unicode

bullet-unicode

keyword

附加关键词

用 --keyword 传递给 xgettext 的可选的附加关键词。

preset

Meson 预设

内置的 xgettext 变量预设匹配 Meson gettext 集成。GLib 预设添加键盘和 Meson 的 gettext 助手所用的格式标记选项。

可用选项:

glib

GLib

触发器:

附加组件安装, 手动触发, 拉取新更改

用 Meson gettext 规范更新 gettext 模板。

生成 MO 文件

附加组件 ID:

weblate.gettext.mo

配置:

path

生成的 MO 文件的路径

如未指定,将使用 PO 文件对应的位置。

fuzzy

包括需要编辑的字符串

需要编辑的字符串(fuzzy)通常无法直接被用作译文。

触发器:

提交更改前

为每个变更的 PO 文件自动生成 MO 文件。

生成的 MO 文件的位置可以定制化,并且其字段使用 模板标记

备注

如果译文被移除,其 PO 文件将从仓库中被删除,但此附加组件生成的 MO 文件不会被删。必须手动从上游移除 MO 文件。

更新 PO 文件以匹配 POT 文件 (msgmerge)

在 5.13 版本发生变更: 设置 配置已移至 文件格式参数

附加组件 ID:

weblate.gettext.msgmerge

配置:

此附加组件无配置。

触发器:

附加组件安装, 拉取新更改

使用 msgmerge 更新所有的 PO 文件(由“文件掩码”配置)以匹配 POT 文件(由“新翻译模板”配置)。

处理 POT 模板文件有更新(有新字符串或现有字符串有更改)的 gettext PO 文件时,该附加组件必不可少。当 POT 文件在仓库中更新时,该附加组件会自动将其更改合并入所有语言的 PO 文件,确保:

  • 新的可翻译字符串出现在所有语言中

  • 删除的字符串被标记为过时

  • 已修改字符串被标记为需要审核(fuzzy)

多数 msgmerge 命令行选项可通过文件格式参数配置进行设置。

更新 POT 文件(Sphinx)

Added in version 5.17.

附加组件 ID:

weblate.gettext.sphinx

配置:

interval

更新频率

刷新部件时附加组件更新 POT 文件的频率。

可用选项:

daily

每天

weekly

每周

monthly

每月

normalize_header

正常化 POT 标头

更新 gettext 标头并替换占位符 POT 注释。

filter_mode

筛选

在 Sphnix 提取后可以选择删除对翻译无用的字符串。

可用选项:

none

weblate_docs

Weblate 文档

触发器:

附加组件安装, 手动触发, 拉取新更改

用 Sphinx 的 gettext 构造工具在不加载项目配置情况下更新 gettext 模板。

更新 POT 文件(xgettext)

Added in version 5.17.

附加组件 ID:

weblate.gettext.xgettext

配置:

interval

更新频率

刷新部件时附加组件更新 POT 文件的频率。

可用选项:

daily

每天

weekly

每周

monthly

每月

normalize_header

正常化 POT 标头

更新 gettext 标头并替换占位符 POT 注释。

comment_mode

代码注释

选择 xgettext 是不提取注释、提取所有注释,还是只提取特定标签标记的注释。

可用选项:

off

不提取注释

all

提取所有注释

tagged

提取带标签的注释

comment_tag

注释标签

使用标签注释模式时为提取注释而传递给 xgettext 的标签。

checks

xgettext 检查

要为提取的消息而启用的额外的 xgettext 验证检查。

可用选项:

ellipsis-unicode

ellipsis-unicode

space-ellipsis

space-ellipsis

quote-unicode

quote-unicode

bullet-unicode

bullet-unicode

keyword

附加关键词

用 --keyword 传递给 xgettext 的可选的附加关键词。

input_mode

输入源

选择 xgettext 应该从 glob 模式还是从 POTFILES/POTFILES.in 清单读取源文件。

可用选项:

patterns

源文件模式

potfiles

POTFILES 清单

language

xgettext 语言

传递给 xgettext 的编程语言,如 Python 或 C。

source_patterns

源文件模式

换行符分隔的相对于仓库的 glob 模式,针对使用 xgetext 提取的文件。

potfiles_path

POTFILES 路径

POTFILES 或 POTFILES.in. 的相对于仓库的路径。相对于仓库根目录解析条目。如果在清单文件旁边,那么 POTFILES.skip 不提取所列文件。

触发器:

附加组件安装, 手动触发, 拉取新更改

用 xgettext 更新所选源文件的 gettext 模板。

挤压 Git 提交

附加组件 ID:

weblate.git.squash

配置:

squash

挤压提交

可用选项:

all

所有提交成一个

language

每种语言

file

每个文件

author

每位作者

append_trailers

在挤压的提交说明附上尾注

尾注行是类似于 RFC 822 电子邮件标头的行,位于提交说明的其他自由格式部分的末尾,例如 “Co-authored-by: …”。

commit_message

提交说明

将使用此提交说明来代替挤压提交的组合提交说明。

触发器:

附加组件安装, 提交更改后

在推送变更之前挤压 Git 提交。

提示

为了避免不必要的冲突,建议配置通过 webhooks 或 API 自动接收上游更改,见 更新仓库

在推送变更之前,可以通过以下任一模式挤压 Git 提交:

  • 所有提交成一个

  • 每种语言

  • 每个文件

  • 每位作者

原始提交说明保留,但其作者信息丢失,除非选择 每位作者,或者定制提交说明来包括它。

可以选择使用自定义提交说明覆盖原始提交说明。

可以选择从原始提交说明中删除尾注(像 Co-authored-by: 这样的提交行),并附在挤压的提交说明的末尾。这也会为每位译者产生合适的 Co-authored-by: 记录。

自定义 JSON 输出

在 5.12 版本发生变更: 添加了 分隔符后避免空格 选项。

Removed in version 5.13: 文件格式参数 替代。

将仓库重置为上游状态

Added in version 5.17.

附加组件 ID:

weblate.hosted.reset

配置:

此附加组件无配置。

触发器:

附加组件安装, 每天

每晚丢弃 Weblate 仓库中的所有更改。

格式化 Java 属性文件

附加组件 ID:

weblate.properties.sort

配置:

case_sensitive

对键排序启用大小写

触发器:

提交更改前

对 Java 属性文件进行格式化和排序。

  • 将换行符合并到 Unix 换行符。

  • Unicode 转义序列的大写格式(如果存在)。

  • 去除空白行和注释。

  • 按键对字符串进行排序。

  • 删除重复的字符串。

陈旧评论删除

附加组件 ID:

weblate.removal.comments

配置:

age

保留天数

触发器:

附加组件安装, 每天

设置删除评论的时间。

这可以用于删除可能已经过时的陈旧评论。小心使用,因为评论变旧并不意味着它们已经失去了重要性。

陈旧建议删除

附加组件 ID:

weblate.removal.suggestions

配置:

age

保留天数

votes

投票阈值

移除阈值。当投票被禁用时该项无效果。

触发器:

附加组件安装, 每天

设置删除建议的时间。

可与建议投票(参见 同行评审)结合使用,用于删除在给定时间内未获得足够赞成票的建议。

更新 RESX 文件

附加组件 ID:

weblate.resx.update

配置:

此附加组件无配置。

触发器:

附加组件安装, 拉取新更改

更新所有翻译文件以匹配上游单语言译文模版文件。未使用的字符串将被删除,新字符串将复制源字符串添加。

提示

如果只想删除陈旧的翻译键,那么使用 清理翻译文件

Slack Webhooks

Added in version 5.12.

附加组件 ID:

weblate.webhook.slack

配置:

webhook_url

Webhook URL

events

更改事件

更改事件

触发器:

事件变化

根据所选事件向 Slack 频道发送通知。

警告

通知内容可能会显示 HTML 标签。这是一个已知问题,很快就会解决;请查看 https://github.com/WeblateOrg/weblate/issues/15056

提示

要获取 webhook URL,请按照 Slack Incoming Webhooks 文档 中概述的步骤操作

Webhook

Added in version 5.11.

在 5.15 版本发生变更: 现在验证 secret 长度是符合规范。

附加组件 ID:

weblate.webhook.webhook

配置:

webhook_url

Webhook URL

secret

Webhook secret

标准 Webhooks secret 是 base64 编码的字符串。

events

更改事件

更改事件

触发器:

事件变化

按照 Standard Webhooks 规范,根据所选事件向外部服务发送通知。

请求负载符合 Weblate Messaging 模式。OpenAPI 描述也可在 /api/docs/ 找到。示例请求正文:

{
   "change_id": 99,
   "action": "Translation changed",
   "timestamp": "2019-08-24T14:15:22Z",
   "target": "Nazdar svete!",
   "old": "Nazdar!",
   "source": "Hello, world",
   "url": "/translate/project-slug/component-slug/cs/?checksum=46add148a53cab6f",
   "author": "author-username",
   "user": "user-username",
   "project": "project-slug",
   "component": "component-slug",
   "translation": "cs"
}

带有类别的示例请求正文:

{
   "change_id": 8910,
   "action": "Component renamed",
   "timestamp": "2025-06-11T07:15:09Z",
   "target": ["new-name"],
   "old": ["component-slug"],
   "url": "/projects/project-slug/parent-category/child-category/sub-category/component-slug/",
   "user": "testuser",
   "project": "project-slug",
   "component": "component-slug",
   "category": [
      "sub-category",
      "child-category",
      "parent-category"
   ]
}

示例请求标头:

{
   "webhook-id": "7f1c5477f6275a69af7b83236c20cb1a",
   "webhook-timestamp": "1748505623.044281",
   "webhook-signature": "v1,Ceo5qEr07ixe2NLpvHk3FH9bwy/WavXrAFQ/9tdO6mc="
}

webhook-signature 是一个空格分隔的 HMAC 签名列表,使用 secret 字符串、请求负载、webhook-timestampwebhook-id 生成。这确保了 webhook 请求的真实性和完整性。

提供的 secret 是 base64 编码的字符串,大小在 24 字节 (192 比特)和 64 字节 (512 比特)之间。前缀可以是 whsec_ 便于识别。

要验证请求,您可以使用 standardwebhooks 库中的 Webhook.verify 方法或“Standard Webhooks 规范”的实现。

淘汰的附加组件

自定义 XML 输出

Added in version 4.15.

Removed in version 5.13: 文件格式参数 替代。

自定义 YAML 输出

Removed in version 5.13: 文件格式参数 替代。

常见附加组件参数

机器翻译引擎

可用选项:

alibaba

Alibaba

aws

Amazon 翻译

anthropic

Anthropic

apertium-apy

Apertium APy

microsoft-translator

Azure AI 翻译工具

azure-openai

Azure OpenAI

baidu

百度

cyrtranslit

CyrTranslit

deepl

DeepL

glosbe

Glosbe

google-translate-api-v3

Google Cloud 翻译高级版

google-translate

Google Cloud 翻译基础版

ltengine

LTEngine

libretranslate

LibreTranslate

modernmt

ModernMT

mymemory

MyMemory

netease-sight

网易见外

ollama

Ollama

openai

OpenAI

sap-translation-hub

SAP 翻译中心

systran

Systran

weblate

Weblate

weblate-translation-memory

Weblate 翻译记忆库

yandex

Yandex

yandex-v2

Yandex v2

youdao-zhiyun

有道智云

tmserver

tmserver

文件格式

可用选项:

apple-xliff

含 Apple 扩展的 XLIFF 1.2

appstore

应用商店元数据文件

arb

ARB 文件

aresource

Android 字符串资源

asciidoc

AsciiDoc 文件

ass

Advanced SubStation Alpha(ASS)字幕文件

catkeys

Haiku catkeys

cmp-resource

Compose 多平台资源

csv

CSV 文件

csv-multi

多值 CSV 文件

csv-simple

简单 CSV 文件

dokuwiki

DokuWiki 文本文件

dtd

DTD 文件

flatxml

Flat XML 文件

fluent

Fluent 文件

formatjs

Format.JS JSON 文件

go-i18n-json

go-i18n v1 JSON 文件

go-i18n-json-v2

go-i18n v2 JSON 文件

go-i18n-toml

go-i18n v1 TOML 文件

gotext

gotext JSON 文件

gwt

GWT 属性

html

HTML 文件

i18next

i18next JSON 文件 v3

i18nextv4

i18next JSON 文件 v4

idml

IDML 文件

ini

INI 文件

islu

Inno Setup INI 文件

joomla

Joomla 语言文件

json

JSON 文件

json-nested

JSON 嵌套结构文件

laravel

Laravel PHP 字符串

markdown

Markdown 文件

mdx

MDX file

mediawiki

MediaWiki 文本文件

mi18n-lang

@draggable/i18n lang 文件

moko-resource

Mobile Kotlin 资源

nextcloud-json

Nextcloud JSON 文件

odf

OpenDocument 文件

php

PHP 字符串

plainxliff

XLIFF 1.2 翻译文件

po

gettext PO 文件

po-mono

gettext PO 文件(单语种)

poxliff

带 gettext 扩展的 XLIFF 1.2

properties

Java 属性

rc

RC 文件

resjson

RESJSON 文件

resourcedictionary

ResourceDictionary 文件

resx

.NET 资源文件

ruby-yaml

Ruby YAML 文件

srt

SubRip 字幕文件

ssa

SubStation Alpha(SSA)字幕文件

strings

iOS 字符串

stringsdict

Stringsdict 文件

sub

MicroDVD 字幕文件

tbx

TermBase eXchange 文件

toml

TOML 文件

ts

Qt Linguist 翻译文件

txt

纯文本文件

webextension

WebExtension JSON 文件

wxl

WixLocalization 文件

xliff

支持 placeables 的 XLIFF 1.2

xliff2

XLIFF 2.0 翻译文件

xliff2-placeables

支持占位符的 XLIFF 2.0 翻译文件

xlsx

Excel Open XML

xwiki-fullpage

XWiki 完整页面

xwiki-java-properties

XWiki Java 属性

xwiki-page-properties

XWiki 页面属性

yaml

YAML 文件

更改事件

可用选项:

0

资源已更新

1

完成了翻译

2

修改了译文

3

添加了评论

4

添加了建议

5

添加了译文

6

自动翻译

7

接受了建议

8

还原了译文

9

上传了译文

13

添加了源字符串

14

锁定了部件

15

解锁了部件

17

已提交更改

18

已推送更改

19

已重置仓库

20

已合并仓库

21

已变基仓库

22

仓库合并失败

23

变基仓库失败

24

解析失败

25

删除了翻译

26

删除了建议

27

替换了翻译

28

仓库推送失败

29

在清理中删除了建议

30

改变了源字符串

31

已添加字符串

32

批量更改了状态

33

更改了可见性

34

添加了用户

35

删除了用户

36

核准了译文

37

标记为需要编辑

38

删除了部件

39

删除了项目

41

重命名了项目

42

重命名了部件

43

移动了部件

45

有新贡献者加入

46

发布了公告

47

触发了警报

48

添加了语言

49

已请求添加语言

50

创建了项目

51

添加了部件

52

邀请了用户

53

收到了仓库通知

54

上传并替换了翻译文件

55

更改了许可证

56

更改了贡献者许可协议

57

添加了截图

58

上传了截图

59

更新了仓库中的字符串

60

安装了附加组件

61

更改了附加组件配置

62

卸载了附加组件

63

删除了字符串

64

删除了评论

65

评论已解决

66

解释已更新

67

删除了类别

68

重新命名了类别

69

移动了类别

70

保存字符串失败

71

在仓库中添加了字符串

72

上传更新了字符串

73

上传添加了字符串

74

通过上传原文更新了译文

75

组件翻译已完成

76

应用了强制检查

77

传播了更改

78

文件已上传

79

额外标记已更新

80

字体已上传

81

字体已更改

82

字体已移除

83

已强制同步翻译

84

已强制重新扫描翻译

85

删除了截图

86

添加了标签

87

删除了标签

88

仓库清理

89

在上传中添加了源字符串

90

在仓库中添加了源字符串

91

已备份项目

92

项目已还原

93

已恢复部件

94

撤销了用户编辑

95

Project setting changed

96

Component setting changed

定制附加组件列表

附加组件列表由 WEBLATE_ADDONS 配置。要添加其他附加组件,只需在这个设置中包含绝对类名称即可。

编写附加组件

你也可以编写自己的附加组件,创建一个 weblate.addons.base.BaseAddon 的子类来定义附加组件元数据,然后实现一个回调来执行处理。

从附加组件执行脚本

附加组件还可以用于执行外部脚本。这曾经集成在 Weblate 中,但现在必须写一些代码,将脚本包裹在附加组件中。

# Copyright © Michal Čihař <michal@weblate.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later

"""Example pre commit script."""

from __future__ import annotations

from typing import ClassVar

from django.utils.translation import gettext_lazy

from weblate.addons.events import AddonEvent
from weblate.addons.scripts import BaseScriptAddon


class ExamplePreAddon(BaseScriptAddon):
    # Event used to trigger the script
    events: ClassVar[set[AddonEvent]] = {
        AddonEvent.EVENT_PRE_COMMIT,
    }
    # Name of the addon, has to be unique
    name = "weblate.example.pre"
    # Verbose name and long description
    verbose = gettext_lazy("Execute script before commit")
    description = gettext_lazy("This add-on executes a script.")

    # Script to execute
    script = "/bin/true"
    # File to add in commit (for pre commit event)
    # does not have to be set
    add_file = "po/{{ language_code }}.po"

安装方法请参见 定制的质量检查、附加组件、自动建议和自动修复

对于任何给定的部件,当前路径设置为版本控制系统仓库的根目录时,执行脚本。

此外,以下环境变量是可用的:

WL_VCS

使用的版本控制系统。

WL_REPO

上游仓库 URL。

WL_PATH

版本控制系统仓库的绝对路径。

WL_BRANCH

当前部件配置的仓库分支。

WL_FILEMASK

当前部件的文件掩码。

WL_TEMPLATE

单语言翻译模板的文件名(可以为空)。

WL_NEW_BASE

建立新的翻译所使用文件的文件名(可以为空)。

WL_FILE_FORMAT

用于当前部件的文件格式。

WL_LANGUAGE

当前处理的翻译的语言(对于部件级别的钩子不可用)。

WL_PREVIOUS_HEAD

更新后的上个 HEAD (仅在运行更新后钩子后可用)。

WL_COMPONENT_SLUG

部件标识串用于构建 URL。

WL_PROJECT_SLUG

项目标识串用于构建 URL。

WL_COMPONENT_NAME

部件名称。

WL_PROJECT_NAME

项目名称。

WL_COMPONENT_URL

部件 URL。

WL_ENGAGE_URL

项目参与 URL。

参见

部件配置

更新后仓库处理

可用于在 VCS 上游源更改时更新翻译文件。为了实现这个功能,请记住 Weblate 只能看到提交给版本控制系统的文件,所以您需要将更改作为脚本的一部分提交。

例如,使用 Gulp,您可以使用以下代码来实现:

#! /bin/sh
gulp --gulpfile gulp-i18n-extract.js
git commit -m 'Update source strings' src/languages/en.lang.json

翻译的预提交处理

在将翻译提交到仓库之前,使用 commit 脚本自动更改翻译。

它作为组成当前翻译文件名的单一参数而通过。

附加组件活动记录

附加组件活动记录保留附加组件执行的踪迹且可用来了解附加组件的活动。

可以在一定时间间隔后清除记录,方法是配置 ADDON_ACTIVITY_LOG_EXPIRY