多言語(I18N)開発では、プログラマーは多くの場合、ユーザー名、時間、数量などの変数をテンプレート文字列に挿入する必要があります。文字列スプライシングが直接使用される場合、コードの読みやすさが低いだけでなく、維持することも困難です。 PHPによって提供されるVSPRINTF()関数は、この問題を解決するための強力なツールです。文字列と配列パラメーターのフォーマットを組み合わせて、特に多言語シナリオに適した柔軟で強力な動的置換機能を実現します。
vsprintf()は、PHPの文字列フォーマット関数です。その作業原則はsprintf()に似ています。違いは、パラメーターが配列として渡されることです。これにより、配列(データベースから取得した多言語変数など)を文字列テンプレートに簡単に渡すことができます。
構文は次のとおりです。
string vsprintf(string $format, array $values)
$フォーマット:フォーマットプレースホルダーを備えた文字列。
$値:配列内の各値が文字列内のプレースホルダーを順番に置き換える配列。
多言語システムの例を考えてみましょう。次の情報を表示する必要があります。
英語:こんにちは、ジョン! 5つの未読メッセージがあります。
中国語:こんにちは、ジョン! 5つの未読メッセージがあります。
変数(ユーザー名とメッセージ番号)を柔軟に置き換えるために、これらの2つの文をテンプレートとして使用し、プレースホルダー%sでマークすることができます。
<?php
// 言語ファイルまたはデータベースからロードされた言語テンプレートを仮定します
$translations = [
'en' => 'Hello, %s! You have %d unread messages.',
'zh' => 'こんにちは,%s!あなたが持っている %d 未読メッセージ。'
];
// ユーザー情報
$user = 'John';
$messageCount = 5;
// 現在の言語
$lang = 'zh'; // または 'en'
// 使用 vsprintf 交換します
$output = vsprintf($translations[$lang], [$user, $messageCount]);
echo $output;
?>
こんにちは,John!あなたが持っている 5 未読メッセージ。
ご覧のとおり、テンプレートで定義されている2つのプレースホルダー%s (string)と%d (整数)を、それぞれvsprintf()を介してユーザー名とメッセージ番号に置き換えます。
より複雑な言語構造が必要な場合、プレースホルダーポジションは変化する場合があります。例えば:
$translations = [
'en' => 'User %1$s has %2$d items in cart.',
'fr' => 'Il y a %2$d articles dans le panier de l’utilisateur %1$s.'
];
パラメーターの位置( %1 $ s 、 %2 $ d )を指定することにより、異なる構文順序によって引き起こされるエラーを回避できます。
<?php
$translations = [
'en' => 'User %1$s has %2$d items in cart.',
'fr' => 'Il y a %2$d articles dans le panier de l’utilisateur %1$s.'
];
$user = 'Alice';
$cartItems = 3;
$lang = 'fr';
echo vsprintf($translations[$lang], [$user, $cartItems]);
?>
Il y a 3 articles dans le panier de l’utilisateur Alice.
プロンプトがあるとします: 「ここをクリックしてあなたの個人的なホームページにアクセスしてください:<a href = '%s'> link </a>」
実際に使用すると、これを書くことができます。
<?php
$translations = [
'zh' => "ここをクリックして、あなたの個人的なホームページにアクセスしてください:<a href='%s'>リンク</a>"
];
$url = 'https://gitbox.net/user/profile';
echo vsprintf($translations['zh'], [$url]);
?>
ここをクリックして、あなたの個人的なホームページにアクセスしてください:<a href='https://gitbox.net/user/profile'>リンク</a>
vsprintf()を使用して、多言語文字列テンプレートの動的置換を実装するには、次の利点があります。
テンプレートには明確な構造と強力なメンテナンスがあります。
パラメーターの位置制御をサポートし、さまざまな構文構造言語に適応します。
配列データおよび言語パックと便利に統合します。
HTMLとURLを出力する場合、まだ柔軟で効率的です。
Laravel、Symfonyなどのフレームワークを使用するプロジェクトの場合、独自のカプセル化された翻訳方法がありますが、基礎となる実装では、 vsprintf()をテンプレートプレースホルダーの代替として使用できます。
要するに、 vsprintf()のマスタリングは、エレガントで多言語フレンドリーなPHPコードを書くことの重要な部分です。