PHP internacionalizace (i18n): Praktický průvodce pro vývojáře

more

Yee

Aug 03, 2024

cover-img

Vezmi svůj PHP web do světa: Efektivnější řešení pro internacionalizaci

Pokud jsi jako já a udržuješ „vanilla“ PHP projekty, které se nespoléhají na velké frameworky (jako Laravel nebo Symfony), pak podpora více jazyků (i18n) pro tebe byla asi vytrvalým, i když menším, bolehlavem.

Tradiční řešení, gettext, je sice silné, ale jeho nastavení je dost těžkopádné. Obzvlášť u malých projektů to působí jako „střílení z děla na vrabce“. Co opravdu potřebujeme, je metoda, kterou lze rychle nasadit bez zbytečné složitosti.

Po spoustě pokusů a omylů na různých projektech jsme vyvinuli lehké řešení internacionalizace založené na PHP array souborech a online překladových nástrojích. Tento přístup je nejen jednoduchý na nasazení, ale má i extrémně nízké náklady na údržbu. Dnes se s tebou o celé tohle řešení podělím, bez jakýchkoliv háčků.

Praktický návod: Jak jsem zvládl vícejazyčnou podporu v PHP s O.Translator

Naše hlavní myšlenka je úplně jednoduchá: Každý jazyk odpovídá jednomu PHP souboru, který obsahuje return příkaz vracející asociativní pole. Tahle metoda je snadná, intuitivní a má minimální dopad na výkon.

Krok 1: Naplánuj si strukturu složek

Přehledná struktura složek je půl úspěchu. Abychom měli ve věcech pořádek, dáme všechny jazykové soubory do jedné složky a pojmenujeme je podle jazykových kódů, třeba takto:

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: Vytvoř si svůj „jazykový arzenál“

Teď vytvoříme základní jazykový soubor. Jako příklad použijeme čínštinu a vytvoříme soubor lang.cn.php. Obsah souboru je jednoduché PHP pole, kde klíče jsou unikátní identifikátory a hodnoty odpovídající textové řetězce.

Příklad lang.cn.php: Klíče zůstávají stejné, hodnoty se mění podle jazyka

Krok 3: Vstup do překladatelského kouzla, O.Translator

Ruční překlad desítek nebo stovek položek? To je přesně ten typ opakující se práce, kterou programátoři nesnáší. A tady přichází na scénu naše tajná zbraň, O.Translator.

Je to profi online platforma na překlad dokumentů, která skvěle podporuje PHP soubory, takže umí přímo načíst tvoje pole a přeložit je do více než 70 jazyků.

Ten postup je fakt směšně jednoduchý:

  1. Navštiv domovskou stránku O.Translatoru a nahraj svůj základní jazykový soubor (například lang.cn.php).
  2. Vyber si cílové jazyky, třeba angličtinu a francouzštinu.
  3. Klikni na překlad, chvilku počkej a tvoje přeložené soubory lang.en.php a lang.fr.php budou připravené.

Co mě nejvíc zaujalo, je, že O.Translator ti umožní zdarma si prohlédnout část překladu. Pokud budeš s výsledkem spokojený, můžeš se pak rozhodnout, jestli si zaplatíš celý překlad. Jejich vlastními slovy: "Nikdy neplať za produkt, se kterým nejsi spokojený."

Krok 4: Oživ kód

Všechno je připravené; stačí už jen poslední úprava. Teď upravíme hlavní soubor index.php, aby mohl dynamicky načítat správný jazykový balíček podle výběru uživatele.

<?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";

?>

Ve své HTML šabloně pak můžeš jednoduše volat textové řetězce takto:

<!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>

A je to—jednoduchý vícejazyčný web je na světě!

Na co myslet a jak přemýšlet dál

I když je tohle řešení lehké, před nasazením do produkce je dobré zvážit pár věcí:

  • Jak zjistit jazyk uživatele? V příkladu se používá GET parametr jako ?lang=en. V reálné aplikaci můžeš použít i $_SESSION, $_COOKIE nebo automaticky detekovat jazyk z hlavičky prohlížeče Accept-Language.
  • Výkonnostní hlediska: U malých a středně velkých webů je režie require_once pro PHP soubor při každém požadavku zanedbatelná. Pokud máš web s velkou návštěvností, zvaž použití bytecode cache technologií jako APC nebo OPcache pro další optimalizaci.
  • Škálovatelnost: Jakmile začneš přidávat víc jazyků nebo textových řetězců, ruční správa souborů se může zkomplikovat. V tu chvíli se vyplatí podívat se po profesionálnějších i18n řešeních, třeba PHP's gettext extension nebo lokalizačních komponentech, které nabízejí frameworky.
  • Konzistence překladu: Aby byly názvy značek a terminologie ve všech jazykových verzích konzistentní, velmi doporučujeme používat funkci Slovník v O.Translatoru.
  • Strategie na vyšší úrovni: Tento článek se zaměřuje na technickou implementaci. Pokud se chceš dozvědět víc o celkové strategii internacionalizace webu, můžeš si přečíst náš další podrobný článek.

Téma

Scénář

Scénář

Publikované články11

Doporučené čtení