【问题标题】:qmake and generated qm filesqmake 和生成的 qm 文件
【发布时间】:2016-07-26 11:39:30
【问题描述】:

将已编译的翻译 (*.qm) 组织到资源中的最佳(正确)方法是什么? *.qm 文件在 qrc 文件中引用并由两(三)个额外目标以这种方式生成:

trans_update.commands = lupdate $$_PRO_FILE_
trans_update.depends = $$_PRO_FILE_

trans_release.commands = lrelease $$_PRO_FILE_
trans_release.depends = trans_update $$TRANSLATIONS

translate.depends = trans_release

QMAKE_EXTRA_TARGETS += trans_update trans_release translate deploy

CONFIG(release, debug|release) {
   DESTDIR=release
   PRE_TARGETDEPS += translate
}

但问题是在 qmake 第一次运行时,还没有生成任何 qm 文件,并且 make 打印错误如下:

    RCC: Error in 'qml.qrc': Cannot find file ...

我不喜欢将已编译的 qm 文件保存到 VSC 中的想法。

有没有办法很好地组织它?

【问题讨论】:

  • 我想到的第一件事是:忽略有关 VCS 的 *.qm 文件怎么样?几分钟后我可能会想出更好的解决方案。
  • 谢谢,如果 qrc 文件引用 *.qm 文件似乎是一个解决方案

标签: qt qmake rcc


【解决方案1】:

我想指出一个我在一些项目中使用的解决方案。它可能远非完美,但效果很好。

CONFIG(release, debug|release) {
    TRANSLATION_TARGET_DIR = $${OUT_PWD}/release/translations
    LANGUPD_OPTIONS = -locations relative -no-ui-lines
    LANGREL_OPTIONS = -compress -nounfinished -removeidentical
} else {
    TRANSLATION_TARGET_DIR = $${OUT_PWD}/debug/translations
    LANGUPD_OPTIONS =
    LANGREL_OPTIONS = -markuntranslated "MISS_TR "
}

isEmpty(QMAKE_LUPDATE) {
    win32:LANGUPD = $$[QT_INSTALL_BINS]\lupdate.exe
    else:LANGUPD = $$[QT_INSTALL_BINS]/lupdate
}

isEmpty(QMAKE_LRELEASE) {
    win32:LANGREL = $$[QT_INSTALL_BINS]\lrelease.exe
    else:LANGREL = $$[QT_INSTALL_BINS]/lrelease
}

langupd.command = \
    $$LANGUPD $$LANGUPD_OPTIONS $$shell_path($$_PRO_FILE_) -ts $$_PRO_FILE_PWD_/$$TRANSLATIONS

langrel.depends = langupd
langrel.input = TRANSLATIONS
langrel.output = $$TRANSLATION_TARGET_DIR/${QMAKE_FILE_BASE}.qm
langrel.commands = \
    $$LANGREL $$LANGREL_OPTIONS ${QMAKE_FILE_IN} -qm $$TRANSLATION_TARGET_DIR/${QMAKE_FILE_BASE}.qm
langrel.CONFIG += no_link

QMAKE_EXTRA_TARGETS += langupd
QMAKE_EXTRA_COMPILERS += langrel
PRE_TARGETDEPS += langupd compiler_langrel_make_all

可能会对 lupdate 选项进行合理的调整,因为各种构建(发布和调试)会生成不同的 *.ts 文件,然后触发所用 VCS 的更改。

我还想将有兴趣的读者引导到专家使用它的example

【讨论】:

  • 谢谢,虽然不是明确的答案,但很有帮助
  • @IlyaKitaev 你必须清楚地阅读它:查看包含选项-qm <path>lrelease 调用的参数。这可能有助于组织。而且我不会将它们组织到任何资源文件中,因为它们是(*.qm 文件)一种构建产品,每次(发布)构建时都会创建。
  • 我注意到 _PRO_FILE__PRO_FILE_PWD_ 变量输入错误
  • @Piroxiljin 谢谢,现已修复。
【解决方案2】:

推荐的方法——在最初提出这个问题时可能不可用,是使用

TRANSLATIONS += <your *.ts files>
CONFIG += lrelease embed_translations

如果您真的需要/想要单独构建 qm 文件,我会指出 qmake 对上述配置的作用并根据您的需要进行调整。见https://github.com/qt/qtbase/blob/5.15.2/mkspecs/features/lrelease.prf (基本上,它会创建资源列表并将其添加到RESOURCES)。

【讨论】:

  • 感谢这个被低估的解决方案。我将添加以下内容,然后将生成的翻译二进制文件加载到前缀“i18n”下。最好的问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多