gettextライブラリ多言語国際化2
通常、人々はプログラムを書くときに文字をプログラムに書いて死んでいます.例えば、echo「Hello World!」などです.もしその国の言語に変えて、国際化のプログラムを書くならば、一つ一つ開いて修正しなければならなくて、プログラムは比較的に短い時間でまあまあで、もしプログラムが万以上あるならば、変えるのはそんなに簡単ではありません.最近i 18 nの標準化に伴い、PHPでどのように国際化サポートを実現するかについてもお話しします.他のプログラム言語と同様に、PHPでも利用できgettextスイートでi 18 nプログラムを書くことができ、NLS(Native Language Support)の国際化サポートを実現することができる.
実装プロセス:プログラム設計者はプログラムコードに表示する情報を書き込み、プログラムを実行するときにプログラム設計者が書いた情報を直接表示するのではなく、設定した言語系の情報ファイルを探します.見つからない場合は、プログラムコードの情報が表示されます.
一、インストール設定gettextスイート:windowsシステム:1、phpを開く.iniファイル、extension=php_を検索gettext.dll、前の「;」を取り除く2、保存してrestart server.
すべてがうまくいけばphpinfo()にgettextという文字が表示され、これで設定済みです.
二、php_gettext.dllキットにはいくつかの手紙がありますが、具体的には関連するmanualを見てください.ここでは3つの式を覚えておくだけでいいです.以下のようにします.
string bindtextdomain ( string domain, string directory) string textdomain ( string text_domain) string gettext ( string message)
2,php-gettextの使用.具体例で説明する
Debianシリーズのlinuxユーザーの場合は、ローカル言語サポートの表示に注意してください.vim/usr/share/i18n/SUPPORTED
日文:zh_CN.UTF-8
英語:en_US.UTF-8
ドイツ:de_DE.UTF-8
フランス語:fr_FR.UTF-8
ない場合は、それに対応してインストールします.方法:sudo apt-get locale-gen zh_CN.UTF-8
phpプログラムではgettext()を使用して翻訳が必要な言語パッケージをマークできます.gettext()関数はよく使われます.()代替;
2.1ファイルディレクトリの作成
mkdir gettext
cd gettext
touch Locale.php
touch test.php
//中国語moファイルの場所
mkdir -p Locale/zh_CN/LC_MESSAGES
//英文moファイルの場所.
mkdir -p Locale/en_US/LC_MESSAGES
編集ツールについては、poファイル自体がテキストファイルであるため、どのテキストエディタでも使用できます.poファイルを専門に編集しているpoEditまたはお気に入りのviまたはpoEdit、EditPlus、UltraEdit、vimまたは使用することをお勧めします.漢化moファイルに必要なツールはgettextと呼ばれhttp://gnuwin32.sourceforge.net/packages/gettext.htmダウンロードしてインストールし、実行します:msgunfmt.exe d:\english.mo -o d:\english.po対english.Po編集、翻訳を行い、完了後に実行する:msgfmt.exe -o d:\chinese.mo d:\english.Poそしてコンパイルは完了しました.moファイル.
AccountSections.php
_('Could not retrieve the requested section please try again.');
moファイルでの対応:
#: AccountSections.php:187 msgid "Could not retrieve the requested section please try again."//ページ呼び出しに対応するkey msgstr「要求されたカテゴリを取り戻すことができません.再試行してください」//表示文字
2.2 Locale.phpファイルコード
2.3試験用例
実装プロセス:プログラム設計者はプログラムコードに表示する情報を書き込み、プログラムを実行するときにプログラム設計者が書いた情報を直接表示するのではなく、設定した言語系の情報ファイルを探します.見つからない場合は、プログラムコードの情報が表示されます.
一、インストール設定gettextスイート:windowsシステム:1、phpを開く.iniファイル、extension=php_を検索gettext.dll、前の「;」を取り除く2、保存してrestart server.
すべてがうまくいけばphpinfo()にgettextという文字が表示され、これで設定済みです.
二、php_gettext.dllキットにはいくつかの手紙がありますが、具体的には関連するmanualを見てください.ここでは3つの式を覚えておくだけでいいです.以下のようにします.
string bindtextdomain ( string domain, string directory) string textdomain ( string text_domain) string gettext ( string message)
2,php-gettextの使用.具体例で説明する
Debianシリーズのlinuxユーザーの場合は、ローカル言語サポートの表示に注意してください.vim/usr/share/i18n/SUPPORTED
日文:zh_CN.UTF-8
英語:en_US.UTF-8
ドイツ:de_DE.UTF-8
フランス語:fr_FR.UTF-8
ない場合は、それに対応してインストールします.方法:sudo apt-get locale-gen zh_CN.UTF-8
phpプログラムではgettext()を使用して翻訳が必要な言語パッケージをマークできます.gettext()関数はよく使われます.()代替;
2.1ファイルディレクトリの作成
mkdir gettext
cd gettext
touch Locale.php
touch test.php
//中国語moファイルの場所
mkdir -p Locale/zh_CN/LC_MESSAGES
//英文moファイルの場所.
mkdir -p Locale/en_US/LC_MESSAGES
編集ツールについては、poファイル自体がテキストファイルであるため、どのテキストエディタでも使用できます.poファイルを専門に編集しているpoEditまたはお気に入りのviまたはpoEdit、EditPlus、UltraEdit、vimまたは使用することをお勧めします.漢化moファイルに必要なツールはgettextと呼ばれhttp://gnuwin32.sourceforge.net/packages/gettext.htmダウンロードしてインストールし、実行します:msgunfmt.exe d:\english.mo -o d:\english.po対english.Po編集、翻訳を行い、完了後に実行する:msgfmt.exe -o d:\chinese.mo d:\english.Poそしてコンパイルは完了しました.moファイル.
AccountSections.php
_('Could not retrieve the requested section please try again.');
moファイルでの対応:
#: AccountSections.php:187 msgid "Could not retrieve the requested section please try again."//ページ呼び出しに対応するkey msgstr「要求されたカテゴリを取り戻すことができません.再試行してください」//表示文字
2.2 Locale.phpファイルコード
<?php
/**
* Dh_Locale
*
* php-gettext .
* smarty. smarty-gettext . http://sourceforge.net/projects/smarty-gettext/
* php-gettext (ubuntu )
* 1 Installation of gettext package: sudo apt-get install php-gettext
* 2 Install locales: see all locales in the file vim /usr/share/i18n/SUPPORTED
* 3 ; : Locale/zh_CN/LC_MESSAGES Locale/en_US/LC_MESSAGES
* 4 smarty ( {t} {/t} )。 .c ; :php -q tsmarty2c.php $file > text.c
* 5 .po ;xgettext -o Dh.po --join-existing --omit-header --no-location text.c
* 6 .mo ;msgfmt Dh.po -o Dh.mo
* 7 mo Locale/en_US/LC_MESSAGES
*
* @package
* @version $id$
* @copyright 1997-2005 The PHP Group
* @author erhuok <[email protected]>
* @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt}
*/
class Dh_Locale {
/**
* _options
*
* $this->_options['lang'] .php-gettext .
* ubuntu sudo vim /usr/share/i18n/SUPPORTED utf8
* $this->_options['domain'] .mo .
*
* @var array
* @access protected
*/
protected $_options;
/**
* __construct
*
* @access public
* @return void
*/
public function __construct($lang=null) {
switch ( $lang ) {
case 'cn':
$this->_options = array('lang' => 'zh_CN.utf8','domain'=>'Dh');
break;
case 'en':
case 'us':
case 'eu':
$this->_options = array('lang' => 'en_US.utf8','domain'=>'Dh');
break;
case 'de':
$this->_options = array('lang' => 'de_DE.utf8','domain'=>'Dh');
break;
case 'fr':
$this->_options = array('lang' => 'fr_FR.utf8','domain'=>'Dh');
default:
$this->_options = array('lang' => 'zh_CN.utf8','domain'=>'Dh');
break;
}
$this->setApplicationLocale();
}
/**
* setOptions $this->_options
*
* @param mixed $options
* @access public
* @return void
*/
public function setOptions($options) {
if(!empty($options)) {
foreach ($options as $key => $option) {
$this->_options[$key] = $option;
}
}
}
/**
* setApplicationLocale
*
* @access public
* @return void
*/
public function setApplicationLocale() {
putenv('LANG='.$this->_options['lang']);
setlocale(LC_ALL,$this->_options['lang']);
bindtextdomain($this->_options['domain'],dirname(__FILE__).'/Locale/');
textdomain($this->_options['domain']);
bind_textdomain_codeset($this->_options['domain'],'UTF-8');
}
}
?>
2.3試験用例
<?php
require_once dirname(__FILE__).'/Locale.php';
//cn or en
$Lang = 'cn';
$Locale = new Dh_Locale($Lang);
$Checkout['AddressFields'] = array
(
'Email' => array
(
'Type' => 'text',
'Label' => _(' '),
'Title' => _(' '),
'Class' => 'required',
'Filter' => 'string',
),
'PostCode' => array
(
'Type' => 'text',
'Label' => _(' '),
'Title' => _(' '),
'Class' => 'required',
'Filter' => 'int',
),
);
echo '<pre>';print_r($Checkout);echo '</pre>';
?>