В этой заметке я хотел бы изложить план, по которому я буду делать патч для Fluxbox. Этот план будет для меня полезен, потому что возможно будет оценить как много/мало уже сделано, что нужно cделать следующим и т.д. Патч вообщем-то не очень сложный, но будет объемным. Его задача это возможность использования gettext. Gettext - это инструмент, позволяющий быстро и легко создавать приложения, которые бы легко поддавались локализации и интернационализации (в данный момент для меня оба этих слова являются синонимами, но вроде бы у них есть различия). Другими словами, програма, использующая gettext сможет легко и непринужденно «разговаривать» с пользователем на его языке (русском, немецком, французском и т.д.)
Всю работу, котрую нужно сделать я разбил на три этапа: подготовка, реализация и продвижение. Вот более подробное описание как этапов так и их составляющих:
- Подготовка
На этой стадии я подготовлюсь и подготовлю все к созданию патча.
- написание макроса
Как я уже писал, я решил часть работы автоматизировать, потому что бОльшая часть патча является достаточно тривиальной правкой исходников. В связи с попутным изучением XEmacs я хочу написать функцию, которая бы эту правку осуществляла за меня, а я лишь при необходимости прибегал к ручной корректировке.
- чтение документации
Ну без этого никуда :) Я собираюсь прочитать info gettext и еще одну статейку из интернета, чтобы получить максимально полное и правильное представление о работе gettext и его внедрении в программу. Это нужно сделать до начала работ, чтобы потом мне не пришлось что-либо еще раз искать и исправлять, делая таким образом работу повторно.
- составление списка файлов для обработки
На этой стадии выявляются файлы, которые я буду править. Это также поможет видеть сколько файлов я уже обработал и сколько осталось.
- Реализация
На этой стадии будет вестись основная работа по созданию патча, потому что именно в этом периоде я патч создавать и буду %)
- использование функций gettext
Самый долгий и объемный этап. Хотя благодаря использованию макроса я планирую его несколько ускорить и сделать более веселым :) Смысл здесь это во всех файлах, из списка, составленного на стадии подготовки, заменить функции используемые во Fluxbox сейчас на функции gettext. Причем, говоря «заменить» я не имею ввиду удалить совсем, нет. Возможность, использования gettext будет опциональной и поэтому в исходниках нужно будет все обрамить #ifdef'ами.
Здесь я хотел бы сделать маленькое отступление и объяснить почему я не хочу сделать всю работу по замену функций польностью автоматической, написав простенький скрипт. Во-первых, я не очень доверяю автоматизму, написав скрипт, возможно, что я не учту всех мелочей и в итоге у меня появится много ошибок в коде, а этого допускать я не хочу. Во-вторых, осуществляя правки в коде в полуручном режиме у меня будет возможность немного лучше разобраться в коде программы, возможно, найти ошибки да и просто посмотреть на то как пишут програмы другие программисты.
Также есть возможность не править везде вызовы макросов _FBTEXT и пр. Можно просто определять эти макросы в одном месте и потом препроцессор везде сам подставит нужную функцию. Я не углублялся в детали, возможно, даже что такой способ бы и не сработал. Просто я сразу отмел эту идею, так как опять же у меня есть цель покопаться в исходниках да и если в будущем понадобиться полностью перейти с gencat на gettext, то будет проще это сделать.
- написать скрипт cat2po
Мне понадобится скрипт, который бы конвертировал существующие cat-файлы в po-файлы. Возможно, что в интернете уже есть подобный скрипт, нужно будет поискать, но и самому написать его будет интересно и не очень трудно. Нужен обязательно скрипт, потому что вручную конвертировать файлы это долго, нудно, возможны ошибки, за которые мне потом будет стыдно, ну и главный довод - это не путь кодера :) Здесь работа очень однообразная, можно легко задать алгоритм, а если есть алгоритм, то можно написать и программу, которая сделает все за меня по заданному алгоритму. Одним словом, как написано в HOWTO о том как стать хакером: «рутина - это зло».
- добавить опцию к configure
Здесь работы не много. Нужно добавить к скрипту configure опцию --enable-gettext (или --with-gettext, пока еще не решил какую лучше). Также нужно, чтобы скрипт проверял наличие заголовочных файлов gettext и правильно выставлял define'ы.
- создать Makefile
Нужно будет создать Makefile.am для директории с po-файлами, чтобы при компиляции они «превращались» в mo-файлы, а при установке устанавливались в /usr/share/locale/$LANG/LC_MESSAGES/fluxbox.mo Кажется не таким сложным, но у меня нет опыта работы создания Makefile'ов и, возможно, что придется читать опять же документацию. А там много ;))
- Продвижение (promotion)
К началу этой стадии у меня у же будет патч и он даже будет работать ;) Мне останется лишь его хорошо протестировать и попытаться отправить в upstream то бишь разработчикам.
- тестирование
Попросить нескольких знакомых, которые используют Fluxbox попробовать патч, высказать свои предложения и найти ошибки. Также, думаю, что стоит выложить этот патч в интернете.
- включение в пакет для ALT Linux
Добавить этот патч в мою сборку Флюкса для АЛЬТа.
- отправить патч разработчикам
Тут самое главное ради чего я и затевал весь сыр-бор. Мне хотелось бы, чтобы разработчики приняли мой патч и включили в свое дерево разработки. Я уже говорил на эту тему и почти уговорил Henrik'а (главного разработчика), но тут подоспел Mathias и начал говорить, что это не надо :( Я не знаю почему он не хочет использовать gettext и зачем он хочет модернизировать обработку cat-файлов. Мое мнение, что технология c использованием gencat устарела и пытаться ее улучшить это городить лишние костыли и изобретать велосипед. Особенно это выглядит странным на фоне существования gettext, который используется в большинстве проектов и работает. В нем уже учтены многие проблемы.
Но у меня есть надежда :) Во-первых, потому что все-таки Henrik главный разработчик, а его я уже почти уговорил в тот раз, а, во-вторых, возможно, что если я представлю свой патч раньше, то у меня появится некоторые преимущества. Ну и то что патч будет опциональным тоже, возможно, как-то повлияет.
Вот и весь план, который, наверное, стоит лучше называть техническим заданием (ТЗ). Замечу, что некоторые из пунктов во всех трех стадиях возможно выполнять параллельно с другими пунктами или даже менять их очередность.
На сегодня всё. Разработка макроса уже идет, а значит работы по созданию патча уже начались!
Updated(22082005): сообщение «свернуто», чтобы в ленте у друзей занимать меньше места да и просто для удобства
Updated(09112005): Подправил форматирование, исправил кучу опечаток; многое из написанного изменилось, но менять пока ничего не стал. Также разместил этот текст на
http://www.freesource.info/wiki/TZ/fluxbox/GettextSupport Отныне все изменения вы можете наблюдать именно там.