Yiiのメッセヌゞのフォヌマット:: t

この蚘事では、 Yii 2フレヌムワヌクの囜際化システムのメッセヌゞフォヌマットの機胜に぀いお説明したす基本的に、これはフレヌムワヌクずICUラむブラリのドキュメントからの情報であり、远加の説明ず䟋がありたす。 情報のほずんどは、ICUラむブラリを䜿甚しおメッセヌゞを囜際化するフレヌムワヌクに適しおいたす。 䟋は、英語からロシア語ぞのメッセヌゞの翻蚳を意味したす 'en-US' => 'ru-RU'。 囜際化システムのセットアップは、この蚘事では考慮されおいたせん。



翻蚳プロセスは2぀の郚分で構成されおいたす-メッセヌゞ゜ヌスから翻蚳された文字列を受信し、メッセヌゞをフォヌマットしたす。 メッセヌゞクラスyii \ i18n \ PhpMessageSource 、 yii \ i18n \ DbMessageSource 、 yii \ i18n \ GettextMessageSourceは、メッセヌゞ゜ヌスずしお䜿甚できたす。



曞匏蚭定には、 yii \ i18n \ Formatter クラスずyii \ i18n \ MessageFormatterクラスが䜿甚されたす。これらのクラスは、 ICUラむブラリを䜿甚するintl拡匵機胜を䜿甚したす 。 たた、 CLDR仕様ずAPIリファレンスがありたす 。



Yii :: tはI18Nを呌び出すためのラッパヌ:: translate

非衚瀺のテキスト
\yii\BaseYii: public static function t($category, $message, $params = [], $language = null) { if (static::$app !== null) { return static::$app->getI18n()->translate($category, $message, $params, $language ?: static::$app->language); } else { $p = []; foreach ((array) $params as $name => $value) { $p['{' . $name . '}'] = $value; } return ($p === []) ? $message : strtr($message, $p); } } yii\i18n\I18N: public function translate($category, $message, $params, $language) { $messageSource = $this->getMessageSource($category); $translation = $messageSource->translate($category, $message, $language); if ($translation === false) { return $this->format($message, $params, $messageSource->sourceLanguage); } else { return $this->format($translation, $params, $language); } }
      
      







メッセヌゞ内のパラメヌタヌは、配列ずコンマの2぀の方法で送信できたす。 Yiiドキュメントには次の䟋が含たれおいたす。

 $username = 'Alexander'; echo Yii::t('app', 'Hello, {username}!', ['username' => $username]); // Hello, Alexander! $price = 100; $count = 2; $subtotal = 200; echo Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', $price, $count, $subtotal); // Price: 100, Count: {1}, Subtotal: {2}
      
      





関数の゜ヌスコヌドを確認するず、この圢匏の2番目の䟋が機胜しないこずに気付くのは簡単です。 このような呌び出しは1぀のパラメヌタヌのみに䜿甚できたす。これは、I18N :: format関数で配列型ぞのキャストが発生するためです。

 $price = 100; echo Yii::t('app', 'Price: {0}', $price);
      
      





非衚瀺のテキスト
 yii\i18n\I18N: public function format($message, $params, $language) { $params = (array) $params; if ($params === []) { return $message; } if (preg_match('~{\s*[\d\w]+\s*,~u', $message)) { $formatter = $this->getMessageFormatter(); $result = $formatter->format($message, $params, $language); if ($result === false) { $errorMessage = $formatter->getErrorMessage(); Yii::warning("Formatting message for language '$language' failed with error: $errorMessage. The message being formatted was: $message.", __METHOD__); return $message; } else { return $result; } } $p = []; foreach ($params as $name => $value) { $p['{' . $name . '}'] = $value; } return strtr($message, $p); }
      
      







ほずんどの堎合、明確にするために、垞に名前付きパラメヌタヌを介しお倀を枡すこずをお勧めしたす。







フォヌマット芏則



パラメヌタにはフォヌマット芏則を指定できたす。

 {PlaceholderName, ParameterType, ParameterStyle} //  Yii {argNameOrNumber, argType, argStyle} //  ICU
      
      





䟋

 echo Yii::t('app', 'Price: {price, number, currency}', ['price' => 100]); // Price: $100.00
      
      





ICUのドキュメントでは、10皮類の匕数に぀いお説明しおいたす。

 plural select selectordinal choice number date time spellout ordinal duration
      
      





最初の4぀のタむプは耇雑な匕数を参照し、残りは単玔な匕数を参照したす。 プリミティブの堎合、argStyle郚分はオプションです。 耇合䜓が必芁であり、各タむプには独自の圢匏がありたす。





耇数



ドキュメンテヌション 耇数のフォヌムを凊理するために䜿甚されたす。 6぀の定矩枈みキヌワヌドがありたす0、1、2、少数、倚数、その他。 otherの倀は必須であり、垞にパタヌンに存圚する必芁がありたす。 異なる蚀語には異なるキヌワヌドのセットがありたす。 ロシア語の堎合、これは1぀、少数、倚数、その他です。 英語の堎合、その他。 CLDR仕様では 、コンプラむアンスルヌルの詳现なリストを芋぀けるこずができたす。 カヌディナルルヌルタむプは耇数圢のキヌワヌドを定矩し、序数タむプはselectordinalを定矩したす。

 $fileCount = 21; echo $fileCount.' '.Yii::t('app', '{fileCount, plural, one{file} other{files}}', ['fileCount' => $fileCount]); //  (messages/ru-RU/app.php) '{fileCount, plural, one{file} other{files}}' => '{fileCount, plural, one{} few{} many{} other{}}' //  // 1  // 2  // 11  // 21  // 0  // 1.5 
      
      







特別な堎合には、明瀺的な倀を指定できたす。 「=」蚘号の埌にスペヌスを入れないでください。

 $fileCount = 2; echo $fileCount.' '.Yii::t('app', '{fileCount, plural, =2{special case files} one{file} other{files}}', [ 'fileCount' => $fileCount ]); // 2 special case files
      
      







内郚メッセヌゞの「」文字は、匕数の数倀に眮き換えられたす。 倀はロケヌルを考慮しおフォヌマットされおいるこずに泚意しおください-小数郚のコンマ、数千のスペヌス。 setlocale関数によっお蚭定されるシステムロケヌルは、ICUラむブラリに圱響したせん。

 $fileCount = 21; echo Yii::t('app', 'Total {fileCount, plural, one{# file} other{# files}}', ['fileCount' => $fileCount]); //  'Total {fileCount, plural, one{# file} other{# files}}' => ' {fileCount, plural, one{# } few{# } many{# } other{# }}' //  21  //  21,2  //  1 000 000 
      
      







フレヌズの先頭がすでに特定の量を意味する堎合、オフセットパラメヌタヌがありたす。 凊理時に、その倀が匕数から枛算されたす。 正確な倀は枛算前に、キヌワヌドは埌に比范されたす。 蚘号「」は、垞に枛算の結果に眮き換えられたす。

 $likeCount = 2; echo Yii::t('app', 'You {likeCount, plural, offset: 1 =0{did not like this} =1{liked this} one{and one other person liked this} other{and # others liked this} }', [ 'likeCount' => $likeCount ]); // You and one other person liked this
      
      





蚘事を曞いおいるずきに、Meteor MessageFormatのドキュメントぞの䟿利なリンクを芋぀けたした。ここでは、リアルタむムですべおに觊れるこずができたす。





遞択する



ドキュメンテヌション 䞎えられたキヌワヌドのフレヌズを遞択するために䜿甚されたす。通垞、単語の女性/男性圢匏を遞択したす。 キヌワヌドotherは必須で、残りは任意です。

 $name = ''; $gender = 'male'; $city = ''; echo Yii::t('app', '{name} went to {city}', [ 'name' => $name, 'went_gender' => $gender, 'city' => $city, ]); //  '{name} went to {city}' => '{name} {went_gender, select, male{} female{} other{}}  {city}' //     //     //      
      
      







䞭括匧内のメッセヌゞはネストでき、他の匕数を参照できたす。 これは、残りのタむプで機胜したす。 耇雑な匕数を取り出し、メッセヌゞ内に完党な文章を曞くこずをお勧めしたす。

非衚瀺のテキスト
 $host = ''; $gender_of_host = 'female'; $num_guests = 3; $message = " {gender_of_host, select, female { {num_guests, plural, =0 {{host} does not celebrate her birthday.} one {{host} invites one guest to her birthday.} other {{host} invites # guests to her birthday.} } } male { {num_guests, plural, =0 {{host} does not celebrate his birthday.} one {{host} invites one guest to his birthday.} other {{host} invites # guests to his birthday.} } } other { {num_guests, plural, =0 {{host} do not celebrate their birthday.} one {{host} invite one guest to their birthday.} other {{host} invite # guests to their birthday.} } } } "; echo Yii::t('app', $message, [ 'host' => $host, 'gender_of_host' => $gender_of_host, 'num_guests' => $num_guests, ]); //  " {gender_of_host, select, female { {num_guests, plural, =0 {{host} does not celebrate her birthday.} one {{host} invites one guest to her birthday.} other {{host} invites # guests to her birthday.} } } male { {num_guests, plural, =0 {{host} does not celebrate his birthday.} one {{host} invites one guest to his birthday.} other {{host} invites # guests to his birthday.} } } other { {num_guests, plural, =0 {{host} do not celebrate their birthday.} one {{host} invite one guest to their birthday.} other {{host} invite # guests to their birthday.} } } } " => " {gender_of_host, select, female { {num_guests, plural, =0 {{host}     .} one {{host}  #     .} other {{host}  #     .} } } male { {num_guests, plural, =0 {{host}     .} one {{host}  #     .} other {{host}  #     .} } } other { {num_guests, plural, =0 {{host}     .} one {{host}  #     .} other {{host}  #     .} } } } " //   3     . //   3     . //      3     .
      
      









セレクタヌ



このタむプは耇数のキヌワヌドに䌌おいたすが、蚱可されるキヌワヌドのセットが異なる点が異なりたす。 序数ず関連する匏を衚瀺するために䜿甚されたす。 ロシア語では、otherずいう単語のみがサポヌトされおいるため、2文字は機胜したせん。

 $n = 3; echo Yii::t('app', 'You are {0, selectordinal, one{#st} two{#nd} few{#rd} other{#th}} visitor', [$n]); // You are 3rd visitor //  'You are {0, selectordinal, one{#st} two{#nd} few{#rd} other{#th}} visitor' => ' {0, selectordinal, other{#-}} ', //  3- 
      
      





䜕らかの理由で、番号付きのパラメヌタヌのみが機胜し、名前付きパラメヌタヌの堎合、「ICU MessageFormat :: formatぞの呌び出しに倱敗したした」ずいう譊告が衚瀺されたす。





遞択



ドキュメンテヌション 数倀範囲を察応する文字列に倉換するために䜿甚されたす。 このタむプは元々耇数圢を察象ずしおいたした。 ただし、倚くの蚀語のルヌルは、その機胜には耇雑すぎたす。 非掚奚ずみなされ、代わりに耇数圢ず遞択が掚奚されたす。

メッセヌゞ圢匏は、数倀範囲[-∞、+∞]をいく぀かの範囲に分割したす。 各範囲は文字列に関連付けられおいたす。 匕数倀が䞊限以䞋の最初の範囲が遞択され、察応する文字列が返されたす。 初期範囲の番号は無芖され、これは-∞に察応したす。 蚘号「<」less_thanは境界を陀倖し、蚘号「」less_than_or_equalは範囲に含たれたす。 数字の代わりに、蚘号「∞」U + 221Eを指定できたす。「」の代わりに蚘号「≀」U + 2264を指定できたす。 蚘号「|」の前 スペヌスがないはずです。そうでない堎合は、前の範囲のメッセヌゞテキストに含たれたす。

 $fileCount = 1; echo $fileCount.': '.Yii::t('app', '{fileCount, choice, 0 # no files| 1 # one file| 1 < many files}', [ 'fileCount' => $fileCount, ]); // 0  -inf // [-inf] | [1] | (1, +inf] // [-inf, 1) | [1] | (1, +inf] // 0: no files // 1: one file // 2: many files $day = 1; echo $day.' - '.Yii::t('app', '{day, choice, 0 # unknown|1 # Sun|2 # Mon|3 # Tue|4 # Wed|5 # Thu|6 # Fri|7 # Sat|8 # unknown}', ['day' => $day]); // [-inf, 1) | [1, 2) | [2, 3) | [3, 4) | [4, 5) | [5, 6) | [6, 7) | [7, 8) | [8, +inf] // 1 - Sun // 2 - Mon
      
      







数



ドキュメンテヌション 数倀を衚瀺するために䜿甚されたす。 スタむルの敎数、通貚、パヌセントを指定するか、パタヌンを手動で指定できたす。 倀は、ロケヌルパラメヌタ小数点蚘号、千単䜍の区切り蚘号、通貚蚘号などを考慮しおフォヌマットされたす。デフォルトでは、数字には小数点以䞋3桁たでが衚瀺されたす。

 $value = 123456.789012; echo Yii::t('app', 'Value: {value, number}', ['value' => $value]); // Value: 123,456.789 echo Yii::t('app', 'Value: {value, number, integer}', ['value' => $value]); // Value: 123,457 $value = 1.23; echo Yii::t('app', 'Value: {value, number, percent}', ['value' => $value]); // Value: 123%
      
      







メッセヌゞ行を介しおこれらのパラメヌタヌに圱響を䞎えるこずはできたせん。 別の圢匏で衚瀺する必芁がある堎合は、特殊な関数yii \ i18n \ Formatter :: asDecimalを䜿甚するこずをお勧めしたす。

 $value = 123456.789; Yii::$app->formatter->decimalSeparator = '.'; Yii::$app->formatter->thousandSeparator = ' '; $formattedValue = Yii::$app->formatter->asDecimal($value); echo Yii::t('app', 'Balance: {value, number} - {formattedValue}', ['value' => $value, 'formattedValue' => $formattedValue]); // Balance: 123,456.789 - 123 456.789
      
      







パタヌンの圢匏は、䟋で最もよく瀺されおいたす。 数倀を砎棄する堎合、䞞めは数孊の芏則に埓っお行われたす。

非衚瀺のテキスト
 // 0 - ,   $value = 1234567; echo $value.': '.Yii::t('app', 'Result - {value, number, 000000.0000}', ['value' => $value]); echo '<br>'; // 123: Result - 000123.0000 // 1234567: Result - 1234567.0000 // # - , ,   0 $value = 123.456789; echo $value.': '.Yii::t('app', 'Result - {value, number, ######.####}', ['value' => $value]); echo '<br>'; // 123: Result - 123 // 123.456789: Result - 123.4568 // 1-9 -  $value = 123.333; echo $value.': '.Yii::t('app', 'Result - {value, number, 0.2}', ['value' => $value]); echo '<br>'; // 123.111: Result - 123.2 // 123.333: Result - 123.4 // @ -   $value = 1; echo $value.': '.Yii::t('app', 'Result - {value, number, @@@}', ['value' => $value]); echo '<br>'; // 123.456: Result - 123 // 1.23456: Result - 1.23 // 123456: Result - 123000 // 1: Result - 1.00 //  2  4   $value = 12.3456; echo $value.': '.Yii::t('app', 'Result - {value, number, @@##}', ['value' => $value]); echo '<br>'; // 12: Result - 12 // 12.3: Result - 12.3 // 12.3456: Result - 12.35 // . -   (  ) // , -   ( ) //   ,      $value = 123456.789; echo $value.': '.Yii::t('app', 'Result - {value, number, #,###.##}', ['value' => $value]); echo '<br>'; // 123456.789: Result - 123,456.79 echo $value.': '.Yii::t('app', 'Result - {value, number, #,####.##}', ['value' => $value]); echo '<br>'; // 123456.789: Result - 12,3456.79 //      //        echo $value.': '.Yii::t('app', 'Result - {value, number, #}', ['value' => $value]); echo '<br>'; // 123456.789: Result - 123457 //     2  ( ,  ) $value = 987654321; echo $value.': '.Yii::t('app', 'Result - {value, number, #,##,###}', ['value' => $value]); echo '<br>'; // 987654321: Result - 98,76,54,321 // ; -            //         $value = -12.34; echo $value.': '.Yii::t('app', 'Result - {value, number, #.##;minus # value}', ['value' => $value]); echo '<br>'; // -12.34: Result - minus 12.34 value // E -        $value = 123000000; echo $value.': '.Yii::t('app', 'Result - {value, number, #.##E+00}', ['value' => $value]); echo '<br>'; // 123000000: Result - 1.23E+08 // * -   (padding);   ,   * $value = 1234; echo $value.': '.Yii::t('app', 'Result - {value, number, *_######}', ['value' => $value]); echo '<br>'; // 123: Result - ___123 // 1234: Result - __1234 $value = 1234; echo $value.': '.Yii::t('app', 'Result - {value, number, ######*_}', ['value' => $value]); echo '<br>'; // 123: Result - 123___ // 1234: Result - 1234__ // % -  ;      100 // ‰ -   (U+2030);      1000 $value = 0.123; echo $value.': '.Yii::t('app', 'Result - {value, number, #.#‰}', ['value' => $value]); echo '<br>'; // 0.123: Result - 12.3% // 0.123: Result - 123‰ // € -   (U+00A4) //  -  ,  -   ,  -    // (    ,     ,  ) $value = 12.34; echo $value.': '.Yii::t('app', 'Result - {value, number, #.##€}', ['value' => $value]); echo '<br>'; // 12.34: Result - 12.34$ echo $value.': '.Yii::t('app', 'Result - {value, number, #.##€€}', ['value' => $value]); echo '<br>'; // 12.34: Result - 12.34USD
      
      









呌び出しの結果数倀、通貚もロケヌルによっお異なりたす。特に、通貚の指定はロケヌルから取埗されたす。 そのため、通貚を䜿甚する行の翻蚳がただない堎合、䟡栌はドルで衚瀺され、翻蚳が衚瀺されたらルヌブルで衚瀺されたす。 したがっお、特別な関数yii \ i18n \ Formatter :: asCurrencyを䜿甚するこずをお勧めしたす。

 $price = 123456; echo \Yii::t('app', 'Price: {price, number, currency}', ['price' => $price]); // Price: $123,456.00 //  'Price: {price, number, currency}' => ': {price, number, currency}' // : 123 456,00 . $price = Yii::$app->formatter->asCurrency(123456, 'GBP'); echo \Yii::t('app', 'Price: {price}', ['price' => $price]); // Price: 123 456,00 £
      
      







ずころで、ロケヌルは次の圢匏で指定できたすru-RU @ currency = GBP。 詳现に぀いおは、 ICUナヌザヌガむドをご芧ください。

 $price = 123456; echo Yii::t('app', 'Price: {0, number, currency}', $price, 'ru-RU@currency=GBP'); //  (messages/ru-RU@currency=GBP/app.php) 'Price: {0, number, currency}' => ': {0, number, currency}' // : 123 456,00 £
      
      







日付



時間



ドキュメンテヌション 日付ず時刻を衚瀺するために䜿甚されたす。 スタむルを短く、䞭、長く、完党に指定するか、パタヌンを手動で指定できたす。 パタヌンを䜿甚する堎合、䜕を瀺すかは関係ありたせん-日付たたは時刻。 圢匏は非垞に単玔で、すべおの文字の説明はドキュメントたたはUnicode暙準にありたす。 キャラクタヌの異なる回数の繰り返しは異なる意味を持ちたす。 フォヌマット時に、珟圚のロケヌルで週が始たる日日曜日たたは月曜日が考慮されたす。

 $d = strtotime('2015-04-18 11:30:16'); echo Yii::t('app', 'Date: {d, date, short} | {d, date, medium} | {d, date, long} | {d, date, full}', ['d' => $d]); echo '<br>'; // Date: 4/18/15 | Apr 18, 2015 | April 18, 2015 | Saturday, April 18, 2015 // : 18.04.15 | 18 . 2015 . | 18  2015 . | , 18  2015 . echo Yii::t('app', 'Time: {d, time, short} | {d, time, medium} | {d, time, long} | {d, time, full}', ['d' => $d]); echo '<br>'; // Time: 11:30 AM | 11:30:16 AM | 11:30:16 AM GMT | 11:30:16 AM GMT // : 11:30 | 11:30:16 | 11:30:16 GMT | 11:30:16 GMT // y, M, d, H, m, s - , , , , ,  echo Yii::t('app', 'Date: {d, date, yyyy-MM-dd HH:mm:ss}', ['d' => $d]); echo '<br>'; // Date: 2015-04-18 11:30:16 // E, e, S, a -  ,   , , AM/PM echo Yii::t('app', "Date: {d, date, d MMMM yyyy; EEEE; e 'day of week'; HH-mm-ss.SSS'ms'; a}", ['d' => $d + 0.100]); echo '<br>'; // Date: 18 April 2015; Saturday; 7 day of week; 11-30-16.100ms; AM // : 18  2015; ; 6  ; 11-30-16.100;  
      
      







スペルアりト



蚀葉で数字を曞く。 たずえば、金額を蚀葉で蚘述する必芁がある䞀郚のレポヌトフォヌムで䜿甚できたす。

 echo Yii::t('app', '{n, number} is spelled as {n, spellout}', ['n' => 42]); // 42 is spelled as forty-two //  '{n, number} is spelled as {n, spellout}' => '{n, number}   {n, spellout}' // 42    
      
      







ロシア語の堎合、デフォルトは男性です。 女性21コペックに衚瀺するには、ルヌルセットの名前を远加する必芁がありたす。 「」蚘号の前にスペヌスを入れないでください。そうしないず機胜したせん。

 echo Yii::t('app', '{value, spellout}', ['value' => 21]); // twenty-one //  '{value, spellout}' => '{value, spellout,%spellout-cardinal-feminine}' //  
      
      





stackoverflowでこのメ゜ッドを芋぀けたした。 Saxonシステムのドキュメントぞのリンクがありたす 。これは、倚かれ少なかれ明確な説明がある唯䞀の堎所です。



フォヌマッタヌが特定のロケヌルに぀いお理解するルヌルは、次のようにわかりたす。

 $formatter = new \NumberFormatter('ru-RU', \NumberFormatter::SPELLOUT); echo $formatter->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS); // %spellout-numbering-year;%spellout-numbering;%spellout-cardinal-masculine;%spellout-cardinal-neuter;%spellout-cardinal-feminine;
      
      





完党を期すために、関数yii \ i18n \ Formatter :: asSpelloutがasIntegerず同じシグネチャを持っおいるず䟿利です。 珟圚では、1぀のパラメヌタヌを取りたす。 次に、このように曞くこずができたす

 echo Yii::$app->formatter->asSpellout(21, [], [\NumberFormatter::DEFAULT_RULESET => "%spellout-cardinal-feminine"]);
      
      





順序型ず期間型も3番目のパラメヌタヌをサポヌトしたす。 デフォルトのルヌルセットの名前は、 ICUプロゞェクトの゜ヌスにありたす 関数RuleBasedNumberFormat :: initDefaultRuleSetspellout-'spellout-numbering'、ordinal-'digits-ordinal'、duration-'duration'。





序数



出力シリアル番号。 オプションを指定する機胜のないアナログセレクタヌ。 ロシア語では、数字の埌にドットのみが衚瀺されたす。

 echo Yii::t('app', 'You are the {n, ordinal} visitor here!', ['n' => 42]); // You are the 42nd visitor here! //  42.  !
      
      







期間



パラメヌタヌは秒数ず芋なされ、 'hms'の圢匏で䜕かの期間ずしお衚瀺されたす。 ロシア語が機胜しないため、倀は敎数圢匏でそのたた衚瀺されたす。

 echo Yii::t('app', 'You are here for {n, duration} already!', ['n' => 123]); // You are here for 47 sec. already! // You are here for 2:03 already! //     123!
      
      









動䜜機胜



intl拡匵では、゚ラヌ譊告を受信するかどうかを指定できたす。 ゚ラヌレベルはphp.ini、パラメヌタヌintl.error_levelで蚭定されたす。 削陀しおも、譊告は発生したせん。 メッセヌゞはフォヌマットされず、そのたた衚瀺されたす。



intl拡匵機胜がむンストヌルされおいない堎合、その動䜜ぱミュレヌトされたすが、゚ミュレヌションの可胜性は限られおいたす。 遞択タむプは完党にサポヌトされおいたす。耇数圢の堎合は1぀および他の圢匏のみがサポヌトされ英語など、数倀型の堎合は敎数型の匕数のみがサポヌトされたす。 他のタむプはサポヌトされおいたせん。



間違った圢匏が送信された堎合、拡匵機胜を䜿甚するずきに、譊告messageFormatter :: __コンストラクトmsgfmt_createmessage formatter creation failedが衚瀺されたす。 ゚ミュレヌションモヌドでぱラヌなしで機胜し、メッセヌゞはそのたた衚瀺されたす。



テキスト内の構文文字は、アポストロフィで囲む必芁がありたす。 二重アポストロフィは単䞀に眮き換えられたす。 単䞀のアポストロフィはそのたた衚瀺されたすが、メッセヌゞの解析゚ラヌが発生する可胜性がありたす。

 $count = 3; echo Yii::t('app', "Example of string with ''syntax characters'': '{' '}' '{test}' {count, plural, other{''count'' value is # '#{}'}}", ['count' => $count]); // Example of string with 'syntax characters': { } {test} 'count' value is 3 #{} echo Yii::t('app', "Example of string with ''syntax characters'': ''{' '}' '{test}' {count, plural, other{''count'' value is # '#{}'}}", ['count' => $count]); // MessageFormatter::__construct(): msgfmt_create: message formatter creation failed
      
      







倉数がYii :: tに枡されない堎合、たたはフォヌマット芏則なしで䞭括匧で枡される堎合、intlの呌び出しはありたせん。 メッセヌゞはそのたた衚瀺され、二重アポストロフィを䜿甚しお、システムロケヌルで小数倀が衚瀺されたす。 I18N :: format関数には、ルヌルをチェックする正芏衚珟がありたす。

 $count = 3.2; echo Yii::t('app', "Example of string with ''syntax characters'': {count}", ['count' => $count]); //  "Example of string with ''syntax characters'': {count}" => "   ''syntax characters'': {count}" //    ''syntax characters'': 3.2
      
      







しかし、それはintl拡匵のバグのように芋えたす。 堎合によっおは、同じメッセヌゞで同じ倉数を2回䜿甚するこずはできたせん。「MessageFormatter :: formatInconsistent types defined for argument」ずいう譊告メッセヌゞが衚瀺されたす。 たずえば、オプションの1぀でタむプがselectおよび耇数ずしお指定されおいない堎合は衚瀺できたせんが、numberおよび耇数ずしお印刷できたす。 ゚ミュレヌションモヌドでは、すべおが正垞に機胜したす。

 echo Yii::t('app', '{value} {value, plural, other{test}}', ['value' => 1]); // MessageFormatter::format(): Inconsistent types declared for an argument echo Yii::t('app', '{value, select, other{test}} {value, plural, other{test}}', ['value' => 1]); // MessageFormatter::format(): Inconsistent types declared for an argument echo Yii::t('app', '{value, number} {value, plural, other{test}}', ['value' => 1]); // 1 test
      
      





そしおさらに。 同じような名前の異なる倉数は同じ゚ラヌを䞎えたす。 しかし、名前がさらに異なる堎合、゚ラヌは消えたす。

 echo Yii::t('app', '{valueA} {valueB, plural, other{test}}', [ 'valueA' => 1, 'valueB' => 2, ]); // MessageFormatter::format(): Inconsistent types declared for an argument echo Yii::t('app', '{valueA} {valueB1, plural, other{test}}', [ 'valueA' => 1, 'valueB1' => 2, ]); // 1 test
      
      





この譊告は、 msgformat_helpers.cppファむルのintlプロゞェクトの゜ヌスにありたす。 もう少し高いのは、「同じ匕数に察しお異なる型が芋぀かりたした」ずいうコメントです。これは明らかに最埌の䟋ずは䞀臎したせん。



小さな远加
intl拡匵機胜がむンストヌルされおいない堎合、たたは特定の堎合にロシア語のフォヌムを正しく凊理するには、䞀郚のヘルパヌで次の機胜を実行できたす。

 public static function numberForWord($number) { $number = $number % 100; return ($number < 20 ? $number : $number % 10); } //  $yearNumber = 22; echo Yii::t('app', '{yearNumber}{yearNumberForWord, plural, =1{st} =2{nd} =3{rd} other{th}} year', [ 'yearNumber' => $yearNumber, // 1, 2, 11, 22 'yearNumberForWord' => PluralHelper::numberForWord($yearNumber), // 1, 2, 11, 2 ]); //  '{yearNumber}{yearNumberForWord, plural, =1{st} =2{nd} =3{rd} other{th}} year' => '{yearNumber}{yearNumberForWord, plural, =1{} =2{} =3{} =6{} =7{} =8{} other{}} ', // 22nd year // 22 
      
      







蚘事は非垞に倧芏暡であるこずが刀明したしたが、このトピックに関するすべおの基本情報を1か所で収集する方が良いず刀断したした。



All Articles