В старые времена [1] при использовании ресурсов Windows люди использовали:
// 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);
CString знал о ресурсах Windows (безобразная зависимость) и мог пойти и прочитать пароль строки. #Define определенно очень уродлив в современном C ++, но ресурсы не будут понимать статическую переменную const или встроенную функцию.
Самый простой способ воспроизвести это несколько похожим способом - использовать заголовочный файл со строковыми объявлениями, а затем ссылаться на эти строки везде, где они вам нужны.
// 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);
Теперь все ваши строки находятся в project_strings.cpp, и вы не можете так просто их перевести с помощью tr () ... но вы можете преобразовать все эти строки с помощью функций:
// 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]
И вуаля! У вас есть один длинный стол со всеми вашими строками в одном месте, который можно перевести.
[1] Многие люди все еще используют эту схему!
[2] Функция может возвращать std :: string до 100%, предотвращая изменение оригинала.
[3] В этом последнем примере строковая ссылка использует (), так как это вызов функции.