Development/Tutorials/Localization/i18n Mistakes (de): Difference between revisions
Neverendingo (talk | contribs) m (Text replace - "<code cppqt>" to "<syntaxhighlight lang="cpp-qt">") |
Neverendingo (talk | contribs) m (Text replace - "</code>" to "</syntaxhighlight>") |
||
Line 30: | Line 30: | ||
QString msg=i18n("Do you want to replace ") + | QString msg=i18n("Do you want to replace ") + | ||
oldFile+i18n(" with ") + | oldFile+i18n(" with ") + | ||
newFile + "?"</ | newFile + "?"</syntaxhighlight> | ||
Solche "Wort Puzzle" sind sehr schwer oder überhaupt nicht zu übersetzen. Das liegt daran, dass die Struktur eines Satzes in anderen Sprachen komplett anders sein kann und daher vom Übersetzer kontrolliert werden muss. Wenn die Reihenfolge der Worte und Satzteile wie oben festkodiert ist, kann der Übersetzer keine entsprechende Übersetzung erzeugen. | Solche "Wort Puzzle" sind sehr schwer oder überhaupt nicht zu übersetzen. Das liegt daran, dass die Struktur eines Satzes in anderen Sprachen komplett anders sein kann und daher vom Übersetzer kontrolliert werden muss. Wenn die Reihenfolge der Worte und Satzteile wie oben festkodiert ist, kann der Übersetzer keine entsprechende Übersetzung erzeugen. | ||
Line 42: | Line 42: | ||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
QString msg = i18n("Do you want to replace %1 with %2?", | QString msg = i18n("Do you want to replace %1 with %2?", | ||
oldFile, newFile)</ | oldFile, newFile)</syntaxhighlight> | ||
{{note (de)|Vermeiden Sie es etwas anderes als Zahlen oder Nomen mit dieser Methode einzufügen, da in einigen Sprachen die Übersetzung von den eingefügten Worten abhängt. Daher sollten möglichst komplette Sätze erzeugt werden.}} | {{note (de)|Vermeiden Sie es etwas anderes als Zahlen oder Nomen mit dieser Methode einzufügen, da in einigen Sprachen die Übersetzung von den eingefügten Worten abhängt. Daher sollten möglichst komplette Sätze erzeugt werden.}} |
Revision as of 20:53, 29 June 2011
Development/Tutorials/Localization/i18n Mistakes
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
Anleitungsserie | Lokalisation |
Voriges Kapitel | Beim Schreiben der Applikation an die Lokalisation denken |
Nächstes Kapitel | i18n in das Build System einbinden |
Weiterführende Texte | n/a |
Navigation | Deutsche Startseite |
Zusammenfassung
Es gibt ein paar häufige Fehler, die es unmöglich machen, eine Applikation angemessen zu übersetzen oder anderweitig zu lokalisieren. Das beinhaltet Pixel basierte Layouts, "Wort Puzzles" und Code, der Unicode Zeichen nicht adäquat behandelt. Diese Anleitung beschäftigt sich mit diesen Fällen und erklärt wie man sie verhindert.
Falle #1: Pixel basierte Layouts
Englischer Text ist verglichen mit anderen Sprachen häufig sehr kompakt, der übersetze Text kann oft deutlich länger sein. Daher muß die Benutzerschnittstelle in der Lage sein, die Größe aufgrund der Länge der Übersetzung zur Laufzeit anzupassen. Kann sie das nicht, wird Text falsch angeordnet und/oder abgeschnitten.
Die Antwort darauf ist die Benutzung von Layoutmanagern. Qt bietet eine Anzahl von solchen Managern wie geschaffen für diesen Zweck. Darunter sind QHBoxLayout, QVBoxLayout, QGridLayout und QStackedLayout, alles Unterklassen von QLayout. Sie können auch eigene Klassen abgeleitet von QLayout erzeugen, das ist aber in der Regel nicht nötig.
Diese Layoutklassen kümmern sich um die Positionierung von Widgets zur Laufzeit, so macht es keinen Unterschied wie lang die übersetzten Zeichenketten sind. Die Benutzerschnittstelle passt sich entsprechend an. Für mehr Informationen siehe auch QLayout (in englisch).
Falle #2: Wort Puzzles
Eine andere Sache ist es, zu beachten, nicht mehrere Teilsätze wie folgt zu verknüpfen:
QString msg=i18n("Do you want to replace ") +
oldFile+i18n(" with ") +
newFile + "?"
Solche "Wort Puzzle" sind sehr schwer oder überhaupt nicht zu übersetzen. Das liegt daran, dass die Struktur eines Satzes in anderen Sprachen komplett anders sein kann und daher vom Übersetzer kontrolliert werden muss. Wenn die Reihenfolge der Worte und Satzteile wie oben festkodiert ist, kann der Übersetzer keine entsprechende Übersetzung erzeugen.
Zusätzlich zu diesem Problem erhhält der Übersetzung nur Teile des Satzes während der Übersetzung und muss daher raten, was zusammengehört.
Die Lösung ist denkbar einfach: Benutzen Sie %number Platzhalterersetzungen, die dem Übersetzer nicht nur gute Übersetzungen aufgrund der Möglichkeit den ganzen Satz zu sehen ermöglichen, sondern es ihm oder ihr auch erlaubt auch die Reihenfolge der Argumente frei zu ändern. Die Argumente selber werden als Extraparameter an i18n() übergeben.
Das obige Beispiel sollte daher korrekterweise folgendermaßen aussehen:
QString msg = i18n("Do you want to replace %1 with %2?",
oldFile, newFile)
Ein ähnlicher Fehler ist es, im zu übersetzenden Text keine Markup Tags wie <b></b> or <i></i> als Rich Text einzufügen. Nicht alle Sprachen benutzen solche Markups in gleicher Weise wie im Englischen, so es kann für den Übersetzer notwendig sein, diese ebenfalls zu "übersetzen".
Weiterhin sollten Zeichenketten, die häufig ändernde Zeichenketten enthalten (wie zum Beispiel Versionen) statt dessen als Platzhalter (siehe oben) eingefügt werden. Das verhindert unnötige Änderungen an den Zeichenketten, die die Übersetzer zwingen, die Übersetzungen zu überarbeiten.
Da KDE in mehr als 65 Sprachen übersetzt wird, kann die Änderung einer einzelenen Zeichenkette mindesten 65 Personen dazu zwingen, die Datei zu öffnen, die geänderte Zeichenkette zu finden, sorgfältig sicherzustellen, dass das wirklich das einzige ist, was sich geändert hat, die Neuübersetzung vorzunehemen, die Datei zu speichern und die geänderte Datei in das Repository hochzuladen. Alles in allem kann so eine kleine Änderung Stunden von Arbeit erzeugen, die einfach vermieden werden könnte.
Falle #3: Fehlende Unicode Unterstützung
Immer dann wenn im Quellcode Datentypen oder Klassen für Zeichenketten benutzt werden, die kein Unicode unterstützen (z.B. char oder std::string), ist eine Übersetzung nicht mehr möglich.
Um das zu vermeiden, rufen Sie niemals QString::latin1() oder QString::ascii() für übersetze Zeichenketten auf. Das gilt auch für Informationen, die Sie von Benutzereingaben wie Passworten, URLs und Dateinamen erhalten. Benötigen Sie wirklich eine einfache char* Darstellung einer Zeichenkette benutzen Sie lieber QString::utf8().
KIO slaves können Pfade und Dateinamen in UTF-8 codiert zur Verfügung stellen. Es liegt jedoch am Programmierer, entsprechend codierte Dateinamen an KIO Methoden zu übergeben. Der richtige Weg das zu tun, ist nicht zu raten, welches Codierungssystem das Dateisystem des Benutzers hat sondern statt dessen die Methoden QFile::encodeName() und QFile::decodeName() zu benutzen.
Geschafft!
Wenn Sie diese drei häufigen Fehler verhindern, so wie es in dieser Anleitung beschrieben ist, wird Ihre Applikation von den verschiedenen KDE Übersetzerteams vollständig lokalisierbar sein und Ihre Applikation der Mehrheit der Menschheit zugänglich machen.