export type Lang = "ja" | "en";

/**
 * モック（d-watch-mock.jsx）の対訳テーブル。
 * キーは日本語原文。EN時のみ差し替える。
 */
const EN: Record<string, string> = {
  "DFAロボット監視システム": "DFA Robot Monitoring System",
  "DFA運用担当": "DFA Operator",
  "📊 ダッシュボード": "📊 Dashboard",
  "📋 清掃詳細ログ": "📋 Cleaning Logs",
  "🔔 アラート": "🔔 Alerts",
  "📈 レポート": "📈 Reports",
  // ★清掃面積（指示書AN 段階5）★ — メニューの並びに合わせてここに置く
  "📐 清掃面積": "📐 Cleaning Area",
  "🔧 点検記録": "🔧 Inspections",
  "🔒 D-Secログ": "🔒 D-Sec Logs",
  "⚠ D-Secアラート": "⚠ D-Sec Alerts",
  "🏢 施設ロボットマスタ": "🏢 Facility Master",
  "📅 スケジュール": "📅 Schedules",
  "⚙ システム管理": "⚙ System Admin",
  モニタリング: "MONITORING",
  設定: "SETTINGS",
  施設名: "Facility",
  機種: "Model",
  シリアル: "Serial",
  日付: "Date",
  予定: "Scheduled",
  出発: "Dep.",
  清掃結果: "Clean Result",
  完了率: "Completion",
  判定: "Grade",
  ダッシュボード: "Dashboard",
  清掃詳細ログ: "Cleaning Detail Log",
  "アラート（事前チェック）": "Alerts (Pre-check)",
  レポート: "Reports",
  "D-Sec ログ": "D-Sec Logs",
  "D-Security アラート": "D-Security Alerts",
  施設ロボットマスタ: "Facility Robot Master",
  スケジュール管理: "Schedule Mgmt",
  システム管理: "System Admin",
  点検記録: "Inspection Records",
  CSV: "CSV",
  // ---- 分類（ホールディングス / 顧客 / 店舗）。指示書AK §2-5 ----
  // ★第11回 P-15=B（`customers` は法人の単位）で確定。2026-10-05 に見出し語を「屋号」から「顧客」に変えた（D-158。指示書AU 段階4）★。
  //   ★キーごと改名した★（旧キーは残さない。片方だけ直した画面が「屋号」のまま出ても気づけなくなるため）。
  //   旧: 2026-09-15「屋号でよいです、ただ顧客によってはない場合もあります」で「屋号」にしていた（TeamWorks 第9回 Q7-1 の回答待ち）。
  // ★英語は仮★（"Customer" / "All Customers"。大文字は既存の "All Holdings" にそろえた。§11 Q7）—
  //   ★英語は後でユーザーがまとめて見直す★。
  // ★見出し語をここ1箇所に集めてある★（呼び出し側は `t("顧客")` / `t("全顧客")`）。
  // ★旧キー「全グループ」「全会社」は削除した★（指示書AK 段階7 の判断）—
  //   モックの文言で、5画面すべてが「全ホールディングス」「全屋号」に差し替わり、
  //   ★アプリ側の参照が1件も無くなった★（残る出現箇所は `d-watch-mock.jsx` だけで、
  //   モックは自前の辞書を持つためこの定義には依存しない）。
  ホールディングス: "Holdings",
  顧客: "Customer",
  全ホールディングス: "All Holdings",
  全顧客: "All Customers",
  全件: "All",
  "△×のみ": "△× Only",
  "×のみ": "× Only",
  問題エリアのみ: "Problems Only",
  "エリア別詳細を見る →": "View Area Details →",
  エリア別清掃完了率: "Area Completion Rates",
  // ★エリア別完了率モーダル（F-02。指示書Z 段階6）★ — 件数行は画面が {n}/{m} を差し込む
  //   （`{n}日連続で出発失敗` 等と同じ方式A）。★キーは日本語原文と1文字も違わないこと★
  "問題エリア（{n} / {m}エリア）": "Problem areas ({n} / {m})",
  "全{n}エリア（完了率昇順）": "All {n} areas (by completion rate)",
  "問題エリアはありません（全エリア◎○）": "No problem areas (all ◎○)",
  // ★モーダルのヘッダ（施設名 | 日付 | 全体 xx%）★ — ここだけ対訳が無く EN で和文が残っていた
  全体: "Overall",
  // ★「全部◎○だった」と区別するための文言★ — エリアが1件も無いのはデータ側の問題なので
  //   「問題エリアはありません」と同じ表示にしない
  "エリアのデータがありません": "No area data",
  "読み込み中…": "Loading…",
  閉じる: "Close",
  準備中: "Coming soon",

  // ---- レポート（F-04）。指示書F 5-8 ----
  // モックの T 辞書（d-watch-mock.jsx:138-147）からの移植。
  // ★`完了率`（= "Completion"）は上に既にあるため再掲しない★
  CSVエクスポート: "CSV Export",
  検索: "Search",
  全ステータス: "All Status",
  週次: "Weekly",
  月次: "Monthly",
  // ★レポート画面の粒度タブ3つ目（2026-09-30。指示書AQ 決定1）★
  年次: "Yearly",
  // ★清掃詳細ログの事前チェック列の見出し（ユーザー判断 2026-10-16「案1」。D-178）★ —
  //   列は「その清掃の何回目の事前チェックか」（早い方が1回目）。何分前かはセルの中に出す
  //   （事前チェックの時刻は設定で変わるため、見出しに分数を書かない）。
  //   ★旧キー「1h前ST」「30分前ST」は削除した★（画面の参照が無くなった。CSV の見出しは `lib/clean-logs/csv.ts` が直書きで、辞書を通らない）
  事前チェック1回目: "Pre-check 1",
  事前チェック2回目: "Pre-check 2",
  稼働率: "Uptime",
  出発成功率: "Dep. Rate",
  清掃完了率: "Completion",
  エラー発生率: "Error Rate",
  連続問題施設: "Recurring Issues",
  エラー種別の内訳: "Error Breakdown",
  "施設別パフォーマンス（稼働率ワースト順）": "Facility Performance (Worst Uptime)",
  要改善: "Needs Fix",
  注意: "Caution",
  良好: "Good",
  // ★施設別パフォーマンスの4値目（D-109 決定1'）★ — 当期に実施済みの清掃が1件も無く
  //   稼働率が算出できない施設。★週の初め・月の初めにだけ現れる★ので見落としやすい。
  //   ★`translate()` は未登録キーを日本語のまま返すため、足さないと EN で1つだけ和文が混ざる★
  判定なし: "No Data",
  前週: "Prev Week",
  前月: "Prev Month",
  // ★年次の解禁に伴って追加（2026-09-30。指示書AQ 決定1）★ —
  //   `ReportsScreen` は `t(prevPeriodLabel(period))` と、★関数の戻り値をそのまま辞書キーにする★
  //   （`lib/format/period.ts` の `prevPeriodLabel()`）。★ここに無いと EN で「前年」だけ和文で残る★
  前年: "Prev Year",
  該当施設なし: "No matching facilities",
  上位10件に戻す: "Back to top 10",
  エラー率: "Error Rate",
  変化: "Change",
  ステータス: "Status",
  // ★指示書O 段階3★: エラー種別の内訳ラベルが空の場合の代替文言(`lib/format/raw-label.ts`)
  "(値なし)": "(no value)",

  // ---- 数値が文中に入るラベル（指示書F 5-5 / 5-7 のフッタ）----
  // `translate()` はキーの完全一致でしか引けないため、`他5件を表示 →` のように
  // 数値が混ざったラベルはそのままではキーにできない。
  // 画面担当が選べるよう **2方式ぶんのキーを用意している**。どちらか一方だけを使い、
  // 使わなかった方は画面実装が固まった時点で削除してよい。
  //
  //   方式A（プレースホルダ + replace）★推奨★
  //     t("他{n}件を表示 →").replace("{n}", String(n))
  //     → ja: 「他5件を表示 →」 / en: "View 5 more →"
  //     語順が言語ごとに違っても対訳側で吸収できるため、こちらを推す。
  //
  //   方式B（前後を分割して連結）
  //     t("他") + n + t("件を表示 →")
  //     → ja: 「他5件を表示 →」 / en: "View 5 more →"
  //     ★注意★ `他` / `全` のような1文字キーは他画面の文言と衝突しやすい
  //     （将来 `全` 単体を別の意味で使うと巻き込まれる）。方式Aなら衝突しない。
  "他{n}件を表示 →": "View {n} more →",
  "全{n}施設を表示 →": "View all {n} facilities →",
  他: "View ",
  "件を表示 →": " more →",
  全: "View all ",
  "施設を表示 →": " facilities →",

  // ---- D-Secログ（F-06）の「備考」インライン編集 ----
  クリックして備考を編集: "Click to edit note",
  備考を入力: "Enter a note",
  "保存中…": "Saving…",
  // 画面側の既定文言（サーバーが `{ error: { message } }` を返さなかった場合に出る）
  保存に失敗しました: "Failed to save",
  // PATCH /ds-devices/{serial_number}/note がエラー時に返す文言。
  // セル下の赤字にはサーバーの文言がそのまま入るため、ここに載せた分だけ EN になる
  // （`translate()` はキーが無ければ原文を返すので、未収録でも表示は壊れない）
  デバイスが見つかりません: "Device not found",
  備考の保存に失敗しました: "Failed to save the note",
  "noteが長すぎます": "Note is too long",

  // ---- アラート（F-03）の対応状況（指示書AT §3-8。D-105 で「キーが無い」と申し送られていたもの）----
  // ★足すと既存のバッジ・サマリカードの「未解消」も英語になる★
  未解消: "Unresolved",
  対応中: "In progress",
  解消: "Resolved",
  対応状況の更新に失敗しました: "Failed to update the status",

  // ---- 施設ロボットマスタ（F-08）----
  // ★`施設名` / `シリアル` / `機種` は上に既にあるため再掲しない★
  "施設名 / シリアル / 住所": "Facility / Serial / Address",
  該当する施設はありません: "No matching facilities",
  都道府県: "Prefecture",
  住所: "Address",
  電話番号: "Phone",
  責任者名: "Manager",
  担当者名: "Contact",
  メール: "Email",
  監視: "Monitor",
  // 製品名なので EN でも同じ。`translate()` は未収録でも原文を返すため表示は変わらないが、
  // 「訳し漏れ」と「意図的に同じ」を区別できるように載せておく
  "D-Sec": "D-Sec",
  "ロボット（メーカー / 機種 / シリアル）": "Robot (Maker / Model / Serial)",
  // 対応機種レジストリ（lib/config/index.ts の ROBOT_MODELS）に無い機種のバッジ（指示書N）
  未対応: "Unsupported",
  // ★旧「全{n}施設」は削除した（指示書AA 段階5）★ — 施設一覧のフッタを
  //   共通部品 `components/ui/Pagination` に置き換え、件数表示を
  //   「全{total}件中 {from}〜{to}件」に6画面で統一したため使われなくなった。
  //   ★`"全{n}施設を表示 →"` は別のキー★（レポート画面の
  //   `FacilityPerformanceTable` が使用中）なので消さないこと。

  // ---- スケジュール管理（F-09）----
  // ★`シリアル` / `施設名` は上に既にあるため再掲しない★
  "施設名 / シリアル": "Facility / Serial",
  該当するスケジュールはありません: "No matching schedules",
  曜日: "Days",
  時間: "Time",
  有効: "Active",

  // ---- システム管理（F-10）運用設定 ----
  "清掃監視の運用パラメータ。変更はDFAシステム管理者のみ":
    "Cleaning monitoring parameters. Changes by DFA system administrators only",
  運用設定: "Operation Settings",
  // ★旧「この画面は現在 参照のみ です。」「設定値の編集はP1後半で対応します。」は削除した
  //   （指示書AF 段階7-3）★ — 連続日数の表示上限だけが編集できるようになり、
  //   文言が事実と食い違うようになったため。他に使っている箇所が無いことを確認済み。
  "この画面は一部の設定のみ編集できます。":
    "Only some settings on this screen can be edited.",
  "編集できない設定には「編集不可」と表示します。":
    "Settings that cannot be edited are marked “Read-only”.",
  事前チェック設定: "Pre-check Settings",
  清掃開始予定時刻の何分前にロボット状態をチェックするか:
    "How many minutes before the scheduled cleaning start time the robot status is checked",
  // 数値混じり（方式A: プレースホルダ + replace）。1文字キー（第/分前/日以上連続）にしない
  "第{n}回チェック": "Check #{n}",
  "{n}分前": "{n} min before",
  // ★アラート（F-03）の種別ラベル（指示書S 2-3 / D-105）★
  //   分数を enum に持てないため、画面が `precheck_minutes` から組み立てる（方式A）。
  //   ★この3つは従来 `lib/i18n.ts` にキーが無く、EN でも日本語のまま出ていた★
  //   （`AlertsScreen.tsx` は `t()` を通していたが対訳が無かった）。
  "{n}分前異常": "Error {n} min before",
  出発失敗: "Launch failed",
  // ★清掃結果（`clean_task_reports.status`）の表示名（第10回 N-2。D-155 項2）★ —
  //   ★英語は仮。ユーザーが後でまとめて見直す★。表に無い値（6 など）は数字のまま出る（辞書に無いので）
  清掃開始前: "Not started",
  清掃中: "Cleaning",
  清掃中断: "Interrupted",
  清掃キャンセル: "Cancelled",
  清掃正常終了: "Completed",
  清掃異常終了: "Ended abnormally",
  // ★結果待ち（ユーザー判断 2026-10-07。D-173）★ — 詳細ログの清掃結果列（`CLEAN_RESULT_PENDING_LABEL`）と
  //   ダッシュボードの「結果待ち」カード（副題「レポートの到着待ち」）が共有する。★英語は仮★
  結果待ち: "Pending",
  レポートの到着待ち: "Waiting for report",
  // `severity: "precheck"` なのに `precheck_minutes` が null のときのフォールバック
  事前チェック異常: "Pre-check error",
  // ★同じ画面（`AlertsScreen.tsx`）でキーが無かったもの（指示書S 2-3）★
  残量: "Battery",
  検知: "Detected",
  "{n}日以上連続": "{n}+ consecutive days",
  // ★連続問題施設（F-04）の summary（指示書W）★ — サーバはテンプレート文字列のまま返し
  //   （方式A）、画面が {n}/{m} を差し込む。lib/db/report-mapping.ts の
  //   SUMMARY_TEMPLATE_COMPLETION / SUMMARY_TEMPLATE_LAUNCH_FAILED / SUMMARY_TEMPLATE_MIXED
  //   と★1文字も違わないこと★（違うと translate() が未登録キーとして日本語のまま返る）
  "{n}日連続で完了率が△以下": "Completion rate △ or below for {n} consecutive days",
  "{n}日連続で出発失敗": "Launch failed for {n} consecutive days",
  "{n}日連続で△以下（うち{m}日は出発失敗）":
    "△ or below for {n} consecutive days ({m} with launch failure)",
  // ★連続問題施設（F-04）のバッジ（指示書AF 段階5-3）★ — 従来 `日` を t() に通しておらず
  //   EN でも「5日」と出ていた（指示書AF §H-4）。既存キー `"{n}日以上連続"`（上）は
  //   システム管理画面が使っているので★書き換えない★。バッジには短い方を使う。
  "{n}日": "{n} days",
  "{n}日以上": "{n}+ days",
  // ★連続問題施設の summary が表示上限で頭打ちになったとき（指示書AF 段階5-3）★ —
  //   `lib/db/report-mapping.ts` の SUMMARY_TEMPLATE_CAPPED_COMPLETION /
  //   _CAPPED_LAUNCH_FAILED / _CAPPED_MIXED と★1文字も違わないこと★。
  //   ★混在の上限用テンプレートには {m} が無い★（指示書AF §B-5）
  "{n}日以上連続で完了率が△以下":
    "Completion rate △ or below for {n}+ consecutive days",
  "{n}日以上連続で出発失敗": "Launch failed for {n}+ consecutive days",
  "{n}日以上連続で△以下（出発失敗を含む）":
    "△ or below for {n}+ consecutive days (including launch failures)",

  // ---- ダッシュボードの見出し（F-01。D-159 / 指示書AV 段階5-2）----
  // ★数値カードと清掃詳細ログ（コンパクト版）は「各清掃エリアの直近の清掃」★（7日以内）。
  //   {n} には `DASHBOARD_LATEST_RUN.lookbackDays` を差し込む（方式A。日数を直書きしない）。
  //   ★モック（`d-watch-mock.jsx:476`。旧見出し「昨夜の…」）とは文言が違う★（D-159 でユーザーが変えた）。
  //   ★EN は暫定★（ユーザーが後でまとめて見直す）
  "直近の清掃結果サマリー（各清掃エリアの最後の清掃・{n}日以内）":
    "Latest cleaning results (last run per area, within {n} days)",

  // ---- 要レスキュー店舗（F-01。ユーザー指示 2026-09-15 / 指示書AI 段階6）----
  // ★API が返すのは識別子（reasons）と数値だけ★（D-111）。文言を作るのは
  //   `components/features/dashboard/RescueRequiredCard.tsx` の1箇所で、
  //   数値は方式A（プレースホルダ + replace）で差し込む。
  // ★`完了率` は上に既にあるため再掲しない★（重複キーは lint が落とす）
  要レスキュー店舗: "Facilities Needing Rescue",
  // ★0件でもカードを消さないので、この文言が必ず要る★（理由はカード側の docstring）
  要レスキューの店舗はありません: "No facilities need rescue",
  // ★リクエストした日とは限らない★（予定の無い施設はそれ以前の最新スケジュール存在日）
  判定日: "Evaluated on",
  前回: "Previous",
  "{n}件": "{n} facilities",
  "{n}日連続で未実施": "Not executed for {n} consecutive days",
  "連続問題レベル3（{n}日連続）": "Escalation level 3 ({n} consecutive days)",
  "完了率が前回比{n}%低下": "Completion rate down {n}% vs. previous",
  // ★低下の比が算出できないのに急落と判定された場合の保険★（0% と書かないため）
  完了率が前回比で急落: "Completion rate dropped sharply vs. previous",
  // ★初期表示は5件で、超えるぶんはこのボタンで開く★（指示書AJ 段階1 / §4-4）—
  //   ★API は件数で切らない★ので、{n} には「まだ見えていない件数」が入る（方式A。D-111）。
  //   ★閉じる側は既存キー（モーダルの `閉じる`）を使い回す★ — 同じ語・同じ意味なので
  //   キーを増やすと対訳が二重管理になる（重複キーは lint が落とす）。
  "もっと表示（あと{n}件）": "Show all ({n} more)",
  完了率の判定閾値: "Completion Rate Thresholds",
  "清掃詳細ログの◎○△×判定に使用する閾値。上から順に評価します":
    "Thresholds for the ◎○△× grade in the cleaning detail log. Evaluated from the top",
  // ★境界は「上のランクに入る」（D-139。2026-09-16）★ — 90.0 は ◎、70.0 は ○、10.0 は △。
  //   旧規則（下位に落ちる）の文言に戻さないこと。`lib/judge/grade.ts` の比較は `>=`。
  "判定は丸める前の生値で行います（表示は小数第1位を四捨五入した整数）。境界値ちょうどは上位の判定になります。":
    "Grading uses the raw value before rounding (the display is rounded to the nearest integer). A value exactly on a boundary is included in the higher grade.",
  "アドバイス エスカレーション閾値": "Advice Escalation Thresholds",
  "同一施設で問題（出発失敗 または △以下）が連続した場合のレベル引き上げ基準":
    "Criteria for raising the level when problems (departure failure or △ and below) continue at the same facility",
  "「連続」はカレンダー日ではなく、清掃スケジュールが存在する日の連続で数えます。清掃予定のない日は連続を途切れさせません。":
    "“Consecutive” is counted over days that have a cleaning schedule, not calendar days. Days with no cleaning scheduled do not break the streak.",
  // ★連続日数の表示上限（指示書AF 段階7）★ — この画面で唯一編集できる設定。
  //   `日` は単位のラベル（入力欄の右）で、`t("日")` を呼ぶのはこの1箇所だけ。
  //   数値と連結する文言（`{n}日` / `{n}日以上` / `{n}日以上連続`）は別キー（方式A）。
  連続日数の表示上限: "Consecutive Days Display Cap",
  "連続問題施設などで、連続日数がこの日数を超えたとき「{n}日以上」と表示します":
    "When a streak exceeds this number of days, it is shown as “{n}+ days” (e.g. in Facilities with Continuous Problems)",
  日: "days",
  保存: "Save",
  既定値に戻す: "Reset to default",
  保存しました: "Saved",
  // 空欄のまま保存した場合の画面側の文言（`Number("") === 0` を送らないための足切り）
  日数を入力してください: "Enter the number of days",
  表示上限の取得に失敗しました: "Failed to load the display cap",
  // PATCH /settings/display-limits がエラー時に返す文言。
  // 入力欄の下の赤字にはサーバーの文言がそのまま入るため、ここに載せた分だけ EN になる
  // （`translate()` はキーが無ければ原文を返すので、未収録でも表示は壊れない）
  "JSONの形式が不正です": "Invalid JSON format",
  "keyの値が不正です": "Invalid key",
  "valueの値が不正です": "Invalid value",
  設定の保存に失敗しました: "Failed to save the setting",
  アドバイス文言: "Advice Text",
  清掃詳細ログに表示される推定原因と推奨アクション:
    "Estimated causes and recommended actions shown in the cleaning detail log",
  "発火条件（どのルールがいつ出るか）は仕様のため編集不可です。":
    "Trigger conditions (which rule fires when) are part of the specification and cannot be edited.",
  アドバイス文言は登録されていません: "No advice text registered",
  // アドバイスのレベル表示（`LEVEL_LABEL`）。★`注意` は上に既にあるため再掲しない★
  警告: "Warning",
  重大: "Critical",
  // アドバイスのフェーズ表示（`PHASE_LABEL`）
  "Phase A（完了率・連続日数）": "Phase A (Completion rate / Consecutive days)",
  "Phase B（状態・エラー種別）": "Phase B (Status / Error type)",
  編集済み: "Customized",
  推奨アクション: "Recommended Actions",
  発火条件: "Trigger",
  編集不可: "Read-only",

  // ---- 一覧のページ送り（指示書AA）----
  // ★プレースホルダが3つある（既存の {n} 1つより多い）。replace を3回つなげる★
  //   t("全{total}件中 {from}〜{to}件")
  //     .replace("{total}", String(total))
  //     .replace("{from}", String(from))
  //     .replace("{to}", String(to))
  // ★この文言を組み立てるのは components/ui/Pagination.tsx の1箇所だけ★
  //   （各画面で組み立てると .replace() の連鎖が6箇所に増える）
  "全{total}件中 {from}〜{to}件": "{from}–{to} of {total}",
  前へ: "Prev",
  次へ: "Next",
  // ★<nav> の aria-label★（画面には出ない。スクリーンリーダー向け）
  ページ送り: "Pagination",
  // ★CSVは表示中のページではなく全件★
  //   （app/api/clean-logs/export/route.ts が page / per_page を無視する契約）
  "CSVは絞り込み条件に一致する全件を出力します（表示中のページだけではありません）":
    "CSV exports all rows matching the filters, not just the current page",
  // ---- CSVの行数上限（ユーザー指示 2026-09-15 / 指示書AI 段階8）----
  // ★プレースホルダは {total} と {max} の2つ。数値は画面側で差し込む（D-111）★
  //   t("この期間だとCSV出力できません（{total}件／上限{max}件）。期間を短くするか、店舗で絞り込んでください。")
  //     .replace("{total}", String(total))
  //     .replace("{max}", String(MAX_CSV_ROWS))
  // ★★`disabled` だけにして理由を出さないことはしない★★ —
  //   押せないボタンは、理由が書いていないと不具合と区別がつかない（D-053 と同じ理由）。
  "この期間だとCSV出力できません（{total}件／上限{max}件）。期間を短くするか、店舗で絞り込んでください。":
    "CSV export is unavailable for this range ({total} rows / limit {max}). Narrow the date range or filter by facility.",
  // ---- 清掃詳細ログの期間が空のとき（D-159 追記 / 指示書AV 段階5b-5）----
  // ★既定は「期間を指定しない（全期間）」★（ユーザー指示 2026-10-06「C」）。
  //   `DetailLogScreen.tsx` の日付入力の placeholder と、両方空のときに出す表示で使う。★EN は暫定★
  "指定なし（全期間）": "Not set (all)",
  // ---- レポート画面を1本ずつ出す（指示書AL 段階2 / §3-4）----
  // ★KPIだけが 422（対象顧客が1社に定まらない）のとき、そのブロックにだけ出す誘導★。
  //   ★件数 {n} は `details.customer_ids` の長さ★ — ★文言を読ませるだけにしない★ため、
  //   「何社の中から選ぶのか」を数で見せる（`lib/reports/block-visibility.ts`）。
  KPI: "KPI",
  "稼働率・出発成功率・清掃完了率・エラー発生率":
    "Uptime / Launch / Completion / Error rates",
  顧客を選んでください: "Select a customer",
  "選べる顧客が{n}件あります": "{n} customers to choose from",
  顧客を選ぶ: "Choose a customer",
  この条件では選べる顧客がありません: "No customers available for this filter",
  データの取得に失敗しました: "Failed to load data",

  // ---- 清掃面積（指示書AN 段階5。ユーザー指示 2026-09-16「新画面」）----
  // ★`完了率` / `検索` / `ホールディングス` / `顧客` / `施設名` / `読み込み中…` /
  //   `閉じる` / `もっと表示（あと{n}件）` / `{n}件` は上に既にあるため再掲しない★
  //   （重複キーは lint が落とす）。
  // ★単位（㎡）は辞書に入れない★ — `lib/config` の `AREA_UNIT` が持つ（指示書AN §2-4）。
  //   ★対訳が要るのは見出しの語だけ★で、単位は言語で変わらない。
  清掃面積: "Cleaning Area",
  清掃対象面積: "Target Area",
  清掃実施回数: "Cleanings",
  // ★日付入力の aria-label★（画面には出ない。スクリーンリーダー向け）
  開始日: "From",
  終了日: "To",
  // ★粒度タブ★。`ホールディングス` / `顧客` は分類の見出し語（上）を使い回す
  店舗: "Stores",
  // ★★ホールディングスに属さない顧客をまとめる行★★（`CLEAN_AREA_GROUP_NONE_LABEL`）—
  //   ★「グループ0」を作らない★（D-011）。★API が返す `name` は使わず、画面が
  //   `scope === "group" && id === null` を見てこのキーを引く★ — 生文字列を
  //   そのまま `t()` に通すと、同名の実在する屋号名があったときに誤訳するため。
  グループなし: "No Holdings",
  該当データがありません: "No data",
  // ★「直近2年ぶん」の明記★（指示書AN §2-2 / 落とし穴10）—
  //   ★消さないこと★。書かないと3年目に数字が減ったときに問い合わせが来る。
  "期間を指定しないときは全期間の合計です。ただしデータの保持は2年なので、実際には直近2年ぶんの合計になります。":
    "With no date range, this is the total for all stored data. Data is retained for 2 years, so in practice it covers the most recent 2 years.",
  // ★総清掃面積の母集団の注記（D-156 論点7）。★英訳は暫定★（ユーザーが後でまとめて見直す）
  "清掃面積には予定外の清掃を含みます。完了率と実施回数は予定された本清掃だけです":
    "Area includes unscheduled runs. Completion rate and run count cover scheduled main runs only.",

  // ---- エラー一覧（D-160 / 指示書AW 段階5-5）----
  // ★EN は暫定★（ユーザーが後でまとめて見直す）。
  // ★`施設名` / `シリアル` / `未解消` / `対応中` / `解消` / `クリックして備考を編集` / `備考を入力` /
  //   `保存中…` / `保存に失敗しました` / `対応状況の更新に失敗しました` / `読み込み中…` /
  //   `指定なし（全期間）` / `ホールディングス` / `顧客` / `データの取得に失敗しました` は上に既にあるため再掲しない★
  //   （重複キーは lint が落とす）。
  // ★件数は `全{n}件` を使う★ — `{n}件` は EN が "{n} facilities"（施設数の文言）なので件数表示に使えない（指示書AW 4-18）。
  // ★`error_type` / `error_level` / `serial_number` の値は辞書に入れない★（生値のまま出す。D-077）。
  "🚨 エラー一覧": "🚨 Errors",
  エラー一覧: "Errors",
  "未対応のエラー（ロボット・制御盤・セキュリティ・清掃開始失敗）":
    "Open errors (robots, control panels, security, start failures)",
  "全{n}件": "{n} total",
  検知時刻: "Detected at",
  種類: "Type",
  レベル: "Level",
  紐づく予定: "Schedule",
  対応状況: "Status",
  備考: "Note",
  // ★「紐づく予定」のラベル（`errorScheduleLabel()`。指示書AW 表3）★ — `{n}` は replace（`"{n}分前"` と同じ方式A）
  本清掃: "Main run",
  "事前チェック（{n}分前）": "Pre-check ({n} min before)",
  事前チェック: "Pre-check",
  予定なし: "No schedule",
  予定不明: "Unknown schedule",
  解消済みも表示: "Show resolved",
  該当するエラーはありません: "No matching errors",
  エラーが見つかりません: "Error not found",

  // ---- 対応状況・備考の編集モード（エラー一覧・アラート。ユーザー指示 2026-10-06。D-165）----
  // ★EN は暫定★。★`保存` / `保存中…` は上に既にあるため再掲しない★（重複キーは lint が落とす）。
  編集: "Edit",
  キャンセル: "Cancel",
  "保存（{n}件）": "Save ({n})",
  "変更を破棄しますか？": "Discard changes?",
  "{n}件を保存できませんでした": "{n} could not be saved",
  編集中は絞り込みとページ送りを使えません: "Filters and paging are disabled while editing",

  // ---- アラート: 本清掃が成功した事前チェック異常（ユーザー指示 2026-10-07。D-171）----
  // ★EN は暫定★
  本清掃は成功: "Main run succeeded",
};

export function translate(lang: Lang, text: string): string {
  if (lang === "en" && EN[text]) return EN[text];
  return text;
}
