2017-04-24 75 views
1

我正在尝试使用Java读取.qm翻译文件。 .qm文件是二进制文件。我无法访问.ts文件。 而我没有找到关于这些.qm文件的很多信息。 它们是如何构成的? 此致,使用Java读取.qm翻译文件

+0

如果您将Java与Qt C++项目(即Android)一起使用,最简单的解决方案是使用JNI调用C++方法来执行翻译。如果这是我可以举例说明的情况。 – Felix

+0

该应用程序是Java Swing应用程序。我只会阅读(并使用).qm文件。预计没有其他交互作用。但为什么不是JNI。为什么不JNA?你的例子将非常感谢。 – lvr123

回答

0

没有我知道的文件,但如果你看QTranslator::load你应该能够遵循QM文件的格式。

您可能需要在Java中重新实现QTranslator,因为您不仅需要加载文件的能力,还需要以Qt方式提取和应用翻译。

+0

我深入了解这一点。谢谢。 – lvr123

0

按OP的要求:

您可以通过使用Qt库和JNI使用这些文件。通过在C++ dll中使用转换器,您可以轻松转换字符串。但是,您无法提取文件或列出包含的翻译。但如果你需要的只是实际的翻译,这个解决方案应该可以工作。

我不能举一个真实的例子,因为我只是现在它在理论上是如何工作的,我还没有尝试过,因为它不是微不足道的。但是如果你急于尝试,总体思路是:

  1. 创建一个C++的DLL,并针对QtCore构建它。最简单的方法是从他们的网站qt.io下载Qt。你可以例如用QtCreator创建一个默认的库项目。 注意:除了Qt5Core.dll,Qt还需要其他库才能正常运行。它们都包含在安装中,但是一旦部署了应用程序,那当然也必须包含它们。
  2. 将JNI包含在C++项目中并与之链接。如果你是新手,下面是一个很好的教程:Java Programming Tutorial
  3. 创建你的包装方法。 cpp中的方法可以从java调用带有java字符串的方法,将它们转换为QString,使用QTranslator转换它们并将它们转换回来。
  4. 负荷的Java库和执行这些方法

重要:
首先,我不知道java中如何处理DLL依赖。如果您在加载dll时遇到错误,可能是因为您的dll的依赖关系不存在。其次,Qt通常需要在主线程中运行大多数操作的QCoreApplication。我没有这样的应用程序测试翻译,它的工作。显然,翻译只有应用程序是不需要的。然而,根据你在你的dll中做什么,我认为这很重要。

如果您需要更多的细节,请随时询问。

+0

构建整个JNI说唱歌手是非常地狱,尤其是当你不熟悉C++和qt时。构建整个JNI说唱歌手是非常地狱。从头开始构建它有点矫枉过正,因为我愿意这样做。不管怎么说,还是要谢谢你。我会试着直接用Java读取文件。 – lvr123