mirror of
https://github.com/storytold/filmcraft.git
synced 2026-10-24 10:10:05 -06:00
i18n: German (de) covers the whole interface
#630 shipped German for the menus. This adds the other 3,213 strings, so de.tsv has every entry of the Spanish catalog (3,590): panels, dialogs, effects and their parameters, transitions, presets, Settings, shortcut commands, export presets, tooltips and status messages. Same style as the menus (du, infinitives, placeholders, ellipses and escapes kept); the glossary in the header is extended. The 377 menu entries are unchanged. german_entries_cover_the_original_menu_catalog required every entry to be a menu label. It becomes german_covers_the_menus_and_has_no_dead_entries, like the French and Italian tests: every entry needs a Spanish counterpart, the core menus and the native macOS app menu are required, later strings may stay English. german_renders_with_bundled_fonts checks the umlauts, ß and German quotation marks against the bundled fonts. Docs: ROADMAP.md, docs/localization-parity.md, docs/gaps.md, ui-egui README. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KJhvSJ5odpWzFw9HhPzAix
This commit is contained in:
committed by
irgendwasmitfelix
parent
6c3948a36c
commit
f4b1bee71f
+3
-2
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
**Stage: alpha** · next: beta, ~19 points of ready-for-real-work and ~400–700 h away, plus opening Premiere's `.prproj` ([why](docs/target-app-parity.md#stage); passes the [core-workflow gate](docs/roadmap.md#alpha-gate))
|
**Stage: alpha** · next: beta, ~19 points of ready-for-real-work and ~400–700 h away, plus opening Premiere's `.prproj` ([why](docs/target-app-parity.md#stage); passes the [core-workflow gate](docs/roadmap.md#alpha-gate))
|
||||||
|
|
||||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** minor (language table: German ships the menus, #630) · **Target:** Adobe Premiere Pro 2026 (26.5.2)
|
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (language table: German covers the whole interface) · **Target:** Adobe Premiere Pro 2026 (26.5.2)
|
||||||
|
|
||||||
Progress toward parity with Adobe Premiere Pro. This page is the summary; the detail is in
|
Progress toward parity with Adobe Premiere Pro. This page is the summary; the detail is in
|
||||||
[docs/target-app-parity.md](docs/target-app-parity.md) (assessment, methodology, calibration),
|
[docs/target-app-parity.md](docs/target-app-parity.md) (assessment, methodology, calibration),
|
||||||
@@ -87,7 +87,7 @@ Premiere ships 10 interface languages. Measured from our catalogs (3,498 strings
|
|||||||
| Italian | partial (whole interface; native review welcome) | ~100% |
|
| Italian | partial (whole interface; native review welcome) | ~100% |
|
||||||
| Korean | partial (whole interface; needs an installed Hangul font; native review welcome) | ~100% |
|
| Korean | partial (whole interface; needs an installed Hangul font; native review welcome) | ~100% |
|
||||||
| Japanese | partial (whole interface) | 99.7% |
|
| Japanese | partial (whole interface) | 99.7% |
|
||||||
| German | menus only (native-reviewed) | 10.6% |
|
| German | partial (whole interface; menus native-reviewed, the rest welcome) | ~100% |
|
||||||
| Vietnamese | none | 0% |
|
| Vietnamese | none | 0% |
|
||||||
|
|
||||||
Also shipped: Ukrainian (menus only, 10%). Detail: [docs/localization-parity.md](docs/localization-parity.md).
|
Also shipped: Ukrainian (menus only, 10%). Detail: [docs/localization-parity.md](docs/localization-parity.md).
|
||||||
@@ -166,6 +166,7 @@ Ranked; detail and "done when" in [docs/roadmap.md](docs/roadmap.md) and [docs/g
|
|||||||
|
|
||||||
| Date | Change | Summary |
|
| Date | Change | Summary |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| 2026-10-13 | minor | Language table: German covers the whole interface (~100%) |
|
||||||
| 2026-10-12 | trivial | Progress log: Transform shutter on adjustment layers (#1088) |
|
| 2026-10-12 | trivial | Progress log: Transform shutter on adjustment layers (#1088) |
|
||||||
| 2026-10-11 | minor | Language table: German ships the menus (#630, 10.6%) |
|
| 2026-10-11 | minor | Language table: German ships the menus (#630, 10.6%) |
|
||||||
| 2026-10-10 | minor | Readiness-by-audience table with hours to ~95% per audience |
|
| 2026-10-10 | minor | Readiness-by-audience table with hours to ~95% per audience |
|
||||||
|
|||||||
@@ -32,11 +32,10 @@ fills translated templates, and `i18n::t` translates names from registries. Plac
|
|||||||
(including user filenames containing braces) are inserted literally. Catalog translations are
|
(including user filenames containing braces) are inserted literally. Catalog translations are
|
||||||
original work using ordinary language, without proprietary localisation resources.
|
original work using ordinary language, without proprietary localisation resources.
|
||||||
|
|
||||||
Spanish, Japanese, Simplified Chinese, French and Brazilian Portuguese cover menus, panels, dialogs, settings and registry labels. Searches accept both the
|
Spanish, Japanese, Simplified Chinese, French, Brazilian Portuguese and German cover menus, panels, dialogs, settings and registry labels. Searches accept both the
|
||||||
translated label and its English source, including Unicode capitals. Project content, command ids
|
translated label and its English source, including Unicode capitals. Project content, command ids
|
||||||
and preference values retain their original values. Engine errors, CLI and MCP messages remain
|
and preference values retain their original values. Engine errors, CLI and MCP messages remain
|
||||||
English. Ukrainian and Russian currently cover the core menus, German every menu; they fall back
|
English. Ukrainian and Russian currently cover the core menus; they fall back to English elsewhere.
|
||||||
to English elsewhere.
|
|
||||||
|
|
||||||
Verification: `cargo test -p filmcraft-ui-egui` checks catalog syntax, duplicate keys, placeholders,
|
Verification: `cargo test -p filmcraft-ui-egui` checks catalog syntax, duplicate keys, placeholders,
|
||||||
literal/menu/registry coverage and UI behaviour; `cargo xtask ci` runs the workspace gates. Visual
|
literal/menu/registry coverage and UI behaviour; `cargo xtask ci` runs the workspace gates. Visual
|
||||||
|
|||||||
+3225
-3
File diff suppressed because it is too large
Load Diff
@@ -1103,16 +1103,17 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// German covers at least the core menus (`core_menu_labels`, the top-level menus and the native
|
/// German covers the whole interface (every entry of the Spanish catalog, the native macOS app
|
||||||
/// macOS app menu); every entry must still be a menu label.
|
/// menu included), but, like French, the tests require only the core menus and the native app
|
||||||
|
/// menu, so strings added later show in English until they are translated. Every entry must
|
||||||
|
/// still have a Spanish counterpart: a renamed or removed source would otherwise leave a dead
|
||||||
|
/// German entry.
|
||||||
#[test]
|
#[test]
|
||||||
fn german_entries_cover_the_original_menu_catalog() {
|
fn german_covers_the_menus_and_has_no_dead_entries() {
|
||||||
let app = crate::FilmcraftApp::new(filmcraft_engine::Session::default());
|
let (entries, errors) = catalog::parse_entries(include_str!("de.tsv"));
|
||||||
let items = crate::menus::menu_items(&app);
|
assert!(errors.is_empty(), "{errors:?}");
|
||||||
let known = |text: &str| crate::menus::MENUS.contains(&text) || items.iter().any(|it| it.label == text || it.path.iter().any(|p| p == text));
|
for (ctx, en, _) in &entries {
|
||||||
let (entries, _) = catalog::parse_entries(include_str!("de.tsv"));
|
assert!(ctx.is_empty() && Language::Es.has(en), "German entry without a Spanish one: {ctx:?} {en:?}");
|
||||||
for (_, en, _) in entries {
|
|
||||||
assert!(known(&en) || crate::menus::NATIVE_APP_MENU.contains(&en.as_str()), "not a menu label: {en}");
|
|
||||||
}
|
}
|
||||||
for en in core_menu_labels() {
|
for en in core_menu_labels() {
|
||||||
assert!(Language::De.has(&en), "missing German menu label: {en}");
|
assert!(Language::De.has(&en), "missing German menu label: {en}");
|
||||||
@@ -1123,6 +1124,21 @@ mod tests {
|
|||||||
}
|
}
|
||||||
assert_eq!(Language::De.tr("Settings"), "Voreinstellungen");
|
assert_eq!(Language::De.tr("Settings"), "Voreinstellungen");
|
||||||
assert_eq!(Language::De.tr("Quit FilmCraft"), "FilmCraft beenden");
|
assert_eq!(Language::De.tr("Quit FilmCraft"), "FilmCraft beenden");
|
||||||
|
// beyond the menus: panels, effects and their parameters, settings, status messages
|
||||||
|
for (en, de) in [
|
||||||
|
("Gaussian Blur", "Gaußscher Weichzeichner"),
|
||||||
|
("Audio Track Mixer", "Audiospur-Mischpult"),
|
||||||
|
("Sequence", "Sequenz"),
|
||||||
|
("Playhead", "Abspielposition"),
|
||||||
|
("Keyboard Shortcuts", "Tastenkürzel"),
|
||||||
|
("{n} min ago", "vor {n} Min."),
|
||||||
|
] {
|
||||||
|
assert_eq!(Language::De.tr(en), de);
|
||||||
|
}
|
||||||
|
set_current(Language::De);
|
||||||
|
assert!(matches_query("Gaussian Blur", "weichzeichner"));
|
||||||
|
assert!(matches_query("Gaussian Blur", "gaussian"));
|
||||||
|
set_current(Language::En);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// French covers the whole interface (the Spanish catalog's entries and the native macOS
|
/// French covers the whole interface (the Spanish catalog's entries and the native macOS
|
||||||
@@ -1318,6 +1334,16 @@ mod tests {
|
|||||||
assert_bundled_fonts_cover(alphabet.chars().chain(Language::Fr.name().chars()).chain(letters));
|
assert_bundled_fonts_cover(alphabet.chars().chain(Language::Fr.name().chars()).chain(letters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn german_renders_with_bundled_fonts() {
|
||||||
|
let (entries, _) = catalog::parse_entries(include_str!("de.tsv"));
|
||||||
|
// every German letter and quotation mark, even ones no entry uses yet, and every letter,
|
||||||
|
// dash and ellipsis the entries use (symbols such as ✔ come from the English sources)
|
||||||
|
let alphabet = "ÄÖÜäöüß„“‚‘";
|
||||||
|
let letters = entries.iter().flat_map(|(_, _, de)| de.chars()).filter(|ch| ch.is_alphabetic() || "„“‚‘–—…".contains(*ch));
|
||||||
|
assert_bundled_fonts_cover(alphabet.chars().chain(Language::De.name().chars()).chain(letters));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn indonesian_renders_with_bundled_fonts() {
|
fn indonesian_renders_with_bundled_fonts() {
|
||||||
let (entries, _) = catalog::parse_entries(include_str!("id.tsv"));
|
let (entries, _) = catalog::parse_entries(include_str!("id.tsv"));
|
||||||
|
|||||||
+4
-1
@@ -238,7 +238,7 @@ platforms** G4, G9, G17; **performance** G16; **ecosystem** G11; **measurement**
|
|||||||
- **Missing:** Hindi, Arabic (no RTL interface layout or catalog; the interface has Arabic and Hebrew
|
- **Missing:** Hindi, Arabic (no RTL interface layout or catalog; the interface has Arabic and Hebrew
|
||||||
fallback fonts and shows captions in reading order, but other names and fields keep egui's
|
fallback fonts and shows captions in reading order, but other names and fields keep egui's
|
||||||
left-to-right run order; Arabic titles reported broken, #395),
|
left-to-right run order; Arabic titles reported broken, #395),
|
||||||
German beyond menus (#490), Korean (#508; needs Hangul fonts in craft-fonts),
|
Korean (#508; needs Hangul fonts in craft-fonts),
|
||||||
Vietnamese; Premiere also ships Russian. Engine errors,
|
Vietnamese; Premiere also ships Russian. Engine errors,
|
||||||
CLI and MCP stay English. No language has a recorded native-speaker review.
|
CLI and MCP stay English. No language has a recorded native-speaker review.
|
||||||
- **Done:** Indonesian (#867): `id.tsv` has every entry of the Spanish catalog (~100%), in Edit ▸
|
- **Done:** Indonesian (#867): `id.tsv` has every entry of the Spanish catalog (~100%), in Edit ▸
|
||||||
@@ -247,6 +247,9 @@ platforms** G4, G9, G17; **performance** G16; **ecosystem** G11; **measurement**
|
|||||||
- **Done:** Italian: `it.tsv` has every entry of the Spanish catalog (~100%), in Edit ▸ Language,
|
- **Done:** Italian: `it.tsv` has every entry of the Spanish catalog (~100%), in Edit ▸ Language,
|
||||||
Settings ▸ General and the native macOS menu; System Language picks it for `it-*` locales.
|
Settings ▸ General and the native macOS menu; System Language picks it for `it-*` locales.
|
||||||
Native-speaker review welcome.
|
Native-speaker review welcome.
|
||||||
|
- **Done:** German: `de.tsv` has every entry of the Spanish catalog (~100%), beyond the menus of
|
||||||
|
#630 (panels, dialogs, effects and their parameters, settings, status messages). The menus are
|
||||||
|
native-reviewed; review of the rest welcome.
|
||||||
- **Estimate:** 150–230 h. Doc: [localization-parity.md](localization-parity.md).
|
- **Estimate:** 150–230 h. Doc: [localization-parity.md](localization-parity.md).
|
||||||
|
|
||||||
## G15. Interchange never validated in Avid / Pro Tools; slow XML import
|
## G15. Interchange never validated in Avid / Pro Tools; slow XML import
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Localization parity
|
# Localization parity
|
||||||
|
|
||||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (Korean covers the whole interface, #508) · **Target:** Adobe Premiere Pro 2026 (26.5.2)
|
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (German covers the whole interface) · **Target:** Adobe Premiere Pro 2026 (26.5.2)
|
||||||
|
|
||||||
Per-language status of FilmCraft's interface. Premiere 26.5.2 ships 10 interface languages (the
|
Per-language status of FilmCraft's interface. Premiere 26.5.2 ships 10 interface languages (the
|
||||||
installed bundle's `.lproj` folders): German, English, Spanish, French, Italian, Japanese, Korean,
|
installed bundle's `.lproj` folders): German, English, Spanish, French, Italian, Japanese, Korean,
|
||||||
@@ -17,8 +17,8 @@ are reachable over the control channel. One catalog per language,
|
|||||||
commands, panels, workspaces, presets) are translated where they are drawn. Searches match the
|
commands, panels, workspaces, presets) are translated where they are drawn. Searches match the
|
||||||
displayed labels as well as English sources. Tests fail when a `tl!` literal, a menu label or a
|
displayed labels as well as English sources. Tests fail when a `tl!` literal, a menu label or a
|
||||||
registry name has no Spanish entry; `zh-cn.tsv` must also cover every `tl!` literal and menu
|
registry name has no Spanish entry; `zh-cn.tsv` must also cover every `tl!` literal and menu
|
||||||
label; `ja.tsv`, `fr.tsv` and `pt-br.tsv` have the same entries but are not yet required by tests
|
label; `ja.tsv`, `fr.tsv`, `pt-br.tsv` and `de.tsv` have the same entries but are not yet required by tests
|
||||||
(French must cover the core menus, Brazilian Portuguese every menu label, and neither may keep an
|
(French and German must cover the core menus, Brazilian Portuguese every menu label, and neither may keep an
|
||||||
entry without a Spanish one). Engine error messages, the
|
entry without a Spanish one). Engine error messages, the
|
||||||
control channel, the CLI and MCP stay English.
|
control channel, the CLI and MCP stay English.
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ whole interface, one PR) at ~4–8 h per language for the catalog plus tests.
|
|||||||
| Portuguese (Brazil) | pt-br | 3,541 (same entries as Spanish, plus the macOS Settings item) | as Spanish | Latin (bundled fonts) | not recorded; welcome | partial (#859) | review |
|
| Portuguese (Brazil) | pt-br | 3,541 (same entries as Spanish, plus the macOS Settings item) | as Spanish | Latin (bundled fonts) | not recorded; welcome | partial (#859) | review |
|
||||||
| Indonesian | id | 3,541 (same entries as Spanish, plus the macOS Settings item); must cover the core menus, no entry without a Spanish one | as Spanish | Latin (bundled fonts); System Language also maps the legacy `in` code | not recorded; welcome | partial (#867) | review |
|
| Indonesian | id | 3,541 (same entries as Spanish, plus the macOS Settings item); must cover the core menus, no entry without a Spanish one | as Spanish | Latin (bundled fonts); System Language also maps the legacy `in` code | not recorded; welcome | partial (#867) | review |
|
||||||
| Japanese | ja | 3,487 (99.7%) | as zh-cn; system-font kanji may pick the Chinese fallback (#547) | CJK fonts, vertical title text | not recorded | partial | 4–8 h + review |
|
| Japanese | ja | 3,487 (99.7%) | as zh-cn; system-font kanji may pick the Chinese fallback (#547) | CJK fonts, vertical title text | not recorded | partial | 4–8 h + review |
|
||||||
| German | de | 371 (10.6%) | menus only | Latin | yes (#630) | menus only | 5–9 h + review |
|
| German | de | 3,590 (same entries as Spanish); must cover the core menus and the macOS app menu, no entry without a Spanish one | as Spanish | Latin (bundled fonts) | menus yes (#630); the rest not recorded, welcome | partial | review |
|
||||||
| Korean | ko | 3,573 (same entries as Spanish, plus the macOS Settings item) | as Spanish | installed system Hangul font (Malgun Gothic, Apple SD Gothic Neo, Noto Sans CJK KR…); refused without one | not recorded; welcome | partial (#508) | review; Hangul in craft-fonts for the web |
|
| Korean | ko | 3,573 (same entries as Spanish, plus the macOS Settings item) | as Spanish | installed system Hangul font (Malgun Gothic, Apple SD Gothic Neo, Noto Sans CJK KR…); refused without one | not recorded; welcome | partial (#508) | review; Hangul in craft-fonts for the web |
|
||||||
| Vietnamese | vi | 0 (0%) | — | Latin with stacked diacritics (font coverage to check) | — | none | 6–12 h + review |
|
| Vietnamese | vi | 0 (0%) | — | Latin with stacked diacritics (font coverage to check) | — | none | 6–12 h + review |
|
||||||
| *Other shipped:* Italian | it | 3,573 (same entries as Spanish, plus the macOS Settings item); must cover the core menus, no entry without a Spanish one | as Spanish | Latin (bundled fonts) | not recorded; welcome | partial | review |
|
| *Other shipped:* Italian | it | 3,573 (same entries as Spanish, plus the macOS Settings item); must cover the core menus, no entry without a Spanish one | as Spanish | Latin (bundled fonts) | not recorded; welcome | partial | review |
|
||||||
@@ -58,9 +58,9 @@ whole interface, one PR) at ~4–8 h per language for the catalog plus tests.
|
|||||||
|
|
||||||
Premiere also ships Italian, which we now cover like Spanish, and Russian (6–10 h).
|
Premiere also ships Italian, which we now cover like Spanish, and Russian (6–10 h).
|
||||||
|
|
||||||
**Localization dimension:** 6 of the 12 key languages near-complete (English, Spanish, Japanese,
|
**Localization dimension:** 9 of the 12 key languages near-complete (English, Spanish, Japanese,
|
||||||
Simplified Chinese, French, Portuguese (Brazil)), 1 menus-only, 5 none; against Premiere's 10 languages
|
Simplified Chinese, French, Portuguese (Brazil), Indonesian, Korean, German), 3 none (Hindi, Arabic,
|
||||||
we cover 6 well and 1 partly. **~35%, 150–230 h** for all twelve to `full` plus Italian and Russian, of which the script
|
Vietnamese); against Premiere's 10 languages we cover 9 well and Russian partly. **~35%, 150–230 h** for all twelve to `full` plus Italian and Russian, of which the script
|
||||||
work (RTL and complex shaping in the egui interface) is the largest and least parallel part.
|
work (RTL and complex shaping in the egui interface) is the largest and least parallel part.
|
||||||
Every language needs native-speaker review (human).
|
Every language needs native-speaker review (human).
|
||||||
|
|
||||||
@@ -68,5 +68,6 @@ Every language needs native-speaker review (human).
|
|||||||
|
|
||||||
| Date | Change | Summary |
|
| Date | Change | Summary |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| 2026-10-13 | minor | German (de) covers the whole interface: every entry of the Spanish catalog (3,590); the tests require the core menus and the macOS app menu and reject entries without a Spanish one |
|
||||||
| 2026-10-11 | minor | German (de) ships the menus (#630): 371 of 3,498 strings (10.6%), native-reviewed; dimension now 2 menus-only, 5 none |
|
| 2026-10-11 | minor | German (de) ships the menus (#630): 371 of 3,498 strings (10.6%), native-reviewed; dimension now 2 menus-only, 5 none |
|
||||||
| 2026-10-10 | major | Created from ROADMAP.md's "Interface localization" section; catalog coverage measured (es 3,496, ja 3,487, zh-cn 3,485, pt-br 348, uk 351 of 3,498); the 12-language table and script-support gaps added |
|
| 2026-10-10 | major | Created from ROADMAP.md's "Interface localization" section; catalog coverage measured (es 3,496, ja 3,487, zh-cn 3,485, pt-br 348, uk 351 of 3,498); the 12-language table and script-support gaps added |
|
||||||
|
|||||||
Reference in New Issue
Block a user