Sign in Join
Wiki copytemporary

Translations / i18n / localizations for programs/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
22
33== Überblick ==
44
55Hier wird gezeigt, wie Sie in Ihrem Programm verschiedene Strings für verschiedene Sprachen (Englisch, Deutsch, Chinesisch...) ausgeben können. Dazu müssen Sie nur Folgendes tun: Einen *resourcestring* für jeden String, den Sie ausgeben möchten hinzufügen, kompilieren um .rst und/oder .po Dateien zu erhalten (kann die IDE automatisch erzeugen), für jede Sprache eine .po Datei erstellen (dazu gibt es graphische Programme), und zuletzt die richtige .po Datei beim Programmstart mittels der Unit *translations* laden.
66
77## Schnell i18n
88
99Dies soll ein Schnelleinstig sein, der Übersetzungen kurz und bündig vorstellt.
1010
1111### poedit
1212
1313Das bekannteste Werkzeug ist [Poedit](https://poedit.net/). Poedit ist ein Übersetzungswerkzeug, das .po und .mo-Dateien erstellt.
1414
1515### Resourcestrings übersetzen
1616
1717Auf folgende Weise wird ein Ressourcestring einer Unit erzeugt:
1818
1919``` pascal
2020resourcestring
2121 Caption1 = 'Ein Text';
2222 HelloWorld1 = 'Hello World';
2323```
2424
2525Resourcestrings verhalten sich wie normale Stringkonstanten, das heißt, man kann sie einfach so verwenden:
2626
2727``` pascal
2828Label1.Caption := HelloWorld1;
2929```
3030
3131### Beim Compilieren .po-Dateien erstellen
3232
3333Wenn man i18n in der Lazarus IDE einschaltet werden Resourcestrings zu .po-Dateien compiliert. i18n findet man unter Projekt \> Projekteinstellungen \> i18n \> i18n einschalten. Beim erneuten compilieren werden die .po-Dateien aktualisiert. Man kann ebenfalls das Verzeichnis festlegen, in dem die .po-Dateien gespeichert werden. (Empfohlen wird **po files**)
3434
3535Die empfohlene voreingestellte Übersetzung oder Applications-Sprache sollte Englisch sein, da sie geladen wird, wenn keine passende Übersetzung gefunden wird.
3636
3737Ist die **project1.po**-Datei erstellt, muss man sie in **project1.\<Sprache\>.po** umbenennen, wobei \<Sprache\> für das Kürzel der jeweiligen Sprache steht z.B: **project1.es.po** für Spanisch. Diese muss man nun zum Übersetzen geben.
3838
3939Die Verzeichniss-Struktur sieht nun ungefähr so aus:
4040
4141``` pascal
4242project1\po_files\
4343project1\po_files\project1.po
4444project1\po_files\project1.es.po
4545```
4646
4747### .po-Dateien umwandeln zu .mo-Dateien
4848
4949Wenn die .po-Datei fertig übersetzt ist, sollte man sie in eine .mo-Datei compilieren, da dieses Binärformat schneller geladen wird. Für die Konvertierung in das .mo-Format eignet sich z.B. [Poedit](https://poedit.net/) ( Datei -\> MO-Datei erstellen ... ).
5050
5151### Automatische Übersetzung
5252
5353Wenn alle .mo-Dateien fertig sind, werden sie in das Verzeichnis **locale** oder **languages** direkt unterhalb des Anwendungsprogramms gespeichert. Dann wird noch die Unit **DefaultTranslator** eingebunden und das war schon alles. Die Übersetzung erfolgt automatisch.
5454
5555``` pascal
5656uses
5757 DefaultTranslator;
5858```
5959
6060Es sollten nur die .mo-Dateien im **locale** or **languages** Verzeichnis ausgeliefert werden, da die .po-Dateien nur für die Anfertigung der Übersetzung und die Compilierung in .mo-Dateien benötigt werden.
6161
6262Die Verzeichnissstruktur wird so aussehen:
6363
6464``` pascal
6565project1\project1.exe
6666project1\locale\
6767project1\locale\project1.mo
6868project1\locale\project1.es.mo
6969```
7070
7171## Zusätzliche Informationen
7272
7373## Datums-, Zeit- und Zahlenformat
7474
7575In der Unit [sysutils](http://www.freepascal.org/docs-html/rtl/sysutils/index.html) sind verschiedene Format-Zeichen definiert, mit denen Datum und Zeit oder Dezimalzahlen formatiert werden. Unter POSIX-konformen Betriebssystemen wie Linux oder Mac OS X können diese von der Unit clocale automatisch aus der Standard C Library übernommen werden. Dazu muss die Unit nur in das Programm (.lpr) aufgenommen werden:
7676
7777``` pascal
7878uses
7979 {$IFDEF UNIX}
8080 {$IFDEF UseCThreads}cthreads,{$ENDIF}
8181 clocale,{$ENDIF}
8282 Interfaces, // this includes the LCL widgetset
8383 Forms, Unit1
8484 { you can add units after this };
8585```
8686
8787## Ressourcenstrings
8888
8989Ressourcenstrings verhalten sich ähnlich wie String-Konstanten, können aber zur Laufzeit übersetzt werden.
9090
9191Eine Definition sieht so aus:
9292
9393``` pascal
9494resourcestring
9595 Caption1 = 'Irgendein Text';
9696 HelloWorld1 = 'Hello World';
9797```
9898
9999Nun kann man sie wie normale String-Konstanten verwenden. Wurden sie bereits übersetzt, wird nicht mehr der originale Inhalt sondern die Übersetzung zugewiesen:
100100
101101``` pascal
102102Label1.Caption := HelloWorld1;
103103```
104104
105105Wenn der FPC eine Unit mit einem resourcestring-Abschnitt übersetzt, erzeugt er automatisch eine Datei **unitname.rst**, in der alle Resourcestring-Daten (Name + Inhalt) zu dieser Unit gespeichert werden.
106106
107107## .po Dateien
108108
109109*.po* Dateien sind genau wie die *.rst* Dateien einfache Textdateien, enthalten aber ein paar mehr Optionen, wie einen Header, in dem Felder für Autor, Kodierung (Zeichensatz), Sprache und Datum vorgesehen sind. Daher können sie mit jedem Texteditor bearbeitet werden. Es gibt aber viele freie, grafische Tools um *.po* Dateien um diese Aufgabe bequemer zu erledigen (z.B. mit [kbabel](http://kbabel.kde.org/), [Poedit](http://www.poedit.net/)).
110110
111111Jede fpc Installation enthält das Programm **rstconv** (unter Windows *rstconv.exe*). Dieses Werkzeug kann verwendet werden, um eine .rst Datei in eine .po Datei zu konvertieren. Die IDE kann dies aber automatisch erledigen (einzustellen in den Projektoptionen, siehe unten).
112112
113113Beispiel wie rstconv direkt verwendet wird:
114114
115-` rstconv -i unit1.rst -o unit1.po`
115+```text
116+ rstconv -i unit1.rst -o unit1.po
117+```
116118
117119## Übersetzen
118120
119121Für jede Sprache muss die .po-Datei kopiert und übersetzt werden. Einige Tipps zum Übersetzen finden Sie unter: [[Getting translation strings right/de|Wie man Übersetzungsstrings richtig hinbekommt]].
120122
121123Die LCL Unit *translation* sucht nach den übersetzen .po-Dateien nach dem Schema: *unitname.\<Sprachkürzel\>.po*, wobei \<Sprachkürzel\> dem üblichen Sprachcode (en=English, de=Deutsch, it=Italienisch, ...) entspricht. Die deutsche Übersetzung für *unit1.po* wäre also in *unit1.de.po* zu finden. Legen Sie also für jede Sprache, die Sie anbieten wollen, eine Kopie der Originaldatei an und übersetzen Sie diese.
122124
123125**Anmerkung für Brasilianer/Portugiesen:**: Lazarus IDE und LCL haben nur eine Übersetzung für brasilianisches Portugiesisch und diese Dateien enden auf 'pb.po' und nicht auf 'pt.po'.
124126
125127## IDE Einstellungen für automatische Updates der .po Dateien
126128
127129- Die Unit, die die Ressourcenstrings enthält, muss zum Package oder Projekt hinzugefügt sein.
128130- Sie müssen einen .po Pfad angeben. Dies bedeutet ein separates Verzeichnis. Zum Beispiel: erzeugen sie ein Unterverzeichnis *languages* im Package / Projekt Verzeichnis.\
129131
130132Für Projekte wählen Sie im Menü Projekt \> Projekteinstellungen -\> i18n.\
131133Für Packages wählen Sie in den Package-Einstellungen 'i18n'.
132134
133135Wenn diese Optionen aktiviert sind, dann erzeugt bzw. aktualisiert die IDE die zugrundeliegende .po-Datei und benutzt dazu die Informationen aus den .rst und .lrt-Dateien (das rstconv Werkzeug ist dann nicht notwendig). Der Aktualisierungsvorgang beginnt damit, alle bestehenden Einträge aus der grundlegenden .po-Datei sowie aus den .rst und .lrt-Dateien zu sammeln, und wendet dann die nachfolgend gefundenen Merkmale an und aktualisiert so jede übersetzte .xx.po Datei.
134136
135137### Entfernen überflüssiger Einträge
136138
137139Einträge aus der grundlegenden .po Datei, die nicht in .rst und .lrt-Dateien zu finden sind, werden entfernt. Anschließend werden ebenso all jene Einträge entfernt, die zwar in den übersetzten .xx.po Dateien vorkommen, aber nicht in der .po-Datei stehen. Auf diese Weise werden die .po Dateien nicht mit obsoleten Einträgen zugemüllt und die Übersetzer müssen keine Einträge bearbeiten, die gar nicht mehr verwendet werden.
138140
139141### Mehrfache Einträge
140142
141143Mehrfache Einträge treten dann auf, wenn derselbe Text für verschiedene Ressourcenstrings als Übersetzung steht. Ein Beispiel dafür findet man in der Datei 'lazarus/ide/lazarusidestrconst.pas' für den 'Gutter' String:
142144
143145``` pascal
144146 dlfMouseSimpleGutterSect = 'Gutter';
145147 dlgMouseOptNodeGutter = 'Gutter';
146148 dlgGutter = 'Gutter';
147149 dlgAddHiAttrGroupGutter = 'Gutter';
148150```
149151
150152Eine konvertierte .rst-Datei für diese Ressourcenstrings würde ähnlich aussehen wie die folgende .po-Datei:
151153
152-`#: lazarusidestrconsts.dlfmousesimpleguttersect`\
153-`msgid "Gutter"`\
154-`msgstr ""`\
155-`#: lazarusidestrconsts.dlgaddhiattrgroupgutter`\
156-`msgid "Gutter"`\
157-`msgstr ""`\
158-`etc.`\
154+```text
155+#: lazarusidestrconsts.dlfmousesimpleguttersect
156+msgid "Gutter"
157+msgstr ""
158+#: lazarusidestrconsts.dlgaddhiattrgroupgutter
159+msgid "Gutter"
160+msgstr ""
161+etc.
162+```
159163
160164Wobei die mit "#: " beginnenden Zeilen als Kommentare betrachtet werden und die zum Übersetzen dieser Einträge verwendeten Werkzeuge die wiederholten msgid "Gutter" Zeilen als mehrfache Einträge ansehen und Fehler oder Warnhinweise beim Laden oder Speichern produzieren. Mehrfache Einträge treten bei .po-Dateien häufig auf und deshalb ist es nötig, sie durch einen angehängten Kontext näher zu bestimmen. Das Schlüsselwort 'msgctxt' fügt einen Kontext an einen der mehrfachen Einträge an. Das Werkzeug zum automatischen Aktualisieren verwendet die Eintrags-ID (das ist der Text neben dem "#: " Präfix) als Kontext. Im vorigen Beispiel würde es ungefähr folgendes liefern:
161165
162-`#: lazarusidestrconsts.dlfmousesimpleguttersect`\
163-`msgctxt "lazarusidestrconsts.dlfmousesimpleguttersect"`\
164-`msgid "Gutter"`\
165-`msgstr ""`\
166-`#: lazarusidestrconsts.dlgaddhiattrgroupgutter`\
167-`msgctxt "lazarusidestrconsts.dlgaddhiattrgroupgutter"`\
168-`msgid "Gutter"`\
169-`msgstr ""`\
170-`etc.`\
166+```text
167+#: lazarusidestrconsts.dlfmousesimpleguttersect
168+msgctxt "lazarusidestrconsts.dlfmousesimpleguttersect"
169+msgid "Gutter"
170+msgstr ""
171+#: lazarusidestrconsts.dlgaddhiattrgroupgutter
172+msgctxt "lazarusidestrconsts.dlgaddhiattrgroupgutter"
173+msgid "Gutter"
174+msgstr ""
175+etc.
176+```
171177
172178Bei übersetzten .xx.po Dateien macht das automatische Tool eine zusätzliche Überprüfung: wenn der mehrfache Eintrag bereits übersetzt wurde, übernimmt der neue Eintrag die alte Übersetzung, sodass er wie automatisch übersetzt erscheint.
173179
174180Die automatische Erkennung von Duplikaten ist noch nicht perfekt. Die Erkennung wird jedes Mal durchgeführt, wenn neue Einträge hinzugefügt werden. Es kann aber passieren, dass einige nicht übersetzte Einträge zuerst gelesen werden. Daher können mehrere Durchläufe notwendig sein, damit das Werkzeug alle Duplikate automatisch übersetzen kann.
175181
176182### Merkwürdige Einträge
177183
178184Änderungen an Ressourcenstrings beeinflussen die Übersetzungen.\
179185(Das folgende Beispiel wurde aus der Lazarus history entnommen)\
180186Wenn z. B. ein Ressourcenstring anfänglich wie folgt definiert war:
181187
182188``` pascal
183189 dlgEdColor = 'Syntax highlight';
184190```
185191
186192Dies erzeugt einen ähnlichen .po Eintrag wie diesen:
187193
188-`#: lazarusidestrconsts.dlgedcolor`\
189-`msgid "Syntax highlight"`\
190-`msgstr ""`
194+```text
195+#: lazarusidestrconsts.dlgedcolor
196+msgid "Syntax highlight"
197+msgstr ""
198+```
191199
192200der in der spanischen Übersetzung resultiert in
193201
194-`#: lazarusidestrconsts.dlgedcolor`\
195-`msgid "Syntax highlight"`\
196-`msgstr "Color"`
202+```text
203+#: lazarusidestrconsts.dlgedcolor
204+msgid "Syntax highlight"
205+msgstr "Color"
206+```
197207
198208Angenommen, dass zu einem späteren Zeitpunkt der Ressourcenstring geändert würde in
199209
200210``` pascal
201211 dlgEdColor = 'Colors';
202212```
203213
204214dann ändert sich auch der .po Eintrag in
205215
206-`#: lazarusidestrconsts.dlgedcolor`\
207-`msgid "Colors"`\
208-`msgstr ""`
216+```text
217+#: lazarusidestrconsts.dlgedcolor
218+msgid "Colors"
219+msgstr ""
220+```
209221
210222Beachten Sie, dass zwar die ID 'lazarusidestrconsts.dlgedcolor' gleich geblieben ist, sich aber der String geändert hat, von 'Syntax highlight' zu 'Colors'. Weil der String bereits übersetzt war, könnte die alte Übersetzung nicht zu der neuen Bedeutung passen. Und wirklich, für unseren neuen String wäre im Spanischen wahrscheinlich 'Colores' die bessere Übersetzung. Das automatische Aktualisierungwerkzeug erkennt diese Situation und erzeugt einen Eintrag wie diesen:
211223
212-`#: lazarusidestrconsts.dlgedcolor`\
213-`#, fuzzy`\
214-`#| msgid "Syntax highlight"`\
215-`msgctxt "lazarusidestrconsts.dlgedcolor"`\
216-`msgid "Colors"`\
217-`msgstr "Color"`
224+```text
225+#: lazarusidestrconsts.dlgedcolor
226+#, fuzzy
227+#| msgid "Syntax highlight"
228+msgctxt "lazarusidestrconsts.dlgedcolor"
229+msgid "Colors"
230+msgstr "Color"
231+```
218232
219233Im Zusammenhang des .po Dateiformates, bedeutet das "#," Präfix, dass der Eintrag ein Flag (namens 'fuzzy') hat. Ein geeignetes Übersetzungsprogramm könnte dieses Flag auswerten. Der Übersetzer sieht dadurch bei diesem Eintrag sofort, dass die Übersetzung in ihrem derzeitigen Zustand fragwürdig ist und somit einer Überprüfung durch den Übersetzer bedarf.\
220234Das "#\|" Präfix weist darauf hin, dass der vorhergehende String unübersetzt ist und liefert auch einen Hinweis darauf, warum der Eintrag als 'fuzzy' markiert war.
221235
222236## Übersetzung von Formularen, Datenmodulen und Frames
223237
224238Wenn die i18n Einstellung für das Projekt / Package aktiviert ist, dann erzeugt die IDE automatisch .lrt Dateien für jedes Formular. Die .lrt Dateien werden beim Speichern einer Unit erzeugt. Wenn sie die Einstellung zum ersten Mal aktivieren, dann müssen Sie jedes Formular einmal öffnen und eine Änderung vornehmen (damit es als geändert markiert ist) und dann speichern.
225239
226240**Beispiel:** Wenn Sie ein Formular *unit1.pas* speichern, erstellt die IDE die Datei *unit1.lrt*. Beim Kompilieren sammelt die IDE alle Strings aus allen *.lrt* und *.rst* Dateien in einer einzigen *.po* Datei (projektname.po oder paketname.po) in dem i18n Verzeichnis.
227241
228242Damit die Formulare zur Laufzeit tatsächlich übersetzt werden, müssen Sie der Objektvariablen 'LRSTranslator' (definiert in LResources) im Abschnitte initialization einer Ihrer Units ein Translator-Objekt zuweisen
229243
230244``` pascal
231245...
232246uses
233247 ...
234248 LResources;
235249...
236250...
237251initialization
238252 LRSTranslator:=TPoTranslator.Create('/Pfad/zu/der/po/Datei');
239253```
240254
241255Allerdings gibt es derzeit in der LCL keine TPoTranslator - Klasse (das ist eine Klasse, die unter Verwendung von .po Dateien übersetzt). Hier folgt eine mögliche Implementierung (teilweise entlehnt aus DefaultTranslator.pas in der LCL):Der folgende Code wird nicht mehr länger gebraucht, wenn Sie einen aktuellen Lazarus 0.9.29 Snapshot einsetzen. Fügen Sie einfach 'DefaultTranslator' zur Uses-Klausel hinzu.
242256
243257``` pascal
244258unit PoTranslator;
245259
246260{$mode objfpc}{$H+}
247261
248262interface
249263
250264uses
251265 Classes, SysUtils, LResources, typinfo, Translations;
252266
253267type
254268
255269 { TPoTranslator }
256270
257271 TPoTranslator=class(TAbstractTranslator)
258272 private
259273 FPOFile:TPOFile;
260274 public
261275 constructor Create(POFileName:string);
262276 destructor Destroy;override;
263277 procedure TranslateStringProperty(Sender:TObject;
264278 const Instance: TPersistent; PropInfo: PPropInfo; var Content:string);override;
265279 end;
266280
267281implementation
268282
269283{ TPoTranslator }
270284
271285constructor TPoTranslator.Create(POFileName: string);
272286begin
273287 inherited Create;
274288 FPOFile:=TPOFile.Create(POFileName);
275289end;
276290
277291destructor TPoTranslator.Destroy;
278292begin
279293 FPOFile.Free;
280294 inherited Destroy;
281295end;
282296
283297procedure TPoTranslator.TranslateStringProperty(Sender: TObject;
284298 const Instance: TPersistent; PropInfo: PPropInfo; var Content: string);
285299var
286300 s: String;
287301begin
288302 if not Assigned(FPOFile) then exit;
289303 if not Assigned(PropInfo) then exit;
290304{DO we really need this?}
291305 if Instance is TComponent then
292306 if csDesigning in (Instance as TComponent).ComponentState then exit;
293307{End DO :)}
294308 if (AnsiUpperCase(PropInfo^.PropType^.Name)<>'TTRANSLATESTRING') then exit;
295309 s:=FPOFile.Translate(Content, Content);
296310 if s<>'' then Content:=s;
297311end;
298312
299313end.
300314```
301315
302316Alternativ dazu können Sie (mit 'msgfmt') die .po Datei in eine .mo Datei umwandeln und einfach die Unit 'DefaultTranslator' verwenden
303317
304318``` pascal
305319...
306320uses
307321 ...
308322 DefaultTranslator;
309323```
310324
311325Diese sucht automatisch in verschiedenen Standard-Verzeichnissen nach einer .mo Datei (der Nachteil dabei ist, dass Sie beiderlei Dateien behalten müssen, die .mo Dateien für die DefaultTranslator-Unit und die .po Dateienfiles für TranslateUnitResourceStrings). Wenn Sie DefaultTranslator benutzen, wird er automatisch versuchen die Sprache anhand der Umgebungsvariablen LANG zu bestimmen. (Dies kann mit dem Befehlszeilenschalter --lang überschrieben werden). Anschließend wird an folgenden Stellen nach einer Übersetzung gesucht (hier bedeutet LANG die gesuchte Sprache):
312326
313327- \<Application Directory\>/LANG/\<Application Filename\>.mo
314328- \<Application Directory\>/languages/LANG/\<Application Filename\>.mo
315329- \<Application Directory\>/locale/LANG/\<Application Filename\>.mo
316330- \<Application Directory\>/locale/LC_MESSAGES/LANG/\<Application Filename\>.mo
317331
318332unter Unix-ähnliche Betriebssystemen wird auch gesucht in
319333
320334- /usr/share/locale/LANG/LC_MESSAGES/\<Application Filename\>.mo
321335
322336ebenso wird die Kurzform des Sprachbezeichners probiert (wenn z.B. "es_ES" oder "es_ES.UTF-8" nicht existieren wird auch "es" versucht).
323337
324338## Übersetzung beim Start eines Programms
325339
326340Für jede .po Datei müssen sie TranslateUnitResourceStrings aus der LCL Unit Translations aufrufen. Zum Beispiel:
327341
328342``` pascal
329343uses
330344 ..., GetText, Translations;
331345
332346procedure TForm1.FormCreate(Sender: TObject);
333347var
334348 PODirectory, Lang, FallbackLang: String;
335349begin
336350 PODirectory := 'C:\Lazarus\lcl\languages\'; //Pfad entsprechend Installation anpassen !!!
337351 GetLanguageIDs(Lang, FallbackLang);
338352 Translations.TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang);
339353 // ... fügen Sie hier einen Aufruf von TranslateUnitResourceStrings für jede .po-Datei hinzu ...
340354
341355 // der folgende Dialog zeigt übersetzte Buttons:
342356 MessageDlg('Title', 'Text', mtInformation, [mbOk, mbCancel, mbYes], 0);
343357end;
344358```
345359
346360## .po Dateien in die Programmdatei kompilieren
347361
348362Wenn Sie die einzelnen .po Dateien nicht zusammen mit Ihrer Anwendung installieren, sondern mit in die Programmdatei packen wollen, gehen Sie wie folgt vor:
349363
350364- Erzeugen Sie eine neue Unit (kein Formular!).
351365- Konvertieren Sie die .po Datei(en) in .lrs unter Verwendung von tools/lazres:
352366
353367 ./lazres unit1.lrs unit1.de.po
354368
355369Dadurch wird eine Include-Datei unit1.lrs erstellt, die folgendermaßen beginnt
356370
357371``` pascal
358372LazarusResources.Add('unit1.de','PO',[
359373 ...
360374```
361375
362376- Fügen Sie den Code hinzu:
363377
364378``` pascal
365379uses LResources, Translations;
366380
367381resourcestring
368382 MyCaption = 'Caption';
369383
370384function TranslateUnitResourceStrings: boolean;
371385var
372386 r: TLResource;
373387 POFile: TPOFile;
374388begin
375389 r:=LazarusResources.Find('unit1.de','PO');
376390 POFile:=TPOFile.Create(False); //if Full=True then you can get a crash (Issue #0026021)
377391 try
378392 POFile.ReadPOText(r.Value);
379393 Result:=Translations.TranslateUnitResourceStrings('unit1',POFile);
380394 finally
381395 POFile.Free;
382396 end;
383397end;
384398
385399initialization
386400 {$I unit1.lrs}
387401```
388402
389403- Rufen Sie TranslateUnitResourceStrings am Beginn des Programms auf. Wenn Sie wollen, können Sie das im Abschnitt "initialization" machen.
390404
391405Leider wird dieser Code mit Lazarus 1.2.2 und früher nicht kompiliert, für diese Lazarusversionen können Sie wie folgt verfahren:
392406
393407``` pascal
394408type
395409 TTranslateFromResourceResult = (trSuccess, trResourceNotFound, trTranslationError);
396410
397411function TranslateFromResource(AResourceName, ALanguage : String): TTranslateFromResourceResult;
398412var
399413 LRes : TLResource;
400414 POFile : TPOFile = nil;
401415 SStream : TStringStream = nil;
402416begin
403417 Result := trResourceNotFound;
404418 LRes := LazarusResources.Find(AResourceName + '.' + ALanguage, 'PO');
405419 if LRes <> nil then
406420 try
407421 SStream := TStringStream.Create(LRes.Value);
408422 POFile := TPoFile.Create(SStream, False);
409423 try
410424 if TranslateUnitResourceStrings(AResourceName, POFile) then Result := trSuccess
411425 else Result := trTranslationError;
412426 except
413427 Result := trTranslationError;
414428 end;
415429 finally
416430 if Assigned(SStream) then SStream.Free;
417431 if Assigned(POFile) then POFile.Free;
418432 end;
419433end;
420434```
421435
422436Anwendungsbeispiel:
423437
424438``` pascal
425439initialization
426440 {$I lclstrconsts.de.lrs}
427441 TranslateFromResource('lclstrconsts', 'de');
428442end.
429443```
430444
431445## Cross-Plattform-Methode, um Systemsprache festzustellen
432446
433447Die folgende Funktion liefert einen String, der die Sprache der Benutzeroberfläche darstellt. Sie unterstützt Linux, Mac OS X und Windows.
434448
435449``` pascal
436450uses
437451 Classes, SysUtils {fügen Sie zusätzliche Units, die von Ihrem Code genutzt werden hier ein}
438452 {$IFDEF win32}
439453 , Windows
440454 {$ELSE}
441455 , Unix
442456 {$IFDEF LCLCarbon}
443457 , MacOSAll
444458 {$ENDIF}
445459 {$ENDIF}
446460 ;
447461```
448462
449463``` pascal
450464function GetOSLanguage: string;
451465{Plattform-unabhängige Verfahren, um die Sprache der Bedienoberfläche zu lesen}
452466var
453467 l, fbl: string;
454468 {$IFDEF LCLCarbon}
455469 theLocaleRef: CFLocaleRef;
456470 locale: CFStringRef;
457471 buffer: StringPtr;
458472 bufferSize: CFIndex;
459473 encoding: CFStringEncoding;
460474 success: boolean;
461475 {$ENDIF}
462476begin
463477 {$IFDEF LCLCarbon}
464478 theLocaleRef := CFLocaleCopyCurrent;
465479 locale := CFLocaleGetIdentifier(theLocaleRef);
466480 encoding := 0;
467481 bufferSize := 256;
468482 buffer := new(StringPtr);
469483 success := CFStringGetPascalString(locale, buffer, bufferSize, encoding);
470484 if success then
471485 l := string(buffer^)
472486 else
473487 l := '';
474488 fbl := Copy(l, 1, 2);
475489 dispose(buffer);
476490 {$ELSE}
477491 {$IFDEF LINUX}
478492 fbl := Copy(GetEnvironmentVariable('LC_CTYPE'), 1, 2);
479493 {$ELSE}
480494 GetLanguageIDs(l, fbl);
481495 {$ENDIF}
482496 {$ENDIF}
483497 Result := fbl;
484498end;
485499```
486500
487501## Übersetzen der IDE
488502
489503### Dateien
490504
491505Die .po Dateien der IDE befinden sich im Lazarus-Verzeichnis:
492506
493507- lazarus/languages/: Zeichenketten für die IDE
494508- lcl/languages/: Zeichenketten für die LCL
495509- ideintf/languages/: Zeichenketten für das IDE Interface
496510
497511### Übersetzer
498512
499513- Die deutsche Übersetzung wird von Jörg Braun gepflegt.
500514- Die finnische Übersetzung wird von Seppo Suurtarla gepflegt.
501515- Die russische Übersetzung wird von Maxim Ganetsky gepflegt.
502516
503517Bevor Sie mit einer neuen Übersetzung beginnen, fragen Sie besser auf der Mailing-Liste, ob schon jemand daran arbeitet.
504518
505519Bitte lesen Sie sorgfältig: [[Lazarus Documentation/de|Übersetzungen]]
506520
507521## Siehe auch
508522
509523- [[IDE Development|IDE Development: Translations, i18n, lrt, po files]]
510524- [[Getting translation strings right]]
511525- [[Lazarus Documentation|Translating/Internationalization/Localization]]
512526- [[German localization notes]]
513527
514528---
515529*From the Free Pascal wiki, page "Translations / i18n / localizations for programs/de", as it stood on 2020-03-01 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history