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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by dos999, 24 Sep 2009.

  1. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    Вот недавно столкнулся с необходимостью сделать в программе (ужа написаной) мультиязычный интерфейс, т.е. чтобы все Caption'ы и тому подобные свойства были на таком языке который выберет пользователь из моего списка.
    Может кто нить уже занимался подобными вещами, посоветуйте как лучше сделать.

    Была идея хранить тексты в каком нить ini или xml файле, в Form.OnCreate сделать перебор всех компонентов и по имени компонента находить и присваивать нужный Caption. Недостаток этого метода в том что если имя компонента измениться то будет Exception. Ещё можно искать не по имени а по тому же Caption но тут ещё хуже.

    Хелп ми народ, подкиньте идейку.
     
  2. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    А если в ini-файле прописывать имя компонента? Например:
    Code:
    :rus
    caption1=текст1
    caption2=текст2
    :eng
    caption1=text1
    caption2=text2
    
    P.S.: Не совсем понял, каким образом имя компонента изменится в готовой программе?
     
  3. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    В том то и дело что проек постоянно меняеться (развиваеться) и не исключено что имена компонентов нужно будет менять. допустим был какой нить Label12 а стал LbName
     
  4. BlackSilver

    BlackSilver New Member

    Joined:
    30 Jan 2009
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    http://www.codenet.ru/progr/delphi/stat/multilang.php
    Отличное решение, хотя я этот код фиксил. Уже не помню, как.
     
    1 person likes this.
  5. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    В Delphi вроде есть что-то типа встроенной мультиязычности. Если рядом с исполняемым файлом положить библиотеку с переведенными ресурсами с расширением rus, то приложение будет использовать ресурсы из этой библиотеки.
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    мда...

    https://forum.antichat.ru/thread142629.html
    не судьба соседние темы посмотреть? Тем более что в заголовке описана (более/менее) твоя проблема
     
  7. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    Да в Delphi есть translation manager всё там делается очень легко и прикольно, но вот компилить можно помоему только 1 язык из добавленных. а мне 2 exe'шника никчему.
     
  8. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    спс BlackSilver, но о недостатках этого метода я уже говорил, искать компоненты по имени или кэпшену сейчас для меня "не по фен-шую", т.к. проект активно изменяется.

    W!z@rD и что в этой теме общего с моей? как компоненты цыклом перебрать и ослу понятно.
     
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    лооолл
    1. Цикл
    2. "Недостаток этого метода в том что если имя компонента измениться"

    ололо? не правда ли?
     
  10. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    =) ну ты ппц) чё написал то,сам понял?) ладно нехочу сориться, видимо друг друга не поняли.
     
  11. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Можно использовать компонент TsiLang
     
  12. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    Сори что поднял эту тему, просто хотелось бы высказаться по результатам решения проблемы:
    В Borland не лохи сидели и всё уже продумали. Локализация приложения осуществляется очень легко встроенными средствами. Итак, по шагам

    1. открываем наш проект (который нужно перевести с русского на буржуйский ) и заходим в Project => Languages => Add
    2. далее следуем указаниям мастера (выбираем язык, в нашем случае это English(UK) ENG). среда создаст Progect Group и ещё один отдельный проект.
    3. Открывается программа Translation Manager в ней то мы и осуществляем весь перевод. Тут существует несколько подводных камней о которых я напишу ниже.
    4. Всё перевели, сохранилии закрыли. теперь открываем проект который у нас создался автоматически в папке ENG и компилим его.
    5. В результате компиляции сформируеться файл Project1.ENG в котором находяться все наши труды и старания по переводу.
    6. Тут возникает вопрос, как указать при запуске какой интерфейс мы хотим видеть в программе (наш родной русский или буржуйский из файла project1.ENG). Регулируеться это всё дело значение в реестре HKCU\Software\Borland\Lacales\ (необходимо добавить текстовое значение с полным патчем к файлу, например c:\Progect1.exe) если значение ключа ENG то все строки беруться из Project1.ENG иначе всё по умолчанию на русском.

    ПОДВОДНЫЕ КАМНИ И УКАЗАНИЯ ПО ЛОКАЛИЗАЦИИ
    Я уверен что опишу далеко не все, но вот те с которыми столкнулся я.
    1. Все строки(которые вы желаете перевести) в коде нужно вывести в resourcestring только там их можно увидеть Translation Manager'ом. (даже те строки которые у вас в разделе const)
    Пример :
    Code:
    было
    const
    cnstHeadConfig = 'Настройки';
    ...
    Edit1.text := cnstHeadConfig;
    Edit2.text := 'Текст1';
    
    стало
    resourcestring
      cnstHeadConfig = 'Настройка';
      cnstText1 = 'Текст1';
    ...
    Edit1.text := cnstHeadConfig;
    Edit2.text := cnstText1;
     
    2. При формировании фала (с которым в последующем будет работать TranskateManager) программа парсит dfm файлы нашего проекта и вытаскивает строковые значения. У меня возникла проблема с некоторыми dx компонентами, такими как dxEditButton, кнопки в него пришлось добавлять програмно, т.к. парсинг такие записи в dfm-ке неберёт =(.

    Заключение
    При добавлении/изменении строк, имён объектов в проекте мы заходим в project => Languages => Update и переводим добавленные строки.
    На мой взгляд всё очень просто и удобно. Будут вопросы пишите.
    PS. Сори за знаки препинания... торопился.
     
  13. 0ldbi4

    0ldbi4 Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    264
    Likes Received:
    51
    Reputations:
    10
    А я как-то сталкивался с этой проблемой:
    Просто в массив со строками заносил строки нужного языка,
    а caption'ам присваивал значение элемента массива, единственное если много слов нужно мто много элементов в которых легко запутатся.
     
  14. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    20ldbi4 У меня в приложении около 3к строк было.

    Возникла её одна проблема... сервисы по такой схеме не работают.
    в реестре пишу например
    строковое значение C:\123\MyService.exe содержащее ENG

    в папке 123 лежит 2 файла MyService.exe и MyService.ENG.
    И при всём при этом сервис один хнр запускается на русском.
    Ребят.... есть мысли?