Skip to content

インターナショナル化とアクセシビリティ

公開日:December 8, 2024更新日:December 8, 2024
ReactTypeScriptCoding📄

グローバルなユーザーに対応するためにインターナショナル化(i18n)とアクセシビリティ(a11y)は欠かせない要素です。本章では、i18nライブラリの活用や型を用いた翻訳キー管理、アクセシビリティ基準の対応、そしてテストによる保証について解説します。

1. i18nライブラリの活用 (react-i18nextなど)

react-i18nextの導入

  • 特徴:
    • React用のi18nライブラリで、翻訳の切り替えやプラグインの柔軟性が特徴。

導入手順

bash
yarn add react-i18next i18next

基本的な実装例

tsx
import React from "react";
import { useTranslation } from "react-i18next";

const resources = {
  en: { translation: { welcome: "Welcome" } },
  ja: { translation: { welcome: "ようこそ" } },
};

import i18n from "i18next";
import { I18nextProvider } from "react-i18next";

i18n.init({
  resources,
  lng: "en",
  interpolation: { escapeValue: false },
});

const App = () => {
  const { t } = useTranslation();

  return <h1>{t("welcome")}</h1>;
};

export default () => (
  <I18nextProvider i18n={i18n}>
    <App />
  </I18nextProvider>
);

2. 型を用いた翻訳キーの管理

型安全な翻訳キー管理

  • 型を用いることで、誤った翻訳キーを防ぐ。

TypeScriptを使った翻訳キーの型定義

ts
const resources = {
  en: { welcome: "Welcome" },
  ja: { welcome: "ようこそ" },
} as const;

type TranslationKeys = keyof typeof resources["en"];

const t = (key: TranslationKeys) => resources.en[key];

console.log(t("welcome")); // "Welcome"

react-i18nextでの型安全性

  • react-i18nextは型定義をカスタマイズ可能。

型定義の拡張例

ts
import "react-i18next";

declare module "react-i18next" {
  interface CustomTypeOptions {
    resources: {
      translation: {
        welcome: string;
      };
    };
  }
}

3. アクセシビリティ基準への対応 (ARIA属性やスクリーンリーダー)

アクセシビリティの基本

  • ARIA属性:
    • アクセシビリティを向上させるためのHTML属性。
  • スクリーンリーダー対応:
    • ページ内容が視覚以外の手段でも理解できるようにする。

ARIA属性の使用例

tsx
const AccessibleButton = ({ label, onClick }: { label: string; onClick: () => void }) => (
  <button onClick={onClick} aria-label={label}>
    {label}
  </button>
);

ランドマークの活用

tsx
const AccessiblePage = () => (
  <main aria-labelledby="main-heading">
    <h1 id="main-heading">Page Title</h1>
    <section aria-labelledby="section-heading">
      <h2 id="section-heading">Section Title</h2>
    </section>
  </main>
);

4. テストによるアクセシビリティ保証

React Testing Libraryでのアクセシビリティテスト

  • 特徴:
    • ユーザーインタラクションを模倣したテストが可能。

基本的なテスト例

tsx
import { render } from "@testing-library/react";
import App from "./App";

test("button has accessible role", () => {
  const { getByRole } = render(<button aria-label="Submit">Submit</button>);
  expect(getByRole("button")).toHaveAccessibleName("Submit");
});

Axeによるアクセシビリティ検証

  • 特徴:
    • 自動化されたアクセシビリティテストツール。

使用例

tsx
import { render } from "@testing-library/react";
import { axe } from "jest-axe";
import App from "./App";

test("should have no accessibility violations", async () => {
  const { container } = render(<App />);
  const results = await axe(container);
  expect(results).toHaveNoViolations();
});

インターナショナル化とアクセシビリティの対応は、アプリケーションをより包括的で使いやすいものにします。本章で紹介した方法を活用し、全てのユーザーに優しいアプリケーションを構築しましょう。