此问题应在PyQt4和PyQt5的下一个PyQt版本中修复:
http://www.riverbankcomputing.com/pipermail/pyqt/2015-April/035772.html
pylupdate4
获取项目文件(.pro
),其中文件路径相对于.pro
文件本身。
解析代码时,pylupdate4
会将路径复制到.ts
文件。
当Qt Linguist读取.ts
文件时,它会考虑相对于.ts
文件的路径,而不是.pro
文件。因此,它没有找到源文件,也无法在翻译时显示代码。
如何让Qt Linguist显示源代码?
我可以将.pro
文件放在ts/
目录中,并附带.ts
个文件,但这看起来像是一个令人遗憾的解决方法。这是它的意思吗?
考虑到Qt Linguist的行为,不应pylupdate4
在.ts
文件中写入相对于.ts
文件本身的路径,而不是.pro
文件
?
我的PyQt项目结构如下:
src/
my_software.py
my_software.pro
my_software/
module_1.py
module_2.py
submodule_1/
submodule_1_module_1.py
submodule_1_module_2.py
resources/
ui/
module_1.ui
module_2.ui
submodule_1/
submodule_1_module_1.ui
submodule_1_module_2.ui
i18n/
ts/
my_software_fr.ts
my_software_fr.qm
tools/
tool_1.py
项目文件(my_software.pro)如下所示:
FORMS = resources/ui/module_1.ui resources/ui/module_2.ui resources/ui/submodule_1_module_1.ui resources/ui/submodule_1_module_2.ui
SOURCES = my_software/module_1.py my_software/module_2.py resources/ui/submodule_1_module_1.py resources/ui/submodule_1_module_2.py
TRANSLATIONS = i18n/ts/my_software_fr.ts
Qt Linguist搜索例如
中的文件/absolute/path/to/project/src/i18n/ts/my_software/module_1.py
而不是
/absolute/path/to/project/src/my_software/module_1.py
.ts
(my_software_fr.ts)文件看起来像
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr_FR">
<context>
<name>Class</name>
<message>
<location filename="my_software/module_1.py" line="134"/>
<source>Source text</source>
<translation>Translated text</translation>
Qt Linguist版本4.8.6
pylupdate4
版本4.8.6
在source code of PyQt v4.11.3文件metatranslator.cpp,l.470-471中,文件路径应该相对于.ts文件写入:
QDir tsPath = QFileInfo(filename).absoluteDir();
QString fn = tsPath.relativeFilePath(msg.fileName()).replace('\\','/');
t << " <location filename=\"" << fn << "\" line=\"" << msg.lineNumber() << "\"/>\n";
但relativeFilePath()
期望绝对路径。当给定相对路径时,它返回相对paht。在我的例子中,msg.fileName()
是我在.pro
文件中输入的相对路径。
我可以修补pylupdate来解决这个问题:
--- metatranslator.cpp.bak 2015-03-12 10:39:18.984232622 +0100
+++ metatranslator.cpp 2015-03-12 10:37:36.225524474 +0100
@@ -471,8 +471,10 @@
t << ">\n";
if (!msg.fileName().isEmpty() && msg.lineNumber() >= 0) {
QDir tsPath = QFileInfo(filename).absoluteDir();
- QString fn = tsPath.relativeFilePath(msg.fileName()).replace('\\','/');
- t << " <location filename=\"" << fn << "\" line=\"" << msg.lineNumber() << "\"/>\n";
+ QDir curdir = QDir(".");
+ curdir.makeAbsolute();
+ QString fn = tsPath.relativeFilePath(curdir.filePath(msg.fileName())).replace('\\','/');
+ t << " <location filename=\"" << fn << "\" line=\"" << msg.lineNumber() << "\"/>\n";
}
t << " <source>" << evilBytes( msg.sourceText(),
msg.utf8() )
或.pro文件是否应包含绝对路径?!
答案 0 :(得分:1)
你的问题的答案应该是消除pro
文件,并从命令行(或者更好,通过makefile)做一切。
但是,Qt的lupdate
工具提供了几个关键选项,这些选项不适用于pylupdate
(最重要的是-locations
和-codecfortr
)。
没有这些,似乎唯一合理的做法是将所有翻译文件放在一个目录中,并确保相对于它引用所有相关路径。对我来说,这看起来是一个完全可以接受的解决方案,因为pyqt项目的其他任何部分都不应该关心pro
文件(与C ++项目不同)。