Úskalí

Existuje několik běžných omylů, na které byste si jistě přišli sami. Tato kapitola vám pomůže se jim vyhnout.

25.4.1. Stejné řetězce, jiný význam

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.

V takovémto případě byste měli přidat do řetězce nějaké další znaky. Například použít "jumps[noun]" a "jumps[verb]" místo prostého "jumps" a po zavolání funkce gettext je odříznout. Když něco takového provedete, měli byste také přidat komentář pro překladatele před volání gettext. Tyto komentáře se objeví v souborech .po. Například:

// 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. Skládání řetězců

Programátoři v jazyce C používají pro skládání a spojování řetězců funkci sprintf(). V C++ dávají přednost datovým proudům, což ale bohužel znesnadňuje překlady, protože jednotlivé útržky textu se překládají samostatně a nedává to překladateli možnost je přeuspořádat podle pravidel gramatiky jeho jazyka.

Například takovýto kód by mohl přinést problémy:

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. Počítejte s dostatečnou šířkou pro zobrazení řetězců

Nemůžete dopředu vědět, kolik místa na obrazovce řetězec zabere po překladu. Je klidně možné, že bude dvakrát delší, než anglický originál. Naštěstí se většina widgetů gtkmm za běhu roztáhne na velikost, která se po nich chce.

25.4.4. Neobvyklá slova

Měli byste se vyhnout tajuplným zkratkám, slangu a nářečím. Většinou bývá nesnadné je přeložit a někdy jim nerozumí ani rodilý mluvčí. Například raději používejte „application“ než „app“.

25.4.5. Používání jiných znaků než ASCII v řetězcích

V současnosti gettext nepodporuje jiné znaky než ASCII (tj. znaky s kódem vyšším než 127) ve zdrojovém kódu. Například nemůžete použít znak copyright (©).

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.