PHP Internationalization (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 решения, като разширението gettext на PHP или локализационните компоненти, които предлагат фреймуърковете.
- Последователност на превода: За да гарантирате консистентност на имената на брандове и терминологията във всички езикови версии, силно препоръчваме да използвате функцията Glossary на O.Translator.
- Стратегия на високо ниво: Тази статия се фокусира върху техническата реализация. Ако искате да научите повече за общата стратегия за интернационализация на уебсайтове, можете да прочетете и другата ни подробна статия.