🔧

Intlにおける 2つの組み込みメソッド(#5)

2024/12/05に公開

この記事は「1 人 Intl Advent Calendar 2024」の 5 日目の記事です。

今回は Intl における 2 つの組み込みメソッドについて解説します。

Intl における 2 つの組み込みメソッド

Intl には getCanonicalLocales()supportedValuesOf() という 2 つの組み込みメソッドが存在します。これらはともに、Intl でサポートする値を返したり、ロケールの正規化をしたりする補助的な役割を持ったメソッドです。

getCanonicalLocales()

Intl.getCanonicalLocales() は、与えられたロケール識別子(と思われる)文字列を正規化する組み込みメソッドです。

引数として文字列または文字列の配列を受け取り、正規化された文字列の配列を返します。

console.log(Intl.getCanonicalLocales("EN-US")); //  ["en-US"]
console.log(Intl.getCanonicalLocales(["EN-US", "Fr"])); // ["en-US", "fr"]

ここでいう正規化はあくまで大文字小文字の正規化だけなので、ロケール識別子の構文から外れた文字列は不正な値として RangeError がスローされます。

try {
  Intl.getCanonicalLocales("hoge-FUGA");
} catch (err) {
  // RangeError: Incorrect locale information provided
}

この正規化処理と同じ処理は、Intl のコンストラクタプロパティにロケール識別子を渡した際にも自動的に行われています。そのため、「コンストラクタプロパティに渡す前には getCanonicalLocales() で正規化したほうが良い」ということはありません。

一方で、バックエンドとやり取りする際や入力値からステートにロケール識別子を保存する際などは、正規化手段として役に立ちます。特にサーバーなど JavaScript 以外のランタイムにデータを渡す場合、正規化していないロケールで不具合が発生する可能性もあるため、なるべく正規化しておくと安心です。

supportedValuesOf()

Intl.supportedValuesOf() メソッドは、以下のそれぞれの項目について、Intl の実装がサポートしている値の一覧を取得できるメソッドです。

  • calendar : 暦
  • collation : 文字列の比較方法
  • currency : 通貨
  • numberingSystem : 命数法
  • timeZone : タイムゾーン
  • unit : 単位

例: そのランタイムでサポートするカレンダーの一覧を取得する。

console.log(Intl.supportedValuesOf("calendar"));
// ['buddhist', 'chinese',.... 'persian', 'roc']

上記以外の無効なキーを指定した場合は RangeError がスローされます。

try {
  Intl.supportedValuesOf("invalid");
} catch (err) {
  // RangeError: invalid key: "invalid"
}

Intl.supportedValuesOf() はあくまで、「実行された環境でサポートしている値の一覧」を返すことに注意してください。例えばタイムゾーンの場合、マスターデータにあたるようなデータは IANA が管理しており、時折これらのデータは更新されますが、必ずしもそれらがすぐに反映されるとは限りません。同様に、ブラウザが利用しているロケールに関するデータベース(詳しくは続く 6 日目の記事で解説します)も環境によって異なる可能性があります。

一見使い所が少なさそうな Intl.supportedValuesOf() ですが、以下のようなユースケースに対応できます。

  • ユーザーの環境で特定の機能をサポートするか判別して機能を制限したい時
  • サーバーサイドで UI の選択肢を作る際などに情報源として利用する
    • 例: タイムゾーン選択や通貨選択を SSR で作成するときなど

まとめと次回予告

今回は Intl にある 2 つの組み込みメソッドについて、その概要と注意点、簡単なユースケースなどについて解説しました。次回 6 日目では Intl を支える Unicode の仕様・データ・ライブラリについて解説します。

Discussion