使用gettext在PHP中添加对i18n的支持?

时间:2009-07-28 08:27:32

标签: php frameworks internationalization gettext

我一直都听说过gettext - 我知道这是基于提供的字符串参数查找翻译的某种unix命令,然后生成一个.pot文件,但是有人可以用外行的方式向我解释这是如何进行的关注网络框架?

我可能会考虑一些已建立的框架是如何做到的,但是外行人的解释会有所帮助,因为它可能有助于在我真正钻研事物以提供我自己的解决方案之前更清楚地了解图片。

1 个答案:

答案 0 :(得分:12)

gettext系统回应一组二进制文件中的字符串,这些二进制文件是从包含不同语言翻译的源文本文件创建的。

查找键是“基础”语言中的句子。

在您的源代码中,您将拥有类似

的内容
echo _("Hello, world!");

对于每种语言,您将拥有一个带有密钥和翻译版本的相应文本文件(注意可以与printf函数一起使用的%s)

french
msgid "Hello, world!"
msgstr "Salut, monde!"
msgid "My name is %s"
msgstr "Mon nom est %s"

italian
msgid "Hello, world!"
msgstr "Ciao, mondo!"
msgid "My name is %s"
msgstr "Il mio nome è %s"

这些是您创建本地化所需的主要步骤

  • 所有文本输出必须使用gettext函数(gettext(),ngettext(),_())
  • 使用xgettext(* nix)解析您的php文件并创建基本.po文本文件
  • 使用poedit将翻译文本添加到.po文件
  • 使用msgfmt(* nix)从.po文件
  • 创建二进制.mo文件
  • 将.mo文件放在像
  • 这样的目录结构中

区域设置/ de_DE这个/ LC_MESSAGES / myPHPApp.mo

区域设置/的en_EN / LC_MESSAGES / myPHPApp.mo

区域设置/ it_IT / LC_MESSAGES / myPHPApp.mo

然后你的php脚本必须设置需要使用的语言环境

php手册的例子非常清楚

<?php
// Set language to German
setlocale(LC_ALL, 'de_DE');

// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");

// Choose domain
textdomain("myPHPApp");

// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now

// Print a test message
echo gettext("Welcome to My PHP Application");

// Or use the alias _() for gettext()
echo _("Have a nice day");
?>

总是从php手册中查看here以获得一个好的教程