AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ini als Sprachdatei nutzen ?

Ein Thema von Blamaster · begonnen am 22. Jun 2011 · letzter Beitrag vom 24. Jun 2011
Antwort Antwort
Seite 1 von 2  1 2      
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 13:37
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
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
677 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 13:42
Als Key macht es eher Sinn, den Namen der Controls zu verwenden, als den aktuellen Text. Als grober Anhaltspunkt:
Code:
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;
ReadControl muss dann, falls es ein TWinControl ist, über dessen ControlCount wieder alle seine Controls durchgehen.

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.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 13:42
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.

Geändert von Satty67 (22. Jun 2011 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#4

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 14:02
Zitat:
Button1=OK
Button2=Cancel
Mit den Namen zu arbeiten halte ich aber für extrem redundant. Ein Programm mit 10 Okay Buttons hat dann 10 Einträge in der ini.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 14:07
Schau dir mal GetText an. Die arbeitet auch mit Sprachdateien, und andere Nutzer können recht einfach eigene Übersetzungen anfertigen. Und da hat man noch einige andere Funktionen, wie z.B. das Auslesen aller Strings aus den pas und dfm-Dateien, um eine entsprechende Rohdatei für Übersetzungen zu erzeugen.
The angels have the phone box.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 14:12
Schau dir mal GetText an. Die arbeitet auch mit Sprachdateien, und andere Nutzer können recht einfach eigene Übersetzungen anfertigen. Und da hat man noch einige andere Funktionen, wie z.B. das Auslesen aller Strings aus den pas und dfm-Dateien, um eine entsprechende Rohdatei für Übersetzungen zu erzeugen.
Wollte ich auch gerade vorschlagen. Man muss das Rad hier wirklich nicht neu erfinden
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 15:38
Zitat:
Button1=OK
Button2=Cancel
Mit den Namen zu arbeiten halte ich aber für extrem redundant. Ein Programm mit 10 Okay Buttons hat dann 10 Einträge in der ini.
Nein, denn der OK Button auf jedem Formular hat immer den Namen ButtonOK (10 OK-Button auf einem Formular schließe ich jetzt mal als unwahrscheinlich aus)

Aber vielleicht ist der Vorschlag, vorhandene Übersetzungssysteme zu nutzen, letzlich besser.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#8

AW: Ini als Sprachdatei nutzen ?

  Alt 22. Jun 2011, 21:33
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
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#9

AW: Ini als Sprachdatei nutzen ?

  Alt 23. Jun 2011, 03:53
Hi

ich benutze XML für die Sprach und Programm Einstellungen
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
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Ini als Sprachdatei nutzen ?

  Alt 23. Jun 2011, 09:54
Also ich nutze Ini-Dateien zum Speichern.
Und zwar im sinne von
Code:
[Lang]
Hallo=Hello
Öffnen=Open
Die Datei heißt dann en.lang.
Geladen wird nach <sprache>.lang

Mehrere Dateien sind es um möglichst schnell die Sprachen laden zu können.
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:16 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