我已经创建了一个申请,希望通过Ubuntu 应用程序开发流程。该过程的要求之一是,安装时,所有文件都进入该/opt/extras.ubuntu.com/<appname>
目录。
通过改变包装并在其他人的帮助下我实现了这一点,但现在我面临一个新问题:运行时/opt
我的应用程序的翻译无法加载。
发生的情况如下:除非另有说明,否则包含应用程序翻译的二进制文件(MO 文件)将从/usr/share/locale
(或者在 Ubuntu 的情况下,从/usr/share/locale-langpack
)加载,但在我的应用程序中,由于/opt
要求,它们安装在中/opt/extras.ubuntu.com/qreator/locale
。
理论上没问题,因为获取文本允许指定另一个位置来加载翻译,因此我添加了bindtextdomain
调用来实现:
import gettext
from gettext import gettext as _
gettext.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
gettext.textdomain('qreator')
在某种程度上,这种方法效果很好:命令行上输出的所有消息都按预期翻译。但是它没有解决主要问题:要从 UI Glade 加载翻译,需要再次指定翻译域(相当于gettext.textdomain('qreator')
上面的调用),但它不允许指定从哪里加载翻译(即相当于的 Glade bindtextdomain
,遗憾的是不存在)。以下是我正在使用的代码摘录:
builder = Gtk.Builder()
builder.set_translation_domain('qreator')
# There isn't a way to tell glade to load translations from
# somewhere else than /usr/share/locale here
builder.add_from_file(ui_filename)
这实质上意味着,如果您的应用安装在 中,则无法加载来自 UI 的翻译/opt
。
我现在基本被难住了。有什么办法可以让 Glade 加载来自/opt/extras.ubuntu.com/qreator/share/locale/
而不是 的翻译/usr/share/locale
吗?
答案1
我找到了一个解决方案:使用区域设置Python 模块而不是获取文本
import locale
from locale import gettext as _
locale.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
locale.textdomain('qreator')
感谢 #gtk+ IRC 频道的 Juha Sahakangas 提供的解释:
对于这一特殊情况区域设置需要使用模块来代替获取文本. Python 的获取文本模块是纯 Python 的,它实际上并没有以 C 库可以读取的方式设置文本域,但是区域设置确实如此(通过调用 libc)。只要完成此操作,GtkBuilder 就会按照您要求的方式运行。