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

Yee
Aug 03, 2024

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ý:
- Navštiv domovskou stránku O.Translatoru a nahraj svůj základní jazykový soubor (například
lang.cn.php
). - Vyber si cílové jazyky, třeba angličtinu a francouzštinu.
- Klikni na překlad, chvilku počkej a tvoje přeložené soubory
lang.en.php
alang.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čeAccept-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.