Internacjonalizacja PHP (i18n): praktyczny przewodnik dla programistów

more

Yee

Aug 03, 2024

cover-img

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 tu wkracza 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:

  1. Wejdź na stronę główną O.Translatora i wrzuć swój bazowy plik językowy (np. lang.cn.php).
  2. Wybierz języki docelowe, na przykład angielski i francuski.
  3. Kliknij „tłumacz”, poczekaj chwilę i Twoje przetłumaczone pliki lang.en.php oraz lang.fr.php bę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 proszę bardzo — tak powstaje 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, $_COOKIE albo przeanalizować nagłówek Accept-Language z przeglądarki, żeby wykrywać język automatycznie.
  • Wydajność: Dla małych i średnich stron narzut wydajnościowy require_once dla 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 warto rozważyć bardziej profesjonalne rozwiązania i18n, takie jak rozszerzenie gettext dla PHP albo komponenty lokalizacyjne dostępne w frameworkach.
  • Spójność tłumaczeń: Aby zapewnić spójność nazw marek i terminologii we wszystkich wersjach językowych, zdecydowanie polecamy korzystanie z funkcji Glosariusza w O.Translatorze.
  • Strategia ogólna: Ten artykuł skupia się na technicznej implementacji. Jeśli chcesz dowiedzieć się więcej o ogólnej strategii internacjonalizacji stron internetowych, zajrzyj do naszego innego, szczegółowego artykułu.

Temat

Scenariusz

Scenariusz

Opublikowane artykuły11

Polecane do przeczytania