そこで、言語の翻訳を作成しましたN
(Qt言語学者を使用)。私は自分のアプリを、それぞれの翻訳された文字列N
のような接頭辞_en_US
または埋め込みが異なるアプリにコンパイルしたいと思います。_fr_FR
また、すべての翻訳バージョンが含まれている現在のプラットフォーム言語を自動的に判別する1つのバージョンのアプリを保持したいと思います。.pro
このような結果を得るには、ファイルをどのように変更すればよいですか?
質問する
170 次
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_ID
qmakeを再度実行する必要があることに注意してください(おそらく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 に答える