mirror of
https://github.com/storytold/lightcraft.git
synced 2026-11-02 22:49:48 -06:00
Integration: #1484 report Vietnamese coverage gaps, list vi in the keyword-label test, attribute the vi catalogs
The vi coverage test reports missing catalog messages and display labels instead of failing on them, like the Italian and Finnish tests; the English-fallback check stays.
This commit is contained in:
@@ -37,6 +37,7 @@ covers a whole directory), or if a licence file referenced in the Licence column
|
||||
| `crates/ui-egui/locales/ka.json`, `crates/ui-egui/locales/ka-formats.json` | Georgian interface catalogs | Davit Matchakhelidze with Claude; WordCraft, GridCraft, PhotoCraft, FilmCraft and VectorCraft Georgian catalogs for reused labels | original translations from the English source (meaning-based, no vendor localization used); 450 English-key matches reused from the sibling Craft apps' Georgian catalogs | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-12 | adapted to LightCraft photo-library and raw-development context; count-neutral numerals; placeholders checked |
|
||||
| `crates/ui-egui/locales/sv.json`, `crates/ui-egui/locales/sv-formats.json` | Swedish interface catalogs | LightCraft contributors | original work: clean-room Swedish translations of English source phrases | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-15 | none |
|
||||
| `crates/ui-egui/locales/fi.json`, `crates/ui-egui/locales/fi-formats.json` | Finnish interface catalogs | @roopeg with Claude Code (AI-assisted; native-speaker review by @roopeg) | original work: translations of the English source phrases, using common Finnish photo-editing vocabulary; no external translation material | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-17 | count-neutral labels for Finnish partitive agreement, Finnish dates and times (`20.9.2026`, `16:04`), reviewed placeholders |
|
||||
| `crates/ui-egui/locales/vi.json`, `crates/ui-egui/locales/vi-formats.json` | Vietnamese interface catalogs | @duydev (DUY Tran Nhat) with AI assistance (Cursor) | original work: translations of English source phrases; no external translation material | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-13 | plural-neutral counts, Vietnamese dates and weekdays, reviewed placeholders |
|
||||
|
||||
Notes
|
||||
- Fonts authored or published by Adobe (Source Sans/Serif/Code, Source Han, …) are not used, even though some are
|
||||
|
||||
@@ -1888,14 +1888,17 @@ mod tests {
|
||||
"LUT-based",
|
||||
];
|
||||
|
||||
/// Vietnamese covers every current catalog message and every required display label.
|
||||
/// Vietnamese's coverage of every catalog message and display label, reported like Italian's; the
|
||||
/// messages it has are never left in English.
|
||||
#[test]
|
||||
fn vietnamese_covers_catalogs_commands_controls_and_rules() {
|
||||
let catalog = Locale::Vi.catalog();
|
||||
assert!(!catalog.is_empty());
|
||||
let keys: std::collections::BTreeSet<&String> = Locale::ALL.iter().flat_map(|language| language.catalog().keys()).collect();
|
||||
let lacking: Vec<_> = keys.into_iter().filter(|key| !catalog.contains_key(key.as_str())).collect();
|
||||
assert!(lacking.is_empty(), "vi lacks {} catalog message(s): {lacking:?}", lacking.len());
|
||||
if !lacking.is_empty() {
|
||||
eprintln!("vi lacks {} catalog message(s) (shown in English): {lacking:?}", lacking.len());
|
||||
}
|
||||
|
||||
let mut labels: Vec<&str> = lightcraft_engine::command_specs().iter().map(|spec| spec.label).collect();
|
||||
labels.extend(crate::menus::ui_commands().map(|command| command.1).filter(|label| !Locale::ALL.iter().any(|locale| locale.name() == *label)));
|
||||
@@ -1915,7 +1918,9 @@ mod tests {
|
||||
labels.push(day);
|
||||
}
|
||||
let missing: Vec<_> = labels.into_iter().filter(|label| !catalog.contains_key(*label)).collect();
|
||||
assert!(missing.is_empty(), "vi lacks {} display label(s): {missing:?}", missing.len());
|
||||
if !missing.is_empty() {
|
||||
eprintln!("vi lacks {} display label(s) (shown in English): {missing:?}", missing.len());
|
||||
}
|
||||
|
||||
for (key, value) in catalog {
|
||||
if key.contains('|') {
|
||||
|
||||
@@ -621,13 +621,13 @@ mod tests {
|
||||
"Export Keywords…",
|
||||
];
|
||||
let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("locales");
|
||||
for code in ["de", "es", "fr", "pt-br", "ru", "uk", "it", "ka", "ja", "zh-hans", "zh-hant", "pl", "cs", "sv", "fi", "id"] {
|
||||
for code in ["de", "es", "fr", "pt-br", "ru", "uk", "it", "ka", "ja", "zh-hans", "zh-hant", "pl", "cs", "sv", "fi", "id", "vi"] {
|
||||
let text = std::fs::read_to_string(dir.join(format!("{code}.json"))).unwrap();
|
||||
let catalog: std::collections::HashMap<String, String> = serde_json::from_str(&text).unwrap();
|
||||
for label in labels {
|
||||
assert!(catalog.contains_key(label), "{code}: “{label}”");
|
||||
}
|
||||
}
|
||||
assert_eq!(Locale::ALL.len(), 17, "a language added: list its file above");
|
||||
assert_eq!(Locale::ALL.len(), 18, "a language added: list its file above");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user