Hacking Freeciv

Από Βικιβιβλία
Πήδηση στην πλοήγηση Πήδηση στην αναζήτηση

To freeciv είναι ένα αξιοπρόσεκτο εγχείρημα με πλήρες υποδομές υποστήριξης. Για κάποιον νεο στον χώρο του ελεύθερου λογισμικού είναι μια πολύ καλή αρχή για να εξοικοιωθεί με τον τρόπο λειτουργίας ενός ώριμου ελλακ εγχειρήματος που ξεκίνησε τιε 11/14/1995 .

Υποδομές[επεξεργασία]

Επικοινωνία[επεξεργασία]

Είναι πολύ σημαντικό να εργαζόμαστε στο πλαίσιο της κοινότητας. Συνεπώς πρέπει να έχουμε υπόψη τα κανάλια της επικοινωνίας που χρησιμοποιούνται.

Σύγχρονη επικοινωνία[επεξεργασία]

  • irc (freenode)
    • #freeciv
    • #freeciv-dev

Ασύγχρονή επικοινωνία[επεξεργασία]

Μετάφραση[επεξεργασία]

Σαν βασική πηγή έχω τις σχετικές οδηγίες στο freeciv βίκι. Το freeciv είναι 18n πρόγραμμα χρησιμοποιόντας την βιβλιοθήκη GNU gettext.

Μπορείτε να χρησιμοποιήσετε και το (mode po Nuvola mimetypes deb.png)του emacs για να βοηθηθήτε στην μετάφραση .po αρχείων.

Ροή εργασιών[επεξεργασία]

Ενημέρωση μετάφρασης για svn κώδικα[επεξεργασία]

  • $ cd ~/freeciv
  • $ svn update
  • $ ./autogen.sh (ίσως να χρειαστεί)
  • $ cd ~/freeciv/po/
  • $ make el.pox // Δημιουργία του βοηθητικού αρχέιου .po . Αυτό θα περιέχει μια συγχώνευση των προηγούμενων μεταφράσεων και των τυχών αλλαγών που έγινε στον πηγαίο κώδικα.Το επεξεργαζόμαστε και ενημερώνουμε ή προσθέτουμε μεταφράσεις καταχωρήσεων που άλλαξαν ή προστέθηκαν.
  • $ mv el.pox el.po //Μετονομάζουμε το el.pox σε el.po
  • $ make el.gmo //Δημιουργούμε το el.gmo που θα χρησιμοποιηθεί κατά την εκτέλεση του freeciv.
  • $ cd ~/freeciv
  • $ make
  • $ su
  • # make install

Προγράμματα μετάφρασης[επεξεργασία]

  • Emacs po mode
  • Gtranslator
  • Lokalize (KDE,αντικατάστησε το kbabel)
  • Poedit
  • Kate

PO format[επεξεργασία]

Ο τύπος αρχείου PO αποτελεί τον τύπο αρχείου μετάφρασεων του συστήματος μετάφρασης Gettext που χρησιμοποιείται σήμερα από πληθώρα ελεύθερου λογισμικού.

Το PO αρχείο είναι ένα απλό αρχείο κειμένου με την επέκταση .po . Περιέχει ένα πλήθος μηνυμάτων προς μετάφραση.

Δείτε ένα κομμάτι του el.po του freeciv:

#: client/cityrepdata.c:521
msgid "(worklist)"
msgstr ""

#: client/cityrepdata.c:638
msgid "?city:Name"
msgstr ""

#: client/cityrepdata.c:638 client/gui-sdl/cityrep.c:196
msgid "City Name"
msgstr ""

Κάθε μήνυμα περιέχει το λέξη κλειδί msgid η οποία ακολουθείτε από το κείμενο γραμμένο στα Αγγλικά, εσώκλειστο σε διπλά εισαγωγικά. Η λέξη κλειδί msgtr σημειώνει το αλφαριθμητικό που θα είναι η μετάφραση του αγγλικού (επίσης σε διπλά εισαγωγικά). Οπότε στην ποιό απλή της εκδοχή η μετάφραση που θα κάνουμε θα μας δώσει το παρακάτω αποτέλεσμα:

#: client/cityrepdata.c:521
msgid "(worklist)"
msgstr "(λίστα εργασιών)"

#: client/cityrepdata.c:638
msgid "?city:Name"
msgstr "?πόλη:Όνομα"

#: client/cityrepdata.c:638 client/gui-sdl/cityrep.c:196
msgid "City Name"
msgstr "Όνομα πόλης"

Το να αφήσουμε αμετάφραστα μηνύματα δεν αποτελεί πρόβλημα , αφού θα εμφανιστούν στο πρόγραμμα στα αγγλικά .

Προσέξτε ότι πρίν από κάθε μήνυμα υπάρχει ένα σχόλιο που περιέχει τη γραμμή και το αρχείο του πηγαίου κώδικα από'που προέρχεται (τα σχόλια αυτά μπορεί να μην εμφανιστούν σε μερικά προγράμματα μετάφρασης). Αυτό μπορεί να είναι χρήσιμο μερικές φορές αν δυσκολευόμαστε να κάνουμε μια μετάφραση και θέλουμε να δουμε τα συμφραζόμενα (που ακριβώς χρησιμοποιείται). Δείτε πχ πως εμφανίζεται στο πηγαίο αρχείο cityrepdata.c το μήνυμα "(worklist)":

const char *from_worklist =
    worklist_is_empty(&pcity->worklist) ? "" :
    concise_city_production ? "+" : _("(worklist)");

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


H κωδικοποίηση που χρησιμοποιείται δηλώνεται σε επικεφαλίδα του αρχείο και συνίσταται να είναι utf8.

Emacs po mode[επεξεργασία]

PO mode prevents direct modification of the PO file, by the usual means Emacs gives for altering a buffer's contents. By doing so, it pretends helping the translator to avoid little clerical errors about the overall file format, or the proper quoting of strings, as those errors would be easily made. Other kinds of errors are still possible, but some may be caught and diagnosed by the batch validation process, which the translator may always trigger by the V command. For all other errors, the translator has to rely on her own judgment, and also on the linguistic reports submitted to her by the users of the translated package, having the same mother tongue.

When the time comes to create a translation, correct an error diagnosed mechanically or reported by a user, the translators have to resort to using the following commands for modifying the translations.

  • <RET> Interactively edit the translation (po-edit-msgstr).
  • <LFD> C-j Reinitialize the translation with the original, untranslated string (po-msgid-to-msgstr).
  • k Save the translation on the kill ring, and delete it (po-kill-msgstr).
  • w Save the translation on the kill ring, without deleting it (po-kill-ring-save-msgstr).
  • y Replace the translation, taking the new from the kill ring (po-yank-msgstr).

Αναδίπλωση λέξεων (string wrapping)[επεξεργασία]

Στο πηγαίο κώδικα του freeciv υπάρχει μια στυλ που αποτρέπει γραμμές πάνω από 77 χαρακτήρες. Αυτό έχει σαν συνέπεια μεγάλες γραμμές μηνυμάτων να αναδιπλώνονται σε πολλές γραμμές συμβολοσειρών μέσα σε ζεύγη διπλών εισαγωγικών η κάθε μια. Αυτό θα μεταφερθεί και στο po αρχείο όπου βλέπουμε μηνύματα σε πολλές σειρές.Όμως η μετάφραση μας μπορεί να αγνοεί την αναδίπλωση ή να έχει μια δική μας αναδίπλωση. Οπότε σαν γενική συμβουλή μην αγχώνεσται με τις αναδιπλώσεις του msgid. Αν θέλετε τη δική σας μετάφραση σε μια γραμμή δεν υπάρχει πρόβλημα. (εκτός αν χρησιμοποιείτε text based editor από τερματικό).

Όταν ένα μήνυμα είναι μεγάλο και περιέχει μερικές λογικές αλλαγές γραμμής τότε το αρχικό αλλά και το μεταφρασμένο αλφαριθμητικό μπορεί να αναδιπλωθεί μέσα στο PO αρχείο όπως πχ:

#: ai/default/advdiplomacy.c:1434
#, c-format
msgid ""
"*%s (AI)* Your attempt to unilaterally dominate outer space is highly "
"offensive."
msgstr ""
"*%s (AI)* Η προσπαθειά σου να κυριαρχήσεις μονομερώς στο διάστημα είναι "
"αρκούντως επιθετική. "

Η αναδίπλωση (στους 80 χαρακτήρες) θα γίνει αυτόματα από τα PO εργαλεία και έχει σαν σκοπό να βοηθήσει όσους χρησιμοποιήσουν επεξεργαστή κειμένου μέσα από ένα τερματικό (φανταστείτε να έπρεπε να κάνετε scrolling προς τα δεξιά για να δείτε το κείμενο). Προσέξτε όμως ότί γίνεται μόνο για διευκόλυνση του μεταφραστή και μπορούμε άνετα να την αγνοήσουμε και στο μεταφρασμένο μας αλφαριθμητικό να μην έχουμε αναδίπλωση ή να έχουμε διαφορετική. Απλά μην ξεχάστε κάθε αναδιπλούμενο τμήμα να είναι μέσα στα δικά του ζεύγη διπλών εισαγωγικών.

Συμβουλές[επεξεργασία]

Ένα καλός τρόπος για να ελέγξεται την μετάφραση είναι να αρχίσετε το freeciv σε αγγλικό locale με την παρακάτω εντολή debian

 $ LANG=en_GB.UTF-8  ; civclient-gtk

Προγραμματισμός[επεξεργασία]

Το πρώτο βήμα για να αρχίζεται το hacking είναι να κατεβάσετε τον κώδικα και για να γίνει αυτό πρέπει να έχετε εγκαταστήσει το Subversion στον υπολογιστή σας. To subversion είναι ένα σύστημα διαχείρησης κώδικα.

Υπάρχουν δύο τρόποι:

  • Πρόσβαση ανάγνωσης μόνο.
    • Εδώ η διαδικασία είναι απλή.Μπορείτε να κατεβάσετε τον κώδικα με την εντολή
 $ svn co svn://svn.gna.org/svn/freeciv/trunk freeciv
  • Πρόσβαση ανάγνωσης και γραφής για δημιουργούς και μεταφραστές.

Εδώ πρέπει επιπλέον να έχετε εγκατεστημένο και το secure shell (openssh). Αν θέλετε να μπορείτε να υποβάλετε αλλαγές πρέπει να γραφτείτε στο gna.org πρέπει να δημιουργήσετε λογαριασμό στο gna.org και να εγγραφτείτε στο freeciv και κατόπιν πρέπει να δημιουργήσετε ένα κλειδί και να ανεβάσετε το δημόσιο μέρος του στο gna.org Μετά από μερικές ώρες θα μπορείτε να κάνετε λήψη του κώδικα με την εντολή:

 $ svn co svn+ssh://όνομαχρήστη@svn.gna.org/svn/freeciv/trunk freeciv

Αποσφαλμάτωση[επεξεργασία]

Αν θέλουμε να αλλάξουμε τις επιλογές του μεταγλωττιστή ώστε να μπορούμε να κάνουμε αποσφαλμάτωση μέσα από gdb τότε μπορούμε να θέσουμε την μεταβλητή περιβάλλοντος του κελύφους CFLAGS πριν εκτλέσουμε την εντολή "configure". Πχ:

$ CFLAGS="-O -g -pipe" ./configure   

ή εναλλακτικά

$ ./configure CFLAGS="-O -g -pipe"

Επίσης ενώ εκτελείτε το freeciv μπορούμε να έχουμε περισσότερες πληροφορίες αποσφαλμάτωσης με την επιλογή -d --debug (επιλογή του εξυπηρετητή freeciv)

Κατόπιν ανοίξτε το αρχείο client_main.c με τον emacs

$ emacs FREECIVDIR/clients/client_main.c

Και ενεργοποιήστε το GUD mode του emacs με Ctrl+X gdb [enter] Μπορείτε να χρησιμοποιήσετε τις βασικές εντολές του GUD.

Μεταγλώττιση[επεξεργασία]

Η διαδικασία είναι διαφορετική αν έχουμε svn πηγαίο κώδικα ή κώδικα από release. Διαβάστε και το αρχείο INSTALL.

SVN[επεξεργασία]

Αρχικά δημιουργούμε το Makefile:

% ./autogen.sh Το σενάριο αυτό θα δημιουργήσει τα configure scripts και θα τα εκτελέσει.

Οπότε αν όλα πάνε καλά μπορεί να προχωρήσετε στη μεταγλώττιση με:

$make

Ένα ερώτημα που τίθεται είναι αν πρέπει να ξανακάνουμε το πρώτο βήμα μετά από μια επικαιροποίηση του κώδικα μας (svn update) ή αρκεί το make. Σε μένα φαίνετει να χρειάζεται και το πρώτο βήμα πάλι.

Release code[επεξεργασία]

Κάντε τρέχων κατάλογο αυτόν που περιέχει των κώδικα και εκτελέστε την εντολή:

$ ./autogen.sh --enable-client=gtk

Προαπαιτούμενα[επεξεργασία]

Θα χρειαστούν :

  • gcc
  • autotools
  • make
  • Nuvola mimetypes deb.png libgtk-dev. Πακέτο που περιέχει αρχεία επικεφαλίδες και στατικές βιβλιοθήκες απαραίτητες για να δημιουργήσετε γραφικές διασυνδέσεις με χρήση του σετ γραφικών στοιχείων διασύνδεσης Gtk
    • Η εγκατάσταση αυτού του πακέτου λογικά θα τραβήξει και άλλα απαραίτητα πακέτα , όπως
      • libatk1.0-dev
      • libcairo2-dev
      • libpango1.0-dev
  • Nuvola mimetypes deb.png gettext GNU βιβλιοθήκη διεθνοποίησης λογισμικού i18n.
  • pkg-config
  • Nuvola mimetypes deb.png GLib