Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: burunduk от Февраль 17, 2006, 17:24



Название: Локализация
Отправлено: burunduk от Февраль 17, 2006, 17:24
Мне непонятно

когда я в одном классе пишу несколько раз tr("Name"), лингвист предоставляет только один раз перевести эту константу, что есть конечно правильно

в коде мне пришлось посравнивать два QString, инициализированные этой константой и почему то один QString переведен, другой нет....  что-то я не понимаю почему

при попытке же объявить глобальную константу
const QString Name = QT_TRANSLATE_NOOP("MyClass", "Name");
а затем пройти Лингвистом её (перевести), в программе остаётся непереведенная строка Name

Qt 4.1.0

Что это и почему так происходит ?


Название: Локализация
Отправлено: Denis от Февраль 17, 2006, 18:18
Возможно один QString инициализирован данными еще до того, как загружен словарь локализации. tr() возвращает либо локализованую строку, либо оригинальную, если перевод не найден.

Смотри, в какой момент у тебя иниициализируется каждый из QString'ов.


Название: Локализация
Отправлено: burunduk от Февраль 17, 2006, 18:24
кстати очень может даже быть
т.е. получается такой вариант с константами не будет работать, т.к. они будут всегда инициализироваться раньше чем словарь....


Цитата: "Denis"
Возможно один QString инициализирован данными еще до того, как загружен словарь локализации. tr() возвращает либо локализованую строку, либо оригинальную, если перевод не найден.

Смотри, в какой момент у тебя иниициализируется каждый из QString'ов.


Название: Локализация
Отправлено: Hordi от Февраль 20, 2006, 16:08
Подобный код встречается в исходниках Qt, поэтому константы должны работать.

static const char * const text_[] = {
    0,
    QT_TRANSLATE_NOOP("QMessageBox","OK"),
    QT_TRANSLATE_NOOP("QMessageBox","Cancel"),
    ...
    0
};


Название: Локализация
Отправлено: Вудруф от Февраль 21, 2006, 09:34
Смотря где используется... Если в классе, то константы инициализируются собственно при создании класса. Тогда словарь может уже быть загруженным, а вот если просто в каком-то cpp-файле...


Название: Локализация
Отправлено: Hordi от Февраль 21, 2006, 10:35
Константы инициализируются на этапе компиляции. Другое дело, что tr("") - это не константы.


Название: Локализация
Отправлено: Вудруф от Февраль 21, 2006, 14:06
Неа :)
Константы инициализируются при запуске программы, создании класса и др. :)
Просто константы могут инициализироваться какой-то динамической информацией, но потом не могут сменить своё состояние...


Название: Локализация
Отправлено: Hordi от Февраль 21, 2006, 17:59
Ладно, разные есть константы...
Есть const int, а есть const std::string.
const int вероятнее всего будет работать как обычный define, т.е. подмена на значение, для std::string будет вызван конструктор в момент выполнения, хотя и не факт...


Название: Локализация
Отправлено: Dendy от Февраль 22, 2006, 20:09
Не путайте разньІе вещи.

КонстантьІ обязаньІ инициализироваться при создании. Для них так же само вьІзьІвается конструктор и вьІделяется память, но конпиллятор не пропустит попьІтку изменения константной переменной.

Трансляция в Qt делается после загрузки екземпляра QTranslator. Соответственно глобальньІе константьІ работать не будут.

Теперь о проблеме. QT_TR_NOOP и QT_TRANSLATE_NOOP используются, если ключ перевода встречается больше одного раза. Следовательно, чтобьІ избежать ошибок, связанньІх с избьІточностью (в одном месте изменил ключ, в другом забьІл) - ключи вьІносятся за в статические переменньІе (подмена переменной будет ошибкой на етапе компилляции и мьІ сразу ето увидим). Ключ всегда сишная строка, поетому правильно писать не:

Код:
const QString Name = QT_TRANSLATE_NOOP("MyClass", "Name");


а:

Код:
const char * Name = QT_TRANSLATE_NOOP("MyClass", "Name");


И каждьІй раз при смене словаря нужно вьІзьІвать:

Код:
MyClass::retranslateMe()
{
  realTranslatedString = tr( Name );
}


Название: Локализация
Отправлено: Вудруф от Февраль 25, 2006, 10:00
Будем знать. Спасибо.