判断是否社区版、如何显示 Logo 以及获取发行版名称
判断是否社区版、如何显示 Logo 以及获取发行版名称
应用有时会收到类如在某个特定版本中不包含指定功能的需求,例如“社区版不包含开发者模式”、“社区版显示 deepin 字样”、“社区版提供以管理员身份打开”等。对于这些问题,尽管看上去是可以直接通过判断是否为社区版来做到,但实际都应采取不同的方案实现。下面即提供了从 DTK 中获取此类信息的途径以及概述如何判断选取那种方案进行实现的方式。
# 目录
[TOC]
应用有时会收到类如在某个特定版本中不包含指定功能的需求,例如“社区版不包含开发者模式”、“社区版显示 deepin 字样”、“社区版提供以管理员身份打开”等。对于这些问题,尽管看上去是可以直接通过判断是否为社区版来做到,但实际都应采取不同的方案实现。下面即提供了从 DTK 中获取此类信息的途径以及概述如何判断选取那种方案进行实现的方式。
# 获取信息的途径
DTK 中的 DSysInfo 提供了此类需求所对应的可能适用的信息,包括如下这些。
# 判断是否是 Deepin
由于 DDE 本身可以在很多发行版中运行,例如官方的 UOS 和 Deepin,以及社区维护的 Archlinux 和 Ubuntu 等。DSysInfo 中包含了名为 ProductType 的枚举,对应了常见的发行版类型。若需判断当前发行版是否为 Deepin,则只需通过静态函数 DSysInfo::productType()
即可获得对应枚举。
注意:Deepin 曾经也有专业版和服务器版提供给厂商,故不能简单的通过判断是否为社区版来判断是否应当显示 Deepin,对于此类判断应当显示何种版本的需求,请看下一条。
# 判断系统类型是否为社区版、专业版、服务器版、个人版
由我们官方维护的版本包括了社区版、专业版、服务器版和个人版这些不同类型的版本,以后也可能会有新增版本。在 DSysInfo 中提供了静态函数 DSysInfo::deepinType()
来对应 /etc/deepin-version
文件里提供的对应版本信息。
需要注意的是,在 deepin-version
配置文件中,早期 Deepin
社区版使用的为 Desktop
(即桌面版)作为社区版字段,现在我们也仍然保持了这个记法。
# 判断是否为社区版版本
为了方便,DTK 提供了 DSysInfo::isCommunityEdition()
静态函数判断当前版本是否为社区版,当前(2020/04/09)的实现逻辑为,如果当前使用的版本不是专业版、个人版或服务器版,且当前的发行版不是 UOS (UOS 不提供社区版)的话,则认为当前是社区版。
注意:非 Linux 环境下(例如 Windows 下),此函数调用一律返回 true 。
# 获得应当显示的 Logo、名称和网站网址
在 v20
后的版本,Deepin
和 UOS
提供了 /usr/share/deepin/distribution.info (opens new window) 配置文件用以针对不同发行版提供不同的定制显示方案,包括了发行版名称、Logo和网站等信息。
DTK 提供了从上述配置文件读取信息的接口,并提供了当配置文件不存在时的显示行为,可以直接使用 DTK
提供的接口获得对应信息。
# Logo:
为了方便,DTK
提供了DSysInfo::distributionOrgLogo()
接口来获取常见场景下应当显示的 Logo
。其中对于第一个参数 Logo
,保持 DSysInfo::OrgType
为 Distribution (默认值,表示发行版本身),并通过第二个参数传递不同类型即可获得不同类型的 Logo,另可以通过第三个参数获得回落选项,便于当无对应配置时显示自己的提供的 Logo
。
此接口提供了四种类型的 Logo,分别为普通大小(Normal)、小尺寸 Logo (Light,关于对话框使用此 Logo)、纯色符号化 Logo(Symbolic,预留的类型,暂时不建议使用)、和透明 Logo(Transparent,用于水印等场景)。简单起见,可以直接打开 /usr/share/deepin/distribution
位置来核对 Logo 是否符合需求。
# 网址和名称:
通过 DSysInfo::distributionOrgName
和 DSysInfo::distributionOrgWebsite
即可获取定制的显示名称和网址。
注意:此处的名称是适用于对用户展示的名称,和当前使用的是何种发行版无关,例如配置文件可以提供“统一操作系统”等名称,实际发行版类型建议通过 productType
接口判断。
# 如何选择实现方案
当有版本差异需求时,应当先明确差异本身通过何种手段进行控制。具体情况应当视实际情况决定,但通常可以根据如下原则判断:
# 如有可能,尽可能不依赖发行版类型和系统版本类型来判断功能是否应当屏蔽或展示
对于可以通过判断所需功能的接口是否存在的情况,直接判断接口是否存在,而不需要判断发行版或系统版本。
例如如下需求不应当判断是否为社区版来决定是否显示:
- 社区版不显示语音输入相关的菜单(可以通过判断语音相关的接口是否存在而定,社区版只需要不预装对应软件包,对应接口即不存在)
# 应当明确需求是在特定发行版存在还是特定系统类型存在:
应当确认自己的需求到底是只和发行版有关还是只和是否是商业版本有关,简单起见可以假定两个场景来判断:“我的需求,在 Deepin 专业版 中应当具有怎样的行为”和“我的需求,在 Archlinux DDE 桌面环境中应当具有怎样的行为”。
如下需求不应当判断是否为社区版来决定其行为:
- 社区版显示 Deepin,专业版显示 UOS(Deepin 也有专业版,此需求应当通过获得名称或 Logo 的接口,或者通过判断发行版类型 / productType 的方式进行判断)
# 其它常见问题
# Q:关于对话框的发行版 Logo 和文案,需要应用开发者进行额外操作来设置吗?
A:不需要。
# Q:DTK 所提供的接口实际对应了哪个配置文件的哪个属性?
A:如下:
- DSysInfo::distributionOrgName - 表示此提供 Deepin/DDE 的发行版的名称,对应 /usr/share/deepin/distribution.info (opens new window) 内的 [distribution] 组下的 Name 字段值,为空时 fallback 值为 Deepin 。
- DSysInfo::productTypeString - 对应 /etc/os-release 或 /usr/lib/os-release 的 ID 字段,或 /etc/lsb-release 的 DISTRIB_ID 字段
- DSysInfo::deepinTypeDisplayName - 表示“社区版(Desktop)、专业版(Professional)、服务器版(Server)、个人版(Personal)”对应 /etc/deepin-version 中 Type 字段的值
# Q:我可以通过变更 /etc/deepin-version 中 Type 的值来达到修改显示文案的做法吗?
A:对于本地化的文案,可以。对于非本地化的文案,不可以。
由于大多数应用依赖 DTK 提供的接口来获得当前的版本类型等信息,此处 Type 对应了 DSysInfo::DeepinType 枚举的值,由于 DTK 要保证兼容性,故无法随意变更解析规则。
若确实有充足的理由进行此类变更(一般会拒绝随意修改此配置),应当发起需求变更申请并由开发评估讨论,并尽可能采取不影响二进制(ABI)兼容和接口(API)兼容的方案进行变更。变更请协调 deepin-desktop-base 包的维护者(当前 @赖洪圣 )和 DTK 的 dtkcore 项目维护者 (当前 @陈可 )一同核对。
一般情况下,应用可以并应当通过 DSysInfo::DeepinType
枚举自行进行差异化显示行为。