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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QObject::tr() и lupdate  (Прочитано 15032 раз)
QCasper
Гость
« : Сентябрь 06, 2006, 22:14 »

Недавно начал изучать механизмы интернационализации, и вот вопрос. Все будет отлично если пихать все строки в tr(), например tr("string"), потом lupdate сделает нам файлик, который мы запихнем в лингвист, переведем, получим другой файлик, который и будем загружать в программе. А можно ли как-то обработать все это дело если у меня в tr() не сам литерал, а указатель на на строку например:

Код:
const char* c_string = "string";
tr(c_string);


в этом случае все дело заканчивается (по крайней мере для меня) тем, что lupdate ничего подходяещго для себя не находит. Как осуществлять перевод, если я хочу использовать константы?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Сентябрь 06, 2006, 22:17 »

скорее всего никак

если только макрос TR переписать
Записан
QCasper
Гость
« Ответ #2 : Сентябрь 06, 2006, 22:37 »

Цитата: "Admin"
скорее всего никак

если только макрос TR переписать


вот блин... это что же, получается в tr() ничего нельзя запихнуть кроме чистых литералов? Опупеть... чем, интересно, это вызвано, не думаю, что они просто забыли добавить поддержку переменных Улыбающийся
Записан
DenKor
Гость
« Ответ #3 : Сентябрь 07, 2006, 00:41 »

Смысла в этом особого нет.
Обычно (я например) пишут в макросе английиский текст. А далее занимаюсь переводом.

Константы можешь использовать спомощью дериктивы define
Записан
Вудруф
Гость
« Ответ #4 : Сентябрь 07, 2006, 07:08 »

Из Assistant'а:
If you need to have translatable text completely outside a function, there are two macros to help: QT_TR_NOOP() and QT_TRANSLATE_NOOP(). They merely mark the text for extraction by the lupdate utility described below. The macros expand to just the text (without the context).
Example of QT_TR_NOOP():
    QString FriendlyConversation::greeting(int type)
    {
        static const char *greeting_strings[] = {
            QT_TR_NOOP("Hello"),
            QT_TR_NOOP("Goodbye")
        };
        return tr(greeting_strings[type]);
    }
Example of QT_TRANSLATE_NOOP():
    static const char *greeting_strings[] = {
        QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
        QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
    };

    QString FriendlyConversation::greeting(int type)
    {
        return tr(greeting_strings[type]);
    }

    QString global_greeting(int type)
    {
        return qApp->translate("FriendlyConversation",
                               greeting_strings[type]);
Записан
bigirbis
Гость
« Ответ #5 : Сентябрь 07, 2006, 08:32 »

Можно поступить по-тупому:
Код:

//Можно в мапу оформить, ну и вообще, дело вкуса...
QString str = QObject::tr( "some text" );
...
//Теперь осталось только достать уже транслированные строки
widget->setWindowTitle( str );
Записан
QCasper
Гость
« Ответ #6 : Сентябрь 07, 2006, 09:18 »

Цитата: "DenKor"
Смысла в этом особого нет.
Обычно (я например) пишут в макросе английиский текст. А далее занимаюсь переводом.

Константы можешь использовать спомощью дериктивы define


а если у меня в коде в разных местах встречается (а иногда и в разных файлах) встречается "string", который мне нужно потом переделать в "the string"?

добавлено спустя 56 секунд:

 
Цитата: "bigirbis"
Можно поступить по-тупому:
Код:

//Можно в мапу оформить, ну и вообще, дело вкуса...
QString str = QObject::tr( "some text" );
...
//Теперь осталось только достать уже транслированные строки
widget->setWindowTitle( str );


пробовал. не работает. текст остается не переведенный.
Записан
bigirbis
Гость
« Ответ #7 : Сентябрь 07, 2006, 09:50 »

Цитировать
пробовал. не работает. текст остается не переведенный.

Дело в том, что для такого подхода требуется сперва объявить данные переменые (например а пространстве имен), а потом инициализировать их в каком-нибудь методе (который, как правило, запускается в main).
Что вроде того:

Код:

namespace translate
{
QString str;

void init()
{
str = QObject::tr( "some text" );
}

};

int main()
{
...
QApplication app;
...
translate::init();
...
}
Записан
Вудруф
Гость
« Ответ #8 : Сентябрь 07, 2006, 09:55 »

Цитировать
пробовал. не работает. текст остается не переведенный

Ты язык менял во время исполнения?
Записан
QCasper
Гость
« Ответ #9 : Сентябрь 07, 2006, 10:06 »

Цитата: "Вудруф"
Цитировать
пробовал. не работает. текст остается не переведенный

Ты язык менял во время исполнения?


какой язык? вот отрывок кода:

Код:
QString c_text = QObject::tr("text");

QLabel *lbl = new QLabel(c_text);
QLabel *lbl1 = new QLabel(QObject::tr("string"));


первый лэйбл выдает "text", второй - "строка".
стоит заменить на:

Код:
QLabel *lbl = new QLabel(QObject::tr("text"));


он начинает выдавать "текст".
Записан
bigirbis
Гость
« Ответ #10 : Сентябрь 07, 2006, 10:20 »

To QCasper
Почитай пост от Чт Сен 07, 2006 9:50 am - это реально работает(и уже давно).
Записан
Вудруф
Гость
« Ответ #11 : Сентябрь 07, 2006, 13:09 »

Если это - глобальная константа:
Цитировать

QString c_text = QObject::tr("text");

То, может быть, она просто инициализируется до выполнения любого кода из main?

добавлено спустя 5 минут:

 А вопрос про смену языков в real-time был задан оттого, что собственно перевод осуществляется уже после подключения файла с переводом (извините за тавтологию). И при смене языка тебе придётся переводить заново все строки!
А подключение файла перевода происходит в main...
В общем, делай так, как написал bigirbis, и будет тебе счастье...
Записан
bigirbis
Гость
« Ответ #12 : Сентябрь 07, 2006, 13:39 »

Если хочется круто-круто, то смотри книгу "C++ GUI Programming with Qt 4" главу "Part III: Advanced Qt/Chapter 17.  Internationalization/Dynamic Language Switching"
Книгу можно скачать в андеграунде.
Записан
itan
Гость
« Ответ #13 : Сентябрь 08, 2006, 10:26 »

Я так понимаю, что если у меня есть группа классов (например, A,B и С), то реализуя текстовые сообщения, как A::tr("Text"), B::tr("Text") и С::tr("Text"), я в последующем могу добиться разного перевода слова "Text" в зависимости от используемого контекста (класса) ?
А что мне делать, если эта группа классов ни каким боком не наследует QObject (т.е. функция tr() в них не определена) ? Как добиться контекстозависимого перевода?
Записан
bigirbis
Гость
« Ответ #14 : Сентябрь 08, 2006, 10:37 »

Можно попробовать вызвать
QString QObject::tr ( const char * sourceText, const char * comment )
и установить второй параметр, что-то вроде того:

Код:
class A
{
...
 QString tr( const char * sourceText ) { return QObject::tr( sourceText, "A" ); }
...
}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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