2011-06-05 7 views
9

Quiero tener un lugar donde pueda almacenar todas las cadenas usadas en mi aplicación, así puedo modificarlas en un solo lugar y no en todos los lugares. Algo así como un archivo de recursos, donde puedo poner una etiqueta en las cadenas y simplemente llamar a la etiqueta.qt "resource" string

No tengo conocimiento de nada que ofrezca QT para esto, ¿así que solo necesitaría crear un archivo de encabezado con todas esas cadenas e incluirlo en todas partes que lo necesite? ¿Cuál es la forma adecuada de hacer esto y podría ofrecer un pequeño ejemplo?

Gracias!

Respuesta

6

No lo he usado todavía, pero creo que Qt Internationalization te permite hacer algo como esto, ya que una de sus opciones es quitar todas las cadenas del código de la aplicación para que puedan ser reemplazadas por traducciones. Incluso si no desea utilizar ninguna otra característica de este módulo, le permitirá resolver su problema. Sustitución de una cadena para una etiqueta podría tener este aspecto:

QLabel *label = new QLabel(tr("Password:")); 

La función tr() ya forma parte de las clases de Qt y se obtiene unas cuantas más funciones y macros de forma gratuita que ayuda a buscar y reemplazar cadenas. Las cadenas a reemplazar se pueden gestionar con QtLinguist. puede encontrar una explicación más detallada aquí: Internationalization with Qt

+0

'tr()' es la mejor manera de hacer esto, estoy de acuerdo. – levu

+0

analizaré más a fondo esto y le haré saber los resultados. Gracias – prolink007

+2

De hecho. Utilizo las herramientas de traducción para proporcionar cadenas muy detalladas para probar/depurar e intercambiar en una unidad de traducción diferente para reducirlas para su lanzamiento. –

3

En los viejos días [1], al utilizar los recursos de Windows, la gente ha estado usando:

// in your project_strings.h file 
#define STRING_PASSWORD 1 
... 

// resources project.rc 
#include "project_strings.h" 
STRINGTABLE 
BEGIN 
STRING_PASSWORD "Password:" 
... 
END 

// in some other file 
#include "project_strings.h" 
CString str(STRING_PASSWORD); 

El CString sabían de recursos de Windows (fea de dependencia) y podría ir y leer la contraseña de la cadena. El #define es definitivamente muy feo en C++ moderno, pero los recursos no comprenderían una variable constante estática o una función en línea.

La manera más fácil de replicar esto de una manera similar es usar un archivo de encabezado con declaraciones de cadena y luego hacer referencia a esas cadenas en cualquier lugar que las necesite.

// in your project_strings.h 
namespace MyProjectStrings { 
const char *password; 
... 
} 

// the project_strings.cpp for the strings 
#include "project_strings.h" 
namespace MyProjectStrings { 
const char *password = "Password:"; 
... 
} 

// some random user who needs that string 
#include "project_strings.h" 
std::string password(MyProjectStrings::password); 

Ahora todas las cadenas están en project_strings.cpp y no se puede traducir con la misma facilidad con tr() ... pero se podía transformar todas esas cadenas declaraciones con funciones:

// in your project_strings.h 
namespace MyProjectStrings { 
const char *password(); //[2] 
... 
} 

// the project_strings.cpp for the strings 
#include "project_strings.h" 
namespace MyProjectStrings { 
const char *password() { return QObject::tr("Password:"); } 
... 
} 

// some random user who needs that string 
#include "project_strings.h" 
std::string password(MyProjectStrings::password()); //[3] 

y listo ! Tienes una única tabla larga de todas tus cadenas en un solo lugar y traducible.

[1] ¡Mucha gente todavía usa ese esquema!

[2] La función podría devolver std :: string para evitar al 100% la modificación del original.

[3] En este último ejemplo, la referencia de cadena utiliza() ya que es una llamada a función.

+0

En tu ejemplo vas como 'return tr (" Contraseña ");' olvidando que 'tr' es un método estático de QObject, y cuando lo usas fuera de la clase derivada de él, debes hacer' return QObject :: tr (" Contraseña ")'. –

Cuestiones relacionadas