2011-04-09 20 views
9

Si envolvemos cadenas en tr() podemos usar el lingüista para traducir aplicaciones qt. El siguiente ejemplo es una manera de cargar dinámicamente un idioma:Traducción de cadenas Qt dinámicas

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

    QTranslator translator; 
    translator.load("hellotr_la"); 
    app.installTranslator(&translator); 

    QPushButton hello(QPushButton::tr("Hello world!")); 
    hello.resize(100, 30); 
    hello.show(); 

    return app.exec(); 
} 

Lo que me gustaría hacer es es traducir a diferentes idiomas basados ​​en por ejemplo una preferencia del usuario. La razón es que tengo un servidor que necesita manejar solicitudes de clientes que tienen diferentes idiomas. Tener todo el servidor/proceso cambiando el idioma a través de eventos por solicitud no se siente bien. Por lo tanto, no estoy interesado en el dynamic translation reaccionando a .

Una cosa que me interesó de este modo es la siguiente documentación para QCoreApplication::installTranslator()

archivos de traducción pueden instalar múltiples. Las traducciones se buscan en el orden inverso en el que se instalaron, por lo que el archivo de traducción instalado más recientemente se busca primero y el último archivo de traducción instalado se busca por última vez. La búsqueda se detiene tan pronto como se encuentra una traducción que contiene una cadena coincidente.

Por lo tanto, parece posible cargar varios idiomas, pero mi preocupación es que si tengo varios idiomas no puedo especificar cuál será el idioma preferido. Si tengo que expresar en el código de lo que quiero es algo como esto:

QString MyApplicationServer::OnHandleRequest(MyRequest &r) 
{ 
    //Get the language for this specific request 
    //For example language can be “hellotr_la” or “hellotr_fr” 
    // Or another way: "lat", "fra", "enu", "esn" ... 
    QString language = getLanguageForRequest(r); 

    //How do I dynamically use language or translate to language? 
    // This would be the preferred solution. 
    return tr("Not Implemented", language); 
} 

si tengo que utilizar algunas macros personalizadas, entonces así sea!

Edit: Básicamente me gustaría tener en mis manos una cadena traducida específica de los traductores.

+0

¿Qué pasa con el manejo del evento de cambio de idioma? –

+0

Es un proceso de servidor que maneja múltiples solicitudes. Si realmente quiero forzar una excusa, puedo decir que estoy usando varios hilos;). Técnicamente parece una exageración propagar un QEvent a través de todos los objetos cuando solo se necesita traducir una secuencia. Imagine si quisiera traducir dos cadenas a dos idiomas diferentes en 'OnHandleRequest' –

Respuesta

7

No es necesario que utilice las funciones de conveniencia tr proporcionadas, ni tiene que instalar los traductores. Solo mira la API para QTranslator y verás que puedes llamar al translate directamente. SI realiza esta ruta, puede tener un mapa de traductores disponible y buscar el texto según sea necesario.

Si debe usar tr, entonces debe compilar un traductor personalizado. Su traductor personalizado puede mantener el mapa de traductores y usar una variable de solicitud para determinar cuál usar. Si su servidor maneja solo una solicitud a la vez, una variable global simple que indique el idioma actual estaría bien.

Ahora, si su servidor maneja múltiples solicitudes en hilos, tiene que trabajar un poco más, pero no mucho. En este caso, almacenará su preferencia de idioma en un subproceso local y el traductor instalado utilizará ese subproceso local para determinar qué intérprete de respaldo debe hacer.

Cuestiones relacionadas