Поиск:

Ответ в темуСоздание новой темы Создание опроса
> иероглифы в кириллице 
V
    Опции темы
kuvshinka
Дата 3.11.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



#include <QTextCodec>
...
QTextCodec::setCodecForTr( QTextCodec::codecForName( "Windows-1251" ) );
...
QStringList strings;
...
strings.append("ПрИвеТ ВсЕм");
...
QTableWidgetItem* data = new QTableWidgetItem();
data->setText(strings.at(1) );
Table1->setItem(1, 1, data);   

почему текст выводится иероглифами? подскажите пож-та на вышеуказанном примере как программно это поправить?   
PM MAIL   Вверх
math64
Дата 3.11.2011, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Что трудно другие темы по этому поводу просмотреть?
http://forum.vingrad.ru/forum/topic-340661...шрифт.html

PM   Вверх
kuvshinka
Дата 4.11.2011, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



собственно вся проблема заключается в том как безошибочно применить метод tr() к QStringList-у - либо при заполнении переменной-строки русским текстом или при ее выводе в таблицу (не знаю где вернее)... 

Это сообщение отредактировал(а) kuvshinka - 4.11.2011, 19:27
PM MAIL   Вверх
math64
Дата 4.11.2011, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



tr() предназначен для перевода. Когда переводить - без разницы, но текст предпочтитель но должен быть латиницей
Если перевод делается не сразу применяется макрос QT_TR_NOOP()
Код

static char* strings[] = {
  QT_TR_NOOP("No brush"),
  QT_TR_NOOP("Solid"),
  QT_TR_NOOP("Dense 1"),
  QT_TR_NOOP("Dense 2"),
  QT_TR_NOOP("Dense 3"),
  QT_TR_NOOP("Dense 4"),
  QT_TR_NOOP("Dense 5"),
  QT_TR_NOOP("Dense 6"),
  QT_TR_NOOP("Dense 7"),
  QT_TR_NOOP("Horizontal"),
  QT_TR_NOOP("Vertical"),
  QT_TR_NOOP("Cross"),
  QT_TR_NOOP("Backward diagonal"),
  QT_TR_NOOP("Forward diagonal"),
  QT_TR_NOOP("Crossing diagonal")
};
QStringList sl;
for (int i = 0; i < sizeof(strings)/sizeof(strings[0]); i++)
  sl.append(strings[i]);
QComboBox* cb = new QComboBox();
for (int i = 0; i < sl.size(); i++) {
  QByteArray ba = sl[i].toAscii();
  cb.addItem(tr(ba.data() ) );
}

в проект добавляем
TRANSLATIONS += project_ru.ts
запускаем lupdate и Linguist, делаем переводы строк, получаем файл project_ru.ts:
Код

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0">

<context>
    <name>QtTreePropertyBrowser</name>
    <message>
        <location filename="brushes.cpp" line="79"/>
        <source>No brush</source>
        <translation>пустая кисть</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="80"/>
        <source>Solid</source>
        <translation>кисть полной заливки</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="81"/>
        <source>Dense 1</source>
        <translation>кисть плотности 1</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="82"/>
        <source>Dense 2</source>
        <translation>кисть плотности 2</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="83"/>
        <source>Dense 3</source>
        <translation>кисть плотности 3</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="84"/>
        <source>Dense 4</source>
        <translation>кисть плотности 4</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="85"/>
        <source>Dense 5</source>
        <translation>кисть плотности 5</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="86"/>
        <source>Dense 6</source>
        <translation>кисть плотности 6</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="87"/>
        <source>Dense 7</source>
        <translation>кисть плотности 7</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="88"/>
        <source>Horizontal</source>
        <translation>Горизонтальная</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="89"/>
        <source>Vertical</source>
        <translation>Вертикальная</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="90"/>
        <source>Cross</source>
        <translation>Крест</translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="91"/>
        <source>Backward diagonal</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="92"/>
        <source>Forward diagonal</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="brushes.cpp" line="93"/>
        <source>Crossing diagonal</source>
        <translation>Диагональный крест</translation>
    </message>
</context>
</TS>

и с помощью lrelease файл project_ru.qm
В main() загружаем файл полученный файл переводов
Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // Грузим перевводчик для приложения - файл project_ru.qm
    QTranslator myappTranslator;
    myappTranslator.load("project_" + QLocale::system().name());
    a.installTranslator(&myappTranslator);
    MainWindow w;
    w.show();
    return a.exec();
}

Если не хочешь возиться с файлом перевода - используй
 QTextCodec* win1251 = QTextCodec::codecForName( "Windows-1251" ); // Соответственно кодировке исходников
 QString str = win1251->toUnicode("Строка");
 (предпочтительно, но много писать)
или 
 QTextCodec::setCodecForCStrings(win1251); // один раз в main()
 QString str("Строка"); //используется codecForCStrings для перекодировки


Это сообщение отредактировал(а) math64 - 7.11.2011, 12:27
PM   Вверх
kuvshinka
Дата 5.11.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



понятнок дело что с массивом типа static char* проблем применения метода tr нет - он как раз и требует параметр такого типа...а как корректно использовать tr для QStringList-a:
Код

QStringList tempList, stroka; 
tempList.append("привет");
...
stroka.append(tempList.first());
...
QTableWidgetItem* data = new QTableWidgetItem();
 data->setText(tr(stroka[0]) ); // ошибка использования tr
  Table->setItem(1, 1, data);


Это сообщение отредактировал(а) kuvshinka - 5.11.2011, 21:44
PM MAIL   Вверх
math64
Дата 6.11.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



tr() нужно использовать для перевода, т.е. создавать словарь с помощью Linguist и. т. д. Переводят обычно с английского, но это не обязательно.
Для перекодирования используются кодеки - когда строка помещена QStringList она уже перекодирована, возможно с неправильной кодировкой - и вернуть правильную кодировку непросто, а иногда и невозможно, если отсутствующие символы заменены на '?'
Как перекодировать уже отвечено в ссылке на тему, которую я дал в первом ответе.
PM   Вверх
bsa
Дата 7.11.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



kuvshinka, вообще-то делать надо так:
Код
tempList.append(tr("привет"));

Ты просто пойми как это все работает: lupdate сканирует исходный текст на предмет вызовов tr(), QT_TR_NOOP() и пр., текст заключенный в скобках помещается в ts файл... Кстати, QT_TR_NOOP() вообще определен как:
Код
#define QT_TR_NOOP(x) (x)
Затем lrelease создает файл перевода qm (подозреваю, что создается бинарный хэш-мэп), который загружается QTranslator, методами которого уже пользуются все вызовы tr() через QCoreApplication::translate().
Метод tr() принимает в качестве первого параметра ASCII-строку исходного текста. Чтобы одинаковые фразы из разных контекстов не путались, то любому тексту соответствует контекст, в случае Qt класса - имя класса, которому принадлежит метод, вызывающий tr() (т.е. для QWidget контекст будет "QWidget", для MyWidget - "MyWidget"). Так как QCoreApplication::translate необходимо передать несколько параметров, среди которых исходный текст, контекст, специальный комментарий программиста (используется для разделения одинаковых фраз внутри контекста), а так же переменная (обычно), которой определяется множественное значение фразы: 1 байт, 2 байта, 6 байтов. Именно поэтому следует делать исходный текст на английском:
Код
tr("%n byte(s)", NULL, size); //NULL - это отсутствующий комментарий программиста (он редко когда нужен)
Так как по-русски ты красиво не сделаешь, а в случае перевода у тебя будет возможность уже сделать вывод во всех формах...

Если ты делаешь так:
Код
const char *xxx = "my string";
...
tr(xxx);
То у тебя эта строка не будет переведена, так как "my string" не попала в файл перевода (lupdate не настолько умна, чтобы угадать, чему равен xxx). Чтобы проблему решить нужно объяснить lupdate, что "my string" необходимо переводить. Для этого следует использовать QT_TR_NOOP или QT_TR_NOOP3 (предпочтительней). Почитай раздел про локализацию приложений (документация по лингвисту, кажется).

Это сообщение отредактировал(а) bsa - 7.11.2011, 11:21
PM   Вверх
spyswamp
Дата 8.11.2011, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



Кстати, полезной опцией будет CODECFORTR. Если прописать его в *.pro файле, то в *.ts добавится тег <default> с указанной кодировкой. Это можно сделать и командой -codecfortr для lupdate, но мне сегодня показалось, что ключ работает как-то по-другому, нежели прямое указание кодека в *.pro - выходные *.ts отличались по содержимому русскоязычных строк (в одном случае абракадабра, в другом все ОК, но кодировка в обоих случаях заданная мной).


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
bsa
Дата 8.11.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



spyswamp, в отличие от новичков, профессионалы не используют кириллицу в коде. Я уже указал выше причину.
PM   Вверх
_GRIN_
Дата 9.11.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



оффтоп.
Цитата(bsa @  8.11.2011,  08:04 Найти цитируемый пост)
в отличие от новичков, профессионалы не используют кириллицу в коде. Я уже указал выше причину. 

bsa, уж х.з. какой из меня профи, но некоторое время назад мы (в нашем проекте) решили сразу писать кирилицей (обёрнутой в trUtr8() )
Т.к. в текущий момент клиенты все в России, а при необходимости вывода за рубеж подключим лингвист - а до тех пор с лингвистом даже возиться не приходится. Проект представляет из себя программный комплекс с компонентами под винду и линух - использование везде utf-8 - силовое решение начальства (имхо правильное) =)



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
spyswamp
Дата 9.11.2011, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



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


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
bsa
Дата 9.11.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



spyswamp, _GRIN_, не цепляйтесь к словам "новичок" и "профессионал". Я их употребил исключительно для придания веса своему посту, дабы неокрепшие умы не принимали скорых решений в пользу великого и могучего в коде.
PM   Вверх
_GRIN_
Дата 9.11.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



=) - да я и не цепляюсь - долгое время (проект развивается, продаётся и поддерживается уже несколько лет) мы классически в исходниках на английском писали, затем сами же себя переводили - дополнительная работа с лингвистом. Затем пришла светлая мысль - нафига.
Я, признаться, долго отбрыкивался, но потом до меня дошло, что при выходе на зарубежного пользователя мы ничего не потеряем (лингвист-то и tr никто не убирает), а вот в текущий момент лишнюю работу делать не придётся.

Вот я и решил поделиться =)

Это сообщение отредактировал(а) _GRIN_ - 9.11.2011, 12:42


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
bsa
Дата 9.11.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



_GRIN_, а как решаете проблему с множественными формами слов? Или их у вас вообще нет?

Это сообщение отредактировал(а) bsa - 9.11.2011, 13:26
PM   Вверх
_GRIN_
Дата 9.11.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



bsa, стыдно признаться. но я не понимаю о чём ты?

Повседневные мои задачи связанные с топиком выглядят примерно так:

есть текст который надо отобразить - на русском он выглядет так "Состояние сервера №1 - Норма" (плюс идентификатор сервера и состояние должены меняться)
в исходнике выглядет так:

Код

trUtf8("Состояние сервера №%1 - %2").arg(1).arg(trUtf8("Норма"));


в случае если будет иностранный заказчик (допустин требуется английский)
в лингвисте переведём так

"State of server #%1 - %2"
"Normal"


Это сообщение отредактировал(а) _GRIN_ - 9.11.2011, 14:41


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0890 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.