Internacjonalizacja PHP (i18n): praktyczny przewodnik dla programistów
Yee
Aug 03, 2024

Wypuść swoją stronę PHP w świat: prostszy sposób na internacjonalizację
Jeśli jesteś jak ja i utrzymujesz projekty PHP w wersji "vanilla", które nie korzystają z dużych frameworków (takich jak Laravel czy Symfony), to wsparcie dla wielu języków (i18n) pewnie było dla Ciebie stałym, choć drobnym, problemem.
Tradycyjne rozwiązanie, gettext, choć potężne, jest dość uciążliwe w konfiguracji. Zwłaszcza w małych projektach to trochę jak "strzelać z armaty do muchy". Tak naprawdę potrzebujemy metody, którą da się wdrożyć szybko i bez zbędnych komplikacji.
Po wielu próbach i błędach w różnych projektach opracowaliśmy lekkie rozwiązanie do internacjonalizacji oparte na plikach tablic PHP i internetowych narzędziach do tłumaczenia. To podejście jest nie tylko proste do wdrożenia, ale też praktycznie nie wymaga późniejszej obsługi. Dziś dzielę się z Tobą tym rozwiązaniem – bez żadnych haczyków.
Praktyczny przewodnik: Jak ogarnąłem wielojęzyczność w PHP dzięki O.Translator
Nasza główna idea jest bardzo prosta: Każdy język to osobny plik PHP, który zawiera instrukcję return zwracającą tablicę asocjacyjną. To rozwiązanie jest łatwe, intuicyjne i praktycznie nie obciąża wydajności.
Krok 1: Zaplanuj strukturę katalogów
Przejrzysta struktura katalogów to już połowa sukcesu. Żeby wszystko było uporządkowane, umieścimy wszystkie pliki językowe w jednym katalogu i nazwiemy je kodami języków, na przykład tak:
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
Krok 2: Stwórz swój „arsenał językowy”
Teraz tworzymy bazowy plik językowy. Weźmy chiński jako przykład i stwórzmy plik lang.cn.php. Zawartość pliku to prosta tablica PHP, gdzie kluczami są unikalne identyfikatory, a wartościami odpowiadające im teksty.
Przykład lang.cn.php: Klucze zostają te same, wartości zmieniają się w zależności od języka
Krok 3: Czas na czarodzieja tłumaczeń, O.Translator
Ręczne tłumaczenie dziesiątek czy setek wpisów? To właśnie ten rodzaj powtarzalnej pracy, której programiści nie znoszą. I tutaj wchodzi do gry nasza tajna broń — O.Translator.
To profesjonalna platforma do tłumaczenia dokumentów online, która świetnie obsługuje pliki PHP, pozwalając jej bezpośrednio czytać twoją tablicę i tłumaczyć ją na ponad 70 języków.
Proces jest absurdalnie prosty:
- Wejdź na stronę główną O.Translatora i wrzuć swój bazowy plik językowy (np.
lang.cn.php). - Wybierz języki docelowe, na przykład angielski i francuski.
- Kliknij „tłumacz”, poczekaj chwilę i Twoje przetłumaczone pliki
lang.en.phporazlang.fr.phpbędą gotowe.
To, co zrobiło na mnie największe wrażenie, to fakt, że O.Translator pozwala za darmo podejrzeć część tłumaczenia. Jeśli jesteś zadowolony z efektów, możesz wtedy zdecydować, czy chcesz zapłacić za pełne tłumaczenie. Jak sami mówią: „Nigdy nie płać za produkt, z którego nie jesteś zadowolony.”
Krok 4: Ożywiamy kod
Wszystko gotowe; potrzebujemy już tylko ostatniego szlifu. Teraz zmodyfikujmy główny plik index.php, żeby mógł dynamicznie ładować odpowiedni pakiet językowy w zależności od wyboru użytkownika.
<?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";
?>
W swoim szablonie HTML możesz teraz łatwo wywoływać teksty w taki sposób:
<!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>
I gotowe — powstała prosta, wielojęzyczna strona!
Kilka przemyśleń i bardziej zaawansowanych wskazówek
Chociaż to rozwiązanie jest lekkie, przed wdrożeniem na produkcję warto zwrócić uwagę na kilka kwestii:
- Jak wykryć język użytkownika? Przykład korzysta z parametru GET, takiego jak
?lang=en. W prawdziwej aplikacji możesz też użyć$_SESSION,$_COOKIEalbo przeanalizować nagłówekAccept-Languagez przeglądarki, żeby wykrywać język automatycznie. - Wydajność: Dla małych i średnich stron narzut wydajnościowy
require_oncedla pliku PHP przy każdym żądaniu jest praktycznie niezauważalny. Jeśli Twój serwis ma duży ruch, rozważ użycie technologii cache’owania bajtkodu, takich jak APC lub OPcache, żeby jeszcze bardziej zoptymalizować działanie. - Skalowalność: Gdy liczba języków lub tekstów rośnie, ręczne zarządzanie plikami może się skomplikować. Wtedy możesz już pomyśleć o bardziej profesjonalnych rozwiązaniach i18n, jak rozszerzenie gettext w PHP albo komponenty lokalizacyjne dostępne w frameworkach.
- Spójność tłumaczeń: Żeby nazwy marek i terminologia były takie same we wszystkich wersjach językowych, zdecydowanie warto korzystać z funkcji słownika w O.Translatorze (zobacz poradnik).
- Strategia ogólna: Ten artykuł skupia się na technicznej implementacji. Jeśli chcesz dowiedzieć się więcej o strategii internacjonalizacji stron, przeczytaj nasz inny, szczegółowy artykuł.
