PHP Διεθνοποίηση (i18n): Πρακτικός Οδηγός για Προγραμματιστές

Yee
Aug 03, 2024

Κάνε το PHP site σου παγκόσμιο: Μια πιο αποδοτική λύση για διεθνοποίηση
Αν είσαι σαν κι εμένα και συντηρείς "vanilla" PHP projects που δεν βασίζονται σε μεγάλα frameworks (όπως Laravel ή Symfony), τότε η υποστήριξη πολλαπλών γλωσσών (i18n) μάλλον ήταν πάντα ένα μικρό, αλλά επίμονο, αγκαθάκι.
Η παραδοσιακή λύση, το gettext
, αν και δυνατή, είναι αρκετά μπελαλίδικη στη ρύθμιση. Ειδικά σε μικρά projects, νιώθεις ότι "χρησιμοποιείς βαριοπούλα για να σπάσεις καρύδι." Αυτό που πραγματικά χρειαζόμαστε είναι μια μέθοδος που να υλοποιείται γρήγορα, χωρίς να φέρνει περιττή πολυπλοκότητα.
Μετά από πολύ πειραματισμό σε διάφορα projects, αναπτύξαμε μια ελαφριά λύση για διεθνοποίηση, βασισμένη σε PHP array αρχεία και online εργαλεία μετάφρασης. Αυτή η προσέγγιση δεν είναι μόνο απλή στην υλοποίηση, αλλά έχει και εξαιρετικά χαμηλό κόστος συντήρησης. Σήμερα, μοιράζομαι μαζί σου όλη αυτή τη λύση, χωρίς ψιλά γράμματα.
Οδηγός στην πράξη: Πώς πέτυχα την υποστήριξη πολλαπλών γλωσσών σε PHP με το O.Translator
Η βασική μας ιδέα είναι πολύ απλή: Κάθε γλώσσα αντιστοιχεί σε ένα PHP αρχείο, το οποίο περιέχει ένα return
statement που επιστρέφει έναν associative array. Αυτή η μέθοδος είναι απλή, κατανοητή και έχει ελάχιστο performance overhead.
Βήμα 1: Σχεδίασε τη δομή των φακέλων σου
Μια ξεκάθαρη δομή φακέλων είναι η μισή μάχη. Για να τα έχουμε όλα οργανωμένα, θα βάλουμε όλα τα αρχεία γλώσσας στον ίδιο φάκελο και θα τα ονομάσουμε με βάση τους κωδικούς γλώσσας, όπως αυτό:
project_root/
├── index.php // Your main logic file
├── i18n/ // Folder for all language files
│ ├── lang.cn.php // Chinese language pack
│ ├── lang.en.php // English language pack
│ └── lang.fr.php // French language pack
Βήμα 2: Δημιούργησε το "Οπλοστάσιο Γλωσσών" σου
Στη συνέχεια, δημιουργούμε το βασικό αρχείο γλώσσας. Ας χρησιμοποιήσουμε τα κινέζικα ως παράδειγμα και ας φτιάξουμε ένα αρχείο lang.cn.php
. Το περιεχόμενο του αρχείου είναι ένα απλό PHP array, όπου τα keys είναι μοναδικά αναγνωριστικά και οι τιμές είναι τα αντίστοιχα κείμενα.
Παράδειγμα lang.cn.php: Τα keys μένουν ίδια, οι τιμές αλλάζουν ανάλογα με τη γλώσσα
Βήμα 3: Μπες στον μάγο της μετάφρασης, το O.Translator
Να μεταφράζεις δεκάδες ή και εκατοντάδες εγγραφές με το χέρι; Αυτό είναι το είδος της επαναλαμβανόμενης δουλειάς που οι προγραμματιστές μισούν περισσότερο. Εδώ έρχεται το μυστικό μας όπλο, το O.Translator.
Είναι μια επαγγελματική online πλατφόρμα μετάφρασης εγγράφων που υποστηρίζει τέλεια τα PHP αρχεία, διαβάζει απευθείας το array σου και το μεταφράζει σε πάνω από 70 γλώσσες.
Η διαδικασία είναι απίστευτα απλή:
- Μπες στην αρχική σελίδα του O.Translator και ανέβασε το αρχείο της βασικής σου γλώσσας (π.χ.
lang.cn.php
). - Διάλεξε τις γλώσσες-στόχους σου, όπως Αγγλικά και Γαλλικά.
- Πάτα μετάφραση, περίμενε λίγο, και τα μεταφρασμένα αρχεία σου
lang.en.php
καιlang.fr.php
θα είναι έτοιμα για σένα.
Αυτό που με εντυπωσίασε περισσότερο είναι ότι το O.Translator σου επιτρέπει να προεπισκοπήσεις ένα μέρος της μετάφρασης δωρεάν. Αν μείνεις ικανοποιημένος με το αποτέλεσμα, τότε μπορείς να αποφασίσεις αν θα πληρώσεις για ολόκληρη τη μετάφραση. Με δικά τους λόγια: «Ποτέ μην πληρώνεις για ένα προϊόν με το οποίο δεν είσαι ευχαριστημένος.»
Βήμα 4: Δώσε ζωή στον κώδικα
Όλα είναι έτοιμα· το μόνο που μένει είναι η τελική πινελιά. Τώρα, ας τροποποιήσουμε το βασικό αρχείο index.php
ώστε να φορτώνει δυναμικά το κατάλληλο language pack ανάλογα με την επιλογή του χρήστη.
<?php
// 1. Determine the current language (using a GET parameter for demonstration)
$supported_langs = ['en', 'cn', 'fr'];
$default_lang = 'en';
$lang = isset($_GET['lang']) && in_array($_GET['lang'], $supported_langs) ? $_GET['lang'] : $default_lang;
// 2. Load the corresponding language file
// Use a global variable like $_ or a specific variable like $TEXTS to store the strings
$_ = require_once __DIR__ . "/i18n/lang.{$lang}.php";
?>
Στο HTML template σου, μπορείς πλέον εύκολα να καλείς τα text strings κάπως έτσι:
<!DOCTYPE html>
<html lang="<?php echo htmlspecialchars($lang); ?>">
<head>
<meta charset="UTF-8">
<title><?php echo htmlspecialchars($_['heading_home']); ?></title>
</head>
<body>
<header>
<h1><?php echo htmlspecialchars($_['heading_home']); ?></h1>
<nav>
<ul>
<li><?php echo htmlspecialchars($_['heading_about']); ?></li>
<li><?php echo htmlspecialchars($_['button_read_more']); ?></li>
</ul>
</nav>
</header>
</body>
</html>
Και να το λοιπόν—ένα απλό πολύγλωσσο site μόλις γεννήθηκε!
Σκέψεις και Προχωρημένη Σκέψη
Αν και αυτή η λύση είναι ελαφριά, υπάρχουν μερικά σημεία που αξίζει να σκεφτείς πριν τη βάλεις σε παραγωγή:
- Πώς να ανιχνεύσεις τη γλώσσα του χρήστη; Το παράδειγμα χρησιμοποιεί ένα GET parameter όπως το
?lang=en
. Σε μια πραγματική εφαρμογή, μπορείς επίσης να χρησιμοποιήσεις$_SESSION
,$_COOKIE
, ή να διαβάσεις τοAccept-Language
header του browser για αυτόματη ανίχνευση. - Θέματα Απόδοσης: Για μικρά ή μεσαία sites, το performance overhead του
require_once
για ένα PHP αρχείο σε κάθε request είναι αμελητέο. Αν το site σου έχει πολύ traffic, σκέψου να χρησιμοποιήσεις τεχνολογίες bytecode caching όπως το APC ή το OPcache για ακόμα καλύτερη απόδοση. - Επεκτασιμότητα: Όσο αυξάνονται οι γλώσσες ή τα strings, το manual management των αρχείων μπορεί να γίνει μπελάς. Σε εκείνο το σημείο, ίσως χρειαστεί να δεις πιο επαγγελματικές λύσεις i18n, όπως το PHP's gettext extension ή τα localization components που προσφέρουν τα frameworks.
- Συνεπής Μετάφραση: Για να διασφαλίσεις συνέπεια σε ονόματα brand και τεχνικούς όρους σε όλες τις γλώσσες, σου προτείνω να χρησιμοποιήσεις το Glossary feature του O.Translator.
- Στρατηγική σε υψηλό επίπεδο: Αυτό το άρθρο εστιάζει στην τεχνική υλοποίηση. Αν θέλεις να μάθεις περισσότερα για τη γενική στρατηγική διεθνοποίησης ιστοσελίδων, μπορείς να διαβάσεις και το άλλο μας αναλυτικό άρθρο.