Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Das eigene Programm in Russisch (https://www.delphipraxis.net/90947-das-eigene-programm-russisch.html)

torud 26. Apr 2007 12:09


Das eigene Programm in Russisch
 
Hallo Wissende,

ich würde gern eines meiner Tools ins Russische übersetzen, verzweifele aber gerade, die Buchstaben in die Controls zu bekommen. Mir ist klar, dass da was mit UniCode ist, und das das nicht ganz einfach ist, aber was muss ich beachten und wie kann ich vorgehen, ohne dabei alle meine Controls ändern zu müssen. Ich erhalte nur ???? statt der Buchstaben, wie sie hier schön zu sehen sind.

АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ

Was muss ich also tun, um dieses Problem zu beheben?

RXR-Max 26. Apr 2007 12:22

Re: Das eigene Programm in Russisch
 
schreib das ganze doch in eine ini und dann kann man bei einem button-klick die sprache ändern. und die fragezeichen bedeuten soweit ich weiß das du das language-pack nicht installiert hast. musst dann wohl machen. ja und nen russe hat das sicher schon standard auf seinem rechner denke ich mal...

CCRDude 26. Apr 2007 12:27

Re: Das eigene Programm in Russisch
 
Du musst jedem Control in Font.Charset RUSSIAN_CHARSET (204) zuweisen. Geht per Code recht schnell, eine alle Controls der Form durchiterieren (Controls/ControlCount).

torud 26. Apr 2007 12:31

Re: Das eigene Programm in Russisch
 
Ok, dann werde ich das mal probieren. der Code, den ich über Skype erhielt war natürlich schon in UniCode, weshalb es nicht ging.

Ich habe soeben eine Textdatei in verschiedenen Formaten erhalten.

Unicode
Unicode Big endian
UTF-8
Ansi

Leider in den 3 erstgenannten Dateien zwar alles auf Russisch in Kyrillischen Schriftzeichen zu lesen, aber nach dem Kopieren in ein Label von Delphi waren nur Fragenzeichen zu lesen.

In der Ansitextdatei waren von vornherein nur Fragezeichen drin. Ich hatte bei dem Label mal auf

ANSI_CHARSET
RUSSIAN_CHARSET

gestellt, aber es scheint nicht zu funzen. Irgendwie mache ich immer noch was falsch...!?

CCRDude 26. Apr 2007 12:34

Re: Das eigene Programm in Russisch
 
Es gibt übrigens auch die TNTWare Unicode Controls, die als Ersatz für die normalen richtig Unicode können statt Charsets zu benötigen.

Dummerweise wurden die gerade kommerziell, aber vielleicht findet sich ja auf Torry etc. noch ein etwas ältereres Download.

Bernhard Geyer 26. Apr 2007 12:37

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von RXR-Max
schreib das ganze doch in eine ini und dann kann man bei einem button-klick die sprache ändern.

Ini-Dateien sind nicht Unicode-Fähig bzw. von Windows-Seite auf 8-Bit-Charaters beschränkt.

Zitat:

Zitat von RXR-Max
und die fragezeichen bedeuten soweit ich weiß das du das language-pack nicht installiert hast. musst dann wohl machen.

Falsch. Fragezeichen bedeuten das eine Codepagewandlung durchgeführt wurde (in die aktuelle Codepage) und in der Zielcodepage dieses Zeichen nicht abbildbar ist. Ist ein Zeichen im verwendeten Font nicht vorhanden bekommt man ein leeres Ersatzzeichen im Font (z.B. ein schwarz umrandetes Rechteck).

Zitat:

Zitat von RXR-Max
ja und nen russe hat das sicher schon standard auf seinem rechner denke ich mal...

Nein. Ein "Russe" wird ein Windows-System haben das als Standard-Codepage kyrilisch hat. Damit könnenn Nicht-Unicode-Anwendungen kyrilische Zeichen verarbeiten. Jedoch werden diese keine Westeuropäischen Umlaute mehr verarbeiten könnnen.

Zitat:

Zitat von CCRDude
Du musst jedem Control in Font.Charset RUSSIAN_CHARSET (204) zuweisen. Geht per Code recht schnell, eine alle Controls der Form durchiterieren (Controls/ControlCount).

Vergiss eine solceh Lösung. Nicht alle Controls berücksichtigen diese Einstellung und eine darauf aufbauende Lösung verursachte mehr Probleme als sie lößt.

Die einzige vernünftige Lösungen ist Unicode-Controls wie ElPack oder TMS TNTWare-Controls zu verwenden.

CCRDude 26. Apr 2007 12:45

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von CCRDude
Du musst jedem Control in Font.Charset RUSSIAN_CHARSET (204) zuweisen. Geht per Code recht schnell, eine alle Controls der Form durchiterieren (Controls/ControlCount).

Vergiss eine solceh Lösung. Nicht alle Controls berücksichtigen diese Einstellung und eine darauf aufbauende Lösung verursachte mehr Probleme als sie lößt.

Nun, hier wende ich das erfolgreich für 53 verschiedene Sprachen an. Bis auf Persisch (4 Sonderzeichen, die in ARABIC_CHARSET nicht enthalten sind) keinerlei Probleme.
Klar, TVirtualStringTree z.B. will lieber Unicode, dafür registriere ich in meiner Lokalisierungsklasse einen speziellen Handler, aber Controls, die nur ANSI können, dort aber Font.Charset ignorieren, sind mir noch nicht untergekommen (oder vielleicht schon, aber wegen mangelnder Qualität sofort rausgeflogen).
Übrigens: auch mit ANSI-INI-Dateien gelöst ;)

torud 26. Apr 2007 12:47

Re: Das eigene Programm in Russisch
 
Das war doch mal ne Aussage. Das tolle ist, dass ich von TMS das ComponentenPack gekauft habe und ehrlich gesagt nicht einsehe nun auf die optisch recht ansprechenden Controls verzichten zu müssen und nochmal extra zahlen soll. Ich werde mal den Support von den Kollegen anschreiben. Vielleicht lassen die sich ja zu nem Update hinreißen!?

Im übrigen hat es bei mir nicht einmal geklappt ein einfaches Label mit nem russischen Text zu bestücken.

Bernhard Geyer 26. Apr 2007 13:08

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von CCRDude
Nun, hier wende ich das erfolgreich für 53 verschiedene Sprachen an. Bis auf Persisch (4 Sonderzeichen, die in ARABIC_CHARSET nicht enthalten sind) keinerlei Probleme.

Wolltest Du nicht mal nach Freepascal wechseln ...

Zitat:

Zitat von CCRDude
... aber Controls, die nur ANSI können, dort aber Font.Charset ignorieren, sind mir noch nicht untergekommen (oder vielleicht schon, aber wegen mangelnder Qualität sofort rausgeflogen).

Und was machst du wenn du "Ω=∑aa−≍⋥ ä" benötigst?

Zitat:

Zitat von CCRDude
Übrigens: auch mit ANSI-INI-Dateien gelöst ;)

Wenn die Text in der entsprechenden Codepage als 8-Bit Character gespeichert werden ...

Zitat:

Zitat von torud
Das war doch mal ne Aussage. Das tolle ist, dass ich von TMS das ComponentenPack gekauft habe und ehrlich gesagt nicht einsehe nun auf die optisch recht ansprechenden Controls verzichten zu müssen und nochmal extra zahlen soll.

Wenn du dein Geld damit verdienst wird das Geld das kleinste Problem sein. Der Aufwand zum umstellen. Aber das TMS ja jetzt die TNT's besitzt kannst Du ja mal nachfragen ob diese Technik in den Controls einfließt. Aber bisher waren die eigenen Unicode-Lösungen von TMS alles andere als Praktikabel.

Zitat:

Zitat von torud
Im übrigen hat es bei mir nicht einmal geklappt ein einfaches Label mit nem russischen Text zu bestücken.

Du mußt schon deinene Widestring in die passende Codepage umwandeln z.B. per WideStringToStringEx-Funktion aus den Jedis. Und das bei jedem Text die du in ein Ansi-Control schreibst oder auslesen willst.

CCRDude 26. Apr 2007 13:22

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von Bernhard Geyer
Wolltest Du nicht mal nach Freepascal wechseln ...

Was genau hat das damit jetzt zu tun? :D
Lazarus (LCL, das VCL-Äquivalent) ist leider unter Windows auch nicht wirklich Unicode, bringt hier also keine Vorteile.
Aber: Die Windows Mobile-Version ist pures FreePascal, die nächste Symbian-Version wird das ebenfalls sein, und insgesamt kompilieren inzwischen 100% mit beiden Compilern (fpc/dcc32) und 95% sind schon auf Funktion unter FPC getestet ;)

Zitat:

Zitat von Bernhard Geyer
Und was machst du wenn du "Ω=∑aa−≍⋥ ä" benötigst?

Wahrscheinlich SYMBOL_CHARSET? Benötige ich im genannten Beispiel ja nicht ;)
Aber wo ich Unicode wirklich brauche, verwende ich selbstverständlich auch Unicode, genauso wie in meinen eigenen UI-Klassen.

Ich sprech mich ja nicht dafür aus, daß Codepages & ANSI die ideale Lösung sind, nur daß die eben eine durchaus gut funktionierende Lösung sind, wenn man ein einfaches ANSI-Projekt mit durchgehend einer Benutzersprache umstellen will, und eben eigentlich nicht die Probleme machen muss, die Du erwähntest.

Bernhard Geyer 26. Apr 2007 13:37

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von CCRDude
Zitat:

Zitat von Bernhard Geyer
Wolltest Du nicht mal nach Freepascal wechseln ...

Was genau hat das damit jetzt zu tun? :D

Sorry. da hat <OffTopic></OffTopic> gefehlt.

Zitat:

Zitat von CCRDude
Ich sprech mich ja nicht dafür aus, daß Codepages & ANSI die ideale Lösung sind, nur daß die eben eine durchaus gut funktionierende Lösung sind, wenn man ein einfaches ANSI-Projekt mit durchgehend einer Benutzersprache umstellen will, und eben eigentlich nicht die Probleme machen muss, die Du erwähntest.

Dann lassen wir wieder mal den Fragesteller zu Wort kommen ob für ihn die Codepage-Lösung reicht oder er eine Lösung ohne die Codepage-Einschränkungen benötigt.

torud 26. Apr 2007 13:52

Re: Das eigene Programm in Russisch
 
Danke für die Nachfrage. Also ich habe jetzt bei mir erstmal noch ein russisches Tastaturlayout hinzugefügt. Damit kann ich jetzt in Textdateien schreiben, muss diese aber aber UniCode speichern, damit nix verloren geht. Soweit hoffen ich, habe ich das schon mal verstanden.

Habe ich es richtig verstanden, dass ich das Tool einfach so lassen soll, alle Komponenten auf Russischen Char umstellen soll und dann eine Übersetzungsdatei laden soll?

So in der Art

[Deutsch]
btn_danke.caption = "Danke"

[Russisch]
btn_danke.caption = "спосйбо"

? Und das dann als UniCode-Datei abspeichern???

torud 26. Apr 2007 13:58

Re: Das eigene Programm in Russisch
 
So gehts schon mal nicht. Ich erhalte zwar keine Fragezeichen mehr in dem Programm, aber dafür dann auch gar keinen Inhalt. Ich probiere mal weiter...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  myList:TStringlist;
begin
  myList:=TStringlist.Create;
  myList.LoadFromFile('c:\test.txt');
  Label1.Caption := WideStringToStringEx(myList.Strings[0],251);
end;
Inhalt der Textdatei:
Delphi-Quellcode:
&#1045;&#1059;&#1063;&#1045;
????
TEXT
CP_ACP
CP_MACCP
CP_OEMCP
CP_SYMBOL
CP_THREAD_ACP
CP_UTF7 Windows
CP_UTF8 Windows

Habe jetzt auch diese CodePages versucht, aber ich erhalte NIE ЕУЧЕ im Label angezeigt.

CCRDude 26. Apr 2007 14:08

Re: Das eigene Programm in Russisch
 
Eine TStringList kann keine WideStrinsg, d.h. die brauchst Du auch nicht als WideString konvertieren. Die bereits erwähnten TNTWare Controls haben imho eine TWideStringList (und es gibt auch noch einige andere).
Oder einen Editor nehmen, der Dich die Codepage auswählen lässt (zur Not auch in Delphi selber schreiben, musst ja nur ein TMemo mit dem entsprechenden Charset versehen und nen Speicherknopf dazupacken), dann kannst Du TStringList nehmen und musst gar nichts mehr konvertieren.

torud 26. Apr 2007 14:11

Re: Das eigene Programm in Russisch
 
Für mich waren und sind diese Codepages und Charsets bisher bömische Dörfer. Also einfach ein Memo nehmen und von dort laden? Muss aber dann schon wieder zwingend eine der TNT´s sein, oder? Ok, dann werde ich es später mal versuchen. Warum muss das alles so kompliziert sein?

Bernhard Geyer 26. Apr 2007 14:16

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von torud
Für mich waren und sind diese Codepages und Charsets bisher bömische Dörfer.

Deshalb mein vorschlag: lass es und nimm gleich Unicode-Controls.

Zitat:

Zitat von torud
Warum muss das alles so kompliziert sein?

Delphi wurde zu einer Zeit entwickelt (Delphi 1) als Windows noch kein Unicode konnte. Und bisher hat es Borland/Codegear vermieten (Zeit/Kostenaufwand/Kompatiblität) alles komplet auf Unicode umzustellen sodas das alles im "Hintergrund" ablaufen würde.

CCRDude 26. Apr 2007 14:19

Re: Das eigene Programm in Russisch
 
Naja, nochmal von vorne :D

1. Wenn man ein Projekt frisch anfängt, sollte man gleich Unicode in Betracht ziehen, und dafür z.B. die TNTWare Controls (edit: wie Bernhard gerade sagte).

2. Wenn man ein bestehendes Projekt mit Komponenten, die es nur in ANSI gibt, umstellt (übrigens aus genau diesem Grund hab ich mir die LMDTools nie angetan, war mir zu unsicher, ob die mal Unicode können würden), geht es auch per ANSI.

Was ich mit dem TMemo meinte, völlig ohne Unicode-Komponenten:
  • Neues Projekt erstellen
  • TMemo hinzufügen
  • Memo1.Font.Charset = RUSSIAN_CHARSET;
  • Knopf hinzufügen, der Memo1.Lines.SaveToFile('c:\meinrussisch.txt'); macht.
  • Mit dem Mini-Programm speicherst Du dann einfach eine Textdatei, die Du später auch OHNE Unicode-Konvertierungen oder Controls umwandeln kannst, in der Dein Codeschnipsel von vorhin einfahc mit Label1.Font.Charset := RUSSIAN_CHARSET; Label1.Caption := myList[0]; enden würde.

Womit ich jetzt nicht sagen will, daß eine rein Textdatei als TStringList ausgelesen wirklich geeignet wäre, aber als Ansatz zum Lernen kannst Du das ja mal versuchen.

Kurze Erklärung zu Codepages: normale strings in Pascal bestehen aus normalen chars. Ein Char kann halt maximal 256 verschiedene Zeichen abbilden, das reicht natürlich nicht für alle Alphabete der Welt ;) Also hat man unterschiedliche Bedeutungen für die einzelnen Zeichen erfunden - Zeichen #65 ist auf "Standard"-Codepages (englisch, deutsch um es vereinfacht zu sagen) immer das kleine 'a', auf russichen Codepages immer das Zeichen für Vodka (letzeres natürlich nur erfunden, leider kenn ich keine echten russischen Buchstaben :D).

@Bernhard Geyer: und leider werben Sie trotzdem groß mit Unicode-Unterstützung, meinen damit aber nur die IDE :(

Bernhard Geyer 26. Apr 2007 14:46

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von CCRDude
@Bernhard Geyer: und leider werben Sie trotzdem groß mit Unicode-Unterstützung, meinen damit aber nur die IDE :(

Nicht ganz. Die VCL.NET ist Unicode-Enabled genauso wie WinForms. Die "Gott hab sie Selig" CLX-GUI-Controls waren auch teilweise Unicode-Enbled (Qt hat diese Fähigkeit). Und falls ein Win64-Port kommen wir so wird diese mit sicherheit auch Win64-Fähig sein. Nur die "alte" Win32 wurde noch nicht erweitert.

torud 26. Apr 2007 19:30

Re: Das eigene Programm in Russisch
 
Hallo nochmals,

also nun klappt es. Ok, ich würde also wie folgt vorgehen und ich bitte hiermit nochmal sum Einspruch, falls erforderlich.

In einer Schleife alle Controls und Forms durchsuchen und den Font-Charset ändern.
Dabei schauen, ob das Control nen Namen, eine Caption bzw. einen Text besitzt. Den Namen in die Ini schreiben und dazu den Wert des Textes oder der Caption.

Später im "Translator" in die Memo die Ini laden und den russischen Kollegen alles übersetzen lassen und speichern nicht vergessen.

Gangbarer und sinnvoller Weg? Auf jeden Fall Danke ich euch!!!

Edit:

Gerade eben habe ich festgestellt, dass dies zwar wunderbar mit einem Label funktioniert aber nicht mit nem Button und der Cpation eines Forms und dabei habe ich definitiv den Charset eingestellt und auch Tahoma als Schriftart gewählt. Was ist denn nun wieder?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  myList:TStringlist;
begin
  //erstmal speichern was drin ist
  Memo1.Lines.SaveToFile('c:\test.txt');

  //und dann taufrisch rausholen was drin ist
  myList:=TStringlist.Create;
  myList.LoadFromFile('c:\test.txt');

  //und verteilen
  Label1.Caption := myList.Strings[0];
  self.Caption := myList.Strings[1];
  Button1.Caption := myList.Strings[2];
end;
Die Memo wird beim Createn geladen. Da stimmt alles und steht auch alles kyrillisch drin...

CCRDude 26. Apr 2007 20:38

Re: Das eigene Programm in Russisch
 
Zu beachten gibt es z.B. noch diverse Font-Eigenschaften von Screen, z.B. Screen.MenuFont etc. (siehe Hilfe unter TScreen).. auch im Application-Objekt findet sich beispielsweise noch ein BiDiMode (wobei der für russisch keine Rolle spielt)...

Nur so ganz nebenbei fällt mir ein, hat Delphi nicht sogar auch eine integrierte Lokalisierungshilfe? Ich hab die nie verwendet, weil 500KB+ pro Sprachdatei selbst für das kleinste Projekt für mich nicht in Frage kamen, aber drauf hinweisen kann ja nicht schaden ;)

torud 27. Apr 2007 07:28

Re: Das eigene Programm in Russisch
 
Also zu Deinem ersten Punkt: Folgendes habe ich nun per Code gelöst, aber ohne Erfolg.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  myList:TStringlist;
begin
  //erstmal speichern was drin ist
  Memo1.Lines.SaveToFile('c:\test.txt');

  //und dann taufrisch rausholen was drin ist
  myList:=TStringlist.Create;
  myList.LoadFromFile('c:\test.txt');

  //und verteilen
  Label1.Caption := myList.Strings[0];
  self.Caption := myList.Strings[1];
  Button1.Caption := myList.Strings[2];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Screen.MenuFont.Charset := RUSSIAN_CHARSET;
    Memo1.Lines.LoadFromFile('c:\test.txt');
end;
Auf dem Form liegen nur eine Button, ein Label und die Memo. Mehr nicht.

Zu Deiner 2. Aussage kann ich leider gar nix sagen, da mir da einfach die Tiefenkenntnisse fehlen - Leider!

alzaimar 27. Apr 2007 08:11

Re: Das eigene Programm in Russisch
 
Wenn du deine Anwendung mehrsprachenfähig machen willst (Du entwickelst in Deutsch, Dein Programm soll aber z.B. russische Texte anzeigen), dann würde Ich Dir einfach mal die TsiLang-Suite empfehlen. Damit bekommt man das wunderbar hin.

Alternativ wäre da auch noch GNU GetText zu empfehlen, damit hab ich aber keine Erfahrungen.

Zitat:

Zitat von Bernhard Geyer
Und was machst du wenn du "Ω=∑aa−≍⋥ ä" benötigst?

Wenn man das nicht benötigt (wann eigentlich??), würde ich TsiLang verwenden. Wenn doch, dann TsiLang und irgendwelche hier empfohlenen Unicode Controls. wirklich benötigen tut man die aber im Normalfall nicht.

PepperMatten 24. Jul 2007 11:50

Re: Das eigene Programm in Russisch
 
Zitat:

Zitat von CCRDude
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von CCRDude
Du musst jedem Control in Font.Charset RUSSIAN_CHARSET (204) zuweisen. Geht per Code recht schnell, eine alle Controls der Form durchiterieren (Controls/ControlCount).

Vergiss eine solceh Lösung. Nicht alle Controls berücksichtigen diese Einstellung und eine darauf aufbauende Lösung verursachte mehr Probleme als sie lößt.

Nun, hier wende ich das erfolgreich für 53 verschiedene Sprachen an. Bis auf Persisch (4 Sonderzeichen, die in ARABIC_CHARSET nicht enthalten sind) keinerlei Probleme.
Klar, TVirtualStringTree z.B. will lieber Unicode, dafür registriere ich in meiner Lokalisierungsklasse einen speziellen Handler, aber Controls, die nur ANSI können, dort aber Font.Charset ignorieren, sind mir noch nicht untergekommen (oder vielleicht schon, aber wegen mangelnder Qualität sofort rausgeflogen).
Übrigens: auch mit ANSI-INI-Dateien gelöst ;)


Hallo,

ich habe das Problem mit TDBCheckBox.
Hier wird der Zeichensatz offensichtlich nicht richtig gewechselt - oder mache ich etwas falsch ?

Danke !


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz