Sign in Join
Wiki copytemporary

Getting translation strings right/de: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Diese Seite enthält einige grundlegende Bemerkungen darüber, **wie man Übersetzungstrings richtig hinbekommt** vom Anfang an und aus der Sichtweise eines Originalautors (d.h. zumeist eines Programmierers).
22
33"Richtig hinbekommen" (To get it right) bedeutet in diesem Zusammenhang, dass die Übersetzungsstrings für eine leichtere nachfolgende Übersetzung richtig vorbereitet wurden, und dass die Originalversion an die grundlegenden Erfordernisse für ihren Einsatz angepasst wurde.
44
55Obwohl hier versucht wurde, so sprachneutral wie möglich zu bleiben, besteht de facto eine leichte Einseitigkeit zugunsten des Englischen. Es liegt in Ihrem Ermessen, Richtlinien zu erweitern oder diejenigen zu verwerfen, die nicht auf Ihre Situation passen. (Oder vielleicht fügen Sie sie auch an diese Seite an?)
66
77### Allgemeines
88
99Um Probleme zu vermeiden, stellen Sie einfach sicher, dass zuallererst **die Originalstrings in Ordnung sind** - dafür gibt es einige Gründe:
1010
1111- Die Originalstrings dienen normalerweise als Vorgabeübersetzung, und hinterlassen einen schlechten Eindruck für den Endbenutzer, der ungewollt die unübersetzten Vorgabestrings sieht.
1212- Auch erschweren schlechte Originalstrings dem Übersetzer die Arbeit unnötig. Dieser ist ja für die Übertragung der ursprünglichen Informationen in eine andere Sprache verantwortlich. Erinnern Sie sich einfach an das Prinzip "Wo Müll hinein kommt, kommt auch nur Müll heraus", das hier perfekt zutrifft.
1313
1414Versuchen Sie deshalb, sicher zu stellen, dass **die Schreibweise korrekt ist** - nehmen Sie ein Wörterbuch zur Hand, wenn Sie sich unsicher sind (z.B. [1](http://www.pons.de/)).
1515
1616Benutzen Sie verständliche und bekannte Phrasen für die Situation, die Sie beschreiben möchten, in einer **einheitlichen** Weise. Falls Sie unsicher sind, ob etwas geläufig ist, schauen Sie sich ähnliche Programme an und betrachten Sie deren Ausgaben. Auch die Literatur und Hilfedateien sind oft eine gute Quelle für die genauen Fachbegriffe oder -ausdrücke, oder Fragen des Stils. Bleiben Sie auch in der Auswahl der Phrasen einheitlich. Beispielsweise haben die Fragen
1717
18-`Delete the file? (Datei löschen?)`\
19-`Erase the file? (Datei beseitigen?)`\
20-`Remove the file? (Datei entfernen?)`\
21-`Wipe the file? (Datei säubern?)`\
22-`Zap the file? (Datei vernichten?)`
18+```text
19+Delete the file? (Datei löschen?)
20+Erase the file? (Datei beseitigen?)
21+Remove the file? (Datei entfernen?)
22+Wipe the file? (Datei säubern?)
23+Zap the file? (Datei vernichten?)
24+```
2325
2426alle fast die selbe Bedeutung. Wenn man sie aber - ohne ersichtlichen Grund - wahlweise einsetzt, interpretiert manch ein Leser verrückte Dinge hinein. Besonders anfällig für diesen Fehler sind Übersetzer, weil sie oft den genauen Kontext einer bestimmten Nachricht nicht kennen (z.B. Informationen über den Ursprung der Nachricht). Sie könnten einfache Wortvariationen als Hinweis auf bedeutende Unterschiede interpretieren, und geraten in Versuchung, unübliche (schlechte) Übersetzungen zu wählen.
2527
2628Besonders bei Fehlermeldungen an den Benutzer gilt: Beschreiben Sie **das Problem selbst** in passenden Worten. Das ist niemals der Zustand des Programms, der zur Fehlermeldung führte. Dieser ist nur für die Person nützlich, die den Fehler im Programm beseitigen soll, nicht für den Benutzer. Benutzer werden entweder einfach mit den Schultern zucken und den Fehler bestenfalls ignorieren. Oder aber sie wechseln im schlechtesten Fall zu einem anderen Programm, weil sie ohne eine genaue Problembeschreibung nicht das Problem lösen und mit ihrer Arbeit fortfahren können. All das nur, weil das Programm keine brauchbare Problembeschreibung lieferte.
2729
2830Nehmen Sie (leicht) **verständliche Beschreibungen**. Versuchen Sie nicht, Ihre Kunden mit Fremdwörtern oder technischen Begriffen zu beeindrucken, nur um ihnen zu sagen, dass ihre Arbeit nicht gespeichert werden konnte.
2931
3032Vermeiden Sie mehrfache Verneinungen innerhalb eines einzelnen Satzes. Diese sind fast immer schwerer zu lesen als ihre nicht-negierten Gegenstücke. Ein Beispiel wäre
3133
32-`Diese Komponente kann auf Non-TControls nicht abgelegt werden.`
34+```text
35+Diese Komponente kann auf Non-TControls nicht abgelegt werden.
36+```
3337
3438Hingegen ist die nicht-negierte Formulierung
3539
36-`Diese Komponente kann nur auf TControls abgelegt werden.`
40+```text
41+Diese Komponente kann nur auf TControls abgelegt werden.
42+```
3743
3844sicher leichter zu lesen und zu verstehen.
3945
4046### Technische Fragen
4147
4248In diesem Abschnitt erhalten Sie einen kurzen Überblick über technische Fragen, eigentlich einen Überblick über die grundlegenden Möglichkeiten. Diese umfassen das Konstrukt 'resourcestring', GNU gettext() und die Funktion 'format()'.
4349
4450#### Ressourcenstrings und GNU gettext
4551
4652Free Pascal hat einige eingebaute Sprachkonstrukte für die Behandlung konstanter Zeichenketten. Es gibt einen Abschnitt einer Unit namens "resourcestring", die speziell für diesen Zweck eingeführt wurde. Siehe auch den entsprechenden Abschnitt des FPC-Handbuchs (prog.pdf, S. 89ff oder [hier](http://www.freepascal.org/docs-html/prog/progch9.html#x184-1870009)) für die Details.
4753
4854GNU gettext ist ein spezieller Satz von Werkzeugen, um Übersetzungen für Ihre Programme zu liefern. Siehe ebenfalls im FPC-Handbuch (prog.pdf, S. 91ff oder [hier](http://www.freepascal.org/docs-html/prog/progse41.html#x210-2130009.4)).
4955
5056Anmerkung: GNU gettext hat eine konzeptuelle Macke, die es nicht erlaubt, einen einzelnen Originalstring an mehrere übersetzte Strings zuzuweisen, also Achtung.
5157
5258#### Ressourcenstrings in der IDE
5359
5460- Lazarus hat ein Werkzeug, um einfach aus Stringkonstanten Ressourcenstrings zu erzeugen. Siehe [[IDE Window: Make ResourceString/de|Ressourcenstrings erzeugen]]
5561
5662- Für jeden Ressourcenstring-Abschnitt erzeugt FPC eine .rst-Datei, aber es gibt keinen Editor für diese Dateien. Lazarus kann automatisch .po-Dateien aus den .rst-Dateien erzeugen. Es gibt eine Vielzahl von Werkzeugen zum Bearbeiten von .po-Dateien (z.B. kbabel unter Linux, PoEdit unter Windows).
5763
5864Um die Erzeugung der .po-Dateien für ein Package zu aktivieren, beachten Sie folgende Schritte:
5965
60-` * Erstellen Sie ein Unterverzeichnis namens 'languages' (oder 'locale', oder sonstwie).`\
61-` * Öffnen Sie das Package. Stellen Sie unter Einstellungen -> IDE Integration -> Verzeichnis der .po-Dateien das Verzeichnis `*`languages`*` ein.`
66+```text
67+ * Erstellen Sie ein Unterverzeichnis namens 'languages' (oder 'locale', oder sonstwie).
68+ * Öffnen Sie das Package. Stellen Sie unter Einstellungen -> IDE Integration -> Verzeichnis der .po-Dateien das Verzeichnis languages ein.
69+```
6270
6371Wenn Sie das nächste Mal das Package kompilieren, erzeugt die IDE die .po-Dateien. Anmerkung: Die .rst-Dateien müssen zu den Package-Units gehören. Andernfalls ignoriert die IDE die fremden .rst-Dateien.
6472
6573Das funktioniert auch bei Projekten. Das Verzeichnis wird unter Projekt -\> Projekteinstellungen -\> IDE Integration -\> Verzeichnis der .po-Dateien.
6674
6775- Um eine deutsche Übersetzung zu erzeugen: kopieren Sie die Datei 'unit1.po' nach 'unit1.de.po'. Verwenden Sie dann einen Texteditor oder einen .po-Editor, um alle Zeichenketten zu übersetzen.
6876
6977- Die IDE lädt automatisch die .po-Dateien für installierte Packages, falls sie existieren. Für Beispiele siehe: lazarus/components/projecttemplates/languages/.
7078
7179- ToDo: Implementierung und Dokumentation über das Aktualisieren der übersetzten .po-Dateien, wenn neue Ressourcenstrings angefügt werden.
7280
7381- ToDo: Implementierung und Dokumentation über das Einsammeln aller .po-Dateien von statisch gelinkten Packages.
7482
7583#### Ressourcenstrings in Ihrer Anwendung
7684
7785Sie können die .po-Dateien bei der Initialisierung laden, um die Ressourcenstrings zu übersetzen. Fügen Sie dies Ihrer .lpr-Datei hinzu:
7886
7987``` pascal
8088...
8189uses
8290 ...
8391 Translations, LazUTF8;
8492
8593procedure TranslateLCL;
8694var
8795 PODirectory, Lang, FallbackLang: String;
8896begin
8997 PODirectory:='/path/to/lazarus/lcl/languages/';
9098 Lang:='';
9199 FallbackLang:='';
92100 LazGetLanguageIDs(Lang,FallbackLang); // in der Unit LazUTF8
93101 Translations.TranslateUnitResourceStrings('LCLStrConsts',
94102 PODirectory+'lclstrconsts.%s.po',Lang,FallbackLang);
95103 // ... fügen Sie hier einen Aufruf von TranslateUnitResourceStrings für jede .po-Datei hinzu ...
96104end;
97105
98106begin
99107 TranslateLCL;
100108 Application.Initialize;
101109 Application.CreateForm(TForm1, Form1);
102110 Application.Run;
103111end.
104112```
105113
106114Anmerkung für Mac OS X: Die IDs der unterstützten Sprachen sollten in der Eigenschaftenliste des Anwendungspakets zum Schlüssel CFBundleLocalizations hinzugefügt werden, für ein Beispiel siehe lazarus.app/Contents/Info.plist.
107115
108116#### Die Funktion format()
109117
110118Um in Übersetzungen nicht nur völlig statische Zeichenketten einzusetzen, können Sie auch die Methode [[doc:rtl/sysutils/format.html|format()]] aus der Unit 'sysutils' verwenden. Mit ihr können Sie Platzhalter innerhalb eines vorgegebenen Texts durch deren tatsächlichen Wert ersetzen, der als zweiter Parameter in einer Menge gegeben ist. Beispiel:
111119
112-`format('Morgen am %0:s wird es %1:s geben.', ['Sonntag', 'Sonnenschein']);`
120+```text
121+format('Morgen am %0:s wird es %1:s geben.', ['Sonntag', 'Sonnenschein']);
122+```
113123
114124liefert
115125
116-`Morgen am Sonntag wird es Sonnenschein geben.`
126+```text
127+Morgen am Sonntag wird es Sonnenschein geben.
128+```
117129
118130In diesem Fall steht %0:s als Platzhalter für das erste Argument (mit dem Index 0) aus der Wertemenge (Sonntag), und entsprechend %1:s für das zweite. Für eine exakte Definition der erlaubten Platzhalter und ihre Syntax siehe das FPC-Referenz-Handbuch.
119131
120132Einige Richtlinien für den Gebrauch der Funktion format()
121133
122134- Verwenden Sie indizierte Platzhalter in den Originalstrings, auch wenn diese optional sind. Dies gestattet dem Übersetzer, die Argumente einfach innerhalb des Satzes zu verschieben und erlaubt somit natürlichere Ausdrücke. Und manchmal ist das Verschieben von Satzteilen auch tatsächlich erforderlich, um in dieser Sprache richtige Sätze bilden zu können.
123135
124136- Stellen Sie niemals einen Satz aus mehr als einem String zusammen. Nehmen Sie immer die Methode format() aus der Unit 'sysutils', um während der Laufzeit den richtigen String mittels Platzhaltern zu konstruieren. Ein Übersetzer würde normalerweise den ganzen Satz gar nicht rekonstruieren können, deshalb gäbe es auch keine gute Übersetzung; bedenken Sie nur einmal, dass oft Hunderte von solchen Strings in einer einzelnen Übersetzungsdatenbank vorkommen...
125137
126138- Verwenden Sie zum Formatieren keine Leerzeichen. Bewegen Sie als erstes einfach Ihr Label an die passende Position. Es ergeben sich sonst Probleme beim Wechseln der Schriftart, und scheinbar überflüssige Leerzeichen laufen Gefahr, vom Übersetzer weggeputzt zu werden.
127139
128140~~Anmerkung: Da format() bestimmte Steuerzeichen (z.B. wie C's "\n", "\t", u.s.w.) nicht versteht und GNU gettext aus bestimmten Gründen das gewählte Übersetzungssystem (und die darauf basierenden Werkzeuge nicht fähig sind, solche Steuerzeichen zu interpretieren), ist es erforderlich, die Zeilenvorschübe programmatisch einzufügen.~~In der aktuellen Version von Lazarus werden "\n" und "\t" in übersetzten Zeichenketten durch newline und tab ersetzt.
129141
130142#### Konvertierung der Übersetzung in den richtigen Zeichensatz
131143
132144Zum Beispiel: wandeln Sie eine Datei von ISO-8859-1 zu UTF-8 um:
133145
134-` iconv --from-code=ISO-8859-1 --to-code=UTF-8 oldfile.po > newfile.po`
146+```text
147+ iconv --from-code=ISO-8859-1 --to-code=UTF-8 oldfile.po > newfile.po
148+```
135149
136150Vergessen Sie nicht die Zeile
137151
138-` "Content-Type: text/plain; charset=ISO-8859-1\n"`
152+``` pascal
153+ "Content-Type: text/plain; charset=ISO-8859-1\n"
154+```
139155
140156zu ändern in
141157
142-` "Content-Type: text/plain; charset=UTF8\n"`
158+``` pascal
159+ "Content-Type: text/plain; charset=UTF8\n"
160+```
143161
144162### Aufs Englische bezogen
145163
146164Dieser Abschnitt enthält Anmerkungen, die besonders dann Berechtigung haben, wenn Sie Englisch als Ausgangssprache für Übersetzungen benutzen.
147165
148166- Reservieren Sie dort, wo der Text ausgegeben wird, genug Platz: Englisch ist eine Sprache in der die Texte fast immer kürzer sind (was die Zeichenanzahl betrifft) als in den jeweiligen Übersetzungen. Planen Sie also voraus und reservieren Sie ausreichend Platz. Die Erfahrung zeigt, dass sehr kurze Strings, die nur wenige Zeichen lang sind, sich im Umfang ungefähr verdoppeln; dieser Unterschied nimmt ab, wenn die Zeichenketten länger sind.
149167
150168- Vermeiden Sie im Englischen Abkürzungen; neben der Tatsache, dass dadurch schon recht kurze Strings noch weiter gekürzt werden, entstehen auch ernste Probleme z.B. in Sprachen mit ideographischen Zeichen, wo diese Abkürzungen einfach überhaupt nicht existieren.
151169
152170- Weil dies oft ein Problem darstellt: Im Englischen sind Satzzeichen (Punkt, Komma, ...) ein Teil des vorherigen Wortes, oder bilden selbst eine Art Wort falls es kein vorhergehendes Wort gibt (im Fall einer Aufzählung). Besonders nach einem Strichpunkt sollte immer ein Leerzeichen folgen.
153171
154-`There was an error ! Please check file settings , compiler settings,... to fix this issue.`
172+```text
173+There was an error ! Please check file settings , compiler settings,... to fix this issue.
174+```
155175
156176hat eine entsetzliche Interpunktion, sieht deshalb einfach schlecht aus und ist schwerer zu lesen als gewohnt. Bedenken Sie auch, dass übliche Algorithmen zum Zeilenumbruch die Zeilen an den Leerzeichen aufteilen, das würde in einem einzelnen Punkt am Zeilenanfang resultieren.
157177
158-`There was an error! Please check file settings, compiler settings, ... to fix this issue.`
178+```text
179+There was an error! Please check file settings, compiler settings, ... to fix this issue.
180+```
159181
160182wäre wahrscheinlich in Ordnung aus der Sicht der Interpunktion.
161183
162184### Siehe Auch
163185
164186- [[Translations / i18n / localizations for programs/de|Translations / i18n / localizations for programs]]
165187- [[Lazarus Documentation/de|Lazarus Documentation - Übersetzung/Internationalisierung]]
166188- [[Step-by-step instructions for creating multi-language applications]]
167189
168190---
169191*From the Free Pascal wiki, page "Getting translation strings right/de", as it stood on 2020-02-16 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