Autor Beitrag
alexschultze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Fr 24.01.03 19:35 
Hi,

ich bin momentan bei der Programmierung von einem größer Programm, das es nach Möglichkeit in mehreren Sprachen geben soll.

Also, ich hab in Delphi einen Translationsmanager gefunden, der kann nur die Forms an und für sich verändern.
Das Problem ist vermutlich, das sich in dem Programm öfters mal was ändern wird.

ich bräuche irgend etwas mit dem ich z.B. auch ne DLL anlegen kann, nur eben für Prozeduren wie showmessage(), das solche Nachrichten übersetzt werden und ich nicht alles immer neu übersetzen muss bzw. immer alle Änderungen im original auch in allen Sprachen einzeln machen muss.

Alex

_________________
Von allen Dingen die ich verloren habe trauere ich meinem Verstand am meisten nach.
Patschi
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 24.01.03 20:04 
ich würde es mit ner Art INI als LNG versuchen und dann jeden AusgabeString in der jeweiligen Sprache speichern: z.B. English.lng Und dann einfach Über eine Prozdur dein Programm in der neuen Sprache anpassen:

procedure Sprache(Lng: String);
begin

Label1.Caption := Lng.......

end;
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 24.01.03 20:56 
Hi,

so schwierig kann das doch garnicht sein. Dieses habe ich irgendwo mal aus dem Internet gefischt. Geht einfach.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
Ressourcen erstellen
---------------------------

deutsche Menüeinträge

STRINGTABLE
{
 100, "&Datei"
 101, "&Beenden"
 200, "&Hilfe"
 201, "&Info über..."
}
//Speichern unter deutsch.rc

//kompilieren mit brcc32 deutsch.rc




englishe Menüeinträge

STRINGTABLE
{
 100, "&File"
 101, "&Close"
 200, "&Help"
 201, "&About..."
}
//Speichern unter english.rc

//kompilieren mit brcc32 english.rc


DLL's erstellen
---------------------------

library english;

uses
  SysUtils;

{$R ENGLISH.RES}

begin
end.

//speichern unter english



library deutsch;

uses
  SysUtils;

{$R DEUTSCH.RES}

begin
end.

//speichern unter deutsch

Aufruf im Programm
  private
    sDLLName : string;              //DLL-Version
    hDLL     : THandle;             //DLL-Handle
    function GetStringFromRes(iID: Integer) : string;
    procedure Sprachauswahl;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  Tlanguage =(de_, en_);

var
  Form1: TForm1;
  language : TLanguage;

implementation

{$R *.dfm}

function TForm1.GetStringFromRes(iID: Integer) : string;
var
  iCnt   : Integer;
  szText : array[0..29] of Char;
begin
  iCnt := LoadString(hDLL, iID, szText, SizeOf(szText)-1);
  if iCnt > 0 then GetStringFromRes := StrPas(szText)
              else GetStringFromRes := 'Kein Eintrag!';
end;

//welche Sprachversion soll eingebunden werden?
procedure TForm1.Sprachauswahl;
begin
 if language = en_ then
    sDLLName := 'ENGLISH.DLL'
  else
    sDLLName := 'GERMAN.DLL';

  //entsprechend. DLL laden
  hDLL := LoadLibrary(PChar(sDLLName));
  if hDLL <> 0 then begin
    StatusBar1.SimpleText := sDLLName + ' geladen.';

 //Beschriftung der Menü-Einträge aus den DLL-Ressourcen lesen
    with MainMenu1 do begin
      Datei.Caption := GetStringFromRes(100);
      Beenden.Caption := GetStringFromRes(101);
      Hilfe.Caption := GetStringFromRes(200);
      Info.Caption := GetStringFromRes(201);
    end;
  end;
end;

//English
procedure TForm1.Button1Click(Sender: TObject);
begin
  language := en_;
  Sprachauswahl
end;

//Deutsch
procedure TForm1.Button2Click(Sender: TObject);
begin
  language := de_;
  Sprachauswahl
end;

//DLL entladen
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if hDLL <> 0 then FreeLibrary(hDLL);
end;


Viel Spaß damit.
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Fr 24.01.03 21:14 
geht auch, muss halt jeder String woanders stehen... na gut.

was ist brcc32 ?

_________________
Von allen Dingen die ich verloren habe trauere ich meinem Verstand am meisten nach.
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 25.01.03 01:31 
brcc32 ist ein Programm womit Du Ressourcen erstllen kannst. Ist bei der Installaition von Delphi mit dabei.
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Mo 27.01.03 11:49 
Moin! Ich hatte hier im Forum dazu auch schonmal was unter dem Titel "Mehrsprachigkeit" gepostet:

In der INI-Datei "LanINI" stehen die Einträge so drin:
[Deutsch]
1cap=OK
1hint=Drück das für okay
2cap=Abbrechen
2hint=Drück das wenn Du ein Weichei bist

[English]
1cap=OK
1hint=Click this for okay
2cap=Cancel
2hint=Click this if you are a looser

Jede Komponente muss in der Tag-Eigenschaft die Zahl haben, die jeweils vor dem zugehörigen "cap" oder "hint" steht.

Und der folgende Code geht alle Componenten des Programmes durch und ändert die Beschriftung und den Hint. Vorteil: Die Sprache lässt sich auch zur Laufzeit umstellen.

Zum praktischen Einsatz: Das Tool myAdmin (coded by meinereiner) benutzt diese Routine zimelich erfolgreich.


ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
procedure TFMain.ChangeLan(const lan: String);
var i, j: Integer;
    c: TObject;
begin
     LanINI := TINIFile.Create(ProgVerz + '\lan.ini');

     WITH Application DO begin
        FOR i := 0 to ComponentCount - 1 DO BEGIN
            FOR j := 0 TO Components[i].ComponentCount - 1 DO BEGIN
                c := Components[i].Components[j];
                If (c is TLabel) then begin
                   If (c AS TLabel).Tag <> 0 then begin
                      (c AS TLabel).Caption := LanINI.ReadString(lan, IntToStr((c AS TLabel).Tag)+'cap', '');
                   end;
                end;

                If (c is TPanel) then begin
                   If (c AS TPanel).Tag <> 0 then begin
                      (c AS TPanel).Caption := LanINI.ReadString(lan, IntToStr((c AS TPanel).Tag)+'cap', '');
                   end;
                end;

                If (c is TXPButton) then begin
                   If (c AS TXPButton).Tag <> 0 then begin
                      (c AS TXPButton).Caption := LanINI.ReadString(lan, IntToStr((c AS TXPButton).Tag)+'cap', '');
                      (c AS TXPButton).Hint := LanINI.ReadString(lan, IntToStr((c AS TXPButton).Tag)+'hint', '');
                   end;
                end;

                If (c is TCheckBox) then begin
                   If (c AS TCheckBox).Tag <> 0 then begin
                      (c AS TCheckBox).Caption := LanINI.ReadString(lan, IntToStr((c AS TCheckBox).Tag)+'cap', '');
                   end;
                end;

                If (c is TMenuItem) then begin
                   If (c AS TMenuItem).Tag <> 0 then begin
                      (c AS TMenuItem).Caption := LanINI.ReadString(lan, IntToStr((c AS TMenuItem).Tag)+'cap', '');
                   end;
                end;

                If (c is TGroupBox) then begin
                   If (c AS TGroupBox).Tag <> 0 then begin
                      (c AS TGroupBox).Caption := LanINI.ReadString(lan, IntToStr((c AS TGroupBox).Tag)+'cap', '');
                   end;
                end;

                If (c is TImage) then begin
                   If (c AS TImage).Tag <> 0 then begin
                      (c AS TImage).Hint := LanINI.ReadString(lan, IntToStr((c AS TImage).Tag)+'hint', '');
                   end;
                end;

                If (c is TRadioGroup) then begin
                   If (c AS TRadioGroup).Tag <> 0 then begin
                      (c AS TRadioGroup).Caption := LanINI.ReadString(lan, IntToStr((c AS TRadioGroup).Tag)+'cap', '');
                   end;
                end;

                If (c is TTabSheet) then begin
                   If (c AS TTabSheet).Tag <> 0 then begin
                      (c AS TTAbSheet).Caption := LanINI.ReadString(lan, IntToStr((c AS TTabSheet).Tag) + 'cap', '');
                   end;
                end;

                If (c is TSpeedButton) then begin
                   If (c AS TSpeedButton).Tag <> 0 then begin
                      (c AS TSpeedButton).Caption := LanINI.ReadString(lan, IntToStr((c AS TSpeedButton).Tag)+'cap', '');
                      (c AS TSpeedButton).Hint := LanINI.ReadString(lan, IntToStr((c AS TSpeedButton).Tag)+'hint', '');
                   end;
                end;

                If (c is TButton) then begin
                   If (c AS TButton).Tag <> 0 then begin
                      (c AS TButton).Caption := LanINI.ReadString(lan, IntToStr((c AS TButton).Tag)+'cap', '');
                      (c AS TButton).Hint := LanINI.ReadString(lan, IntToStr((c AS TButton).Tag)+'hint', '');
                   end;
                end;
                If (c is TBitBtn) then begin
                   If (c AS TBitBtn).Tag <> 0 then begin
                      (c AS TBitBtn).Caption := LanINI.ReadString(lan, IntToStr((c AS TBitBtn).Tag)+'cap', '');
                      (c AS TBitBtn).Hint := LanINI.ReadString(lan, IntToStr((c AS TBitBtn).Tag)+'hint', '');
                   end;
                end;
            END;
        END;
     end;
end;


Viele Grüße,

Matthias

_________________
Ha! Es compiliert! Wir können ausliefern!