PHP中的国际化(i18n):gettext库与现代方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的国际化(i18n):从基础到现代解决方案



国际化(i18n)是设计软件的过程,使其能够在不修改代码的情况下轻松适应不同的语言和地区。PHP中有多种实现i18n的方法,从内置函数到强大的库。本文将介绍主要工具和最佳实践。



为什么需要国际化?

i18n的主要目标是将界面文本与代码分离。这可以实现:

  • 无需更改应用逻辑即可添加新语言
  • 支持多种区域设置(日期、数字、货币格式)
  • 简化翻译人员的工作流程
  • 遵守地区标准(例如电话号码格式)


内置支持:gettext

PHP提供了强大的gettext机制来处理翻译。这是大多数Linux系统中使用的经典方法。



安装与配置

确保已安装gettext扩展。在大多数Linux发行版中,它默认可用。对于Windows,可能需要在php.ini中启用php_gettext.dll。



创建翻译文件

首先创建区域设置目录。典型结构如下:

locale/  ru_RU/    LC_MESSAGES/      messages.po      messages.mo  en_US/    LC_MESSAGES/      messages.po      messages.mo


.po(Portable Object)文件是包含翻译的文本文件。以下是俄语messages.po文件的内容示例:

msgid "Welcome"msgstr "Добро пожаловать"

msgid "Hello, %s!"msgstr "Здравствуйте, %s!"


使用msgfmt工具将.po编译为二进制.mo文件:

msgfmt locale/ru_RU/LC_MESSAGES/messages.po -o locale/ru_RU/LC_MESSAGES/messages.mo


在代码中使用

使用gettext的PHP脚本示例:

<?php// 设置区域设置和域$locale = 'ru_RU';putenv("LANG=$locale");setlocale(LC_ALL, $locale);bindtextdomain('messages', __DIR__ . '/locale');textdomain('messages');

// 字符串翻译echo gettext('Welcome'); // 输出 "Добро пожаловать"echo _('Hello, %s!', 'Иван'); // 输出 "Здравствуйте, Иван!"?>


_()函数是gettext()的简写。对于带占位符的翻译,请使用sprintf():

echo sprintf(_('Hello, %s!'), $username);


现代方法:symfony/translation

对于大型项目,使用symfony/translation库更为方便。它提供了更灵活的接口,支持多种格式(YAML、XLIFF、JSON),并且易于与框架集成。



通过Composer安装

composer require symfony/translation


使用示例

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use Symfony\\Component\\Translation\\Translator;use Symfony\\Component\\Translation\\Loader\\ArrayLoader;

$translator = new Translator('ru_RU');$translator->addLoader('array', new ArrayLoader());

// 直接添加翻译(用于演示)$translator->addResource('array', [ 'Welcome' => 'Добро пожаловать', 'Hello %name%' => 'Здравствуйте, %name%',], 'ru_RU');

// 切换到英语$translator->setLocale('en_US');$translator->addResource('array', [ 'Welcome' => 'Welcome', 'Hello %name%' => 'Hello, %name%',], 'en_US');

// 使用echo $translator->trans('Welcome'); // "Welcome"echo $translator->trans('Hello %name%', ['%name%' => 'John']); // "Hello, John"?>


使用YAML文件

创建messages.ru.yaml文件:

推荐