Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Akon от Март 14, 2011, 14:23



Название: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 14, 2011, 14:23
Есть класс, не являющийся наследником QObject. Трансляцию строк делаю так:

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

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



Название: Re: Трансляция в не QObject-контексте.
Отправлено: twp от Март 14, 2011, 14:28
этот метод статический
Код:
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static]


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 14, 2011, 14:35
В этом методе нет информации о контексте ("FooClass").


Название: Re: Трансляция в не QObject-контексте.
Отправлено: IMPOMEZIA от Март 14, 2011, 16:00
Используйте FooClass::tr() вместо QObject::tr()  ;)

Если конечно FooClass наследник QObject, а перевести нужно за пределами FooClass.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: GreatSnake от Март 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.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: twp от Март 14, 2011, 16:10
достаточно будет и QObject::tr() даже если будет много классов для перевода, если будут конфликты то в tr есть параметр disambiguation для их разрешения


Название: Re: Трансляция в не QObject-контексте.
Отправлено: GreatSnake от Март 14, 2011, 16:23
Цитировать
достаточно будет и QObject::tr()
Согласен, но может случиться, что общая свалка станет очень громоздкой.
Имхо, с контекстом нагляднее, да и перевод делать легче.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 14, 2011, 17:25
2 GreatSnake:
Элегантный способ, в том смысле, что контекст ("MainWindow") подсунут без зависимости от хедера MainWindow. Но всегда должен существовать класс MainWindow (или любой класс с Q_OBJECT вместо него). Мне не хотелось бы внедряться в контекст существующего класса. Можно, конечно, сделать фиктивный Q_OBJECT класс для целей трансляции, но это как-то не очень красиво. Чем яснее контекст тем нагляднее, да и перевод делать легче.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: GreatSnake от Март 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


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 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 научится понимать директивы условной компиляции, то эти подходы и вовсе не покатят.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: GreatSnake от Март 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
 
 


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 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, что сделать не удастся.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: twp от Март 15, 2011, 11:49
как оказалось все намного проще, есть макрос для этих целей, вот пример из асистента:
Код:
class MyClass
 {
     Q_DECLARE_TR_FUNCTIONS(MyClass)

 public:
     MyClass();
     ...
 };
и теперь можно использовать tr() в коде класса


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 15, 2011, 13:23
Цитировать
Может я чего не доглядел в документации и есть вариант покороче?
Так и знал.
Спасибо.

Как недостаток Q_DECLARE_TR_FUNCTIONS требует подключения в хедере MyClass
#include <QtCore/QCoreApplication>. Ну и подход в Q_DECLARE_TR_FUNCTIONS через QCoreApplication::translate.


Название: Re: Трансляция в не QObject-контексте.
Отправлено: Akon от Март 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); \
}