Fallstricke

Es gibt einige typische Fehler, denen Sie möglicherweise auch selbst begegnen werden. Dieser Abschnitt könnte Ihnen dabei helfen, dies zu vermeiden.

25.4.1. Gleiche Zeichenketten, unterschiedliche Semantik

Sometimes two English strings are identical but have different meanings in different contexts, so they would probably not be identical when translated. Since the English strings are used as look-up keys, this causes problems.

In these cases, you should add extra characters to the strings. For instance, use "jumps[noun]" and "jumps[verb]" instead of just "jumps" and strip them again outside the gettext call. If you add extra characters you should also add a comment for the translators before the gettext call. Such comments will be shown in the .po files. For instance:

// note to translators: don't translate the "[noun]" part - it is
// just here to distinguish the string from another "jumps" string
text = strip(gettext("jumps[noun]"), "[noun]");

If you use Glib's support macros, it's easier. Use C_() instead of _(). For instance:

GLib::ustring text(C_("noun", "jumps"));

25.4.2. Zusammenstellung der Zeichenketten

C-Programmierer nutzen die Funktion sprintf() zum Erstellen und Verketten von Strings. C++ favorisiert Streams, aber leider erschwert dieser Ansatz die Übersetzungen, da jedes Textfragment separat übersetzt wird und Übersetzer keine Möglichkeiten haben, die Fragmente neu anzuordnen, um der Grammatik ihrer Sprache gerecht zu werden.

Folgendes könnte beispielsweise problematisch sein:

std::cout << _("Current amount: ") << amount
          << _(" Future: ") << future << std::endl;

label.set_text(_("Really delete ") + filename + _(" now?"));

So you should either avoid this situation or use Glib::ustring::compose() which supports syntax such as:

std::cout << Glib::ustring::compose(
             _("Current amount: %1 Future: %2"), amount, future) << std::endl;

label.set_text(Glib::ustring::compose(_("Really delete %1 now?"), filename));

25.4.3. Einschätzen der Anzeigegröße von Zeichenketten

Sie wissen nie, wie viel Platz ein String auf dem Bildschirm einnimmt, wenn er erst einmal übersetzt ist. Es kann durchaus die doppelte Größe der englischen Originalversion sein. Glücklicherweise expandiert gtkmm die Widgets zur Laufzeit auf die erforderliche Größe.

25.4.4. Unübliche Wörter

Sie sollten kryptische Abkürzungen, Slang oder Jargon vermeiden. So etwas ist recht schwierig zu übersetzen und oft selbst für Muttersprachler nur schwer verständlich. Beispielsweise sollten Sie »application« gegenüber »app« bevorzugen.

25.4.5. Verwendubg von Nicht-ASCII-Zeichen in Zeichenketten

Gegenwärtig unterstützt gettext keine Nicht-ASCII-Zeichen im Quellcode (also Zeichen mit einem Code über 127). Zum Beispiel können Sie kein Copyright-Zeichen verwenden (©).

To work around this, you could write a comment in the source code just before the string, telling the translators to use the special character if it is available in their languages. For English, you could then make an American English en_US.po translation which used that special character.