Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многоязычный интерфейс 
V
    Опции темы
namra
Дата 17.11.2008, 21:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



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

 procedure ChangeLang(LangSection: string);
var
  // временная числовая переменная для выборки всех компонентов
  i: Integer;
  LangIniFile: TIniFile;
  // строковая переменная для получения каталога, где находится запущенный EXE файл
  ProgramPath: string;
begin
  // если в окне больше одного компонента
  if ComponentCount <> 0 then 
  begin
    // получаем каталог, где лежит запущенный EXE файл
    ProgramPath := ExtractFileDir(Application.ExeName);
    // гарантированно устанавливаем последний символ '\' в конце строки
    if ProgramPath[Length(ProgramPath)] <> '\' then
      ProgramPath := ProgramPath + '\';
    // подготавливаем INI файл. Он должен иметь название lang.ini
    // и должен находиться в каталоге программы
    LangIniFile:=TIniFile.Create(ProgramPath+'lang.ini');
    // читаем заголовок окна
    Caption:=LangIniFile.ReadString(LangSection,name,Caption);
    // перебираем все компоненты в этом окне
    for i:=1 to ComponentCount do
    begin
      // если выбран из массива компонент Button, то изменяем текст на кнопке
      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Caption);

      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).hint := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Hint);
      // аналогично для других типов:
      if Components[i-1].ClassType = TMenuItem then
        (Components[i-1] as TMenuItem).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TMenuItem).Caption);

      if Components[i-1].ClassType = TLabel then
        (Components[i-1] as TLabel).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TLabel).Caption);
      if Components[i-1].ClassType = TEdit then
        (Components[i-1] as TEdit).Text := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TEdit).Text);
    end;
    LangIniFile.Free; // освобождаем ресурс
  end;
end;

PM MAIL   Вверх
Akella
Дата 17.11.2008, 23:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



для таких вопросов

Цитата(namra @  17.11.2008,  21:16 Найти цитируемый пост)
как мне его записать в отдельный unit


Цитата(namra @  17.11.2008,  21:16 Найти цитируемый пост)
подключать к каждой форме через uses

есть раздел Delphi для новичков

Добавлено через 2 минуты и 1 секунду
 smile О и ещё, заметил вот что. Название темы
Цитата
многоязычный интерфейс

ну никак не относиться к твое1 проблеме

Добавлено через 3 минуты и 43 секунды
namra, в IDE же есть команда: File->New, выбери там новый unit и вставишь свой код в него.

А в остальных модулях проекта просто в uses добавишь имя нового модуля.
PM MAIL   Вверх
namra
Дата 18.11.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



Создал Unit запихал код выдал: Очень нужно может кто опишет где это описать и что исправить

Код

unit trans;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,IniFiles, Menus;

implementation
 procedure ChangeLang(LangSection: string);
var
  // временная числовая переменная для выборки всех компонентов
  i: Integer;
  LangIniFile: TIniFile;
  // строковая переменная для получения каталога, где находится запущенный EXE файл
  ProgramPath: string;
begin
  // если в окне больше одного компонента
  if ComponentCount <> 0 then 
  begin
    // получаем каталог, где лежит запущенный EXE файл
    ProgramPath := ExtractFileDir(Application.ExeName);
    // гарантированно устанавливаем последний символ '\' в конце строки
    if ProgramPath[Length(ProgramPath)] <> '\' then
      ProgramPath := ProgramPath + '\';
    // подготавливаем INI файл. Он должен иметь название lang.ini
    // и должен находиться в каталоге программы
    LangIniFile:=TIniFile.Create(ProgramPath+'lang.ini');
    // читаем заголовок окна
    Caption:=LangIniFile.ReadString(LangSection,name,Caption);
    // перебираем все компоненты в этом окне
    for i:=1 to ComponentCount do
    begin
      // если выбран из массива компонент Button, то изменяем текст на кнопке
      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Caption);

      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).hint := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Hint);
      // аналогично для других типов:
      if Components[i-1].ClassType = TMenuItem then
        (Components[i-1] as TMenuItem).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TMenuItem).Caption);

    end;
    LangIniFile.Free; // освобождаем ресурс
  end;
end;
end.




выдал ошибки

Код

[Error] trans.pas(18): Undeclared identifier: 'ComponentCount'
[Warning] trans.pas(18): Comparing signed and unsigned types - widened both operands
[Error] trans.pas(29): Undeclared identifier: 'Caption'
[Error] trans.pas(29): Undeclared identifier: 'name'
[Error] trans.pas(34): Undeclared identifier: 'Components'
[Error] trans.pas(34): 'THEN' expected but identifier 'ClassType' found
[Error] trans.pas(38): 'THEN' expected but identifier 'ClassType' found
[Error] trans.pas(42): 'THEN' expected but identifier 'ClassType' found
[Error] trans.pas(53): Statement expected but end of file found
[Fatal Error] Unit1.pas(7): Could not compile used unit 'trans.pas'


Это сообщение отредактировал(а) namra - 18.11.2008, 00:04
PM MAIL   Вверх
remax
Дата 18.11.2008, 00:39 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Проще использовать один Unit, а перевод осуществлять специальными средствами, например JvTranslator из библиотеки JEDI.  


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Bose
Дата 18.11.2008, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



замени текст на такой:
Код

unit trans;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,IniFiles, Menus;
procedure ChangeLang(LangSection: string;aForm:TForm);
implementation
 procedure ChangeLang(LangSection: string;aForm:TForm);
var
  // временная числовая переменная для выборки всех компонентов
  i: Integer;
  LangIniFile: TIniFile;
  // строковая переменная для получения каталога, где находится запущенный EXE файл
  ProgramPath: string;
begin
  // если в окне больше одного компонента
  with aForm do
  if ComponentCount <> 0 then 
  begin
    // получаем каталог, где лежит запущенный EXE файл
    ProgramPath := ExtractFileDir(Application.ExeName);
    // гарантированно устанавливаем последний символ '\' в конце строки
    if ProgramPath[Length(ProgramPath)] <> '\' then
      ProgramPath := ProgramPath + '\';
    // подготавливаем INI файл. Он должен иметь название lang.ini
    // и должен находиться в каталоге программы
    LangIniFile:=TIniFile.Create(ProgramPath+'lang.ini');
    // читаем заголовок окна
    Caption:=LangIniFile.ReadString(LangSection,name,Caption);
    // перебираем все компоненты в этом окне
    for i:=1 to ComponentCount do
    begin
      // если выбран из массива компонент Button, то изменяем текст на кнопке
      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Caption);
      if Components[i-1].ClassType = TButton then
        (Components[i-1] as TButton).hint := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TButton).Hint);
      // аналогично для других типов:
      if Components[i-1].ClassType = TMenuItem then
        (Components[i-1] as TMenuItem).Caption := LangIniFile.ReadString(LangSection,
        name+Components[i-1].name, (Components[i-1] as TMenuItem).Caption);
    end;
    LangIniFile.Free; // освобождаем ресурс
  end;
end;
end.


При вызове передавай в процедуру ещё и экземпляр формы. Например
Код

ChangeLang('Section1',Form1);


PM MAIL WWW Skype   Вверх
namra
Дата 18.11.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



Bose спасибо огромное помогло! smile   smile 
PM MAIL   Вверх
ecspertiza
  Дата 19.11.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Могу посоветовать прогу Delphi localization compiler специально для локализации приложений на дельфах, я сам ей интерфейс на другой язык переводил, в месте с ней обычно и демка есть посмотришь разберёсяsmile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Akella
Дата 20.11.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А разве в самой IDE нет возможности реализовать многоязычный интерфейс, я когда-то читал, что можно, только не занимался этим.

Добавлено через 4 минуты и 17 секунд
namra, смотри, помоему тебе неплохой пример, тоже перевод с использованием текстовых файлов:
http://www.codenet.ru/progr/delphi/stat/multilang.php
PM MAIL   Вверх
ecspertiza
Дата 20.11.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



В самой IDE можно реализовать многоязычный интерфейс тока ето геморой и нечнго больше,
Зачем изобретать велосипед, кто нить скачал Delphi localization compiler и посмотрел что ето такое? Если прога состоит из 30 форм, и языков надо не 2 а 6, то пользуясь примером http://www.codenet.ru/progr/delphi/stat/multilang.php, скока будет длится загрузка да и смена интерфейса будет возможна тока при перезагрузке, говорю для локализации или интернационализации на Delphi качайте прогу Delphi localization compiler, там всё просто, есть к ней описание, и демка.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Akella
Дата 20.11.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



ecspertiza, я не понял, как с ним работать,  smile

Добавлено через 30 секунд
честно говоря я и не шибко вдавался в изучение сей программы
PM MAIL   Вверх
ecspertiza
  Дата 20.11.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Там всё просто, включаешь прогу, зате File->new, выбираешь *.exe своей программы,  она подгружает всё что может перевести, затем идёт процесс перевода(руками правда) на требуемый язык, затем Save and Compile (в папку с проектом), в программе подключаем модуль LcUnit.pas(идёт вместе с программой), потом в программе пишем
Код

function LcCallBack( iLCID : integer; pUd : pointer ) : integer; stdcall;
begin
  with TLanguages.Create
  do  begin
      TForm1( pUd ).Combobox1.Items.AddObject( NameFromLocaleID[ iLCID ],
        pointer( iLCID ) );
      Free;
      end;
  result := 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  iEngUsLCID : LCID;
begin
  iEngUsLCID := LANG_ENGLISH + SUBLANG_ENGLISH_US shl 10 + SORT_DEFAULT shl 16; { US English LCID }
  if LoadLcf( ChangeFileExt( ParamStr( 0 ), '.lcf' ), iEngUsLCID,
    Addr( LcCallBack ), Self ) = 1
  then  ComboBox1.ItemIndex := ComboBox1.Items.
    IndexOfObject( pointer( iEngUsLCID ) );
  TranslateComponent( Self );
end; //для загрузки языка при загрузке программы

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  LoadLcf( ChangeFileExt( ParamStr( 0 ), '.lcf' ),
    LCID( ComboBox1.Items.Objects[ ComboBox1.ItemIndex ] ), nil, nil );
  Caption := FORMCAPTION;
  TranslateComponent( Self );
end; // для загрузки я зыка при изменения Выпадающего списка


на самом деле всё просто, по ней в инете есть мануал тока поискать требо.

зрите в аттаче, сама прога, небольшой HELP, Demka и модуль smile 


Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  DeLoc.zip 850,37 Kb


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Bose
Дата 20.11.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



ecspertiza, а она умеет дополнять существующий перевод?

И исходники закрыты. 


На самом деле решений для перевода полным полно. Вот только многие из них не умеют переводить все как надо. Некоторые не умеют переводить ресурсы, другие не умеют переводить свойства нестандартных компонент. Третьи уvt.n переводить всё, но для переключения языка приходится перезапускать программу. 
И чем их все рассматривать, проще написать своё, или модифицировать готовое опен-сорсное. Хотя бы тот же JvTranslator. Хотя JvTranslator насколько я помню тоже не умеет переводить resourcestrings.

PM MAIL WWW Skype   Вверх
ecspertiza
Дата 20.11.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



Bose , насчёт этого невкурсе, за собой перевод дополняет, а вот если он ещё как нить сделан то незнаю.

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



--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.