Редизайн интерфейса приложения. #4

Одной из самых неприятных проблем при переводе проекта на старшую версию Delphi стала локализация. Я использую “родной” инструментарий.
alt
На первый взгляд, языковые проекты нормально конвертируются. Более того, несмотря на то, что в Delphi 2007 специфические символы в переводах не отображаются правильно, *.dfn файлы (те в которых хранятся переводы ресурсов формы) содержат юникод строки. Поэтому, если эти проекты пересобрать в Delphi 2009/2010/XE, то все ранее вбитые переводы будут выглядеть так, как они должны выглядеть без дополнительных телодвижений:

Но при детальном рассмотрении, выявляются некоторые артефакты.

altВот так будет отрабатываться казалось бы обычный код MessageDlg(’To continue please restart the application.’, mtWarning, [mbOK], 0); на том же чешском языке.

Естественно, все это после обновления языковых файлов. Без него вы получите просто AV при попытке подгрузить язык.

Мне показалось очевидным вариантом снести языки и создать языковые проекты заново. Но и тут меня ждало разочарование. Дело в том, что в проекте используется такой код:


s := Application.ExeName;
strVerExe := GetStringFileInfo(PChar(s), gstrSTRING_FILE_INFO_PRODUCT_VERSION);
GetLocaleInfo(Locale,
LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
s := ExtractFilePath(s)
+ gstrFOLDER_LANGUAGE + ‘\’ + ChangeFileExt(ExtractFileName(s), ’.’ + StrPas(LocaleName));
if FileExists(s) then
begin
strVerLng :=
GetStringFileInfo(PWideChar(s),
PWideChar(gstrSTRING_FILE_INFO_PRODUCT_VERSION));
if (strVerExe strVerLng) then
begin
MessageBox(GetActiveWindow(),
PChar(gstrMSG_USE_IDENTICAL_LANG_FILE +
#13#10 + Format(gstrMSG_PROGRAM_VER, [strVerExe]) +
#13#10 + Format(gstrMSG_LANG_FILE_VER, [strVerLng])),
PChar(gstrCAPTION_WARNING), MB_OK + MB_ICONWARNING);
Exit;
end;
end;
Иными словами, при переключении языка проверяется соответствие версии программы и версии языкового файла. на мой взгляд. это очень разумный и правильный подход.
Но и тут не все хорошо. Я столкнулся с ошибкой, которую в свое время выявил тот же Александр Алексеев, и которая описана на QC.
Delphi 2010, очевидно как и XE, не сохраняет информацию о версии проекта, что делает невозможным использование приведенного выше кода.
И все же мне удалось найти решение. Последовательность действий которое я привожу ниже пошагово, начиная от момента портирования проекта:
Обновляем языковые проекты (Project/Languages/Update Localized Projects);
Поочередно удаляем все языки (Project/Languages/Remove… для каждого из языков);
Переименовываем папки с языковыми файлами (делаем их дампы);
Создаем новые языковые проекты (Project/Languages/Add… для каждого из языков);
Переписываем содержимое папок с языковыми проектами из дампов;
Обновляем языковые проекты (Project/Languages/Update Localized Projects);
Выставляем нужную версию языковых проектов;
Собираем проекты.
Очевидно, что штатными средствами Delphi не может создать какой-то ресурс. Я не вдавался пока в детали этого процесса, хотя можно было бы сравнить резервный проект и вновь созданный на предмет различий. Но так или иначе приведеный выше алгоритм работает. По крайней мере у меня под Vista 32 bit.

В контексте вышесказанного возникает один каверзный вопрос. А что будет если проект пишется изначально на Delphi 2010? Думаю, если вы создадите пустой языковый проект в Delphi 2007, установите его версию, и будете использовать его дамп вместо актуального, эффект будет тем же. Опять же, я не успел проверить это предположение, но мне кажется это так.

Понравилась статья? Поделиться с друзьями: