diff --git a/crates/engine/src/prefs.rs b/crates/engine/src/prefs.rs index 8f6af9c2..019247f6 100644 --- a/crates/engine/src/prefs.rs +++ b/crates/engine/src/prefs.rs @@ -32,6 +32,7 @@ pub const LANGUAGES: &[(&str, &str)] = &[ ("Українська", "uk"), ("Español", "es"), ("Português (Brasil)", "pt-br"), + ("Čeština", "cs"), ]; /// Settings ▸ Appearance ▸ UI Scale: (label, `appearance.uiScale` percent). diff --git a/crates/engine/src/tests_settings.rs b/crates/engine/src/tests_settings.rs index 1a445205..58d0a4a7 100644 --- a/crates/engine/src/tests_settings.rs +++ b/crates/engine/src/tests_settings.rs @@ -615,6 +615,14 @@ fn interface_language_is_validated_persisted_and_backward_compatible() { let mut es = Session { config: Some(store.clone()), ..Default::default() }; es.load_settings(); assert_eq!(es.prefs.general.language, "es"); + // Czech uses the same validation, persistence and JSON round-trip as every catalog. + assert!(crate::prefs::LANGUAGES.contains(&("Čeština", "cs"))); + s.execute("prefs.set", json!({"key": "general.language", "value": "cs"})).unwrap(); + assert_eq!(s.execute("prefs.get", json!({"key": "general.language"})).unwrap(), json!("cs")); + let mut cs = Session { config: Some(store.clone()), ..Default::default() }; + cs.load_settings(); + assert_eq!(cs.prefs.general.language, "cs"); + assert_eq!(Prefs::from_json(r#"{"general":{"language":"cs"}}"#).general.language, "cs"); s.execute("prefs.set", json!({"key": "general.language", "value": "ja"})).unwrap(); let mut reloaded = Session { config: Some(store), ..Default::default() }; reloaded.load_settings(); diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 4bbac2f7..da7c2849 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -11,7 +11,7 @@ use effectcraft_engine::menus::MenuEntry; pub(crate) use ui::{set_current, tr, tr_args}; /// Every language with a catalog, in the order Settings ▸ General ▸ Language lists them. -const CATALOG_CODES: [&str; 6] = ["ja", "zh-hans", "zh-hant", "uk", "es", "pt-br"]; +const CATALOG_CODES: [&str; 7] = ["ja", "zh-hans", "zh-hant", "uk", "es", "pt-br", "cs"]; /// The active interface language: the stored preference when it names a catalog, otherwise `en` /// (English is the source of every label and needs no lookup). @@ -57,6 +57,11 @@ pub(crate) fn brazilian_portuguese(app: &EffectcraftApp) -> bool { language(app) == "pt-br" } +/// The UI is in Czech. +pub(crate) fn czech(app: &EffectcraftApp) -> bool { + language(app) == "cs" +} + /// Settings ▸ General ▸ Language ▸ Match System: the operating system's interface language /// where EffectCraft has it, else English (#229), as After Effects installs in the system's /// language. The browser build stays in English because it has no system-locale probe. @@ -72,7 +77,7 @@ fn system_language() -> &'static str { } /// The language EffectCraft shows for a BCP 47 locale (`ja-JP` → `ja`, `zh-Hans-CN` → `zh-hans`, -/// `zh-TW` → `zh-hant`, `uk-UA` → `uk`, `es-ES` → `es`, `pt-BR` → `pt-br`). +/// `zh-TW` → `zh-hant`, `uk-UA` → `uk`, `es-ES` → `es`, `pt-BR` → `pt-br`, `cs-CZ` → `cs`). fn supported(locale: Option<&str>) -> &'static str { let Some(locale) = locale else { return "en" }; let mut parts = locale.split(['-', '_']); @@ -82,6 +87,7 @@ fn supported(locale: Option<&str>) -> &'static str { "ja" => "ja", "uk" => "uk", "es" => "es", + "cs" => "cs", // The only Portuguese catalog: Brazil's, also for Portugal rather than English. "pt" => "pt-br", "zh" => { @@ -103,6 +109,13 @@ pub(crate) fn label<'a>(app: &EffectcraftApp, command: &str, source: &'a str) -> _ => {} } } + if language == "cs" && matches!(command, "file.revealInFinder" | "layer.revealInFinder") { + match source { + "Reveal in Explorer" => return "Zobrazit v Průzkumníku", + "Reveal in File Manager" => return "Zobrazit ve správci souborů", + _ => {} + } + } match language { "ja" => lookup(JAPANESE, command, source), "zh-hans" => lookup(SIMPLIFIED_CHINESE, command, source), @@ -110,6 +123,7 @@ pub(crate) fn label<'a>(app: &EffectcraftApp, command: &str, source: &'a str) -> "uk" => lookup(UKRAINIAN, command, source), "es" => lookup(SPANISH, command, source), "pt-br" => lookup(PORTUGUESE, command, source), + "cs" => lookup(CZECH, command, source), _ => source, } } @@ -130,6 +144,7 @@ pub(crate) fn entry(app: &EffectcraftApp, e: &MenuEntry, shown: String) -> Strin "uk" => ("Скасувати", "Немає дій для скасування", "Повторити", "Немає дій для повторення"), "es" => ("Deshacer", "No se puede deshacer", "Rehacer", "No se puede rehacer"), "pt-br" => ("Desfazer", "Não há nada para desfazer", "Refazer", "Não há nada para refazer"), + "cs" => ("Zpět", "Není co vrátit", "Znovu", "Není co zopakovat"), _ => return shown, }; match e.command.as_str() { @@ -152,6 +167,17 @@ pub(crate) fn entry(app: &EffectcraftApp, e: &MenuEntry, shown: String) -> Strin pub(crate) fn submenu(app: &EffectcraftApp, source: &str, shown: String) -> String { match language(app) { + "cs" => { + if source == "Assign Shortcut to Workspace" { + if let Some(name) = shown.strip_prefix("Assign Shortcut to “").and_then(|s| s.strip_suffix("” Workspace")) { + return format!("Přiřadit zkratku pracovnímu prostoru „{name}“"); + } + } else if source == "Assign Shortcut to 3D View" + && let Some(name) = shown.strip_prefix("Assign Shortcut to “").and_then(|s| s.strip_suffix('”')) + { + return format!("Přiřadit zkratku 3D zobrazení „{name}“"); + } + } "uk" => { if source == "Assign Shortcut to Workspace" { if let Some(name) = shown.strip_prefix("Assign Shortcut to “").and_then(|s| s.strip_suffix("” Workspace")) { @@ -3965,6 +3991,628 @@ const PORTUGUESE: &[(&str, &str, &str)] = &[ ("file.openDemoProject", "Open Demo Project", "Abrir projeto de demonstração"), ]; +/// Czech (cs): original phrase translations of every fixed menu entry. +const CZECH: &[(&str, &str, &str)] = &[ + ("", "EffectCraft", "EffectCraft"), + ("app.about", "About EffectCraft...", "O aplikaci EffectCraft..."), + ("", "Settings...", "Nastavení..."), + ("app.settings", "General...", "Obecné..."), + ("app.settings", "Startup & Repair...", "Spuštění a oprava..."), + ("app.settings", "Project...", "Projekt..."), + ("app.settings", "Composition...", "Kompozice..."), + ("app.settings", "Previews...", "Náhledy..."), + ("app.settings", "Appearance...", "Vzhled..."), + ("app.settings", "Grids & Guides...", "Mřížky a vodítka..."), + ("app.settings", "Labels...", "Štítky..."), + ("app.settings", "Type...", "Text..."), + ("app.settings", "Import...", "Import..."), + ("app.settings", "Export...", "Export..."), + ("app.settings", "Audio...", "Zvuk..."), + ("app.settings", "Disk...", "Disk..."), + ("app.settings", "Memory & CPU...", "Paměť a CPU..."), + ("app.settings", "Video...", "Video..."), + ("app.settings", "3D...", "3D..."), + ("app.settings", "Scripting & Expressions...", "Skripty a výrazy..."), + ("app.hide", "Hide EffectCraft", "Skrýt EffectCraft"), + ("app.hideOthers", "Hide Others", "Skrýt ostatní"), + ("app.showAll", "Show All", "Zobrazit vše"), + ("app.quit", "Quit EffectCraft", "Ukončit EffectCraft"), + ("", "File", "Soubor"), + ("", "New", "Nový"), + ("file.newProject", "New Project", "Nový projekt"), + ("file.newFromTemplate", "New Project from Template...", "Nový projekt ze šablony..."), + ("project.newFolder", "New Folder", "Nová složka"), + ("file.open", "Open Project...", "Otevřít projekt..."), + ("", "Open Recent", "Otevřít nedávné"), + ("file.clearRecent", "Clear Recent Projects", "Vymazat nedávné projekty"), + ("file.close", "Close", "Zavřít"), + ("file.closeProject", "Close Project", "Zavřít projekt"), + ("file.save", "Save", "Uložit"), + ("", "Save As", "Uložit jako"), + ("file.saveAs", "Save As...", "Uložit jako..."), + ("file.saveCopy", "Save a Copy...", "Uložit kopii..."), + ("file.saveCopyAsXml", "Save a Copy As XML...", "Uložit kopii jako XML..."), + ("templates.saveAs", "Save as Template...", "Uložit jako šablonu..."), + ("file.incrementAndSave", "Increment and Save", "Zvýšit číslo verze a uložit"), + ("file.revert", "Revert", "Vrátit k uložené verzi"), + ("", "Import", "Importovat"), + ("file.import", "File...", "Soubor..."), + ("file.importMultiple", "Multiple Files...", "Více souborů..."), + ("file.importTimeline", "Adobe Premiere Pro Project...", "Projekt Adobe Premiere Pro..."), + ("file.importPlaceholder", "Placeholder...", "Zástupný záznam..."), + ("file.importSolid", "Solid...", "Plná vrstva..."), + ("file.importLottie", "Lottie...", "Lottie..."), + ("file.importVanishingPoint", "Vanishing Point (.vpe)...", "Úběžný bod (.vpe)..."), + ("essential.importTemplate", "Essential Graphics Template...", "Šablona základní grafiky..."), + ("", "Import Recent Footage", "Importovat nedávný záznam"), + ("file.clearRecentFootage", "Clear Recent Footage", "Vymazat nedávné záznamy"), + ("", "Export", "Exportovat"), + ("renderQueue.add", "Add to Render Queue", "Přidat do fronty vykreslování"), + ("file.exportTimeline", "Adobe Premiere Pro Project...", "Projekt Adobe Premiere Pro..."), + ("file.exportLottie", "Lottie JSON...", "Lottie JSON..."), + ("essential.exportTemplate", "Essential Graphics Template...", "Šablona základní grafiky..."), + ("app.find", "Find", "Najít"), + ("layer.addItem", "Add Footage to Comp", "Přidat záznam do kompozice"), + ("file.newCompFromSelection", "New Comp from Selection...", "Nová kompozice z výběru..."), + ("", "Dependencies", "Závislosti"), + ("file.collectFiles", "Collect Files...", "Shromáždit soubory..."), + ("file.consolidateFootage", "Consolidate All Footage", "Sloučit duplicitní záznamy"), + ("file.removeUnusedFootage", "Remove Unused Footage", "Odstranit nepoužité záznamy"), + ("file.reduceProject", "Reduce Project", "Zredukovat projekt"), + ("file.findMissing", "Find Missing Effects", "Najít chybějící efekty"), + ("file.findMissing", "Find Missing Fonts", "Najít chybějící písma"), + ("file.findMissing", "Find Missing Footage", "Najít chybějící záznamy"), + ("file.relinkFootage", "Relink Missing Footage...", "Znovu připojit chybějící záznamy..."), + ("file.watchFolder", "Watch Folder...", "Sledovat složku..."), + ("", "Scripts", "Skripty"), + ("file.installScript", "Install Script File...", "Nainstalovat soubor skriptu..."), + ("file.installScriptUIPanel", "Install ScriptUI Panel...", "Nainstalovat panel ScriptUI..."), + ("file.runScript", "Run Script File...", "Spustit soubor skriptu..."), + ("", "Create Proxy", "Vytvořit zástupný soubor"), + ("file.createProxy", "Still...", "Statický snímek..."), + ("file.createProxy", "Movie...", "Video..."), + ("", "Set Proxy", "Nastavit zástupný soubor"), + ("file.setProxy", "File...", "Soubor..."), + ("file.setProxyNone", "None", "Žádný"), + ("", "Interpret Footage", "Interpretovat záznam"), + ("file.interpretFootage", "Main...", "Hlavní..."), + ("file.interpretProxy", "Proxy...", "Zástupný..."), + ("file.rememberInterpretation", "Remember Interpretation", "Zapamatovat interpretaci"), + ("file.applyInterpretation", "Apply Interpretation", "Použít interpretaci"), + ("", "Replace Footage", "Nahradit záznam"), + ("file.replaceFootage", "File...", "Soubor..."), + ("file.replaceWithPlaceholder", "Placeholder...", "Zástupný záznam..."), + ("file.replaceWithSolid", "Solid...", "Plná vrstva..."), + ("file.replaceWithLayeredComp", "With Layered Comp", "Kompozicí s vrstvami"), + ("file.reloadFootage", "Reload Footage", "Znovu načíst záznam"), + ("file.revealInFinder", "Reveal in Finder", "Zobrazit ve Finderu"), + ("file.projectSettings", "Project Settings...", "Nastavení projektu..."), + ("app.quit", "Exit", "Ukončit"), + ("", "Edit", "Úpravy"), + ("edit.undo", "Undo", "Zpět"), + ("edit.redo", "Redo", "Znovu"), + ("", "History", "Historie"), + ("app.commandPalette", "Quick Apply...", "Rychle použít..."), + ("edit.cut", "Cut", "Vyjmout"), + ("edit.copy", "Copy", "Kopírovat"), + ("edit.copyWithPropertyLinks", "Copy with Property Links", "Kopírovat s odkazy na vlastnosti"), + ("edit.copyWithRelativePropertyLinks", "Copy with Relative Property Links", "Kopírovat s relativními odkazy na vlastnosti"), + ("edit.copyExpressionOnly", "Copy Expression Only", "Kopírovat pouze výraz"), + ("edit.paste", "Paste", "Vložit"), + ("edit.pasteReversedKeyframes", "Paste Reversed Keyframes", "Vložit klíčové snímky v opačném pořadí"), + ("edit.pasteTextMatchFormatting", "Paste Text and Match Formatting", "Vložit text a přizpůsobit formátování"), + ("edit.pasteTextFormattingOnly", "Paste Text Formatting Only", "Vložit pouze formátování textu"), + ("edit.clear", "Clear", "Vymazat"), + ("edit.duplicate", "Duplicate", "Duplikovat"), + ("edit.splitLayer", "Split Layer", "Rozdělit vrstvu"), + ("edit.liftWorkArea", "Lift Work Area", "Vyjmout pracovní oblast bez posunu"), + ("edit.extractWorkArea", "Extract Work Area", "Vyjmout pracovní oblast s posunem"), + ("edit.selectAll", "Select All", "Vybrat vše"), + ("edit.deselectAll", "Deselect All", "Zrušit výběr"), + ("", "Label", "Štítek"), + ("edit.selectLabelGroup", "Select Label Group", "Vybrat skupinu podle štítku"), + ("edit.label", "None", "Žádný"), + ("edit.label", "Red", "Červený"), + ("edit.label", "Yellow", "Žlutý"), + ("edit.label", "Aqua", "Akvamarínový"), + ("edit.label", "Pink", "Růžový"), + ("edit.label", "Lavender", "Levandulový"), + ("edit.label", "Peach", "Broskvový"), + ("edit.label", "Sea Foam", "Mořská pěna"), + ("edit.label", "Blue", "Modrý"), + ("edit.label", "Green", "Zelený"), + ("edit.label", "Purple", "Fialový"), + ("edit.label", "Orange", "Oranžový"), + ("edit.label", "Brown", "Hnědý"), + ("edit.label", "Fuchsia", "Fuchsiový"), + ("edit.label", "Cyan", "Azurový"), + ("edit.label", "Sandstone", "Pískovcový"), + ("edit.label", "Dark Green", "Tmavě zelený"), + ("app.settings", "Edit Label Colors...", "Upravit barvy štítků..."), + ("", "Select Keyframe Label Group", "Vybrat skupinu podle štítku klíčových snímků"), + ("keys.selectLabelGroup", "On Selected Layers", "Na vybraných vrstvách"), + ("keys.selectLabelGroup", "On All Layers", "Na všech vrstvách"), + ("keys.selectLabelGroup", "Visible Keyframes on Selected Layers", "Viditelné klíčové snímky na vybraných vrstvách"), + ("keys.selectLabelGroup", "Visible Keyframes on All Layers", "Viditelné klíčové snímky na všech vrstvách"), + ("", "Purge", "Vyprázdnit"), + ("edit.purge", "All Cache...", "Celou mezipaměť..."), + ("edit.purge", "All Memory & Disk Cache...", "Celou paměťovou a diskovou mezipaměť..."), + ("edit.purge", "All Memory", "Veškerou paměť"), + ("edit.purge", "All Disk Cache...", "Celou diskovou mezipaměť..."), + ("edit.purge", "All 3D Cache...", "Celou 3D mezipaměť..."), + ("edit.purgeUndo", "Undo", "Historii vracení změn"), + ("edit.purge", "Image Cache Memory", "Paměť obrazové mezipaměti"), + ("edit.purge", "Snapshot", "Snímek náhledu"), + ("edit.editOriginal", "Edit Original...", "Upravit originál..."), + ("", "Templates", "Šablony"), + ("app.templates", "Render Settings...", "Nastavení vykreslování..."), + ("app.templates", "Output Module...", "Výstupní modul..."), + ("app.keyboardShortcuts", "Keyboard Shortcuts", "Klávesové zkratky"), + ("", "Preferences", "Předvolby"), + ("", "Composition", "Kompozice"), + ("comp.new", "New Composition...", "Nová kompozice..."), + ("comp.settings", "Composition Settings...", "Nastavení kompozice..."), + ("comp.setPosterTime", "Set Poster Time", "Nastavit čas reprezentativního snímku"), + ("comp.trimToWorkArea", "Trim Comp to Work Area", "Oříznout kompozici na pracovní oblast"), + ("comp.cropToRegionOfInterest", "Crop Comp to Region of Interest", "Oříznout kompozici na oblast zájmu"), + ("comp.cropToLayerBounds", "Crop Comp to Selected Layer(s) Bounds", "Oříznout kompozici na hranice vybrané vrstvy (vrstev)"), + ("render.addOutputModule", "Add Output Module", "Přidat výstupní modul"), + ("", "Preview", "Náhled"), + ("playback.toggle", "Play Current Preview", "Přehrát aktuální náhled"), + ("playback.cacheWhenIdle", "Cache Frames When Idle", "Ukládat snímky do mezipaměti při nečinnosti"), + ("playback.audio", "Audio", "Zvuk"), + ("", "Save Frame As", "Uložit snímek jako"), + ("comp.saveFrameAs", "File...", "Soubor..."), + ("comp.saveFrameAsPsd", "Photoshop Layers...", "Vrstvy Photoshopu..."), + ("comp.saveFrameAsExr", "ProEXR...", "ProEXR..."), + ("render.preRender", "Pre-render...", "Předvykreslit..."), + ("render.saveCurrentPreview", "Save Current Preview...", "Uložit aktuální náhled..."), + ("comp.openInEssentialGraphics", "Open in Essential Graphics", "Otevřít v základní grafice"), + ("", "Responsive Design — Time", "Responzivní návrh — čas"), + ("comp.responsiveTime", "Create Intro", "Vytvořit úvod"), + ("comp.responsiveTime", "Create Outro", "Vytvořit závěr"), + ("comp.responsiveTime", "Create Protected Region from Work Area", "Vytvořit chráněnou oblast z pracovní oblasti"), + ("comp.flowchart", "Composition Flowchart", "Vývojový diagram kompozice"), + ("comp.miniFlowchart", "Composition Mini-Flowchart", "Malý vývojový diagram kompozice"), + ("", "VR", "VR"), + ("comp.vr.createEnvironment", "Create VR Environment...", "Vytvořit prostředí VR..."), + ("comp.vr.extractCubemap", "Extract Cubemap...", "Extrahovat krychlovou mapu..."), + ("", "Layer", "Vrstva"), + ("layer.newText", "Text", "Text"), + ("layer.newSolid", "Solid...", "Plná vrstva..."), + ("layer.newLight", "Light...", "Světlo..."), + ("layer.newCamera", "Camera...", "Kamera..."), + ("layer.newNull", "Null Object", "Prázdný objekt"), + ("layer.newShape", "Shape Layer", "Vrstva tvaru"), + ("layer.newAdjustment", "Adjustment Layer", "Vrstva úprav"), + ("layer.newContentAwareFill", "Content-Aware Fill Layer...", "Vrstva výplně podle obsahu..."), + ("layer.new3dPrimitive", "Cube", "Krychle"), + ("layer.new3dPrimitive", "Sphere", "Koule"), + ("layer.new3dPrimitive", "Plane", "Rovina"), + ("layer.new3dPrimitive", "Torus", "Prstenec"), + ("layer.new3dPrimitive", "Cone", "Kužel"), + ("layer.new3dPrimitive", "Cylinder", "Válec"), + ("layer.settings", "Layer Settings...", "Nastavení vrstvy..."), + ("layer.openLayer", "Open Layer", "Otevřít vrstvu"), + ("layer.openSource", "Open Layer Source", "Otevřít zdroj vrstvy"), + ("layer.revealInFinder", "Reveal in Finder", "Zobrazit ve Finderu"), + ("", "Mask", "Maska"), + ("layer.addMask", "New Mask", "Nová maska"), + ("layer.mask.shape", "Mask Shape...", "Tvar masky..."), + ("layer.mask.set", "Mask Feather...", "Prolnutí okrajů masky..."), + ("layer.mask.set", "Mask Opacity...", "Krytí masky..."), + ("layer.mask.set", "Mask Expansion...", "Rozšíření masky..."), + ("layer.mask.reset", "Reset Mask", "Obnovit masku"), + ("layer.mask.remove", "Remove Mask", "Odstranit masku"), + ("layer.mask.removeAll", "Remove All Masks", "Odstranit všechny masky"), + ("track.mask", "Track Mask", "Sledovat masku"), + ("", "Mode", "Režim"), + ("layer.mask.mode", "None", "Žádný"), + ("layer.mask.mode", "Add", "Přičíst"), + ("layer.mask.mode", "Subtract", "Odečíst"), + ("layer.mask.mode", "Intersect", "Průnik"), + ("layer.mask.mode", "Lighten", "Zesvětlit"), + ("layer.mask.mode", "Darken", "Ztmavit"), + ("layer.mask.mode", "Difference", "Rozdíl"), + ("layer.mask.invert", "Inverted", "Invertovaná"), + ("layer.mask.lock", "Locked", "Zamknutá"), + ("", "Motion Blur", "Rozostření pohybem"), + ("layer.mask.motionBlur", "Same As Layer", "Stejné jako u vrstvy"), + ("layer.mask.motionBlur", "On", "Zapnuto"), + ("layer.mask.motionBlur", "Off", "Vypnuto"), + ("", "Feather Falloff", "Průběh prolnutí okrajů"), + ("layer.mask.featherFalloff", "Smooth", "Plynulý"), + ("layer.mask.featherFalloff", "Linear", "Lineární"), + ("layer.mask.unlockAll", "Unlock All Masks", "Odemknout všechny masky"), + ("layer.mask.lockOthers", "Lock Other Masks", "Zamknout ostatní masky"), + ("layer.mask.hideLocked", "Hide Locked Masks", "Skrýt zamknuté masky"), + ("", "Mask and Shape Path", "Cesta masky a tvaru"), + ("path.rotoBezier", "RotoBezier", "RotoBezier"), + ("mask.setClosed", "Closed", "Uzavřená"), + ("path.convertToBezier", "Convert To Bezier Path", "Převést na Bézierovu cestu"), + ("path.setFirstVertex", "Set First Vertex", "Nastavit první vrchol"), + ("path.freeTransform", "Free Transform Points", "Volně transformovat body"), + ("", "Quality", "Kvalita"), + ("layer.quality", "Best", "Nejlepší"), + ("layer.quality", "Draft", "Pracovní"), + ("layer.quality", "Wireframe", "Drátový model"), + ("layer.sampling", "Bilinear", "Bilineární"), + ("layer.sampling", "Bicubic", "Bikubické"), + ("", "Switches", "Přepínače"), + ("layer.hideOtherVideo", "Hide Other Video", "Skrýt ostatní video"), + ("layer.showAllVideo", "Show All Video", "Zobrazit veškeré video"), + ("layer.unlockAll", "Unlock All Layers", "Odemknout všechny vrstvy"), + ("layer.expressions", "Enable Expressions", "Povolit výrazy"), + ("layer.expressions", "Disable Expressions", "Zakázat výrazy"), + ("layer.setSwitch", "Shy", "Skrýt z časové osy"), + ("layer.setSwitch", "Lock", "Zamknout"), + ("layer.setSwitch", "Audio", "Zvuk"), + ("layer.setSwitch", "Video", "Video"), + ("layer.setSwitch", "Solo", "Sólo"), + ("layer.setSwitch", "Effect", "Efekt"), + ("layer.setSwitch", "Collapse", "Sbalit transformace"), + ("layer.setSwitch", "Motion Blur", "Rozostření pohybem"), + ("layer.setSwitch", "Adjustment Layer", "Vrstva úprav"), + ("", "Transform", "Transformace"), + ("layer.transform", "Reset", "Obnovit"), + ("layer.setTransform", "Anchor Point...", "Kotevní bod..."), + ("layer.setTransform", "Position...", "Pozice..."), + ("layer.setTransform", "Scale...", "Měřítko..."), + ("layer.setTransform", "Orientation...", "Orientace..."), + ("layer.setTransform", "Rotation...", "Otočení..."), + ("layer.setTransform", "Opacity...", "Krytí..."), + ("layer.transform", "Flip Horizontal", "Převrátit vodorovně"), + ("layer.transform", "Flip Vertical", "Převrátit svisle"), + ("layer.transform", "Center In View", "Vystředit v zobrazení"), + ("layer.centerAnchor", "Center Anchor Point in Layer Content", "Vystředit kotevní bod v obsahu vrstvy"), + ("layer.transform", "Fit to Comp", "Přizpůsobit kompozici"), + ("layer.transform", "Fit to Comp Width", "Přizpůsobit šířce kompozice"), + ("layer.transform", "Fit to Comp Height", "Přizpůsobit výšce kompozice"), + ("layer.autoOrient", "Auto-Orient...", "Automaticky orientovat..."), + ("", "Time", "Čas"), + ("layer.enableTimeRemap", "Enable Time Remapping", "Povolit přemapování času"), + ("layer.timeReverse", "Time-Reverse Layer", "Obrátit čas vrstvy"), + ("layer.timeStretch", "Time Stretch...", "Roztažení času..."), + ("layer.freezeFrame", "Freeze Frame", "Zmrazit snímek"), + ("layer.freezeOnLastFrame", "Freeze On Last Frame", "Zmrazit na posledním snímku"), + ("layer.alignVideoToData", "Align Video to Data", "Zarovnat video podle dat"), + ("", "Frame Blending", "Prolnutí snímků"), + ("layer.frameBlending", "Off", "Vypnuto"), + ("layer.frameBlending", "Frame Mix", "Smíchání snímků"), + ("layer.frameBlending", "Pixel Motion", "Pohyb pixelů"), + ("layer.setSwitch", "3D Layer", "3D vrstva"), + ("layer.setSwitch", "Guide Layer", "Pomocná vrstva"), + ("layer.environment", "Environment Layer", "Vrstva prostředí"), + ("", "Markers", "Značky"), + ("layer.addMarker", "Add Marker", "Přidat značku"), + ("layer.updateMarkersFromSource", "Update Markers From Source", "Aktualizovat značky ze zdroje"), + ("layer.markersLock", "Lock Markers", "Zamknout značky"), + ("layer.deleteAllMarkers", "Delete All Markers", "Odstranit všechny značky"), + ("layer.setSwitch", "Preserve Transparency", "Zachovat průhlednost"), + ("", "Blending Mode", "Režim prolnutí"), + ("layer.setBlendMode", "Normal", "Normální"), + ("layer.setBlendMode", "Dissolve", "Rozpustit"), + ("layer.setBlendMode", "Dancing Dissolve", "Tančící rozpuštění"), + ("layer.setBlendMode", "Darken", "Ztmavit"), + ("layer.setBlendMode", "Multiply", "Násobit"), + ("layer.setBlendMode", "Color Burn", "Ztmavit barvy"), + ("layer.setBlendMode", "Classic Color Burn", "Klasické ztmavení barev"), + ("layer.setBlendMode", "Linear Burn", "Lineárně ztmavit"), + ("layer.setBlendMode", "Darker Color", "Tmavší barva"), + ("layer.setBlendMode", "Add", "Přičíst"), + ("layer.setBlendMode", "Lighten", "Zesvětlit"), + ("layer.setBlendMode", "Screen", "Závoj"), + ("layer.setBlendMode", "Color Dodge", "Zesvětlit barvy"), + ("layer.setBlendMode", "Classic Color Dodge", "Klasické zesvětlení barev"), + ("layer.setBlendMode", "Linear Dodge", "Lineárně zesvětlit"), + ("layer.setBlendMode", "Lighter Color", "Světlejší barva"), + ("layer.setBlendMode", "Overlay", "Překrýt"), + ("layer.setBlendMode", "Soft Light", "Měkké světlo"), + ("layer.setBlendMode", "Hard Light", "Tvrdé světlo"), + ("layer.setBlendMode", "Linear Light", "Lineární světlo"), + ("layer.setBlendMode", "Vivid Light", "Jasné světlo"), + ("layer.setBlendMode", "Pin Light", "Kolíkové světlo"), + ("layer.setBlendMode", "Hard Mix", "Tvrdé míchání"), + ("layer.setBlendMode", "Difference", "Rozdíl"), + ("layer.setBlendMode", "Classic Difference", "Klasický rozdíl"), + ("layer.setBlendMode", "Exclusion", "Vyloučit"), + ("layer.setBlendMode", "Subtract", "Odečíst"), + ("layer.setBlendMode", "Divide", "Dělit"), + ("layer.setBlendMode", "Hue", "Odstín"), + ("layer.setBlendMode", "Saturation", "Sytost"), + ("layer.setBlendMode", "Color", "Barva"), + ("layer.setBlendMode", "Luminosity", "Světlost"), + ("layer.setBlendMode", "Stencil Alpha", "Šablona alfa"), + ("layer.setBlendMode", "Stencil Luma", "Šablona jasu"), + ("layer.setBlendMode", "Silhouette Alpha", "Silueta alfa"), + ("layer.setBlendMode", "Silhouette Luma", "Silueta jasu"), + ("layer.setBlendMode", "Alpha Add", "Přičíst alfu"), + ("layer.setBlendMode", "Luminescent Premul", "Luminiscenční přednásobení"), + ("layer.setBlendMode", "Next Blending Mode", "Následující režim prolnutí"), + ("layer.setBlendMode", "Previous Blending Mode", "Předchozí režim prolnutí"), + ("", "Track Matte", "Maska stopy"), + ("layer.trackMatte", "No Track Matte", "Bez masky stopy"), + ("layer.trackMatte", "Alpha Matte", "Alfa maska"), + ("layer.trackMatte", "Alpha Inverted Matte", "Invertovaná alfa maska"), + ("layer.trackMatte", "Luma Matte", "Maska jasu"), + ("layer.trackMatte", "Luma Inverted Matte", "Invertovaná maska jasu"), + ("layer.trackMatte", "Matte with Layer Above", "Maskovat vrstvou výše"), + ("layer.trackMatte", "Matte with Layer Below", "Maskovat vrstvou níže"), + ("", "Layer Styles", "Styly vrstvy"), + ("layer.style.options", "Layer Style Options...", "Možnosti stylu vrstvy..."), + ("layer.style.convertToEditable", "Convert to Editable Styles", "Převést na upravitelné styly"), + ("layer.style.showAll", "Show All", "Zobrazit vše"), + ("layer.style.removeAll", "Remove All", "Odstranit vše"), + ("layer.style.dropShadow", "Drop Shadow", "Vržený stín"), + ("layer.style.innerShadow", "Inner Shadow", "Vnitřní stín"), + ("layer.style.outerGlow", "Outer Glow", "Vnější záře"), + ("layer.style.innerGlow", "Inner Glow", "Vnitřní záře"), + ("layer.style.bevelEmboss", "Bevel and Emboss", "Úkos a reliéf"), + ("layer.style.satin", "Satin", "Satén"), + ("layer.style.colorOverlay", "Color Overlay", "Překrytí barvou"), + ("layer.style.gradientOverlay", "Gradient Overlay", "Překrytí přechodem"), + ("layer.style.stroke", "Stroke", "Tah"), + ("path.groupShapes", "Group Shapes", "Seskupit tvary"), + ("path.ungroupShapes", "Ungroup Shapes", "Zrušit seskupení tvarů"), + ("", "Arrange", "Uspořádat"), + ("layer.arrange", "Bring Layer to Front", "Přenést vrstvu do popředí"), + ("layer.arrange", "Bring Layer Forward", "Posunout vrstvu vpřed"), + ("layer.arrange", "Send Layer Backward", "Posunout vrstvu vzad"), + ("layer.arrange", "Send Layer to Back", "Přenést vrstvu do pozadí"), + ("", "Reveal", "Zobrazit"), + ("layer.revealSource", "Reveal Layer Source in Project", "Zobrazit zdroj vrstvy v projektu"), + ("comp.flowchart", "Reveal Layer in Project Flowchart", "Zobrazit vrstvu ve vývojovém diagramu projektu"), + ("comp.revealInProject", "Reveal Composition in Project", "Zobrazit kompozici v projektu"), + ("layer.revealExpressionErrors", "Reveal Expression Errors", "Zobrazit chyby výrazů"), + ("", "Create", "Vytvořit"), + ("layer.create", "Convert to Editable Text", "Převést na upravitelný text"), + ("layer.create", "Create Shapes from Text", "Vytvořit tvary z textu"), + ("layer.create", "Create Masks from Text", "Vytvořit masky z textu"), + ("layer.create", "Create Shapes from Vector Layer", "Vytvořit tvary z vektorové vrstvy"), + ("layer.create", "Create Keyframes from Data", "Vytvořit klíčové snímky z dat"), + ("layer.create", "Null Controllers for Positional Points", "Prázdné ovladače pro poziční body"), + ("layer.create", "Null Controllers for Path Points", "Prázdné ovladače pro body cesty"), + ("layer.create", "Nulls Following Path Points", "Prázdné objekty sledující body cesty"), + ("layer.create", "Null Tracing Along Path", "Prázdný objekt pohybující se po cestě"), + ("layer.create", "Create 3D Layer Instance", "Vytvořit instanci 3D vrstvy"), + ("", "Camera", "Kamera"), + ("camera.fromView", "Create Camera from 3D View", "Vytvořit kameru z 3D zobrazení"), + ("camera.stereoRig", "Create Stereo 3D Rig", "Vytvořit stereoskopickou 3D sestavu"), + ("camera.orbitNull", "Create Orbit Null", "Vytvořit prázdný objekt pro obíhání"), + ("camera.fromModel", "Create Cameras from 3D Model", "Vytvořit kamery z 3D modelu"), + ("camera.linkFocusToPoi", "Link Focus Distance to Point of Interest", "Propojit vzdálenost zaostření s bodem zájmu"), + ("camera.linkFocusToLayer", "Link Focus Distance to Layer", "Propojit vzdálenost zaostření s vrstvou"), + ("camera.setFocusToLayer", "Set Focus Distance to Layer", "Nastavit vzdálenost zaostření na vrstvu"), + ("layer.cameraSettings", "Camera Settings...", "Nastavení kamery..."), + ("view.reset3DView", "Reset 3D View", "Obnovit 3D zobrazení"), + ("", "Light", "Světlo"), + ("light.fromModel", "Create Lights from 3D Model", "Vytvořit světla z 3D modelu"), + ("light.controlWithCamera", "Control Light with Camera", "Ovládat světlo kamerou"), + ("light.environmentBackground", "Create Environment Light Background Layer", "Vytvořit vrstvu pozadí pro světlo prostředí"), + ("", "Material", "Materiál"), + ("material.revealSource", "Reveal Material Source in Project", "Zobrazit zdroj materiálu v projektu"), + ("material.reset", "Reset Material", "Obnovit materiál"), + ("material.duplicateAssign", "Duplicate and Assign Material", "Duplikovat a přiřadit materiál"), + ("layer.autoTrace", "Auto-trace...", "Automaticky obkreslit..."), + ("layer.precompose", "Pre-compose...", "Předkomponovat..."), + ("layer.sceneEditDetection", "Scene Edit Detection...", "Rozpoznat střihy scén..."), + ("", "Effect", "Efekt"), + ("window.panel", "Effect Controls", "Ovládací prvky efektu"), + ("effect.applyLast", "Last Effect", "Poslední efekt"), + ("effect.removeAll", "Remove All", "Odstranit vše"), + ("effect.manage", "Manage Effects...", "Spravovat efekty..."), + ("effect.plugins.load", "Load Effect Plug-in...", "Načíst zásuvný modul efektu..."), + ("", "Animation", "Animace"), + ("anim.savePreset", "Save Animation Preset...", "Uložit přednastavení animace..."), + ("anim.applyPreset", "Apply Animation Preset...", "Použít přednastavení animace..."), + ("", "Recent Animation Presets", "Nedávná přednastavení animace"), + ("anim.clearRecentPresets", "Clear Recent Presets", "Vymazat nedávná přednastavení"), + ("anim.browsePresets", "Browse Presets...", "Procházet přednastavení..."), + ("", "Text Animation Presets", "Přednastavení animace textu"), + ("layer.applyTextPreset", "Typewriter", "Psací stroj"), + ("layer.applyTextPreset", "Fade Up Characters", "Postupně zobrazit znaky"), + ("layer.applyTextPreset", "Bounce In Words", "Slova s odskokem"), + ("layer.applyTextPreset", "Tracking In", "Zúžit prostrkání"), + ("layer.applyTextPreset", "Scramble", "Promíchat znaky"), + ("layer.applyTextPreset", "Blur In", "Zaostřit text"), + ("layer.applyTextPreset", "Jitter", "Chvění"), + ("layer.applyTextPreset", "Drop In Lines", "Spustit řádky shora"), + ("anim.addKeyframe", "Add Keyframe", "Přidat klíčový snímek"), + ("keys.toggleHold", "Toggle Hold Keyframe", "Přepnout podržení klíčového snímku"), + ("keys.interpolation", "Keyframe Interpolation...", "Interpolace klíčových snímků..."), + ("keys.velocity", "Keyframe Velocity...", "Rychlost klíčového snímku..."), + ("", "Keyframe Assistant", "Pomocník klíčových snímků"), + ("keys.audioToKeyframes", "Convert Audio to Keyframes", "Převést zvuk na klíčové snímky"), + ("prop.convertExpressionToKeyframes", "Convert Expression to Keyframes", "Převést výraz na klíčové snímky"), + ("keys.easyEase", "Easy Ease", "Snadné zpomalení"), + ("keys.easyEaseIn", "Easy Ease In", "Snadné zpomalení na vstupu"), + ("keys.easyEaseOut", "Easy Ease Out", "Snadné zpomalení na výstupu"), + ("keys.exponentialScale", "Exponential Scale", "Exponenciální měřítko"), + ("keys.rpfCameraImport", "RPF Camera Import", "Import kamery RPF"), + ("layer.sequence", "Sequence Layers...", "Seřadit vrstvy za sebe..."), + ("keys.timeReverse", "Time-Reverse Keyframes", "Obrátit čas klíčových snímků"), + ("", "Animate Text", "Animovat text"), + ("layer.enablePerChar3D", "Enable Per-character 3D", "Povolit 3D pro jednotlivé znaky"), + ("layer.addTextAnimator", "Anchor Point", "Kotevní bod"), + ("layer.addTextAnimator", "Position", "Pozice"), + ("layer.addTextAnimator", "Scale", "Měřítko"), + ("layer.addTextAnimator", "Skew", "Zkosení"), + ("layer.addTextAnimator", "Rotation", "Otočení"), + ("layer.addTextAnimator", "Opacity", "Krytí"), + ("layer.addTextAnimator", "All Transform Properties", "Všechny vlastnosti transformace"), + ("", "Fill Color", "Barva výplně"), + ("layer.addTextAnimator", "RGB", "RGB"), + ("layer.addTextAnimator", "Hue", "Odstín"), + ("layer.addTextAnimator", "Saturation", "Sytost"), + ("layer.addTextAnimator", "Brightness", "Jas"), + ("", "Stroke Color", "Barva tahu"), + ("layer.addTextAnimator", "Stroke Width", "Šířka tahu"), + ("layer.addTextAnimator", "Tracking", "Prostrkání"), + ("layer.addTextAnimator", "Line Anchor", "Kotevní bod řádku"), + ("layer.addTextAnimator", "Line Spacing", "Řádkování"), + ("layer.addTextAnimator", "Character Offset", "Posun znaku"), + ("layer.addTextAnimator", "Character Value", "Hodnota znaku"), + ("layer.addTextAnimator", "Blur", "Rozostření"), + ("text.animatorFontAxes", "Variable Font Axes", "Osy variabilního písma"), + ("", "Add Text Selector", "Přidat selektor textu"), + ("text.addSelector", "Range", "Rozsah"), + ("text.addSelector", "Wiggly", "Chvějivý"), + ("text.addSelector", "Expression", "Výraz"), + ("text.removeAllAnimators", "Remove All Text Animators", "Odstranit všechny animátory textu"), + ("prop.setExpression", "Add Expression", "Přidat výraz"), + ("essential.addProperty", "Add Property to Essential Graphics", "Přidat vlastnost do základní grafiky"), + ("prop.separateDimensions", "Separate Dimensions", "Oddělit rozměry"), + ("track.camera", "Track Camera", "Sledovat kameru"), + ("track.warpStabilizer", "Warp Stabilizer VFX", "Stabilizátor deformací VFX"), + ("track.motion", "Track Motion", "Sledovat pohyb"), + ("track.stabilize", "Stabilize Motion", "Stabilizovat pohyb"), + ("track.property", "Track this Property", "Sledovat tuto vlastnost"), + ("anim.reveal", "Reveal Properties with Keyframes", "Zobrazit vlastnosti s klíčovými snímky"), + ("anim.reveal", "Reveal Properties with Animation", "Zobrazit vlastnosti s animací"), + ("anim.reveal", "Reveal All Modified Properties", "Zobrazit všechny změněné vlastnosti"), + ("", "View", "Zobrazení"), + ("view.newViewer", "New Viewer", "Nový prohlížeč"), + ("view.splitLockedViewer", "Split with New Locked Viewer", "Rozdělit s novým zamknutým prohlížečem"), + ("view.zoomIn", "Zoom In", "Přiblížit"), + ("view.zoomOut", "Zoom Out", "Oddálit"), + ("", "Resolution", "Rozlišení"), + ("view.res.full", "Full", "Plné"), + ("view.res.half", "Half", "Poloviční"), + ("view.res.third", "Third", "Třetinové"), + ("view.res.quarter", "Quarter", "Čtvrtinové"), + ("view.res.custom", "Custom...", "Vlastní..."), + ("view.displayColorManagement", "Use Display Color Management", "Použít správu barev monitoru"), + ("", "Simulate Output", "Simulovat výstup"), + ("view.simulateOutput", "No Output Simulation", "Bez simulace výstupu"), + ("view.simulateOutput", "HDTV (Rec. 709)", "HDTV (Rec. 709)"), + ("view.simulateOutput", "SDTV NTSC", "SDTV NTSC"), + ("view.simulateOutput", "SDTV PAL", "SDTV PAL"), + ("view.simulateOutput", "Legacy Macintosh RGB (Gamma 1.8)", "Starší Macintosh RGB (gama 1.8)"), + ("view.simulateOutput", "Internet Standard RGB (sRGB)", "Internetový standard RGB (sRGB)"), + ("view.simulateOutput", "UHDTV (Rec. 2020)", "UHDTV (Rec. 2020)"), + ("view.simulateOutput", "Display P3", "Display P3"), + ("view.simulateOutput", "Linear (1.0 Gamma)", "Lineární (gama 1.0)"), + ("view.customRgb", "My Custom RGB...", "Moje vlastní RGB..."), + ("view.simulateOutput", "Custom...", "Vlastní..."), + ("view.rulers", "Show Rulers", "Zobrazit pravítka"), + ("", "Panel Background Color", "Barva pozadí panelu"), + ("view.panelBackground", "Black", "Černá"), + ("view.panelBackground", "Dark Gray", "Tmavě šedá"), + ("view.panelBackground", "Medium Gray (Default)", "Středně šedá (výchozí)"), + ("view.panelBackground", "Light Gray", "Světle šedá"), + ("view.panelBackground", "White", "Bílá"), + ("view.panelBackground", "Custom", "Vlastní"), + ("view.panelBackground", "Select Custom Background Color...", "Vybrat vlastní barvu pozadí..."), + ("view.guides", "Show Guides", "Zobrazit vodítka"), + ("view.snapToGuides", "Snap to Guides", "Přichytávat k vodítkům"), + ("view.lockGuides", "Lock Guides", "Zamknout vodítka"), + ("view.addGuide", "Add Guide...", "Přidat vodítko..."), + ("view.clearGuides", "Clear Guides", "Vymazat vodítka"), + ("view.importGuides", "Import Guides...", "Importovat vodítka..."), + ("view.exportGuides", "Export Guides...", "Exportovat vodítka..."), + ("view.grid", "Show Grid", "Zobrazit mřížku"), + ("view.snapToGrid", "Snap to Grid", "Přichytávat k mřížce"), + ("view.snapping", "Snapping", "Přichytávání"), + ("view.options", "View Options...", "Možnosti zobrazení..."), + ("view.layerControls", "Show Layer Controls", "Zobrazit ovládací prvky vrstvy"), + ("", "Switch View Layout", "Přepnout rozložení zobrazení"), + ("view.layout", "1 View", "1 zobrazení"), + ("view.layout", "2 Views", "2 zobrazení"), + ("view.layout", "4 Views", "4 zobrazení"), + ("view.shareViewOptions", "Share View Options", "Sdílet možnosti zobrazení"), + ("", "Switch 3D View", "Přepnout 3D zobrazení"), + ("view.3d.activeCamera", "Active Camera", "Aktivní kamera"), + ("view.3d.default", "Default", "Výchozí"), + ("view.3d.front", "Front", "Zepředu"), + ("view.3d.left", "Left", "Zleva"), + ("view.3d.top", "Top", "Shora"), + ("view.3d.back", "Back", "Zezadu"), + ("view.3d.right", "Right", "Zprava"), + ("view.3d.bottom", "Bottom", "Zdola"), + ("view.3d.custom1", "Custom View 1", "Vlastní zobrazení 1"), + ("view.3d.custom2", "Custom View 2", "Vlastní zobrazení 2"), + ("view.3d.custom3", "Custom View 3", "Vlastní zobrazení 3"), + ("", "Assign Shortcut to 3D View", "Přiřadit zkratku 3D zobrazení"), + ("view.3d.last", "Switch to Last 3D View", "Přepnout na poslední 3D zobrazení"), + ("view.lookAtSelected", "Look at Selected Layers", "Zaměřit vybrané vrstvy"), + ("view.lookAtAll", "Look at All Layers", "Zaměřit všechny vrstvy"), + ("time.set", "Go to Time...", "Přejít na čas..."), + ("view.fullScreen", "Enter Full Screen", "Přejít na celou obrazovku"), + ("", "Window", "Okno"), + ("", "Workspace", "Pracovní prostor"), + ("window.workspace", "Default", "Výchozí"), + ("window.workspace", "Review", "Revize"), + ("window.workspace", "Learn", "Výuka"), + ("window.workspace", "Small Screen", "Malá obrazovka"), + ("window.workspace", "Standard", "Standardní"), + ("window.workspace", "All Panels", "Všechny panely"), + ("window.workspace", "Animation", "Animace"), + ("window.workspace", "Color", "Barva"), + ("window.workspace", "Effects", "Efekty"), + ("window.workspace", "Essential Graphics", "Základní grafika"), + ("window.workspace", "Minimal", "Minimální"), + ("window.workspace", "Motion Tracking", "Sledování pohybu"), + ("window.workspace", "Paint", "Malování"), + ("window.workspace", "Text", "Text"), + ("window.workspace", "Undocked Panels", "Odpojené panely"), + ("window.resetWorkspace", "Reset to Saved Layout", "Obnovit uložené rozložení"), + ("window.saveWorkspace", "Save Changes to this Workspace", "Uložit změny tohoto pracovního prostoru"), + ("window.saveWorkspaceAs", "Save as New Workspace...", "Uložit jako nový pracovní prostor..."), + ("window.editWorkspaces", "Edit Workspaces...", "Upravit pracovní prostory..."), + ("", "Assign Shortcut to Workspace", "Přiřadit zkratku pracovnímu prostoru"), + ("window.panel", "Align", "Zarovnání"), + ("window.panel", "Audio", "Zvuk"), + ("window.panel", "Brushes", "Štětce"), + ("window.panel", "Character", "Znak"), + ("window.panel", "Content-Aware Fill", "Výplň podle obsahu"), + ("window.panel", "Effects & Presets", "Efekty a přednastavení"), + ("window.panel", "Essential Graphics", "Základní grafika"), + ("window.panel", "Info", "Informace"), + ("help.inAppTutorials", "Learn", "Výuka"), + ("window.panel", "Lumetri Scopes", "Měřicí přístroje Lumetri"), + ("window.panel", "Mask Interpolation", "Interpolace masek"), + ("window.panel", "Media Browser", "Prohlížeč médií"), + ("window.panel", "Metadata", "Metadata"), + ("window.panel", "Motion Sketch", "Náčrt pohybu"), + ("window.panel", "Paint", "Malování"), + ("window.panel", "Paragraph", "Odstavec"), + ("window.panel", "Preview", "Náhled"), + ("window.panel", "Progress", "Průběh"), + ("window.panel", "Properties", "Vlastnosti"), + ("window.panel", "Script Console", "Konzole skriptů"), + ("window.panel", "Smoother", "Vyhlazení"), + ("window.panel", "Tools", "Nástroje"), + ("window.panel", "Tracker", "Sledování"), + ("window.panel", "Wiggler", "Generátor chvění"), + ("window.panel", "Composition", "Kompozice"), + ("window.panel", "Flowchart", "Vývojový diagram"), + ("window.panel", "Footage", "Záznam"), + ("window.panel", "Layer", "Vrstva"), + ("window.panel", "Project", "Projekt"), + ("window.panel", "Render Queue", "Fronta vykreslování"), + ("window.panel", "Timeline", "Časová osa"), + ("window.panel", "Create Nulls From Paths", "Vytvořit prázdné objekty z cest"), + ("window.panel", "VR Comp Editor", "Editor kompozice VR"), + ("", "Help", "Nápověda"), + ("help.docs", "EffectCraft Help...", "Nápověda k EffectCraft..."), + ("help.docs", "Scripting Help...", "Nápověda ke skriptování..."), + ("help.docs", "Expression Reference...", "Referenční příručka výrazů..."), + ("help.docs", "Effect Reference...", "Referenční příručka efektů..."), + ("anim.browsePresets", "Animation Presets...", "Přednastavení animace..."), + ("app.keyboardShortcuts", "Keyboard Shortcuts...", "Klávesové zkratky..."), + ("help.inAppTutorials", "In-App Tutorials...", "Výukové lekce v aplikaci..."), + ("help.onlineTutorials", "Online Tutorials...", "Výukové lekce online..."), + ("help.systemReport", "System Compatibility Report...", "Zpráva o kompatibilitě systému..."), + ("help.enableLogging", "Enable Logging", "Povolit protokolování"), + ("help.revealLogFile", "Reveal Logging File", "Zobrazit soubor protokolu"), + ("help.discord", "Join the ArtCraft Discord...", "Připojit se na Discord ArtCraft..."), + ("help.reportIssue", "Provide Feedback...", "Poskytnout zpětnou vazbu..."), + ("help.website", "ArtCraft Website", "Web ArtCraft"), + ("help.appPage", "EffectCraft Home Page", "Domovská stránka EffectCraft"), + ("help.github", "EffectCraft on GitHub", "EffectCraft na GitHubu"), + ("file.openDemoProject", "Open Demo Project", "Otevřít ukázkový projekt"), +]; + #[cfg(test)] mod tests { use super::*; @@ -3972,6 +4620,86 @@ mod tests { use serde_json::json; use std::collections::BTreeSet; + #[test] + fn czech_translates_menus_without_changing_bindings_or_user_names() { + let mut app = EffectcraftApp::new(effectcraft_engine::Session::default()); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "en"})).unwrap(); + app.session.prefs.push_recent("File.ecproj"); + let en = crate::native_menu::build(&app); + let state = crate::native_menu::state_key(&app); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "cs"})).unwrap(); + let cs = crate::native_menu::build(&app); + assert_eq!(language(&app), "cs"); + assert!(czech(&app)); + assert_eq!(code("cs"), "cs"); + assert_ne!(state, crate::native_menu::state_key(&app)); + let bindings = |menu: &crate::native_menu::NativeMenu| { + menu.items().into_iter().map(|i| (i.id.clone(), i.command.clone(), i.params.clone(), i.shortcut.clone(), i.enabled, i.checked)).collect::>() + }; + assert_eq!(bindings(&en), bindings(&cs)); + assert!(cs.items().iter().any(|i| i.command == "comp.new" && i.label == "Nová kompozice...")); + assert!(cs.items().iter().any(|i| i.command == "layer.newText" && i.label == "Text")); + assert!(cs.items().iter().any(|i| i.command == "keys.easyEase" && i.label == "Snadné zpomalení")); + assert!(cs.items().iter().any(|i| i.command == "file.openRecent" && i.label == "File.ecproj")); + for (source, translated) in [ + ("File", "Soubor"), + ("Edit", "Úpravy"), + ("Composition", "Kompozice"), + ("Layer", "Vrstva"), + ("Effect", "Efekt"), + ("Animation", "Animace"), + ("View", "Zobrazení"), + ("Window", "Okno"), + ("Help", "Nápověda"), + ] { + assert_eq!(label(&app, "", source), translated); + } + assert_eq!(label(&app, "unknown.command", "Text"), "Text"); + let panel = MenuEntry { label: "Layer".into(), command: "window.panel".into(), params: json!({"panel": "layer"}), shortcut: None }; + assert_eq!(entry(&app, &panel, "Layer: File Čeština".into()), "Vrstva: File Čeština"); + assert_eq!( + submenu(&app, "Assign Shortcut to Workspace", "Assign Shortcut to “File Čeština” Workspace".into()), + "Přiřadit zkratku pracovnímu prostoru „File Čeština“" + ); + assert_eq!(submenu(&app, "Assign Shortcut to 3D View", "Assign Shortcut to “Top”".into()), "Přiřadit zkratku 3D zobrazení „Top“"); + assert_eq!(submenu(&app, "Assign Shortcut to Workspace", "Assign Shortcut to Workspace".into()), "Přiřadit zkratku pracovnímu prostoru"); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "en"})).unwrap(); + assert_eq!(crate::native_menu::build(&app), en); + } + + #[test] + fn czech_undo_redo_keeps_history_labels_verbatim() { + let mut app = EffectcraftApp::new(effectcraft_engine::Session::default()); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "cs"})).unwrap(); + let undo = MenuEntry { label: "Undo".into(), command: "edit.undo".into(), params: json!({}), shortcut: None }; + let redo = MenuEntry { label: "Redo".into(), command: "edit.redo".into(), params: json!({}), shortcut: None }; + assert_eq!(entry(&app, &undo, "Can't Undo".into()), "Není co vrátit"); + assert_eq!(entry(&app, &redo, "Can't Redo".into()), "Není co zopakovat"); + app.session.history.undo.push(("File Čeština".into(), app.session.project.clone())); + app.session.history.redo.push(("Text Čeština".into(), app.session.project.clone())); + assert_eq!(entry(&app, &undo, "Undo File Čeština".into()), "Zpět File Čeština"); + assert_eq!(entry(&app, &redo, "Redo Text Čeština".into()), "Znovu Text Čeština"); + } + + #[test] + fn czech_reveal_labels_follow_the_platform_file_manager() { + let mut app = EffectcraftApp::new(effectcraft_engine::Session::default()); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "cs"})).unwrap(); + for command in ["file.revealInFinder", "layer.revealInFinder"] { + for (source, translated) in [ + ("Reveal in Finder", "Zobrazit ve Finderu"), + ("Reveal in Explorer", "Zobrazit v Průzkumníku"), + ("Reveal in File Manager", "Zobrazit ve správci souborů"), + ] { + let e = MenuEntry { label: source.into(), command: command.into(), params: json!({}), shortcut: None }; + assert_eq!(label(&app, command, source), translated); + assert_eq!(entry(&app, &e, source.into()), translated); + assert_eq!(label(&app, "file.openRecent", source), source); + } + assert_eq!(label(&app, command, "My file.mp4"), "My file.mp4"); + } + } + fn keys(nodes: &[MenuNode], out: &mut BTreeSet<(String, String)>) { for node in nodes { match node { @@ -3999,6 +4727,7 @@ mod tests { let mut ukrainian_keys = BTreeSet::new(); let mut spanish_keys = BTreeSet::new(); let mut portuguese_keys = BTreeSet::new(); + let mut czech_keys = BTreeSet::new(); for (catalog, unique) in [ (JAPANESE, &mut japanese_keys), (SIMPLIFIED_CHINESE, &mut chinese_keys), @@ -4006,6 +4735,7 @@ mod tests { (UKRAINIAN, &mut ukrainian_keys), (SPANISH, &mut spanish_keys), (PORTUGUESE, &mut portuguese_keys), + (CZECH, &mut czech_keys), ] { for (command, en, translated) in catalog { let key = (command.to_string(), en.to_string()); @@ -4032,6 +4762,7 @@ mod tests { assert_eq!(traditional_keys, spanish_keys, "the languages must translate the same entries"); assert_eq!(spanish_keys, portuguese_keys, "the languages must translate the same entries"); assert_eq!(japanese_keys, ukrainian_keys, "the languages must translate the same entries"); + assert_eq!(japanese_keys, czech_keys, "the languages must translate the same entries"); } /// Exercise each engine spelling on every host: a macOS-only run must still catch a @@ -4113,6 +4844,10 @@ mod tests { (Some("es-419"), "es"), (Some("pt-BR"), "pt-br"), (Some("pt_PT.UTF-8"), "pt-br"), + (Some("cs"), "cs"), + (Some("cs-CZ"), "cs"), + (Some("cs_CZ.UTF-8"), "cs"), + (Some("CS_cz.UTF-8"), "cs"), (Some("en-US"), "en"), (Some("jv-ID"), "en"), (Some("de-DE"), "en"), @@ -4126,6 +4861,7 @@ mod tests { assert_eq!(simplified(&app), system_language() == "zh-hans"); assert_eq!(traditional(&app), system_language() == "zh-hant"); assert_eq!(spanish(&app), system_language() == "es"); + assert_eq!(czech(&app), system_language() == "cs"); app.session.execute("prefs.set", json!({"key":"general.language", "value":"ja"})).unwrap(); assert!(japanese(&app)); app.session.execute("prefs.set", json!({"key":"general.language", "value":"zh-hans"})).unwrap(); @@ -4145,7 +4881,9 @@ mod tests { #[test] fn every_translated_entry_keeps_the_english_shape() { - for (code, catalog) in [("zh-hans", SIMPLIFIED_CHINESE), ("zh-hant", TRADITIONAL_CHINESE), ("uk", UKRAINIAN), ("es", SPANISH), ("pt-br", PORTUGUESE)] { + for (code, catalog) in + [("zh-hans", SIMPLIFIED_CHINESE), ("zh-hant", TRADITIONAL_CHINESE), ("uk", UKRAINIAN), ("es", SPANISH), ("pt-br", PORTUGUESE), ("cs", CZECH)] + { for (command, en, translated) in catalog { assert_eq!(en.contains("..."), translated.contains("..."), "{code} {command} / {en}: {translated}"); let brackets = |s: &str| s.chars().filter(|c| *c == '(' || *c == ')').count(); diff --git a/crates/ui-egui/src/i18n/ui.rs b/crates/ui-egui/src/i18n/ui.rs index f7c77905..d4fefc92 100644 --- a/crates/ui-egui/src/i18n/ui.rs +++ b/crates/ui-egui/src/i18n/ui.rs @@ -19,7 +19,7 @@ use std::fmt::Display; use std::sync::OnceLock; thread_local! { - /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk"); "en" until the first + /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk", "cs"); "en" until the first /// frame sets it. static CURRENT: Cell<&'static str> = const { Cell::new("en") }; } @@ -44,11 +44,13 @@ fn catalog(language: &str) -> Option<&'static Index> { static HANS: OnceLock = OnceLock::new(); static HANT: OnceLock = OnceLock::new(); static UK: OnceLock = OnceLock::new(); + static CS: OnceLock = OnceLock::new(); let (index, rows) = match language { "ja" => (&JA, JAPANESE), "zh-hans" => (&HANS, SIMPLIFIED_CHINESE), "zh-hant" => (&HANT, TRADITIONAL_CHINESE), "uk" => (&UK, UKRAINIAN), + "cs" => (&CS, CZECH), _ => return None, }; Some(index.get_or_init(|| rows.iter().copied().collect())) @@ -1990,6 +1992,533 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("⚠ {} is used by:", "⚠ {} використовується в:"), ]; +/// Czech (cs): original translations covering every row in the Chinese panel catalogs. +const CZECH: &[(&str, &str)] = &[ + (" OK ", " OK "), + (" Delete ", " Odstranit "), + (" Open Auto-Save ", " Otevřít automatickou zálohu "), + ("(missing)", "(chybí)"), + ("360 View Orientation", "Orientace zobrazení 360°"), + ("3:2 Pulldown: {}", "Převod 3:2 pulldown: {}"), + ( + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", + "Kompoziční nástroj s otevřeným zdrojovým kódem pro pohyblivou grafiku a vizuální efekty, vyvinutý nezávisle metodou clean-room. Běží nativně na macOS, Windows a Linuxu i v prohlížeči. Patří do rodiny kreativních aplikací ArtCraft.", + ), + ("About EffectCraft", "O aplikaci EffectCraft"), + ("About...", "O aplikaci…"), + ("Active", "Aktivní"), + ("Active Camera", "Aktivní kamera"), + ("Alpha", "Alfa"), + ("Adapt Feature On Every Frame", "Přizpůsobovat sledovaný prvek v každém snímku"), + ("Adaptive Sample Limit:", "Limit adaptivního vzorkování:"), + ("Add Animator", "Přidat animátor"), + ("Add Comment", "Přidat komentář"), + ("Add Formatting", "Přidat formátování"), + ("Add Group", "Přidat skupinu"), + ("Add Mirror", "Přidat zrcadlo"), + ("Add Selected As", "Přidat vybrané jako"), + ("Add a comment", "Přidat komentář"), + ("Add a shape, fill, stroke or path operation", "Přidat tvar, výplň, tah nebo operaci s cestou"), + ("Add to Composition", "Přidat do kompozice"), + ("Add to Favorites", "Přidat do oblíbených"), + ("Add:", "Přidat:"), + ("Adjust Exposure (stops)", "Upravit expozici (v expozičních stupních)"), + ("Adjust composition duration to the time span of the selected layers", "Přizpůsobit délku kompozice časovému rozsahu vybraných vrstev"), + ("Advanced 3D", "Pokročilé 3D"), + ("Align Layers to:", "Zarovnat vrstvy k:"), + ("All six face cameras turn together; the scene is not changed.", "Všech šest kamer snímajících stěny se otáčí společně; scéna se nemění."), + ("Anchor:", "Kotevní bod:"), + ("Aperture", "Clona"), + ("Appearance Mode", "Režim vzhledu"), + ("Appearance Mode: {}", "Režim vzhledu: {}"), + ("Apply Dimensions:", "Použít rozměry:"), + ("Apply Motion To:", "Použít pohyb na:"), + ("Arrange", "Uspořádat"), + ("Assign", "Přiřadit"), + ("Auto", "Automaticky"), + ("Auto-saves", "Automatické zálohy"), + ("Back", "Zpět"), + ("Background Color:", "Barva pozadí:"), + ("Blend Mode:", "Režim prolnutí:"), + ("Blending Mode", "Režim prolnutí"), + ("Blur", "Rozostření"), + ("Blur Level", "Úroveň rozostření"), + ("Boundary", "Hranice"), + ("Browser Storage", "Úložiště prohlížeče"), + ("Browse…", "Procházet…"), + ("Brush Dynamics", "Dynamika štětce"), + ("Caching frames…", "Ukládání snímků do mezipaměti…"), + ("Cancel", "Zrušit"), + ("Casts Shadows", "Vrhat stíny"), + ("Change Renderer…", "Změnit vykreslovací modul…"), + ( + "Changing a shortcut creates a custom preset; the default stays as it is.", + "Změna zkratky vytvoří vlastní přednastavení; výchozí přednastavení zůstane zachované.", + ), + ("Channel", "Kanál"), + ("Channel:", "Kanál:"), + ("Chapter:", "Kapitola:"), + ("Choose...", "Vybrat…"), + ("Classic 3D", "Klasické 3D"), + ("Clear", "Vymazat"), + ("Clear list", "Vymazat seznam"), + ("Click a key to see its commands.", "Kliknutím na klávesu zobrazíte její příkazy."), + ("Click adds a point (½ height = no change)", "Kliknutím přidáte bod (½ výšky = beze změny)"), + ("Click adds a point; drag one off to remove", "Kliknutím přidáte bod; přetažením mimo jej odstraníte"), + ("Click to make this viewer active", "Kliknutím aktivujete tento prohlížeč"), + ("Click to reveal the expression in the timeline", "Kliknutím zobrazíte výraz na časové ose"), + ("Click to show the active composition here", "Kliknutím zde zobrazíte aktivní kompozici"), + ("Click, then click in the Composition panel", "Klikněte sem a poté do panelu Kompozice"), + ("Clone Options", "Možnosti klonování"), + ("Clone Source Overlay:", "Překrytí zdroje klonování:"), + ("Close", "Zavřít"), + ("Close Panel", "Zavřít panel"), + ("Close tutorial", "Zavřít výukovou lekci"), + ("Color", "Barva"), + ("Color Depth: {}", "Barevná hloubka: {}"), + ("Color:", "Barva:"), + ("Colour map", "Barevná mapa"), + ("Columns", "Sloupce"), + ("Comment:", "Komentář:"), + ("Community", "Komunita"), + ("Composition", "Kompozice"), + ("Composition Mini-Flowchart", "Malý vývojový diagram kompozice"), + ("Composition Name:", "Název kompozice:"), + ("Composition Settings ▸ 3D Renderer", "Nastavení kompozice ▸ 3D vykreslovací modul"), + ("Composition Settings…", "Nastavení kompozice…"), + ("Composition marker bin: drag a marker to the time ruler", "Zásobník značek kompozice: přetáhněte značku na časové pravítko"), + ("Cone Angle", "Úhel kužele"), + ("Cone Feather", "Prolnutí okrajů kužele"), + ("Constrain Proportions", "Zachovat proporce"), + ("Continuous (Lock Outgoing to Incoming)", "Spojitá (svázat výstupní tečnu se vstupní)"), + ("Cue Point", "Bod události"), + ("Current Render", "Aktuální vykreslování"), + ("Dark", "Tmavý"), + ("Dark Theme", "Tmavý motiv"), + ("Darker", "Tmavší"), + ("Default Output:", "Výchozí výstup:"), + ("Default: {}", "Výchozí: {}"), + ("Defaults", "Výchozí hodnoty"), + ("Delete", "Odstranit"), + ("Delete Selected Points", "Odstranit vybrané body"), + ("Delete selected project items", "Odstranit vybrané položky projektu"), + ("Delete this template", "Odstranit tuto šablonu"), + ("Depth of Field", "Hloubka ostrosti"), + ("Discord", "Discord"), + ("Distribute Layers:", "Rozmístit vrstvy:"), + ("Don't Recover", "Neobnovovat"), + ("Don't Save", "Neukládat"), + ("Double-click a layer to open it in the Layer panel", "Dvojklikem otevřete vrstvu v panelu Vrstva"), + ("Double-click footage in the Project panel to open it here", "Dvojklikem na záznam v panelu Projekt jej otevřete zde"), + ("Double-click to edit the comment", "Dvojklikem upravíte komentář"), + ("Download", "Stáhnout"), + ( + "Drag properties here from the timeline,\nor use Animation > Add Property to Essential Graphics.", + "Přetáhněte sem vlastnosti z časové osy,\nnebo použijte Animace > Přidat vlastnost do základní grafiky.", + ), + ("Drag to change", "Tažením změníte hodnotu"), + ("Drag to create a guide", "Tažením vytvoříte vodítko"), + ("Drag to slip the source", "Tažením posunete zdroj v čase"), + ("Drop Frame", "Vynechávat čísla snímků"), + ("Duplicate", "Duplikovat"), + ("Duration:", "Délka trvání:"), + ("Edit Gradient…", "Upravit přechod…"), + ("Edit Target: {}", "Upravit cíl: {}"), + ("Edit in the Timeline", "Upravit na časové ose"), + ("EffectCraft didn't quit normally last time.", "EffectCraft nebyl při posledním použití ukončen běžným způsobem."), + ("Effects & Presets options", "Možnosti efektů a přednastavení"), + ("Effects: {}", "Efekty: {}"), + ("Empty folder", "Prázdná složka"), + ("Enable Depth of Field", "Povolit hloubku ostrosti"), + ("Enable Expression", "Povolit výraz"), + ("Enhance", "Vylepšit"), + ("Essential Properties — {}", "Základní vlastnosti — {}"), + ("Event", "Událost"), + ("Export Template…", "Exportovat šablonu…"), + ("Export...", "Exportovat…"), + ("Expression Language Menu", "Nabídka jazyka výrazů"), + ("Expression pick whip: drag onto a property", "Propojovací nástroj výrazů: přetáhněte na vlastnost"), + ("Expression:", "Výraz:"), + ("Eyedropper: click, then click in the Composition panel", "Kapátko: klikněte sem a poté do panelu Kompozice"), + ("Falloff", "Útlum"), + ("Falloff Distance", "Vzdálenost útlumu"), + ("Favorites", "Oblíbené"), + ("Field Render: {}", "Vykreslování půlsnímků: {}"), + ("Figures", "Číslice"), + ("Fill Target", "Cíl výplně"), + ("Finished", "Dokončeno"), + ("Flowchart: {}", "Vývojový diagram: {}"), + ("Focus Distance", "Vzdálenost zaostření"), + ("Follow Feature Rotation and Scale", "Sledovat otočení a měřítko prvku"), + ("Footage: {}", "Záznam: {}"), + ("Format: {}", "Formát: {}"), + ("Frame Aspect Ratio: {}", "Poměr stran snímku: {}"), + ("Frame Blending: {}", "Prolnutí snímků: {}"), + ("Frame Rate:", "Snímková frekvence:"), + ("Frame Render Time {}ms", "Čas vykreslení snímku {}ms"), + ("Frame Target:", "Cílový rámec:"), + ("Freeze", "Zmrazit"), + ("Grab bag", "Mozaika"), + ("Grid", "Mřížka"), + ("Guide Layers: {}", "Pomocné vrstvy: {}"), + ("Guides", "Vodítka"), + ("Height:", "Výška:"), + ("Hide This", "Skrýt toto"), + ("Histogram", "Histogram"), + ("Hold In Place", "Pevný časový bod"), + ("Home", "Domů"), + ("If Confidence is Below", "Pokud je spolehlivost nižší než"), + ("Import", "Importovat"), + ("Import and Add to Composition", "Importovat a přidat do kompozice"), + ("Import...", "Importovat…"), + ("Imported media", "Importovaná média"), + ("Influence:", "Vliv:"), + ("Install from File…", "Nainstalovat ze souboru…"), + ("Intensity", "Intenzita"), + ("Inverted", "Invertovaná"), + ("Join the ArtCraft community on Discord", "Připojit se ke komunitě ArtCraft na Discordu"), + ("Key: {}", "Klávesa: {}"), + ("LEARN", "VÝUKA"), + ("Label", "Štítek"), + ("Label Colors and Names:", "Barvy a názvy štítků:"), + ("Label:", "Štítek:"), + ("Latest auto-save: {}", "Nejnovější automatická záloha: {}"), + ("Layer", "Vrstva"), + ("Layer controls", "Ovládací prvky vrstvy"), + ("Layer {}", "Vrstva {}"), + ("Layer:", "Vrstva:"), + ("Layer: {}", "Vrstva: {}"), + ("Learn", "Výuka"), + ("Leave all attributes in \"{}\"", "Ponechat všechny atributy v „{}“"), + ("Licence: {}", "Licence: {}"), + ("Ligatures", "Ligatury"), + ("Light", "Světlý"), + ("Light Theme", "Světlý motiv"), + ("Light Type", "Typ světla"), + ("Lighter", "Světlejší"), + ("Link Selected Property", "Propojit vybranou vlastnost"), + ("Lock Aspect Ratio to {}", "Zamknout poměr stran na {}"), + ("Lock to Zoom", "Svázat s přiblížením"), + ("Locked: {} — {}", "Zamknuto: {} — {}"), + ("Log:", "Protokol:"), + ("Loop (Trace Path)", "Smyčka (sledovat cestu)"), + ("MIT OR Apache-2.0 • Fonts: Inter, JetBrains Mono (OFL)", "MIT OR Apache-2.0 • Písma: Inter, JetBrains Mono (OFL)"), + ("Magnification ratio popup", "Nabídka míry přiblížení"), + ("Make Comp Size", "Nastavit velikost kompozice"), + ("Masks", "Masky"), + ("Maximize Panel", "Maximalizovat panel"), + ("Media Replacement", "Nahrazení médií"), + ("Mesh:", "Síť:"), + ("Diameter:", "Průměr:"), + ("Method Used: {} Average Error: {} pixels", "Použitá metoda: {} Průměrná chyba: {} px"), + ("Models folder: {}", "Složka modelů: {}"), + ("Modifiers:", "Modifikátory:"), + ("More", "Další"), + ("More ArtCraft apps", "Další aplikace ArtCraft"), + ("More tutorials", "Další výukové lekce"), + ("Motion Blur", "Rozostření pohybem"), + ("Motion Blur: {}", "Rozostření pohybem: {}"), + ("Motion Sketch: drag to record", "Náčrt pohybu: tažením zaznamenáte pohyb"), + ("Move Down", "Posunout dolů"), + ("Move Up", "Posunout nahoru"), + ("Move to Project Root", "Přesunout do kořene projektu"), + ("Name", "Název"), + ("Name:", "Název:"), + ("Navigation", "Navigace"), + ("New", "Nový"), + ("New Comp from Selection", "Nová kompozice z výběru"), + ("New Duration:", "Nová délka trvání:"), + ("New composition name:", "Název nové kompozice:"), + ("New from Render Queue item:", "Nová šablona z položky fronty vykreslování:"), + ("New from Template", "Nový ze šablony"), + ("Next", "Další"), + ("Nice work. Pick another tutorial on the Home screen's Learn tab.", "Hotovo. Vyberte si další lekci na kartě Výuka na domovské obrazovce."), + ( + "No VR environments yet. Create one with Composition ▸ VR ▸ Create VR Environment…", + "Zatím nejsou žádná prostředí VR. Vytvořte je přes Kompozice ▸ VR ▸ Vytvořit prostředí VR…", + ), + ("No audio layer selected", "Není vybrána zvuková vrstva"), + ("No background jobs running", "Na pozadí neběží žádné úlohy"), + ("No composition markers", "Kompozice nemá žádné značky"), + ("No contributor data was built into this copy.", "Tato sestava neobsahuje údaje o přispěvatelích."), + ("No device list from this host; the system default output is used.", "Hostitel neposkytuje seznam zařízení; používá se výchozí systémový výstup."), + ("No layer selected", "Není vybrána vrstva"), + ("No matching effects or presets", "Žádné odpovídající efekty ani přednastavení"), + ("No matching fonts", "Žádná odpovídající písma"), + ("No model credits were built into this copy.", "Tato sestava neobsahuje údaje o použitých modelech."), + ("No nested compositions", "Žádné vnořené kompozice"), + ("No shortcut", "Bez zkratky"), + ("No unlocked layer selected", "Není vybrána odemknutá vrstva"), + ("No video", "Žádné video"), + ("None", "Žádné"), + ("Not applied: tick it in the list to add it.", "Nepoužito: pro přidání položku zaškrtněte v seznamu."), + ("Not assigned", "Nepřiřazeno"), + ("Note: Shadows are only cast from layers with Cast Shadows enabled.", "Poznámka: Stíny vrhají pouze vrstvy s povolenou volbou Vrhat stíny."), + ("Notify", "Upozornit"), + ("OK", "OK"), + ("Offset:", "Posun:"), + ("On ({}) stop:", "Při zastavení ({}):"), + ("One-Node Camera", "Jednouzlová kamera"), + ("Opacity:", "Krytí:"), + ("Open Composition", "Otevřít kompozici"), + ("Open Last Saved Project", "Otevřít poslední uložený projekt"), + ("Open New Composition", "Otevřít novou kompozici"), + ("Open Output", "Otevřít výstup"), + ("Open a composition to build Essential Graphics", "Otevřete kompozici pro sestavení základní grafiky"), + ("Open a composition to see its scopes", "Otevřete kompozici pro zobrazení měřicích přístrojů"), + ("Open a composition to track motion.", "Otevřete kompozici pro sledování pohybu."), + ("Opus Tuning: {}", "Ladění Opus: {}"), + ("Original Duration:", "Původní délka trvání:"), + ("Output Cycle: {}", "Cyklus výstupu: {}"), + ("Output To:", "Výstup do:"), + ("Overlay", "Překrytí"), + ("Parameter Name:", "Název parametru:"), + ("Parent pick whip: drag onto a layer", "Propojovací nástroj nadřazené vrstvy: přetáhněte na vrstvu"), + ("Pixel Aspect Ratio:", "Poměr stran pixelů:"), + ("Playing on Video Preview", "Přehrávání ve videonáhledu"), + ("Post-Render Action: {}", "Akce po vykreslení: {}"), + ("Preserve frame rate when nested or in render queue", "Zachovat snímkovou frekvenci při vnoření nebo ve frontě vykreslování"), + ("Preserve resolution when nested", "Zachovat rozlišení při vnoření"), + ("Preset", "Přednastavení"), + ("Preset:", "Přednastavení:"), + ("Presets", "Přednastavení"), + ("Previous", "Předchozí"), + ("Primary:", "Hlavní kompozice:"), + ("Process Before Match", "Předzpracování před hledáním shody"), + ("Profile: {}", "Profil: {}"), + ( + "Project color depth: click to cycle 8/16/32 bpc, Alt-click for Project Settings", + "Barevná hloubka projektu: kliknutím přepnete 8/16/32 bpc, kliknutím s Alt otevřete Nastavení projektu", + ), + ("Project: {}", "Projekt: {}"), + ("Projects", "Projekty"), + ("Property pick whip: drag onto a property", "Propojovací nástroj vlastností: přetáhněte na vlastnost"), + ("Protected Region", "Chráněná oblast"), + ("Proxy Use: {}", "Použití zástupných souborů: {}"), + ("Push All to Comp", "Přenést vše do kompozice"), + ("RGB", "RGB"), + ("Radius", "Poloměr"), + ("Rate Control: {}", "Řízení datového toku: {}"), + ("Recent", "Nedávné"), + ("Recording", "Záznam pohybu"), + ("Remove", "Odstranit"), + ("Rename", "Přejmenovat"), + ("Render: {} ms • UI {} fps{}", "Vykreslení: {} ms • UI {} fps{}"), + ("Renderer:", "Vykreslovací modul:"), + ("Request Persistent Storage", "Požádat o trvalé úložiště"), + ("Reset", "Obnovit"), + ("Reset Labels", "Obnovit štítky"), + ("Reset Preset", "Obnovit přednastavení"), + ("Reset to Default", "Obnovit výchozí hodnoty"), + ("Reset to Saved Layout", "Obnovit uložené rozložení"), + ("Resolution/Down Sample Factor Popup", "Nabídka rozlišení a míry podvzorkování"), + ("Restore Panel Size", "Obnovit velikost panelu"), + ("Reverse the order", "Obrátit pořadí"), + ("Revert All", "Vrátit všechny změny"), + ("Roman Hanging Punctuation", "Předsazená interpunkce latinky"), + ("Roving:", "Plovoucí v čase:"), + ("Ruler zero point (drag to move, double-click to reset)", "Nulový bod pravítka (tažením posunete, dvojklikem obnovíte)"), + ("Rulers", "Pravítka"), + ("Run", "Spustit"), + ("Sample Format: {}", "Formát vzorků: {}"), + ("Samples Per Frame:", "Vzorků na snímek:"), + ("Save from #{}", "Uložit z #{}"), + ("Saved {}", "Uloženo {}"), + ("Script… (⌘/Ctrl+Enter runs)", "Skript… (⌘/Ctrl+Enter spustí)"), + ("Search commands or shortcuts", "Hledat příkazy nebo zkratky"), + ("Select", "Vybrat"), + ("Select a command to change its shortcut.", "Vyberte příkaz pro změnu jeho zkratky."), + ("Select a layer to see its effects", "Vyberte vrstvu pro zobrazení jejích efektů"), + ("Select a layer to see its properties", "Vyberte vrstvu pro zobrazení jejích vlastností"), + ("({}) Selected Objects", "Vybrané objekty ({})"), + ( + "Select a layer with a mask or shape path (or the path property), or Puppet pins.", + "Vyberte vrstvu s cestou masky či tvaru (nebo vlastnost cesty), případně čepy nástroje Loutka.", + ), + ("Select a text layer", "Vyberte textovou vrstvu"), + ("Select an item in the Project panel", "Vyberte položku v panelu Projekt"), + ("Select animated properties to show them in the Graph Editor", "Vyberte animované vlastnosti pro zobrazení v editoru grafů"), + ( + "Select the leader pin, then Shift-click the pins that should trail it (hair, cloth, tails)", + "Vyberte řídicí čep a potom se Shiftem klikněte na čepy, které jej mají následovat (vlasy, látka, ocasy)", + ), + ("Set Ground Plane and Origin", "Nastavit základní rovinu a počátek"), + ("Set Paint Colors to Black and White (D)", "Nastavit barvy malování na černou a bílou (D)"), + ("Settings", "Nastavení"), + ("Settings Name:", "Název nastavení:"), + ("Shadow Darkness", "Tmavost stínu"), + ("Shadow Diffusion", "Rozptýlení stínu"), + ("Shadows", "Stíny"), + ("Shape…", "Tvar…"), + ("Show", "Zobrazit"), + ("Show Layer Name", "Zobrazit název vrstvy"), + ("Show Source Name", "Zobrazit název zdroje"), + ("Show me", "Ukázat postup"), + ("Show:", "Zobrazit:"), + ("Shutter Angle:", "Úhel závěrky:"), + ("Shutter Phase:", "Fáze závěrky:"), + ("Size", "Velikost"), + ("Skip", "Přeskočit"), + ("Snapping", "Přichytávání"), + ("Snapping options", "Možnosti přichytávání"), + ("Snapshot", "Snímek náhledu"), + ("Solo Supported Properties", "Zobrazit pouze podporované vlastnosti"), + ("Solo Switches: {}", "Přepínače sólo: {}"), + ("Sort", "Seřadit"), + ("Spacing:", "Rozestupy:"), + ("Spatial Interpolation:", "Prostorová interpolace:"), + ("Speed:", "Rychlost:"), + ("Start Timecode:", "Počáteční časový kód:"), + ("Start: {} Duration: {}", "Začátek: {} Délka trvání: {}"), + ("Step {} of {}: {}", "Krok {} z {}: {}"), + ("Stop", "Zastavit"), + ("Stop {} at {}°", "Bod přechodu {} na {}°"), + ("Stored in: {}", "Uloženo v: {}"), + ("Stretch", "Roztažení"), + ("Stretch Factor:", "Koeficient roztažení:"), + ("Stylistic Sets", "Stylistické sady"), + ("Subpixel Positioning", "Subpixelové umístění"), + ("Swap Paint Colors (X)", "Prohodit barvy malování (X)"), + ("Sync with System", "Synchronizovat se systémem"), + ("System Default", "Výchozí systémové"), + ("Table", "Tabulka"), + ("Template name", "Název šablony"), + ("Template: {}\n{}", "Šablona: {}\n{}"), + ("Temporal Interpolation:", "Časová interpolace:"), + ("The Media Browser is not available here (use File ▸ Import)", "Prohlížeč médií zde není k dispozici (použijte Soubor ▸ Importovat)"), + ("The OpenEXR layer shown in red, green, blue and alpha", "Vrstva OpenEXR zobrazená v červeném, zeleném, modrém a alfa kanálu"), + ("The render queue is empty.", "Fronta vykreslování je prázdná."), + ("This ScriptUI panel has closed", "Tento panel ScriptUI byl zavřen"), + ("This change will create a new solid for this layer.", "Tato změna vytvoří pro tuto vrstvu novou plnou vrstvu."), + ("Time", "Čas"), + ("Time Stretch…", "Roztažení času…"), + ("Time:", "Čas:"), + ("Time: {}", "Čas: {}"), + ("Title/Action Safe", "Bezpečné oblasti titulků a akce"), + ("Title/action safe", "Bezpečné oblasti titulků a akce"), + ("Toggle Switches / Modes", "Přepnout přepínače / režimy"), + ("Track Name:", "Název stopy:"), + ( + "Trained models are available in the desktop app; the browser uses the classic engine.", + "Trénované modely jsou dostupné v desktopové aplikaci; prohlížeč používá klasické zpracování.", + ), + ("Transform", "Transformace"), + ("Transparency grid", "Mřížka průhlednosti"), + ("Tutorial complete", "Výuková lekce dokončena"), + ("Two-Node Camera", "Dvouzlová kamera"), + ("Type", "Typ"), + ("Type a command or effect…", "Zadejte příkaz nebo efekt…"), + ("URL:", "URL:"), + ("Undock Panel", "Odpojit panel"), + ("Unfreeze", "Zrušit zmrazení"), + ("Unlink {}", "Odpojit {}"), + ( + "Use this option to place the currently selected layers together into a new intermediate composition.", + "Tato volba vloží aktuálně vybrané vrstvy společně do nové mezilehlé kompozice.", + ), + ("VR Environments", "Prostředí VR"), + ("Value:", "Hodnota:"), + ("Variable Font Axes", "Osy variabilního písma"), + ("Video Codec: {}", "Video kodek: {}"), + ("View:", "Zobrazení:"), + ("Welcome to EffectCraft", "Vítejte v EffectCraft"), + ("Width:", "Šířka:"), + ("You can undo this.", "Tuto akci lze vrátit zpět."), + ("Your changes will be lost if you don't save them.", "Pokud změny neuložíte, budou ztraceny."), + ("Zoom", "Přiblížení"), + ("built-in", "vestavěné"), + ("frames per second", "snímků za sekundu"), + ("template name", "název šablony"), + ("{} contributors · {} commits", "{} přispěvatelů · {} commitů"), + ("{} x {}, {}MB per 8bpc frame", "{} x {}, {}MB na snímek s 8bpc"), + ("{} — coming soon", "{} — již brzy"), + ("{} — double-click to open, {}-click to reveal", "{} — dvojklikem otevřete, kliknutím s {} zobrazíte umístění"), + ("⌘/Ctrl-drag a pin to record its motion", "Tažením čepu s ⌘/Ctrl zaznamenáte jeho pohyb"), + ("▣ {}", "▣ {}"), + ("⚠ {} is used by:", "⚠ {} používají:"), + ("3D Reference Axes", "Referenční osy 3D"), + ("Affect all layers that use this solid", "Ovlivnit všechny vrstvy používající tuto plnou vrstvu"), + ("Choose grid and guide options", "Vybrat možnosti mřížky a vodítek"), + ("Colorize", "Kolorovat"), + ("Custom", "Vlastní"), + ("Custom...", "Vlastní…"), + ("Fit", "Přizpůsobit"), + ("Fit up to 100%", "Přizpůsobit nejvýše do 100 %"), + ("Full", "Plné"), + ("Half", "Poloviční"), + ("Only this layer uses this solid.", "Tuto plnou vrstvu používá pouze tato vrstva."), + ("Proportional Grid", "Proporcionální mřížka"), + ("Quarter", "Čtvrtinové"), + ("Region of Interest", "Oblast zájmu"), + ("Reset Exposure", "Obnovit expozici"), + ("Show Channel and Color Management Settings", "Zobrazit nastavení kanálů a správy barev"), + ("Show Snapshot (hold)", "Zobrazit snímek náhledu (podržet)"), + ("Take Snapshot", "Pořídit snímek náhledu"), + ("Third", "Třetinové"), + ("Toggle Mask and Shape Path Visibility", "Přepnout viditelnost cest masek a tvarů"), + ("Toggle Transparency Grid", "Přepnout mřížku průhlednosti"), + ("16 bits per channel", "16 bitů na kanál"), + ("32 bits per channel (float)", "32 bitů na kanál (plovoucí čárka)"), + ("8 bits per channel", "8 bitů na kanál"), + ("Adaptive Resolution", "Adaptivní rozlišení"), + ("Adobe-style built-in", "Vestavěné ve stylu Adobe"), + ("Blue", "Modrý"), + ("Current Settings", "Aktuální nastavení"), + ("Disable Per-character 3D", "Zakázat 3D pro jednotlivé znaky"), + ("Draft", "Pracovní"), + ("Enable Per-character 3D", "Povolit 3D pro jednotlivé znaky"), + ("Fast Draft", "Rychlé pracovní"), + ("Fast Previews (Draft 3D, Faster Effects)", "Rychlé náhledy (pracovní 3D, rychlejší efekty)"), + ("Green", "Zelený"), + ("Import Image Sequence", "Importovat sekvenci obrázků"), + ("Import PDF / Illustrator File", "Importovat soubor PDF / Illustrator"), + ("Import Photoshop File", "Importovat soubor Photoshop"), + ("Interpret Unlabeled Alpha As", "Interpretovat neoznačenou alfu jako"), + ("Join the ArtCraft Discord", "Připojit se na Discord ArtCraft"), + ("Mercury GPU Acceleration ({})", "GPU akcelerace Mercury ({})"), + ("Mercury Software Only", "Pouze softwarové zpracování Mercury"), + ("OCIO (built-in ACES config)", "OCIO (vestavěná konfigurace ACES)"), + ("Off (Final Quality)", "Vypnuto (finální kvalita)"), + ("OpenGL (compatibility)", "OpenGL (kompatibilita)"), + ("Opus Bitrate: {} kbps", "Datový tok Opus: {} kbps"), + ("RGB Straight", "RGB bez přednásobení"), + ("Red", "Červený"), + ("Tone map", "Mapování tónů"), + ("Use In-Window Menu Bar on macOS", "Použít nabídku v okně na macOS"), + ("Wireframe", "Drátový model"), + ("sRGB IEC61966-2.1 (default)", "sRGB IEC61966-2.1 (výchozí)"), + ("New Project", "Nový projekt"), + ("Open Project…", "Otevřít projekt…"), + ("Templates", "Šablony"), + ("EffectCraft home page", "Domovská stránka EffectCraft"), + ("EffectCraft on GitHub", "EffectCraft na GitHubu"), + ("Motion graphics and visual effects · version {}", "Pohyblivá grafika a vizuální efekty · verze {}"), + ("New Composition", "Nová kompozice"), + ("Open Demo Project", "Otevřít ukázkový projekt"), + ("Import Footage…", "Importovat záznam…"), + ("Filter recent files", "Filtrovat nedávné soubory"), + ("NAME", "NÁZEV"), + ("OPENED", "OTEVŘENO"), + ("SIZE", "VELIKOST"), + ("KIND", "DRUH"), + ("Your recent files will show here", "Zde se zobrazí vaše nedávné soubory"), + ("Create a new project, or open the demo project to look around.", "Vytvořte nový projekt nebo otevřete ukázkový projekt a prozkoumejte aplikaci."), + ("No recent files match the filter", "Filtru neodpovídají žádné nedávné soubory"), + ("Try another name or folder.", "Zkuste jiný název nebo složku."), + ("Just now", "Právě teď"), + ("Yesterday", "Včera"), + ("{} minute ago", "Před {} minutou"), + ("{} minutes ago", "Před {} minutami"), + ("{} hour ago", "Před {} hodinou"), + ("{} hours ago", "Před {} hodinami"), + ("{} day ago", "Před {} dnem"), + ("{} days ago", "Před {} dny"), + ("EffectCraft project", "Projekt EffectCraft"), + ("After Effects project", "Projekt After Effects"), + ("Lottie animation", "Animace Lottie"), + ("Project", "Projekt"), +]; + #[cfg(test)] mod tests { use super::*; @@ -2082,7 +2611,33 @@ mod tests { const UNITS: &[&str] = &[" px", "%", "·", "s", "ms", "°", "fps", " bpc", " mm", " s", " %", " pixels"]; fn catalogs() -> Vec<(&'static str, &'static str)> { - JAPANESE.iter().copied().chain(SIMPLIFIED_CHINESE.iter().copied()).chain(TRADITIONAL_CHINESE.iter().copied()).chain(UKRAINIAN.iter().copied()).collect() + JAPANESE + .iter() + .copied() + .chain(SIMPLIFIED_CHINESE.iter().copied()) + .chain(TRADITIONAL_CHINESE.iter().copied()) + .chain(UKRAINIAN.iter().copied()) + .chain(CZECH.iter().copied()) + .collect() + } + + #[test] + fn czech_panels_translate_and_keep_project_content_and_argument_order() { + set_current("cs"); + assert_eq!(tr("Composition Name:"), "Název kompozice:"); + assert_eq!(tr("Cancel"), "Zrušit"); + assert_eq!(tr("my layer.mp4"), "my layer.mp4"); + assert_eq!(tr_args("Proxy Use: {}", &[&"Best"]), "Použití zástupných souborů: Best"); + assert_eq!(tr_args("Step {} of {}: {}", &[&1, &3, &"Colour"]), "Krok 1 z 3: Colour"); + assert_eq!(tr_args("Template: {}\n{}", &[&"Title", &"My description"]), "Šablona: Title\nMy description"); + assert_eq!(tr_args("Leave all attributes in \"{}\"", &[&"File Čeština"]), "Ponechat všechny atributy v „File Čeština“"); + assert_eq!( + tr_args("{} — double-click to open, {}-click to reveal", &[&"File.ecproj", &"Alt"]), + "File.ecproj — dvojklikem otevřete, kliknutím s Alt zobrazíte umístění" + ); + assert_eq!(tr_args("Proxy Use: {}", &[]), "Použití zástupných souborů: "); + set_current("en"); + assert_eq!(tr("Composition Name:"), "Composition Name:"); } /// A row that translates nothing, repeats a source string, or changes the number of values the @@ -2092,8 +2647,8 @@ mod tests { let hans: Vec<&str> = SIMPLIFIED_CHINESE.iter().map(|(en, _)| *en).collect(); let hant: Vec<&str> = TRADITIONAL_CHINESE.iter().map(|(en, _)| *en).collect(); assert_eq!(hans, hant, "the two Chinese catalogs list different source strings"); - // Japanese and Ukrainian may lag the Chinese catalogs: a missing row falls back to English. - for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN)] { + // Japanese, Ukrainian and Czech may lag the Chinese catalogs: a missing row falls back to English. + for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN), ("Czech", CZECH)] { let extra: Vec<&str> = cat.iter().map(|(en, _)| *en).filter(|en| !hans.contains(en)).collect(); assert!(extra.is_empty(), "the {name} catalog lists source strings the Chinese ones don't: {extra:?}"); } diff --git a/crates/ui-egui/src/native_menu.rs b/crates/ui-egui/src/native_menu.rs index e727b9f9..a29407ad 100644 --- a/crates/ui-egui/src/native_menu.rs +++ b/crates/ui-egui/src/native_menu.rs @@ -196,6 +196,8 @@ pub fn build(app: &EffectcraftApp) -> NativeMenu { "Servicios" } else if crate::i18n::brazilian_portuguese(app) { "Serviços" + } else if crate::i18n::czech(app) { + "Služby" } else { "Services" } @@ -445,6 +447,27 @@ mod tests { assert_eq!(translated, ["Служби", "Приховати EffectCraft", "Приховати решту", "Показати все"]); } + #[test] + fn czech_translates_macos_predefined_items() { + if !cfg!(target_os = "macos") { + return; + } + let mut app = EffectcraftApp::new(effectcraft_engine::Session::default()); + app.session.execute("prefs.set", json!({"key": "general.language", "value": "cs"})).unwrap(); + fn labels(nodes: &[NativeNode], out: &mut Vec) { + for node in nodes { + match node { + NativeNode::Predefined { label, .. } => out.push(label.clone()), + NativeNode::Submenu { children, .. } => labels(children, out), + _ => {} + } + } + } + let mut translated = vec![]; + labels(&build(&app).menus, &mut translated); + assert_eq!(translated, ["Služby", "Skrýt EffectCraft", "Skrýt ostatní", "Zobrazit vše"]); + } + #[test] fn hide_items_are_predefined_on_macos() { let spec = build(&app()); diff --git a/docs/localization-parity.md b/docs/localization-parity.md index ff70ca62..cb3f0903 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -22,7 +22,7 @@ interface; Arabic and Hebrew text *in layers* is supported through its Middle Ea **618** fixed entries. The generated Effect menu (effect names) is deliberately left in English. - **Panels, dialogs, buttons, tooltips:** `crates/ui-egui/src/i18n/ui.rs`, keyed by the English source string, with English fallback. Catalogs exist for Japanese, Simplified and Traditional - Chinese and Ukrainian. + Chinese, Ukrainian and Czech. - **Not translated anywhere yet:** effect names and their ≈ 1,650 parameter names (`crates/effects`), engine-generated text (property names, errors, undo labels), the Home screen's unwrapped literals (#574), Learn tutorials and documentation. @@ -60,12 +60,13 @@ the true percentages are slightly lower. | Korean | `ko` | 0 | — | No Hangul fallback probe: boxes on macOS (#599) | no | none | 9–13 h + review | | Vietnamese | `vi` | 0 | — | Latin with stacked diacritics; untested | no | none (After Effects: none) | 8–12 h + review | -Other languages EffectCraft ships (2): +Other languages EffectCraft ships (3): | Language | Code | UI strings translated | Status | To `full` | |---|---|---|---|---| | Traditional Chinese | `zh-hant` | 1,081 (≈ 28%): menus 618/618, panels 463 | partial | 6–9 h + review | | Ukrainian | `uk` | 1,015 (≈ 26%): menus 618/618, panels 397 | partial | 6–9 h + review | +| Czech | `cs` | 1,114 catalog entries (≈ 29%): menus 618/618, panels 496/496 (current Chinese catalog); added after the measurement above | All existing catalog entries covered; unwrapped UI, effects and engine text still in English; AI-assisted, not yet native-speaker proofread | Remaining strings + independent native review | After Effects also ships Italian and Russian, which EffectCraft does not (8–12 h each).