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 特定的更改

  • 添加 GenericNameComment
  • NameGenericNameComment 更改,与上游不同。
  • 添加 NameGenericNameCommentKeywords 的翻译,这些翻译在 upstream 中不存在。
  • NameGenericNameCommentKeywords 翻译更改,与上游不同。
  • 更改 Categories 或引入新的 Categories,从而有效地更改结构化菜单的布局。

注意事项

有必要审查所有这些更改,思考它们并将它们发送到上游。

对于与上游不同的更改,请考虑 SUSE 特定的更改和不同的翻译可能是在大约 20 年前进行的,并且它们的测试人员社区更小。

审查资源

您可以使用以下资源进行审查

  • NameGenericNameCommentKeywords 是否包含 桌面条目规范 所说的内容?请注意,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