常见问题

配置

如何创建自动化工作流?

Weblate 可以为您半自动处理所有翻译工作。如果授予它对仓库的推送访问权限,则翻译可以在没有交互的情况下进行,除非发生某些合并冲突。

  1. 设置好 Git 仓库,以便在发生更改时通知 Weblate,请参阅 通知钩子 获取有关如何操作的信息。

  2. 在 Weblate 的 部件配置 中设置推送 URL,这会允许 Weblate 将更改推送到仓库。

  3. 在 Weblate 的 部件配置 中开启 提交时推送,这将使 Weblate 在 Weblate 发生更改时将更改推送到仓库。

如何通过 SSH 访问仓库?

设置 SSH 密钥的信息请参阅 访问仓库

如何修复翻译中的合并冲突?

当 Weblate 和上游仓库的翻译文件同时被更改时,合并冲突时有发生。通常可以通过在对翻译文件进行更改前(例如在运行 msgmerge 前)先合并 Weblate 的翻译来避免这种情况。只需告诉 Weblate 提交所有待处理的翻译(可以在 管理 菜单中的 代码库维护 中执行此操作),并合并仓库(如果没有开启自动推送)。

如果你已经遇到了合并冲突,那么在您的机器上本地解决所有冲突的最简单方法是将 Weblate 添加为远程仓库,将它合并到上游,并修复任何冲突。一旦将更改推送回去,Weblate 就将能够使用合并的版本而无需任何其它特殊操作。

备注

取决于你的设置,访问 Weblate 代码库可能需要身份验证。使用 Weblate 中内建的 Git 导出器 时,你需使用用户名和 API 密钥进行身份验证。

# Commit all pending changes in Weblate, you can do this in the UI as well:
wlc commit
# Lock the translation in Weblate, again this can be done in the UI as well:
wlc lock
# Add Weblate as remote:
git remote add weblate https://hosted.weblate.org/git/project/component/
# You might need to include credentials in some cases:
git remote add weblate https://username:APIKEY@hosted.weblate.org/git/project/component/

# Update weblate remote:
git remote update weblate

# Merge Weblate changes:
git merge weblate/main

# Resolve conflicts:
edit …
git add …
…
git commit

# Push changes to upstream repository, Weblate will fetch merge from there:
git push

# Open Weblate for translation:
wlc unlock

如果在 Weblate 中使用多个分支,那么可以对所有的分支做相同的事:

# Add and update Weblate remotes
git remote add weblate-one https://hosted.weblate.org/git/project/one/
git remote add weblate-second https://hosted.weblate.org/git/project/second/
git remote update weblate-one weblate-second

# Merge QA_4_7 branch:
git checkout QA_4_7
git merge weblate-one/QA_4_7
... # Resolve conflicts
git commit

# Merge main branch:
git checkout main
git merge weblates-second/main
... # Resolve conflicts
git commit

# Push changes to the upstream repository, Weblate will fetch the merge from there:
git push

在 gettext PO 文件的情况下,有一种方式以半自动方式来合并冲突:

取回并保存 Weblate Git 仓库的本地克隆。还要得到上游 Git 仓库的第二个新的本地克隆(也就是需要上游 Git 仓库的两份复件:完整的复件和工作复件):

# Add remote:
git remote add weblate /path/to/weblate/snapshot/

# Update Weblate remote:
git remote update weblate

# Merge Weblate changes:
git merge weblate/main

# Resolve conflicts in the PO files:
for PO in `find . -name '*.po'` ; do
    msgcat --use-first /path/to/weblate/snapshot/$PO\
               /path/to/upstream/snapshot/$PO -o $PO.merge
    msgmerge --previous --lang=${PO%.po} $PO.merge domain.pot -o $PO
    rm $PO.merge
    git add $PO
done
git commit

# Push changes to the upstream repository, Weblate will fetch merge from there:
git push

如何同时翻译几个分支?

Weblate 支持在一个 项目配置 内推送翻译更改。对于每个将其打开的 部件配置 (默认行为),所作的更改自动传递给其它部件。即使分支本身已经非常多样化了,也能以这种方式保持同步,并且不能在他们之间简单地合并翻译更改。

一旦从 Weblate 合并了更改,你可能不得不合并这些分支(取决于于您的开发工作流程),并丢弃差异:

git merge -s ours origin/maintenance

如何翻译多平台项目?

Weblate 支持多种文件格式(请参见 支持的文件格式),最简单的方法就是使用每个平台的原生格式。

一旦在一个项目中将所有平台的翻译文件作为部件添加(请参见 添加翻译项目和部件),就可以立刻使用翻译传播特性(默认打开,并且可以在 部件配置 中关闭),来翻译所有平台的字符串了。

如何导出 Weblate 使用的 Git 仓库?

仓库没有什么特殊的,它存在于 DATA_DIR 目录下面,并被命名为 vcs/<project>/<component>/。如果有 SSH 范文这台机器,那么可以直接使用仓库。

对于匿名访问,您会想要运行 Git 服务器,并让它为外部世界提供仓库服务。

此外,可以在 Weblate 内替代使用 Git 导出器 而使其自动化。

将更改推送回上游的选项是什么?

这在很大程度上取决于您的设置,Weblate 在这方面非常灵活。这里是一些使用 Weblate 的工作流程的示例:

  • Weblate 自动推送并合并更改(请参见 如何创建自动化工作流?)。

  • 您需要手动告诉 Weblate 去推送(推送需要访问上游仓库)。

  • 一些人将 Weblate git 仓库的更改手动合并到上游仓库中。

  • 一些人重写由 Weblate 生成的历史(例如通过删除合并提交),合并更改,并告诉 Weblate 重置上游仓库中的内容。

当然您可以按您的意愿自由混用所有这些方法。

如何限制 Weblate 仅访问翻译,而不向其暴露源代码?

可以使用 git submodule 将翻译从源代码中分离出来,而仍将它们至于版本控制之下。

  1. 用翻译文件创建一个仓库。

  2. 将其作为子模块添加到您的代码中:

    git submodule add git@example.com:project-translations.git path/to/translations
    
  3. 将 Weblate 连接到这个仓库上,它不再需要访问包含您源代码的仓库。

  4. 可以从 Weblate 更新带有翻译的主仓库,通过:

    git submodule update --remote path/to/translations
    

更多细节请咨询 git submodule 文档。

如何检查 Weblate 是否被正确地设置?

Weblate 包括一组配置检查,可以在管理面板中看到,只需按照管理面板中的 Performance report 连接,或直接打开 /manage/performance/ URL 即可。

为什么所有提交都是由 Weblate <noreply@weblate.org> 提交的?

这是默认的提交者名称,由 DEFAULT_COMMITER_EMAILDEFAULT_COMMITER_NAME 配置。

(如果下层的版本管理系统 VCS 支持它的话),每个提交的作者仍会被正确地记录为进行翻译的用户。

对于不知道作者身份的提交(例如匿名建议或机器翻译结果),作者身份归匿名用户所有(参见 ANONYMOUS_USER_NAME)。您可以在管理界面中更改名称和电子邮件。

参见

部件配置

如何移动代码库中的文件而不丢失 Weblate 中的历史记录?

要在更改文件位置后保留链接到字符串的历史记录,注释或屏幕截图,您需要确保这些字符串永远不会在Weblate中删除。如果 Weblate 存储库已更新,但组件配置仍指向旧文件,则可能会发生这些删除操作。这使得Weblate认为它应该删除所有翻译。

解决此问题的方法是与 Weblate 同步执行操作:

  1. 在 Weblate 锁定受影响的部件。

  2. 提交任何待处理的更改,并将它们合并到上游代码库中。

  3. 禁用接收 webhook 项目配置;这可以防止 Weblate 立即看到存储库中的更改。

  4. 在存储库中进行任何需要的更改(例如使用 git mv),将它们推送到上游存储库。

  5. 更改 部件配置 以匹配新设置;在更改配置时,Weblate 将获取更新的存储库并注意更改的位置,同时保留现有的字符串。

  6. 解锁部件并重新启用项目配置中的挂钩。

用法

如何复查其他人的翻译?

  • 在 Weblate 中,基于工作流程有几种复查方式,请参见 翻译工作流

  • 你可以在 通知 中订阅做出的任何更改,然后通过电子邮件查看其他人的贡献。

  • 在翻译视图底部有个复查工具,可以在那里选择浏览给定时间以来其他人进行的翻译。

如何提供源字符串的反馈?

在翻译下方的上下文选项卡中,可以通过 评论 选项卡提供源字符串的反馈,或者与其他翻译者讨论。

翻译时如何使用现有的翻译?

  • 得益于共享的翻译记忆库,Weblate 中的所有翻译都可以使用。

  • 你可以将现有翻译记忆库导入 Weblate。

  • 使用导入功能将概要导入作为翻译、建议或需要复查的翻译。这是使用概要或相似的翻译数据库一次性翻译的最好方法。

  • 可以使用您所具有的所有数据库来设置 tmserver。在翻译时多次使用的时候这种方法很好。

  • 另一个选项是在单一 Weblate 实例中翻译所有相关项目,这样同样可以从其它项目中自动地获取翻译。

Weblate 除了更新翻译,还更新翻译文件吗?

Weblate 尝试将翻译文件中的更改限制为最小。对于有些文件格式,很不幸会导致将文件重新格式化。如果想要将文件保持为自己的格式化方式,请为其使用预提交钩子。

语言定义来自何处以及如何添加自己的语言定义?

语言定义的基本组包括在 Weblate 和 Translate-toolkit 中。这覆盖了超过 150 种语言,并且包括了复数形式和文本方向的信息。

您可以在管理界面自由定义自己的语言,只需要提供与之相关的信息。

参见

语言定义

Weblate 能将模糊字符串中的更改高亮吗?

Weblate 支持这个功能,然而它需要数据来显示差异。

对于 Gettext PO 文件,更新 PO 文件时,必须将参数 --previous 传递给 msgmerge,例如:

msgmerge --previous -U po/cs.po po/phpmyadmin.pot

对于单语言翻译,Weblate 可以通过 ID 找到之前的字符串,因此可以自动显示差异。

当已经更新了模板时,为什么 Weblate 仍然显示旧的字符串?

Weblate 除了允许翻译者翻译之外,不会尝试以任何方式操作翻译文件。因此当模板或源代码更改时,它也同样不会更新翻译文件。您必须简单地手动去做,并将更改推送到仓库,然后 Weblate 会自动拾取更改。

备注

在更新翻译文件之前在 Weblate 中完成更改合并,这通常是个好主意,因为否则的话通常会以一些合并冲突来结束。

例如对于 gettext PO 文件,可以使用 msgmerge 工具来更新翻译文件:

msgmerge -U locale/cs/LC_MESSAGES/django.mo locale/django.pot

如果你想要自动更新,可以安装附加组件 更新 PO 文件以匹配 POT 文件 (msgmerge)

故障排除

请求有时失败,错误信息为“too many open files”(打开文件过多)

有时当您的 Git 仓库增长太多并您有太多仓库时会发生。压缩 Git 仓库会改善这种情况。

这样做的最容易方式是运行:

# Go to DATA_DIR directory
cd data/vcs
# Compress all Git repositories
for d in */* ; do
    pushd $d
    git gc
    popd
done

参见

DATA_DIR

当访问网站时,“Bad Request (400)”(错误的请求)错误信息

这很可能因为 ALLOWED_HOSTS 配置不当而产生。需要包含在 Weblate 上访问的所有主机名。例如:

ALLOWED_HOSTS = ["weblate.example.com", "weblate", "localhost"]

“There are more files for the single language (en)”(单一语言‘英语’有多个文件)是什么意思?

当源语言有翻译时这会典型发生。Weblate 跟踪源字符串,并为此保留源字符串。相同语言的附加字符串不会被处理。

  • 如果需要对源语言进行翻译,请更改部件设置中的 源语言

  • 如果不需要源语言的翻译文件,请从仓库中将其删除。

  • 如果需要源语言的翻译文件,但 Weblate 应该忽略它,请通过调整 语言筛选 来排除它。

提示

对于其它语言可能也会得到相似的错误信息。在这种情况下最可能的原因是在 Weblate 中几个文件映射到单语言上。

这可能是由于同时使用了过时的语言代码和新的语言代码(对于日语是 jajp),或者包含了特定国家地区的和通用的语言代码(frfr_FR)。更多细节请参见 分析语言代码

功能

Weblate 支持 Git 和 Mercurial 以外的其它 VCS 吗?

Weblate 当前不原生支持除 Git(扩展支持 GitHub 拉取请求GerritSubversion)和 Mercurial 以外的任何 VCS,但可以为其他 VCS 编写后端。

还可以在 Git 中使用 Git 远程帮助程序 来访问其它 VCS。

Weblate 还支持无 VCS 的操作,请参见 本地文件

备注

对于其它 VCS 的原生支持,Weblate 需要使用分布式 VCS,并可能会调整为能与除 Git 和 Mercurial 以外的任何东西一起使用,必须有人来实现这项支持。

Weblate 如何记录翻译者?

Weblate 中所做的每个更改都将以翻译者的名称提交到版本控制系统(VCS)中。这样,每个更改都具有适当的作者身份,您可以使用用于代码的标准版本控制系统(VCS)工具来进行跟踪。

此外,如果翻译文件格式支持,将更新文件标头以包含翻译者的名字。

为什么 Weblate 强制在单一树中显示所有 PO 文件?

Weblate 的设计方式是将每个 PO 文件表示为单个部件。这对翻译人员来说是有好处的,这样他们就知道他们实际上在翻译什么。

在 4.2 版本发生变更: 翻译人员可以将项目的所有部件作为一个整体翻译成一种特定的语言。

Weblate 为什么使用 sr_Latn 或 zh_Hant 这样的语言代码?

这些是由 RFC 5646 定义的语言代码,而不是以前错误使用的修饰符(对于 @latin 变体)或国家地区代码(对于中文),可以更好地表明它们确实是不同的语言。

Weblate 仍然理解遗留的语言代码,并会将它们映射到当前对应的代码上——例如 sr@latin 将被处理为 sr_Latn 或者 zh@CN 处理为 zh_Hans

备注

Weblate 默认为带有下划线的 POSIX 风格的语言代码,有关更多详细信息,请参阅 语言定义