diff --git a/ROADMAP.md b/ROADMAP.md index 070552d07..7adcbaeb2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ **Stage: alpha** · next: beta, ~25 points of "ready for real work" and ~160–240 h away -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-12 · **Change:** minor (rows auto-fit oversized fonts on open and whole-row/column formatting) · **Target:** Microsoft Excel (Microsoft 365) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) GridCraft aims at full Microsoft Excel parity, and at being better in places: faster, open (XLSX is the native format), fully scriptable by agents (MCP, control channel, CLI), and on the web. @@ -93,7 +93,9 @@ The ribbon is translated into Japanese, Simplified Chinese, Korean, Brazilian Po and German (266–268 labels each, ~12% of ~2,200 strings; merged 10-10 in #31, #104, #82, German added 10-11), the interface follows the system language, and CJK, Thai and Hebrew text falls back to system fonts -(#38). Dialogs, menus and messages are English; formulas and number formats are en-US only. +(#38). Japanese (10-17) and Brazilian Portuguese also translate the dialog titles and labels, +message boxes, Backstage/File-view items, template names and native menus: 943 strings each, ~43%. +The remaining dialogs, menus and messages are English; formulas and number formats are en-US only. Localized German formulas and numbers are in PR #163. Detail: [localization-parity.md](docs/localization-parity.md). | Language | Code | Status | UI strings | @@ -104,9 +106,9 @@ Localized German formulas and numbers are in PR #163. Detail: [localization-pari | Hindi | hi | none | 0% | | Arabic | ar | none (no RTL layout, no shaping) | 0% | | French | fr | none | 0% | -| Portuguese | pt-BR | menus only | ~12% | +| Portuguese | pt-BR | menus, File view, dialogs | ~43% | | Indonesian | id | none | 0% | -| Japanese | ja | menus only | ~12% | +| Japanese | ja | menus, File view, dialogs, messages | ~43% | | German | de | menus only | ~12% | | Korean | ko | menus only | ~12% | | Vietnamese | vi | none | 0% | @@ -132,6 +134,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| +| 2026-10-20 | Japanese interface catalog covers every key the Brazilian Portuguese catalog translates: the 398-label shared core plus 545 dialog, message, Backstage and menu strings (943 total, ~43% of ~2,200). A test parses `pt.rs`'s source, so the two catalogs stay in step | | 2026-10-12 | Rows auto-fit oversized fonts: opening a file and whole-row/column formatting grow non-custom rows to their tallest font (#833) | | 2026-10-12 | Number formats: parsing a format code is linear in its length (long runs of `[`, `,` or `/` no longer take quadratic time), and an unclosed `[` is a literal when splitting sections as well as when tokenizing (#810) | | 2026-10-12 | Number formats: a fraction denominator with 65,536 zeros no longer crashes; format codes are capped at 255 characters like Excel (longer codes display as General, `TEXT` gives `#VALUE!`) (#807) | diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 98919f8a4..5392ba999 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -13,6 +13,7 @@ mod cs; mod de; mod es; mod fr; +mod ja; mod ko; mod pt; mod ru; @@ -120,7 +121,7 @@ impl Language { let translated = match self { Self::En => None, Self::Es => es::translate(text), - Self::Ja => JAPANESE.iter().find(|(english, _)| *english == text).map(|(_, translated)| *translated), + Self::Ja => ja::translate(text), Self::Zh => zh::translate(text), Self::Ko => ko::translate(text), Self::Ru => ru::translate(text), @@ -173,435 +174,18 @@ pub fn set_current(ctx: &egui::Context, language: Language) { ctx.data_mut(|d| d.insert_temp(lang_key(), language)); } -/// English label → Japanese. Keys are the exact interface strings (command ids, file names and -/// document text are never translated); anything absent falls back to English. -const JAPANESE: &[(&str, &str)] = &[ - ("Paste", "貼り付け"), - ("Paste Values", "値の貼り付け"), - ("Paste Formulas", "数式の貼り付け"), - ("Paste Formatting", "書式の貼り付け"), - ("Transpose", "行列を入れ替え"), - ("Paste Link", "リンクの貼り付け"), - ("Paste Special…", "形式を選択して貼り付け…"), - ("Insert Copied Cells", "コピーしたセルの挿入"), - ("Insert Copied Cells…", "コピーしたセルの挿入…"), - ("Insert Cut Cells", "切り取ったセルの挿入"), - ("Insert Paste", "挿入貼り付け"), - ("Cut (⌘X)", "切り取り (⌘X)"), - ("Copy (⌘C)", "コピー (⌘C)"), - ("Format Painter (double-click to keep it on)", "書式のコピー/貼り付け (ダブルクリックで固定)"), - ("Bold (⌘B)", "太字 (⌘B)"), - ("Italic (⌘I)", "斜体 (⌘I)"), - ("Underline (⌘U)", "下線 (⌘U)"), - ("Double Underline", "二重下線"), - ("Strikethrough", "取り消し線"), - ("Underline", "下線"), - ("Increase Font Size", "フォントの拡大"), - ("Decrease Font Size", "フォントの縮小"), - ("Wrap Text", "折り返して全体を表示"), - ("Merge & Center", "セルを結合して中央揃え"), - ("Merge Cells", "セルの結合"), - ("Merge Across", "横方向に結合"), - ("Unmerge Cells", "セル結合の解除"), - ("Fill Color", "塗りつぶしの色"), - ("Font Color", "フォントの色"), - ("Borders", "罫線"), - ("Top\nAlign", "上揃え"), - ("Middle\nAlign", "中央揃え (縦)"), - ("Bottom\nAlign", "下揃え"), - ("Left", "左"), - ("Right", "右"), - ("Center", "中央"), - ("Horizontal", "水平"), - ("Vertical Text", "縦書き"), - ("Decrease Indent", "インデントを減らす"), - ("Increase Indent", "インデントを増やす"), - ("Orientation", "方向"), - ("Page Layout|Orientation", "印刷の向き"), - ("Angle Counterclockwise", "左回りに回転"), - ("Angle Clockwise", "右回りに回転"), - ("Rotate Text Up", "文字列を上に回転"), - ("Rotate Text Down", "文字列を下に回転"), - ("Accounting Number Format", "通貨表示形式"), - ("Percent Style", "パーセント表示"), - ("Comma Style", "桁区切りスタイル"), - ("Increase Decimal", "小数点以下の桁数を増やす"), - ("Decrease Decimal", "小数点以下の桁数を減らす"), - ("More Accounting Formats…", "その他の通貨表示形式…"), - ("Conditional\nFormatting", "条件付き書式"), - ("Conditional Formatting", "条件付き書式"), - ("Format\nas Table", "テーブルとして書式設定"), - ("Cell\nStyles", "セルのスタイル"), - ("Format Cells…", "セルの書式設定…"), - ("Format Cell Alignment…", "セルの配置…"), - ("Format\nPane", "書式ウィンドウ"), - ("Format", "書式"), - ("Insert", "挿入"), - ("Insert Cells…", "セルの挿入…"), - ("Delete", "削除"), - ("Delete Cells…", "セルの削除…"), - ("Insert Sheet Rows", "シートの行を挿入"), - ("Insert Sheet Columns", "シートの列を挿入"), - ("Delete Sheet Rows", "シートの行を削除"), - ("Delete Sheet Columns", "シートの列を削除"), - ("Row Height…", "行の高さ…"), - ("AutoFit Row Height", "行の高さを自動調整"), - ("Column Width…", "列の幅…"), - ("AutoFit Column Width", "列の幅を自動調整"), - ("Default Width…", "標準の幅…"), - ("Hide Rows", "行を表示しない"), - ("Unhide Rows", "再表示"), - ("Hide Columns", "列の表示/非表示"), - ("Unhide Columns", "再表示"), - ("Lock Cell", "セルのロック"), - ("Clear", "クリア"), - ("Clear All", "すべてクリア"), - ("Clear Formats", "書式のクリア"), - ("Clear Contents", "数式と値のクリア"), - ("Clear Comments and Notes", "コメントとメモのクリア"), - ("Clear Hyperlinks", "ハイパーリンクのクリア"), - ("AutoSum", "オート SUM"), - ("AutoSum (⌘⇧T)", "オート SUM (⌘⇧T)"), - ("Flash\nFill", "フラッシュ フィル"), - ("Flash Fill", "フラッシュ フィル"), - ("Fill", "フィル"), - ("Clear Print Area", "印刷範囲のクリア"), - ("Find &\nSelect", "検索と選択"), - ("Find…", "検索…"), - ("Replace…", "置換…"), - ("Go To…", "ジャンプ…"), - ("Go To Special…", "セルを選択…"), - ("PivotTable", "ピボットテーブル"), - ("Recommended\nCharts", "推奨グラフ"), - ("Table", "テーブル"), - ("Pictures", "画像"), - ("Shapes", "図形"), - ("Icons", "アイコン"), - ("Text\nBox", "テキスト ボックス"), - ("Comment", "コメント"), - ("New\nComment", "新しいコメント"), - ("New Note", "新しいメモ"), - ("Show/Hide Note", "メモの表示/非表示"), - ("Header &\nFooter", "ヘッダーとフッター"), - ("Text to\nColumns", "区切り位置"), - ("Link", "リンク"), - ("Symbol", "記号"), - ("Sparklines", "スパークライン"), - ("Checkbox", "チェックボックス"), - ("Insert checkboxes in the selected cells", "選択したセルにチェックボックスを挿入"), - ("Header & Footer", "ヘッダーとフッター"), - ("Draw with ink", "インクで描画"), - ("Eraser", "消しゴム"), - ("Ink to\nShape", "インクを図形に変換"), - ("Select\nObjects", "オブジェクトの選択"), - ("Themes", "テーマ"), - ("Margins", "余白"), - ("Left Margin", "左余白"), - ("Right Margin", "右余白"), - ("Top Margin", "上余白"), - ("Bottom Margin", "下余白"), - ("Header Margin", "ヘッダーの余白"), - ("Footer Margin", "フッターの余白"), - ("Size", "サイズ"), - ("Print\nArea", "印刷範囲"), - ("Set Print Area", "印刷範囲の設定"), - ("Breaks", "改ページ"), - ("Insert Page Break", "改ページの挿入"), - ("Remove Page Break", "改ページの解除"), - ("Reset All Page Breaks", "すべての改ページを解除"), - ("Print\nTitles", "印刷タイトル"), - ("Sheet\nRight-to-Left", "シートを右から左へ"), - ("Sheet Right-to-Left", "シートを右から左へ"), - ("Narrow", "狭い"), - ("Wide", "広い"), - ("Normal", "標準"), - ("Portrait", "縦"), - ("Landscape", "横"), - ("Custom Margins…", "ユーザー設定の余白…"), - ("Insert\nFunction", "関数の挿入"), - ("Name\nManager", "名前の管理"), - ("Define Name", "名前の定義"), - ("Use in Formula", "数式で使用"), - ("Create from Selection", "選択範囲から作成"), - ("Trace Precedents", "参照元のトレース"), - ("Trace Dependents", "参照先のトレース"), - ("Remove Arrows", "矢印の解除"), - ("Show Formulas", "数式の表示"), - ("Error Checking", "エラーチェック"), - ("Evaluate Formula", "数式の検証"), - ("Watch Window", "ウォッチ ウィンドウ"), - ("Calculation\nOptions", "計算方法の設定"), - ("Calculate Now", "再計算実行"), - ("Calculate Sheet", "シートの再計算"), - ("Automatic", "自動"), - ("Automatic Except for Data Tables", "データ テーブル以外は自動"), - ("Manual", "手動"), - ("Sort &\nFilter", "並べ替えとフィルター"), - ("Sort", "並べ替え"), - ("Sort A to Z", "昇順"), - ("Sort Z to A", "降順"), - ("Custom Sort…", "ユーザー設定の並べ替え…"), - ("Filter", "フィルター"), - ("Reapply", "再適用"), - ("Get Data\n(Text/CSV)", "データの取得 (テキスト/CSV)"), - ("Remove\nDuplicates", "重複の削除"), - ("Data\nValidation", "データの入力規則"), - ("Data Validation", "データの入力規則"), - ("Data Validation…", "データの入力規則…"), - ("Circle Invalid Data", "無効なデータをマーク"), - ("Clear Validation", "入力規則のクリア"), - ("Group", "グループ化"), - ("Ungroup", "グループ解除"), - ("Show Detail", "詳細データの表示"), - ("Hide Detail", "詳細を表示しない"), - ("Subtotal", "小計"), - ("Data\nAnalysis", "データ分析"), - ("Data Analysis", "データ分析"), - ("Solver", "ソルバー"), - ("What-If\nAnalysis", "What-If 分析"), - ("Data Table…", "データ テーブル…"), - ("Scenario Manager…", "シナリオ マネージャー…"), - ("Goal Seek…", "ゴール シーク…"), - ("Forecast\nSheet", "予測シート"), - ("Spelling", "スペルチェック"), - ("Check\nAccessibility", "アクセシビリティ チェック"), - ("Threaded Comments", "スレッド化されたコメント"), - ("Show\nComments", "コメントの表示"), - ("Previous", "前へ"), - ("Next", "次へ"), - ("Previous Comment", "前のコメント"), - ("Next Comment", "次のコメント"), - ("Show All Notes", "すべてのメモを表示"), - ("Convert to Comments", "コメントに変換"), - ("Protect\nWorkbook", "ブックの保護"), - ("Allow Edit\nRanges", "範囲の編集を許可"), - ("Allow Edit Ranges", "範囲の編集を許可"), - ("Unprotect\nSheet", "シート保護の解除"), - ("Protect Sheet…", "シートの保護…"), - ("Comments", "コメント"), - ("Notes", "メモ"), - ("Page Break\nPreview", "改ページ プレビュー"), - ("Page\nLayout", "ページ レイアウト"), - ("Formula Bar", "数式バー"), - ("Gridlines", "目盛線"), - ("Headings", "見出し"), - ("Zoom", "ズーム"), - ("100%", "100%"), - ("Zoom to\nSelection", "選択範囲を拡大"), - ("Freeze\nPanes", "ウィンドウ枠の固定"), - ("Freeze Panes", "ウィンドウ枠の固定"), - ("Freeze Top Row", "最上行の固定"), - ("Freeze First Column", "最左列の固定"), - ("Unfreeze Panes", "ウィンドウ枠固定の解除"), - ("Dark Mode", "ダーク モード"), - ("Display theme", "表示テーマ"), - ("Animations", "アニメーション"), - ( - "Glide the selection outline to the cell you move to instead of jumping there", - "選択範囲の枠を、移動先のセルまで滑らかに動かします(瞬時には切り替えません)", - ), - ("System", "システム"), - ("Light", "ライト"), - ("Dark", "ダーク"), - ("Interface language", "表示言語"), - ("Interface size", "表示サイズ"), - ("Auto", "自動"), - ("Drag to freeze columns", "ドラッグして列を固定"), - ("Drag to freeze rows", "ドラッグして行を固定"), - ("Command\nPalette", "コマンド パレット"), - ("Agent\nControl", "エージェント制御"), - ("Action\nJournal", "操作ジャーナル"), - ("About\nGridCraft", "GridCraft について"), - ("Share", "共有"), - ("Add Chart\nElement", "グラフ要素を追加"), - ("Change\nChart Type", "グラフの種類の変更"), - ("Switch\nRow/Column", "行/列の切り替え"), - ("Select\nData", "データの選択"), - ("Data Labels: None", "データ ラベル: なし"), - ("Data Labels: Show", "データ ラベル: 表示"), - ("Legend: None", "凡例: なし"), - ("Legend: Bottom", "凡例: 下"), - ("Legend: Top", "凡例: 上"), - ("Legend: Right", "凡例: 右"), - ("Gridlines: None", "目盛線: なし"), - ("Gridlines: Show", "目盛線: 表示"), - ("Chart\nTitle", "グラフ タイトル"), - ("Delete\nChart", "グラフの削除"), - ("Convert\nto Range", "範囲に変換"), - ("Table\nStyles", "テーブル スタイル"), - ("Top 10 Items", "上位 10 項目"), - ("Top 10%", "上位 10%"), - ("Bottom 10 Items", "下位 10 項目"), - ("Bottom 10%", "下位 10%"), - ("Above Average", "平均より上"), - ("Below Average", "平均より下"), - ("Clear Rules from Entire Sheet", "シート全体からルールをクリア"), - ("Clear Rules from Selected Cells", "選択したセルからルールをクリア"), - ("Constants", "定数"), - ("Data Bars", "データ バー"), - ("Color Scales", "カラー スケール"), - ("Icon Sets", "アイコン セット"), - ("Home", "ホーム"), - ("Draw", "描画"), - ("Page Layout", "ページ レイアウト"), - ("Formulas", "数式"), - ("Data", "データ"), - ("Review", "レビュー"), - ("View", "表示"), - ("Automate", "自動化"), - ("Table Design", "テーブル デザイン"), - ("Chart Design", "グラフ デザイン"), - ("Ready", "準備完了"), - ("Enter", "入力"), - ("Edit", "編集"), - ("Point", "ポイント"), - ("Calculate", "計算"), - ("Select destination and press Enter or choose Paste", "貼り付け先を選び、Enter キーを押すか [貼り付け] を選びます"), - ("General", "標準"), - ("Number", "数値"), - ("Currency", "通貨"), - ("Accounting", "会計"), - ("Date", "日付"), - ("Time", "時刻"), - ("Percentage", "パーセンテージ"), - ("Fraction", "分数"), - ("Scientific", "指数"), - ("Text", "文字列"), - ("Special", "特殊"), - ("Custom", "ユーザー設定"), - ("Short Date", "日付"), - ("Long Date", "長い日付"), - ("More Number Formats…", "その他の表示形式…"), - ("Financial", "財務"), - ("Logical", "論理"), - ("Date &\nTime", "日付/時刻"), - ("Lookup &\nReference", "検索/行列"), - ("Math &\nTrig", "数学/三角"), - ("More\nFunctions", "その他の関数"), - ("Sheet Options|View", "画面"), - ("Print", "印刷"), - // Page Layout view and the Header & Footer tab. - ("Click to add data", "クリックしてデータを追加"), - ("Add header", "ヘッダーの追加"), - ("Add footer", "フッターの追加"), - ("(none)", "(なし)"), - ("Header", "ヘッダー"), - ("Footer", "フッター"), - ("Page\nNumber", "ページ\n番号"), - ("Number\nof Pages", "ページ数"), - ("Current\nDate", "現在の\n日付"), - ("Current\nTime", "現在の\n時刻"), - ("File\nPath", "ファイルの\nパス"), - ("File\nName", "ファイル名"), - ("Sheet\nName", "シート名"), - ("Go to\nHeader", "ヘッダーに\n移動"), - ("Go to\nFooter", "フッターに\n移動"), - ("Page Number", "ページ番号"), - ("Number of Pages", "ページ数"), - ("Current Date", "現在の日付"), - ("Current Time", "現在の時刻"), - ("File Path", "ファイルのパス"), - ("File Name", "ファイル名"), - ("Sheet Name", "シート名"), - ("Go to Header", "ヘッダーに移動"), - ("Different First Page", "先頭ページのみ別指定"), - ("Different Odd & Even Pages", "奇数/偶数ページ別指定"), - ("Go to Footer", "フッターに移動"), - ("Ruler", "ルーラー"), - // File › Backstage view. - ("File", "ファイル"), - ("Back", "戻る"), - ("New", "新規"), - ("Open", "開く"), - ("Info", "情報"), - ("Save", "上書き保存"), - ("Save As", "名前を付けて保存"), - ("Export", "エクスポート"), - ("Close", "閉じる"), - ("Options", "オプション"), - ("Blank workbook", "空白のブック"), - ("Recent", "最近使ったアイテム"), - ("No recent workbooks yet.", "最近使ったブックはまだありません。"), - ("More workbooks", "その他のブック"), - ("Modified", "更新日時"), - ("Not available", "利用できません"), - ("Just now", "たった今"), - ("Yesterday", "昨日"), - ("{n} min ago", "{n} 分前"), - ("{n} h ago", "{n} 時間前"), - ("{n} days ago", "{n} 日前"), - ("{n} weeks ago", "{n} 週間前"), - ("{n} months ago", "{n} か月前"), - ("{n} years ago", "{n} 年前"), - ("Browse…", "参照…"), - ("Not saved yet", "まだ保存されていません"), - ("Location", "場所"), - ("Sheets", "シート"), - ("Protect Workbook", "ブックの保護"), - ( - "Sheet structure is locked: sheets can't be added, moved, renamed or deleted.", - "シートの構成はロックされています。シートの追加、移動、名前の変更、削除はできません。", - ), - ( - "Lock the sheet structure so sheets can't be added, moved, renamed or deleted.", - "シートの構成をロックして、シートの追加、移動、名前の変更、削除をできないようにします。", - ), - ("Properties", "プロパティ"), - ("Title", "タイトル"), - ("Subject", "件名"), - ("Author", "作成者"), - ("Company", "会社名"), - ("Keywords", "キーワード"), - ("Description", "説明"), - ("No workbook is open.", "ブックが開かれていません。"), - ("Save as type", "ファイルの種類"), - ("Excel Workbook (*.xlsx)", "Excel ブック (*.xlsx)"), - ("CSV UTF-8 (Comma delimited) (*.csv)", "CSV UTF-8 (コンマ区切り) (*.csv)"), - ("Web Page (*.html)", "Web ページ (*.html)"), - ("PDF (*.pdf)", "PDF ファイル (*.pdf)"), - ("Download", "ダウンロード"), - ( - "A CSV file, web page or PDF is a copy: the workbook keeps its own file.", - "CSV ファイル、Web ページ、PDF はコピーです。ブックは元のファイルのままです。", - ), - ("Save the workbook under another name or in another folder.", "ブックを別の名前または別のフォルダーに保存します。"), - ("Print Active Sheets", "作業中のシートを印刷"), - ("Print Entire Workbook", "ブック全体を印刷"), - ("Fit Sheet on One Page", "シートを 1 ページに印刷"), - ("Page Setup…", "ページ設定…"), - ("Page {page} of {pages}", "{page} / {pages} ページ"), - ("Nothing to print.", "印刷する内容がありません。"), - ("Previous page", "前のページ"), - ("Next page", "次のページ"), - ("Create PDF", "PDF の作成"), - ("Save the sheet as a PDF document that keeps its page layout.", "ページ レイアウトを保ったまま、シートを PDF ドキュメントとして保存します。"), - ("Change File Type", "ファイルの種類の変更"), - ("CSV (Comma delimited)", "CSV (コンマ区切り)"), - ("Save the active sheet as comma-separated text.", "作業中のシートをコンマ区切りのテキストとして保存します。"), - ("Web Page (.html)", "Web ページ (.html)"), - ("Save the workbook as a web page.", "ブックを Web ページとして保存します。"), - ("Options|General", "全般"), - ("Options|Save", "保存"), - ("Show formula bar", "数式バーを表示する"), - ("Enable AutoComplete for cell values", "セルの値にオートコンプリートを使用する"), - ("Save .xlsx workbooks automatically after every change", "変更のたびに .xlsx ブックを自動的に保存する"), - ("Workbook calculation", "ブックの計算"), - ("Enable iterative calculation", "反復計算を行う"), - ("Calculation settings are saved with the workbook.", "計算の設定はブックと共に保存されます。"), -]; - #[cfg(test)] mod tests { use super::*; #[test] fn translations_are_unique_and_preserve_unknown_text() { - for (i, (en, ja)) in JAPANESE.iter().enumerate() { + for (i, (en, ja)) in ja::CORE.iter().enumerate() { assert!(!ja.is_empty()); - assert!(JAPANESE.iter().take(i).all(|(other, _)| en != other)); + assert!(ja::CORE.iter().take(i).all(|(other, _)| en != other)); assert_eq!(Language::En.tr(en), en.rsplit_once('|').map_or(*en, |(_, label)| label)); } - for (english, _) in JAPANESE { + for (english, _) in ja::CORE { assert!(zh::translate(english).is_some_and(|text| !text.is_empty()), "missing Simplified Chinese: {english}"); assert!(ko::translate(english).is_some_and(|text| !text.is_empty()), "missing Korean: {english}"); assert!(ru::translate(english).is_some_and(|text| !text.is_empty()), "missing Russian: {english}"); @@ -687,7 +271,7 @@ mod tests { // `tr` returns a found translation as it is, so a catalog that keeps `context|` in its // value shows it on screen (File › Options read "Options|Général" in French). for language in Language::ALL { - for (english, _) in JAPANESE { + for (english, _) in ja::CORE { let shown = language.tr(english); assert!(!shown.contains('|'), "{} shows a context prefix for {english}: {shown}", language.code()); } diff --git a/crates/ui-egui/src/i18n/ja.rs b/crates/ui-egui/src/i18n/ja.rs new file mode 100644 index 000000000..61cb8242f --- /dev/null +++ b/crates/ui-egui/src/i18n/ja.rs @@ -0,0 +1,1115 @@ +//! Japanese translations for the interface strings in `i18n.rs`; labels follow Excel for Mac's +//! Japanese wording, and anything absent falls back to English. +//! +//! [`CORE`] is the shared reference catalog every language translates: the ribbon, sheet tabs, +//! widgets and the most common dialog labels. [`DIALOGS`] adds the dialog titles and labels, +//! message boxes, Backstage/File-view items, template names and native-menu strings the Brazilian +//! Portuguese catalog (`pt.rs`) covers on top of it. The two lists never overlap. + +/// English label → Japanese, the shared reference set every catalog covers. +pub(super) const CORE: &[(&str, &str)] = &[ + ("Paste", "貼り付け"), + ("Paste Values", "値の貼り付け"), + ("Paste Formulas", "数式の貼り付け"), + ("Paste Formatting", "書式の貼り付け"), + ("Transpose", "行列を入れ替え"), + ("Paste Link", "リンクの貼り付け"), + ("Paste Special…", "形式を選択して貼り付け…"), + ("Insert Copied Cells", "コピーしたセルの挿入"), + ("Insert Copied Cells…", "コピーしたセルの挿入…"), + ("Insert Cut Cells", "切り取ったセルの挿入"), + ("Insert Paste", "挿入貼り付け"), + ("Cut (⌘X)", "切り取り (⌘X)"), + ("Copy (⌘C)", "コピー (⌘C)"), + ("Format Painter (double-click to keep it on)", "書式のコピー/貼り付け (ダブルクリックで固定)"), + ("Bold (⌘B)", "太字 (⌘B)"), + ("Italic (⌘I)", "斜体 (⌘I)"), + ("Underline (⌘U)", "下線 (⌘U)"), + ("Double Underline", "二重下線"), + ("Strikethrough", "取り消し線"), + ("Underline", "下線"), + ("Increase Font Size", "フォントの拡大"), + ("Decrease Font Size", "フォントの縮小"), + ("Wrap Text", "折り返して全体を表示"), + ("Merge & Center", "セルを結合して中央揃え"), + ("Merge Cells", "セルの結合"), + ("Merge Across", "横方向に結合"), + ("Unmerge Cells", "セル結合の解除"), + ("Fill Color", "塗りつぶしの色"), + ("Font Color", "フォントの色"), + ("Borders", "罫線"), + ("Top\nAlign", "上揃え"), + ("Middle\nAlign", "中央揃え (縦)"), + ("Bottom\nAlign", "下揃え"), + ("Left", "左"), + ("Right", "右"), + ("Center", "中央"), + ("Horizontal", "水平"), + ("Vertical Text", "縦書き"), + ("Decrease Indent", "インデントを減らす"), + ("Increase Indent", "インデントを増やす"), + ("Orientation", "方向"), + ("Page Layout|Orientation", "印刷の向き"), + ("Angle Counterclockwise", "左回りに回転"), + ("Angle Clockwise", "右回りに回転"), + ("Rotate Text Up", "文字列を上に回転"), + ("Rotate Text Down", "文字列を下に回転"), + ("Accounting Number Format", "通貨表示形式"), + ("Percent Style", "パーセント表示"), + ("Comma Style", "桁区切りスタイル"), + ("Increase Decimal", "小数点以下の桁数を増やす"), + ("Decrease Decimal", "小数点以下の桁数を減らす"), + ("More Accounting Formats…", "その他の通貨表示形式…"), + ("Conditional\nFormatting", "条件付き書式"), + ("Conditional Formatting", "条件付き書式"), + ("Format\nas Table", "テーブルとして書式設定"), + ("Cell\nStyles", "セルのスタイル"), + ("Format Cells…", "セルの書式設定…"), + ("Format Cell Alignment…", "セルの配置…"), + ("Format\nPane", "書式ウィンドウ"), + ("Format", "書式"), + ("Insert", "挿入"), + ("Insert Cells…", "セルの挿入…"), + ("Delete", "削除"), + ("Delete Cells…", "セルの削除…"), + ("Insert Sheet Rows", "シートの行を挿入"), + ("Insert Sheet Columns", "シートの列を挿入"), + ("Delete Sheet Rows", "シートの行を削除"), + ("Delete Sheet Columns", "シートの列を削除"), + ("Row Height…", "行の高さ…"), + ("AutoFit Row Height", "行の高さを自動調整"), + ("Column Width…", "列の幅…"), + ("AutoFit Column Width", "列の幅を自動調整"), + ("Default Width…", "標準の幅…"), + ("Hide Rows", "行を表示しない"), + ("Unhide Rows", "再表示"), + ("Hide Columns", "列の表示/非表示"), + ("Unhide Columns", "再表示"), + ("Lock Cell", "セルのロック"), + ("Clear", "クリア"), + ("Clear All", "すべてクリア"), + ("Clear Formats", "書式のクリア"), + ("Clear Contents", "数式と値のクリア"), + ("Clear Comments and Notes", "コメントとメモのクリア"), + ("Clear Hyperlinks", "ハイパーリンクのクリア"), + ("AutoSum", "オート SUM"), + ("AutoSum (⌘⇧T)", "オート SUM (⌘⇧T)"), + ("Flash\nFill", "フラッシュ フィル"), + ("Flash Fill", "フラッシュ フィル"), + ("Fill", "フィル"), + ("Clear Print Area", "印刷範囲のクリア"), + ("Find &\nSelect", "検索と選択"), + ("Find…", "検索…"), + ("Replace…", "置換…"), + ("Go To…", "ジャンプ…"), + ("Go To Special…", "セルを選択…"), + ("PivotTable", "ピボットテーブル"), + ("Recommended\nCharts", "推奨グラフ"), + ("Table", "テーブル"), + ("Pictures", "画像"), + ("Shapes", "図形"), + ("Icons", "アイコン"), + ("Text\nBox", "テキスト ボックス"), + ("Comment", "コメント"), + ("New\nComment", "新しいコメント"), + ("New Note", "新しいメモ"), + ("Show/Hide Note", "メモの表示/非表示"), + ("Header &\nFooter", "ヘッダーとフッター"), + ("Text to\nColumns", "区切り位置"), + ("Link", "リンク"), + ("Symbol", "記号"), + ("Sparklines", "スパークライン"), + ("Checkbox", "チェックボックス"), + ("Insert checkboxes in the selected cells", "選択したセルにチェックボックスを挿入"), + ("Header & Footer", "ヘッダーとフッター"), + ("Draw with ink", "インクで描画"), + ("Eraser", "消しゴム"), + ("Ink to\nShape", "インクを図形に変換"), + ("Select\nObjects", "オブジェクトの選択"), + ("Themes", "テーマ"), + ("Margins", "余白"), + ("Left Margin", "左余白"), + ("Right Margin", "右余白"), + ("Top Margin", "上余白"), + ("Bottom Margin", "下余白"), + ("Header Margin", "ヘッダーの余白"), + ("Footer Margin", "フッターの余白"), + ("Size", "サイズ"), + ("Print\nArea", "印刷範囲"), + ("Set Print Area", "印刷範囲の設定"), + ("Breaks", "改ページ"), + ("Insert Page Break", "改ページの挿入"), + ("Remove Page Break", "改ページの解除"), + ("Reset All Page Breaks", "すべての改ページを解除"), + ("Print\nTitles", "印刷タイトル"), + ("Sheet\nRight-to-Left", "シートを右から左へ"), + ("Sheet Right-to-Left", "シートを右から左へ"), + ("Narrow", "狭い"), + ("Wide", "広い"), + ("Normal", "標準"), + ("Portrait", "縦"), + ("Landscape", "横"), + ("Custom Margins…", "ユーザー設定の余白…"), + ("Insert\nFunction", "関数の挿入"), + ("Name\nManager", "名前の管理"), + ("Define Name", "名前の定義"), + ("Use in Formula", "数式で使用"), + ("Create from Selection", "選択範囲から作成"), + ("Trace Precedents", "参照元のトレース"), + ("Trace Dependents", "参照先のトレース"), + ("Remove Arrows", "矢印の解除"), + ("Show Formulas", "数式の表示"), + ("Error Checking", "エラーチェック"), + ("Evaluate Formula", "数式の検証"), + ("Watch Window", "ウォッチ ウィンドウ"), + ("Calculation\nOptions", "計算方法の設定"), + ("Calculate Now", "再計算実行"), + ("Calculate Sheet", "シートの再計算"), + ("Automatic", "自動"), + ("Automatic Except for Data Tables", "データ テーブル以外は自動"), + ("Manual", "手動"), + ("Sort &\nFilter", "並べ替えとフィルター"), + ("Sort", "並べ替え"), + ("Sort A to Z", "昇順"), + ("Sort Z to A", "降順"), + ("Custom Sort…", "ユーザー設定の並べ替え…"), + ("Filter", "フィルター"), + ("Reapply", "再適用"), + ("Get Data\n(Text/CSV)", "データの取得 (テキスト/CSV)"), + ("Remove\nDuplicates", "重複の削除"), + ("Data\nValidation", "データの入力規則"), + ("Data Validation", "データの入力規則"), + ("Data Validation…", "データの入力規則…"), + ("Circle Invalid Data", "無効なデータをマーク"), + ("Clear Validation", "入力規則のクリア"), + ("Group", "グループ化"), + ("Ungroup", "グループ解除"), + ("Show Detail", "詳細データの表示"), + ("Hide Detail", "詳細を表示しない"), + ("Subtotal", "小計"), + ("Data\nAnalysis", "データ分析"), + ("Data Analysis", "データ分析"), + ("Solver", "ソルバー"), + ("What-If\nAnalysis", "What-If 分析"), + ("Data Table…", "データ テーブル…"), + ("Scenario Manager…", "シナリオ マネージャー…"), + ("Goal Seek…", "ゴール シーク…"), + ("Forecast\nSheet", "予測シート"), + ("Spelling", "スペルチェック"), + ("Check\nAccessibility", "アクセシビリティ チェック"), + ("Threaded Comments", "スレッド化されたコメント"), + ("Show\nComments", "コメントの表示"), + ("Previous", "前へ"), + ("Next", "次へ"), + ("Previous Comment", "前のコメント"), + ("Next Comment", "次のコメント"), + ("Show All Notes", "すべてのメモを表示"), + ("Convert to Comments", "コメントに変換"), + ("Protect\nWorkbook", "ブックの保護"), + ("Allow Edit\nRanges", "範囲の編集を許可"), + ("Allow Edit Ranges", "範囲の編集を許可"), + ("Unprotect\nSheet", "シート保護の解除"), + ("Protect Sheet…", "シートの保護…"), + ("Comments", "コメント"), + ("Notes", "メモ"), + ("Page Break\nPreview", "改ページ プレビュー"), + ("Page\nLayout", "ページ レイアウト"), + ("Formula Bar", "数式バー"), + ("Gridlines", "目盛線"), + ("Headings", "見出し"), + ("Zoom", "ズーム"), + ("100%", "100%"), + ("Zoom to\nSelection", "選択範囲を拡大"), + ("Freeze\nPanes", "ウィンドウ枠の固定"), + ("Freeze Panes", "ウィンドウ枠の固定"), + ("Freeze Top Row", "最上行の固定"), + ("Freeze First Column", "最左列の固定"), + ("Unfreeze Panes", "ウィンドウ枠固定の解除"), + ("Dark Mode", "ダーク モード"), + ("Display theme", "表示テーマ"), + ("Animations", "アニメーション"), + ( + "Glide the selection outline to the cell you move to instead of jumping there", + "選択範囲の枠を、移動先のセルまで滑らかに動かします(瞬時には切り替えません)", + ), + ("System", "システム"), + ("Light", "ライト"), + ("Dark", "ダーク"), + ("Interface language", "表示言語"), + ("Interface size", "表示サイズ"), + ("Auto", "自動"), + ("Drag to freeze columns", "ドラッグして列を固定"), + ("Drag to freeze rows", "ドラッグして行を固定"), + ("Command\nPalette", "コマンド パレット"), + ("Agent\nControl", "エージェント制御"), + ("Action\nJournal", "操作ジャーナル"), + ("About\nGridCraft", "GridCraft について"), + ("Share", "共有"), + ("Add Chart\nElement", "グラフ要素を追加"), + ("Change\nChart Type", "グラフの種類の変更"), + ("Switch\nRow/Column", "行/列の切り替え"), + ("Select\nData", "データの選択"), + ("Data Labels: None", "データ ラベル: なし"), + ("Data Labels: Show", "データ ラベル: 表示"), + ("Legend: None", "凡例: なし"), + ("Legend: Bottom", "凡例: 下"), + ("Legend: Top", "凡例: 上"), + ("Legend: Right", "凡例: 右"), + ("Gridlines: None", "目盛線: なし"), + ("Gridlines: Show", "目盛線: 表示"), + ("Chart\nTitle", "グラフ タイトル"), + ("Delete\nChart", "グラフの削除"), + ("Convert\nto Range", "範囲に変換"), + ("Table\nStyles", "テーブル スタイル"), + ("Top 10 Items", "上位 10 項目"), + ("Top 10%", "上位 10%"), + ("Bottom 10 Items", "下位 10 項目"), + ("Bottom 10%", "下位 10%"), + ("Above Average", "平均より上"), + ("Below Average", "平均より下"), + ("Clear Rules from Entire Sheet", "シート全体からルールをクリア"), + ("Clear Rules from Selected Cells", "選択したセルからルールをクリア"), + ("Constants", "定数"), + ("Data Bars", "データ バー"), + ("Color Scales", "カラー スケール"), + ("Icon Sets", "アイコン セット"), + ("Home", "ホーム"), + ("Draw", "描画"), + ("Page Layout", "ページ レイアウト"), + ("Formulas", "数式"), + ("Data", "データ"), + ("Review", "レビュー"), + ("View", "表示"), + ("Automate", "自動化"), + ("Table Design", "テーブル デザイン"), + ("Chart Design", "グラフ デザイン"), + ("Ready", "準備完了"), + ("Enter", "入力"), + ("Edit", "編集"), + ("Point", "ポイント"), + ("Calculate", "計算"), + ("Select destination and press Enter or choose Paste", "貼り付け先を選び、Enter キーを押すか [貼り付け] を選びます"), + ("General", "標準"), + ("Number", "数値"), + ("Currency", "通貨"), + ("Accounting", "会計"), + ("Date", "日付"), + ("Time", "時刻"), + ("Percentage", "パーセンテージ"), + ("Fraction", "分数"), + ("Scientific", "指数"), + ("Text", "文字列"), + ("Special", "特殊"), + ("Custom", "ユーザー設定"), + ("Short Date", "日付"), + ("Long Date", "長い日付"), + ("More Number Formats…", "その他の表示形式…"), + ("Financial", "財務"), + ("Logical", "論理"), + ("Date &\nTime", "日付/時刻"), + ("Lookup &\nReference", "検索/行列"), + ("Math &\nTrig", "数学/三角"), + ("More\nFunctions", "その他の関数"), + ("Sheet Options|View", "画面"), + ("Print", "印刷"), + ("Click to add data", "クリックしてデータを追加"), + ("Add header", "ヘッダーの追加"), + ("Add footer", "フッターの追加"), + ("(none)", "(なし)"), + ("Header", "ヘッダー"), + ("Footer", "フッター"), + ("Page\nNumber", "ページ\n番号"), + ("Number\nof Pages", "ページ数"), + ("Current\nDate", "現在の\n日付"), + ("Current\nTime", "現在の\n時刻"), + ("File\nPath", "ファイルの\nパス"), + ("File\nName", "ファイル名"), + ("Sheet\nName", "シート名"), + ("Go to\nHeader", "ヘッダーに\n移動"), + ("Go to\nFooter", "フッターに\n移動"), + ("Page Number", "ページ番号"), + ("Number of Pages", "ページ数"), + ("Current Date", "現在の日付"), + ("Current Time", "現在の時刻"), + ("File Path", "ファイルのパス"), + ("File Name", "ファイル名"), + ("Sheet Name", "シート名"), + ("Go to Header", "ヘッダーに移動"), + ("Different First Page", "先頭ページのみ別指定"), + ("Different Odd & Even Pages", "奇数/偶数ページ別指定"), + ("Go to Footer", "フッターに移動"), + ("Ruler", "ルーラー"), + ("File", "ファイル"), + ("Back", "戻る"), + ("New", "新規"), + ("Open", "開く"), + ("Info", "情報"), + ("Save", "上書き保存"), + ("Save As", "名前を付けて保存"), + ("Export", "エクスポート"), + ("Close", "閉じる"), + ("Options", "オプション"), + ("Blank workbook", "空白のブック"), + ("Recent", "最近使ったアイテム"), + ("No recent workbooks yet.", "最近使ったブックはまだありません。"), + ("More workbooks", "その他のブック"), + ("Modified", "更新日時"), + ("Not available", "利用できません"), + ("Just now", "たった今"), + ("Yesterday", "昨日"), + ("{n} min ago", "{n} 分前"), + ("{n} h ago", "{n} 時間前"), + ("{n} days ago", "{n} 日前"), + ("{n} weeks ago", "{n} 週間前"), + ("{n} months ago", "{n} か月前"), + ("{n} years ago", "{n} 年前"), + ("Browse…", "参照…"), + ("Not saved yet", "まだ保存されていません"), + ("Location", "場所"), + ("Sheets", "シート"), + ("Protect Workbook", "ブックの保護"), + ( + "Sheet structure is locked: sheets can't be added, moved, renamed or deleted.", + "シートの構成はロックされています。シートの追加、移動、名前の変更、削除はできません。", + ), + ( + "Lock the sheet structure so sheets can't be added, moved, renamed or deleted.", + "シートの構成をロックして、シートの追加、移動、名前の変更、削除をできないようにします。", + ), + ("Properties", "プロパティ"), + ("Title", "タイトル"), + ("Subject", "件名"), + ("Author", "作成者"), + ("Company", "会社名"), + ("Keywords", "キーワード"), + ("Description", "説明"), + ("No workbook is open.", "ブックが開かれていません。"), + ("Save as type", "ファイルの種類"), + ("Excel Workbook (*.xlsx)", "Excel ブック (*.xlsx)"), + ("CSV UTF-8 (Comma delimited) (*.csv)", "CSV UTF-8 (コンマ区切り) (*.csv)"), + ("Web Page (*.html)", "Web ページ (*.html)"), + ("PDF (*.pdf)", "PDF ファイル (*.pdf)"), + ("Download", "ダウンロード"), + ( + "A CSV file, web page or PDF is a copy: the workbook keeps its own file.", + "CSV ファイル、Web ページ、PDF はコピーです。ブックは元のファイルのままです。", + ), + ("Save the workbook under another name or in another folder.", "ブックを別の名前または別のフォルダーに保存します。"), + ("Print Active Sheets", "作業中のシートを印刷"), + ("Print Entire Workbook", "ブック全体を印刷"), + ("Fit Sheet on One Page", "シートを 1 ページに印刷"), + ("Page Setup…", "ページ設定…"), + ("Page {page} of {pages}", "{page} / {pages} ページ"), + ("Nothing to print.", "印刷する内容がありません。"), + ("Previous page", "前のページ"), + ("Next page", "次のページ"), + ("Create PDF", "PDF の作成"), + ("Save the sheet as a PDF document that keeps its page layout.", "ページ レイアウトを保ったまま、シートを PDF ドキュメントとして保存します。"), + ("Change File Type", "ファイルの種類の変更"), + ("CSV (Comma delimited)", "CSV (コンマ区切り)"), + ("Save the active sheet as comma-separated text.", "作業中のシートをコンマ区切りのテキストとして保存します。"), + ("Web Page (.html)", "Web ページ (.html)"), + ("Save the workbook as a web page.", "ブックを Web ページとして保存します。"), + ("Options|General", "全般"), + ("Options|Save", "保存"), + ("Show formula bar", "数式バーを表示する"), + ("Enable AutoComplete for cell values", "セルの値にオートコンプリートを使用する"), + ("Save .xlsx workbooks automatically after every change", "変更のたびに .xlsx ブックを自動的に保存する"), + ("Workbook calculation", "ブックの計算"), + ("Enable iterative calculation", "反復計算を行う"), + ("Calculation settings are saved with the workbook.", "計算の設定はブックと共に保存されます。"), +]; + +/// English label → Japanese for the dialog, message, Backstage and menu strings beyond [`CORE`]. +pub(super) const DIALOGS: &[(&str, &str)] = &[ + ("OK", "OK"), + ("Cancel", "キャンセル"), + ("Don't Save", "保存しない"), + ("Open…", "開く…"), + ("Show password", "パスワードの表示"), + ("Start a new workbook", "新しいブックの作成"), + ("Household Budget", "家計簿"), + ("Quarterly Sales Dashboard", "四半期売上ダッシュボード"), + ("Gradebook", "成績表"), + ("this workbook", "このブック"), + ("This workbook", "このブック"), + ("Do you want to save the changes you made to {title}?", "{title} への変更を保存しますか?"), + ("Save a copy as .{format}", ".{format} としてコピーを保存"), + ("Select a chart first.", "先にグラフを選択してください。"), + ("Text Box", "テキスト ボックス"), + ("Select Data", "データの選択"), + ("Row Height", "行の高さ"), + ("Column Width", "列の幅"), + ("Standard Width", "標準の幅"), + ("Rename Sheet", "シート名の変更"), + ("Move or Copy", "移動またはコピー"), + ("Protect Sheet", "シートの保護"), + ("Protect Structure and Windows", "構造とウィンドウの保護"), + ("Unprotect Workbook", "ブック保護の解除"), + ("Unprotect Sheet", "シート保護の解除"), + ("Password", "パスワード"), + ("Unhide", "再表示"), + ("Paste Special", "形式を選択して貼り付け"), + ("Series", "数列"), + ("New Comment", "新しいコメント"), + ("Insert Hyperlink", "ハイパーリンクの挿入"), + ("Create Sparklines", "スパークラインの作成"), + ("Page Setup", "ページ設定"), + ("Convert Text to Columns", "区切り位置指定ウィザード"), + ("Remove Duplicates", "重複の削除"), + ("Goal Seek", "ゴール シーク"), + ("Create Forecast Worksheet", "予測シートの作成"), + ("Solver Parameters", "ソルバー パラメーター"), + ("Solver Results", "ソルバーの結果"), + ("Edit Name", "名前の編集"), + ("New Name", "新しい名前"), + ("Format Cells", "セルの書式設定"), + ("Formula Builder", "数式ビルダー"), + ("Find and Replace", "検索と置換"), + ("Go To", "ジャンプ"), + ("Insert Calculated Field", "計算のフィールドの挿入"), + ("Go To Special", "セルを選択"), + ("Name Manager", "名前の管理"), + ("Conditional Formatting Rules Manager", "条件付き書式ルールの管理"), + ("Search Commands", "コマンドの検索"), + ("Agent Control", "エージェント制御"), + ("About GridCraft", "GridCraft について"), + ("Insert Chart", "グラフの挿入"), + ("Select Data Source", "データ ソースの選択"), + ("Action Journal", "操作ジャーナル"), + ("Macros", "マクロ"), + ("Workbook Statistics", "ブックの統計情報"), + ("Accessibility", "アクセシビリティ"), + ("Chart Title", "グラフ タイトル"), + ("Place Picture in Cell", "セルに画像を配置"), + ("Place Picture over Cells", "セルの上に画像を配置"), + ("Pick From List", "リストから選択"), + ("Save a Copy", "コピーを保存"), + ("Save Changes?", "変更を保存しますか?"), + ("Shift cells right", "セルを右に移動"), + ("Shift cells down", "セルを下に移動"), + ("Shift cells left", "セルを左に移動"), + ("Shift cells up", "セルを上に移動"), + ("Entire row", "行全体"), + ("Entire column", "列全体"), + ("Row height (pixels):", "行の高さ (ピクセル):"), + ("Column width (characters):", "列の幅 (文字数):"), + ("Standard column width (pixels):", "標準の列幅 (ピクセル):"), + ("Name:", "名前:"), + ("Before sheet (position, 0 = first):", "シートの前 (位置、0 = 先頭):"), + ("Create a copy", "コピーを作成する"), + ("Sheets: {sheets}", "シート: {sheets}"), + ("Password (optional):", "パスワード (省略可能):"), + ("Password:", "パスワード:"), + ("Allow all users of this sheet to:", "このシートのすべてのユーザーに許可する操作:"), + ("Format cells", "セルの書式設定"), + ("Format columns", "列の書式設定"), + ("Format rows", "行の書式設定"), + ("Insert rows", "行の挿入"), + ("Delete rows", "行の削除"), + ("Use AutoFilter", "オートフィルターを使用する"), + (" (password, unlocked)", " (パスワード、ロック解除)"), + (" (password)", " (パスワード)"), + ("No ranges yet.", "範囲はまだありません。"), + ("Ranges that stay editable when the sheet is protected:", "シートが保護されている間も編集できる範囲:"), + ("Action", "操作"), + ("Modify", "変更"), + ("Unlock with password", "パスワードでロック解除"), + ("Title:", "タイトル:"), + ("Refers to cells:", "参照先:"), + ("Range password:", "範囲のパスワード:"), + ("New title (Modify):", "新しいタイトル (変更):"), + ("Remove the password (Modify)", "パスワードの削除 (変更)"), + ("'{file}' is protected.", "'{file}' は保護されています。"), + ("Unhide sheet:", "再表示するシート:"), + ("Hidden: {sheets}", "非表示: {sheets}"), + ("All", "すべて"), + ("Formulas (F)", "数式 (F)"), + ("Values (V)", "値 (V)"), + ("Formats (T)", "書式 (T)"), + ("Comments and notes (C)", "コメントとメモ (C)"), + ("Validation", "入力規則"), + ("All except borders", "罫線を除くすべて"), + ("Column widths", "列幅"), + ("Formulas and number formats", "数式と数値の書式"), + ("Values and number formats", "値と数値の書式"), + ("Operation", "演算"), + ("Add", "加算"), + ("Subtract", "減算"), + ("Multiply", "乗算"), + ("Divide", "除算"), + ("Skip blanks", "空白セルを無視する"), + ("Transpose (E)", "行列を入れ替える (E)"), + ("Series in", "方向"), + ("Columns", "列"), + ("Rows", "行"), + ("Type", "種類"), + ("Linear", "線形"), + ("Growth", "等比"), + ("Date unit", "日付単位"), + ("Day", "日"), + ("Weekday", "曜日"), + ("Month", "月"), + ("Year", "年"), + ("Step value:", "増分値:"), + ("Stop value:", "停止値:"), + ("Start a conversation:", "会話を開始:"), + ("Note:", "メモ:"), + ("Display:", "表示文字列:"), + ("Link to (web address, e-mail or Sheet!A1):", "リンク先 (Web アドレス、電子メール アドレス、または Sheet!A1):"), + ("ScreenTip:", "スクリーン ヒント:"), + ("Data Range:", "データ範囲:"), + ("Location Range:", "配置先:"), + ("Markers", "マーカー"), + ("Footer:", "フッター:"), + ("Left margin (in):", "左余白 (インチ):"), + ("Right margin (in):", "右余白 (インチ):"), + ("Top margin (in):", "上余白 (インチ):"), + ("Bottom margin (in):", "下余白 (インチ):"), + ("Header (in):", "ヘッダー (インチ):"), + ("Footer (in):", "フッター (インチ):"), + ("Tab", "タブ"), + ("Semicolon", "セミコロン"), + ("Comma", "コンマ"), + ("Space", "スペース"), + ("Other:", "その他:"), + ("Treat consecutive delimiters as one", "連続した区切り文字は 1 文字として扱う"), + ("Destination:", "表示先:"), + ("My data has headers", "先頭行をデータの見出しとして使用する"), + ("Columns (blank = all, e.g. A,C):", "列 (空白 = すべて、例: A,C):"), + ("Timeline range (blank: first column of the selection):", "タイムラインの範囲 (空白: 選択範囲の最初の列):"), + ("Values range (blank: second column of the selection):", "値の範囲 (空白: 選択範囲の 2 番目の列):"), + ("Confidence interval", "信頼区間"), + ("Confidence level (%):", "信頼水準 (%):"), + ("Seasonality (auto, 0 for none, or a season length):", "周期性 (自動、なしの場合は 0、または 1 周期の長さ):"), + ("Fill missing points using", "欠落しているポイントの補完方法"), + ("Interpolation", "補間"), + ("Zeros", "ゼロ"), + ("Aggregate duplicates using", "重複を集計する方法"), + ("Average", "平均"), + ("Count", "個数"), + ("CountA", "空白を除く個数"), + ("Max", "最大値"), + ("Median", "中央値"), + ("Min", "最小値"), + ("Sum", "合計"), + ("Product", "積"), + ("Include forecast statistics", "予測の統計情報を含める"), + ("Chart", "グラフ"), + ("Line chart", "折れ線グラフ"), + ("Column chart", "縦棒グラフ"), + ("At each change in (column letter):", "基準 (列記号):"), + ("Use function", "集計の方法"), + ("Add subtotal to (columns, e.g. C,D):", "集計するフィールド (列、例: C,D):"), + ("Magnification", "倍率"), + ("Custom (%):", "ユーザー設定 (%):"), + ("Scope (Workbook or sheet name):", "範囲 (ブックまたはシート名):"), + ("Comment:", "コメント:"), + ("Refers to:", "参照先:"), + ("Allow", "入力値の種類"), + ("Any value", "任意の値"), + ("Whole number", "整数"), + ("Decimal", "小数"), + ("List", "リスト"), + ("Text length", "文字列の長さ"), + ("between", "次の値の間"), + ("not between", "次の値の間以外"), + ("equal to", "指定の値に等しい"), + ("not equal to", "指定の値に等しくない"), + ("greater than", "指定の値より大きい"), + ("less than", "指定の値より小さい"), + ("greater than or equal to", "指定の値以上"), + ("less than or equal to", "指定の値以下"), + ("Minimum / Source / Formula:", "最小値 / 元の値 / 数式:"), + ("Maximum:", "最大値:"), + ("Ignore blank", "空白を無視する"), + ("In-cell dropdown", "セル内のドロップダウン リスト"), + ("Input message:", "入力メッセージ:"), + ("Error style", "エラー メッセージのスタイル"), + ("Stop", "停止"), + ("Warning", "警告"), + ("Information", "情報"), + ("Error message:", "エラー メッセージ:"), + ("Format cells that are (value):", "セルの値が次の値のとき書式設定する (値):"), + ("and:", "と:"), + ("Format cells that contain the text:", "次の文字列を含むセルを書式設定:"), + ("Format cells that contain a date occurring:", "日付が次の期間にあるセルを書式設定:"), + ("Today", "今日"), + ("Tomorrow", "明日"), + ("In the last 7 days", "過去 7 日間"), + ("Last week", "先週"), + ("This week", "今週"), + ("Next week", "来週"), + ("Last month", "先月"), + ("This month", "今月"), + ("Next month", "来月"), + ("Format values where this formula is true:", "数式を使用して、書式設定するセルを決定:"), + ("with", "次の書式を適用"), + ("Light Red Fill with Dark Red Text", "濃い赤の文字、薄い赤の背景"), + ("Yellow Fill with Dark Yellow Text", "濃い黄色の文字、黄色の背景"), + ("Green Fill with Dark Green Text", "濃い緑の文字、緑の背景"), + ("Light Red Fill", "薄い赤の背景"), + ("Red Text", "赤の文字"), + ("Red Border", "赤い枠線"), + ("Formula:", "数式:"), + ("Select", "選択"), + ("Blanks", "空白セル"), + ("Errors", "エラー値"), + ("Numbers", "数値"), + ("Current region", "現在の領域"), + ("Last cell", "最後のセル"), + ("Visible cells only", "可視セルのみ"), + ("Conditional formats", "条件付き書式"), + ("Data validation", "入力規則"), + ("Horizontal axis title:", "横軸ラベル:"), + ("Vertical axis title:", "縦軸ラベル:"), + ("No picture selected", "画像が選択されていません"), + ("Picture file path (PNG or JPEG):", "画像ファイルのパス (PNG または JPEG):"), + ("Description (optional):", "説明 (省略可能):"), + ("Fits inside the selected cell and moves with its content.", "選択したセル内に収まり、内容と一緒に移動します。"), + ("Choose a PNG or JPEG no larger than 16 MB.", "16 MB 以下の PNG または JPEG を選択してください。"), + ("About", "バージョン情報"), + ("Contributors", "貢献者"), + ("Models", "モデル"), + ("Version {version}", "バージョン {version}"), + ("Join the ArtCraft Discord", "ArtCraft Discord に参加"), + ("This workbook has no scripts or macros.", "このブックにはスクリプトもマクロもありません。"), + ("(unnamed)", "(名前なし)"), + ("— VBA project (preserved, not run)", "— VBA プロジェクト (保持されますが、実行されません)"), + ("— 1 step", "— 1 ステップ"), + ("— {steps} steps", "— {steps} ステップ"), + ("Alignment", "配置"), + ("Font", "フォント"), + ("Border", "罫線"), + ("Format Cells|Fill", "塗りつぶし"), + ("Protection", "保護"), + ("Category:", "分類:"), + ("Sample", "サンプル"), + ("Type (custom format code):", "種類 (ユーザー定義の書式記号):"), + ("Vertical", "縦位置"), + ("Justify", "両端揃え"), + ("Center Across Selection", "選択範囲内で中央"), + ("Distributed", "均等割り付け"), + ("Top", "上"), + ("Bottom", "下"), + ("Indent", "インデント"), + ("Orientation (degrees)", "方向 (度)"), + ("Wrap text", "折り返して全体を表示する"), + ("Shrink to fit", "縮小して全体を表示する"), + ("Bold", "太字"), + ("Italic", "斜体"), + ("None", "なし"), + ("Single", "下線"), + ("Double", "二重下線"), + ("Single Accounting", "会計 (一重)"), + ("Double Accounting", "会計 (二重)"), + ("Superscript", "上付き"), + ("Subscript", "下付き"), + ("Color:", "色:"), + ("Outline", "外枠"), + ("Diagonal ↘", "斜め (右下がり)"), + ("Diagonal ↗", "斜め (右上がり)"), + ("none", "なし"), + ("thin", "細線"), + ("medium", "中線"), + ("thick", "太線"), + ("dashed", "破線"), + ("dotted", "点線"), + ("double", "二重線"), + ("Background Color:", "背景色:"), + ("Locked", "ロック"), + ("Hidden", "非表示"), + ("Search:", "検索:"), + ("e.g. lookup, average, date", "例: 検索、平均、日付"), + ("Date & Time", "日付/時刻"), + ("Lookup & Reference", "検索/行列"), + ("Math & Trig", "数学/三角"), + ("Statistical", "統計"), + ("Engineering", "エンジニアリング"), + ("Database", "データベース"), + ("Compatibility", "互換性"), + ("Web", "Web"), + ("Cube", "キューブ"), + ("Add-in and Automation", "アドインと自動化"), + ("Find", "検索"), + ("Replace", "置換"), + ("Find what:", "検索する文字列:"), + ("Replace with:", "置換後の文字列:"), + ("Match case", "大文字と小文字を区別する"), + ("Match entire cell contents", "セル内容が完全に同一である場合のみ検索"), + ("Within workbook", "ブック内"), + ("Replace All", "すべて置換"), + ("Find All", "すべて検索"), + ("Find Next", "次を検索"), + ("All done. We made {count} replacements.", "完了しました。{count} 件を置換しました。"), + ("{count} cell(s) found", "{count} 個のセルが見つかりました"), + ("Reference:", "参照:"), + ("Special…", "セルを選択…"), + ("My list has headers", "先頭行をデータの見出しとして使用する"), + ("Sort by", "最優先されるキー"), + ("Then by", "次に優先されるキー"), + ("Cell Values", "セルの値"), + ("Cell Color", "セルの色"), + ("A to Z", "昇順"), + ("Z to A", "降順"), + ("+ Add Level", "+ レベルの追加"), + ("New…", "新規作成…"), + ("Edit…", "編集…"), + ("Name", "名前"), + ("Value", "値"), + ("Refers To", "参照先"), + ("Scope", "範囲"), + ("Workbook", "ブック"), + ("No names defined", "定義された名前はありません"), + ("Recommended Charts", "推奨グラフ"), + ("All Charts", "すべてのグラフ"), + ("Clustered Column", "集合縦棒"), + ("Stacked Column", "積み上げ縦棒"), + ("100% Stacked Column", "100% 積み上げ縦棒"), + ("Clustered Bar", "集合横棒"), + ("Stacked Bar", "積み上げ横棒"), + ("100% Stacked Bar", "100% 積み上げ横棒"), + ("Line", "折れ線"), + ("Line with Markers", "マーカー付き折れ線"), + ("Stacked Line", "積み上げ折れ線"), + ("Pie", "円"), + ("Doughnut", "ドーナツ"), + ("Area", "面"), + ("Stacked Area", "積み上げ面"), + ("Scatter", "散布図"), + ("Scatter with Lines", "直線付き散布図"), + ("Radar", "レーダー"), + ("Histogram", "ヒストグラム"), + ("Waterfall", "ウォーターフォール"), + ("Funnel", "じょうご"), + ("Combo", "複合"), + ("Chart data range:", "グラフ データ範囲:"), + ("Legend Entries (Series)", "凡例項目 (系列)"), + ("Series{n}", "系列{n}"), + ("Keep", "残す"), + ("Remove", "削除"), + ("Horizontal (Category) Axis Labels:", "横軸 (項目) ラベル:"), + ("There are no conditional formatting rules on this sheet.", "このシートには条件付き書式ルールがありません。"), + ("applies to", "適用先"), + ("Type a command, e.g. freeze, chart, bold…", "コマンドを入力 (例: ウィンドウ枠の固定、グラフ、太字)…"), + ("Set cell:", "目的セル:"), + ("To value:", "目標値:"), + ("By changing cell:", "変化させるセル:"), + ("Goal Seeking found a solution: {value}", "ゴール シークで解が見つかりました: {value}"), + ("Analysis Tools", "分析ツール"), + ("Anova: Single Factor", "分散分析: 一元配置"), + ("Correlation", "相関"), + ("Covariance", "共分散"), + ("Descriptive Statistics", "基本統計量"), + ("Exponential Smoothing", "指数平滑"), + ("F-Test Two-Sample for Variances", "F 検定: 2 標本を使った分散の検定"), + ("Moving Average", "移動平均"), + ("Rank and Percentile", "順位と百分位数"), + ("Regression", "回帰"), + ("t-Test: Paired Two Sample for Means", "t 検定: 一対の標本による平均の検定"), + ("t-Test: Two-Sample Assuming Equal Variances", "t 検定: 等分散を仮定した 2 標本による検定"), + ("t-Test: Two-Sample Assuming Unequal Variances", "t 検定: 非等分散を仮定した 2 標本による検定"), + ("Output options", "出力オプション"), + ("Output Range:", "出力範囲:"), + ("New Worksheet Ply:", "新規ワークシート:"), + ("Grouped By:", "グループ化の基準:"), + ("Labels in first row", "先頭行をラベルとして使用"), + ("Input Range:", "入力範囲:"), + ("Variable 1 Range:", "変数 1 の範囲:"), + ("Variable 2 Range:", "変数 2 の範囲:"), + ("Summary statistics", "概要統計"), + ("Confidence Level for Mean (%), blank for none:", "平均の信頼度 (%、なしの場合は空白):"), + ("Kth Largest (blank for none):", "K 番目に大きい値 (なしの場合は空白):"), + ("Kth Smallest (blank for none):", "K 番目に小さい値 (なしの場合は空白):"), + ("Bin Range (blank for automatic bins):", "級の範囲 (空白の場合は自動):"), + ("Pareto (sorted histogram)", "パレート図 (並べ替えられたヒストグラム)"), + ("Cumulative Percentage", "累積比率"), + ("Alpha:", "アルファ:"), + ("Input Y Range:", "入力 Y 範囲:"), + ("Input X Range:", "入力 X 範囲:"), + ("Constant is Zero", "定数に 0 を使用"), + ("Confidence Level (%):", "信頼度 (%):"), + ("Residuals", "残差"), + ("Standardized Residuals", "標準化された残差"), + ("Normal Probability", "正規確率グラフ"), + ("Interval:", "間隔:"), + ("Standard Errors", "標準誤差"), + ("Damping factor:", "減衰係数:"), + ("Hypothesized Mean Difference:", "仮説平均との差異:"), + ("Set Objective:", "目的セルの設定:"), + ("To:", "目標値:"), + ("Value Of:", "値:"), + ("By Changing Variable Cells:", "変数セルの変更:"), + ("Subject to the Constraints:", "制約条件の対象:"), + ("Make Unconstrained Variables Non-Negative", "制約のない変数を非負数にする"), + ("Select a Solving Method:", "解決方法の選択:"), + ("GRG Nonlinear", "GRG 非線形"), + ("Solve", "解決"), + ("Keep Solver Solution", "ソルバー解を保存"), + ("Restore Original Values", "元の値を復元"), + ("The spelling check is complete for the entire sheet.", "シート全体のスペル チェックが完了しました。"), + ("Not in Dictionary ({cell}):", "辞書にない単語 ({cell}):"), + ("Suggestions:", "候補:"), + ("(No suggestions)", "(候補なし)"), + ("Ignore Once", "1 回無視"), + ("Add to Dictionary", "辞書に追加"), + ("Change", "変更"), + ("Change All", "すべて変更"), + ("$ English (United States)", "$ 英語 (米国)"), + ("Add Chart Element", "グラフ要素の追加"), + ("Align Left", "左揃え"), + ("Align Right", "右揃え"), + ("Bottom Align", "下揃え"), + ("Calculate Now (F9)", "再計算実行 (F9)"), + ("Calculate Sheet (⇧F9)", "シートの再計算 (⇧F9)"), + ("Calculation Options", "計算方法の設定"), + ("Cell Styles", "セルのスタイル"), + ("Change Chart Type", "グラフの種類の変更"), + ("Check Accessibility", "アクセシビリティ チェック"), + ("Clear Filter", "フィルターのクリア"), + ("Column or Bar", "縦棒または横棒"), + ("Comments pane", "コメント ウィンドウ"), + ("Convert the last ink stroke to a shape", "最後のインクのストロークを図形に変換"), + ("Convert to Range", "範囲に変換"), + ("Copy", "コピー"), + ("Custom Sort", "ユーザー設定の並べ替え"), + ("Cut", "切り取り"), + ("Define Name…", "名前の定義…"), + ("Delete Comment", "コメントの削除"), + ("Delete Sheet", "シートの削除"), + ("Delete chart", "グラフの削除"), + ("Delete…", "削除…"), + ("Dismiss", "閉じる"), + ("Down", "下へ"), + ("Edit chart title", "グラフ タイトルの編集"), + ("Erase ink strokes", "インクのストロークを消去"), + ("Every command run in this session (replayable)", "このセッションで実行されたすべてのコマンド (再生可能)"), + ("Expand formula bar", "数式バーの展開"), + ("Filter (⌘⇧F)", "フィルター (⌘⇧F)"), + ("Filter by Selected Cell's Value", "選択したセルの値でフィルター"), + ("Find & Select", "検索と選択"), + ("Flash Fill (⌘E)", "フラッシュ フィル (⌘E)"), + ("Forecast Sheet", "予測シート"), + ("Forecast end (date or number; blank: a third of the history):", "予測の終了 (日付または数値、空白の場合は履歴の 3 分の 1):"), + ("Format Chart pane", "グラフの書式設定ウィンドウ"), + ("Format as Table", "テーブルとして書式設定"), + ("Hide", "非表示"), + ("Hide Sheet", "シートの非表示"), + ("Hierarchy & more", "階層とその他"), + ("Highlighter", "蛍光ペン"), + ("How agents drive GridCraft (MCP / control channel)", "エージェントによる GridCraft の操作 (MCP / 制御チャネル)"), + ("Import a text or CSV file", "テキストまたは CSV ファイルのインポート"), + ("Insert Function", "関数の挿入"), + ("Insert Function (⇧F3)", "関数の挿入 (⇧F3)"), + ("Insert Link (⌘K)", "リンクの挿入 (⌘K)"), + ("Insert Sheet", "シートの挿入"), + ("Insert Slicer", "スライサーの挿入"), + ("Insert a picture", "画像の挿入"), + ("Insert a slicer to filter a table", "テーブルをフィルターするスライサーの挿入"), + ("Insert an icon", "アイコンの挿入"), + ("Insert…", "挿入…"), + ("Line or Area", "折れ線または面"), + ("Link…", "リンク…"), + ("Macros and scripts in this workbook (Alt+F8)", "このブックのマクロとスクリプト (Alt+F8)"), + ("Middle Align", "中央揃え"), + ("More commands", "その他のコマンド"), + ("Move or Copy Sheet…", "シートの移動またはコピー…"), + ("New sheet (⇧F11)", "新しいシート (⇧F11)"), + ("Next sheet", "次のシート"), + ("Page Breaks", "改ページ"), + ("Paper Size", "用紙サイズ"), + ("Paste (⌘V)", "貼り付け (⌘V)"), + ("Pick From Drop-down List…", "ドロップダウン リストから選択…"), + ("Pie or Doughnut", "円またはドーナツ"), + ("Previous sheet", "前のシート"), + ("Print Area", "印刷範囲"), + ("Print Titles", "印刷タイトル"), + ("Protect Workbook structure", "ブックの構造の保護"), + ("Redo (⌘Y)", "やり直し (⌘Y)"), + ("Save (⌘S)", "上書き保存 (⌘S)"), + ("Scatter or Bubble", "散布図またはバブル"), + ("Search and run any command", "任意のコマンドを検索して実行"), + ("Search commands (⌘⇧Space)", "コマンドの検索 (⌘⇧Space)"), + ("Select and move ink and shapes", "インクと図形の選択と移動"), + ("Series…", "数列…"), + ("Share: export or save a copy", "共有: エクスポートまたはコピーの保存"), + ("Show Formulas (⌃`)", "数式の表示 (⌃`)"), + ("Slicer", "スライサー"), + ("Sort & Filter", "並べ替えとフィルター"), + ("Spelling (F7)", "スペル チェック (F7)"), + ("Statistic", "統計"), + ("Switch Row/Column", "行/列の切り替え"), + ("Table (⌘T)", "テーブル (⌘T)"), + ("Table Styles", "テーブル スタイル"), + ("Text to Columns", "区切り位置"), + ("The output range already holds data. Replace it with the report?", "出力範囲には既にデータが入っています。レポートで置き換えますか?"), + ("Top Align", "上揃え"), + ("Undo (⌘Z)", "元に戻す (⌘Z)"), + ("Undo list", "元に戻す操作の一覧"), + ("Unhide Sheet…", "シートの再表示…"), + ("Up", "上へ"), + ("Version, contributors and the AI models that helped", "バージョン、貢献者、支援した AI モデル"), + ("What-If Analysis", "What-If 分析"), + ("Zoom In", "拡大"), + ("Zoom Out", "縮小"), + ("Zoom to 100%", "100% で表示"), + ("Zoom to Selection", "選択範囲に合わせる"), + ("Zoom…", "ズーム…"), + ("£ English (United Kingdom)", "£ 英語 (英国)"), + ("¥ Japanese", "¥ 日本語"), + ("€ Euro", "€ ユーロ"), + ("Tab|Insert", "挿入"), + ("AutoSave", "自動保存"), + ("Insert\nSlicer", "スライサーの\n挿入"), + ("Pen\nBlack", "ペン\n黒"), + ("Pen\nBlue", "ペン\n青"), + ("Pen\nRed", "ペン\n赤"), + ("Protect\nSheet", "シートの\n保護"), + ("Watch\nWindow", "ウォッチ\nウィンドウ"), + ("Workbook\nStatistics", "ブックの\n統計情報"), +]; + +/// Translates an interface label; `None` for a label the catalog does not know, so `i18n.rs` can +/// fall back to English. Dialog strings come first, the shared core second. +pub(super) fn translate(text: &str) -> Option<&'static str> { + DIALOGS.iter().chain(CORE).find(|(english, _)| *english == text).map(|(_, translated)| *translated) +} + +#[cfg(test)] +mod tests { + use std::collections::HashSet; + + use super::*; + + /// Every key the catalog holds, `DIALOGS` first. + fn catalog_keys() -> impl Iterator { + DIALOGS.iter().chain(CORE).map(|(english, _)| *english) + } + + /// The decoded value of the Rust string literal starting at byte `start` (its opening `"`), and + /// the byte index just past its closing quote. Escapes (`\n`, `\"`, `\\`, `\t`, `\u{…}`) are + /// decoded, so the keys compare equal to the ones in the tables above. + fn string_literal(source: &str, start: usize) -> Option<(String, usize)> { + if !source[start..].starts_with('"') { + return None; + } + let mut value = String::new(); + let mut chars = source[start + 1..].char_indices(); + while let Some((offset, c)) = chars.next() { + match c { + '"' => return Some((value, start + 1 + offset + 1)), + '\\' => match chars.next().map(|(_, c)| c) { + Some('n') => value.push('\n'), + Some('t') => value.push('\t'), + Some('r') => value.push('\r'), + Some('0') => value.push('\0'), + Some('\\') => value.push('\\'), + Some('"') => value.push('"'), + Some('\'') => value.push('\''), + Some('u') => { + let mut hex = String::new(); + for (_, c) in chars.by_ref() { + if c == '}' { + break; + } + if c != '{' { + hex.push(c); + } + } + if let Some(c) = u32::from_str_radix(&hex, 16).ok().and_then(char::from_u32) { + value.push(c); + } + } + // A line continuation (backslash, newline, indentation) adds nothing. + _ => {} + }, + _ => value.push(c), + } + } + None + } + + /// Every key `pt.rs` translates, read out of its source with a small scanner: a match arm is a + /// string literal whose `=>` is followed by another string literal, which covers the block form + /// (`"key" => { "value" }`) as well. Parsing the real source keeps the two catalogs from + /// drifting apart again instead of checking a remembered count. + fn portuguese_keys() -> Vec { + let source = include_str!("pt.rs"); + let mut literals: Vec<(String, usize, usize)> = Vec::new(); + let mut i = 0; + while i < source.len() { + let rest = &source[i..]; + if rest.starts_with("//") { + i += rest.find('\n').unwrap_or(rest.len()); + continue; + } + if rest.starts_with('"') { + let (value, end) = string_literal(source, i).unwrap(); + literals.push((value, i, end)); + i = end; + continue; + } + i += rest.chars().next().unwrap().len_utf8(); + } + let mut keys = Vec::new(); + for pair in literals.windows(2) { + let (key, _, end) = &pair[0]; + let start = pair[1].1; + let gap = source[*end..start].trim(); + if gap == "=>" || gap == "=> {" { + keys.push(key.clone()); + } + } + keys + } + + #[test] + fn keys_are_unique_and_every_value_is_translated() { + let mut seen = HashSet::new(); + for (english, japanese) in DIALOGS.iter().chain(CORE) { + assert!(!japanese.is_empty(), "empty translation for {english:?}"); + assert!(japanese.chars().any(|c| !c.is_whitespace()), "blank translation for {english:?}"); + assert!(seen.insert(*english), "duplicate key across CORE and DIALOGS: {english:?}"); + } + assert_eq!(seen.len(), catalog_keys().count()); + assert_eq!(CORE.len(), 398, "the shared reference set every catalog covers"); + assert_eq!(DIALOGS.len(), 545, "the dialog, message and menu strings beyond it"); + assert_eq!(catalog_keys().count(), 943); + } + + #[test] + fn covers_every_key_the_portuguese_catalog_translates() { + let portuguese = portuguese_keys(); + assert_eq!(portuguese.len(), 943, "pt.rs's arms changed: add the new keys here and update the count"); + let japanese: HashSet<&str> = catalog_keys().collect(); + for key in &portuguese { + assert!(japanese.contains(key.as_str()), "the Portuguese catalog translates {key:?}, the Japanese one does not"); + } + assert_eq!(japanese.len(), portuguese.len(), "the two catalogs hold the same key set"); + } + + #[test] + fn high_value_strings_use_excel_japanese_wording() { + for (english, japanese) in [ + ("OK", "OK"), + ("Cancel", "キャンセル"), + ("Don't Save", "保存しない"), + ("Text Box", "テキスト ボックス"), + ("Row Height", "行の高さ"), + ("Column Width", "列の幅"), + ("Sort", "並べ替え"), + ("Filter", "フィルター"), + ("Conditional Formatting", "条件付き書式"), + ("Do you want to save the changes you made to {title}?", "{title} への変更を保存しますか?"), + ("Save a copy as .{format}", ".{format} としてコピーを保存"), + ("Format Cells|Fill", "塗りつぶし"), + ("Insert\nSlicer", "スライサーの\n挿入"), + ] { + assert_eq!(translate(english), Some(japanese), "{english:?}"); + assert_eq!(crate::i18n::Language::Ja.tr(english), japanese, "{english:?}"); + } + // A `context|label` key shows only its label in English; an unknown label keeps the text. + assert_eq!(crate::i18n::Language::En.tr("Format Cells|Fill"), "Fill"); + assert_eq!(crate::i18n::Language::Ja.tr("Not in any catalog"), "Not in any catalog"); + } +} diff --git a/docs/gaps.md b/docs/gaps.md index 03e8672c5..85cd0f021 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -1,6 +1,6 @@ # Gaps -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-12 · **Change:** minor (rows auto-fit oversized fonts on open and whole-row/column formatting) · **Target:** Microsoft Excel (Microsoft 365) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365) Every known shortfall against Excel, one entry each, ranked by user impact (what blocks someone using GridCraft for real work first). This is the work list: pick from the top, check the open @@ -97,8 +97,10 @@ No alpha blockers: every core workflow passes the [alpha gate](roadmap.md#alpha- ## After beta ### 11. No localization at all (L) -- Ribbon-only catalog in five languages (#31, #104, #82; ~12% of strings each); dialogs, menus and - messages English; en-US function names and separators (#45); German in PR #163. **Estimate:** +- Catalog: ribbon-only in five languages (#31, #104, #82; ~12% of strings each), and 943 strings + (~43%) in Japanese (10-17) and Brazilian Portuguese, including the dialog labels, messages, File + view and menus. The remaining dialogs, menus and messages are English; en-US function names and + separators (#45); German in PR #163. **Estimate:** 100–165 h including #5. [localization-parity.md](localization-parity.md) ### 12. Get & Transform, external data, data model (F) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 64876633d..ee846e6c3 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-19 · **Change:** minor (defined-name length limit counts characters, so long Arabic names are accepted; Table names are limited to 255 characters; right-to-left sheets in `.xls` files open right-to-left; text boxes and shapes keep right-to-left paragraph direction through XLSX save; Save as Web Page and copied HTML keep right-to-left; French and Serbian `context|label` translations no longer show the context) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-17 · **Change:** minor (the Japanese catalog covers the dialogs, messages and menus) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Per-language status against Excel, which ships its UI in dozens of languages (Windows language packs cover 100+), with localized function names, argument separators, number and date formats, @@ -9,18 +9,19 @@ right-to-left sheets and full complex-script support. Part of ## Where we are (measured from source on `main`, after the 2026-10-10 merges) -- **A first catalog exists, for the ribbon only.** `crates/ui-egui/src/i18n.rs` (merged 10-10 in - #31, #104, #82; German added 10-11) adds an interface-language preference that defaults to the - system language (closes #20) and a View-tab switcher, with English-keyed lookup tables: - Japanese 268 labels, Simplified Chinese, Korean, Russian, Brazilian Portuguese, German and Czech 266 - each. The tables are used by - the ribbon, sheet tabs and widgets (`ribbon.rs`, `tabs.rs`, `widgets.rs`), the Format Cells - dialog, every dialog title and the shared OK/Cancel buttons; the other dialogs, menus, - context menus, task panes, status messages, command labels and function descriptions are still - English literals. Untranslated labels fall back to English. +- **A first catalog exists.** `crates/ui-egui/src/i18n.rs` (merged 10-10 in #31, #104, #82; German + added 10-11) adds an interface-language preference that defaults to the system language (closes + #20) and a View-tab switcher, with English-keyed lookup tables: Simplified Chinese, Korean, + Russian, German and Czech 266–518 labels each, Brazilian Portuguese and Japanese 943 each. The + tables are used by the ribbon, sheet tabs and widgets (`ribbon.rs`, `tabs.rs`, `widgets.rs`), the + Format Cells dialog, every dialog title and the shared OK/Cancel buttons; Japanese and Portuguese + also cover the other dialog labels, message boxes, Backstage/File-view items, template names and + native menus (Japanese, 10-17: `i18n/ja.rs` keeps the shared 398-label core and adds 545 of those + strings). The remaining menus, context menus, task panes, status messages, command labels and + function descriptions are still English literals. Untranslated labels fall back to English. - **About 2,200 user-visible strings** in all (heuristic source scan: ~1,700 UI and command - strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured - count / estimated total). + strings plus ~500 function descriptions), so the ribbon-only languages cover **~12%** and + Japanese and Portuguese **~43%** (measured count / estimated total). - **en-US only formulas and formats.** Function names, `,` argument separator, `.` decimal separator, en-US number and date formats (`crates/numfmt` says "en-US only"). Users ask for localized function names and `;` separators (#45). German with localized numbers and formulas @@ -54,9 +55,9 @@ separators, number/date formats, machine translation with agent review, and scri | Hindi | hi | 0 (0%) | no | Devanagari: **no shaping** | no | none | 12–18 h | | Arabic | ar | 0 (0%) | no | **no shaping, no RTL UI**; Sheet Right-to-Left mirrors the grid (#146) | no | none | 25–35 h | | French | fr | 0 (0%) | no | Latin: yes | no | none | 6–10 h | -| Portuguese | pt-BR | 923 (~42%) | dialogs and tooltips (dialogs take effect with #669) | Latin: yes | no | menus, File view, dialogs | 2–4 h | +| Portuguese | pt-BR | 943 (~43%) | dialogs and tooltips (dialogs take effect with #669) | Latin: yes | no | menus, File view, dialogs | 2–4 h | | Indonesian | id | 0 (0%) | no | Latin: yes | no | none | 5–8 h | -| Japanese | ja | 268 (~12%) | no | CJK system-font fallback; IME unverified; no furigana display | no | menus only | 8–12 h | +| Japanese | ja | 943 (~43%) | dialogs and messages | CJK system-font fallback; IME unverified; no furigana display | no | menus, File view, dialogs, messages | 3–5 h | | German | de | 266 (~12%) | no | Latin: yes | no | menus only | 4–8 h | | Korean | ko | 266 (~12%) | no | Hangul via the CJK fallback; IME unverified | no | menus only | 6–10 h | | Vietnamese | vi | 0 (0%) | no | Latin with stacked diacritics: unverified | no | none | 6–10 h | @@ -83,6 +84,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-20 | minor | Japanese catalog (`i18n/ja.rs`) covers every key the Brazilian Portuguese catalog translates: the 398-label shared core moved verbatim plus 545 dialog, message, Backstage and menu strings — 943 keys, ~12% → ~43%. A test parses `pt.rs`'s source, so the two catalogs can't drift apart again. Portuguese re-measured at 943 (was 923) | | 2026-10-19 | minor | Defined-name length counts characters, not bytes: Arabic names up to 255 letters are accepted, and Create from Selection keeps long Arabic headers | | 2026-10-19 | minor | Table names are limited to 255 Unicode characters | | 2026-10-19 | minor | Right-to-left sheets in legacy `.xls` files (common in older Arabic workbooks) open right-to-left |