Перейти к содержанию
Fire Monkey от А до Я
  • 0

Мультиязычность в приложении


Dmitry_4501

Вопрос

Здравствуйте!

Написал значит я приложение, для него мне необходима поддержка смены языка интерфейса.

Не став использовать готовые компоненты я решил написать свою библиотеку. Все реализовал, но осталась одна функция, которая не хочет работать:

т.к компонентов на форме может быть множество я решил воспользоваться перебором компонентов по форме.

Вот код:

Спойлер

function SetLanguage(c: TFmxObject): boolean; stdcall; export;
  var
    UniqueID: string;
    Locale:
string;
    cl:
string;
 
begin
        cl := c.ClassName;
       
if (cl = 'TButton') or (cl = 'TLabel') or (cl = 'TCheckBox') or
          (cl = 'TRadioButton') or (cl = 'TSpeedButton') then
         
begin
            UniqueID := (c as TPresentedTextControl).Text;
            Locale := getString(UniqueID);
            (c as TPresentedTextControl).Text := Locale;
         
end;
       
if (cl = 'TEdit') then
         
begin
            UniqueID := (c as TCustomEdit).TextPrompt;
           
if UniqueID <> '' then
             
begin
                Locale := getString(UniqueID);
                (c as TEdit).TextPrompt := Locale;
             
end;
         
end;
       
if (cl = 'TMenuItem') then
         
begin
            UniqueID := (c as TMenuItem).Text;
           
if UniqueID <> '' then
             
begin
                Locale := getString(UniqueID);
                (c as TMenuItem).Text := Locale;
             
end;
         
end;
       
if (cl = 'TTabItem') then
         
begin
            UniqueID := (c as TTabItem).Text;
           
if UniqueID <> '' then
             
begin
                Locale := getString(UniqueID);
                (c as TTabItem).Text := Locale;
             
end;
         
end;
       
if (cl = 'TForm') then
         
begin
            UniqueID := (c as TForm).Caption;
           
if UniqueID <> '' then
             
begin
                Locale := getString(UniqueID);
                (c as TForm).Caption := Locale;
             
end;
         
end;
     
end;
 

Получилось весьма странно конечно, но вот:

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

я воспользовался способом "в лоб"

в уже готовом приложении все, что нужно переводить, в коде заполнил через собственную функцию тем или иным значением

~25 форм - около 200-250 строк в словаре

вся работа заняла около 2 дней. не так уж сложно, и точно все будет работать так как надо ))

Ссылка на комментарий
  • 0
18 часов назад, Steepe_Hare сказал:

а TLang, который идёт в упаковке Embarcadero?

Решил не пользоваться компонентами из коробки, а написать свою библиотеку, она работает как надо, но вот не хочет менять свойства компонентов на форме

Ссылка на комментарий
  • 0
В 04.01.2017 в 22:33, krapotkin сказал:

я воспользовался способом "в лоб"

в уже готовом приложении все, что нужно переводить, в коде заполнил через собственную функцию тем или иным значением

~25 форм - около 200-250 строк в словаре

вся работа заняла около 2 дней. не так уж сложно, и точно все будет работать так как надо ))

Когда я думал написать библиотеку, я старался делать упор на удобство использования, всю работу библиотека взяла на себя, от приложения требуется импортировать две функции, одна отвечает за загрузку определенного языкового пакета, вторая за инициализацию библиотеки (перевод).

И чтобы не городить в коде программы для каждого компонента перевод я решил воспользоваться перебором всех компонентов на форме. Все работает, кроме изменения свойства Text у компонентов.

Чтобы не городить даже в самой библиотеке кучу условий, например

if Comp.ClassName = 'TLabel' и т.д с каждым классом я решил использовать класс TPresentedTextControl, он является родителем для множества компонентов, и все работает прекрасно, когда все исполняется в самом приложении, но стоит только засунуть этот код в библиотеку, как тут же получаю ошибку Invalid Class Typecast.

Хотя попробовал написать еще одну функцию, где в параметрах было указана четко Кнопка, Comp: TButton, все как ни странно сработало, не знаю в чем дело.

Ссылка на комментарий
  • 0

У меня в TLang в Seattle тупо в редакторе перевод нельзя добавить, так что это не наш метод xD

В примере FMX приложения PowerOff просто в коде на русский текст заменяю, если в русской винде запущенно: https://github.com/errorcalc/PowerOff/blob/master/Main.pas#L206

Хотя это костыль, и для более крупного приложения надо написать вспомогательный модуль.

В Vcl есть встроенное средство для перевода, неплохое(хотя и заброшенное немного имхо), я его в https://github.com/errorcalc/ProjectScreen к примеру использую. Жалко аналога в Fmx нет.

Ссылка на комментарий
  • 0
19 часов назад, Дмитрий Потапов сказал:

всю работу библиотека взяла на себя

интересно, какая еще есть работа тут кроме условного вывода всех текстовых констант и перевода всех caption, text, listitem.text,detail и других?

и, судя по тексту, вторая часть ( компоненты ) у вас не реализована...

при этом компоненты в библиотеке нужно прямо все перечислить. либо с RTTI вдоволь поиграться. Стоит ли оно того?

Ссылка на комментарий
  • 0
7 часов назад, krapotkin сказал:

интересно, какая еще есть работа тут кроме условного вывода всех текстовых констант и перевода всех caption, text, listitem.text,detail и других?

и, судя по тексту, вторая часть ( компоненты ) у вас не реализована...

при этом компоненты в библиотеке нужно прямо все перечислить. либо с RTTI вдоволь поиграться. Стоит ли оно того?

Все, решил воспользоваться компонентом из стандартных

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...