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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Автоматизация привода программы под требования Linguist  (Прочитано 6877 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« : Октябрь 07, 2014, 10:14 »

Добрый вечер.
Имеется некий немалый пласт унаследованых Qt-программ, в которых русские тексты ввалены прямо в исходники. Есть нестерпимый зуд привести их к нормальному виду (английские строки, tr(), файлы перевода).
Насколько я понимаю, максимально формализуемый алгоритм здесь такой:
1) Обрамить все русские строки в tr() и повыкидывав костыли типа fromLocal8Bit();
2) вытащить их в файл(ы) .ts (вероятно, здесь удастся воспользоваться lupdate, но я не знаю, схватит ли она нелатинские строки);
3) поставить в файле(ах) .ts "оригинал" на место перевода, где он и должен обретаться;
4) выполнить перевод .ts на английский;
5) по полученному .ts заменить все русские строки в исходниках на английский.
Понятно, что шаг 4 будет делаться вручную. А вот есть ли какой-нибудь  способ/утилита автоматизировать шаги 1, 3 и 5? (ну и 2 заодно, если строгая lupdate окажется работать в нештатных условиях)

Первая мысль, приходящая в голову - написать три скрипта на перле Улыбающийся Но может, кто-то эту задачу или некоторые её части уже решил?
« Последнее редактирование: Октябрь 15, 2014, 19:23 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
OKTA
Гость
« Ответ #1 : Октябрь 07, 2014, 10:27 »

А не проще вытащить все русские слова, отдельно их перевести вручную, заменить в исходниках с указанием tr() и потом уже делать переводы лингвистом куда хочешь?  Улыбающийся
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #2 : Октябрь 15, 2014, 19:21 »

Ну вытащил я их до tr-изации в какой-то самописный файл. По идее, это должно быть что-то типа того же .ts, т.е. должна запоминаться связь вытащенных строк с оригиналом. Т.е. придётся написать свой аналог lupdate, ибо оригинальному нужен tr(). Далее после перевода надо написать утилиту, которая будет производить замену в исходниках и заодно "переворачивать" .ts, меняя местами оригинал и перевод. После этого уже при необходимости можно Лингвистом переводить на третий, чевёртый и прочие языки.

Нет, не сильно проще. Программ будет не три, а две, правда, но они будут сложнее.
Я не буду отвергать этот вариант с порога (для пользователя он действительно чуть проще). Подумаю. Но работать за lupdate пока не очень охота Улыбающийся
« Последнее редактирование: Октябрь 15, 2014, 19:30 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
RSATom
Гость
« Ответ #3 : Октябрь 17, 2014, 07:45 »

Ну вытащил я их до tr-изации в какой-то самописный файл. По идее, это должно быть что-то типа того же .ts, т.е. должна запоминаться связь вытащенных строк с оригиналом.

Можно при вытаскивании сразу добавлять tr.
Например, tstrings.h:
Код:
#pragma once

#define MyDialogLabelText MyDialog::tr("text")

а в MyDialog  вместо текста использовать MyDialogLabelText


upd: а можно еще и контекст поменять при необходимости.

Код:
#pragma once

namespace S {
class FakeTrContext { Q_DECLARE_TR_FUNCTIONS( S::FakeTrContext ); };
}

#define MyDialogLabelText S::FakeTrContext::tr("text")
« Последнее редактирование: Октябрь 17, 2014, 07:48 от RSATom » Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #4 : Январь 02, 2015, 18:48 »

С шагом 2, кажется, наступила ясность. Если вместо tr() использовать trUtf8() (разумеется, при условии, что строки в программе действительно в этой кодировке), то lupdate замечательно вытаскивает их в .ts.

Linguist тоже не возражает против того, чтобы переводить русский источник на английский язык, и создаёт корректный .ts. Правда, просмотр исходника по выбранной ошибке (в правой части окна Linguist) происходит в битой кодировке, но тут уж ничего не попишешь.

Осталось написать "переворачиватель".
« Последнее редактирование: Январь 04, 2015, 00:38 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #5 : Январь 26, 2016, 01:55 »

Дальнейшие эксперименты вылились в написание консольной программки, которую я назвал LInvert (по аналогии с lupdate и lrelease).
Процесс адаптации программ на Qt4/5 к требованиям Qt Linguist с применением LInvert включает в себя 4 шага:
  • Проводим ревизию исходных текстов. Проверяется, что все файлы программы выполнены в кодировке UTF-8, а все строки, подлежащие переводу, обрамлены в функцию trUtf8. Эти строки не должны составляться слишком сложным образом, другими словами, их должна понимать утилита lupdate из Qt Linguist. Для упрощения унификации кодировок unix-программисты могут воспользоваться программой enca (в отличие от iconv она умеет автоопределять кодировки).
  • Создаём прототипы файлов перевода. Прототипы - это обычные файлы .ts, но теги source и translation у него "перепутаны". Создаются обычной командой lupdate.
  • Переводим файлы .ts на английский с помощью Linguist. Переводчикам (если это отдельные люди) надо объяснить, что национальный текст будет в графе "Исходный текст", а английский - в графе "Русский перевод", и это нормально. Если часть сообщений уже была на английском языке, их можно перевести обратно. По окончании этого шага можно пометить сообщения, которые уже были на английском языке, чтобы linvert их не переводил. Для этого в элемент добавляется атрибут linvert="false". До вызова Linguist это делать смысла нет, поскольку Linguist такого атрибута не знает и просто удалит его при перезаписи файла. Атрибут linvert="true", наоборот, сообщит, что сообщение надо переводить, даже если программа вызвана с ключом -i (см. "Вызов программы").
  • Теперь можно осуществить собственно замену, вызвав linvert и указав ей, какие .ts-файлы следует переводить. Программа создаст новый .ts-файл с суффиксом соответствующего языка, а также заменит в исходных файлах (*.ui, *.h, *.cpp) национальные сообщения на английские.
Более подробное описание - у меня на сайте.
Исходники - на гитхабе. Двоичных сборок я не делаю, поскольку программист, применяющий Qt, скорее всего, предпочтёт собрать программу под свою любимую ОС, версию Qt, архитектуру и разрядность процессора Подмигивающий Я проверял работу на 64-разрядной Debian Jessie. Замечания и пожелания приветствуются.
« Последнее редактирование: Январь 26, 2016, 02:05 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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