【React】よくある国旗付き国選択を作る

こんにちは、フリーランスエンジニアの太田雅昭です。

国選択UI

国選択UIは、国名のみのものもありますが、国旗があると親切です。また国名のローカライゼーションもあるとベストです。

今回は下記の条件で作ります。

  • 国旗はUnicode文字を使用
  • 国名はローカライズする

使用ライブラリ

国旗には下記のライブラリを使用しました。

https://www.npmjs.com/package/country-flag-icons

Unicodeの国旗が使用でき、シンプルなAPIで使用感も良さそうです。

また国名のローカライゼーションにはIntl.DisplayNamesを使用します。ネイティブコードのためこちらはライブラリ不要です。

セレクタを作ってみる

国一覧

国一覧は下記のようにして取得できます。

import { countries } from 'country-flag-icons';
console.log(countries); // 要素数254のstring[] AC, AD, AE, AF, AG, AI, AL, ...

国旗

国旗はUnicodeで取得できます。超軽量です。

import getFlag from 'country-flag-icons/unicode'
console.log(getFlag('JP'));

ローカライゼーション

国コードからローカライゼーションされた国名を取得するには、下記のようにします。

const getCountryName = (params: { locale: string, country: string }) => {
  const regionNamesInEnglish = new Intl.DisplayNames([params.locale], { type: "region" });
  return regionNamesInEnglish.of(params.country);
}

セレクタ

簡単にセレクタが作れました。

import { countries } from 'country-flag-icons';
import getFlag from 'country-flag-icons/unicode';

export default function App() {
  const locale = 'ja';
  return <CountrySelect locale={locale} />
}

function CountrySelect({ locale }: { locale: string }) {
  return <select>
    {countries.map((country) => (
      <option key={country} value={country}>
        {getFlag(country)} {getCountryName({ locale, country })}</option>
    ))}
  </select>
}

const getCountryName = (params: { locale: string, country: string }) => {
  const regionNamesInEnglish = new Intl.DisplayNames([params.locale], { type: "region" });
  return regionNamesInEnglish.of(params.country);
}