Lokalisierung
Aus DGL Wiki
Version vom 26. Juli 2006, 10:14 Uhr von The-Winner (Diskussion | Beiträge) (Erste Zwischenspeicherung, Unvollständig!)
Inhaltsverzeichnis
Lokalisierung
Allgemein
Als Lokalisirung bezeichnet man den Vorgang eine Software in verschiedene Sprachen zu übersetzen.
Anforderungen
- Einfach einzusetzen
- Software kann auch nach dem Übersetzen noch verändert werden
- Auch bei anderem Satzbau noch verwendbar
Ansätze
- Formularresourcen (Borland)
Nachteil: Es ist schwer das Formular nach dem Übersetzen noch anzupassen und es wird bei sonstigen Texten keine Unterstüzung geboten - Programm das im Quelltext alle Strings suchen unt ersetzen kann
Nachteil: Es gibt viele nicht zu übersetzende Strings, Programm muss für jede Spreche kompiliert werden - Übersetzungsfunktion:
Vorteil: Kann überall im Quelltext eingesetzt werden
Nachteil: Jeder zu übersetzende String muss an diese Funktion übergeben werden
Einfaches Übersetzungssystem
Hier werde ich den 3. Ansatz implementieren: eine Übersetzungsfunktion
unit Translator; interface Function Translate(const Name: string; const Args: array of const): string;overload; Function Translate(const Name: string): string;overload; procedure LoadLanguage(const Lang:String); function CurrentLanguage:String; implementation uses sysutils,classes; var langdata:TStringlist; CurLang:String; Function Translate(const Name: string; const Args: array of const): string;overload; begin result:=format(translate(Name),Args); end; Function Translate(const Name: string): string;overload; var i:integer; begin langdata.find(Name+'=',i); if (i<langdata.count)and(copy(langdata[i],1,length(Name)+1)=Name+'=') then result:=Copy(langdata[i], Length(Name) + 2, MaxInt) else raise exception.create('String not translated: "'+Name+'"'); result:=stringreplace(result,'\r',#13,[rfReplaceAll]); result:=stringreplace(result,'\n',#10,[rfReplaceAll]); result:=stringreplace(result,'\\','\',[rfReplaceAll]); end; procedure LoadLanguage(const Lang:String); begin CurLang:=lowercase(Lang); langdata.loadfromfile(changefileext(paramstr(0),'.'+CurLang)); end; function CurrentLanguage:String; begin result:=CurLang; end; initialization langdata:=TStringlist.create; langdata.sorted:=true; finalization langdata.free; end.
unit TranslatorVCL; interface uses classes,translator,controls,menus,actnlist,sysutils,comctrls,stdctrls; Procedure Translate(const Component:TComponent;Path:String='');overload; procedure CreateTranslationTable(const Component:TComponent;const Filename:String); implementation Type TMyControl=class(TControl); Procedure Translate(const Component:TComponent;Path:String='');overload; var i:integer; begin //Pfad anpassen if Path='' then Path:=Component.Name else Path:=Path+'.'+Component.Name; //Eigenschaften übersetzen if (Component is TControl)and(TMyControl(Component).Caption<>'')then TMyControl(Component).Caption:=Translate(Path+'.Caption'); if (Component is TControl)and(TControl(Component).Hint<>'')then TMyControl(Component).Hint:=Translate(Path+'.Hint'); if (Component is TMenuItem)and(TMenuItem(Component).Caption<>'')and(TMenuItem(Component).Action=nil)then TMenuItem(Component).Caption:=Translate(Path+'.Caption'); if (Component is TMenuItem)and(TMenuItem(Component).Hint<>'')and(TMenuItem(Component).Action=nil)then TMenuItem(Component).Hint:=Translate(Path+'.Hint'); if (Component is TCustomAction)and(TCustomAction(Component).Caption<>'')then TCustomAction(Component).Caption:=Translate(Path+'.Caption'); if (Component is TCustomAction)and(TCustomAction(Component).Hint<>'')then TCustomAction(Component).Hint:=Translate(Path+'.Hint'); if (Component is TTabControl)and(TTabControl(Component).Tabs.text<>'')then TTabControl(Component).Tabs.text:=Translate(Path+'.Tabs'); if (Component is TCustomComboBox)and(TCustomComboBox(Component).items.text<>'')then TCustomComboBox(Component).items.text:=Translate(Path+'.Items'); if (Component is TCustomListBox)and(TCustomListBox(Component).items.text<>'')then TCustomListBox(Component).items.text:=Translate(Path+'.Items'); //Unterkomponenten übersetzen for i:=0 to Component.ComponentCount-1do Translate(Component.Components[i],Path); end; procedure CreateTranslationTable(const Component:TComponent;const Filename:String); var List:TStringlist; function Escape(const S:String):String; begin result:=S; result:=stringreplace(result,'\','\\',[rfReplaceAll]); result:=stringreplace(result,#13,'\r',[rfReplaceAll]); result:=stringreplace(result,#10,'\n',[rfReplaceAll]); end; procedure AddComponent(const Component:TComponent;Path:String); var i:integer; begin //Pfad anpassen if Path='' then Path:=Component.Name else Path:=Path+'.'+Component.Name; //Eigenschaften speichern if (Component is TControl)and(TMyControl(Component).Caption<>'')then List.add(Path+'.Caption='+Escape(TMyControl(Component).Caption)); if (Component is TControl)and(TControl(Component).Hint<>'')then List.add(Path+'.Hint='+Escape(TMyControl(Component).Hint)); if (Component is TMenuItem)and(TMenuItem(Component).Caption<>'')and(TMenuItem(Component).Action=nil)then List.add(Path+'.Caption='+Escape(TMenuItem(Component).Caption)); if (Component is TMenuItem)and(TMenuItem(Component).Hint<>'')and(TMenuItem(Component).Action=nil)then List.add(Path+'.Hint='+Escape(TMenuItem(Component).Hint)); if (Component is TCustomAction)and(TCustomAction(Component).Caption<>'')then List.add(Path+'.Caption='+Escape(TCustomAction(Component).Caption)); if (Component is TCustomAction)and(TCustomAction(Component).Hint<>'')then List.add(Path+'.Hint='+Escape(TCustomAction(Component).Hint)); if (Component is TTabControl)and(TTabControl(Component).Tabs.text<>'')then List.add(Path+'.Tabs='+Escape(TTabControl(Component).Tabs.text)); if (Component is TCustomComboBox)and(TCustomComboBox(Component).Items.text<>'')then List.add(Path+'.Items='+Escape(TCustomComboBox(Component).Items.text)); if (Component is TCustomListBox)and(TCustomListBox(Component).Items.text<>'')then List.add(Path+'.Items='+Escape(TCustomListBox(Component).Items.text)); //Unterkomponenten speichern for i:=0 to Component.ComponentCount-1do AddComponent(Component.Components[i],Path); end; begin List:=TStringlist.create; try AddComponent(Component,''); List.SaveToFile(Filename); finally List.free; end; end; end.