2017-04-26 25 views
0

Qtを使用していて、Qtウィジェットで表示されている「ネイティブ」のテキストを翻訳したいと思っています。 「ネイティブに表示されたテキスト」では、テキストの編集(コピー、貼り付けなど)のコンテキストメニューに表示されているものを参照しています。ここでQt - 組み込みの翻訳を使用する

は、私がすでにやったです:

#include <QApplication> 
#include <QDebug> 
#include <QTranslator> 

#include <QFile> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTranslator translator; 
    if(translator.load("qt_fr.qm", QApplication::applicationDirPath())) { 
     qDebug() << a.installTranslator(&translator); 
    } 

    qDebug() << QFile::exists(QApplication::applicationDirPath() + "/qt_fr.qm"); // just to debug file existence 

    // MainWindow w;  // not related to my question 
    // w.showMaximized(); // neither is this 

    return a.exec(); 
} 

qt_fr.qmファイルはQt5.6.2とMinGWのユーザーのためのpath_to_qt/Qt5.6.2/5.6/mingw49_32 /翻訳に位置しています。上記のファイルを実行中のソフトウェアディレクトリにコピーしますが、トランスレータは常にそのファイルをロードできません。しかし、自分自身のqmファイル(Qt lupdateとlreleaseツールを使って.tsファイルから構築)を使用すると、qmファイルが適切に読み込まれ、インストールされます。

私に行方不明または間違っていることがありますか?

+0

Qtは最初に接尾辞(デフォルトでは '.qm')を追加するので、ファイル名の引数から削除することをお勧めします。ドキュメントでは、第1引数として 'QLocale'を受け付けるオーバーロードを使用することを推奨しています。たとえば、 'translator.load(QLocale :: French、" qt "、QApplication :: applicationDirPath())'などです。 –

+0

確かにそうです。ファイル名に拡張子が追加されていなければ、ロードプロセスは簡単です。しかし、ロードが失敗したときにQtがバックトラックして再試行するので、.qm拡張を追加しても失敗することはありません。 QLocaleでバージョンも試しましたが、それでも動作しません。他の提案は歓迎されるでしょう。 – misterFad

+0

さらに、QLocaleを使用すると、ロードするqmファイルが、ソフトウェアを実行しているOSにインストールされている言語と一致することが前提となります。しかし、[ときどき](https://camo.githubusercontent.com/8e48efe46e756e80f900584241c5c108ebc7fcef/68747470733a2f2f757365722e6f632d7374617469632e636f6d2f75706c6f61642f323031372f30312f32362f31343835343536393833393335385f696d6734372e706e67)(例えば)ドイツ語でありながら、私たちは英語を選択することができます。 私の独自の.qmファイル(lupdate&lrelease)を使用すると、上記の私のスニペットがうまく動作しますが、Qtの組み込み.qmファイルの読み込みには、読み込みプロセスが失敗します。 – misterFad

答えて

1

私はこの問題は、完全なメッセージカタログをコピーしていない可能性があると考えています。彼らの標準の場所にQMファイルを使用して、Debianシステム上で私のために、次の作品、:

#include <QApplication> 
#include <QDebug> 
#include <QLocale> 
#include <QTranslator> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTranslator translator; 
    const QString dir = "/usr/share/qt5/translations"; 

    if (translator.load("qt_fr", dir)) { 
     qDebug() << "first load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 

    if (translator.load(QLocale::French, "qt", "_", dir)) { 
     qDebug() << "second load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 
} 

出力が

first load succeeded: 'Open' => "Ouvrir" 
second load succeeded: 'Open' => "Ouvrir" 

Qtは最初のことをしようとすると(私は、ファイル名から.qmを削除していますまた、特定のロケールオブジェクトからファイル名を構成する方法も示しました)。

我々はlconvert -of ts /usr/share/qt5/translations/qt_fr.qmを使用してqt_fr.qmファイルを検査した場合、我々はそれが参照することにより、他のファイルを組み込んだだけで、非常に小さなファイルです見ることができます:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE TS> 
<TS version="2.1" language="fr_FR"> 
<dependencies> 
<dependency catalog="qtbase_fr"/> 
<dependency catalog="qtscript_fr"/> 
<dependency catalog="qtquick1_fr"/> 
<dependency catalog="qtmultimedia_fr"/> 
<dependency catalog="qtxmlpatterns_fr"/> 
</dependencies> 
</TS> 

私はあなたの症状の原因として最も可能性が高いが、その一つであると思いますより多くの依存ファイルをロードできませんでした。これらのファイルのすべてが、qt_fr.qmをコピーしたのと同じ場所にあることを確認するか、「ベース」の翻訳だけが必要な場合はqtbase_fr.qmをコピーして、translator.load()の呼び出しを適切に変更してください。

+0

実際、依存ファイルをコピーしていないので、qmファイルを読み込む際に常にトランスレータが失敗しました。私は現在、テキスト編集コンテキストメニューのみを翻訳したいので、** qtbase_fr **の読み込みは私のニーズに完全に適合し、依存ファイルは不要です。ありがとうございました。ありがとうございました。 :) Btwあなたはlconvertツールについてどのように知っていますか?それは私がそれを聞いたことがない、私はQtの新しくはないと誰かが私に言っていない限り、私は私を助けたかもしれない魔法の秘訣を知っている。 _時には、ネイティブの英語のスピーカーではない、と申し訳ありません。 – misterFad

+1

LConvertはよく知られているようではないようです。Qtのドキュメントには簡単に触れておきますが、マニュアルページはありません。私が知っていることはすべて、lconvert -helpを使って学びました。そして、はい、私はあなたが 'qtbase'翻訳だけを必要とするかもしれないと示唆していたはずですが、私の助けなしでそれを働かせたようです! :-)私は、最後の段落を将来の読者のために少し編集しました。 –

+0

ところで、あなたが本当に* 10倍のupvoteを与えたいならば、ちょうどもう少し評判をつけて、[賞金を授与できます](/ help /特権/ set-bounties)。私は、しかし、あなたが得るものを保持しないで幸せです。 –

関連する問題