2012-06-11 1 views
2

J'ai donc créé des traductions pour N langues (en utilisant Qt linguist). Je veux compiler mon application en N applications qui diffèrent par le préfixe comme _en_US ou _fr_FR intégrant dans chacune des chaînes traduites. Aussi, je veux garder une version de l'application qui déterminera automatiquement la langue de la plate-forme actuelle ayant toutes les versions de traduction à l'intérieur. Comment dois-je changer mon fichier .pro pour obtenir de tels résultats?est-il possible de compiler des applications séparées pour chaque langue dans Qt?

+2

Mais ... * pourquoi *?!? –

+1

Le point du mécanisme de traduction de Qt est que vous n'avez pas besoin de faire exactement ce que vous demandez. –

+2

@Styne, je pense que le PO sait cela. Pourquoi ne pas essayer de répondre à la question comme donnée? – TonyK

Répondre

1

Je pense qu'il est beaucoup plus facile d'intégrer toutes les traductions et de décider à l'exécution lequel charger. Peut-être que vous pouvez fournir un commutateur de ligne de commande ou une option pour remplacer les paramètres régionaux du système. Vous n'avez même pas à les intégrer dans l'exécutable, vous pouvez les envoyer dans un répertoire "translations". Pour obtenir les paramètres régionaux du système lors de l'exécution vous pouvez utiliser QLocale classe:

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); 

Quoi qu'il en soit, si vous voulez vraiment faire de votre façon, vous pouvez compter sur une variable d'environnement LANGUAGE_ID pour détecter quelle langue à intégrer dans votre construction, puis reconstruisez votre projet pour chacune des langues disponibles . Cela peut prendre beaucoup de temps, mais peut-être que vous ne pouvez le faire que pour la version finale de .

est un exemple:

#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 
} 

Et voici le fichier .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) 
} 

Il utilise les test function equals sans papier. Notez que si vous modifiez la valeur de la variable d'environnement LANGUAGE_ID, vous devez à nouveau exécuter qmake (éventuellement après avoir supprimé les Makefiles).

A (peut-être mieux) alternative est d'utiliser CMake et spécifier l'ID de langue une variable de ligne de commande de 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]") 
Questions connexes