2

私は Qt アプリケーションを作成しており、さまざまな言語をリストする QCombobox を使用して動的翻訳を追加しました ( http://www.qtcentre.org/wiki/index.php?title=Dynamic_translation_in_Qt4_applicationsの例に従いました)。うまく動作しますが、問題は、ダイアログ ウィンドウ内のテキストを動的に翻訳する方法がわからないことです (たとえば、[はい] ボタンと [いいえ] ボタン)。

main.cpp では、アプリを実行する前に、次のものがあります。

QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
a.installTranslator(&qtTranslator);

ダイアログ Windows をユーザー システム言語に変換しますが、アプリの残りの部分と同様に動的に実行したいと考えています。

例のコードは次のとおりです: application.h:

#ifndef APPLICATION_H

#include <QApplication>
#include <QHash>
#include <QStringList>
class QDir;
class QTranslator;

typedef QHash<QString, QTranslator*> Translators;

class Application : public QApplication
{
    Q_OBJECT

public:
    explicit Application(int& argc, char* argv[]);
    ~Application();

    static void loadTranslations(const QString& dir);
    static void loadTranslations(const QDir& dir);
    static const QStringList availableLanguages();

public slots:
    static void setLanguage(const QString& locale);

private:
    static QTranslator* current;
    static Translators translators;
    //static QTranslator* qtTranslator;//test to translate dialog windows
};

#endif // APPLICATION_H

アプリケーション.cpp:

    #include <QDir>
#include <QFileInfo>
#include <QTranslator>
#include <QLibraryInfo>

#include "application.h"


QTranslator* Application::current = 0;
//QTranslator* Application::qtTranslator = 0;//test to translate dialog windows

Translators Application::translators;

Application::Application(int& argc, char* argv[])
    : QApplication(argc, argv)
{

}

Application::~Application()
{
}

void Application::loadTranslations(const QString& dir)
{
    loadTranslations(QDir(dir));

    QString locale = QLocale::system().name().section('_', 0, 0);
    QString language=locale+ "_" + locale;

    if(!QFile::exists(":Localization/Localization/"+language+".qm"))//if system language is not available, load english version
        setLanguage("en_en");
    else
        setLanguage(language);
}

void Application::loadTranslations(const QDir& dir)
{
    // <language>_<country>.qm
    QString filter = "*_*.qm";
    QDir::Filters filters = QDir::Files | QDir::Readable;
    QDir::SortFlags sort = QDir::Name;
    QFileInfoList entries = dir.entryInfoList(QStringList() << filter, filters, sort);
    foreach (QFileInfo file, entries)
    {
        // pick country and language out of the file name
        QStringList parts = file.baseName().split("_");
        QString language = parts.at(parts.count() - 2);
        QString country  = parts.at(parts.count() - 1);
        // construct and load translator
        QTranslator* translator = new QTranslator(instance());
        if (translator->load(file.absoluteFilePath()))
        {
            QString locale = language + "_" + country;
            translators.insert(locale, translator);
        }
    }
}

const QStringList Application::availableLanguages()
{
    // the content won't get copied thanks to implicit sharing and constness
    return QStringList(translators.keys());
}

void Application::setLanguage(const QString& locale)
{
    //test to translate dialog windows
    /*
    QTranslator qtTranslator;
    QString qTLocale=locale.mid(0,2);
    qtTranslator->load("qt_"+ qTLocale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    installTranslator(qtTranslator);
    //*/

    // remove previous
    if (current)
    {
        removeTranslator(current);
    }

    // install new
    current = translators.value(locale, 0);
    if (current)
    {
        installTranslator(current);
    }
}

「//test to translate dialog Windows」とコメントされた行を追加して、ダイアログ Windows の動的翻訳を試みましたが、機能しません (コンパイル時にエラーは発生しませんが、アプリケーションが起動せず、「プログラムが突然停止しました」というエラー メッセージが表示されます)。 "、私は Qt Creator を使用しています)。ありがとう!

4

3 に答える 3

2

だから、同じ問題を抱えた後、ついにこれが機能するようになりました。私の場合、間違っていたことが2つあります。

  1. qt 翻訳ファイルの名前:

    QTranslator qtTranslator;
    qtTranslator.load("qt_de");  // worked in older qt versions
    qtTranslator.load("qtbase_de");  // works for qt5.2
    a.installTranslator(&qtTranslator);
    
  2. QMessageBox の正しい親を持つ。これは考えてみれば明らかですが、見落としがちです。

    QMessageBox::information(someChildOfMainWindow, ...);
    

後者の場合、たまたま a であるが a ではQObjectないクラスにいるQWidget場合は、次のコードを使用してMainWindowどこからでもアクセスできます。

QMainWindow* mw = 0;
foreach(QWidget* widget, QApplication::topLevelWidgets()) {
    if(widget->objectName() == "<your-main-window-class-name-here>") {
        mw = qobject_cast<QMainWindow>(widget);
    }
}
于 2014-11-27T07:21:37.180 に答える
0

Ok Sébastian Lange さん、最後にボックスを作成し、静的なボックス ( QMessageBox::question(..) など) を使用しませんでした。

QMessageBox quitMessageBox;
quitMessageBox.setWindowTitle(tr("Quit"));
quitMessageBox.setWindowIcon(QIcon("myIcon.jpg"));
quitMessageBox.setIcon(QMessageBox::Question);
quitMessageBox.setText(tr("Quit the application?"));
quitMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
quitMessageBox.setDefaultButton(QMessageBox::No);
quitMessageBox.button(QMessageBox::Yes)->setText(tr("Yes"));
quitMessageBox.button(QMessageBox::No)->setText(tr("No"));

その後

quitMessageBox.exec();

そのようにそれは大丈夫です。再度、感謝します!

于 2013-09-24T15:00:52.170 に答える
-1

ダイアログ用のボタンを提供する場合

tr("Yes")

デフォルトのダイアログと同様に、作成された .ts-language ファイル (QtLinguist で編集) にはデフォルトの翻訳が含まれている必要があります。

tr()、変換される指定された引数をマークします。これは、特定のラベルに何が書かれるかわからない場合、それを翻訳することはできないという結論に達します...

于 2013-09-24T10:37:48.253 に答える