📜  使用 i18n 的翻译网站 - PHP (1)

📅  最后修改于: 2023-12-03 15:22:12.236000             🧑  作者: Mango

使用 i18n 的翻译网站 - PHP

什么是 i18n?

i18n(即国际化)可以使网站针对不同的语言、不同的地区、不同的文化,提供多语言支持和本地化服务。

常见的i18n工具有gettext、PHP的intl扩展等。

为什么需要 i18n?

在跨语言、跨国家的时候,网站需要提供多语言支持和本地化服务,以便更好地服务用户,提供更好的用户体验。

i18n 的实现方法

以下是使用 PHP + gettext 实现的多语言支持和本地化服务的步骤:

  1. 配置文件目录结构

在项目根目录下,创建一个名为 locales 的目录,用于存放所有翻译文件。

目录结构如下:

locales/
  ├─ en/
  │   └─ LC_MESSAGES/
  │        ├─ messages.mo
  │        └─ messages.po
  └─ zh/
      └─ LC_MESSAGES/
           ├─ messages.mo
           └─ messages.po

其中,enzh 分别代表英语和中文,messages.po 文件用于存放原始字符串,messages.mo 文件用于存放翻译后的字符串。每个语言需要分别一个目录,目录名与语言代码一致(如:英语为 en,中文为 zh

  1. 使用 gettext

在 PHP 中,使用 gettext 函数来进行字符串的翻译。

示例代码:

$language = 'en'; // 当前语言为英语
$domain = 'messages'; // 翻译文件名为 messages.mo
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain($domain, 'locales');
textdomain($domain);

echo _('Hello World!'); // 输出:Hello World!

上述代码中,putenvsetlocalebindtextdomaintextdomain 等函数用于设置 gettext 所使用的参数。

_ 函数是 gettext 提供的翻译函数,用于将原始字符串进行翻译。

  1. 翻译文件的生成和更新

我们使用 gettext 提供的命令行工具来生成和更新翻译文件。

首先,我们需要在项目根目录下执行以下命令:

xgettext -d messages --from-code=UTF-8 --keyword=translate --output=locales/template.pot --input=./app

该命令将会扫描 app 目录下的所有 PHP 文件,找到其中的 _ 函数调用,并将其收集到 locales/template.pot 文件中。

然后,我们需要将 locales/template.pot 文件复制一份并命名为 locales/{language}/LC_MESSAGES/messages.po(其中 {language} 为语言代码),并在其中进行翻译。

最后,我们需要将翻译后的 locales/{language}/LC_MESSAGES/messages.po 文件编译成二进制文件 locales/{language}/LC_MESSAGES/messages.mo

msgfmt locales/{language}/LC_MESSAGES/messages.po --output-file=locales/{language}/LC_MESSAGES/messages.mo
总结

通过以上步骤,我们可以轻松地为 PHP 程序实现多语言支持和本地化服务,提供更好的用户体验。