From 9774ac42f863433d94eb4538db9d59460dd81629 Mon Sep 17 00:00:00 2001 From: Kae Date: Sun, 14 Sep 2025 23:07:08 +0900 Subject: [PATCH] docs: dd Japanese translations --- fundamentals/a11y/.vitepress/config.mts | 83 +++++- fundamentals/a11y/ja/alt-text/image-alt.md | 135 +++++++++ fundamentals/a11y/ja/eslint/design-system.md | 195 +++++++++++++ fundamentals/a11y/ja/eslint/rules.md | 273 ++++++++++++++++++ fundamentals/a11y/ja/index.md | 56 ++-- fundamentals/a11y/ja/overview.md | 14 + fundamentals/a11y/ja/playground.md | 33 +++ .../a11y/ja/predictability/fake-button.md | 82 ++++++ fundamentals/a11y/ja/predictability/form.md | 100 +++++++ fundamentals/a11y/ja/principles.md | 29 ++ .../semantic/duplicate-interactive-element.md | 155 ++++++++++ .../a11y/ja/semantic/required-label.md | 148 ++++++++++ .../a11y/ja/structure/button-inside-button.md | 128 ++++++++ .../a11y/ja/structure/table-row-link.md | 82 ++++++ fundamentals/a11y/ja/why.md | 70 +++++ 15 files changed, 1553 insertions(+), 30 deletions(-) create mode 100644 fundamentals/a11y/ja/alt-text/image-alt.md create mode 100644 fundamentals/a11y/ja/eslint/design-system.md create mode 100644 fundamentals/a11y/ja/eslint/rules.md create mode 100644 fundamentals/a11y/ja/overview.md create mode 100644 fundamentals/a11y/ja/playground.md create mode 100644 fundamentals/a11y/ja/predictability/fake-button.md create mode 100644 fundamentals/a11y/ja/predictability/form.md create mode 100644 fundamentals/a11y/ja/principles.md create mode 100644 fundamentals/a11y/ja/semantic/duplicate-interactive-element.md create mode 100644 fundamentals/a11y/ja/semantic/required-label.md create mode 100644 fundamentals/a11y/ja/structure/button-inside-button.md create mode 100644 fundamentals/a11y/ja/structure/table-row-link.md create mode 100644 fundamentals/a11y/ja/why.md diff --git a/fundamentals/a11y/.vitepress/config.mts b/fundamentals/a11y/.vitepress/config.mts index dd762214..430d0ade 100644 --- a/fundamentals/a11y/.vitepress/config.mts +++ b/fundamentals/a11y/.vitepress/config.mts @@ -24,7 +24,88 @@ export default defineConfig({ ja: { label: "日本語", lang: "ja", - themeConfig: { nav: [{ text: "ホーム", link: "/ja" }] } + themeConfig: { + nav: [{ text: "ホーム", link: "/ja/" }], + sidebar: [ + { + text: "紹介", + items: [ + { text: "はじめに", link: "/ja/overview" }, + { text: "体験してみる", link: "/ja/playground" }, + { text: "アクセシビリティを守る理由", link: "/ja/why" }, + { text: "主要原則", link: "/ja/principles" } + ] + }, + { + text: "実践ガイド", + items: [ + { + text: "1. 構造を明確にする", + items: [ + { + text: "ボタンの中にボタンを入れない", + link: "/ja/structure/button-inside-button" + }, + { + text: "テーブル行に直接onClickを付けない", + link: "/ja/structure/table-row-link" + } + ] + }, + { + text: "2. 意味を正確に伝える", + items: [ + { + text: "インタラクティブ要素に名前を付ける", + link: "/ja/semantic/required-label" + }, + { + text: "同じ名前の要素には説明を追加する", + link: "/ja/semantic/duplicate-interactive-element" + } + ] + }, + { + text: "3. 予測可能な動作を作る", + items: [ + { + text: "ボタンの役割と動作を一致させる", + link: "/ja/predictability/fake-button" + }, + { + text: "入力要素は <form> で包む", + link: "/ja/predictability/form" + } + ] + }, + { + text: "4. 視覚情報を補完する", + items: [ + { + text: "画像とアイコンに適切な代替テキストを提供する", + link: "/ja/alt-text/image-alt" + } + ] + } + ] + }, + { + text: "発展ガイド", + items: [ + { + text: "ESLintでアクセシビリティを改善する", + items: [ + { text: "主要ルール紹介", link: "/ja/eslint/rules" }, + { + text: "デザインシステムと組み合わせる", + link: "/ja/eslint/design-system" + } + ] + } + ] + } + ] + } }, "zh-hans": { label: "简体中文", diff --git a/fundamentals/a11y/ja/alt-text/image-alt.md b/fundamentals/a11y/ja/alt-text/image-alt.md new file mode 100644 index 00000000..8b0b46e8 --- /dev/null +++ b/fundamentals/a11y/ja/alt-text/image-alt.md @@ -0,0 +1,135 @@ +# 画像やアイコンに適切な代替テキストを提供する + +画像やアイコンを使うときは、スクリーンリーダー利用者のために適切な代替テキストを提供する必要があります。ただし、すべての画像に代替テキストが必要というわけではありません。このドキュメントでは、いつ・どのように代替テキストを付けるべきかを説明します。 + +## 代替テキストを提供すべきとき + +画像やアイコンが**情報を伝える、または機能を表す**場合は、必ず意味のある代替テキストを付けましょう。画像やアイコンしかない場面では、代替テキストが視覚情報を補う唯一の手段になるため、テキストがないとユーザー体験が大きく損なわれます。 + +### ❌ 誤った例:意味のあるアイコンに代替テキストがない + +次のように代替テキストを空にすると、スクリーンリーダー利用者はこのボタンが何の機能なのか分かりません。 + +```html + +``` + +### ✅ 正しい例:意味のあるアイコンに代替テキストを付ける + +```html + +``` + +## 代替テキストを付けなくてよいとき + +### 1. 装飾目的の画像 + +画像が単なる装飾で、視覚的効果だけを目的としているなら、空の代替テキスト(`alt=""`)を使いましょう。 + +#### ❌ 誤った例:装飾画像に不要な代替テキスト + +スクリーンリーダーがこのテキストを読み上げ、不要な情報となってしまいます。 + +```html +区切り線 +``` + +#### ✅ 正しい例:装飾画像には空のalt属性 + +```html + +``` + +### 2. 画像の周辺に説明テキストがある場合 + +画像の近くに十分な説明があるなら、画像側は空の代替テキストを使いましょう。 + +#### ❌ 誤った例:重複する代替テキスト + +次のように周囲に説明があるのに、同じ内容を代替テキストとしても提供すると、スクリーンリーダーでは「新製品スマートフォン 新製品スマートフォン」のように重複して読み上げ、混乱の原因になります。 + +```html +
+ 신제품 스마트폰 +
新製品スマートフォン
+
+``` + +#### ✅ 正しい例:キャプションがある画像では省略 + +```html +
+ +
新製品スマートフォン
+
+``` + +### 3. アイコンがテキストと一緒に使われる場合 + +アイコンがテキストと一緒にボタンやリンクで使われるときは、空の代替テキストを使いましょう。 + +#### ❌ 誤った例:不要な重複情報 + +スクリーンリーダーで「削除 アイコン 削除」と重複して読まれてしまい、かえってわかりにくくなります。 + +```html + +``` + +#### ✅ 正しい例:テキストがあるアイコンでは省略 + +```html + +``` + +## 効果的な代替テキストを書く + +良い代替テキストは短く、明確で、画像の目的に合っている必要があります。以下の原則を参考に、状況に合わせて記述しましょう。 + +### 1. 明確かつ具体的に書く + +代替テキストは、その画像が伝える意味を正確に説明するべきです。あいまいな言葉や抽象的な表現は、ユーザーが画像から得るべき情報を理解しづらくします。 + +| 区分 | 例 | 説明 | +| ---------- | -------------------- | ------------------------------------------------------ | +| ❌ 悪い例 | "アイコン" | アイコンの用途や機能に関する情報がありません。 | +| ✅ 良い例 | "検索" | アイコンが何を意味するかを明確に伝えます。 | +| ❌ 悪い例 | "グラフ" | このグラフが何を示すのか分かりません。 | +| ✅ 良い例 | "2023年の売上グラフ" | グラフがどのデータを示すかを具体的に説明します。 | + +### 2. 不要な語を省く + +代替テキストはスクリーンリーダーが読むためのものなので、「アイコン」「ボタン」のような語はたいてい冗長です。スクリーンリーダーは、画像を含む要素の役割(ボタンなど)を既に理解しているため、代替テキストでは情報だけを簡潔に伝えるのが望ましいです。 + +| 区分 | 例 | 説明 | +| ---------- | ------------- | --------------------------------------------------------------------------------------- | +| ✅ 良い例 | "検索" | | +| ❌ 悪い例 | "検索アイコン" | スクリーンリーダーは「検索、ボタン」と読むため、「アイコン」は重複して不要です。 | +| ✅ 良い例 | "閉じる" | | +| ❌ 悪い例 | "閉じるボタン" | ボタンという役割は既に明らかなので、テキストでは省略したほうがすっきりします。 | + +### 3. 画像の目的と文脈を考慮する + +同じ画像でも、使われる文脈によって適切な代替テキストは変わり得ます。次のコードで「矢印」という説明は、見た目を述べているだけで、ユーザーにどんな操作が可能かは伝えません。 + +「前のページへ移動」のような代替テキストは、機能を正確に説明し、ユーザーの期待と実際の動作を一致させます。 + +```html + +矢印 +矢印 + + +前のページへ移動 +次のページへ移動 +``` diff --git a/fundamentals/a11y/ja/eslint/design-system.md b/fundamentals/a11y/ja/eslint/design-system.md new file mode 100644 index 00000000..04564a67 --- /dev/null +++ b/fundamentals/a11y/ja/eslint/design-system.md @@ -0,0 +1,195 @@ +# デザインシステムと組み合わせる + +多くの組織ではデザインシステムを導入し、``や``のような独自コンポーネントを使用しています。しかし`eslint-plugin-jsx-a11y`は基本的に標準の HTMLタグに対してのみ動作するため、デザインシステムのコンポーネントにもアクセシビリティ規則を適用するには追加設定が必要です。 + +## 1. 컴포넌트 매핑하기 + +たとえば``コンポーネントが実際には` +``` + +**✅ 正しい例** + +```jsx + +``` + +### control-has-associated-label + +インタラクティブ要素(入力フィールド、ボタン、セレクトなど)には、目的をユーザーに明確に伝える名前が必須です。名前がない/不明確な要素は、スクリーンリーダー利用者や音声アシスタント利用者に大きな不便を与えます。詳しくは[インタラクティブ要素に名前を付ける](../semantic/required-label)を参照してください。 + +`eslint-plugin-jsx-ally`の recommendedではこのルールは既定で無効なので、次のように`rules`に明示的に追加して有効化してください。 + +:::tabs key:bundler-object-entry +== flat config + +```js{7} +import jsxA11y from 'eslint-plugin-jsx-a11y'; + +export default [ + jsxA11y.flatConfigs.recommended, + { + rules: { + 'jsx-a11y/control-has-associated-label': 'error', + } + } +]; +``` + +== legacy config + +```js{7} +{ + "plugins": ["jsx-a11y"], + "extends": [ + "plugin:jsx-a11y/recommended" + ], + "rules": { + "jsx-a11y/control-has-associated-label": "error" + } +} +``` + +::: + +#### アイコンボタンにラベルがない場合 + +**❌ 誤った例** + +```jsx + +``` + +**✅ 正しい例** + +```jsx + +// または + +``` + +### no-noninteractive-element-interactions + +非インタラクティブ要素(`
`、``など)にクリックハンドラーを付ける場合は、必ず`role`などでインタラクティブ要素であることを明示してください。 + +::: details インタラクティブ要素の一覧 +| 要素 | 条件 | +|------|------| +| `` | - | +| `