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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Трансляция в не QObject-контексте.  (Прочитано 7451 раз)
Akon
Гость
« : Март 14, 2011, 14:23 »

Есть класс, не являющийся наследником QObject. Трансляцию строк делаю так:

Код:
void FooClass::someFunc()
{
QString translatedText = QCoreApplication::translate("FooClass",
QT_TRANSLATE_NOOP("FooClass", "А text to be translated"));
...
}

Может я чего не доглядел в документации и есть вариант покороче? В приведенном варианте конструкция громоздка да и "FooClass" встречается дважды?

Записан
twp
Гость
« Ответ #1 : Март 14, 2011, 14:28 »

этот метод статический
Код:
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static]
Записан
Akon
Гость
« Ответ #2 : Март 14, 2011, 14:35 »

В этом методе нет информации о контексте ("FooClass").
Записан
IMPOMEZIA
Гость
« Ответ #3 : Март 14, 2011, 16:00 »

Используйте FooClass::tr() вместо QObject::tr()  Подмигивающий

Если конечно FooClass наследник QObject, а перевести нужно за пределами FooClass.
« Последнее редактирование: Март 14, 2011, 16:03 от IMPOMEZIA » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 14, 2011, 16:04 »

Я делаю вот так:
Код
C++ (Qt)
#if 0
class MainWindow // for tr
{
Q_OBJECT
#endif
 
void someFunc()
{
QString translatedText = MainWindow::tr( "А text to be translated" );
...
}
 
#if 0
};
#endif
 

MainWindow
меняешь на любой класс с Q_OBJECT.
Записан

Qt 5.11/4.8.7 (X11/Win)
twp
Гость
« Ответ #5 : Март 14, 2011, 16:10 »

достаточно будет и QObject::tr() даже если будет много классов для перевода, если будут конфликты то в tr есть параметр disambiguation для их разрешения
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 14, 2011, 16:23 »

Цитировать
достаточно будет и QObject::tr()
Согласен, но может случиться, что общая свалка станет очень громоздкой.
Имхо, с контекстом нагляднее, да и перевод делать легче.
Записан

Qt 5.11/4.8.7 (X11/Win)
Akon
Гость
« Ответ #7 : Март 14, 2011, 17:25 »

2 GreatSnake:
Элегантный способ, в том смысле, что контекст ("MainWindow") подсунут без зависимости от хедера MainWindow. Но всегда должен существовать класс MainWindow (или любой класс с Q_OBJECT вместо него). Мне не хотелось бы внедряться в контекст существующего класса. Можно, конечно, сделать фиктивный Q_OBJECT класс для целей трансляции, но это как-то не очень красиво. Чем яснее контекст тем нагляднее, да и перевод делать легче.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Март 14, 2011, 17:34 »

Цитировать
Мне не хотелось бы внедряться в контекст существующего класса.
Тогда вот так Улыбающийся

Код
C++ (Qt)
#if 0
#define tr(x) x
class FooClass // for tr
{
Q_OBJECT
#endif
 
void FooClass::someFunc()
{
QString translatedText = QCoreApplication::translate("FooClass", tr("A text to be translated"));
...
}
 
#if 0
#undef tr
};
#endif
Записан

Qt 5.11/4.8.7 (X11/Win)
Akon
Гость
« Ответ #9 : Март 14, 2011, 18:42 »

Спасибо за представленные здесь идеи!

Не скомпилируется - tr() должен быть виден для компилятора. А при открытом макросе tr() закроешь tr() функции от Q_OBJECT других классов, если они будут в текущей области видимости.

Также интересно, что
Код:
void FooClass::someFunc()
{
QString translatedText = QCoreApplication::translate("FooClass", tr("A text to be translated"));
...
}
даст контекст QCoreApplication, в то время как
Код:
void FooClass::someFunc()
{
QString translatedText = tr("A text to be translated");
...
}
даст контекст FooClass. Пробовал с Qt 4.6.x.

Ну и если lupdate научится понимать директивы условной компиляции, то эти подходы и вовсе не покатят.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Март 14, 2011, 18:52 »

Цитировать
Не скомпилируется - tr() должен быть виден для компилятора. А при открытом макросе tr() закроешь tr() функции от Q_OBJECT других классов, если они будут в текущей области видимости.
Малость напутал. Так будет лучше
Код
C++ (Qt)
#if 0
class FooClass // for tr
{
Q_OBJECT
#endif
 
#define tr(s) QCoreApplication::translate("FooClass", s);
 
void FooClass::someFunc()
{
QString translatedText = tr("A text to be translated");
...
}
 
#undef tr
#if 0
};
#endif
 
 
« Последнее редактирование: Март 14, 2011, 18:57 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Akon
Гость
« Ответ #11 : Март 14, 2011, 20:04 »

Тогда так (без ошибок):
Код:
class FooClass // for tr
{
#if 0
Q_OBJECT
#endif

void someFunc();
};

#define tr(s) QCoreApplication::translate("FooClass", s)

void FooClass::someFunc()
{
QString translatedText = tr("A text to be translated");
}

#undef tr

С виду элегантно, но менее читаемо относительно изначального "лобового" варианта. И в общем случае макрос tr нужно "перегрузить" под соответствующие перегрузки QCoreApplication::translate, что сделать не удастся.
Записан
twp
Гость
« Ответ #12 : Март 15, 2011, 11:49 »

как оказалось все намного проще, есть макрос для этих целей, вот пример из асистента:
Код:
class MyClass
 {
     Q_DECLARE_TR_FUNCTIONS(MyClass)

 public:
     MyClass();
     ...
 };
и теперь можно использовать tr() в коде класса
Записан
Akon
Гость
« Ответ #13 : Март 15, 2011, 13:23 »

Цитировать
Может я чего не доглядел в документации и есть вариант покороче?
Так и знал.
Спасибо.

Как недостаток Q_DECLARE_TR_FUNCTIONS требует подключения в хедере MyClass
#include <QtCore/QCoreApplication>. Ну и подход в Q_DECLARE_TR_FUNCTIONS через QCoreApplication::translate.
Записан
Akon
Гость
« Ответ #14 : Март 15, 2011, 16:46 »

Банально разбил Q_DECLARE_TR_FUNCTIONS на части: декларация/имплементация.
Гораздо меньшее удобство использования, зато <QtCore/QCoreApplication> не вылезает наружу.

TrFunctionsDecl.h
Код:
#pragma once

#include <QtCore/QString>

#define Akon_QtCore_DECLARE_TR_FUNCTIONS(ClassName) \
static QString tr(const char *sourceText, const char *disambiguation = 0); \
static QString trUtf8(const char *sourceText, const char *disambiguation = 0); \
static QString tr(const char *sourceText, const char *disambiguation, int n); \
static QString trUtf8(const char *sourceText, const char *disambiguation, int n);

TrFunctionsImpl.h
Код:
#pragma once

#include <QtCore/QCoreApplication>

#define Akon_QtCore_IMPLEMENT_TR_FUNCTIONS(ClassName) \
QString ClassName::tr(const char *sourceText, const char *disambiguation) \
{ \
return QCoreApplication::translate(#ClassName, sourceText, disambiguation); \
} \
QString ClassName::trUtf8(const char *sourceText, const char *disambiguation) \
{ \
return QCoreApplication::translate(#ClassName, sourceText, disambiguation, \
QCoreApplication::UnicodeUTF8); \
} \
QString ClassName::tr(const char *sourceText, const char *disambiguation, int n) \
{ \
return QCoreApplication::translate(#ClassName, sourceText, disambiguation, \
QCoreApplication::CodecForTr, n); \
} \
QString ClassName::trUtf8(const char *sourceText, const char *disambiguation, int n) \
{ \
return QCoreApplication::translate(#ClassName, sourceText, disambiguation, \
QCoreApplication::UnicodeUTF8, n); \
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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