В этой статье мы рассмотрим, как изменить язык приложения на Delphi во время выполнения, используя функцию SetAppLang, и разберемся, почему стандартный метод SetDefaultLang может не работать в некоторых случаях.
Проблема с SetDefaultLang
Функция SetDefaultLang из модуля LCLTranslator предназначена для установки языка приложения. Однако, как показано в примере, она может не работать, если передать ей абсолютный путь к файлу .po или .mo.
Основные причины:
1. Неправильный формат пути – SetDefaultLang ожидает путь в определенном формате.
2. Отсутствие обработки путей в коде – функция может не учитывать абсолютные пути.
3. Проблемы с загрузкой файлов перевода – если файл не найден или неверно указан, перевод не сработает.
Решение: Использование SetAppLang
Вместо SetDefaultLang можно использовать кастомную функцию SetAppLang, которая загружает переводы напрямую.
Пример кода:
procedure SetAppLang(const LocaleFileName: string);
var
LocalTranslator: TPOTranslator;
i: Integer;
begin
if LocaleFileName = '' then Exit;
// Загружаем строки приложения
Translations.TranslateResourceStrings(LocaleFileName);
// Создаем переводчик для LCL (если нужно)
LocalTranslator := TPOTranslator.Create(LocaleFileName);
// Устанавливаем глобальный переводчик
if Assigned(LRSTranslator) then
LRSTranslator.Free;
LRSTranslator := LocalTranslator;
// Обновляем все формы и дата-модули
for i := 0 to Screen.CustomFormCount - 1 do
LocalTranslator.UpdateTranslation(Screen.CustomForms[i]);
for i := 0 to Screen.DataModuleCount - 1 do
LocalTranslator.UpdateTranslation(Screen.DataModules[i]);
end;
Как это работает?
TranslateResourceStrings – загружает строки из .po-файла в ресурсы приложения.
TPOTranslator – создает экземпляр переводчика для LCL (если нужно).
Обновление всех форм – применяет перевод к открытым формам и дата-модулям.
Альтернативный способ: Использование SetDefaultLang с правильными параметрами
Если все же хочется использовать SetDefaultLang, можно попробовать так:
Где:
- 'ru' – код языка (например, 'ru' для русского).
- 'C:\Path\To\Lang\' – путь к папке с файлами перевода.
- 'myapp' – базовое имя файла (без расширения).
Вывод
Если SetDefaultLang не работает, лучше использовать кастомный метод SetAppLang, который дает больше контроля над загрузкой переводов. В большинстве случаев это решает проблему.
Рекомендация:
- Проверьте, что файлы перевода лежат в правильной папке.
- Убедитесь, что в .po-файле указан корректный язык.
- Если нужно переводить LCL (кнопки, сообщения), добавьте файл lclstrconsts.XX.po.
Пример структуры папки с переводами:
/lang
/ru
myapp.po
lclstrconsts.po
/en
myapp.po
Теперь ваше приложение сможет переключать язык на лету без проблем! 🚀
Статья объясняет, как изменить язык в приложении Delphi во время выполнения с помощью функции `SetAppLang` и рассматривает недостатки стандартного метода `SetDefaultLang`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.