Babelize Elements
言語スイッチャー

言語スイッチャー Pill

キーボード操作と RTL サポートに対応した、React 向けのアニメーション付きピル型言語スイッチャーです。

インストール

npx shadcn@latest add @babelize/language-switcher-pill

使い方

"use client";

import { useState } from "react";
import { LanguageSwitcherPill } from "@/components/ui/language-switcher-pill";

const locales = [
  { code: "en", label: "English" },
  { code: "fr", label: "Français" },
  { code: "ar", label: "العربية", rtl: true }, // rtl auto-detected, override optional
];

export function LocalePill() {
  const [locale, setLocale] = useState("en");

  return (
    <LanguageSwitcherPill
      locales={locales}
      locale={locale} // omit for uncontrolled, use defaultLocale instead
      onLocaleChange={setLocale}
    />
  );
}

Props

Prop型必須説明
localesLocale[]はい利用可能なロケールの配列です。必須なのは code のみです
localestringいいえ選択中のロケールコード。コンポーネントを制御するにはこの値を渡します
defaultLocalestringいいえ非制御時の初期選択ロケールコード(デフォルト: 最初のロケールのコード)
onLocaleChange(code: string) => voidいいえ選択中のロケールが変更されたときのコールバック
variant"default" | "outline"いいえ控えめなセグメント型トラックまたは枠付きトラック(デフォルト: "default")
size"sm" | "default" | "lg"いいえPill のサイズ(デフォルト: "default")
showFlagsbooleanいいえ各ロケールのラベルの前に国旗の絵文字を表示します(デフォルト: false)
disabledbooleanいいえすべての Pill を無効にします
aria-labelstringいいえラジオグループのアクセシブルなラベル(デフォルト: "Select language")
classNamesLanguageSwitcherPillClassNamesいいえパーツごとのクラス上書き。詳しくは下記を参照してください
classNamestringいいえPill コンテナーに追加する CSS クラス

残りの div props はルート要素に転送されます。

クラス名

各パーツは独自のクラスを指定でき、デフォルトのクラスの後にマージされます。 そのため、コンポーネントをフォークしなくても、一部分だけスタイルを変更できます:

スロット要素
rootすべての Pill を保持するトラック
item各ロケールの Pill
activeItem選択中の Pill のみ
indicatorPill の背後にあるスプリングアニメーションのインジケーター
flagshowFlags が設定されているときに表示される国旗
<LanguageSwitcherPill
  locales={locales}
  classNames={{
    indicator: "bg-primary",
    activeItem: "text-primary-foreground",
  }}
/>

このコンポーネントは shadcn/ui のテーマトークン(bg-muted、bg-background、text-muted-foreground、ring-ring)でスタイル設定されているため、お使いのテーマが自動的に反映されます。

Locale オブジェクト

プロパティ型説明
codestringISO 639-1 / BCP 47 コード(例: "en"、"fr"、"ar")— 必須
labelstring言語 Pill の表示名
flagstringshowFlags と併せて表示される国旗の絵文字(省略時は自動で解決されます)
rtlbooleanテキストの組版に使う RTL 方向を上書きします(省略時は自動検出されます)

使用例

Babelize SDK を使う場合

自動翻訳のために、言語スイッチャー Pill を Babelize SDK と組み合わせます:

"use client";

import { useRouter } from "next/navigation";
import { LanguageSwitcherPill } from "@/components/ui/language-switcher-pill";
import { useBabelize } from "@babelize/sdk/react";

const locales = [
  { code: "en", label: "English" },
  { code: "fr", label: "Français" },
  { code: "es", label: "Español" },
  { code: "de", label: "Deutsch" },
  { code: "ar", label: "العربية" },
];

export function LocaleSwitcher() {
  const router = useRouter();
  const { locale, setLocale } = useBabelize();

  return (
    <LanguageSwitcherPill
      locales={locales}
      locale={locale}
      onLocaleChange={(code) => {
        setLocale(code);
        router.push(`/${code}`);
      }}
    />
  );
}

next-intl を使う場合

"use client";

import { useRouter } from "next/navigation";
import { LanguageSwitcherPill } from "@/components/ui/language-switcher-pill";

export function LocaleSwitcher() {
  const router = useRouter();

  return (
    <LanguageSwitcherPill
      locales={[
        { code: "en", label: "EN" },
        { code: "fr", label: "FR" },
        { code: "de", label: "DE" },
      ]}
      defaultLocale="en"
      onLocaleChange={(code) => router.push(`/${code}`)}
    />
  );
}

react-i18next を使う場合

"use client";

import { useTranslation } from "react-i18next";
import { LanguageSwitcherPill } from "@/components/ui/language-switcher-pill";

export function LocaleSwitcher() {
  const { i18n } = useTranslation();

  return (
    <LanguageSwitcherPill
      locales={[
        { code: "en", label: "English" },
        { code: "fr", label: "Français" },
        { code: "es", label: "Español" },
      ]}
      locale={i18n.language}
      onLocaleChange={(code) => i18n.changeLanguage(code)}
    />
  );
}

バリアントとサイズ

<LanguageSwitcherPill locales={locales} variant="outline" size="sm" showFlags />
<LanguageSwitcherPill locales={locales} size="lg" />

キーボード操作

  • 右矢印 — 次の言語に移動します(RTL レイアウトでは前の言語)。
  • 左矢印 — 前の言語に移動します(RTL レイアウトでは次の言語)。
  • Home — 最初の言語に移動します。
  • End — 最後の言語に移動します。
  • Enter / Space — フォーカスされている言語を選択します。

RTL サポート

このコンポーネントは、アラビア語、ヘブライ語、ペルシア語、ウルドゥー語、パシュトー語、シンド語、イディッシュ語など、右から左に書く言語に対応しています。

テキストを正しく組版するために、ロケールごとの方向は個々の Pill に適用されます。一方、全体のレイアウトと矢印キーによる操作は、ドキュメントまたはコンテナーの dir に従います。

const locales = [
  { code: "en", label: "English" },
  { code: "ar", label: "العربية", rtl: true },
  { code: "he", label: "עברית", rtl: true },
];

<LanguageSwitcherPill locales={locales} defaultLocale="en" />;

このページの内容