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.
'tr()' es la mejor manera de hacer esto, estoy de acuerdo. – levu
analizaré más a fondo esto y le haré saber los resultados. Gracias – prolink007
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. –