variable aus mehreren strings zusammensetzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

variable aus mehreren strings zusammensetzen

Beitrag von Bauer321 »

Moin,

ich wollte versuchen mein Programm zu übersetzen indem ich die verschiedenen Übersetzungen in Resource-Strings speichere. Nun habe ich mir überlegt ich lege ne unit an in die ich alle Resource-Strings packe.
so sieht das dann aus:

Code: Alles auswählen

unit utranslations;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
var
  language: string;
 
resourcestring
  addmoreversions_de = 'Weitere Versionen hinzufügen';
  addmoreversions_en = 'Add more Versions';
 
implementation
 
end.
Beim starten des Programms wird der String language auf de bzw en gesetzt.
jetzt würde ich gerne das ganze so aufrufen: addmoreversions_+language und dann soll der Resource-String aufgerufen werden.
Nur da hackt's ich weiß nicht wie ich das hinbekomme das der dann nach dem Resource-String sucht und das ganze nicht als String bzw ungültigen Code erkennt

... ich habe noch weiter gegooglet und bin bei Konstanten gelandet. Haben die in irgendeiner Hinsicht Vor- bzw. Nachteile?

Code: Alles auswählen

const
  addmoreversions: array[1..2] of string = ('Weitere Versionen hinzufügen',
                                             'Add more Versions');

dadurch kann man diese dann einfach mit addmoreversions[language] abrufen
www.mcpatcher.net | www.hoeper.me

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: variable aus mehreren strings zusammensetzen

Beitrag von Bora4d »

Lazarus bietet für so etwas Unterstützung hier sind die Infos:
http://wiki.lazarus.freepascal.org/Tran ... rograms/de

Aber wenn du das selber sowie du vorhast machen willst nimm einfach multidimensionale Array:

Code: Alles auswählen

const
  addmoreversions: array[0..1,0..2] of string = (('DeutschText1',
                                             'DeutschText2','DeutschText3'),('EnglishText1',
                                             'EnglishText2','EnglishText3'));
Der erste Index von Arrary ist Sprache und zweite Texte so etwa:
addmoreversions[0,0] liefert dann 'DeutschText1' zurück
und
addmoreversions[1,0] liefert dann 'EnglishText1' zurück.
addmoreversions[1,1] liefert dann 'EnglishText2' zurück.

Das ist aber nicht der gute Weg weil du dann den Speicher voll mit nutzlosen anderen Texte (Sprachen was nicht aktuell verwendet wird) voll hast. Deshalb am besten entweder Lazarus-Weg oder mit Text-Dateien die man bei bedarf ladet nehmen.
Textdateien kannst du als Ini-Files nehmen weil Laden und Verwendung sehr einfach ist. Du kannst sogar die Komponentnamen verwenden um Übersetzung zu holen. Für Inifiles können dir diese Sachen helfen:
TIniFile
procedure TIniFile.ReadSection (const Section: String; Strings: TStrings);
property TStrings.Values[const Name: string]: string;

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: variable aus mehreren strings zusammensetzen

Beitrag von MmVisual »

Ich würde das eher in eine TStringList halten.

Mit TStringList.Add() können alle Texte hinzugefügt werden.

In einer TList können dann die verschiedenen Sprachen gehalten werden.
TList.Add(StringListDE);

Aber man braucht zur Laufzeit nur eine einzige Sprache, daher lade ich die nur in eine einzige TStringList. Die Komponenten lade ich direkt von der Datei ohne speichern.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: variable aus mehreren strings zusammensetzen

Beitrag von Bauer321 »

ok danke für eure antworten ich werds mal mit einer ini versuchen da weiß ich schon wie ich sie nutze. ich werd mal gucken ob ich die ini dann evtl als resource mit in die exe kompiliere
dann habe ich noch eine frage gibt es für lazarus eine komponente/unit mit der man unterschiede von dateien speichern sowie übernehmen kann?
Zum einen würde ich sowas nutzen wollen wenn ich eine neue version mache dann kann man einfach den updater laden, das verbraucht weniger speicher und traffic zum anderen um java zu patchen mit diff files würde man weniger speicher brauchen

edit: also ich habs jetzt mit ner ini gemacht wie bekomme ich das jetzt aber hin das umlaute richtig erkannt werden?
www.mcpatcher.net | www.hoeper.me

Antworten