Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: DarkHobbit от Октябрь 07, 2014, 10:14



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

Первая мысль, приходящая в голову - написать три скрипта на перле :) Но может, кто-то эту задачу или некоторые её части уже решил?


Название: Re: Автоматизация привода к программы под требования Linguist
Отправлено: OKTA от Октябрь 07, 2014, 10:27
А не проще вытащить все русские слова, отдельно их перевести вручную, заменить в исходниках с указанием tr() и потом уже делать переводы лингвистом куда хочешь?  :)


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

Нет, не сильно проще. Программ будет не три, а две, правда, но они будут сложнее.
Я не буду отвергать этот вариант с порога (для пользователя он действительно чуть проще). Подумаю. Но работать за lupdate пока не очень охота :)


Название: Re: Автоматизация привода программы под требования Linguist
Отправлено: RSATom от Октябрь 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")


Название: Re: Автоматизация привода программы под требования Linguist
Отправлено: DarkHobbit от Январь 02, 2015, 18:48
С шагом 2, кажется, наступила ясность. Если вместо tr() использовать trUtf8() (разумеется, при условии, что строки в программе действительно в этой кодировке), то lupdate замечательно вытаскивает их в .ts.

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

Осталось написать "переворачиватель".


Название: Re: Автоматизация привода программы под требования Linguist
Отправлено: DarkHobbit от Январь 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) национальные сообщения на английские.
Более подробное описание - у меня на сайте (http://zvyozdochkin.ru/projects/linvert/).
Исходники - на гитхабе (https://github.com/DarkHobbit/linvert). Двоичных сборок я не делаю, поскольку программист, применяющий Qt, скорее всего, предпочтёт собрать программу под свою любимую ОС, версию Qt, архитектуру и разрядность процессора ;) Я проверял работу на 64-разрядной Debian Jessie. Замечания и пожелания приветствуются.