JavaScriptの標準組み込みオブジェクトにIntl
オブジェクトがあります。国際化APIの名前空間で、locale
に依存した数値のフォーマットや分かち書きを行うプロパティを持ちます。
この記事ではそんなプロパティの1つであるDisplayNames
について解説します。
DisplayNames
DisplayNames
は言語、地域、文字体系をlocale
に応じて翻訳するためのオブジェクトです。
const regionNames = new Intl.DisplayNames('ja-JP', { type: 'region' });
// アメリカ合衆国
console.log(regionNames.of('US'));
DisplayNames
を初期化するタイミングで扱いたいlocale
と翻訳する文字列の種類を指定します。
const regionNames = new Intl.DisplayNames('ja-JP', { type: 'region' });
第2引数では翻訳する文字列の種類のほかにオプションを渡せます。
const regionNames = new Intl.DisplayNames(
'ja-JP',
{
localeMatcher: 'lookup',
style: 'narrow',
type: 'language',
code: 'none',
languageDisplay: 'standard',
},
);
localeMathcer
は第一引数のlocale
が配列で複数渡ってきた時の優先順位の付け方を決めます。デフォルトではbest fit
で他にlookup
を指定できます。
best fit
はリクエストやランタイムを用いて最適なlocale
を決定し、lookup
を指定した場合はLookup
のアルゴリズムによって決定されます。
style
は翻訳後の文字の長さを指定します。デフォルトはlong
です。他の選択肢としてはshort
とnarrow
が存在します(narrow
が有効になる例を見つけられませんでした🙏)。
const languageNames1 = new Intl.DisplayNames(
'ja-JP',
{
type: 'language',
},
);
const languageNames2 = new Intl.DisplayNames(
'ja-JP',
{
type: 'language',
style: 'short',
},
);
const languageNames3 = new Intl.DisplayNames(
'ja-JP',
{
type: 'language',
style: 'narrow',
},
);
// 英語(イギリス)
console.log(languageNames1.of('en-GB'));
// 英語(英国)
console.log(languageNames2.of('en-GB'));
// 英語(英国)
console.log(languageNames3.of('en-GB'));
type
は翻訳する文字の種類を指定します。このオプションは指定が必須です。存在する種類はlanguage
、region
、script
、currency
、calendar
、dateTimeField
です。
const languageNames = new Intl.DisplayNames('ja-JP', { type: 'language' });
// フランス語
console.log(languageNames.of('fr'));
const regionNames = new Intl.DisplayNames('ja-JP', { type: 'region' });
// アメリカ合衆国
console.log(regionNames.of('US'));
const scriptNames = new Intl.DisplayNames(
'ja-JP',
{
type: 'script',
},
);
// 仮名
console.log(scriptNames.of('Hrkt'));
const currencyNames = new Intl.DisplayNames('ja-JP', { type: 'currency' });
// ユーロ
console.log(currencyNames.of('EUR'));
const calendarNames = new Intl.DisplayNames('ja-JP', { type: 'calendar' });
// 中華民国暦
console.log(calendarNames.of('roc'));
const dateTimeFieldNames = new Intl.DisplayNames('ja-JP', { type: 'dateTimeField' });
// 年
console.log(dateTimeFieldNames.of('year'));
fallback
は翻訳先がない時に返す値を決めます。デフォルトではcode
で受け取った値をそのまま返します。この他にはnone
があり、undefiend
を返します。
const regionNames1 = new Intl.DisplayNames(
'ja-JP',
{
type: 'region',
},
);
const regionNames2 = new Intl.DisplayNames(
'ja-JP',
{
type: 'region',
fallback: 'none',
},
);
// hk
regionNames1.of('hk');
// undefined
regionNames2.of('hk');
languageDisplay
はtype
がlanguage
の場合にのみ使えます。デフォルトは"dialect
で現地での呼ばれ方に翻訳されます。standard
では一般的な表現になります。
const languageNames1 = new Intl.DisplayNames('ja-JP', {
type: 'language',
});
const languageNames2 = new Intl.DisplayNames('ja-JP', {
type: 'language',
languageDisplay: 'standard',
});
// アメリカ英語
console.log(languageNames1.of('en-US'));
// 英語(アメリカ合衆国)
console.log(languageNames2.of('en-US'));
上記の例からもわかるようにDisplayNames
オブジェクトの作成後はof
メソッドに渡した文字列が翻訳されます。type
に対応した文字列を渡せなかった場合はエラーが発生するので注意してください。
type
に対応する文字列はECMAScriptの仕様書で定義されています。
localeが対応していることを確認する
DisplayNames
オブジェクトに渡すlocale
は静的メソッドであるsupportedLocalesOf
を用いて確認できます。引数はDisplayNames
オブジェクトのコンストラクタと同じです。
// ['ja', 'ja-JP']
console.log(
Intl.DisplayNames.supportedLocalesOf(
['ja', 'JP', 'ja-JP'],
)
);
第二引数にはlocaleMatcher
を渡せます。type
はコンストラクタでは必須ですが、ここでは必要ありません。
// ['ja', 'ja-JP']
console.log(
Intl.DisplayNames.supportedLocalesOf(
['ja', 'JP', 'ja-JP'],
{
localeMatcher: 'lookup',
}
)
);
有効なオプションを確認する
resolvedOptions
はDisplayNames
オブジェクトを作成したときに有効となった設定を表示します。
const languageNames = new Intl.DisplayNames(['ja-JP', 'en-US'], {
type: 'language',
languageDisplay: 'standard',
});
/*
* {
* locale: 'ja-JP',
* style: 'long',
* type: 'language',
* fallback: 'code',
* languageDisplay: 'standard'
* }
*/
console.log(languageNames.resolvedOptions());
locale
は渡したままの状態ではなくlocaleMatcher
で決められたものが渡されます。