我想编写一个基于 Python ( PySide ) 和QML的QtQuick应用程序。
我知道 Qt 应用程序有自己的翻译技术,但我想坚持使用gettext来解决这个问题。我想知道是否可以:
.pot文件我知道这是在Unity 2D 代码中完成的,在 C++ 中,所以我想知道如何使用 Python 完成它。
注意:我说的是在运行时只使用 gettext,而不是在 gettext 和 Qt Linguist 格式之间进行转换。
我创建了一个应用程序,希望通过Ubuntu 应用程序开发人员流程提交。该过程的要求之一是安装后,所有文件都进入该/opt/extras.ubuntu.com/<appname>目录。
通过改变包装并在其他人的帮助下,我已经实现了这一点,但现在我面临一个新问题:/opt从我的应用程序运行的翻译没有被加载。
会发生以下情况:除非另有说明,否则包含应用程序翻译的二进制文件(MO 文件)是从/usr/share/locale(或在 Ubuntu 的情况下,从/usr/share/locale-langpack)加载的,但在我的应用程序中,由于/opt要求,它们安装在/opt/extras.ubuntu.com/qreator/locale.
这在理论上很好,因为gettext允许指定一个替代位置来加载翻译,所以我添加了bindtextdomain调用来实现这一点:
import gettext
from gettext import gettext as _
gettext.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
gettext.textdomain('qreator')
Run Code Online (Sandbox Code Playgroud)
这在一定程度上很有效:在命令行上输出的所有消息都按预期翻译。但这并没有解决主要问题:从 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)
Run Code Online (Sandbox Code Playgroud)
这实质上意味着如果您的应用程序安装在/opt.
我几乎被困在这一点上。关于如何使 Glade 从而/opt/extras.ubuntu.com/qreator/share/locale/不是加载翻译的任何想法 …
我在 Ubuntu 16.10 Yakkety Yak 中通过 snap 包安装了 VLC。但是安装是用英语完成的(我的 Ubuntu 版本是西班牙语)
基本上在Snap (snapcraft?) 和翻译的应用程序以及它如何更改 vlc (snap) 中的语言以及 VLC 的翻译文件中提出了相同的问题:
$ locate /vlc.mo
/snap/vlc/1/share/locale/ach/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/af/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/am/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/an/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ar/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ast/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/az/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/be/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/bg/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/bn/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/bn_IN/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/br/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/bs/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ca/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/cgg/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ckb/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/co/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/cs/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/cy/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/da/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/de/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/el/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/en_GB/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/es/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/et/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/eu/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/fa/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ff/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/fi/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/fr/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/fur/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ga/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/gd/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/gl/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/gu/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/he/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/hi/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/hr/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/hu/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/hy/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ia/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/id/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/is/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/it/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ja/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ka/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/kk/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/km/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/kn/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ko/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/ky/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/lg/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/lt/LC_MESSAGES/vlc.mo
/snap/vlc/1/share/locale/lv/LC_MESSAGES/vlc.mo …Run Code Online (Sandbox Code Playgroud) 我正在尝试安装glib-2.37.6(也有同样的问题glib-2.32.1)并在配置过程中收到此错误:
您必须在 C 库中具有 gettext 支持,或者使用 GNU gettext 库。( http://www.gnu.org/software/gettext/gettext.html
不过,我以前构建过gettext。澄清一下,我正在尝试构建一些东西(导致gtk+),而没有在通常的地方实际安装,因为这是其他人使用的机器;相反,我使用--prefix=将所有内容放在我的主目录下的工作目录中。
我试着查看日志,看看我是否能得到关于是否需要设置其他任何东西的线索。我也尝试查看configure脚本,尽管我不是autoconf. 我发现发生错误是因为gt_cv_have_gettext没有设置为yes. 然后我寻找它应该在哪里设置,以便我可以知道它正在检查什么文件或任何内容。但是,除非我遗漏了某些东西,否则将其设置为的唯一命令就yes在此之下if:
if test "$gt_cv_func_dgettext_libc" != "yes" \
|| test "$gt_cv_func_ngettext_libc" != "yes" \
|| test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
Run Code Online (Sandbox Code Playgroud)
的config.log(看configure行号)表示该条件是假的,所以里面的一切(包括指令集gt_cv_have_gettext)被跳过。但是该测试似乎检查了三件事中没有任何一件遗漏。他们都不是;这是config.log错误发生前的最后一段:
configure:7982: checking for ngettext in libc
configure:8000: gcc -o conftest -g -O2 conftest.c >&5
configure:8000: $? …Run Code Online (Sandbox Code Playgroud) 我是新使用xgettext命令。所以我不知道我做错了什么。
我输入命令:
xgettext -n *.php -o --output='/home/public/sample'
Run Code Online (Sandbox Code Playgroud)
在我的脚本中,但出现错误:
xgettext: cannot create output file "--output=/home/public/sample": No such file or directory`
Run Code Online (Sandbox Code Playgroud)
但是当我运行时xgettext -n *.php- messages.po 文件会在我的当前目录中创建!有没有办法指定创建文件的位置messages.po?
我正在使用多种语言文件,有时源文件采用 .qm/.ts 格式。我正在使用 Qt Linguist/Gtranslator/POEdit,但据我所知,这些文件都不能将这些文件转换为 .mo/.po。有没有任何程序可以做到这一点?
gettext ×6
qt ×2
translation ×2
glade ×1
glib ×1
localization ×1
python ×1
qml ×1
snap ×1
unity ×1