Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: codeLocker от Август 31, 2005, 18:32



Название: Проблема со шрифтами
Отправлено: codeLocker от Август 31, 2005, 18:32
Вызываю метод
Код:
 QMessageBox::critical(0, tr("Невозможно открыть базу данных"),
            tr("Ошибка при попытки открытия базы данных.\n"
            "Возможно не установленные необходимые драйвера."),
            QMessageBox::Cancel, QMessageBox::NoButton);

а он вместо русских букв выводит ерунду.
Что делать?

P.S.
Используется пакет qt-win-opensource-4.0.1-mingw


Название: Проблема со шрифтами
Отправлено: joktar от Август 31, 2005, 18:43
Проверь кодировку исходного текста. Должна быть 1251-я.
(например в Блокноте исходник должен нормально читатся)
Если же хочется иметь НЕ 1251-ю в исходнике(а 866-ю например)
то в .pro:
DEFAULTCODEC=windows-866
а в программе:
#include <QtCore/QTextCodec>

...
[color="red"]
QTextCodec  * ourCodec=QTextCodec::codecForName("windows-866");
QTextCodec::setCodecForTr(ourCodec);
QTextCodec::setCodecForCStrings(ourCodec);
[/color]
...


Название: Проблема со шрифтами
Отправлено: codeLocker от Август 31, 2005, 18:50
Кодировка Windows-1251, а он все равно ерунду пишет...


Название: Проблема со шрифтами
Отправлено: L.Marvell от Август 31, 2005, 19:40
QString::fromLocal8Bit("Чего-нибудь");


Название: Проблема со шрифтами
Отправлено: codeLocker от Август 31, 2005, 20:44
Спасибо, заработало!


Название: Проблема со шрифтами
Отправлено: codeLocker от Август 31, 2005, 20:55
А как к этому еще и перевод привязать (QObject::tr()) ?


Название: Проблема со шрифтами
Отправлено: L.Marvell от Сентябрь 01, 2005, 11:25
Цитата: "codeLocker"
А как к этому еще и перевод привязать (QObject::tr()) ?

Хм... я не пробовал, но разве так не работает: tr(fromLocal8Bit("ывлоафры")) ?


Название: Проблема со шрифтами
Отправлено: codeLocker от Сентябрь 01, 2005, 11:33
функция fromLocal8Bit фозвращает QString, а функция tr описана так QString tr(char *)


Название: Проблема со шрифтами
Отправлено: Admin от Сентябрь 01, 2005, 11:35
общая технология такова

пишем
tr("Hello);

потом создаем linguist перевод на русский

и выводится уже привет

вам как я понял надо наоборот

базовый русский - остальное уже по вкусу

думаю что этот фокус может не прокатить


Название: Проблема со шрифтами
Отправлено: L.Marvell от Сентябрь 01, 2005, 16:54
Видимо таки да. Но если кто вдруг найдет решение, не пройдите мимо, оставьте пост. Думаю многим будет интересно.


Название: Проблема со шрифтами
Отправлено: joktar от Сентябрь 01, 2005, 19:19
Фокус может не проходить так как по умолчанию Qt считает что кодировка текста внутри tr() - Latin1, а это-не так.
Есть два варианта:
- использовать не tr() а trUtf8() и соотвественно тексты в utf8
- объяснить Qt что тексты внутри tr не в Latin1

Скажем так у меня работал следующий вариант:
Условия:исходная кодировка - windows-1251,
Проверялось на 3.3.4 под Windows и Linux.

тексты внутри tr() - в перемешку русский(причем не литературный а "русский компютерный -:)") и английские, сделать нужно было два нормальных варианта интерфейса.

После раскопок в Assistant'е
(где прямо сказано что делать если ваш текст в tr() НЕ в Latin1 а например в eucKR:

void QTextCodec::setCodecForTr ( QTextCodec * c )  [static]
Sets the codec used by QObject::tr() on its argument to c. If c is 0 (the default), tr() assumes Latin1.
If the literal quoted text in the program is not in the Latin1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        ... install any additional codecs ...
        QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));
        ...
    }

Note that this is not the way to select the encoding that the user has chosen. For example, to convert an application containing literal English strings to Korean, all that is needed is for the English strings to be passed through tr() and for translation files to be loaded. For details of internationalization, see Internationalization with Qt.
Warning: This function is not reentrant.
See also codecForTr() and setCodecForCStrings().
)
было сделано следующие:
в .pro было добавлено
// для lupdate, откуда списал-не помню,вроде бы из Assistant'а тоже
DEFAULTCODEC=windows-1251

TRANSLATIONS = ogis_t_ru.ts \
                           ogis_t_en.ts

после чего текст программы набирался как обычно:
(
QObject::tr("СуперТекст");
QString message=QString(QObject("Всего %1 вариантов")).arg(m_numVariants);
)
после чего обычный вызов lupdate/Linguist/lrelease
в main()
стояло:
**
 * Загрузка файлов переводов интерфейса
 * @param lang - язык (будет искатся соотв.файл x_3d_lang.qm)
 * @return - получилось ли
 */
bool prepareTranslators(QString lang)
//bool prepareTranslators(QApplication * qApp,QString lang)
{
    QString langfile;
    langfile="x_3d_"+lang+".qm";
    QFileInfo fi( langfile );
    if ( !fi.exists() ) {
        QMessageBox::warning( 0, "File not found",
                              QString("Cannot find translation for language: "+lang+
                                      "\n(parts of interface will be untranslated)") );
        return false;
    }
  QTranslator * translator = new QTranslator( 0 );
  translator->load( langfile, "." );
  qApp->installTranslator(translator);
  return true;

}
...
int main(int argc,char * argv[])
{
...

QTextCodec * ourCodec=QTextCodec::codecForName("windows-1251");
//строка ниже задает кодировку текста для строк внутри tr("строка")
QTextCodec::setCodecForTr(ourCodec);
//а это-для случаев когда всетаки надо использовать char *
//совместно с QString и не хочется чтобы эти char * в
// Latin1 преобразовывались
QTextCodec::setCodecForCStrings(ourCodec);
//install translator(s) to get completly translated UI
 splash->message(QObject::tr("Activating multi-language interface support..."),    Qt::AlignLeft|Qt::AlignBottom);
 prepareTranslators("ru");
...
}


Название: Проблема со шрифтами
Отправлено: L.Marvell от Сентябрь 01, 2005, 19:44
Прелесть! Просто прелесть! Спасибо!


Название: Проблема со шрифтами
Отправлено: codeLocker от Сентябрь 01, 2005, 21:00
Действительно круто, спасибо.