PHP интернационализация (i18n): практическо ръководство за разработчици

Yee
Aug 03, 2024

Изведете PHP уебсайта си на световно ниво: По-ефективно решение за интернационализация
Ако сте като мен и поддържате „vanilla“ PHP проекти, които не разчитат на големи фреймуърци (като Laravel или Symfony), тогава поддръжката на многоезичност (i18n) вероятно е била постоянна, макар и малка, болка.
Традиционното решение, gettext
, макар и мощно, е доста тромаво за конфигуриране. Особено при малки проекти, усеща се като „да използваш чук, за да счупиш орех“. Това, от което наистина се нуждаем, е метод, който може да се внедри бързо, без да въвежда излишна сложност.
След много проби и грешки в няколко проекта, разработихме леко решение за интернационализация, базирано на PHP масиви и онлайн инструменти за превод. Този подход не само е лесен за внедряване, но и има изключително ниски разходи за поддръжка. Днес споделям цялото това решение с вас, без никакви условия.
Практическо ръководство: Как постигнах многоезичност в PHP с O.Translator
Основната ни идея е съвсем проста: Всеки език отговаря на PHP файл, който съдържа return
израз, връщащ асоциативен масив. Този метод е лесен, интуитивен и с минимално влияние върху производителността.
Стъпка 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 масив, където ключовете са уникални идентификатори, а стойностите са съответните текстови низове.
Пример за lang.cn.php: Ключовете остават същите, стойностите се променят според езика
Стъпка 3: Влезте в ролята на магьосник по превод с O.Translator
Да превеждате ръчно десетки или стотици записи? Това е от онзи повтарящ се тип работа, която програмистите най-много мразят. Тук идва нашето тайно оръжие — O.Translator.
Това е професионална онлайн платформа за превод на документи, която напълно поддържа PHP файлове, позволявайки директно да прочете вашия масив и да го преведе на над 70 езика.
Процесът е изключително лесен:
- Посетете началната страница на O.Translator и качете основния си езиков файл (например
lang.cn.php
). - Изберете целевите езици, например английски и френски.
- Натиснете „Преведи“, изчакайте малко и вашите преведени файлове
lang.en.php
иlang.fr.php
ще бъдат готови.
Най-много ме впечатли, че O.Translator ви позволява да прегледате част от превода напълно безплатно. Ако сте доволни от резултатите, тогава можете да решите дали да платите за пълния превод. По техни думи: „Никога не плащайте за продукт, с който не сте доволни.“
Стъпка 4: Оживете кода
Всичко е готово; нужно е само последното докосване. Сега нека променим основния файл index.php
, така че да може динамично да зарежда подходящия езиков пакет според избора на потребителя.
<?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 шаблон след това лесно можете да извиквате текстовите низове по следния начин:
<!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>
И ето така—един прост многоезичен уебсайт е създаден!
Съображения и по-напредничави идеи
Въпреки че това решение е леко, има няколко неща, които си струва да обмислите, преди да го внедрите в продукционна среда:
- Как да открием езика на потребителя? Примерът използва GET параметър като
?lang=en
. В реално приложение можете също да използвате$_SESSION
,$_COOKIE
или да анализирате заглавката на браузъраAccept-Language
за автоматично откриване. - Съображения за производителността: За малки до средни уебсайтове натоварването от
require_once
на PHP файл при всяка заявка е пренебрежимо. Ако сайтът ви има голям трафик, помислете за използване на технологии за кеширане на байткод като APC или OPcache за допълнителна оптимизация. - Мащабируемост: С увеличаването на броя езици или текстови низове, ръчното управление на файловете може да стане сложно. В този момент може да се наложи да разгледате по-професионални i18n решения, като PHP разширението gettext или компонентите за локализация, предоставени от фреймуърковете.
- Последователност на превода: За да осигурите последователност на брандовите имена и терминологията във всички езикови версии, силно препоръчваме да използвате функцията Glossary на O.Translator.
- Стратегия на високо ниво: Тази статия се фокусира върху техническата реализация. Ако искате да научите повече за общата стратегия за интернационализация на уебсайтове, можете да прочетете и другата ни подробна статия.