AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte hTranslations - kleine Übersetzungskomponenten
Thema durchsuchen
Ansicht
Themen-Optionen

hTranslations - kleine Übersetzungskomponenten

Ein Thema von himitsu · begonnen am 12. Jun 2011 · letzter Beitrag vom 12. Jun 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu Online
Registriert seit: 11. Okt 2003
Joar, ich bastel mir grad 'ne eigene Sammlung an Komponenten, welche ihren Text gleich mit übersetzen.

Als Erstes werde ich einige Standardkomponenten vom Delphi übersetzen,
also alle möglichst Property/Methoden abfangen, welche am Ende irgendwie Text anzeigen.

Als erstes Versuchsobjekt mußte TLabel dran glauben und TEdit hab ich innerhalb von 10 Sekunden genauso umgestellt,
aber da muß ich noch ein bissl Testen, vorallem was das Änder per Benutzereingabe bestifft.
Im Prinzip lassen sich am Ende auch viele Fremdkomponenten so "nachrüsten".

Wenn man sich z.B. ein eigenes Set an Übersetzungen (TTransApp) über ein DesignPackage in die IDE einschleußt, kann man sogar schon zur Designtime dieses nutzen.
Siehe Project1 > "hTransInvalidEnd", mit der Standarssignatur "htx" in der Capion und uf dem Formular sieht man einen anderen Text.
PS: hTransInvalidEnd ist nur ein vordefinierter Standard-"Bezeichner", denn diese Übersetzungskomponenten übersetzen sich selber,
bzw. man kann über die vorhandenen Schnittstellen auch gleich deren Melde-/Fehlertexte mit übersetzen (wenn man unbedingt will)

Das vorkompilierte Demo-Programm enthält nur folgende Befehle:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  TransApp1.Signature := '$';
  TransApp1.Add('Test', 'Hallöle');
  TransApp1.Add('xxx', 'Es geht :D');

  TransLabel1.Caption := '*$Test*';
  TransLabel2.Perform(WM_SETTEXT, 0, PChar('>>> $xxx <<<'));
  TransLabel2.Perform(CM_TEXTCHANGED, 0, 0); // für's AutoSize

  Label1.Caption := TransLabel1.Caption;
  Label2.Caption := TransLabel2.Caption;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TransApp1.Add('Test', 'jupp');
  TransApp1.Add('xxx', 'schön');
end;
Natürlich läßt sich die Übersetzung auch sonstwo nutzen, über kleine Funktionen.
Und es wäre auch ganz einfach möglich, die Übersetzungen zur Laufzeit adhoc aus einer datenbank zu ziehen, wenn man unbedingt will.

Ein Ändern der Wörterbücher paßt auch sofort programmweit alle Übersetzungen an.

Die Komponenten lassen sich entweder an eine bestimmte TransApp (Übersetzer) hängen oder sie arbeiten mit allen global registrierten TransApp's.

Nja, beim TLabel hab ich es übertrieben, denn die Übersetzung reagiert auch auf Messages,
aber standardmäßig hab ich "nur" vor die Property ala .Text und .Caption zu hocken und nur über dieses Stellen die Übersetungen einfließen zu lassen.
Somit braucht man nirgends was umbauen, da alles über die normalen Schnittstelleb/Property läuft.

Unterschiedliche Übersetzungen könnte man auf verschiedene Wege einspielen
> entweder man läd nimmt sich eine TransApp und läd dort jeweils die Texte in gewünschter Sprache rein (Einzeln oder über Dateien/Streams/Resourcen)
> man läd merhere Sprachen gleichzeitig und nutzt den Postfix, welchen diese Liste anbietet TransApp1.Postfix := '.de'; ,
womit dann alle Anfragen entsprechend umgeleitet werden ('Test' => 'Test.de').
Delphi-Quellcode:
TransApp1.Add('Test', 'jupp');
TransApp1.Add('Test.de', 'jupp');
TransApp1.Add('Test.en', 'yo');
> Wenn man sich einen Nachfahren von TTransApp erstellt, bzw. die Entsprechenden Ereignisse im OI verknüft,
dnn kann man auf OnTransMsg reagieren, schickt allen TTransApp's z.B. 'de' rüber und filtert dann im OnTransText entsprechend.
> oder oder oder




Soooo, was sagt ihr dazu?

An einigen stellen muß ich noch was machen.
So ist z.B. der Komponenteneditor (Doppelklick auf TTransApp) noch nicht ganz fertig.
Doppelten Code wegoptimieren und noch ein paar Ecken mit eventuell anders/besser überlegen.
Auch die Standard-Signatur ist nicht das Wahre, aber jetzt geh ich erstmal schlafen (hab morgen heute auch noch etwas Anderes vor, außer Proggen)
Miniaturansicht angehängter Grafiken
unbenannt.png  
Angehängte Dateien
Dateityp: 7z hTranslations.7z (316,7 KB, 39x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Jun 2011 um 02:34 Uhr)
 
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#2
  Alt 12. Jun 2011, 03:14
Zwei Fragen, die sich mir gleich aufdrängen:
  1. Was macht das besser als z.B. GNU GetText, Multlilizer, Sisulizer (außer dass es gegenüber den letzten beiden nix kostet)
  2. Warum braucht man dafür bitte extra Komponenten?
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

 
Delphi XE Professional
 
#3
  Alt 12. Jun 2011, 03:23
*hust* du hast Lingus vergessen..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#4
  Alt 12. Jun 2011, 09:08
Zitat:
2. Warum braucht man dafür bitte extra Komponenten?
Weil die Übersetzung "live" in den Komponenten vorgenommen wird.
Über GExperts und Co. lassen sie sich auch ganz leicht austauschen, was dank der Property-Gleichheit keinerlei Probleme bereiten wird.
Man könnte die Komponenten auch zur Laufzeit nachschieben (genauso wie die TNTs im TDE)


3. Hatte Sakura oder Seehase nicht auch mal einen Übersetzer?
Also irgendein DP-Mitglied war's zumindestens.



Zur Zeit sind es noch Extrakomponenten, was auch für "komplizierte" Komponenten so bleiben wird, aber mit Hilfe der neuen RTTI sollte sich (wenn alles läuft, wie geplant) vieles nachträglich aktivieren lassen, aber ebenfalls schon zur Designtime.

Aus Sicht des Programms wird nirgendwo etwas verändert.

Du kannst an die Caption irgendeines Labels den gewünschten TextCode übergeben und beim Auslesen ist noch genau dieser drin ... nur angezeigt wird etwas Anderes.
Man kann auch zur Laufzeit jederzeit einen neuen Textcode übergeben und der wird auch sofort übersetzt angezeigt.
Bei sowas wie Lingus muß man das vorher im Quelltext übersetzen oder die Komponente entsprechenden bei diesem LanguageObjects regitrieren, es dort ändern und dann neu Übersetzen, bzw. zur Komponente schicken .... hab ich doch richtg verstanden, daß man es so machen muß?
> Es gibt immernoch genug Leute, welche z.B. den Text eines Labels auslesen und diesen zur Steuerung irgendwelcher Funktionen nutzen.

Und es funktioniert auch zur Designtime.
Im Quellcode wollte ich irgendwann mal sehn, ob man die Code-Vervollständigung irgenwie erweitern kann.

Und es ist eigentlich nicht vorrangig auf sprachliche Übersetungen ausgelegt.
(eine Liveanbindung an die Google-Translate-API wäre dennoch möglich )

Gut, daß hier nicht die Texte, sondern "Befehle" übersetzt/ersetzt werden, mag Nachteile haben. Kann aber bestimmt auch Vorteile bringen.
Wir haben, hier in der Firma, einige eigene Komponenten, wo unter Anderem ein weiteres Property Text-Nummer existiert, darüber holt sich jede Komponente, aus einer Datenbank die Übersetzungen,
wobei es dort mehr kundenspezifische Anpassungen sind.

OK, alle, ohne Generics und (noch nicht enthalten) und die neusten RTTI-Spielereien, werden es nicht nutzen können.

Vorteil: Es ist ein DP-Eigenes Projekt.
OS Free usw.



[add]
Zum Lingus:
- Startet mal deren Demoprojekt.
- ändert den Text "Ein Test für Includes"
- wählt etwas in der ComboBox aus
- ändert dann die Sprache
- und freut euch über zurückgesetze Texte

Geändert von himitsu (12. Jun 2011 um 09:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#5
  Alt 12. Jun 2011, 10:28
Und es ist eigentlich nicht vorrangig auf sprachliche Übersetungen ausgelegt.
(eine Liveanbindung an die Google-Translate-API wäre dennoch möglich )
Nu jo, ob man die tatsächlich noch einbauen sollte?
http://code.google.com/intl/de/apis/.../overview.html
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#6
  Alt 12. Jun 2011, 10:47
Was für perverse Schweine mißbrauchen denn soeine kleine Api?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#7
  Alt 12. Jun 2011, 14:06
Zitat von Google:
Due to the substantial economic burden caused by extensive abuse, the number of requests you may make per day will be limited
Muhahaha

@Himi: Mir geht gerade durch den Kopf, dass ich mit meinen Bindings auch die Übersetzung regeln könnte, wobei dann der angezeigte Text dem tatsächlichem Text entspricht. Macht aber nix, denn so nen Schmarrn wie Text aus nem Label für irgendne Steuerung zu nutzen, unterstütze ich eh nicht.
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 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