在 Linux 系统(如 Ubuntu)下开发的应用程序应如何操作才能自动检测系统语言?有些应用程序(如 Liferea)会自动更改其语言以匹配系统语言,而不会更改程序本身的任何首选项:这应该是所有程序的“默认”行为吗?
程序中是否应该有一个选项以便让用户选择语言?
这些翻译都是程序自带的吗?如果用户设置的系统语言在程序的翻译中不可用怎么办?
这是 Ubuntu 或大多数 Linux 发行版特有的吗?
答案1
我知道使用 Quickly 和 Launchpad 进行的应用程序开发支持 Translations 来实现这一点。我不是专家,所以除了我的回答之外,请查看以下链接:
http://www.gnu.org/software/gettext/
https://help.launchpad.net/Translations
我的应用程序导入了 gettext 模块,它允许我标记将在程序中向用户显示的字符串。当我的程序通过 Quickly 提交到 Launchpad 时,Launchpad 设置为自动扫描源代码并为标记的字符串生成特殊的翻译模板文件。然后,Kind Launchpad 用户(或开发人员)可以使用模板为他们想要的每个字符串和语言生成翻译。然后,这些翻译文件可以同步到您的源分支并在发布前合并。在运行时,gettext 模块会根据您的系统语言环境用适当的翻译替换标记的字符串。
总而言之,以下是该流程的列表:
- 将 gettext 导入到你的程序中
- 标记需要翻译的字符串
- 在 Launchpad 中设置翻译
- 翻译模板并同步到源
这是我的程序的标题,我通过 locale 导入 gettext (请注意,Quickly 为我添加了所有这些!添加了 locale 和 bindtextdomain 是因为它被放在 /opt/extras.ubuntu.com 中,我认为):
import locale
from locale import gettext as _
locale.bindtextdomain('drawers', '/opt/extras.ubuntu.com/drawers/share/locale')
locale.textdomain('drawers')
_("text to be translated")
现在我只需在整个程序中标记要翻译的文本。
答案2
将来,即使它们相关,我建议为每个问题单独提出问题。无论如何,我都会尝试回答它们:
在 Ubuntu 等 Linux 系统下开发的应用程序该怎么做才能自动检测系统语言?
您只需gettext
在您的应用程序中进行初始化即可。得到文本是 Ubuntu 和大多数其他基于 Linux 的发行版使用的标准国际化和本地化技术(如果我们将 Android 视为发行版,那么它是唯一的例外)。
在最基本的情况下,使用 Python
import gettext
from gettext import gettext as _
locale.bindtextdomain('yourapp', '/usr/share/locale')
locale.textdomain('yourapp')
笔记:
- 在 Python 中,为了支持
/opt
安装,您需要使用locale
库而不是gettext
(对于大多数实际目的而言,它们是等效的) - 几乎所有编程语言都有 gettext 绑定,不仅仅是 Python。
这应该是所有程序的“默认”行为吗?
是的。
程序中是否应该有一个选项以便让用户选择语言?
不可以。如果您想要有这样的选项,您就得自己实现。惯例是每个用户只有一种语言,您只能在一个地方更改它,这会影响系统中的所有应用程序。
所有这些翻译都是随程序本身一起进行的吗?
是的,它们以二进制文件的形式随应用程序一起发送.mo
,每种翻译语言一个。
如果用户设置的系统语言在程序的翻译中不可用,该怎么办?
那么 gettext 默认使用英语作为后备。
这是 Ubuntu 或大多数 Linux 发行版特有的吗?
这是 Linux 发行版的标准行为。