Προετοιμασία του έργου σας

In the instructions below we will assume that you will not be using gettext directly, but intltool, which was written specifically for GNOME. intltool uses gettext(), which extracts strings from source code, but intltool can also combine strings from other files, for example from desktop menu details, and GUI resource files such as Glade files, into standard gettext .pot/.po files.

We also assume that you are using autotools (e.g. automake and autoconf) to build your project, and that you are using http://git.gnome.org/browse/gnome-common/tree/autogen.sh, which, among other things, takes care of some intltool initialization.

Δημιουργήστε έναν υποκατάλογο με όνομα po στον ριζικό κατάλογο του έργου σας. Αυτός ο κατάλογος θα περιέχει τελικά όλες τις μεταφράσεις σας. Μέσα σε αυτόν, δημιουργήστε ένα αρχείο με όνομα LINGUAS και ένα αρχείο με όνομα POTFILES.in. Είναι κοινή πρακτική να δημιουργείτε επίσης ένα αρχείο ChangeLog στον κατάλογο po, έτσι ώστε οι μεταφραστές να μπορούν να παρακολουθούν τις αλλαγές της μετάφρασης.

Το LINGUAS περιέχει έναν αλφαβητικά ταξινομημένο κατάλογο κωδίκων που αναγνωρίζει τις γλώσσες για τις οποίες το πρόγραμμά σας μεταφράζεται (γραμμές σχολιασμού που ξεκινούν με ένα # αγνοούνται). Κάθε καταχωρισμένος κωδικός γλώσσας στο αρχείο LINGUAS πρέπει να έχει ένα αντίστοιχο αρχείο .po. Έτσι, αν το πρόγραμμά σας έχει γερμανική και ιαπωνική μετάφραση, το αρχείο σας LINGUAS θα μοιάζει ως εξής:

# keep this file sorted alphabetically, one language code per line
de
ja

(Επιπλέον, θα έχετε τα αρχεία ja.po και de.po στον κατάλογό σας po που περιέχει την γερμανική και ιαπωνική μετάφραση, αντίστοιχα.)

Το POTFILES.in είναι ένας κατάλογος διαδρομών σε όλα τα αρχεία που περιέχουν συμβολοσειρές σημειωμένες για μετάφραση, ξεκινώντας από τον ριζικό κατάλογο του έργου. Έτσι, για παράδειγμα, αν οι πηγές του έργου σας είναι σε έναν υποκατάλογο με όνομα src και έχετε δύο αρχεία που περιέχουν συμβολοσειρές που πρέπει να μεταφραστούν, το αρχείο POTFILES.in μπορεί να μοιάζει ως εξής:

src/main.cc
src/other.cc

Αν χρησιμοποιείτε μια gettext άμεσα, μπορείτε μόνο να σημειώ σετε τις συμβολοσειρές για μετάφραση αν είναι στο αρχείο πηγαίου κώδικα. Όμως, αν χρησιμοποιείτε intltool, μπορείτε να σημειώσετε τις συμβολοσειρές για μετάφραση σε μια ποικιλία άλλων μορφών αρχείων, συμπεριλαμβάνοντας αρχεία διεπαφής χρήστη Glade, xml, .desktop files και πολλά περισσότερα. Έτσι, αν έχετε σχεδιάσει κάποια διεπαφή χρήστη της εφαρμογής σε Glade, τότε προσθέστε επίσης τα αρχεία σας .glade στον κατάλογο στο POTFILES.in.

Τώρα που υπάρχει μια θέση να βάλετε τις μεταφράσεις σας, χρειάζεται να αρχικοποιήσετε τις intltool και gettext. Προσθέστε τον ακόλουθο κώδικα στην configure.ac, αντικαθιστώντας το 'programname' με το όνομα του προγράμματός σας:

IT_PROG_INTLTOOL([0.35.0])

GETTEXT_PACKAGE=programname
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                   [The domain to use with gettext])
AM_GLIB_GNU_GETTEXT

PROGRAMNAME_LOCALEDIR=[${datadir}/locale]
AC_SUBST(PROGRAMNAME_LOCALEDIR)

Αυτή η μεταβλητή PROGRAMNAME_LOCALEDIR θα χρησιμοποιηθεί αργότερα στο αρχείο Makefile.am, για να ορίσει μια μακροεντολή που θα χρησιμοποιηθεί όταν αρχικοποιήσετε την gettext στον πηγαίο κώδικά σας.

In the top-level Makefile.am:

  • Add po to the SUBDIRS variable. Without this, your translations won't get built and installed when you build the program
  • Define INTLTOOL_FILES as:
    INTLTOOL_FILES = intltool-extract.in \
                     intltool-merge.in \
                     intltool-update.in
  • Add INTLTOOL_FILES to the EXTRA_DIST list of files. This ensures that when you do a make dist, these commands will be included in the source tarball.
  • Update your DISTCLEANFILES:
    DISTCLEANFILES = ... intltool-extract \
                     intltool-merge \
                     intltool-update \
                     po/.intltool-merge-cache

Στο src/Makefile.am σας, ενημερώστε το AM_CPPFLAGS σας για να προσθέσετε τον ακόλουθο προεπεξεργαστή ορισμού μακροεντολής:

AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\"${PROGRAMNAME_LOCALEDIR}\"

Αυτή η μακροεντολή θα χρησιμοποιηθεί όταν αρχικοποιείτε την gettext στον πηγαίο κώδικά σας.