【JS応用|豆知識】JavaScriptの国際化対応を極める!Intl APIを使いこなそう

導入: なぜIntl APIが重要なのか

Webサイトを開発する際、日付、通貨、数値の表示形式は国や地域によって大きく異なります。例えば、日本では「2023/10/27」と書く日付も、米国では「10/27/2023」と書くのが一般的です。これらを自力で条件分岐させて実装するのは非常に困難で、バグの原因にもなります。そこで役立つのが、ブラウザ標準搭載のIntl APIです。これを使うことで、複雑なロジックを書くことなく、世界中のユーザーに適した表示を簡単に実現できます。

基礎知識: Intl APIとは?

Intl APIは、ECMAScript Internationalization APIの略称です。JavaScriptで言語や地域(ロケール)に応じた文字列比較、数値フォーマット、日付・時刻のフォーマットを可能にするための組み込みオブジェクトです。ライブラリを別途読み込む必要がなく、現代のすべてのモダンブラウザで動作するため、パフォーマンス面でも非常に優れています。

実装/解決策: 基本的な使い方

Intl APIの主要なオブジェクトには、日付用の Intl.DateTimeFormat、数値用の Intl.NumberFormat、リスト表示用の Intl.ListFormat などがあります。基本的には、対象のフォーマッタを作成し、formatメソッドに値を渡すことで、整形された文字列を取得できます。

サンプルプログラム

以下のコードをブラウザのコンソールに貼り付けて、実行結果を確認してみてください。

// 1. 数値の通貨フォーマット(日本円と米ドル)
const yen = new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' });
const usd = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });

console.log(yen.format(10000)); // 結果: ¥10,000
console.log(usd.format(10000)); // 結果: $10,000.00

// 2. 日付のフォーマット
const date = new Date();
const jaDate = new Intl.DateTimeFormat('ja-JP', { dateStyle: 'full' });
const enDate = new Intl.DateTimeFormat('en-US', { dateStyle: 'full' });

console.log(jaDate.format(date)); // 結果: 202X年X月X日金曜日
console.log(enDate.format(date)); // 結果: Friday, October 27, 202X

// 3. リストのフォーマット(カンマ区切りなどを地域に合わせて自動調整)
const list = ['りんご', 'みかん', 'バナナ'];
const jaList = new Intl.ListFormat('ja-JP', { style: 'long', type: 'conjunction' });
const enList = new Intl.ListFormat('en-US', { style: 'long', type: 'conjunction' });

console.log(jaList.format(list)); // 結果: りんご、みかん、およびバナナ
console.log(enList.format(list)); // 結果: apple, orange, and banana

応用・注意点: 現場で役立つアドバイス

Intl APIを使用する際、最も注意すべき点は「ロケールのフォールバック」です。ユーザーのブラウザ設定が特定の言語に対応していない場合、意図しない表示になることがあります。必ず第1引数にロケール(’ja-JP’など)を明示するか、navigator.languageを使ってユーザーのブラウザ設定を取得するようにしましょう。

また、頻繁にフォーマットを行う場合は、インスタンスを毎回作成するのではなく、変数を使い回す(キャッシュする)ことで処理負荷を下げることが可能です。大規模なアプリケーションでは、これらのフォーマッタをReactのContextなどで管理すると、よりクリーンなコードになります。ぜひ今日から取り入れてみてください。

タイトルとURLをコピーしました