Russian Qt Forum
Сентябрь 21, 2024, 11:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Локализация  (Прочитано 7184 раз)
burunduk
Гость
« : Февраль 17, 2006, 17:24 »

Мне непонятно

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

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

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

Qt 4.1.0

Что это и почему так происходит ?
Записан
Denis
Гость
« Ответ #1 : Февраль 17, 2006, 18:18 »

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

Смотри, в какой момент у тебя иниициализируется каждый из QString'ов.
Записан
burunduk
Гость
« Ответ #2 : Февраль 17, 2006, 18:24 »

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


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

Смотри, в какой момент у тебя иниициализируется каждый из QString'ов.
Записан
Hordi
Гость
« Ответ #3 : Февраль 20, 2006, 16:08 »

Подобный код встречается в исходниках Qt, поэтому константы должны работать.

static const char * const text_[] = {
    0,
    QT_TRANSLATE_NOOP("QMessageBox","OK"),
    QT_TRANSLATE_NOOP("QMessageBox","Cancel"),
    ...
    0
};
Записан
Вудруф
Гость
« Ответ #4 : Февраль 21, 2006, 09:34 »

Смотря где используется... Если в классе, то константы инициализируются собственно при создании класса. Тогда словарь может уже быть загруженным, а вот если просто в каком-то cpp-файле...
Записан
Hordi
Гость
« Ответ #5 : Февраль 21, 2006, 10:35 »

Константы инициализируются на этапе компиляции. Другое дело, что tr("") - это не константы.
Записан
Вудруф
Гость
« Ответ #6 : Февраль 21, 2006, 14:06 »

Неа Улыбающийся
Константы инициализируются при запуске программы, создании класса и др. Улыбающийся
Просто константы могут инициализироваться какой-то динамической информацией, но потом не могут сменить своё состояние...
Записан
Hordi
Гость
« Ответ #7 : Февраль 21, 2006, 17:59 »

Ладно, разные есть константы...
Есть const int, а есть const std::string.
const int вероятнее всего будет работать как обычный define, т.е. подмена на значение, для std::string будет вызван конструктор в момент выполнения, хотя и не факт...
Записан
Dendy
Гость
« Ответ #8 : Февраль 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 );
}
Записан
Вудруф
Гость
« Ответ #9 : Февраль 25, 2006, 10:00 »

Будем знать. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 21.