# 多言語対応 (i18n)

> 🇬🇧 [English](i18n.md)

Praxia は **8 言語** に対応。ランディングページと Streamlit UI が、ブラウザ / OS の言語を自動検出し、手動切替も可能。

## 対応言語

| コード | 名称 | ブラウザ/OS 検出 |
|---|---|---|
| `en` | English | (既定) |
| `ja` | 日本語 | `ja*` |
| `zh-CN` | 简体中文 | `zh*` (含 `zh-Hans-CN`, `zh-TW`) |
| `ko` | 한국어 | `ko*` |
| `es` | Español | `es*` (含 `es-MX`, `es-AR`) |
| `fr` | Français | `fr*` |
| `de` | Deutsch | `de*` (含 `de-AT`, `de-CH`) |
| `pt-BR` | Português (BR) | `pt*` |

## ランディングページ

- 検出優先順位: `localStorage["praxia-lang"]` → URL `?lang=…` → `navigator.languages` → `en`
- 手動切替: トップナビ内のチップ式セレクタ (選択は `localStorage` に保存)
- **翻訳対象範囲**: ヒーロー (h1 / サブ / kicker / CTA)、ナビリンク、ヒーローメタタグ、各セクション見出し (Try it / Why Praxia / Who it's for / Why OSS matters / FAQ)、フッターカテゴリ見出し、フッタータグ、シナリオセレクタラベル (I am / I want to / Run preview / Copy command)
- 本文 (FAQ 項目・コード例・機能カード本文・シナリオ実行例) は英語のまま。英語以外の閲覧者には「翻訳中」の小さな注釈を表示。これにより技術的内容は全閲覧者で完全一致
- SEO: 全 8 言語に対して `<link rel="alternate" hreflang="…">` を設定

## Streamlit UI

```python
from praxia.ui.i18n import t, language_selector_in_sidebar

language_selector_in_sidebar()      # 先頭付近で 1 回呼ぶ
st.title(t("app.title"))
st.caption(t("app.tagline"))
tab1, tab2, ... = st.tabs([t("tab.run_flow"), t("tab.skill"), ...])
```

検出優先順位: `st.session_state.praxia_lang` → `PRAXIA_UI_LANG` 環境変数 → `LANG` 環境変数 (POSIX `LANG=ja_JP.UTF-8` 等) → `en`。手動切替はサイドバーのドロップダウンから (セッション中保持)。

**翻訳対象範囲**: アプリタイトル / タグライン、サイドバーラベル、11 タブのラベル、共通動詞 (Run / Save / Delete / Cancel / Input / Output)、メモリモードラベル。

業務スキルの長文出力 (回答 / フレームワーク説明) は **LLM が生成する言語そのまま** — UI シェルの言語とは独立。日本語で出力させたいなら日本語でプロンプトする。

## 新言語の追加手順

1. [`web-publish/i18n.js`](../web-publish/i18n.js) と [`praxia/ui/i18n.py`](../praxia/ui/i18n.py) の `SUPPORTED` にコード追加
2. 両ファイルの `LANG_DISPLAY` に表示名追加
3. 翻訳辞書 (JS の `T` / Python の `_T`) の各キーに新言語の値を追加。完全性テスト (`tests/evaluation/test_eval_i18n.py::TestCompleteness::test_every_key_has_every_language`) が網羅まで赤
4. `pytest tests/evaluation/test_eval_i18n.py -v` で検証
5. `web-publish/index.html` に `<link rel="alternate" hreflang="…">` を追加
6. PR を提出 — 評価スイートが翻訳漏れを自動検知

## 新翻訳キーの追加手順

1. `praxia/ui/i18n.py` (UI) または `web-publish/i18n.js` (ランディング) の翻訳辞書にキー + 全 8 言語の値を追加
2. テンプレートで `data-i18n="key"` (ランディング) または `t("key")` (UI) を使用
3. テストスイート実行 — `TestCompleteness` が部分実装を検知

## なぜこの範囲か

1500 行のランディングを完全翻訳するのは小規模 OSS チームには非現実的。**ファネル上部の UI 文字列** (第一印象のコンバージョンに効く部分) を翻訳するのが高レバレッジ。本文は英語維持により:

- 検索エンジンは英語でインデックス (技術的 SEO が最強)
- コード例の正確性維持 (API 名は英語のみ)
- 本文更新時に 8 言語×毎回の翻訳が不要
- 翻訳済ナビからランディングしたユーザは、必要に応じてブラウザ自動翻訳で残りを読める

特定言語で本文も完全翻訳が欲しい場合は Issue へ — コミュニティ翻訳 PR 歓迎。
