Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Bojo от Октябрь 10, 2009, 20:11



Название: Кодировки и статические константы
Отправлено: Bojo от Октябрь 10, 2009, 20:11
Есть статическая константа в классе:
const QString ClassName::TestString = tr("тест");

В main задаю кодировки:

QTextCodec *cyrillicCodec = QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr(cyrillicCodec);
QTextCodec::setCodecForCStrings(cyrillicCodec);

Следующая строчка выявляет, что в ClassName::TestString вместо "тест" абракадабра.
Q_ASSERT(ClassName::TestString == QObject::tr("тест"));


Подозреваю это потому что статические константы инициализируются еще до вызова main? А что делать с этим?


Название: Re: Кодировки и статические константы
Отправлено: lit-uriy от Октябрь 10, 2009, 21:51
Попробуй уйти от константы, сделай переменную, которую будешь инициализировать в конструкторе класса.


Название: Re: Кодировки и статические константы
Отправлено: Igors от Октябрь 10, 2009, 22:16
Подозреваю это потому что статические константы инициализируются еще до вызова main? А что делать с этим?
Подозрения правильные (без разницы статические константы или нет) - если объявлено что-то с инициализацией (не в теле функции) - это будет выполняться до main. Проблема в том что никто не гарантирует порядок инициализации, поэтому лучше написать тупее но надежнее, например

void InitGlobals( void )
{
   static bool theGlobalsReady = false;
   if (theGlobalsReady) return;
   theGlobalsReady = true;
   
   QTextCodec *cyrillicCodec = QTextCodec::codecForName("Windows-1251");
   ClassName::TestString = tr("тест");
   ...
}


Название: Re: Кодировки и статические константы
Отправлено: Bojo от Октябрь 11, 2009, 14:06
Все ясно. Но жутко неудобно вместо констант использовать переменные и инициализировать их через присваивание, когда этих констант у меня большие массивы.


Название: Re: Кодировки и статические константы
Отправлено: Igors от Октябрь 11, 2009, 20:21
Все ясно. Но жутко неудобно вместо констант использовать переменные и инициализировать их через присваивание, когда этих констант у меня большие массивы.
c'est la vie. Я выкручиваюсь объявляя простые структуры (const char * и.т.п) а на старте перегоняю их во что-то "более интеллектуальное".


Название: Re: Кодировки и статические константы
Отправлено: Bojo от Октябрь 13, 2009, 08:52
А я решил вместо констант теперь колбасить статические методы типа
QString ClassName::GetStringConstantName1() { return tr("Руссо туристо"); }

или в случае массива
QString GetStringConstantName2(const int& index)
{
switch (index)
{
case 0: return tr("Облико морале");
case 1: return tr("Бандито");
default: throw invalid_argument("");
}
}


Название: Re: Кодировки и статические константы
Отправлено: SASA от Октябрь 13, 2009, 17:41
http://www.prog.org.ru/topic_10549_0.html (http://www.prog.org.ru/topic_10549_0.html)


Название: Re: Кодировки и статические константы
Отправлено: Bojo от Октябрь 13, 2009, 19:46
http://www.prog.org.ru/topic_10549_0.html (http://www.prog.org.ru/topic_10549_0.html)

И чем это поможет? Мне не нужен перевод на другие языки. Мне нужно, чтобы исходный русский язык нормально отображался в приложении, при условии ,что исходники пишутся в указанной кодировке "Windows-1251".