Παγίδες
Υπάρχουν λίγα συνηθισμένα λάθη που πρέπει να βρείτε τελικά οι ίδιοι. Αλλά αυτή η ενότητα μπορεί να σας βοηθήσει να τα αποφύγετε.
25.4.1. Ίδιες συμβολοσειρές, διαφορετική σημασιολογία
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.
Σε αυτές τις περιπτώσεις, θα πρέπει να προσθέσετε πρόσθετους χαρακτήρες στις συμβολοσειρές. Για παράδειγμα, χρησιμοποιήστε "jumps[noun]" και "jumps[verb]" αντί για απλώς "jumps" και αφαιρέστε τα πάλι έξω από την κλήση gettext. Αν προσθέτετε πρόσθετους χαρακτήρες θα πρέπει επίσης να προσθέσετε ένα σχόλιο για τους μεταφραστές πριν την κλήση της gettext. Τέτοια σχόλια θα εμφανιστούν στα αρχεία .po. Για παράδειγμα:
// σημείωση στους μεταφραστές: μην μεταφράζετε το τμήμα "[noun]" είναι // εδώ απλά για να ξεχωρίσει τη συμβολοσειρά από μια άλλη συμβολοσειρά "jumps" 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. Σύνθεση των συμβολοσειρών
Οι προγραμματιστές της C χρησιμοποιούν την sprintf() για τη σύνθεση και συνένωση συμβολοσειρών. Η C++ ευνοεί τις ροές, αλλά δυστυχώς, αυτή η προσέγγιση κάνει δύσκολη τη μετάφραση, επειδή κάθε τμήμα κειμένου μεταφράζεται ξεχωριστά, χωρίς να επιτρέπει στους μεταφραστές να τις αναδιατάξουν σύμφωνα με τη γραμματική της γλώσσας.
Για παράδειγμα, αυτός ο κώδικας μπορεί να είναι προβληματικός:
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. Υποθέτοντας το εμφανιζόμενο μέγεθος των συμβολοσειρών
Δεν ξέρετε ποτέ πόσο χώρο θα πάρει μια συμβολοσειρά στην οθόνη όταν μεταφραστεί. Μπορεί πιθανόν να είναι διπλάσια από το μέγεθος της αρχικής αγγλικής συμβολοσειράς. Ευτυχώς, τα περισσότερα γραφικά συστατικά της gtkmm θα επεκταθούν στον χρόνο εκτέλεσης στο απαιτούμενο μέγεθος.
25.4.4. Σπάνιες λέξεις
Θα πρέπει να αποφεύγετε κρυπτογραφικές συντομεύσεις, αργκό, ή φρασεολογία. Είναι συνήθως δύσκολο να μεταφραστούν και είναι συχνά δύσκολες ακόμα και για μητρικούς ομιλητές να τις κατανοήσουν. Για παράδειγμα, προτιμήστε "application" από "app"
25.4.5. Χρήση χαρακτήρων μη ASCII στις συμβολοσειρές
Προς το παρόν, η gettext δεν υποστηρίζει χαρακτήρες μη ASCII (δηλαδή οποιονδήποτε χαρακτήρα με κωδικό πάνω από 127) στον πηγαίο κώδικα. Για παράδειγμα, δεν μπορείτε να χρησιμοποιήσετε το σύμβολο πνευματικών δικαιωμάτων (©).
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.