Τι ειναι τα locale και πως τα ρυθμίζω σε Debian και Ubuntu

dimitris | Παρ, 04/05/2019 - 09:52 | 10'

Σε ορισμένες εγκαταστάσεις Linux (και συχνά σε server), εμφανίζεται το παρακάτω μήνυμα σφάλματος όταν εγκαθιστούμε εφαρμογές με χρήση της Perl (για παράδειγμα με τη χρήση του apt-get):

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

Το πρόβλημα οφείλεται σε κακή ρύθμιση του locale. 

Τι ειναι τα locale;

Καλή ερώτηση! Τα locale είναι σύνολα κανόνων για μια γραπτή γλώσσα καθώς και κανόνες για τα μηνύματα που βλέπουμε, τις μονάδες μέτρησης και το νόμισμα, τρόπο γραφής των αριθμών σε μια περιοχή κλπ. Με απλά λόγια, κάθε locale ορίζει στο Linux ποια γλώσσα και ποιο σύνολο χαρακτήρων (το λέμε και encoding) μπορεί να χρησιμοποιεί ένας χρήστης στο τερματικό του καθώς και σε ποια γλώσσα μπορεί να βλέπει τα μηνύματα του Linux.

Το όνομα κάθε locale έχει την εξής μορφή

<LANGUAGE>_<TERRITORY>.<CODESET>[@<MODIFIERS>]

π.χ.

el_GR.UTF-8

Για ευκολία, κάθε locale «χωρίζεται» σε κατηγορίες ανάλογα με το το είδος των πληροφοριών που δίνει σε ένα πρόγραμμα. Αυτές οι κατηγορίες ορίζονται σε macros όπως:

  • LC_MESSAGES: σε ποια γλώσσα εμφανίζονται τα μηνύματα,
  • LC_NUMERIC: τρόπος γραφής και εμφάνισης των αριθμών, που μπαίνει υποδιαστολή και που η τελεία.
  • LC_TIME: τρόπος εμφάνισης της ώρας (π.χ. Μήνας-ημέρα-έτος ή ημέρα-μήνας-έτος;)
  • LC_MEASUREMENT: μονάδα μέτρησης (π.χ. πόδια ή μέτρο)

ενώ υπάρχει και το macro LC_ALL που «υπερτερεί», δηλαδή ορίζει όλα τα προηγούμενα macros να έχουν την ίδια τιμή.

Η ρύθμιση γλώσσας και locale σε ένα σύστημα Linux γίνεται μέσω της καθολικής μεταβλητής LANG. Μπορούμε δηλαδή να δούμε ποια τιμή έχει, δηλαδή ποιο locale/γλώσσα χρησιμοποιείται στο σύστημα μας δίνοντας απλά την εντολή:

echo $LANG

Μερικές φορές όμως αυτό δεν φτάνει, γιατί μπορεί άλλη τιμή να έχετε στην $LANG και άλλες τιμές στα macro π.χ. στο $LC_ALL.

Πως βλέπω τι locale έχω στο σύστημά μου

Οπότε γιια να δείτε αναλυτικά όλες τις τρέχουσες ρυθμίσεις locale, δίνετε την εντολή locale, όπου (αν είναι σωστή η ρύθμιση) θα πρέπει να δείτε κάτι σαν κι αυτό:

# locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Αν δείτε πολλά unset ή ανάμεικτα locale, τότε αυτό σημαίνει ότι δεν έχουν ρυθμιστεί σωστά τα locale στο σύστημά σας.

Πως βλέπω τα διαθέσιμα locale

Κατ'αρχάς, με την εντολή locale -a βλέπετε ποια είναι τα διαθέσιμα locales στο σύστημα, δηλαδή ποια είναι ήδη έτοιμα για χρήση αυτή τη στιγμή:

# locale -a
C
C.UTF-8
en_US.utf8
POSIX

Τα παραπάνω είναι αυτά που είναι ήδη ρυθμισμένα στο Linux.

Για να δούμε όλα τα υποστηριζόμενα locale, δηλαδή όλα όσα μπορούμε να ρυθμίσουμε για χρήση, μπορούμε να ρίξουμε μια ματιά στο αρχείο: /usr/share/i18n/SUPPORTED

cat /usr/share/i18n/SUPPORTED

Κάθε locale που υπάρχει στο παραπάνω αρχείο, υποστηρίζεται από το Linux και μπορούμε να το ρυθμίσουμε για χρήση στο σύστημά μας με την παρακάτω διαδικασία.

Πως αλλάζω ή προσθέτω locale

Σε Debian ή Ubuntu, μπορούμε να ορίσουμε το σωστό locale με τις παρακάτω εντολές (εδώ θεωρούμε ότι θέλετε να βάλετε en_US.UTF-8 στον server σας):

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

locale-gen en_US.UTF-8

dpkg-reconfigure locales

Αναλυτικότερα, με τις 3 πρώτες εντολές ορίζουμε στις μεταβλητές συστήματος για τη γλώσσα, να χρησιμοποιεί το en_US.UTF-8 (βάλτε el_GR-UTF-8 αν προτιμάτε default γλώσσα τα ελληνικά - δεν το συνιστώ σε server).

Στη συνέχεια με την εντολή locale-gen δημιουργούμε το locale en_US.UTF-8.

Με την τελευταία εντολή, σε Debian/Ubuntu, κάνουμε ξανά ρύθμιση του πακέτου locales. Δηλαδή θα εμφανιστεί ένα ncurses περιβάλλον (δείτε την εικόνα παρακάτω) όπου επιλέγουμε (με το πλήκτρο space) ποια locales θέλουμε να «δημιουργηθούν» για να τα χρησιμοποιήσουμε στο σύστημά μας.

Για παράδειγμα, επιλέγουμε πάλι το en_US.UTF-8 και τέλος πατάμε OK.

Δημιουργία locales στο Debian
Δημιουργία locales στο Debian

Στην επόμενη οθόνη διαλέγουμε το locale που θα χρησιμοποιείται εξορισμού για όλο το σύστημα. Στην πράξη δηλαδή εδώ επιλέγουμε τη γλώσσα με την οποία θα «μιλά» ο server και όλα τα προγράμματα που τρέχουμε εκεί:

debian locale Perl warning Setting locale failed in Debian
Επιλογή default γλώσσας στο Debian

Μετά από αυτό, μπορείτε να επιβεβαιώσετε τη ρύθμιση με μια ματιά στο αρχείο /etc/default/locale που πρέπει να γράφει κάτι σαν κι αυτό:

cat /etc/default/locale
#  File generated by update-locale
LANG=en_US.UTF-8

Αυτό το αρχείο /etc/default/locale μπορούμε είτε να το επεξεργαστούμε με το χέρι είτε να το πειράξουμε με την εντολή update-locale. Για παράδειγμα, για να βάλουμε γλώσσα τα ελληνικά

update-locale LANG=el_GR.UTF-8

Παράλληλη χρήση πολλαπλών locales

Το αρχείο /etc/default/locale είναι χρήσιμο όταν π.χ. θέλουμε γλώσσα συστήματος τα ελληνικά αλλά τα μηνύματα του συστήματος στα αγγλικά ή άλλη γλώσσα. Αυτό το κάνουμε π.χ. ορίζοντας:

LANG=el_GR.UTF-8
LC_MESSAGES=POSIX

Η μεταβλητή συστήματος LC_MESSAGES είναι υπεύθυνη για τη γλώσσα στην οποία εμφανίζονται τα μηνύματα του συστήματος και του διαχειριστή παραθύρων.. Σημείωση: Μπορείτε να δείτε όλες τις διαθέσιμες LC_* μεταβλητές για Ubuntu/Debian εδώ.

Σύνδεση μέσω SSH

Στην περίπτωση που το πρόβλημα εμφανίζεται σε remote server στον οποίο συνδεόμαστε μέσω SSH, τότε το πρόβλημα δεν έχει να κάνει με τα locale στον απομακρυσμένο υπολογιστή! Αντίθετα, οφείλεται στο γεγονός ότι το ssh daemon επιτρέπει στους client να περνάνε environment variables όπως τα LANG και LC_ALL. Σε αυτήν την περίπτωση είτε ανοίγουμε το /etc/ssh/sshd_config στον server και απενεργοποιούμε την εντολή AcceptEnv:

# Allow client to pass locale environment variables
#AcceptEnv LANG LC_*

ή ΚΑΛΥΤΕΡΑ απενεργοποιούμε τη γραμμή SendEnv LANG LC_* στο αρχείο /etc/ssh/ssh_config του local υπολογιστή μας.

Δείτε περισσότερα στο σχετικό bug.

 

Troubleshooting

Σε κάποιες περιπτώσεις, ίσως χρειαστεί να προσθέσουμε τις μεταβλητές locale στο /etc/environment για μόνιμη αποθήκευση:

LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LC_TYPE=en_US.UTF-8

Αυτό ήταν! :)
 

Δείτε περισσότερα για τα locale στο άρτιο wiki του Arch Linux

https://wiki.archlinux.org/index.php/locale

Φόρουμ
Δώσε αστέρια!

MO: 3.9 (ψήφοι: 10)