Autor Beitrag
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: So 29.05.05 10:41 
Hallo !

Kann mir jemand erlkären, wie ich mit ressourcestrings arbeite und was dir mir bringen ??

MfG
Matze

_________________
In the beginning was the word.
And the word was content-type: text/plain.


Zuletzt bearbeitet von matze am Mo 30.05.05 14:15, insgesamt 1-mal bearbeitet
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 29.05.05 12:50 
Hallo,

was bringt das?, z.B mehrsprachige Anwendung,
ein einfaches Beispiel-Projekt, eigentlich selbsterklärend:
ausblenden volle Höhe Delphi-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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
{$R Test.RES}//

function GetResstr(Str_ID : Integer): string;
var strList : array [0..255of Char;
begin
 Loadstring(hinstance, Str_ID, @strList, 255);
 Result := StrPas(strList);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Add('Englisch');
  ComboBox1.Items.Add('Deutsch');
  ComboBox1.ItemIndex := 0;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var i : integer;
begin
  i := ComboBox1.ItemIndex*100;
  Button1.Caption := GetResstr(i+1);
  Button2.Caption := GetResstr(i+2);
end;

end.


die zugehörige rc-Datei (Test.rc)
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
STRINGTABLE
{
1, "&Copy"
2, "C&lose"
101, "&Kopieren"
102, "&Beenden"
}

Zur Bearbeitung der rc-Dateien und Erzeugung der res-Dateien kann ich Dir folgenden Link empfehlen:
DER RESOURCEN - ADMINISTRATOR (Freeware)
Das Programm enthält außerdem gute Anleitungen zum Umgang mit verschiedenen Resoursen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 30.05.05 13:52 
danke. das kannste ich schon.
was ich eigendlich wissen wollte war, was es für einen vorteil hat konstanten im programm mit resourcestring statt mit constzu deklarieren.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.05.05 13:59 
Hi Matze: Der Vorteil ist, das man ResourceStrings übersetzen kann (z.B. mit Localizer), die Const-Deklarationen nicht.

Du schreibst ne EXE, in dem alle zu übersetzenden Texte als ResourceStrings deklariert sind. Also, statt:
ausblenden Delphi-Quelltext
1:
MessageBox('Hello World');					

schreibst Du
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
...
Unit MyStrings;
ResourceString
  szHelloWorld = 'Hello World'
...
uses MyStrings;
...
MessageBox (szHelloWorld);
...

Das ist etwas mehr Aufwand, aber so sind alle Meldungen an einer Stelle. Du kannst so erstens sehr leicht übersetzen und zweitens die "Orthogonalität" Deiner Meldungen sicherstellen. Es ist z.B. ein GAU, wenn Du an einer Stelle den Anwender direkt ansprichst: ("Wollen Sie fortfahren?"), an anderer Stelle jedoch mit indirekter Rede ("Soll das Programm fortgesetzt werden?") arbeitest. Natürlich gibt es schwerwiegendere Verstösse gegen GUI-Richtlinien.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 30.05.05 14:16 
ah ok. und wie übersetzte ich dann also eine application?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.05.05 14:27 
Umsonst-Variante: Du besorgst Dir einen Resourceneditor. Damit kannst du z.B. die Icons austauschen, Menüeinträge übersetzen oder eben Resourcestrings.
Profi-Variante: Du verkaufst Dein Haus, Auto, Frau und Kinder und kaufst Dir den Localizer. Das ist so ein Programm, welches die Resourcen auch ausliest und Dir bei der Übersetzung hilft, indem es eine Sprach-DB aufbaut. Wenn Du einmal 'Abbruch'-> 'Cancel' übersetzt hast, macht Localizer das in Zukunft mit allen deinen zu übersetzenden Projekten.

Es gibt auch günstigere Varianten, bei denen du z.B. deine Kinder behalten kannst (Visual Localize z.B.). :lol:

Natürlich kann man das auch mit Stringlisten, INI-Dateien etc. realisieren. Aber eine gut geschriebene EXE mit resourcenstrings lässt sich eben auch nachträglich noch gut lokalisieren (=übersetzen).

Ich habe einige Zeit mit Übersetzungstools gearbeitet, die auf dem Sourcecode basieren (also INI-Dateien etc.) bin aber zu dem Schluss gekommen, das ich lieber eine saubere EXE schreibe, die dem Übersetzerbüro schicke und die passen mir das dann an die Zielsprache an. Wenn ich ein Update der EXE baue, schicke ich das dem Übersetzer, der lädt das in den Localizer, drückt einen Button, alles wird automatisch neu übersetzt und der eine neue String wird als 'noch nicht übersetzt' angezeigt. In Suaheli übersetzen. Fertig. (<1 min Arbeit).

Wenn Du nie nicht keine mehrsprachigen Echsen programmieren willst, dann kannst Du resourcestrings nutzen oder nicht. Ich nutze 'Const', weil 'Const' 5 Buchstaben hat, und 'resourcestrings' ca. 25 (jedenfalls mehr als 10).
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 30.05.05 14:35 
Kurz: Resourcenstrings werden in der Resource der Exe abgelegt, Konstanten im DATA Segement der Exe. Da sich die Resourcenstrings nun in der Resource der Exe befinden, kannst du sie mit einem Resourceneditor nachträglich bearbeiten. Man sollte aber für variable Textpassage Platzhalter verwenden. Zum Beispiel:
"Datei c:\test.txt nicht gefunden" wäre schlecht. Da in einer anderen Sparche die Wortstellung anders sein kann. Statdessen wäe "Datei %s nicht gefunden" und dann die Ausgabe im Programm mit Format besser.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 30.05.05 16:08 
user profile iconLuckie hat folgendes geschrieben:
kannst du sie mit einem Resourceneditor nachträglich bearbeiten.

Oder besser unverändert lassen und stattdessen Ressourcen-DLLs beilegen, die für die Übersetzung o.ä. sorgen.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.05.05 16:55 
Meinst Du etwa diese grauslig schreckliche ITE? Nie wieder. Deshalb hab ich keine Haare mehr :(
mirom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win2000, Win XP

BeitragVerfasst: Mo 30.05.05 16:59 
Hallo!

vergiss Resource Editor, es gibt einen GENIALEN Programm dafür: dybdahl.dk/dxgettext/ !!!

Grüße,

Miro
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Di 31.05.05 08:25 
user profile iconMathiasSimmack hat folgendes geschrieben:
Oder besser unverändert lassen und stattdessen Ressourcen-DLLs beilegen, die für die Übersetzung o.ä. sorgen.

wie funktioniert das denn ?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 31.05.05 09:38 
Das Beispiel ist vielleicht ein bisschen blöd, aber sagen wir so:
ausblenden test.dpr
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
program test;
uses
  Windows;

resourcestring
  Huhu = 'Huhu';

begin
  MessageBox(0, pchar(Huhu), nil0);
end.

Wenn du das kompilierst und startest, siehst du bloß die MessageBox mit der Meldung "Huhu". Jetzt nimmst du einen Ressourceneditor oder -betrachter (die Demo "ResXplor" von Borland reicht) und schaust nach, welche Id der Ressourcenstring vom Compiler bekommen hat. In meinem Fall (Delphi 5 Pro) war das 65520. Und das ist eigentlich der einzige Nachteil: Der Compiler entscheidet über den Wert. Und die Werte sind zudem auch noch anders, wenn du das Programm mit verschiedenen Delphi-Versionen kompilierst. Na ja ...

Wenn du den Wert ermittelt hast, dann erstellst du eine Stringtabelle als Ressourcenskript
ausblenden test.rc
1:
2:
3:
4:
5:
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
BEGIN
  65520  "Hallo, Welt!"
END

und machst per brcc32 test.rc -fotest.res eine RES-Datei draus. Zu guter Letzt brauchst du noch die Ressourcen-DLL, die so aussieht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
library test;

{$R test.res}  // deine eben erzeugte RES-Datei
{$E de}        // Dateiendung und unterstützte Sprache

begin
end.

Die DLL muss den gleichen Namen tragen wie die Exe, nur die Endung unterscheidet sich. Also: "test.exe" = "test.de" in meinem Beispiel. Das DE steht für Deutschland und schließt auch Österreich und die Schweiz ein. Kompiliere die DLL, kopiere sie in den Ordner der Exe und starte die Exe. Anstelle der alten Meldung "Huhu" erscheint nun "Hallo, Welt!".

Nun benenne die Ressourcen-DLL um in "test.en" (EN = allgemeines Englisch; USA, England, usw.). Wenn du die Exe startest, erscheint auf einem deutschen Windows wieder die alte Meldung "Huhu". Jetzt ändere die Spracheinstellung deines Windows in der Systemsteuerung auf Englisch und starte die Exe. Ergebnis: Du müsstest wieder die neue Meldung "Hallo, Welt!" sehen.

Du könntest damit also ein Programm schreiben, dessen Grundsprache Englisch ist, damit es bspw. in der ganzen Welt lauffähig ist und verstanden wird. Für verschiedene Länder legst du dann Ressourcen-DLLs bei. Starte ich in Deutschland auf einem deutschen Windows dein Programm, wird die deutsche Ressourcen-DLL benutzt, ein Franzose nutzt das Programm in seiner Sprache, usw. usw.

Es ist vllt. nicht so schick wie in Programmen, wo man zur Laufzeit die Sprache wechseln kann. Aber das mache ich sowieso nur einmal, indem ich Deutsch einstelle (sofern das Programm diese Sprache unterstützt). Deswegen finde ich dieses System, das sich nach der Systemsprache richtet, und das in Delphi eingebaut ist, gar nicht mal so schlecht.
Das Problem sind halt nur die IDs für die Strings, die der Compiler von sich aus festlegt, und die u.U. etwas aufwändige Übersetzung.


Jetzt noch zu den Forms. alzaimar schrieb, dass ITE schrecklich ist. Ich erinnere mich dunkel an so ein generiertes Ergebnis und daran, dass ich zuerst auch nicht durchgesehen habe. Aber es reicht, die Texte in der DFM-Datei zu übersetzen.

Als Beispiel: Du hast eine Form mit einem Label, einem Eingabefeld und einem Button. Die Beschriftungen von Label und Button sollen übersetzt werden. Dazu machst du am besten eine Kopie der DFM-Datei und der dazu gehörenden PAS-Unit. Warum? Es wäre ja möglich, dass ein Text in einer bestimmten Sprache länger ist, und dass du deshalb die Form noch etwas vergrößern musst. Und das geht mit dem Forms-Editor von Delphi am besten. Darum die Kopien, damit du dir nicht deine Originale versaust.

Wenn du die Beschriftungen übersetzt hast, brauchst du nur noch die DFM-Datei. Du erstellst eine neue Ressourcen-DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
library Project1;

{ITE} {DFMFileType} {Unit1.dfm}
{$R 'Unit1.dfm' Form1:TForm}

{$E de}

begin
end.

Die Datei kompilierst du, und du hast wieder eine DE-Ressourcen-DLL mit der neuen, übersetzten Form. Startest du das Programm, und liegt die Ressourcen-DLL im gleichen Ordner wie die Exe, dann sollte die Form entsprechend anders aussehen.

Weil´s etwas umfangreicher ist, hänge ich das Beispiel mal ran.
Einloggen, um Attachments anzusehen!
mirom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win2000, Win XP

BeitragVerfasst: Di 31.05.05 10:06 
Also, bin noch der Meinung, wenn du Resource nur um eine Applikation zu übersetzen brauchst, ist einfacher, schneller und Compiler-unabhängig mit 'dybdahl.dk/dxgettext/' zu arbeiten. Ich habe mein Programm auf drei Sprachen übersetzt: English, Deutsch und Kroatisch – ohne jede Problem. Du kannst sogar Sprache ‚on the fly’ ändern.

Beispiel, mit Resource String:

ausblenden Quelltext
1:
2:
3:
resourcestring   Huhu = 'Huhu';

MessageBox(0, pchar(Huhu), nil, 0);


Und natürlich, Resource Datei Editieren und erstellen.

Beispiel, mit dxgettext:

ausblenden Quelltext
1:
ShowMessage(_(‚HuHu’));					


... und nichts mehr ...


Ich habe früher mit VB gearbeitet und mit Resource String übersetzt – Horror, sobald du etwas mehr Text hast.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 31.05.05 10:35 
Damit wir uns nicht falsch verstehen: matze hat mich gefragt (und zitiert), wie es mit den Ressourcenstrings funktioniert. Und genau das habe ich ihm gezeigt. Das heißt nicht, dass dein Weg schlechter ist! Ich könnte das sowieso nicht beurteilen, weil ich mich damit noch gar nicht beschäftigt habe. Mir ging es nur um die Beantwortung der an mich gestellten Frage. ;)
mirom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win2000, Win XP

BeitragVerfasst: Di 31.05.05 10:54 
Hallo!

@MathiasSimmack: mein letzter Post war nicht so gemeint als du es verstanden hast - darum stehts am anfang
Zitat:
wenn du Resource nur um eine Applikation zu übersetzen brauchst
!

War alles mit besten absicht !

Grüß an alle