Fallgropar

Det finns några vanliga misstag som du så småningom skulle upptäcka själv. Men det här avsnittet kanske hjälper dig undvika dem.

Same strings, different semantics

Ibland är två strängar på engelska identiska men har olika betydelse i olika kontexter, så de skulle troligen inte vara identiska då de översätts. Då de engelska strängarna används som nycklar för uppslagning så orsakar detta problem.

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]");

Om du använder Glibs stödmakron är det enklare. Använd C_() i stället för _(). Till exempel:

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

Sammansättning av strängar

C-programmerare använder sprintf() för att komponera och konkatenera strängar. C++ föredrar strömmar, men detta angreppssätt gör tyvärr översättning svår, för varje textfragment översätts separat utan att låta översättarna arrangera om dem enligt språkets grammatik.

Exempelvis skulle denna kod vara problematisk:

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));

Anta den visade storleken för strängar

Du vet aldrig hur mycket utrymme en sträng kommer ta på skärmen då den översätts. Den kan mycket väl vara dubbla storleken mot för den ursprungliga engelska strängen. Lyckligtvis kommer de flesta gtkmm-komponenter vid körning expanderas till storleken som krävs.

Ovanliga ord

You should avoid cryptic abbreviations, slang, or jargon. They are usually difficult to translate, and are often difficult for even native speakers to understand. For instance, prefer "application" to "app"

Använda tecken som inte är ASCII i strängar

För närvarande stöder gettext inte tecken som inte är ASCII (d.v.s. tecken med en kod ovanför 127) i källkod. Du kan exempelvis inte använda upphovsrättstecknet (©).

För att arbeta runt detta skulle du kunna skriva en kommentar i källkoden just innan strängen, och säga till översättarna att använda det speciella tecknet om det finns tillgängligt på deras språk. För engelska skulle du sedan kunna göra en en_US.po-översättning för amerikansk engelska som använder det speciella tecknet.