Internationalization - Localization (i18n - l10n)

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 10 Ιαν 2008 13:23

Αργά ή γρήγορα όλοι μας κάποια στιγμή ερχόμαστε αντιμέτωποι με το θέμα της διεθνοποίησης ενός προγράμματος ή μας ιστοσελίδας. Όταν έρθει αυτή η στιγμή πρέπει να αντιμετωπίσουμε έναν ωκεανό από πληροφορίες και ξέρω καλά πόσο μπερδεμένοι μπορεί να βρεθείτε. Γι αυτό θέλησα να συγκεντρώσω όλους τους βασικούς όρους και τις λεπτομέρειες που αν κάποιος τις ξέρει μπορεί να βάλει τάξη στο χάος των γλωσσών και των κωδικοποιήσεων.

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


Locales
Υπάρχει μια διαφορά μεταξύ των όρων internationalization και localization που εμείς οι Έλληνες δεν αντιλαμβανόμαστε τόσο εύκολα γιατί η επίσημη γλώσσα μας είναι μία. Για παράδειγμα τα Πορτογαλέζικα μιλιούνται στην Πορτογαλία αλλά και στην Βραζιλία. Όμως υπάρχουν μεταξύ τους διαφορές και γι αυτό αν χρειαστεί να ρωτήσουμε τον χρήστη αν θέλει να δει την Πορτογαλέζικη μετάφραση (internationalization) θα πρέπει επίσης να τον ρωτήσουμε αν εννοεί την Πορτογαλέζικη μετάφραση όπως μιλιέται στην Πορτογαλία ή στην Βραζιλία (localization). Το διεθνές σύμβολο για τα Πορτογαλέζικα είναι το "pt". Και επειδή υπάρχει αυτή η περιπλοκή, το localization σύμβολο πρέπει να περιέχει και το όνομα της χώρας. Οπότε τα localization symbols ή locales θα ήταν "pt-PT" για τα Πορτογαλέζικα της Πορτογαλίας και "pt-BR" για τα Πορτογαλέζικα της Βραζιλίας.

Το locale για τα ελληνικά είναι το "el-GR".

Μεταξύ των locales για τα αγγλικά της Μ. Βρετανίας κυκλοφορούν πολλά, αλλά μάλλον το σωστό είναι το "en-GB". Κυκλοφορούν όμως και τα "en-UK" και το "en-EN".

Για όσους θέλουν να το ψάξουν περισσότερο υπάρχει το RFC 4646 το οποίο ρυθμίζει όλα αυτά τα θέματα.


Charset
Βγαίνει από το "character set" και είναι πίνακας με αντιστοιχίες αριθμών και γραμμάτων. Υπάρχουν δύο κατηγορίες charsets, τα ANSI και τα Unicode.


ANSI
Πίνακας από 256 χαρακτήρες με αντιστοιχίες αριθμών και γραμμάτων. Υπάρχουν πολλοί τέτοιοι πίνακες κάποιοι από τους οποίους υποστηρίζουν Ελληνικά. Το ποιο γνωστό λατινικό ANSI charset που χρησιμοποιούμε στο web είναι το iso-8859-1. Το ποιο γνωστό Ελληνικό charset είναι το iso-8859-7. Η Microsoft έχει ένα δικό της Ελληνικό charset το cp1253 το οποίο επίσης είναι γνωστό και σαν win1253 ή windows-1253. Όταν γράφουμε ένα κείμενο με το notepad των windows συνήθως γράφουμε σε ANSI και συγκεκριμένα στο windows-1253. Στο web όμως το standard είναι το iso-8859-7. Υπάρχει μια μικρή διαφορά μεταξύ τους στο κεφαλαίο άλφα με τόνο (Ά). Αν γράψετε ένα κείμενο με το Notepad των Windows στο οποίο υπάρχει αυτός ο χαρακτήρας και το εμφανίσετε στο web σαν iso-8859-7 αυτός ο χαρακτήρας θα φανεί σαν ένα περίεργο άγνωστο σύμβολο. Υπάρχει μια εις βάθος συζήτηση για το θέμα μεταξύ Σκεφτόμυλου και Άλκη εδώ.

Για να γράψετε ένα αρχείο κειμένου σε iso-8859-7 χρησιμοποιήστε κάποιον editor (Notepad++, Eclipse) εκτός του Notepad των Windows και επιλέξτε για "character set" ή "charset" ή "encoding" το iso-8859-7.

Για να κάνετε το charset της ιστοσελίδας σας iso-8859-7 βάλτε στο <head>..</head> του HTML:

Κώδικας: Επιλογή όλων

<meta http-equiv="content-type" content="text/html; charset=iso-8859-7">
Για να γράψετε ένα αρχείο κειμένου σε windows-1253 χρησιμοποιήστε οποιοδήποτε editor και επιλέξτε για "character set" ή "charset" ή "encoding" το windows-1253.

Για να κάνετε το charset της ιστοσελίδας σας windows-1253 βάλτε στο <head>..</head> του HTML:

Κώδικας: Επιλογή όλων

<meta http-equiv="content-type" content="text/html; charset=windows-1253">
Για αποφυγή πολλών προβλημάτων όμως το καλύτερο είναι να μη βάλετε ούτε το ένα, ούτε το άλλο, αλλά να προτιμήσετε το UTF-8 το οποίο περιγράφεται παρακάτω.


Unicode
Πίνακας με χιλιάδες χαρακτήρες από αλφαβήτους από όλες τις γλώσσες του κόσμου. Το Unicode εφευρέθηκε για να μην υπάρχει το χάος με τα πάμπολλα ANSI charsets αλλά έχει το πρόβλημα ότι κάθε γράμμα πρέπει να σώζεται με 4 bytes. Αυτό το κάνει πρακτικά κακή επιλογή για τις ανάγκες του web.


UTF-8
Το utf-8 είναι ένας πίνακας Unicode αλλά με μεταβλητό μέγεθος στα γράμματα. Όταν γράφουμε λατινικούς χαρακτήρες, αυτοί σώζονται με ένα byte. Όταν γράφουμε Ελληνικούς χαρακτήρες αυτοί σώζονται με δύο bytes. Αν γράφαμε κινέζικα οι χαρακτήρες θα σωζόντουσαν με 4 bytes. Τα οφέλη του UTF-8 είναι πολλά. Ξεφεύγουμε από προβλήματα μπερδεμάτων μεταξύ ANSI charsets, είναι ποιο εύκολο να κάνουμε αλφαβητικά sorts μέσα σε βάσεις δεδομένων (πχ MySQL), μπορούμε στην ίδια ιστοσελίδα να έχουμε κείμενα από διαφορετικές γλώσσες, κάνουμε την ζωή των search engines ευκολότερη.

Για να κάνετε το charset της ιστοσελίδας σας utf-8 βάλτε στο <head>..</head> του HTML:

Κώδικας: Επιλογή όλων

<meta http-equiv="content-type" content="text/html; charset=utf-8">
Σημείωση για προχωρημένους: Οι Ελληνικοί χαρακτήρες εμφανίζονται σε διάφορα σημεία στους πίνακες του UTF-8, δεν είναι όλοι όμως οι σωστές αντιστοιχίες. Οι σωστές αντιστοιχίες είναι στις περιοχές 0xCE?? και 0xCF?? . Οι υπόλοιπες εμφανίσεις των Ελληνικών χαρακτήρων είναι για περιπτώσεις γραμμάτων που μοιάζουν με Ελληνικά από άλλες αλφάβητους ή για μαθηματικά σύμβολα.


Low-level παραδείγματα
Εδώ είναι μερικά παραδείγματα για τους περίεργους που θέλουν να δούν πως μοιάζουν εσωτερικά τα διαφορετικά charsets. Διάλεξα επίτηδες την λέξη "Άλφα" γιατί ξεκινάει με κεφαλαίο άλφα τονισμένο και δείχνει την διαφορά μεταξύ iso-8859-7 και windows-1253.

Κώδικας: Επιλογή όλων

                    Ά       λ       φ       α
iso-8859-7       0xB6    0xEB    0xF6    0xE1
windows-1253     0xA2    0xEB    0xF6    0xE1
utf-8          0xCE86  0xCEBB  0xCF86  0xCEB1

Flash
Η επικοινωνία με το Flash γίνεται σε utf-8. Αν θέλετε να δέσετε ένα XML ή ένα πρόγραμμα σε PHP με το Flash αυτό γίνεται μόνο σε utf-8.


BOM
Τα κείμενα γραμμένα σε utf-8 είναι κανονικά κείμενα. Η Microsoft όμως είχε μια φαεινή ιδέα να βάζει τρεις χαρακτήρες στην αρχή των κειμένων για να καταλαβαίνει αν ένα κείμενο είναι γραμμένο σε ANSI ή σε utf-8. Αυτοί οι χαρακτήρες ονομάζονται Byte Order Mask (ή BOM) και δημιουργούν προβλήματα με τα προγράμματα σε PHP. Συγκεκριμένα οι εντολές session_start(), ob_start(), header(), set_cookie() και όσες άλλες στέλνουν δεδομένα στον HTTP header πρέπει να στέλνονται πριν οποιοδήποτε output. Όμως, ακόμα και σε μια σελίδα που ξεκινά με <?php ο BOM είναι πριν το "<" οπότε στέλνεται σαν κανονικός εκτυπώσιμος χαρακτήρας και συνήθως εμφανίζεται ένα μήνυμα λάθους "Headers already sent". Σε ειδικές περιπτώσεις (όπως δυναμικές εικόνες με GDI ή manual downloads) αυτό το μήνυμα δεν θα το δείτε ποτέ, αλλά η εικόνα ή το αρχείο θα κατεβαίνει χαλασμένο. Το ίδιο πρόβλημα υπάρχει αν έχετε βάλει συμπίεση gzip στις σελίδες σας. Το συμπέρασμα είναι: μην γράφετε utf-8 αρχεία με τα προγράμματα για windows (όπως το Notepad), εκτός κι αν υποστηρίζουν την επιλογή να μην βάζουν BOM.

Το Notepad++ έχει τέτοια επιλογή ("UTF8 without BOM"). Πιθανός θα υπάρχουν κι άλλα προγράμματα.


Charset conversion
Αν έχετε εγκατεστημένη την βιβλιοθήκη mbstring μπορείτε να αλλάζετε το charset με την εντολή mb_convert_encoding(). Αν έχετε εγκατεστημένη την βιβλιοθήκη iconv μπορείτε να αλλάζετε το charset με την εντολή iconv(). Μόνο προσοχή στην σειρά των παραμέτρων αυτών των εντολών.

Αν θέλουμε να μετατρέψουμε ένα κείμενο από iso-8859-7 σε utf-8 γράφουμε

Κώδικας: Επιλογή όλων

$target = mb_convert_encoding&#40;$source, 'utf-8', 'iso-8859-7'&#41;;
ή

Κώδικας: Επιλογή όλων

$target = iconv&#40;'iso-8859-7', 'utf-8', $source&#41;;
Συγκεκριμένα όμως το charset windows-1253 δεν υποστηρίζεται από το mb_convert_encoding(). Υποστηρίζεται μόνο από το iconv() και μάλιστα την μορφή cpXXXX. Δηλαδή για να μετατρέψουμε ένα κείμενο από windows-1253 σε utf-8 γράφουμε

Κώδικας: Επιλογή όλων

$target = iconv&#40;'cp1253', 'utf-8', $source&#41;;

HTML Entities
Στη γλώσσα HTML υπάρχουν κάποιοι χαρακτήρες που έχουν ειδική σημασία. Για παράδειγμα οι ανισότητες χρησιμοποιούνται για tags (<tag>), και αν θελήσουμε να γράψουμε στο κείμενο μας τα σύμβολα της ανισότητας θα γράφαμε "&lt;" (less than) για το "<" και "&gt;" (greater than) για το ">". Τα &lt; και &gt; ονομάζονται HTML entities.

Υπάρχουν πολλών ειδών HTML entities, μεταξύ των οποίων και μαθηματικά σύμβολα που ουσιαστικά είναι γράμματα της Ελληνικής αλφαβήτου. Δυστυχώς οι αγγλόφωνοι προγραμματιστές δεν αντιμετωπίζουν σχεδόν ποτέ προβλήματα με άλλες γλώσσες και δεν αντιλαμβάνονται τα προβλήματα που μας απασχολούνε. Γι αυτό κάποια προγράμματα μπερδεύουν τα μαθηματικά σύμβολα με τους κανονικούς Ελληνικούς χαρακτήρες.

Από τα μαθηματικά σύμβολα με ελληνικά γράμματα υπάρχουν τα:

Κώδικας: Επιλογή όλων

<!-- Κεφαλαία -->
&Alpha; &Beta; &Gamma; &Delta; &Epsilon; &Zeta; &Eta; &Theta; &Iota; &Kappa; &Lambda; &Mu; &Nu; &Xi; &Omicron; &Pi; &Rho; &Sigma; &Tau; &Upsilon; &Phi; &Chi; &Psi; &Omega;

<!-- Μικρά -->
&alpha; &beta; &gamma; &delta; &epsilon; &zeta; &eta; &theta; &iota; &kappa; &lambda; &mu; &nu; &xi; &omicron; &pi; &rho; &sigmaf; &sigma; &tau; &upsilon; &phi; &chi; &psi; &omega;

TinyMCE
Η κανονική ρύθμιση του TinyMCE αλλάζει τους Ελληνικούς χαρακτήρες σε HTML entities. Για να λειτουργήσει σωστά θα πρέπει να κάνουμε initialize με την παράμετρο

Κώδικας: Επιλογή όλων

entity_encoding &#58; "raw",
Για παράδειγμα μια σωστή αρχικοποίηση (initialization) του TinyMCE είναι:

Κώδικας: Επιλογή όλων

tinyMCE.init&#40;&#123;
	theme &#58; "simple",
	mode&#58; "none",
	entity_encoding &#58; "raw",
	valid_elements &#58; "*&#91;*&#93;",
	height&#58; "150px",
	width&#58; "475px"
&#125;&#41;;

setlocale()
Θεωρητικά με την εντολή setlocale() μπορούμε να αλλάζουμε τις τοπικές ρυθμίσεις του συστήματος. Αφού οριστούν οι τοπικές ρυθμίσεις μπορούμε να χρησιμοποιούμε την strftime() για να παίρνουμε ημερομηνίες στα Ελληνικά, ή τις strtoupper() και strtolower() για τις φράσεις με strings στα Ελληνικά και άλλα τέτοια.

Στην πράξη όμως αυτή η εντολή ενεργοποιεί τις αντίστοιχες εντολές του λειτουργικού συστήματος. Έτσι το script μας βασίζεται αποκλειστικά στις ικανότητες του λειτουργικού και όχι της PHP. Το αποτέλεσμα είναι κάποιες φορές να παίρνουμε τα αποτελέσματα που περιμένουμε και κάποιες φορές όχι. Επίσης βασιζόμαστε και στις ορέξεις άλλων scripts που τρέχουν παράλληλα στον server γιατί όπως λέει και στο manual η setlocale() αλλάζει για όλο το process, όχι μόνο για το thread του δικού μας script.

Μέσα σε αυτό το forum θα βρείτε πολλές αναφορές στην setlocale() όπως και στο επίσημο site. Η προσωπική μου άποψη όμως είναι να μην βασίζεστε σε αυτή την εντολή χωρίς να κάνετε ελέγχους στο σύστημα που θα εγκατασταθεί το πρόγραμμα σας.

Ένα πολύ ποιο αξιόπιστο αντικατάστατο για utf-8 είναι οι εντολές mb_* (multibyte string functions).


Gettext
Το gettext είναι μια προσπάθεια να βγεί μια άκρη στο θέμα των συντακτικών διαφόρων γλωσσών.

Ένα πρόβλημα που υπάρχει όταν γράφουμε διεθνής εφαρμογές είναι το συντακτικό. Κάποιες γλώσσες βάζουν πρώτα τα επίθετα, μετά τα ουσιαστικά, άλλες ανάποδα. Κάποιες γλώσσες βάζουν τα ρήματα στο τέλος, ή κάνουν πράγματα που για την δικιά μας γλώσσα είναι εντελώς παράξενα. Επομένως όταν πρέπει να βάλουμε μια, δύο μεταβλητές μέσα σε μια πρόταση δεν είναι πάντα σωστό να κόβουμε την φράση σε κομμάτια και να τα βάζουμε όπου να ναι. Η σωτηρία σε αυτή την περίπτωση είναι οι εντολές printf() (sprintf(), vprintf(), vsprintf() κτλ).

Χωρίς την sprintf() θα γράφαμε

Κώδικας: Επιλογή όλων

echo "<p>Keimeno $metabliti1 keimeno $metabliti2 keimeno $metabliti3 </p>\n";
Με την sprintf() και με σταθερές παραμέτρους θα γράφαμε

Κώδικας: Επιλογή όλων

$text_format = "<p>Keimeno %1\$s keimeno %2\$s keimeno %3\$s </p>\n";
echo sprintf&#40;$text_format, $metabliti1, $metabliti2, $metabliti3&#41;;
Έτσι μπορούμε να βγάλουμε τον ορισμό του $text_format από το κεντρικό script και να το βάλουμε σε ένα ξεχωριστό αρχείο για τα Ελληνικά, το οποίο μπορούμε να το φορτώνουμε δυναμικά. Με τον ίδιο τρόπο μπορούμε να έχουμε και άλλα ξεχωριστά αρχεία για Αγγλικά, Γαλλικά, Ιταλικά κτλ. Και αν το συντακτικό μιας γλώσσας θέλει την διάταξη των παραμέτρων αλλιώς μπορούμε απλά να τις αλλάξουμε:

Κώδικας: Επιλογή όλων

$text_format = "<p>Text %3\$s text %1\$s text %2\$s </p>\n";
Ένα άλλο μεγάλο πρόβλημα είναι αυτό των πληθυντικών. Η δικιά μας γλώσσα είναι από τις ποιο ήπιες στο συγκεκριμένο θέμα. Χρησιμοποιούμε μόνο μια μορφή πληθυντικού για το 0 και τις ποσότητες μεγαλύτερες του 1 ("0 αρχεία", "1 αρχείο", "2 αρχεία" ...). Σε άλλες γλώσσες υπάρχουν πολλοί πληθυντικοί. Σε κάποια γλώσσα υπάρχει ξεχωριστός πληθυντικός για τις ποσότητες που τελειώνουν σε 1. Σε κάποια άλλη υπάρχει ξεχωριστός πληθυντικός για τις ποσότητες που τελειώνουν σε 4.. και άλλα τέτοια. Επομένως για να φτιάξουμε το τέλειο πρόγραμμα πρέπει να δώσουμε χώρο για όλες αυτές τις περιπτώσεις.

Το gettext είναι μια GNU προσπάθεια που δίνει λύσεις σε όλα αυτά τα θέματα. Υπάρχουν αρκετές περιπλοκές στις οποίες το gettext δίνει λύσεις αλλά και formats για αρχεία γλωσσών. Όσοι ενδιαφέρεστε μελετήστε την επίσημη σελίδα, αλλά και τις προσεγγίσεις που γίνονται σε PHP από μεγάλα CMS όπως WordPress, Joomla και Drupal. Από αυτά που θα δείτε δεν είναι όλες οι προσεγγίσεις σωστές, αλλά μπορούν να σας δώσουν πρακτικές απαντήσεις στο πως πρέπει να πλησιάσει κανείς το θέμα από πλευράς κώδικα.

---

Το θέμα είναι πολύ μεγάλο και ενδιαφέρον. Όσοι έχετε διορθώσεις και προσθέσεις σε όλα αυτά, πέστε τα για να μαζέψουμε και να έχουμε μια ποιο ξεκάθαρη εικόνα.

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από vassilism » 10 Ιαν 2008 18:28

Συγχαρητήρια, πολύ ενδιαφέρον και κατατοπιστικό. :clap:
Ελπίζω κάποια στιγμή να δούμε κάποιο βοήθημα όσον αφορά τα πολύγλωσσα site με php.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Internationalization - Localization (i18n - l10n)

Δημοσίευση από skeftomilos » 10 Ιαν 2008 20:05

Άπαιχτο βοήθημα. Για όσους δεν κατάλαβαν, το locale για τα Πορτογαλέζικα τις Ελλάδας είναι pt-GR (0-1). :-)

zeppos
Δημοσιεύσεις: 431
Εγγραφή: 26 Μαρ 2006 10:43
Τοποθεσία: Kyklades
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από zeppos » 10 Ιαν 2008 20:13

ΣΥΓΧΑΡΗΤΗΡΙΑ!! Μεγάλη βοήθεια!

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cherouvim » 10 Ιαν 2008 20:14


Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 10 Ιαν 2008 22:23

Να στε καλά παιδιά! :)
Αλλά πραγματικά πιστεύω οτι υπάρχει πολύ βάθος στο θέμα. Θυμάμαι πχ κάποια πράγματα που έλεγε ο cherouvim για τα accept languages των textareas.. ένα σωρό πράγματα που κυκλοφορούνε για βάσεις δεδομένων και άλλα.

---

Ένα scriptάκι που μπορεί κανείς να τρέξει για να δει αν ένα κείμενο περιέχει Ελληνικούς utf-8 χαρακτήρες είναι αυτό:

Κώδικας: Επιλογή όλων

function has_utf8_chars&#40;$text&#41;
&#123;
    for &#40;$i = 0, $len = strlen&#40;$text&#41; - 1; $i < $len; $i++&#41;
        if &#40;&#40;ord&#40;$text&#123;$i&#125;&#41; & 0xC0&#41; && &#40;ord&#40;$text&#123;$i + 1&#125;&#41; & 0x80&#41;
            return TRUE;

    return FALSE;
&#125;
---

Για όσους δεν το ξέρετε, έχω φτιάξει ένα website, το webatic γεμάτο με αυτοματισμούς για web developers. Κάποια utilites έχουν άμεση σχέση με αυτά που λέμε εδω. Για παράδειγμα αν έχεις κάποιο εντελώς παράξενο string μπορείς να το βάλεις στο charset decoder και αυτό σε βοηθάει να δεις με τι charset είναι φτιαγμένο και μάλιστα τι encoding έχει. Πχ.. base64, url, quoted printable.

---
vassilism έγραψε:Ελπίζω κάποια στιγμή να δούμε κάποιο βοήθημα όσον αφορά τα πολύγλωσσα site με php.
Εννοείς τρόπο αρχειοθέτησης γλωσσών;

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από vassilism » 10 Ιαν 2008 22:41

Αυτό ακριβώς :D

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 11 Ιαν 2008 21:25

Βασίλη το θέμα της οργάνωσης είναι τέχνη, με την έννοια οτι υπάρχουν παραπάνω από ένας τρόπος να το κάνεις.

Αν πρόκειται για στατικό site μπορείς είτε να έχεις εντελώς ξεχωριστά directories για την κάθε γλώσσα.. πχ..
http://www.example.com/el/page.html -- για Ελληνικά
http://www.example.com/en/page.html -- για Αγγλικά

ή να έχεις διαφορετικά αρχεία με παρόμοια filenames
http://www.example.com/page_el.html -- για Ελληνικά
http://www.example.com/page_en.html -- για Αγγλικά

Αν το site είναι δυναμικό μπορείς να έχεις ξεχωριστά αρχεία στα οποία να κρατάς τα language resources. Δες από το πρώτο post το τελευταίο μέρος για το gettext. Η οργάνωση τους πάλι μπορεί να γίνει με πολλούς τρόπους

Μπορείς για παράδειγμα να κάνεις κλώνους του directory tree μια φορά για κάθε γλώσσα. Για παράδειγμα πες οτι έχεις τα
http://www.example.com/pageA.php
http://www.example.com/dir1/pageB.php
http://www.example.com/dir2/pageC.php

Θα μπορούσες να έχεις δύο κλώνους για δύο γλώσσες:
http://www.example.com/languages/el/pageA.php
http://www.example.com/languages/el/dir1/pageB.php
http://www.example.com/languages/el/dir2/pageC.php

http://www.example.com/languages/en/pageA.php
http://www.example.com/languages/en/dir1/pageB.php
http://www.example.com/languages/en/dir2/pageC.php


Αν δουλεύεις με κάποιο πρόγραμμα με modules, plugins τότε υπάρχουν κι άλλες λύσεις. Σε τέτοιες περιπτώσεις τα plugins κρατιούνται σε κάποια directories και η κλήση γίνεται με μπερδεμένους τρόπους είτε μέσω GET variables είτε με mod_rewrite. Σε τέτοια περίπτωση αν για παράδειγμα έχεις ένα plugin που λέγεται "myplugin" θα μπορούσες να έχεις language files του τύπου:

http://www.example.com/languages/el/myplugin.php

http://www.example.com/languages/en/myplugin.php


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


Το σημαντικό κατά την γνώμη μου είναι ό,τι κι αν κάνεις να προσέξεις να μην μπερδέψεις τα search engines. Τα search engines δένουν μια σελίδα από το URI (URL + query string). Μην κάνεις κάτι που να έχεις πολλές γλώσσες πάνω στην ίδια ακριβώς σελίδα. Ένα παράδειγμα προς αποφυγή είναι πχ μια σελίδα http://www.example.com/arthro.php η οποία προσπαθεί να μαντέψει τι γλώσσα μιλάς και να σου παρουσιάσει το περιεχόμενο στην γλώσσα σου. Το σωστό πιστεύω οτι είναι να σου κάνει ένα redirect σε ένα καλό URI.

Πες για παράδειγμα οτι το http://www.example.com/arthro.php είναι γραμμένο κυρίως για ξένους. Παρουσίασε μόνο το Αγγλικό κείμενο εκεί. Αν το πρόγραμμα σου αποφασίσει οτι πρέπει να βγεί το Ελληνικό κείμενο ας κάνει redirect στο http://www.example.com/arthro.php?lang=el

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από vassilism » 13 Ιαν 2008 12:28

Πιστεύω πως αυτό είναι ένα θέμα το οποίο μπορεί να πάρει πολύ συζήτηση και διαπληκτισμούς, όσον αφορά «τι είναι καλύτερο» .

Εννοείτε ότι μιλάμε για δυναμικά site με πάνω από δυο γλώσσες και καταχωρήσεις διαφορετικών γλωσσών στην βάση δεδομένων.

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

Σχετικά με ένα βιβλίο που διαβάζω τον τελευταίο καιρό, ΄PHP, MySQL και Apache΄ της Julie C. Meloni (το οποίο και συστήνω σε όσους ξεκινούν με αυτήν την γλώσσα), περιέχει έναν τρόπο δημιουργίας ενός δυναμικού site, το οποίο υποστηρίζει πολλαπλές γλώσσες.

Η λογική έχει ως εξής:
1. Ένα κύριο αρχείο για την αποστολή συγκεκριμένων ως προς τη χώρα πληροφοριών κεφαλίδας.
2. Ένα αρχείο για εμφάνιση των πληροφοριών με βάση την επιλεγμένη χώρα.

Το αρχείο για εμφάνιση των πληροφοριών με βάση την επιλεγμένη χώρα περιέχει μια switch.

Κώδικας: Επιλογή όλων

defineStrings&#40;&#41;&#123;
case "gr"&#58;
define&#40;"WELCOME_TXT","Καλοσορίσατε"&#41;;
break;
case "en"&#58;
define&#40;"WELCOME_TXT","Welcome"&#41;;
break;
&#125;
Φυσικά αυτό δεν έχει να κάνει με αρχειοθέτηση, απλά είναι ένας τρόπος κατασκευής site, τα οποία υποστηρίζουν πολλαπλές γλώσσες.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 13 Ιαν 2008 12:46

Όπου σκοτωμός κι ο cpulse μέσα :evil: :D

Εγώ πάλι πιστεύω οτι είναι τέχνη το θέμα. Ο καθένας κάνει ό,τι τον βολεύει περισσότερο στις συγκεκριμένες συνθήκες του κάθε project.

Οι γενικές γραμμές που κρατάω για εμένα είναι η δυνατότητα να μπορεί να μπεί και να βγεί μια γλώσσα. Να μπορέσεις δηλαδή να απομονώσεις τα αρχεία μιας γλώσσας για να πάνε στον μεταφραστή σαν ενότητα. Ο κώδικας με το switch που έχεις, τις έχει όλες μαζεμένες. Επομένως με τον δικό μου τρόπο σκέψης είναι κακή επιλογή.

Πάντως από την μέχρι τώρα εμπειρία ξέρω οτι μπορούν τα αρχεία να συμπτυχθούν σε μεγάλο βαθμό γιατί υπάρχουν λέξεις που χρησιμοποιούνται συνεχώς. Όμως κάθε σελίδα μπορεί να έχει και δικά της κείμενα, άρα όλο και κάποιος λόγος βρίσκεται για να έχεις πολλά αρχεία.

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1950
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από vassilism » 13 Ιαν 2008 13:03

Δηλαδή έχεις π.χ 15 αρχεία που είναι στα αγγλικά και άλλα 15 (τα ίδια αρχεία) που είναι στα Ελληνικά, τα οποία τα βάζεις σε διαφορετικούς φακέλους.
Σωστά ή κάνω λάθος?

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cherouvim » 13 Ιαν 2008 13:47

cpulse έγραψε:...Το σωστό πιστεύω οτι είναι να σου κάνει ένα redirect σε ένα καλό URI.
...Αν το πρόγραμμα σου αποφασίσει οτι πρέπει να βγεί το Ελληνικό κείμενο ας κάνει redirect στο http://www.example.com/arthro.php?lang=el
Σωστό!

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 13 Ιαν 2008 21:35

vassilism έγραψε:Δηλαδή έχεις π.χ 15 αρχεία που είναι στα αγγλικά και άλλα 15 (τα ίδια αρχεία) που είναι στα Ελληνικά, τα οποία τα βάζεις σε διαφορετικούς φακέλους.
Σωστά ή κάνω λάθος?
Ναι, θα μπορούσε να είναι κι έτσι. Σου ξαναλέω.. το έξυπνο είναι να προσαρμοζόμαστε στις εκάστοτε συνθήκες. Για παράδειγμα αν ένα κομμάτι του site έχει πολλά control panels τότε θα ήταν καλό να φτιαχτεί ένα ξεχωριστό αρχείο όχι για την κάθε σελίδα αλλά για τα panels με λέξεις όπως.. "Εφαρμογή", "Ακύρωση", "Συνέχεια", "Επόμενο", "Προηγούμενο" κτλ.

stavroch
Δημοσιεύσεις: 45
Εγγραφή: 13 Απρ 2009 13:49

Internationalization - Localization (i18n - l10n)

Δημοσίευση από stavroch » 13 Μάιος 2011 11:19

Πως μπορώ να ενεργοποιήσω την multibyte string functions στον server;

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Internationalization - Localization (i18n - l10n)

Δημοσίευση από cpulse » 13 Μάιος 2011 15:00

Εσύ δεν μπορείς. Μπορείς όμως να παρακαλέσεις πολύ ευγενικά τον server administrator :)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες