Qt Linguist和pylupdate4:.ts文件中相对路径的基础?

时间:2015-03-11 13:43:41

标签: qt4 pyqt4

编辑2015年3月3日

此问题应在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文件是否应包含绝对路径?!

1 个答案:

答案 0 :(得分:1)

你的问题的答案应该是消除pro文件,并从命令行(或者更好,通过makefile)做一切。

但是,Qt的lupdate工具提供了几个关键选项,这些选项不适用于pylupdate(最重要的是-locations-codecfortr)。

没有这些,似乎唯一合理的做法是将所有翻译文件放在一个目录中,并确保相对于它引用所有相关路径。对我来说,这看起来是一个完全可以接受的解决方案,因为pyqt项目的其他任何部分都不应该关心pro文件(与C ++项目不同)。