2

そこで、言語の翻訳を作成しましたN(Qt言語学者を使用)。私は自分のアプリを、それぞれの翻訳された文字列Nのような接頭辞_en_USまたは埋め込みが異なるアプリにコンパイルしたいと思います。_fr_FRまた、すべての翻訳バージョンが含まれている現在のプラットフォーム言語を自動的に判別する1つのバージョンのアプリを保持したいと思います。.proこのような結果を得るには、ファイルをどのように変更すればよいですか?

4

1 に答える 1

1

すべての翻訳を埋め込み、実行時にどれをロードするかを決定する方がはるかに簡単だと思います。おそらく、コマンドラインスイッチまたはシステムロケールを上書きするオプションを提供できます。それらを実行可能ファイルに埋め込む必要はありません。「translations」ディレクトリに入れて出荷することができます。実行時にシステムロケールを取得するには、QLocaleクラスを使用できます。

Application application(argc, argv);

QString locale = QLocale::system().name();
QString translationsDir = ":/translations";

QTranslator appTranslator;
QTranslator qtTranslator;

appTranslator.load(locale, translationsDir);
qtTranslator .load("qt_" + locale,
                    QLibraryInfo::location(QLibraryInfo::TranslationsPath));

application.installTranslator(& appTranslator);
application.installTranslator(& qtTranslator);

とにかく、本当に自分のやり方でやりたいのであれば、環境変数LANGUAGE_IDを使用してビルドに埋め込む言語を検出し、使用可能な言語ごとにプロジェクトを再構築できます。かなり時間がかかるかもしれませんが、それは最終ビルドでしかできないかもしれません。

次に例を示します。

#include <iostream>

int main(int argc, char *argv[])
{
#ifdef EMBED_ONLY_ONE_LANGUAGE
    std::cout << "Embedded language is " << LANGUAGE_ID << std::endl;
#elif EMBED_ALL_LANGUAGES
    std::cout << "Embedded all languages" << std::endl;
#else
    std::cout << "What???" << std::endl;
#endif
}

そしてここに.proファイルがあります:

TEMPLATE = app
DEPENDPATH += .
INCLUDEPATH += .
TARGET = SomeName

CONFIG -= qt
CONFIG += console

# Input
SOURCES += main.cpp

# It seems that "equals" does not work with environment variables so we
# first read it in a local variable.
LANGUAGE_ID=$$(LANGUAGE_ID)

equals(LANGUAGE_ID,) {
    # No language id specified. Add the build instructions to embed all the
    # translations and to decide at runtime which one to load.
    message(No language id specified)

    # This adds a preprocessor variable so that the program knows that it has
    # every language.
    DEFINES *= EMBED_ALL_LANGUAGES
} else {
    # A language id was specified. Add the build instructions to embed only
    # the relative translation.
    message(Specified language id: $$LANGUAGE_ID)

    # This adds a preprocessor variable LANGUAGE_ID whose value is the language.
    DEFINES *= LANGUAGE_ID=\\\"$$LANGUAGE_ID\\\"

    # This adds a preprocessor variable so that the program knows that it has
    # only one language.
    DEFINES *= EMBED_ONLY_ONE_LANGUAGE

    # This renames the executable.
    TARGET=$${TARGET}_$$(LANGUAGE_ID)
}

文書化されていないテスト関数equalsを利用します。環境変数の値を変更した場合は、LANGUAGE_IDqmakeを再度実行する必要があることに注意してください(おそらくMakefileを削除した後)。

(おそらくより良い)代替手段は、CMakeを使用し、言語IDをCMakeのコマンドライン変数として指定することです。

cmake_minimum_required(VERSION 2.6)
project(SomeName)

set(SOURCES main.cpp)

add_executable(SomeName ${SOURCES})

if(${LANGUAGE_ID} MATCHES "[a-z][a-z]_[A-Z][A-Z]")
    # A language id was specified. Add the build instructions to embed only
    # the relative translation.
    message("Embedding language ${LANGUAGE_ID}")

    # This adds a preprocessor variable LANGUAGE_ID whose value is the language.
    add_definitions("-DLANGUAGE_ID=\"${LANGUAGE_ID}\"")

    # This adds a preprocessor variable so that the program knows that it has
    # only one language.
    add_definitions("-DEMBED_ONLY_ONE_LANGUAGE")

    # This renames the executable.
    set_target_properties(SomeName PROPERTIES OUTPUT_NAME "SomeName_${LANGUAGE_ID}")

else(${LANGUAGE_ID} MATCHES "[a-z][a-z]_[A-Z][A-Z]")
    # No language id specified. Add the build instructions to embed all the
    # translations and to decide at runtime which one to load.
    message("Not embedding any language")

    # This adds a preprocessor variable so that the program knows that it has
    # every language.
    add_definitions("-DEMBED_ALL_LANGUAGES")

endif(${LANGUAGE_ID} MATCHES "[a-z][a-z]_[A-Z][A-Z]")
于 2012-06-11T08:20:27.033 に答える