i18n: the Swatches panel shows the default swatches' names in Japanese

The list showed [None], [Registration] and the default swatches' names in
English. Names the app gives (the default swatches and colour groups) now
show in the UI's language where it has a `swatch` row for them; documents
keep the names as they are, and a name the user gave shows as written.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hiroshi Inukai
2026-10-16 06:16:35 +07:00
committed by bflatastic
co-authored by Claude Opus 5.5
parent 4265c2f301
commit 75ee324e6c
4 changed files with 75 additions and 4 deletions
+46
View File
@@ -3536,6 +3536,52 @@ theme Appearance 外観
# names and values in backticks or code (`colorModel rgb`, `document.export`) stay as they are.
# Japanese: no final 。 (these are status lines, and reasons that follow a colon), unless the English ends
# with a period; a space between Japanese text and an adjacent Latin word, number or {placeholder}.
# Swatches panel: the default swatches' names (shown in the UI language; documents keep them)
swatch [None] [なし]
swatch [Registration] [レジストレーション]
swatch White ホワイト
swatch Black ブラック
swatch Red レッド
swatch Orange Red オレンジレッド
swatch Orange オレンジ
swatch Amber アンバー
swatch Yellow イエロー
swatch Yellow Green イエローグリーン
swatch Lime ライム
swatch Green グリーン
swatch Emerald エメラルド
swatch Teal ティール
swatch Aqua アクア
swatch Cyan Green シアングリーン
swatch Cyan シアン
swatch Azure アジュール
swatch Blue ブルー
swatch Indigo インディゴ
swatch Violet バイオレット
swatch Purple パープル
swatch Magenta マゼンタ
swatch Rose ローズ
swatch Pink ピンク
swatch Brown ブラウン
swatch Tan タン
swatch Coffee コーヒー
swatch Chocolate チョコレート
swatch Sand サンド
swatch Copper カッパー
swatch Rust ラスト
swatch Walnut ウォルナット
swatch Espresso エスプレッソ
swatch White, Black ホワイト、ブラック
swatch Radial White, Black 円形 ホワイト、ブラック
swatch Sunset サンセット
swatch Ocean オーシャン
swatch Grays グレー
swatch Brights ビビッド
swatch Bright Red ビビッドレッド
swatch Bright Yellow ビビッドイエロー
swatch Bright Green ビビッドグリーン
swatch Bright Blue ビビッドブルー
swatch Bright Violet ビビッドバイオレット
@msg Reset {_1} {_1} をリセットしました
@msg Saving 保存中
@msg Saving {_1} {_1} を保存中
Can't render this file because it contains an unexpected character in line 2 and column 73.
+6
View File
@@ -472,6 +472,12 @@ pub fn tr_ctx<'a>(lang: Lang, context: &str, s: &'a str) -> &'a str {
lang.catalog().contextual(context, s).unwrap_or_else(|| tr(lang, s))
}
/// A name the app gives something (a default swatch's), translated where the current language has
/// a `context` row for it; any other name (one the user gave) comes back as it is.
pub fn t_name<'a>(context: &str, name: &'a str) -> &'a str {
current().catalog().contextual(context, name).unwrap_or(name)
}
/// A string keyed by its command id, falling back to the translation of the English `label`.
pub fn tr_id<'a>(lang: Lang, id: &str, label: &'a str) -> &'a str {
lang.catalog().id(id).unwrap_or_else(|| tr(lang, label))
+17
View File
@@ -1469,3 +1469,20 @@ fn polish_reads_as_polish() {
let nested = "command `object.group` is not available right now: nothing selected";
assert_eq!(message(pl(), nested), "polecenie `object.group` jest teraz niedostępne: nic nie zaznaczono");
}
/// Japanese names every default swatch and colour group the Swatches panel shows (the greys'
/// `K=` values read the same in any language); a name the user gave a swatch has no row.
#[test]
fn japanese_names_the_default_swatches() {
let ja = Lang::from_code("ja").unwrap().catalog();
let (swatches, groups) = vectorcraft_color::default_swatches(vectorcraft_color::cms::Model::Rgb);
let names = swatches
.iter()
.map(|s| s.name.clone())
.chain(groups.iter().flat_map(|g| std::iter::once(g.name.clone()).chain(g.swatches.iter().map(|s| s.name.clone()))))
.chain([vectorcraft_color::swatch::REGISTRATION.to_string()]);
let missing: Vec<String> = names.filter(|n| !n.starts_with("K=") && ja.contextual("swatch", n).is_none()).collect();
assert!(missing.is_empty(), "{missing:?}");
assert_eq!(ja.contextual("swatch", "White"), Some("ホワイト"));
assert_eq!(ja.contextual("swatch", "My Red"), None);
}
+6 -4
View File
@@ -429,12 +429,14 @@ fn tile_input(ui: &Ui, resp: Response, e: &Entry, items: &[Entry], sel: &[String
egui::DragAndDrop::set_payload(ui.ctx(), drag_of(e, names));
}
tile_drop(ui, &resp, e, list, ev);
// The default swatches' names show in the UI's language; the document keeps them as they are.
let shown = crate::i18n::t_name("swatch", name);
let resp = match e {
Entry::Folder(n) => resp.on_hover_text(crate::i18n::fmt(tl!("Color Group: {name}"), &[("name", n)])),
Entry::Folder(_) => resp.on_hover_text(crate::i18n::fmt(tl!("Color Group: {name}"), &[("name", shown)])),
Entry::Swatch { paint, global, spot, .. } if list => resp.on_hover_ui(|ui| {
ui.label(format!("{name} ({})", describe(paint, *global, *spot)));
ui.label(format!("{shown} ({})", describe(paint, *global, *spot)));
}),
_ => resp.on_hover_text(name),
_ => resp.on_hover_text(shown),
};
if resp.clicked() {
ev.clicked = Some((e.clone(), ui.input(|i| i.modifiers)));
@@ -682,7 +684,7 @@ fn body(app: &mut VectorcraftApp, ui: &mut Ui, salt: &'static str) {
}
Entry::Folder(_) => draw_folder(ui, chip),
}
list_row_name(ui, r, chip, name);
list_row_name(ui, r, chip, crate::i18n::t_name("swatch", name));
tile_input(ui, resp, e, &items, sel, true, &mut ev);
}
} else {