Мультиязычный интерфейс
Народ, посоветуйте как лучше и оптимальней создать программу с мультиязычным интерфейсом??
Посмотри в Delphi6\Demos\RichEdit
Там есть пример с 3-мя языками
Посмотри в Delphi6\Demos\RichEdit
Там есть пример с 3-мя языками
ээээ.... опс. у меня Delphi5:{
Правда могут быть некоторые несовместимости вроде формы не откроет, но код откроет
Скажи своё мыло пришлю исходник.
Правда могут быть некоторые несовместимости вроде формы не откроет, но код откроет
[email]sergun@hostel7.susu.ac.ru[/email]
Хорошо, поставлю вопрос по другому: есть текстовой файл, в нем записано имя компонента на форме, имя формы где он расположен и само свойство (причем известно заранее что это свойство имеет тип string). Как сделать так, чтобы читать из файла эти данные и устанавливать заданное свойство у этого компонента?
допустим файле написано:
====================
frmMain.label1.caption=TEXT1
frmAbout.label5.caption=TEXT5
====================
ну и соответствено чтоб они менялись....
Для этого используются *.INI файлы. Они способны хранить String, Boolean, Integer, и др.
Приведу самый простой пример загрузки String данных из *.ini файлов:
Нужно создать новый проект, и изменить файлы
Unit1.pas и Unit1.dfm следующим содержимым:
Файл Unit1.pas
================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, INIFiles;
type
TForm1 = class(TForm)
Label1: TLabel;
Label5: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Ini: TIniFile;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\English.ini');
Label1.Caption:= Ini.ReadString('Language','frmMain.label1.caption','');
Label5.Caption:= Ini.ReadString('Language','frmAbout.label5.caption','');
Ini.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\Russian.ini');
Label1.Caption:= Ini.ReadString('Language','frmMain.label1.caption','');
Label5.Caption:= Ini.ReadString('Language','frmAbout.label5.caption','');
Ini.Free;
end;
end.
Файл Unit1.dfm
============================================
object Form1: TForm1
Left = 277
Top = 174
Width = 177
Height = 129
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 8
Width = 3
Height = 13
end
object Label5: TLabel
Left = 8
Top = 32
Width = 3
Height = 13
end
object Button1: TButton
Left = 8
Top = 64
Width = 75
Height = 25
Caption = 'Русский'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 88
Top = 64
Width = 75
Height = 25
Caption = 'English'
TabOrder = 1
OnClick = Button2Click
end
end
После этого создайте в директории проекта папку с названием languages и в обычном текстовом редакторе (можно мастдаевский блокнот)
файлы English.ini и Russian.ini со следующим содержимым:
Russian.ini
==================================
[Language]
frmMain.label1.caption=ТЕКСТ1
frmAbout.label5.caption=ТЕКСТ5
English.ini
==================================
[Language]
frmMain.label1.caption=TEXT1
frmAbout.label5.caption=TEXT5
===================================
Надеюсь помог.:}
Конечно возможно
Для этого используются *.INI файлы. Они способны хранить String, Boolean, Integer, и др.
Приведу самый простой пример загрузки String данных из *.ini файлов:
Нужно создать новый проект, и изменить файлы
Unit1.pas и Unit1.dfm следующим содержимым:
Файл Unit1.pas
================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, INIFiles;
type
TForm1 = class(TForm)
Label1: TLabel;
Label5: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Ini: TIniFile;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\English.ini');
Label1.Caption:= Ini.ReadString('Language','frmMain.label1.caption','');
Label5.Caption:= Ini.ReadString('Language','frmAbout.label5.caption','');
Ini.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\Russian.ini');
Label1.Caption:= Ini.ReadString('Language','frmMain.label1.caption','');
Label5.Caption:= Ini.ReadString('Language','frmAbout.label5.caption','');
Ini.Free;
end;
end.
Файл Unit1.dfm
============================================
object Form1: TForm1
Left = 277
Top = 174
Width = 177
Height = 129
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 8
Width = 3
Height = 13
end
object Label5: TLabel
Left = 8
Top = 32
Width = 3
Height = 13
end
object Button1: TButton
Left = 8
Top = 64
Width = 75
Height = 25
Caption = 'Русский'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 88
Top = 64
Width = 75
Height = 25
Caption = 'English'
TabOrder = 1
OnClick = Button2Click
end
end
После этого создайте в директории проекта папку с названием languages и в обычном текстовом редакторе (можно мастдаевский блокнот)
файлы English.ini и Russian.ini со следующим содержимым:
Russian.ini
==================================
[Language]
frmMain.label1.caption=ТЕКСТ1
frmAbout.label5.caption=ТЕКСТ5
English.ini
==================================
[Language]
frmMain.label1.caption=TEXT1
frmAbout.label5.caption=TEXT5
===================================
Надеюсь помог.:}
Хе... это понятно, это самое тривиальное решение... вообще то я имел ввиду решение в виде перебора компонентов в приложении... типа FindComponent итд...
var
i:integer;
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\Russian.ini');
for i:=0 to 10 do
with Form1.FindComponent('Label' + IntToStr(i)) as TLabel do
Caption:= ini.ReadString('Language','frmMain.label'+inttostr(i)+'.caption','');
Ini.Free;
end;
Попробуй это:
var
i:integer;
begin
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Languages\Russian.ini');
for i:=0 to 10 do
with Form1.FindComponent('Label' + IntToStr(i)) as TLabel do
Caption:= ini.ReadString('Language','frmMain.label'+inttostr(i)+'.caption','');
Ini.Free;
end;
а если заранее не известно сколько в проекте форм и как они называются?
А если кому - то придется транслировать INI-файл, то запустит прогу, откроет языковой файл и переведет значения.
Или я что-то не понял?
Поясни...
Как так в своём - то проекте и не знать число и названия форм? Нонсонс!
А если кому - то придется транслировать INI-файл, то запустит прогу, откроет языковой файл и переведет значения.
Или я что-то не понял?
Поясни...
Ну вот сам подумай... создаешь ты приложение... делаешь ини файл, там все значения... итд.. это понятно...
однако, если в процессе разработки ты создаешь новую форму.... эээ... то тут уже надо забититься опять о мультиязычности этой формы... не так ли?
а если бы просто допустим указывать имя формы в инишнике, и чтоб это транслировалось в delphi, ты было бы просто замечательно... уже не задумывался бы об этом... поэтому я все это и затеял...:!!!:
На этом мои советы исчерпаны. Может кто-то другой будет просматривать эту тему и предложит кокой-нибудь компонент.:???:
Тут уже компонент надо создавать а в создании компонентов я еще не учавствовал:(
На этом мои советы исчерпаны. Может кто-то другой будет просматривать эту тему и предложит кокой-нибудь компонент.:???:
и всетаки???? :(