1. 導入:Intl.Localeが解決する課題
グローバルなWebアプリケーションを開発する際、言語(Language)、地域(Region)、文字体系(Script)の管理は避けて通れません。従来、文字列操作でロケール情報をパースしていましたが、これには「誤字の混入」や「複雑なバリデーション」といったリスクが伴いました。Intl.Locale APIを使用すれば、ロケール識別子(BCP 47タグ)をオブジェクトとして安全に操作でき、保守性の高い国際化対応が可能になります。
2. 基礎知識:Intl.Localeとは
Intl.Localeは、言語タグ(例: “ja-JP-u-ca-japanese”)を解析し、その構成要素(言語、地域、カレンダー設定など)を個別のプロパティとして取得・変更できるオブジェクトです。
・BCP 47: IETFが定めた言語タグの標準規格です。
・Unicode拡張キー: カレンダーの種類(-u-ca-)や数値体系(-u-nu-)など、言語以外のロケール設定を柔軟にカスタマイズできます。
3. 実装/解決策:Localeオブジェクトの生成とプロパティ取得
基本的にはコンストラクタに文字列を渡すだけでインスタンス化可能です。これにより、手動で文字列を分割(split(‘-‘)など)することなく、安全に各値へアクセスできます。また、最大の特徴は「変更メソッド」が存在し、特定の属性だけを書き換えた新しいロケールオブジェクトを作成できる点です。
4. サンプルプログラム
以下のコードは、ロケールを解析し、特定の設定を動的に変更する実用的な例です。
// 1. ロケール文字列からオブジェクトを生成
const locale = new Intl.Locale('ja-JP-u-ca-japanese');
// 2. プロパティの取得
console.log(locale.language); // "ja"
console.log(locale.region); // "JP"
console.log(locale.calendar); // "japanese"
// 3. 一部を書き換えた新しいロケールを作成(元のオブジェクトは不変)
const usLocale = new Intl.Locale(locale, {
language: 'en',
region: 'US',
calendar: 'gregory'
});
console.log(usLocale.toString()); // "en-US-u-ca-gregory"
// 4. 実務での活用例:ユーザー設定に基づいた日付フォーマットの準備
function getDateFormatByLocale(localeStr) {
const loc = new Intl.Locale(localeStr);
// 日本なら和暦、それ以外はグレゴリオ暦といった分岐を安全に行える
const options = { dateStyle: 'full' };
return new Intl.DateTimeFormat(loc.toString(), options);
}
const formatter = getDateFormatByLocale('ja-JP-u-ca-japanese');
console.log(formatter.format(new Date())); // 令和〇年〇月〇日のような形式
5. 応用・注意点:現場で役立つTips
・ブラウザ互換性: Intl.Localeはモダンブラウザで幅広くサポートされていますが、非常に古いブラウザや特定の環境ではポリフィルが必要になる場合があります。
・不変性(Immutability): Intl.Localeのメソッドは元のオブジェクトを変更せず、常に新しいインスタンスを返します。Reactなどのステート管理で使用する場合、この特性がバグ防止に大きく貢献します。
・バリデーションの限界: Intl.Localeはフォーマットの妥当性はチェックしますが、その地域で「実際に使用されているか」までの意味論的な検証は行いません。あくまで「BCP 47として正しい形式か」を扱うツールであることを意識してください。
・パフォーマンス: 頻繁に生成するのではなく、設定変更時のみインスタンス化するなど、無駄なオブジェクト生成を避けるのがパフォーマンス最適化の定石です。