Название: Локализация Отправлено: 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() Название: Локализация Отправлено: Вудруф от Февраль 25, 2006, 10:00 Будем знать. Спасибо.
|