To National Language Support (συντομογραφία NLS) είναι μία δυνατότητα που έχουν τα πιο πολλά UNIX, ώστε να ενημερώνονται οι εφαρμογές για τις γλωσσικές ρυθμίσεις του χρήστη και να παρουσιάζουν τα μυνήματά τους στην αντίστοιχη γλώσσα.
Το NLS χρησιμοποιείται από πολλά GNU tools, ειδικά αυτά που τρέχουν σε περιβάλλον γραμμής εντολών (Command Line Interface - CLI, δηλαδή το γνωστό prompt), και υποστηρίζεται πρόσφατα και στο γραφικό περιβάλλον (πχ KDE). Η ενημέρωση των εφαρμογών γίνεται μέσα από μεταβλητές περιβάλλοντος, με εντολές του τύπου LANG="el_GR". Από Νοέμβρη 1998 τα ελληνικά θα ρυθμίζονται ως el_GR (με βάση τα αντίστοιχα ISO πρότυπα), και ελπίζουμε ότι η αλλαγή αυτή θα περάσει σύντομα στις διανομές.
Εργασία γύρω από το NLS έχει κάνει και ο Σίμος Ξενιτέλλης, δείτε το Greek-nls-HOWTO και αυτό το άρθρο στο περιοδικό magaz: http://magaz.hellug.gr/09/04_nls.html.
ΠΡΟΣΟΧΗ: Το παρόν κεφάλαιο είχε γραφτεί από τον Τάσο Κάπιο, σε μια εποχή που το NLS δεν υπήρχε πάντα στημένο στο linux, και το πρότυπο ήταν αρκετά ασταθές (πχ, μπορεί να βρείτε να λέει για gr_GR, αντί el_GR).
ΠΡΩΤΑ βλέπε πόσες και ποίες είναι οι βιβλιοθήκες της C που υπάρχουν στο σύστημα σου. π.χ.
ttyp3:~#ldconfig -v | grep libc.so libc.so.4 => libc.so.4.7.2 libc.so.6 => libc-2.0.4.so libc.so.5 => libc.so.5.4.33Υπάρχουν 5 κατηγορίες libc και δεν είναι συμβατές μεταξύ τους, όσον αφορά τα locale πάντα. (Αυτή την στιγμή οι πιο πολλοί έχουν τις εκδόσεις 4 και 5)
Χρειάζεστε τις τοπικές ρυθμίσεις (localedata), τον compiler localedef και το διαγνωστικό εργαλείο locale.
ftp://dkuug.dk/i18n/WG15-collection/locales/gr_GR (2679 bytes) ftp://dkuug.dk/i18n/WG15-collection/charmaps/ISO_8859-7:1987 (19768 bytes) ftp://dkuug.dk/i18n/WG15-collection/locales/en_DK (101080 bytes)
locales/gr_GR locales/en_DK charmaps/ISO_8859-7,1987(Πρέπει να δουλεύει μόνο για libc 5.4.x)
Πρώτα πηγαίνετε στον υποκατάλογο όπου βρίσκετε gr_GR και τρέχετε την εντολή
>sed -e 's/am_pm "";""/am_pm "<P*><M*>";"<M*><M*>"/' gr_GR > el_GR(Για δυνατότητα ελληνικού ΠΜ και ΜΜ και η αλλαγή ονόματος για συμβατότητα με τα X) Και για έλεγχο
> tail -n 5 el_GR | grep am_pm am_pm "<P*><M*>";"<M*><M*>" t_fmt_ampm "" END LC_TIMEΤώρα σαν root δημιουργήστε τους εξής υποκαταλόγους
# mkdir -m 755 -p /usr/share/locale/el_GR/LC_MESSAGES # mkdir -m 755 -p /usr/share/i18n/charmaps # mkdir -m 755 -p /usr/share/i18n/locales # ln -sf /usr/share/i18n/charmaps /usr/share/i18n/charmapΕγκαταστήστε στα σωστά μέρη τα el_GR, en_DK, ISO-8859-7 (ή ISO_8859-7:1987 ή ISO_8859-7,1987)
# cd (εκεί που είναι τα localedata) # cp e?_?? /usr/share/i18n/locales # cd ../charmaps # cp ISO[-_]8859-7* /usr/share/i18n/charmaps # cd /usr/share/i18n/charmaps # ln -s ISO_8859-7,1987 ISO-8859-7Μεταγλωττίστε, αν δεν τα έχετε ήδη σε binary μορφή, τα locale και localedef. Αυτό γίνεται περίπου έτσι:
> cd ~/src > gzip -dc libc-x.y.z.tar.gz | tar xvf - > cd libc-x.y.z > ./configure > make clean; make depend > cd locale > make programs > su -f root -c 'install -m 755 locale localedef /usr/bin'Και τώρα είστε έτοιμοι για την μεταγλώττιση των τοπικών ρυθμίσεων. Σαν root:
# cd /usr/shareΣε περίπτωση που έχετε μια libc
# localedef -ci locale/el_GR -f i18n/charmap/ISO-8859-7 el_GRΣε περίπτωση που έχετε δύο π.χ. libc-5.4.33 και libc-2.0.4
# localedef-2.04 -ci el_GR -f ISO-8859-7 el_GR # localedef-5.4.33 -ci el_GR -f ISO-8859-7 el # chmod -cR a+r localeΤώρα πρέπει να υπάρχουν αυτά κάτω από το /usr/share/locale/el_GR (και το el)
# ls locale/el_GR LC_COLLATE LC_CTYPE LC_MESSAGES/ LC_MONETARY LC_NUMERIC LC_TIME
Μια δοκιμή. Για κέλυφος τύπου csh π.χ. tcsh:
> setenv LANG el_GRΓια κέλυφος τύπου sh π.χ. bash, ksh:
> LANG=el_GR ; export LANGΔοκιμάστε:
> locale LANG=el_GR LC_CTYPE="el_GR" LC_NUMERIC="el_GR" LC_TIME="el_GR" LC_COLLATE="el_GR" LC_MONETARY="el_GR" LC_MESSAGES="el_GR" LC_ALL= > locale -c LC_TIME | head LC_TIME Κυρ;Δευ;Τρι;Τετ;Πεμ;Παρ;Σαβ Κυριακή;Δευτέρα;Τρίτη;Τετάρτη;Πέμπτη;Παρασκευή;Σαββάτο Ιαν;Φεβ;Μάρ;Απρ;Μάι;Ιούν;Ιούλ;Αύγ;Σεπ;Οκτ;Νοέ;Δεκ Ιανουάριος;Φεβρουάριος;Μάρτιος;Απρίλιος;Μάιος;Ιούνιος;Ιούλιος;Αύγουστος;Σεπτέμβριος;Οκτώβριος;Νοέμβριος;Δεκέμβριος ΠΜ;ΜΜ %a %d %b %Y %T %Z %d/%m/%Y %T(Η διαμόρφωση αλλάζει από libc σε libc)
Τώρα μπορείτε να δοκιμάστε μερικές εφαρμογές (αρκεί να έχουν γίνει compile με μια συμβατή libc)
> unsetenv LESSCHARSET ή unset LESSCHARSET > less καποιο-κειμενο-με-ελληνικα > cal Αύγουστος 1997 Κυ Δε Τρ Τε Πε Πα Σα 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31Και στο Netscape 4 (με libc 5.4.x x > 4 ) ανοίξτε το Mail & Discussions και θα δείτε στο Date τους μήνες στην μέση πχ 31/08/1997 και τις ημέρες στα ελληνικά. Τέλος :-)
Εδώ υπάρχουν δυο ανεξάρτητα πακέτα το gencat και το gettext
α)Το gencat έρχεται μαζί με τον πηγαίο κώδικα της κάθε libc (κάτω από το nls/) ή σε binary π.χ. gencat-x.y.z και είναι εξαρτημένο από αυτήν όπως και το localedef. Μεταγλωττίζει αρχεία τύπου International language text (.m) σε καταλόγους.
β)Το gettext, είναι ανεξάρτητο από την libc, και υπάρχει συνήθως σε mirrors της gnu π.χ.ftp.kernel.org/pub/mirrors/gnu/gettext-0.10.tar.gz και στα debian,redhat. (Για να βρείτε μια πρόσφατη έκδοση πάτε στο http://las.ml.org ψαξτε για gettext) Το χρησιμοποιούν σχεδόν όλα τα πακέτα της GNU {file,sh,text,net}-utils και πολλά άλλα πακέτα π.χ. (WindowMaker). Για πληροφορίες δείτε το ftp.kernel.org/pub/mirrors/gnu/ABOUT-NLS, στείλτε μήνυμα στην ελληνική ομάδα στο el@li.org ή για να βοηθήστε μπείτε στην λίστα el-request@li.org με την λέξη "subscribe" στο σώμα του μηνύματος.
Αυτή την στιγμή, από ό,τι γνωρίζω, πλήρως ελληνικά μηνύματα έχει μόνο το tcsh 6.07.02 (με patches του debian) και χρησιμοποιεί, δυστυχώς, το gencat.
Κατεβάστε το tcsh >= 6.07.02. Βρείτε το gencat (πηγαίος κώδικας libc,σε binary απο redhat,debian) Προτού μεταγλωττίστε το tcsh. ή
Μεταγλωττίστε, εγκαταστήστε, δοκιμάστε το tcsh
>make >make catalogs >su -f root -c 'make install' >su -f root -c 'install -m 644 tcsh.greek.cat /usr/share/locale/el_GR/tcsh' >/bin/tcsh >setenv LANG el_GR >unsetenv NOREBIND (για να αφήνει γράφετε στα ελλήνικα) >fkjg fkjg: Η εντολή δε βρέθηκε.Αν δεν σας βγάλει ελληνικό μήνυμα τότε
>ls -l /usr/share/locale/el_GR/tcsh -rw-r--r-- 1 root root 47443 Ιούν 12 21:27 /usr/share/locale/el_GR/tcsh >file /usr/share/locale/el_GR/tcsh /usr/share/locale/el_GR/tcsh: data >ls -l /bin/tcsh -rwxr-xr-x 1 root root 270476 Σαβ Αύγ 10:23 /bin/tcsh >date Σαβ Αύγ 9 10:38 EET DST 1997
> gencat -V localedef (GNU libc) 2.0.4 Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Ulrich Drepper. > ldd /bin/tcsh libnsl.so.1 => /lib/libnsl.so.1 (0x40003000) libncurses.so.4 => /usr/lib/libncurses.so.4 (0x4000a000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004a000) libc.so.6 => /lib/libc.so.6 (0x40078000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
Αν το μήνυμα είναι κάπως έτσι
fkjg: ^Η ^ε^ν^τ^ο^λ^ή ^δ^ε ^β^ρ^έ^θ^η^κ^ε.
> ls -l /usr/share/locale/el_GR total 96 drwxr-xr-x 3 root root 1024 Ιούν 25 20:40 ./ drwxr-xr-x 68 root root 2048 Αύγ 6 10:41 ../ -rw-r--r-- 1 root root 29156 Ιούν 25 20:36 LC_COLLATE -rw-r--r-- 1 root root 10428 Ιούν 25 20:36 LC_CTYPE drwxr-xr-x 2 root root 1024 Ιούν 25 20:34 LC_MESSAGES/ -rw-r--r-- 1 root root 95 Ιούν 25 20:36 LC_MONETARY -rw-r--r-- 1 root root 27 Ιούν 25 20:36 LC_NUMERIC -rw-r--r-- 1 root root 536 Ιούν 25 20:36 LC_TIME -rw-r--r-- 1 root root 47443 Ιούν 12 21:27 tcsh
> localedef -V localedef (GNU libc) 2.0.4 Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Ulrich Drepper. > ldd /bin/tcsh libnsl.so.1 => /lib/libnsl.so.1 (0x40003000) libncurses.so.4 => /usr/lib/libncurses.so.4 (0x4000a000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004a000) libc.so.6 => /lib/libc.so.6 (0x40078000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
Οι πιο πολλές εφαρμογές το μόνο που χρειάζονται είναι το LANG σε el_GR.
#include <locale.h> ..... setlocale(LC_ALL,""); ..... >δοκιμη --ολαΆλλες εφαρμογές κανείς;
Πολλά ;-).
Η ΜΕΤΑΓΛΩΤΤΙΣΜΕΝΗ ΜΟΡΦΗ ΑΠΟ ΤΑ LOCALEDEF ΚΑΙ GENCAT ΣΥΝΗΘΩΣ AΛΛΑΖΕΙ ΑΠΟ LIBC ΣΕ LIBC ΚΑΙ ΕΝΑ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΓΛΩΤΤΙΣΜΕΝΟ ΜΕ ΤΟΥΣ HEADERS ΜΙΑΣ LIBC ΜΠΟΡΕΙ ΝΑ ΜΗΝ ΜΠΟΡΕΙ ΝΑ ΔΙΑΒΑΣΕΙ ΤΗΣ ΤΟΠΙΚΕΣ ΡΥΘΜΙΣΕΙΣ ΦΤΙΑΓΜΕΝΕΣ ΑΠΟ ΑΛΛΗ ΒΙΒΛΙΟΘΗΚΗ.
Locale not supported from X library.(ή κάτι παρόμοιο) Ελέγξτε τα δικαιώματα στους υποκαταλόγους
# chmod -cR a+r /usr/share/locale /usr/X11R6/lib/localeΕλέγξτε τα Xresources και ψάξτε για τίποτα ύποπτο
>xrdb -queryΒλέπε προβλήματα με την βιβλιοθήκη της C.
Ο δαίμονας syslogd αποθηκεύει τα δεδομένα στα 7-bit και πολλές εφαρμογές θα του στέλνουν τις ημερομηνίες στα ελληνικά π.χ.το PAM με αποτέλεσμα μερικές φορές να μην μπορείς δείς τον μήνα.
Μερικά προγράμματα θα περιμένουν για απάντηση σε ερώτηση "yes/no" αντί για "y" ή "n"τα "ν" και "ο" αντίστοιχα.
Στην κονσόλα καλό είναι να έχετε μια γραμματοσειρά iso-8859-7(ELOT-928). Ειδικά με ελληνικό tcsh.