Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Одной из самых неприятных проблем при переводе проекта на старшую версию Delphi стала локализация. Я использую “родной” инструментарий. Подробно он описан в блоге Александра Алексеева.

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

translate

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

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

artefact

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

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

  1. s := Application.ExeName;
  2. strVerExe := GetStringFileInfo(PChar(s), gstrSTRING_FILE_INFO_PRODUCT_VERSION);
  3. GetLocaleInfo(Locale,
  4. LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
  5. s := ExtractFilePath(s)
  6. + gstrFOLDER_LANGUAGE + ‘\’ + ChangeFileExt(ExtractFileName(s), ‘.’ + StrPas(LocaleName));
  7. if FileExists(s) then
  8. begin
  9. strVerLng :=
  10. GetStringFileInfo(PWideChar(s),
  11. PWideChar(gstrSTRING_FILE_INFO_PRODUCT_VERSION));
  12. if (strVerExe <> strVerLng) then
  13. begin
  14. MessageBox(GetActiveWindow(),
  15. PChar(gstrMSG_USE_IDENTICAL_LANG_FILE +
  16. #13#10 + Format(gstrMSG_PROGRAM_VER, [strVerExe]) +
  17. #13#10 + Format(gstrMSG_LANG_FILE_VER, [strVerLng])),
  18. PChar(gstrCAPTION_WARNING), MB_OK + MB_ICONWARNING);
  19. Exit;
  20. end;
  21. 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, установите его версию, и будете использовать его дамп вместо актуального, эффект будет тем же. Опять же, я не успел проверить это предположение, но мне кажется это так.

Другие статьи серии:

Редизайн интерфейса приложения. #0
Редизайн интерфейса приложения. #1
Редизайн интерфейса приложения. #2
Редизайн интерфейса приложения. #3
Редизайн интерфейса приложения. #5
Редизайн интерфейса приложения. #6
Редизайн интерфейса приложения. #7
Редизайн интерфейса приложения. #8


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика