[bug] Debian 11的 MIME freedesktop.org.xml 配置文件里<comment xml:lang="zh-CN">标签严重错误

[bug] Debian 11的 MIME freedesktop.org.xml 配置文件里标签严重错误

2023-1-14

错误描述:

误把带 “下划线”的所有语言字符串,如 zh_CN, zh_TW, en_GB,
写成了"中划线",如 zh-CN, zh-TW

后果:导致某些文件类型的描述,始终只能显示为英语,不能根据 当前系统语言设定,显示为对应的语种.

查了下相关 deb 包,包名是 shared-mime-info

dpkg -S freedesktop.org.xml
shared-mime-info: /usr/share/mime/packages/freedesktop.org.xml

检查以往旧版本,发现只有 Debian 11 的这个 DEB 包,才有这个缺陷。
而在旧版本、新版本中,都是写的 下划线。

真TMD扯蛋.Debian 11 更新到 11.6 了,这个 BUG 还不修正.

附、shared-mime-info 各版本 (v1.3, v1.8, v1.10, v2.0, v2.2) DEB 包发布时间:

https://mirrors.huaweicloud.com/debian/pool/main/s/shared-mime-info/

shared-mime-info_2.2-1_amd64.deb 2022-04-30 01:57 (正常)

shared-mime-info_2.0-1_amd64.deb 2020-10-10 02:14 (错误!对应 Debian 11)

shared-mime-info_1.10-1_amd64.deb 2018-09-25 18:55 (正常)


shared-mime-info_1.8-1+deb9u1_amd64.deb 2018-04-03 05:25 (正常)

注:从包名文字 deb9u1 可以看出,对应 Debian 9,且更新过1次。
——我怀疑是不是这个 v1.8 系列的原始版本,就出过这个问题,在后来出的 update1 修正版,改掉了这个毛病。而现的 2.0 版是问题再现,是不是维护者又错误地使用了这个版本线的原文件)

shared-mime-info_1.3-1_amd64.deb 2014-05-15 03:19 (正常)

并没有错误,XML 以及 HTML 都是使用 - 的,见 Extensible Markup Language (XML) 1.0 (Fifth Edition)RFC 4646: Tags for Identifying Languages

首先,非常感谢关注和回复!
其次,个人英文水平一般,没能看得太明白。

我的疑问是:

  1. 为什么偏偏只有 Debian 11 对应的 v2.0 版本的 shared-mime-info 软件包,写成了中划线 zh-CN,
    而其余所有 Debian 版本 (Debian 9, 10, 以及 12), 写的都是下划线 zh_CN ?

  2. 退一步说,也许从语法规范来说,在 XML 语法里,中划线 zh-CN 是合规的。但是,freedesktop.org.xml 的 MIME 数据,对应的中文语言数据如果写成

<comment xml:lang="zh-CN">

则功能是失效的。也就是说:虽然标准正确,但是功能失效?

另外,建议 Debian 11 用户, 以及其它版本的Debian /Ubuntu 用户,也可以自行验证下。
试着把
/usr/share/mime/packages/freedesktop.org.xml 文件里,所有的
中划线的 zh-CN, 全部改成(替换成)下划线 zh_CN, 然后再运行
sudo update-mime-database /usr/share/mime/packages
确认下不同类型的文件类型信息提示,是否有不同的效果。

我看了一下我的,还真是用的下划线……白瞎了 XML 这么好的命名空间设计。(xml 是 XML 自己的命名空间,应该没错吧?)

建议让使用这个文件的程序支持 _ 和 - 两种写法,然后 xml:lang 统一改成 -。或者把 xml: 去掉,直接用 lang

v2.0 版本的 shared-mime-info 软件包使用 itstool 管理文件 freedesktop.org.xml 的翻译:

#!/bin/bash -e

src_root="$1"
build_root="$2"

ninja -C "${build_root}" shared-mime-info-gmo

itstool \
    --its "${src_root}/data/its/shared-mime-info.its" \
    --join "${src_root}/data/freedesktop.org.xml.in" \
    -o "${build_root}/data/freedesktop.org.xml" \
    "${build_root}/po/"*".gmo"

itstool 遵循 BCP47

_locale_pattern = re.compile('([a-zA-Z0-9-]+)(_[A-Za-z0-9]+)?(@[A-Za-z0-9]+)?(\.[A-Za-z0-9]+)?')
def convert_locale (locale):
    # Automatically convert POSIX-style locales to BCP47
    match = _locale_pattern.match(locale)
    if match is None:
        return locale
    ret = match.group(1).lower()
    variant = match.group(3)
    if variant == '@cyrillic':
        ret += '-Cyrl'
        variant = None
    if variant == '@devanagari':
        ret += '-Deva'
        variant = None
    elif variant == '@latin':
        ret += '-Latn'
        variant = None
    elif variant == '@shaw':
        ret += '-Shaw'
        variant = None
    if match.group(2) is not None:
        ret += '-' + match.group(2)[1:].upper()
    if variant is not None and variant != '@euro':
        ret += '-' + variant[1:].lower()
    return ret

其余版本不使用itstool 管理翻译,所以没有这样的现象。严谨地讲,这不是itstool的“错误”,因为它确实是遵循标准的行为。

不,这个版本是为了解决问题 #864953

1 个赞