2009-07-28 34 views
5

我一直听说gettext - 我知道这是某种unix命令,根据提供的字符串参数来查找翻译,然后生成一个.pot文件,但有人可能会以通俗的语言向我解释这是如何处理的在Web框架中?使用gettext在PHP中添加对i18n的支持?

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

回答

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一个很好的教程

+0

但上面PHP手册示例似乎没有翻译给定的字符串。这个例子还有什么别的吗? – 2017-09-08 06:28:08