元のアドレス: https://www.sitepoint.com/localization-demystified- Understanding-php-intl/
ほとんどのアプリケーション実行サイトが認識可能テキスト、日付、タイムゾーンなどの処理などの操作。 PHP Intl 拡張機能は、よく知られた ICU ライブラリの関数に接続するための優れた API を提供します。
この拡張機能は、PHP 5.3 以降にデフォルトでインストールされます。次のコマンドで見つけることができます:
php -m | grep 'intl'
この拡張機能は存在しません。インストール ガイドに従って手動でインストールできます。 Ubuntu を使用している場合は、次のコマンドを使用して直接インストールできます:
sudoapt-getupdatesudoapt-getinstallphp5-intl
PHP 7 を使用している場合は、PPA (ppa:ondrej/php) を追加する必要があります。システムをアップグレードし、拡張機能 Intl をインストールします。
# 添加 PPAsudoadd-apt-repositoryppa:ondrej/php-7.0# 升级索引库sudoapt-getupdate# 安装扩展功能sudoapt-getinstallphp7.0-intl
最新のアプリケーションのほとんどは、ローカルな注意を念頭に置いて構築されています。メッセージは、変数プレースホルダーを含む単純な文字列である場合もあれば、複雑な多重化された文字列である場合もあります。
プレースホルダーを含むシンプルなメッセージから始めます。プレースホルダーは中括弧で囲まれた文字です。以下に例を示します。
var_dump( MessageFormatter::formatMessage( "en_US", "I have {0, number, integer} apples.", [ 3 ] )); // output string(16) "I have 3 apples."
フィードを MessageFormatter::formatMessage に渡すクラス関数は次のとおりです。
プレースホルダー {0,number,integer} は、データベース配列の最初の項目として数値 - 整数を入力します ( Takeオプションをリストした以下の表を見てください) プレースホルダーで名前付きパラメーターを使用することもできます。次の例では、同じ結果が出力されます。
var_dump( MessageFormatter::formatMessage( "en_US", "I have {number_apples, number, integer} apples.", [ 'number_apples' => 3 ] ));
アラビア語、インド語など、言語によって数字の書き方が異なります。
前の例は en_US 環境を指していましたが、ar 環境に切り替えて違いを見てみましょう。
var_dump( MessageFormatter::formatMessage( "ar", "I have {number_apples, number, integer} apples.", [ 'number_apples' => 3 ] )); string(17) "I have ٣ apples."
再びベンガル語のシナリオ ( bn ) に切り替えましょう。
var_dump( MessageFormatter::formatMessage( "bn", "I have {number_apples, number, integer} apples.", [ 'number_apples' => 3 ] )); string(18) "I have ৩ apples."
ここまでは数字のみを述べてきました。次に、使用できる他のタイプを見てみましょう。
$time = time();var_dump( MessageFormatter::formatMessage( "en_US", "Today is {0, date, full} - {0, time}", array( $time )) ); string(47) "Today is Wednesday, April 6, 2016 - 11:21:47 PM"
var_dump( MessageFormatter::formatMessage( "en_US", "duration: {0, duration}", array( $time )) ); string(23) "duration: 405,551:27:58"
分数も表現できます。
var_dump( MessageFormatter::formatMessage( "en_US", "I have {0, spellout} apples", array( 34 )) ); string(25) "I have thirty-four apples"
これは、さまざまなロケールでも機能します。
var_dump( MessageFormatter::formatMessage( "ar", "لدي {0, spellout} تفاحة", array( 34 )) ); string(44) "لدي أربعة و ثلاثون تفاحة"
アプリケーションのローカライズの重要な部分は、ユーザー インターフェイスを可能な限り直観的なものにするために多様な情報を管理することです。上の Apple の例は、この点を示しています。この例では、情報がどのように表示されるかを次に示します。
var_dump( MessageFormatter::formatMessage( "en_US", 'I have {number_apples, plural, =0{no apples} =1{one apple} other{# apples}}', array('number_apples' => 10)) );
// number_apples = 0string(16) "I have no apples" // number_apples = 1string(16) "I have one apple" // number_apples = 10string(16) "I have 10 apples"
この構文は非常にシンプルで簡単で、ほとんどのパッケージに含まれています。詳細については、このドキュメントを参照してください。
{data, plural, offsetValue =value{message}... other{message}}
場合によっては、値の範囲ごとに異なる情報をリストする必要があります。たとえば、次の例:
var_dump( MessageFormatter::formatMessage( "en_US", 'The value of {0,number} is {0, choice, 0 # between 0 and 19 | 20 # between 20 and 39 | 40 # between 40 and 59 | 60 # between 60 and 79 | 80 # between 80 and 100 | 100 < more than 100 }', array(60)) ); string(38) "The value of 60 is between 60 and 79 "
argType はここで選択できるように設定されており、構文は次のとおりです:
{value, choice, choiceStyle}
ICU ファイル の正式な定義は次のとおりです:
choiceStyle = numberseparatormessage ('|' numberseparatormessage)* number = normal_number | ['-'] ∞ (U+221E, infinity)normal_number = double value (unlocalizedASCIIstring) separator = less_than | less_than_or_equalless_than = '<'less_than_or_equal = '#' | ≤ (U+2264)
注: ICU 開発者は選択タイプの使用を推奨していません。
オプションの UI コンポーネントを選択する必要がある場合があります。プロフィール ページでは、このメソッドを使用して、ユーザーの性別などに基づいて UI 情報を更新します。以下に例を示します:
var_dump( MessageFormatter::formatMessage( "en_US", "{gender, select, ". "female {She has some apples} ". "male {He has some apples.}". "other {It has some apples.}". "}", array('gender' => 'female')) );string(19) "She has some apples"
パターンは次のように定義されます:
{value, select, selectStyle} // selectStyleselectValue {message} (selectValue {message})*
メッセージ フィードには、オプションなどの他のパターンが含まれます。と複数形。次のセクションでは、複数のパターンを組み合わせた例について説明します。
これまで、選択、多様化などの簡単な例を見てきました。しかし、多くの状況はさらに複雑です。 ICU のドキュメントには、これを説明する良い例が記載されています。理解を容易にするために、部分的に見てみましょう。
var_dump( MessageFormatter::formatMessage( "en_US", "{gender_of_host, select, ". "female {She has a party} ". "male {He has some apples.}". "other {He has some apples.}". "}", array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) );
これは前に使用したのと同じ例ですが、以前の単純な情報を使用する代わりに、num_guests 値に依存してカスタマイズしました (多様化の場合について説明します)。
var_dump( MessageFormatter::formatMessage( "en_US", "{gender_of_host, select, ". "female {". "{num_guests, plural, offset:1 ". "=0 {{host} does not have a party.}". "=1 {{host} invites {guest} to her party.}". "=2 {{host} invites {guest} and one other person to her party.}". "other {{host} invites {guest} and # other people to her party.}}}". "male {He has some apples.}". "other {He has some apples.}}", array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) );
num_guests からゲストを削除するには offset:1 を使用することに注意してください。
string(53) "Hanae invites Younes and 4 other people to her party."
以下は例の完全な段落です。
var_dump( MessageFormatter::formatMessage( "en_US", "{gender_of_host, select, ". "female {". "{num_guests, plural, offset:1 ". "=0 {{host} does not have a party.}". "=1 {{host} invites {guest} to her party.}". "=2 {{host} invites {guest} and one other person to her party.}". "other {{host} invites {guest} and # other people to her party.}}}". "male {". "{num_guests, plural, offset:1 ". "=0 {{host} does not have a party.}". "=1 {{host} invites {guest} to his party.}". "=2 {{host} invites {guest} and one other person to his party.}". "other {{host} invites {guest} and # other people to his party.}}}". "other {". "{num_guests, plural, offset:1 ". "=0 {{host} does not have a party.}". "=1 {{host} invites {guest} to their party.}". "=2 {{host} invites {guest} and one other person to their party.}". "other {{host} invites {guest} and # other people to their party.}}}}", array('gender_of_host' => 'female', "num_guests" => 5, 'host' => "Hanae", 'guest' => 'Younes' )) );
改变客人的数量来测试所有的信息类型:
// num_guests = 2string(55) "Hanae invites Younes and one other person to her party." // num_guests = 1string(34) "Hanae invites Younes to her party." // num_guests = 0string(28) "Hanae does not have a party."
对于解析信息没有太多可以说;我们使用之前的模式从输出信息中来格式化额外信息。
$messageFormater = new MessageFormatter("en_US", 'I have {0, number}');var_dump( $messageFormater->parse("I have 10 apples") ); array(1) { [0]=> int(10)}
查看 文档 以获取更多关于信息解析的内容。
在这篇介绍性的文章中,我们了解了使用 PHP Intel 的扩展功能来本地化我们的信息。接下来的部分会涉及格式化数字和日期,以及日历的使用。如果你对以上内容有任何疑惑,请给我们留言。