[PHP](译)ローカリゼーションの謎を解く: 誰でも使える Php-Intl

WBOY
リリース: 2016-06-20 12:28:07
オリジナル
976 人が閲覧しました

元のアドレス: 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 の例は、この点を示しています。この例では、情報がどのように表示されるかを次に示します。

  • (number_apples = 0) : リンゴはありません。
  • (number_apples = 1) : リンゴ 1 個。
  • (number_apples > 1) : 複数のリンゴ。

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}} 
ログイン後にコピー

  • データ : 値インデックス
  • 複数形 : イベントパラメーターの型
  • offsetValue : オプション ( offset:value )。値からオフセットを減算します。
  • =value{message}: 同等性をテストします。メッセージは中括弧内にあります。これを複数回繰り返すことができます ( =0{リンゴなし} =1{リンゴ 1 個} =2{リンゴ 2 個} )。
  • other{message}: switch - case ステートメントなどのデフォルトのケース。 # 記号を使用してデータ値を入力できます。

オプション

場合によっては、値の範囲ごとに異なる情報をリストする必要があります。たとえば、次の例:

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 的扩展功能来本地化我们的信息。接下来的部分会涉及格式化数字和日期,以及日历的使用。如果你对以上内容有任何疑惑,请给我们留言。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート