openSUSE:Update-desktop-files 弃用
简介
2003 年,上游桌面文件翻译质量较差,桌面树菜单也是如此。为了防止丑陋且半翻译的桌面菜单,SuSE Linux(实际上是 Novell Linux Desktop 9)引入了 %suse_update_desktop_file 宏。 很多年前它甚至曾经是强制性的。
几年后,发明了一个对软件包维护者隐藏的不透明过程,所有桌面文件都会发送给翻译人员。它使用 brp 脚本,对软件包维护者来说完全不透明,并且更改对他们来说是不可见的。这些 SUSE 特定的翻译优先于上游翻译。
此外,整个 update-desktop-files 的概念完全违背了我们的策略 “首先上游”。
update-desktop-files 的新版本将于 2024-11 进入 Factory。 首次实现将过去 20 年中完成的 SUSE 桌面翻译上游提交成为可能。上游提交需要与软件包维护者和上游进行协调。软件包维护者需要检查构建日志以获取说明,并决定如何上游提交桌面翻译。
还有更多原因说明应该放弃 update-desktop-files,并将桌面翻译移至上游
- 它经常重复上游翻译工作,浪费人力,包括社区翻译人员和合同翻译人员。
- 这些翻译中的大部分大约有 20 年历史了,从未经过审查,因此可能比上游翻译更差。在过去的 20 年里,它没有提供任何上游提交更改和翻译的方式。上游翻译又经过了 20 年的开发。此外,桌面类别规范也已更新,上游规范现在涵盖了以前的
X-SuSE-*类别扩展的所有方面。
- 因此,SUSE 桌面菜单体验与其他供应商不同。应用程序具有不同的名称、不同的翻译、不同的结构化菜单中的位置等。
- 上游翻译具有更广泛的影响。
- 软件包维护者只能有限地控制用户可见的内容。它在运行时导入,可见内容可能与软件包中的内容不同。
- update-desktop-files 是一个复杂的工具。它试图修复桌面文件中已弃用和过时的内容,甚至没有通知开发人员存在问题并进行了修改。
- 它使用一个非常复杂的工具链,需要访问 SUSE 内联网和 OpenQA VPN。完整的工具链设置从未发布,因此它甚至存在与开源理念相悖的问题。
- 它将 SUSE 唯一的翻译与仅重复上游翻译工作的翻译混合在一起。因此,它显著增加了需要翻译的字符串数量并降低了翻译质量。
项目数据
使用 %suse_update_desktop_file 的软件包:1149 个
使用 %suse_update_desktop_file 但没有涉及任何更改的软件包:54 个
未使用宏的 update-desktop-files 的软件包:167 个
使用 %suse_update_desktop_file 翻译的软件包:928 个(1127 个桌面文件)
使用不显示在 spec 文件中的不透明翻译过程的软件包:5747 个(4811 个唯一软件包)
翻译字符串总数(所有语言):380433
关于 update-desktop-file 的更多信息
弃用计划
update-desktop-files 与其他翻译项目不同。由于它修改了来自上游的翻译和桌面文件,该项目所做的更改必须移动到上游。因此,它不能轻易地被放弃。
这是建议的废弃计划
- 2024 年 11 月:Factory 中的
update-desktop-files
- 2025 年初:使用不透明过程的软件包有机会上游提交 openSUSE/SUSE 特定的更改。
- 2025 年 3 月:软件包维护者审查建议的更改并将其发送到上游。
- 2025 年底:上游审查建议的更改,并将其上游提交或放弃。软件包维护者在下一个版本更新中将这些更改导入 Factory。
- 2026 年初:未获得上游更新的软件包将使用补丁而不是使用
update-desktop-files
- 2026 年期间:使用
update-desktop-files会生成错误,并且软件包将被放弃。
上游提交
上游提交 update-desktop-files 翻译的弃用过程于 2024 年启动。这项工作的一个目标是完全上游提交所有 SUSE 特定的更改,然后放弃自定义翻译。
哪些内容可以包含 SUSE 特定的更改
- 添加
GenericName或Comment。
Name、GenericName或Comment更改,与上游不同。
- 添加
Name、GenericName、Comment或Keywords的翻译,这些翻译在 upstream 中不存在。
Name、GenericName、Comment或Keywords翻译更改,与上游不同。
- 更改
Categories或引入新的Categories,从而有效地更改结构化菜单的布局。
注意事项
有必要审查所有这些更改,思考它们并将它们发送到上游。
对于与上游不同的更改,请考虑 SUSE 特定的更改和不同的翻译可能是在大约 20 年前进行的,并且它们的测试人员社区更小。
审查资源
您可以使用以下资源进行审查
Name、GenericName、Comment或Keywords是否包含 桌面条目规范 所说的内容?请注意,Name等于GenericName和/或Comment的.desktop文件不被视为良好实践。
- 新的
Categories是否更匹配?或者更改是否修复了不正确的用法?每个主要类别应至少列出一个次要类别。并且使用的每个次要类别都需要相应的基本类别。请参阅 桌面菜单规范中的注册类别
- 上游翻译是否过时?如果是,则有意义用 SUSE 特定的翻译覆盖它们。如果不是,则有意义优先使用上游翻译,并仅对缺失的字符串使用 SUSE 翻译。
- 验证要上游提交的桌面文件是否不包含任何 SUSE 特定的内容(例如
X-SUSE-*)。
- 空行更改只是纯粹的视觉更改,可以忽略它们。
- 在修复桌面文件时,请修复桌面文件验证程序发出的警告,因为它们是由 rpmlint 检查呈现的。(如果有的话。)
update-desktop-files 生成的建议补丁
为了简化上游提交,请检查构建目录顶部的 suse_update_desktop_file 或构建结果中的文件 update-desktop-files.tar.gz
https://{obs_instance}/build/{project}/{repository}/{arch}/{package}/update-desktop-files.tar.gz
或
osc getbinaries {project} {package} {repository} {arch} update-desktop-files.tar.gz
然后在源目录中解压缩它。
您可以在那里找到以下文件
{桌面名称}-downstream-directly-translated.diff:如果应用程序没有翻译工具包,请审查并应用它并发送到上游。
{桌面名称}-downstream-in-translated.diff:如果应用程序具有翻译工具包,请审查并应用它并发送到上游并将翻译从 po 文件中合并。此补丁适用于 intltool 和类似工具,这些工具翻译以_开头的键。
{桌面名称}-downstream-no-translation.desktop:此文件包含%suse_update_desktop_file所做的所有修改,不包括翻译。
{桌面名称}-downstream-no-translation.desktop.in:此文件包含%suse_update_desktop_file所做的所有修改,不包括翻译。它被转换为 intltool 接受的格式。
{桌面名称}-downstream-translated.desktop:此文件包含%suse_update_desktop_file所做的所有修改,包括翻译。
{桌面名称}-upstream.desktop:上游提供的原始桌面文件。
{桌面名称}-upstream.desktop.in:上游提供的原始桌面文件。它被转换为 intltool 接受的格式。
如何上游提交
如果软件包属于 YaST
现在什么都不做。您是上游。尚未存在替代方案。有关更多信息,请参阅 Bug 1232409 - desktop translations: replace deprecated update-desktop-files by another tool。
如果应用程序具有翻译工具包
- 审查
{桌面名称}-downstream-in-translated.diff并应用它。
- 选择 po 目录并将其合并到上游 po 文件中。
- 验证桌面文件是否不包含任何 SUSE 特定的内容(例如
X-SUSE-*)。
如何将翻译更改合并到上游 po 文件中
假设正确的翻译目录是 po
cd update-desktop-files/{desktop name}/po
for PO in *.po ; do
if test -f ../../../po/$PO ; then
msgcat --use-first $PO ../../../po/$PO -o ../../../po/$PO.new
mv ../../../po/$PO.new ../../../po/$PO
else
cp -a $PO ../../../po/$PO
fi
done
此命令优先使用 SUSE 翻译而不是上游翻译。如果您想优先使用现有的上游翻译而不是 SUSE 特定的翻译,请交换 msgcat 的参数
msgcat --use-first ../../../po/$PO $PO -o ../../../po/$PO.new
说明
- 桌面文件可能位于子目录中,并且可能具有后缀
.in.in。
- 该项目可能有多个翻译域(和目录),正确的翻译目录可能与 po 不同。
- 如果有更多
%update_desktop_files,您需要对update-desktop-files的所有子目录重复这些步骤。
- 您可以安全地忽略有关不匹配复数的警告。桌面文件从不使用复数形式。
- 建议使用最新的 pot 文件更新 po 文件。执行此操作的方法可能因软件包而异,但常见方法是
make cd po make update-po
如果软件包具有上游翻译服务器
一些软件包使用专用的翻译服务器进行翻译(例如 Weblate)。然后,该过程可能需要使用此服务器并提交 po 文件。其中一些工具允许提交部分 po 文件(例如,由该工具生成的 po 文件),其中一些工具可能需要完整的 po 文件。如果前端支持审查,则有意义提交 SUSE 翻译以供审查。
您也可以联系开发人员寻求帮助。
如果应用程序没有翻译工具包
- 审查
{桌面名称}-downstream-directly-translated.diff,应用它并发送到上游。
- 验证桌面文件是否不包含任何 SUSE 特定的内容(例如
X-SUSE-*)。
发送或应用补丁
完成工作后,请将您的更改发送到上游进行审查。当上游包含它们(或有意识地决定不包含)时,请升级并删除
BuildRequires: update-desktop-files
和
%suse_update_desktop_file {arguments}
现在您的软件包终于符合“首先上游”策略。
为了表明您的工作已经完成,您可以将您发送到上游的补丁应用到 spec 文件中,并在上游合并它后将其删除。但是,这种方法在某些情况下可能受到限制,因为翻译到上游的路线与代码的路线不同。例如,该项目具有翻译服务器,并且翻译在经过审查后包含在 upstream 存储库中。
如果上游项目已停止维护,请将通用更改作为补丁应用。这使源代码更具可读性。并考虑将桌面文件添加到 translate-suse-desktop 项目。请进一步阅读。
桌面文件仅存在于 spec 文件中
在这种情况下,您的桌面文件可能是 SUSE 特定的,您不需要上游提交任何内容。您只需要成为上游。只需从重量级的 update-desktop-files(包含重复上游翻译工作并具有唯一字符串)迁移到简单的 translate-suse-desktop 工具。
更多信息请参阅 translate-suse-desktop 文档。
在下一次字符串收集期间,您的字符串将被包含到
您无需关心从 desktop-file-translations 的翻译迁移。工具链将自动为您完成。如果您想加快此过程,请告知 translate-suse-desktop 的维护者。
使用 translate-suse-desktop (基本上是 intltool 的单行命令加上对所有软件包的字符串收集) 准备桌面文件进行翻译
sed 's/^\(Name\|GenericName\|Comment\|Keywords\)=/_\1=/' < {desktop name}.desktop > {desktop name}.desktop.in
(intltool-prepare 执行相同的工作。)
patch <{desktop name}-downstream-in-translated.diff
为了方便起见,将桌面文件顶部的 Categories 移动到较低部分 (Exec, Icon 等下方)。
然后修改 spec 文件:在 preamble 中,更改
BuildRequires: update-desktop-files
到
BuildRequires: translate-suse-desktop
和
Source{number}: {desktop name}.desktop
到
Source{number}: {desktop name}.desktop.in
在 %prep 中,将 Source{number} 复制到构建目录
cp %{SOURCE{NUMBER}} .
在 %build 中,添加
%translate_suse_desktop {desktop name}.desktop
并在 %install 中,更改
%suse_update_desktop_file {arguments}
到
install -D -m 0644 {desktop name}.desktop %{buildroot}${DESKTOP_PATH#$RPM_BUILD_ROOT}{desktop name}.desktop
然后调用
osc add {desktop name}.desktop.in
osc rm {desktop name}.desktop
将翻译回溯到较旧的 openSUSE 产品的技巧
在 preamble 中,添加
Source{another_number}: {desktop name}.desktop.in
除了现有的
Source{number}: {desktop name}.desktop
但添加注释
# Ready made desktop file for products that don't support %%translate_suse_desktop.
# You can be prompted for the update during the Factory build.
Source{number}: {desktop name}.desktop
在 %prep 中,执行
%if 0%{?suse_version} > 1560
cp %{SOURCE{another_number}} %{desktop_file_name}.desktop.in.in
%else
cp %{SOURCE{number}} %{desktop_file_name}.desktop
%endif
在 %build 中,添加 (最好作为第一个操作)
%if 0%{?suse_version} > 1560
%translate_suse_desktop %{desktop_file_name}.desktop
if ! diff {desktop name}.desktop %{SOURCE{number}} ; then
cat <<EOF
A new version of desktop file exists. Please update {desktop name}.desktop
rpm source from $PWD to get translations to older products.
EOF
echo "Warning: Embedded desktop translation is out of date."
# exit 1
fi
%endif
这种方法有一个缺点:每当 translate-suse-desktop 为该桌面文件带来新的翻译时,Factory 构建就会失败。(注意:最近我们建议注释掉 exit 1。另一方面,失败修复可以很容易地自动化。)
另一种方法也是可行的:例如,将完全翻译的桌面文件放入 OTHER 目录,然后通过 osc getbinaries 作为 pre_checkin.sh 的一部分来提取它们。
联系方式
如果遇到问题,请联系 Stanislav Brabec。