![]() |
Ini als Sprachdatei nutzen ?
Hi,
ich möchte ein Programm in verschiedene Sprachen übersetzen. Mir ist dabei vorallem wichtig, dass mit Sprachfiles gearbeitet wird und auch user die Möglichkeit haben selber Sprachfiles anzulegen. Daher erscheint es mir als naheliegend ini Datei zu nutzen. Ich habe mal ein Programm gesehen, welches die Sprachfiles nach folgendem Schema aufbaut: [Deutsch] New=Neu Open=Öffnen Save=Speichern Done=Fertig Es werden also keine Objectnamen oder Indexwerte gespeichert, sondern lediglich der wirkliche Übersetzungstext wie bei einem Wörterbuch. Gibt es dafür Umsetzungsbeispiele ? Ich stelle mir das so vor: - Beschriftung im Programm auf Englisch - Programm durchläuft automatisch Objekte und sucht nach übersetzung, wenn keine Übersetzung gefunden original Beschriftung beibehalten Gruß Yannic |
AW: Ini als Sprachdatei nutzen ?
Als Key macht es eher Sinn, den Namen der Controls zu verwenden, als den aktuellen Text. Als grober Anhaltspunkt:
Code:
ReadControl muss dann, falls es ein TWinControl ist, über dessen ControlCount wieder alle seine Controls durchgehen.
for i := 0 to Pred(Form.ComponentCount) do begin
if (Form.Components[i] is TControl) then begin if (Form.Components[i] as TControl).Parent = Form then begin ReadControl(Form.Name, (Form.Components[i] as TControl), i); end; end else if (Form.Components[i] is TMenu) then begin ReadMenuItem(Form.Name + '.' + (Form.Components[i] as TMenu).Name, (Form.Components[i] as TMenu).Items); end else if (Form.Components[i] is TActionList) then begin ReadAction(Form.Name + '.' + (Form.Components[i] as TActionList).Name, (Form.Components[i] as TActionList)); end; end; Wenn die Controls alle ordentlich und sinnvoll benannt sind, ist das genauso anwenderfreundlich; aber ob Du in den einzelnen Untermethoden nun .Caption/.Text oder .Name als Key verwendest, ist ja nur ein winziger Unterschied. |
AW: Ini als Sprachdatei nutzen ?
Ich hatte es bei einem Programm mal ähnlich, aber als Stringliste mit dem Schema:
Button1=OK Button2=Cancel usw. Damit konnte ich direkt in Components suchen und ersetzen. (Mist, um Sekunden zu langsam...) €: Button1/2 nur als Beispiel, sinnvolle Benennung ist da natürlich Pflicht. |
AW: Ini als Sprachdatei nutzen ?
Zitat:
|
AW: Ini als Sprachdatei nutzen ?
Schau dir mal
![]() |
AW: Ini als Sprachdatei nutzen ?
Zitat:
|
AW: Ini als Sprachdatei nutzen ?
Zitat:
Aber vielleicht ist der Vorschlag, vorhandene Übersetzungssysteme zu nutzen, letzlich besser. |
AW: Ini als Sprachdatei nutzen ?
Hi,
ich habe nun ein wenig mit GetText gepielt. Allerdings wird mir da etwas noch nicht so ganz klar. Kann der User selber wählen, welche Sprache er nutzen möchte, oder wird das Programm automatisch an die System Sprache angeglichen ? Welche Möglichkeiten habe ich das Sprachfile selber zu testen ? Gruß Yannic |
AW: Ini als Sprachdatei nutzen ?
Hi
ich benutze ![]() dabei kannst du all sprachen in die selbe Datei stecken wen du willst.
Delphi-Quellcode:
unit Language_Classe;
interface uses SysUtils, NativeXml; Function Language_Load_File(const FileName : String) : Boolean; Function Language_UnLoad_File() : Boolean; Function Language_Loaded(): boolean; Function Language_Get_Text(LangID : UTF8String; LangName : UnicodeString) : Widestring; implementation var LanguageFile : TNativeXml; Loaded : boolean = false; (***************************** Load Language File *****************************) Function Language_Load_File(const FileName : String) : Boolean; begin Result:= false; if not FileExists(FileName) then exit; if Loaded then begin if (Assigned(LanguageFile)) then begin FreeAndNil(LanguageFile); Loaded:= false; end; end; try LanguageFile:= TNativeXml.CreateName('Language'); LanguageFile.LoadFromFile(Filename); if (Assigned(LanguageFile)) then begin Loaded:= true; Result:= true; end; except // Could not load the language file' on E: Exception do begin if (Assigned(LanguageFile)) then FreeAndNil(LanguageFile); Loaded:= false; Result:= false; Exit; end; end; end; (**************************** UnLoad Language File ****************************) Function Language_UnLoad_File() : Boolean; begin Result:= false; if Loaded then begin if (Assigned(LanguageFile)) then begin FreeAndNil(LanguageFile); Result:= true; Loaded:= false; end; end; end; (*************************** IsLoadded Language File **************************) Function Language_Loaded(): boolean; begin Result:= Loaded; end; (***************************** Load Language File *****************************) (* NodeByName('LangID').ReadString('ID_INF_0001='); NodeByName('LangID').ReadString('ID_OBJ_0001='); *) Function Language_Get_Text(LangID : UTF8String; LangName : UnicodeString) : Widestring; var Str : Widestring; begin Result:= ''; if Loaded then begin With LanguageFile.Root do begin Str:= NodeByName(LangID).ReadUnicodeString(LangName); if (Trim(Str) = '') or (Length(Str) = 0) then Result:= '' else Result:= Str; end; end; end; end.
Code:
<?xml version="1.0" encoding="UTF-16"?>
<Language> <Info> <ID_INF_0001=>Wishmaster</ID_INF_0001=> <ID_INF_0002=>1.0</ID_INF_0002=> <ID_INF_0003=>support@blabla.com</ID_INF_0003=> <ID_INF_0004=>User</ID_INF_0004=> <ID_INF_0005=>User</ID_INF_0005=> </Info> <LangID> <!-- Mein Form --> <ID_OBJ_0001=>Drive</ID_OBJ_0001=> <ID_OBJ_0002=>Drive Action</ID_OBJ_0002=> <ID_OBJ_0003=>Close</ID_OBJ_0003=> <ID_OBJ_0004=>Eject</ID_OBJ_0004=> <ID_OBJ_0005=>Lock</ID_OBJ_0005=> <ID_OBJ_0006=>Unlock</ID_OBJ_0006=> <ID_OBJ_0007=>CDDB</ID_OBJ_0007=> <ID_OBJ_0008=>Read CD-Text</ID_OBJ_0008=> <ID_OBJ_0009=>Read Remote freedb</ID_OBJ_0009=> <ID_OBJ_0010=>Read From CD Player.ini</ID_OBJ_0010=> blablabla |
AW: Ini als Sprachdatei nutzen ?
Also ich nutze Ini-Dateien zum Speichern.
Und zwar im sinne von
Code:
Die Datei heißt dann en.lang.
[Lang]
Hallo=Hello Öffnen=Open Geladen wird nach <sprache>.lang Mehrere Dateien sind es um möglichst schnell die Sprachen laden zu können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz