2009-07-28 85 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