![]() |
|
|
![]()
|
|
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Доброго времени суток. Возникла необходимость начать переписывать большое приложение. Данное приложение вообще уже поддерживает локализацию. Ресурсы разнесены по разным dll, которые подгружаются по настройке из реестра. Но мне данный механизм очень не нравится. Во-первых, получаем кучу "лишних" dll, во-вторых когда то вообще была неразбериха, что и когда должно подключаться, в результате было потрачено много времени на поиск глюков. В-третьих, для перевода на разные языки (в том числе и диалогов, менюшек и т.п.) пользовались программой, которая оставила массу неприятных воспоминаний (от сложности в настройки до потери части переведенного текста).
Я хочу сделать следующее. Написать программульку, которая парсила бы все *.cpp и *.rc солюшена и выносила все строки в файл. Далее формировался бы еще один файл для конкретного языка, куда бы клались пары (русский - переведенное_значение). Естественно, если перевод уже есть, то шло бы слияние. При старте основной программы формировался бы map из переводов. В коде все строки обернуть во что то типа:
Translate уже ищет перевод по карте. Теперь что касается ресурсов. Каждый контрол у меня все равно свой (диалог, кнопки, списки...). Поэтому в каждом классе я пропишу код, который бы при создании объекта переводил весь имеющийся текст таким же образом как и строки. Какие я вижу минусы: 1) каждая строка будет приводить к вызову функции и поиску перевода; 2) немного придется повозиться с каждым используемым контролом; 3) процесс смены языка также нужно будет реализовать через какие-нибудь сигналы. Какие я вижу плюсы: 1) одна dll; 2) простая структура файла с переводом. все прозрачно и очевидно; 3) более ООП что ли =)) 4) возможность динамической смены языка без перезапуска приложения. Хотелось бы услышать от опытных людей. Может я не вижу каких то больших проблем в будущем, связанных с таким подходом? Заранее благодарю. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если приложение не только большое, но и долго живущее (сопровождаемое и развиваемое), то вопрос локализации нужно решать как можно более эффективно. Скажем, чтоб будет, если какой-то диалог изменится? Или строка, или ... Когда-то давно (еще в досе) я примерно так и делала: текстовый файл с парами строк. Только исходная локализация у меня была английская. Но для большого приложения возникает куча неудобств: 1) кто сказал, что одинаковые строки всегда переводятся одинаково? 2) английские и русские строки имеют разную длину - в диалогах хорошо бы видеть, как оно выглядит. Иногда приходится "подгонять" строку, чтобы покрасивше было... 3) Обновления - в очередном релизе изменились 150 строк из 15000. И? Ну и т.д. Слвшала, что сейчас вроде как есть готовые программы для локализации, но без понятия, что они умеют и насколько удобны, т.к. свою проблему мы давно решили и вполне довольны. Решили так: 1) исходная локализация - английская (просто потому, что всегда будет работать, не нужно спец. шрифты кириллицы и т.д. Да и строки короче в среднем) 2) в ядре написано несколько функций типа TranslateString, TranslateMenu, TranslateWindow. Все меню и окна строятся на базовых классах, которые эти объекты переводят при инициализации; строки загружаются примерно как в MFC, но вместо LoadString - свой аналог. 3) словари хранятся в отдельных (бинарных) файлах по модулям (DLL), ключом является комбинация ид-р ресурса + ид-р элемента либо строка, если это статик. 4) написано отдельное приложение, которое помогает переводить: анализирует ресурсы модуля, ищет, что изменилось, а что вообще не переведено ну и т.д. Все переводимые модули собраны в что-то типа проекта для этого приложения. Поддерживаются заголовочные файлы с ид-рами ресурсов, просто чтобы вместо цифр видеть ид-ры. Ну, в общем, поскольку приложение контролируешь сам, то делаешь все, что сочтешь нужным. Да, наше приложение показывает переведенный диалог, так что можно оценить как все влезает. Да, это требует определенных усилий. Зато потом становится весьма удобно жить. -------------------- ... |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Спасибо. Да, то что на диалоге на разных языках иногда приходится подгонять согласен (тут нужно будет размещать элементы так, чтобы влезло максимум). По поводу разного перевода одного слова, тут тоже конечно может возникнуть ситуация, но это все же исключение. Если изменилось 150 строк, тут я думал как: есть новый файл со всеми строчками (где 150 строк поменялись), есть старый переведенный файл. Нужно просто будет сравнить их содержание, новое добавить, чего уже нет выкинуть вместе с переводом.
Писать свою программу-анализатор, как у Вас, конечно я не смогу. Хотя может и нужно подумать в этом направлении. Может еще есть какие-нибудь способы. А то получается, что мой с дырками, вариант Earnest сложноват для моей ситуации. |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
Может использовать XML файл для текста ?????
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |