mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-24 10:09:32 -06:00
i18n: Georgian (ka) interface language
Adds Georgian (ქართული, code ka) to Settings > General > Language, with Match System for ka / ka-GE / ka_GE.UTF-8 locales: - i18n.rs: the menu catalog, the same 628 (command, English label) keys as the other languages, plus the Undo/Redo entries, the workspace and 3D view shortcut submenus, the Reveal labels on Windows and Linux and the macOS Services items. - i18n/ui.rs: GEORGIAN, every row of the Chinese panel catalogs (687), and GEORGIAN_PANELS, 195 rows for text the panels send through tr() that no catalog has yet (form dialogs, drop messages, screen-reader names, context menus, Project and Timeline column headers). The tests hold them to the same rules (unique, same placeholders, used by a converted panel) and keep them from shadowing a Chinese row; prefs_live.rs joins the converted files. - i18n/effects.rs: Georgian names for all 307 effects and 21 categories; the CC series and brand names stay in English. - Properties > Text Animation: the Add Animator and Presets buttons grow with their translated labels (English keeps 116 / 84 px). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5539bb4a95
commit
fb51427ec0
+2
-1
@@ -97,7 +97,7 @@ UI strings translated out of ≈ 3,900 (detail: [localization-parity.md](docs/lo
|
||||
| Korean | none | 0% |
|
||||
| Vietnamese | none | 0% |
|
||||
|
||||
Also shipped: Traditional Chinese (partial, 29%), Ukrainian (partial, 29%), Czech (partial, 29%) and Russian (menus only, 16%). No language has had
|
||||
Also shipped: Traditional Chinese (partial, 29%), Ukrainian (partial, 29%), Czech (partial, 29%), Georgian (partial, 38%; native-speaker reviewed) and Russian (menus only, 16%). No other language has had
|
||||
native-speaker review.
|
||||
|
||||
## Upcoming
|
||||
@@ -131,6 +131,7 @@ Come tell us what matters most to you on [Discord](https://discord.gg/artcraft).
|
||||
follow the shared standard: `docs/parity.md` became `docs/target-app-parity.md`; new
|
||||
`docs/roadmap.md`, `localization-parity.md`, `file-format-parity.md`, `hardware-parity.md`,
|
||||
`ui-parity.md`, `effects-parity.md` and `scripting-parity.md`.
|
||||
- 2026-10-14: Georgian (`ka`): every menu row, every panel-catalog row the Chinese catalogs have plus 195 Georgian-only ones, and the effect names and categories; Match System for `ka` / `ka-GE` / `ka_GE.UTF-8` locales. Reviewed by a native speaker.
|
||||
- 2026-10-10: Spanish (#460) and Brazilian Portuguese (#217) menu translations.
|
||||
- 2026-10-10: Japanese now translates the interface below the menu bar too: `crates/ui-egui/src/i18n/ui.rs` has a Japanese table with the same 396 rows as the Chinese ones (panels, dialogs, buttons and tooltips; the shape test keeps the three catalogs listing the same source strings). Menus were already Japanese.
|
||||
- 2026-10-09: Ukrainian now covers all 396 current panel-catalog strings, including dialogs, buttons and tooltips, alongside its menu translation. The catalog keeps the same source keys and placeholder counts as the Chinese catalogs; missing or engine-generated text still falls back to English.
|
||||
|
||||
@@ -36,6 +36,7 @@ pub const LANGUAGES: &[(&str, &str)] = &[
|
||||
("Français", "fr"),
|
||||
("Deutsch", "de"),
|
||||
("Čeština", "cs"),
|
||||
("ქართული", "ka"),
|
||||
];
|
||||
|
||||
/// Settings ▸ Startup & Repair ▸ Window Graphics: (label, `startup.windowGraphics` value).
|
||||
|
||||
@@ -766,6 +766,12 @@ fn interface_language_is_validated_persisted_and_backward_compatible() {
|
||||
cs.load_settings();
|
||||
assert_eq!(cs.prefs.general.language, "cs");
|
||||
assert_eq!(Prefs::from_json(r#"{"general":{"language":"cs"}}"#).general.language, "cs");
|
||||
// Georgian too.
|
||||
assert!(crate::prefs::LANGUAGES.contains(&("ქართული", "ka")));
|
||||
s.execute("prefs.set", json!({"key": "general.language", "value": "ka"})).unwrap();
|
||||
let mut ka = Session { config: Some(store.clone()), ..Default::default() };
|
||||
ka.load_settings();
|
||||
assert_eq!(ka.prefs.general.language, "ka");
|
||||
s.execute("prefs.set", json!({"key": "general.language", "value": "ja"})).unwrap();
|
||||
let mut reloaded = Session { config: Some(store), ..Default::default() };
|
||||
reloaded.load_settings();
|
||||
|
||||
+734
-5
@@ -13,7 +13,7 @@ use effectcraft_engine::menus::{MenuEntry, MenuNode};
|
||||
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; 10] = ["ja", "zh-hans", "zh-hant", "uk", "es", "pt-br", "ru", "fr", "de", "cs"];
|
||||
const CATALOG_CODES: [&str; 11] = ["ja", "zh-hans", "zh-hant", "uk", "es", "pt-br", "ru", "fr", "de", "cs", "ka"];
|
||||
|
||||
/// 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).
|
||||
@@ -64,6 +64,11 @@ pub(crate) fn czech(app: &EffectcraftApp) -> bool {
|
||||
language(app) == "cs"
|
||||
}
|
||||
|
||||
/// The UI is in Georgian.
|
||||
pub(crate) fn georgian(app: &EffectcraftApp) -> bool {
|
||||
language(app) == "ka"
|
||||
}
|
||||
|
||||
/// 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 follows the locales its page passes in ([`set_system_locales`]).
|
||||
@@ -98,7 +103,8 @@ fn first_supported(tags: &[String]) -> &'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`, `cs-CZ` → `cs`).
|
||||
/// `zh-TW` → `zh-hant`, `uk-UA` → `uk`, `es-ES` → `es`, `pt-BR` → `pt-br`, `cs-CZ` → `cs`,
|
||||
/// `ka-GE` → `ka`).
|
||||
fn supported(locale: Option<&str>) -> &'static str {
|
||||
let Some(locale) = locale else { return "en" };
|
||||
let mut parts = locale.split(['-', '_']);
|
||||
@@ -109,6 +115,7 @@ fn supported(locale: Option<&str>) -> &'static str {
|
||||
"uk" => "uk",
|
||||
"es" => "es",
|
||||
"cs" => "cs",
|
||||
"ka" => "ka",
|
||||
// The only Portuguese catalog: Brazil's, also for Portugal rather than English.
|
||||
"pt" => "pt-br",
|
||||
"zh" => {
|
||||
@@ -137,6 +144,13 @@ pub(crate) fn label<'a>(app: &EffectcraftApp, command: &str, source: &'a str) ->
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if language == "ka" && matches!(command, "file.revealInFinder" | "layer.revealInFinder") {
|
||||
match source {
|
||||
"Reveal in Explorer" => return "Explorer-ში ჩვენება",
|
||||
"Reveal in File Manager" => return "ფაილების მენეჯერში ჩვენება",
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
lookup(language, command, source).unwrap_or(source)
|
||||
}
|
||||
|
||||
@@ -165,6 +179,7 @@ fn lookup(language: &str, command: &str, source: &str) -> Option<&'static str> {
|
||||
"fr" => FRENCH,
|
||||
"de" => GERMAN,
|
||||
"cs" => CZECH,
|
||||
"ka" => GEORGIAN,
|
||||
_ => return None,
|
||||
};
|
||||
catalog.iter().find(|(id, en, _)| *id == command && *en == source).map(|(_, _, translated)| *translated)
|
||||
@@ -190,6 +205,8 @@ pub(crate) fn entry(app: &EffectcraftApp, e: &MenuEntry, shown: String) -> Strin
|
||||
"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"),
|
||||
// A colon before the history's (untranslated) action name: "დაბრუნება: Comp1".
|
||||
"ka" => ("დაბრუნება:", "დაბრუნება შეუძლებელია", "ხელახლა შესრულება:", "ხელახლა შესრულება შეუძლებელია"),
|
||||
_ => return shown,
|
||||
};
|
||||
match e.command.as_str() {
|
||||
@@ -299,6 +316,17 @@ pub(crate) fn submenu(app: &EffectcraftApp, source: &str, shown: String) -> Stri
|
||||
return format!("Atribuir atalho à visualização 3D “{name}”");
|
||||
}
|
||||
}
|
||||
"ka" => {
|
||||
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!("მალსახმობის მინიჭება სამუშაო სივრცისთვის „{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!("მალსახმობის მინიჭება 3D ხედისთვის „{name}“");
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
label(app, "", &shown).into()
|
||||
@@ -6641,6 +6669,641 @@ const CZECH: &[(&str, &str, &str)] = &[
|
||||
("file.openDemoProject", "Open Demo Project", "Otevřít ukázkový projekt"),
|
||||
];
|
||||
|
||||
/// Georgian (ka): the same (command, English label) keys as `JAPANESE`, one entry per fixed menu row.
|
||||
/// Original translations written from the meaning of the English labels, sharing the terminology of
|
||||
/// the other Craft apps' Georgian catalogs (შრე, საკვანძო კადრი, კომპოზიცია, ნიღაბი); commands are
|
||||
/// verbal nouns (შენახვა, გახსნა) and Georgian has no capital letters.
|
||||
const GEORGIAN: &[(&str, &str, &str)] = &[
|
||||
("", "EffectCraft", "EffectCraft"),
|
||||
("app.about", "About EffectCraft...", "EffectCraft-ის შესახებ..."),
|
||||
("", "Settings...", "პარამეტრები..."),
|
||||
("app.settings", "General...", "ზოგადი..."),
|
||||
("app.settings", "Startup & Repair...", "გაშვება და აღდგენა..."),
|
||||
("app.settings", "Project...", "პროექტი..."),
|
||||
("app.settings", "Composition...", "კომპოზიცია..."),
|
||||
("app.settings", "Previews...", "წინასწარი ნახვა..."),
|
||||
("app.settings", "Appearance...", "იერსახე..."),
|
||||
("app.settings", "Grids & Guides...", "ბადე და დამხმარე ხაზები..."),
|
||||
("app.settings", "Labels...", "იარლიყები..."),
|
||||
("app.settings", "Type...", "ტექსტი..."),
|
||||
("app.settings", "Import...", "იმპორტი..."),
|
||||
("app.settings", "Export...", "ექსპორტი..."),
|
||||
("app.settings", "Audio...", "აუდიო..."),
|
||||
("app.settings", "Disk...", "დისკი..."),
|
||||
("app.settings", "Memory & CPU...", "მეხსიერება და CPU..."),
|
||||
("app.settings", "Video...", "ვიდეო..."),
|
||||
("app.settings", "3D...", "3D..."),
|
||||
("app.settings", "Scripting & Expressions...", "სკრიპტები და ექსპრესიები..."),
|
||||
("app.hide", "Hide EffectCraft", "EffectCraft-ის დამალვა"),
|
||||
("app.hideOthers", "Hide Others", "სხვების დამალვა"),
|
||||
("app.showAll", "Show All", "ყველას ჩვენება"),
|
||||
("app.quit", "Quit EffectCraft", "EffectCraft-იდან გასვლა"),
|
||||
("", "File", "ფაილი"),
|
||||
("", "New", "ახალი"),
|
||||
("file.newProject", "New Project", "ახალი პროექტი"),
|
||||
("file.newFromTemplate", "New Project from Template...", "ახალი პროექტი შაბლონიდან..."),
|
||||
("project.newFolder", "New Folder", "ახალი საქაღალდე"),
|
||||
("file.open", "Open Project...", "პროექტის გახსნა..."),
|
||||
("", "Open Recent", "ბოლოს გახსნილი ფაილების გახსნა"),
|
||||
("file.clearRecent", "Clear Recent Projects", "ბოლო პროექტების სიის გასუფთავება"),
|
||||
("file.close", "Close", "დახურვა"),
|
||||
("file.closeProject", "Close Project", "პროექტის დახურვა"),
|
||||
("file.save", "Save", "შენახვა"),
|
||||
("", "Save As", "შენახვა როგორც"),
|
||||
("file.saveAs", "Save As...", "შენახვა როგორც..."),
|
||||
("file.saveCopy", "Save a Copy...", "ასლის შენახვა..."),
|
||||
("file.saveCopyAsXml", "Save a Copy As XML...", "ასლის შენახვა XML-ად..."),
|
||||
("templates.saveAs", "Save as Template...", "შაბლონად შენახვა..."),
|
||||
("file.incrementAndSave", "Increment and Save", "ვერსიის გაზრდით შენახვა"),
|
||||
("file.revert", "Revert", "წინა ვერსიაზე დაბრუნება"),
|
||||
("", "Import", "იმპორტი"),
|
||||
("file.import", "File...", "ფაილი..."),
|
||||
("file.importMultiple", "Multiple Files...", "რამდენიმე ფაილი..."),
|
||||
("file.importTimeline", "Adobe Premiere Pro Project...", "Adobe Premiere Pro-ს პროექტი..."),
|
||||
("file.importProject", "EffectCraft Project...", "EffectCraft-ის პროექტი..."),
|
||||
("file.importPlaceholder", "Placeholder...", "ჩანაცვლების ობიექტი..."),
|
||||
("file.importSolid", "Solid...", "სოლიდი..."),
|
||||
("file.importLottie", "Lottie...", "Lottie..."),
|
||||
("file.importVanishingPoint", "Vanishing Point (.vpe)...", "Vanishing Point (.vpe)..."),
|
||||
("essential.importTemplate", "Essential Graphics Template...", "ძირითადი გრაფიკის შაბლონი..."),
|
||||
("", "Import Recent Footage", "ბოლო ვიდეომასალის იმპორტი"),
|
||||
("file.clearRecentFootage", "Clear Recent Footage", "ბოლო ვიდეომასალის სიის გასუფთავება"),
|
||||
("", "Export", "ექსპორტი"),
|
||||
("renderQueue.add", "Add to Render Queue", "რენდერის რიგში დამატება"),
|
||||
("file.exportTimeline", "Adobe Premiere Pro Project...", "Adobe Premiere Pro-ს პროექტი..."),
|
||||
("file.exportLottie", "Lottie JSON...", "Lottie JSON..."),
|
||||
("essential.exportTemplate", "Essential Graphics Template...", "ძირითადი გრაფიკის შაბლონი..."),
|
||||
("app.find", "Find", "ძებნა"),
|
||||
("layer.addItem", "Add Footage to Comp", "ვიდეომასალის კომპოზიციაში დამატება"),
|
||||
("file.newCompFromSelection", "New Comp from Selection...", "ახალი კომპოზიცია მონიშნულიდან..."),
|
||||
("", "Dependencies", "დამოკიდებულებები"),
|
||||
("file.collectFiles", "Collect Files...", "ფაილების შეგროვება..."),
|
||||
("file.consolidateFootage", "Consolidate All Footage", "მთელი ვიდეომასალის კონსოლიდაცია"),
|
||||
("file.removeUnusedFootage", "Remove Unused Footage", "გამოუყენებელი ვიდეომასალის წაშლა"),
|
||||
("file.reduceProject", "Reduce Project", "პროექტის შემცირება"),
|
||||
("file.findMissing", "Find Missing Effects", "დაკარგული ეფექტების ძებნა"),
|
||||
("file.findMissing", "Find Missing Fonts", "დაკარგული შრიფტების ძებნა"),
|
||||
("file.findMissing", "Find Missing Footage", "დაკარგული ვიდეომასალის ძებნა"),
|
||||
("file.relinkFootage", "Relink Missing Footage...", "დაკარგული ვიდეომასალის ხელახლა დაკავშირება..."),
|
||||
("file.watchFolder", "Watch Folder...", "საქაღალდეზე თვალყურის დევნება..."),
|
||||
("", "Scripts", "სკრიპტები"),
|
||||
("file.installScript", "Install Script File...", "სკრიპტის ფაილის დაყენება..."),
|
||||
("file.installScriptUIPanel", "Install ScriptUI Panel...", "ScriptUI პანელის დაყენება..."),
|
||||
("file.runScript", "Run Script File...", "სკრიპტის ფაილის გაშვება..."),
|
||||
("", "Create Proxy", "პროქსის შექმნა"),
|
||||
("file.createProxy", "Still...", "სტატიკური კადრი..."),
|
||||
("file.createProxy", "Movie...", "ვიდეო..."),
|
||||
("", "Set Proxy", "პროქსის მინიჭება"),
|
||||
("file.setProxy", "File...", "ფაილი..."),
|
||||
("file.setProxyNone", "None", "არცერთი"),
|
||||
("", "Interpret Footage", "ვიდეომასალის ინტერპრეტაცია"),
|
||||
("file.interpretFootage", "Main...", "ძირითადი..."),
|
||||
("file.interpretProxy", "Proxy...", "პროქსი..."),
|
||||
("file.rememberInterpretation", "Remember Interpretation", "ინტერპრეტაციის დამახსოვრება"),
|
||||
("file.applyInterpretation", "Apply Interpretation", "ინტერპრეტაციის გამოყენება"),
|
||||
("", "Replace Footage", "ვიდეომასალის ჩანაცვლება"),
|
||||
("file.replaceFootage", "File...", "ფაილი..."),
|
||||
("file.replaceWithPlaceholder", "Placeholder...", "ჩანაცვლების ობიექტი..."),
|
||||
("file.replaceWithSolid", "Solid...", "სოლიდი..."),
|
||||
("file.replaceWithLayeredComp", "With Layered Comp", "შრეებიანი კომპოზიციით"),
|
||||
("file.reloadFootage", "Reload Footage", "ვიდეომასალის ხელახლა ჩატვირთვა"),
|
||||
("file.revealInFinder", "Reveal in Finder", "Finder-ში ჩვენება"),
|
||||
("file.projectSettings", "Project Settings...", "პროექტის პარამეტრები..."),
|
||||
("app.quit", "Exit", "გასვლა"),
|
||||
("", "Edit", "რედაქტირება"),
|
||||
("edit.undo", "Undo", "დაბრუნება"),
|
||||
("edit.redo", "Redo", "ხელახლა შესრულება"),
|
||||
("", "History", "ისტორია"),
|
||||
("app.commandPalette", "Quick Apply...", "სწრაფი გამოყენება..."),
|
||||
("edit.cut", "Cut", "ამოჭრა"),
|
||||
("edit.copy", "Copy", "კოპირება"),
|
||||
("edit.copyWithPropertyLinks", "Copy with Property Links", "კოპირება თვისებების ბმულებით"),
|
||||
("edit.copyWithRelativePropertyLinks", "Copy with Relative Property Links", "კოპირება თვისებების ფარდობითი ბმულებით"),
|
||||
("edit.copyExpressionOnly", "Copy Expression Only", "მხოლოდ ექსპრესიის კოპირება"),
|
||||
("edit.paste", "Paste", "ჩასმა"),
|
||||
("edit.pasteReversedKeyframes", "Paste Reversed Keyframes", "საკვანძო კადრების შებრუნებული ჩასმა"),
|
||||
("edit.pasteTextMatchFormatting", "Paste Text and Match Formatting", "ტექსტის ჩასმა ფორმატის შეთანხმებით"),
|
||||
("edit.pasteTextFormattingOnly", "Paste Text Formatting Only", "მხოლოდ ტექსტის ფორმატის ჩასმა"),
|
||||
("edit.clear", "Clear", "გასუფთავება"),
|
||||
("edit.duplicate", "Duplicate", "დუბლირება"),
|
||||
("edit.splitLayer", "Split Layer", "შრის დაყოფა"),
|
||||
("edit.liftWorkArea", "Lift Work Area", "სამუშაო არის აწევა"),
|
||||
("edit.extractWorkArea", "Extract Work Area", "სამუშაო არის ამოღება"),
|
||||
("edit.selectAll", "Select All", "ყველაფრის მონიშვნა"),
|
||||
("edit.deselectAll", "Deselect All", "ყველა მონიშვნის მოხსნა"),
|
||||
("", "Label", "იარლიყი"),
|
||||
("edit.selectLabelGroup", "Select Label Group", "იარლიყის ჯგუფის მონიშვნა"),
|
||||
("edit.label", "None", "არცერთი"),
|
||||
("edit.label", "Red", "წითელი"),
|
||||
("edit.label", "Yellow", "ყვითელი"),
|
||||
("edit.label", "Aqua", "ზღვისფერი"),
|
||||
("edit.label", "Pink", "ვარდისფერი"),
|
||||
("edit.label", "Lavender", "ლავანდისფერი"),
|
||||
("edit.label", "Peach", "ატმისფერი"),
|
||||
("edit.label", "Sea Foam", "ზღვის ქაფი"),
|
||||
("edit.label", "Blue", "ლურჯი"),
|
||||
("edit.label", "Green", "მწვანე"),
|
||||
("edit.label", "Purple", "იისფერი"),
|
||||
("edit.label", "Orange", "ნარინჯისფერი"),
|
||||
("edit.label", "Brown", "ყავისფერი"),
|
||||
("edit.label", "Fuchsia", "ფუქსია"),
|
||||
("edit.label", "Cyan", "ცისფერი"),
|
||||
("edit.label", "Sandstone", "ქვიშაქვა"),
|
||||
("edit.label", "Dark Green", "მუქი მწვანე"),
|
||||
("app.settings", "Edit Label Colors...", "იარლიყის ფერების რედაქტირება..."),
|
||||
("", "Select Keyframe Label Group", "საკვანძო კადრების იარლიყის ჯგუფის მონიშვნა"),
|
||||
("keys.selectLabelGroup", "On Selected Layers", "მონიშნულ შრეებზე"),
|
||||
("keys.selectLabelGroup", "On All Layers", "ყველა შრეზე"),
|
||||
("keys.selectLabelGroup", "Visible Keyframes on Selected Layers", "ხილული საკვანძო კადრები მონიშნულ შრეებზე"),
|
||||
("keys.selectLabelGroup", "Visible Keyframes on All Layers", "ხილული საკვანძო კადრები ყველა შრეზე"),
|
||||
("", "Purge", "გაწმენდა"),
|
||||
("edit.purge", "All Cache...", "მთელი ქეში..."),
|
||||
("edit.purge", "All Memory & Disk Cache...", "მთელი მეხსიერება და დისკის ქეში..."),
|
||||
("edit.purge", "All Memory", "მთელი მეხსიერება"),
|
||||
("edit.purge", "All Disk Cache...", "მთელი დისკის ქეში..."),
|
||||
("edit.purge", "All 3D Cache...", "მთელი 3D ქეში..."),
|
||||
("edit.purgeUndo", "Undo", "დაბრუნების ისტორია"),
|
||||
("edit.purge", "Image Cache Memory", "გამოსახულების ქეშის მეხსიერება"),
|
||||
("edit.purge", "Snapshot", "მომენტალური ასლი"),
|
||||
("edit.editOriginal", "Edit Original...", "ორიგინალის რედაქტირება..."),
|
||||
("", "Templates", "შაბლონები"),
|
||||
("app.templates", "Render Settings...", "რენდერის პარამეტრები..."),
|
||||
("app.templates", "Output Module...", "გამოტანის მოდული..."),
|
||||
("app.keyboardShortcuts", "Keyboard Shortcuts", "კლავიატურის მალსახმობები"),
|
||||
("", "Preferences", "პარამეტრები"),
|
||||
("", "Composition", "კომპოზიცია"),
|
||||
("comp.new", "New Composition...", "ახალი კომპოზიცია..."),
|
||||
("comp.settings", "Composition Settings...", "კომპოზიციის პარამეტრები..."),
|
||||
("comp.setPosterTime", "Set Poster Time", "პოსტერის დროის დაყენება"),
|
||||
("comp.trimToWorkArea", "Trim Comp to Work Area", "კომპოზიციის მოკვეთა სამუშაო არემდე"),
|
||||
("comp.cropToRegionOfInterest", "Crop Comp to Region of Interest", "კომპოზიციის ჩამოჭრა ინტერესის არემდე"),
|
||||
("comp.cropToLayerBounds", "Crop Comp to Selected Layer(s) Bounds", "კომპოზიციის ჩამოჭრა მონიშნული შრ(ეებ)ის საზღვრებამდე"),
|
||||
("render.addOutputModule", "Add Output Module", "გამოტანის მოდულის დამატება"),
|
||||
("", "Preview", "წინასწარი ნახვა"),
|
||||
("playback.toggle", "Play Current Preview", "მიმდინარე წინასწარი ნახვის დაკვრა"),
|
||||
("playback.cacheWhenIdle", "Cache Frames When Idle", "კადრების ქეშირება უქმობისას"),
|
||||
("playback.audio", "Audio", "აუდიო"),
|
||||
("", "Save Frame As", "კადრის შენახვა როგორც"),
|
||||
("comp.saveFrameAs", "File...", "ფაილი..."),
|
||||
("comp.saveFrameAsPsd", "Photoshop Layers...", "Photoshop-ის შრეები..."),
|
||||
("comp.saveFrameAsExr", "ProEXR...", "ProEXR..."),
|
||||
("comp.copyFrame", "Copy Frame to Clipboard", "კადრის კოპირება გაცვლის ბუფერში"),
|
||||
("render.preRender", "Pre-render...", "წინასწარი რენდერი..."),
|
||||
("render.saveCurrentPreview", "Save Current Preview...", "მიმდინარე წინასწარი ნახვის შენახვა..."),
|
||||
("comp.openInEssentialGraphics", "Open in Essential Graphics", "ძირითად გრაფიკაში გახსნა"),
|
||||
("", "Responsive Design — Time", "რესპონსიული დიზაინი — დრო"),
|
||||
("comp.responsiveTime", "Create Intro", "შესავლის შექმნა"),
|
||||
("comp.responsiveTime", "Create Outro", "დასასრულის შექმნა"),
|
||||
("comp.responsiveTime", "Create Protected Region from Work Area", "დაცული არის შექმნა სამუშაო არიდან"),
|
||||
("comp.flowchart", "Composition Flowchart", "კომპოზიციის ბლოკ-სქემა"),
|
||||
("comp.miniFlowchart", "Composition Mini-Flowchart", "კომპოზიციის მინი-ბლოკ-სქემა"),
|
||||
("", "VR", "VR"),
|
||||
("comp.vr.createEnvironment", "Create VR Environment...", "VR გარემოს შექმნა..."),
|
||||
("comp.vr.extractCubemap", "Extract Cubemap...", "კუბური რუკის ამოღება..."),
|
||||
("", "Layer", "შრე"),
|
||||
("layer.newText", "Text", "ტექსტი"),
|
||||
("layer.newSolid", "Solid...", "სოლიდი..."),
|
||||
("layer.newLight", "Light...", "სინათლე..."),
|
||||
("layer.newCamera", "Camera...", "კამერა..."),
|
||||
("layer.newNull", "Null Object", "ნულოვანი ობიექტი"),
|
||||
("layer.newShape", "Shape Layer", "ფიგურის შრე"),
|
||||
("layer.newAdjustment", "Adjustment Layer", "კორექციის შრე"),
|
||||
("layer.newContentAwareFill", "Content-Aware Fill Layer...", "შიგთავსის გათვალისწინებით შევსების შრე..."),
|
||||
("layer.new3dPrimitive", "Cube", "კუბი"),
|
||||
("layer.new3dPrimitive", "Sphere", "სფერო"),
|
||||
("layer.new3dPrimitive", "Plane", "სიბრტყე"),
|
||||
("layer.new3dPrimitive", "Torus", "ტორი"),
|
||||
("layer.new3dPrimitive", "Cone", "კონუსი"),
|
||||
("layer.new3dPrimitive", "Cylinder", "ცილინდრი"),
|
||||
("layer.settings", "Layer Settings...", "შრის პარამეტრები..."),
|
||||
("layer.openLayer", "Open Layer", "შრის გახსნა"),
|
||||
("layer.openSource", "Open Layer Source", "შრის წყაროს გახსნა"),
|
||||
("layer.revealInFinder", "Reveal in Finder", "Finder-ში ჩვენება"),
|
||||
("", "Mask", "ნიღაბი"),
|
||||
("layer.addMask", "New Mask", "ახალი ნიღაბი"),
|
||||
("layer.mask.shape", "Mask Shape...", "ნიღბის ფორმა..."),
|
||||
("layer.mask.set", "Mask Feather...", "ნიღბის კიდეების შერბილება..."),
|
||||
("layer.mask.set", "Mask Opacity...", "ნიღბის გაუმჭვირვალობა..."),
|
||||
("layer.mask.set", "Mask Expansion...", "ნიღბის გაფართოება..."),
|
||||
("layer.mask.reset", "Reset Mask", "ნიღბის ჩამოყრა"),
|
||||
("layer.mask.remove", "Remove Mask", "ნიღბის წაშლა"),
|
||||
("layer.mask.removeAll", "Remove All Masks", "ყველა ნიღბის წაშლა"),
|
||||
("track.mask", "Track Mask", "ნიღბის ტრეკინგი"),
|
||||
("", "Mode", "რეჟიმი"),
|
||||
("layer.mask.mode", "None", "არცერთი"),
|
||||
("layer.mask.mode", "Add", "დამატება"),
|
||||
("layer.mask.mode", "Subtract", "გამოკლება"),
|
||||
("layer.mask.mode", "Intersect", "გადაკვეთა"),
|
||||
("layer.mask.mode", "Lighten", "გაღიავება"),
|
||||
("layer.mask.mode", "Darken", "ჩამუქება"),
|
||||
("layer.mask.mode", "Difference", "სხვაობა"),
|
||||
("layer.mask.invert", "Inverted", "შებრუნებული"),
|
||||
("layer.mask.lock", "Locked", "ჩაკეტილი"),
|
||||
("", "Motion Blur", "მოძრაობის გაბუნდოვნება"),
|
||||
("layer.mask.motionBlur", "Same As Layer", "შრის მსგავსად"),
|
||||
("layer.mask.motionBlur", "On", "ჩართული"),
|
||||
("layer.mask.motionBlur", "Off", "გამორთული"),
|
||||
("", "Feather Falloff", "კიდეების შერბილების მილევა"),
|
||||
("layer.mask.featherFalloff", "Smooth", "გლუვი"),
|
||||
("layer.mask.featherFalloff", "Linear", "წრფივი"),
|
||||
("layer.mask.unlockAll", "Unlock All Masks", "ყველა ნიღბის განბლოკვა"),
|
||||
("layer.mask.lockOthers", "Lock Other Masks", "სხვა ნიღბების ჩაკეტვა"),
|
||||
("layer.mask.hideLocked", "Hide Locked Masks", "ჩაკეტილი ნიღბების დამალვა"),
|
||||
("", "Mask and Shape Path", "ნიღაბი და ფიგურის ტრაექტორია"),
|
||||
("path.rotoBezier", "RotoBezier", "RotoBezier"),
|
||||
("mask.setClosed", "Closed", "შეკრული"),
|
||||
("path.convertToBezier", "Convert To Bezier Path", "ბეზიეს ტრაექტორიად გარდაქმნა"),
|
||||
("path.setFirstVertex", "Set First Vertex", "პირველი წვეროს დაყენება"),
|
||||
("path.freeTransform", "Free Transform Points", "წერტილების თავისუფალი გარდაქმნა"),
|
||||
("", "Quality", "ხარისხი"),
|
||||
("layer.quality", "Best", "საუკეთესო"),
|
||||
("layer.quality", "Draft", "მონახაზი"),
|
||||
("layer.quality", "Wireframe", "კარკასი"),
|
||||
("layer.sampling", "Bilinear", "ბიწრფივი"),
|
||||
("layer.sampling", "Bicubic", "ბიკუბური"),
|
||||
("", "Switches", "გადამრთველები"),
|
||||
("layer.hideOtherVideo", "Hide Other Video", "სხვა ვიდეოს დამალვა"),
|
||||
("layer.showAllVideo", "Show All Video", "მთელი ვიდეოს ჩვენება"),
|
||||
("layer.unlockAll", "Unlock All Layers", "ყველა შრის განბლოკვა"),
|
||||
("layer.expressions", "Enable Expressions", "ექსპრესიების ჩართვა"),
|
||||
("layer.expressions", "Disable Expressions", "ექსპრესიების გამორთვა"),
|
||||
("layer.setSwitch", "Shy", "მორცხვი"),
|
||||
("layer.setSwitch", "Lock", "ჩაკეტვა"),
|
||||
("layer.setSwitch", "Audio", "აუდიო"),
|
||||
("layer.setSwitch", "Video", "ვიდეო"),
|
||||
("layer.setSwitch", "Solo", "სოლო"),
|
||||
("layer.setSwitch", "Effect", "ეფექტი"),
|
||||
("layer.setSwitch", "Collapse", "ჩაკეცვა"),
|
||||
("layer.setSwitch", "Motion Blur", "მოძრაობის გაბუნდოვნება"),
|
||||
("layer.setSwitch", "Adjustment Layer", "კორექციის შრე"),
|
||||
("", "Transform", "გარდაქმნა"),
|
||||
("layer.transform", "Reset", "ჩამოყრა"),
|
||||
("layer.setTransform", "Anchor Point...", "საყრდენი წერტილი..."),
|
||||
("layer.setTransform", "Position...", "პოზიცია..."),
|
||||
("layer.setTransform", "Scale...", "მასშტაბი..."),
|
||||
("layer.setTransform", "Orientation...", "ორიენტაცია..."),
|
||||
("layer.setTransform", "Rotation...", "შემობრუნება..."),
|
||||
("layer.setTransform", "Opacity...", "გაუმჭვირვალობა..."),
|
||||
("layer.transform", "Flip Horizontal", "ჰორიზონტალურად არეკვლა"),
|
||||
("layer.transform", "Flip Vertical", "ვერტიკალურად არეკვლა"),
|
||||
("layer.transform", "Center In View", "ხედის ცენტრში მოთავსება"),
|
||||
("layer.centerAnchor", "Center Anchor Point in Layer Content", "საყრდენი წერტილის შრის შიგთავსის ცენტრში მოთავსება"),
|
||||
("layer.transform", "Fit to Comp", "კომპოზიციაში ჩატევა"),
|
||||
("layer.transform", "Fit to Comp Width", "კომპოზიციის სიგანეში ჩატევა"),
|
||||
("layer.transform", "Fit to Comp Height", "კომპოზიციის სიმაღლეში ჩატევა"),
|
||||
("layer.autoOrient", "Auto-Orient...", "ავტოორიენტაცია..."),
|
||||
("", "Time", "დრო"),
|
||||
("layer.enableTimeRemap", "Enable Time Remapping", "დროის გადანაწილების ჩართვა"),
|
||||
("layer.timeReverse", "Time-Reverse Layer", "შრის დროში შებრუნება"),
|
||||
("layer.timeStretch", "Time Stretch...", "დროში გაწელვა..."),
|
||||
("layer.freezeFrame", "Freeze Frame", "კადრის გაყინვა"),
|
||||
("layer.freezeOnLastFrame", "Freeze On Last Frame", "ბოლო კადრზე გაყინვა"),
|
||||
("layer.alignVideoToData", "Align Video to Data", "ვიდეოს მონაცემებთან სწორება"),
|
||||
("", "Frame Blending", "კადრების შერევა"),
|
||||
("layer.frameBlending", "Off", "გამორთული"),
|
||||
("layer.frameBlending", "Frame Mix", "კადრების ნაზავი"),
|
||||
("layer.frameBlending", "Pixel Motion", "პიქსელების მოძრაობა"),
|
||||
("layer.setSwitch", "3D Layer", "3D შრე"),
|
||||
("layer.setSwitch", "Guide Layer", "დამხმარე შრე"),
|
||||
("layer.environment", "Environment Layer", "გარემოს შრე"),
|
||||
("", "Markers", "მარკერები"),
|
||||
("layer.addMarker", "Add Marker", "მარკერის დამატება"),
|
||||
("layer.updateMarkersFromSource", "Update Markers From Source", "მარკერების განახლება წყაროდან"),
|
||||
("layer.markersLock", "Lock Markers", "მარკერების ჩაკეტვა"),
|
||||
("layer.deleteAllMarkers", "Delete All Markers", "ყველა მარკერის წაშლა"),
|
||||
("layer.setSwitch", "Preserve Transparency", "გამჭვირვალობის შენარჩუნება"),
|
||||
("", "Blending Mode", "შერევის რეჟიმი"),
|
||||
("layer.setBlendMode", "Normal", "ჩვეულებრივი"),
|
||||
("layer.setBlendMode", "Dissolve", "გაფანტვა"),
|
||||
("layer.setBlendMode", "Dancing Dissolve", "მოცეკვავე გაფანტვა"),
|
||||
("layer.setBlendMode", "Darken", "ჩამუქება"),
|
||||
("layer.setBlendMode", "Multiply", "გამრავლება"),
|
||||
("layer.setBlendMode", "Color Burn", "ფერით ჩამუქება"),
|
||||
("layer.setBlendMode", "Classic Color Burn", "კლასიკური ფერით ჩამუქება"),
|
||||
("layer.setBlendMode", "Linear Burn", "წრფივი ჩამუქება"),
|
||||
("layer.setBlendMode", "Darker Color", "უფრო მუქი ფერი"),
|
||||
("layer.setBlendMode", "Add", "დამატება"),
|
||||
("layer.setBlendMode", "Lighten", "გაღიავება"),
|
||||
("layer.setBlendMode", "Screen", "ეკრანი"),
|
||||
("layer.setBlendMode", "Color Dodge", "ფერით გაღიავება"),
|
||||
("layer.setBlendMode", "Classic Color Dodge", "კლასიკური ფერით გაღიავება"),
|
||||
("layer.setBlendMode", "Linear Dodge", "წრფივი გაღიავება"),
|
||||
("layer.setBlendMode", "Lighter Color", "უფრო ღია ფერი"),
|
||||
("layer.setBlendMode", "Overlay", "გადაფარვა"),
|
||||
("layer.setBlendMode", "Soft Light", "რბილი სინათლე"),
|
||||
("layer.setBlendMode", "Hard Light", "მკვეთრი სინათლე"),
|
||||
("layer.setBlendMode", "Linear Light", "წრფივი სინათლე"),
|
||||
("layer.setBlendMode", "Vivid Light", "კაშკაშა სინათლე"),
|
||||
("layer.setBlendMode", "Pin Light", "წერტილოვანი სინათლე"),
|
||||
("layer.setBlendMode", "Hard Mix", "მკვეთრი შერევა"),
|
||||
("layer.setBlendMode", "Difference", "სხვაობა"),
|
||||
("layer.setBlendMode", "Classic Difference", "კლასიკური სხვაობა"),
|
||||
("layer.setBlendMode", "Exclusion", "გამორიცხვა"),
|
||||
("layer.setBlendMode", "Subtract", "გამოკლება"),
|
||||
("layer.setBlendMode", "Divide", "გაყოფა"),
|
||||
("layer.setBlendMode", "Hue", "ფერის ტონი"),
|
||||
("layer.setBlendMode", "Saturation", "გაჯერება"),
|
||||
("layer.setBlendMode", "Color", "ფერი"),
|
||||
("layer.setBlendMode", "Luminosity", "ნათება"),
|
||||
("layer.setBlendMode", "Stencil Alpha", "ალფა-ტრაფარეტი"),
|
||||
("layer.setBlendMode", "Stencil Luma", "ლუმა-ტრაფარეტი"),
|
||||
("layer.setBlendMode", "Silhouette Alpha", "ალფა-სილუეტი"),
|
||||
("layer.setBlendMode", "Silhouette Luma", "ლუმა-სილუეტი"),
|
||||
("layer.setBlendMode", "Alpha Add", "ალფას დამატება"),
|
||||
("layer.setBlendMode", "Luminescent Premul", "მანათობელი წინასწარ გამრავლებული"),
|
||||
("layer.setBlendMode", "Next Blending Mode", "შემდეგი შერევის რეჟიმი"),
|
||||
("layer.setBlendMode", "Previous Blending Mode", "წინა შერევის რეჟიმი"),
|
||||
("", "Track Matte", "ტრეკ-მატი"),
|
||||
("layer.trackMatte", "No Track Matte", "ტრეკ-მატის გარეშე"),
|
||||
("layer.trackMatte", "Alpha Matte", "ალფა-მატი"),
|
||||
("layer.trackMatte", "Alpha Inverted Matte", "შებრუნებული ალფა-მატი"),
|
||||
("layer.trackMatte", "Luma Matte", "ლუმა-მატი"),
|
||||
("layer.trackMatte", "Luma Inverted Matte", "შებრუნებული ლუმა-მატი"),
|
||||
("layer.trackMatte", "Matte with Layer Above", "მატი ზედა შრით"),
|
||||
("layer.trackMatte", "Matte with Layer Below", "მატი ქვედა შრით"),
|
||||
("", "Layer Styles", "შრის სტილები"),
|
||||
("layer.style.options", "Layer Style Options...", "შრის სტილის პარამეტრები..."),
|
||||
("layer.style.convertToEditable", "Convert to Editable Styles", "რედაქტირებად სტილებად გარდაქმნა"),
|
||||
("layer.style.showAll", "Show All", "ყველას ჩვენება"),
|
||||
("layer.style.removeAll", "Remove All", "ყველას წაშლა"),
|
||||
("layer.style.dropShadow", "Drop Shadow", "ჩრდილი"),
|
||||
("layer.style.innerShadow", "Inner Shadow", "შიდა ჩრდილი"),
|
||||
("layer.style.outerGlow", "Outer Glow", "გარე ნათება"),
|
||||
("layer.style.innerGlow", "Inner Glow", "შიდა ნათება"),
|
||||
("layer.style.bevelEmboss", "Bevel and Emboss", "ფასკა და რელიეფი"),
|
||||
("layer.style.satin", "Satin", "ატლასი"),
|
||||
("layer.style.colorOverlay", "Color Overlay", "ფერის გადაფარვა"),
|
||||
("layer.style.gradientOverlay", "Gradient Overlay", "გრადიენტის გადაფარვა"),
|
||||
("layer.style.stroke", "Stroke", "კონტური"),
|
||||
("path.groupShapes", "Group Shapes", "ფიგურების დაჯგუფება"),
|
||||
("path.ungroupShapes", "Ungroup Shapes", "ფიგურების დაჯგუფების მოხსნა"),
|
||||
("", "Arrange", "დალაგება"),
|
||||
("layer.arrange", "Bring Layer to Front", "შრის წინა პლანზე გადმოტანა"),
|
||||
("layer.arrange", "Bring Layer Forward", "შრის წინ გადმოტანა"),
|
||||
("layer.arrange", "Send Layer Backward", "შრის უკან გადატანა"),
|
||||
("layer.arrange", "Send Layer to Back", "შრის უკანა პლანზე გადატანა"),
|
||||
("", "Reveal", "ჩვენება"),
|
||||
("layer.revealSource", "Reveal Layer Source in Project", "შრის წყაროს ჩვენება პროექტში"),
|
||||
("comp.flowchart", "Reveal Layer in Project Flowchart", "შრის ჩვენება პროექტის ბლოკ-სქემაში"),
|
||||
("comp.revealInProject", "Reveal Composition in Project", "კომპოზიციის ჩვენება პროექტში"),
|
||||
("layer.revealExpressionErrors", "Reveal Expression Errors", "ექსპრესიის შეცდომების ჩვენება"),
|
||||
("", "Create", "შექმნა"),
|
||||
("layer.create", "Convert to Editable Text", "რედაქტირებად ტექსტად გარდაქმნა"),
|
||||
("layer.create", "Create Shapes from Text", "ფიგურების შექმნა ტექსტიდან"),
|
||||
("layer.create", "Create Masks from Text", "ნიღბების შექმნა ტექსტიდან"),
|
||||
("layer.create", "Create Shapes from Vector Layer", "ფიგურების შექმნა ვექტორული შრიდან"),
|
||||
("layer.create", "Create Keyframes from Data", "საკვანძო კადრების შექმნა მონაცემებიდან"),
|
||||
("layer.create", "Null Controllers for Positional Points", "ნულოვანი მართვის ობიექტები პოზიციის წერტილებისთვის"),
|
||||
("layer.create", "Null Controllers for Path Points", "ნულოვანი მართვის ობიექტები ტრაექტორიის წერტილებისთვის"),
|
||||
("layer.create", "Nulls Following Path Points", "ტრაექტორიის წერტილებს მიმყოლი ნულოვანი ობიექტები"),
|
||||
("layer.create", "Null Tracing Along Path", "ტრაექტორიის გასწვრივ მოძრავი ნულოვანი ობიექტი"),
|
||||
("layer.create", "Create 3D Layer Instance", "3D შრის ეგზემპლარის შექმნა"),
|
||||
("", "Camera", "კამერა"),
|
||||
("camera.fromView", "Create Camera from 3D View", "კამერის შექმნა 3D ხედიდან"),
|
||||
("camera.stereoRig", "Create Stereo 3D Rig", "სტერეო 3D სისტემის შექმნა"),
|
||||
("camera.orbitNull", "Create Orbit Null", "ორბიტის ნულოვანი ობიექტის შექმნა"),
|
||||
("camera.fromModel", "Create Cameras from 3D Model", "კამერების შექმნა 3D მოდელიდან"),
|
||||
("camera.linkFocusToPoi", "Link Focus Distance to Point of Interest", "ფოკუსური მანძილის მიბმა ინტერესის წერტილზე"),
|
||||
("camera.linkFocusToLayer", "Link Focus Distance to Layer", "ფოკუსური მანძილის მიბმა შრეზე"),
|
||||
("camera.setFocusToLayer", "Set Focus Distance to Layer", "ფოკუსური მანძილის დაყენება შრეზე"),
|
||||
("layer.cameraSettings", "Camera Settings...", "კამერის პარამეტრები..."),
|
||||
("view.reset3DView", "Reset 3D View", "3D ხედის ჩამოყრა"),
|
||||
("", "Light", "სინათლე"),
|
||||
("light.fromModel", "Create Lights from 3D Model", "სინათლის წყაროების შექმნა 3D მოდელიდან"),
|
||||
("light.controlWithCamera", "Control Light with Camera", "სინათლის მართვა კამერით"),
|
||||
("light.environmentBackground", "Create Environment Light Background Layer", "გარემოს სინათლის ფონური შრის შექმნა"),
|
||||
("", "Material", "მასალა"),
|
||||
("material.revealSource", "Reveal Material Source in Project", "მასალის წყაროს ჩვენება პროექტში"),
|
||||
("material.reset", "Reset Material", "მასალის ჩამოყრა"),
|
||||
("material.duplicateAssign", "Duplicate and Assign Material", "მასალის დუბლირება და მინიჭება"),
|
||||
("layer.autoTrace", "Auto-trace...", "ავტომატური ვექტორიზაცია..."),
|
||||
("layer.precompose", "Pre-compose...", "კომპოზიციაში მოთავსება..."),
|
||||
("layer.sceneEditDetection", "Scene Edit Detection...", "სცენების ჭრილების ამოცნობა..."),
|
||||
("", "Effect", "ეფექტი"),
|
||||
("window.panel", "Effect Controls", "ეფექტის მართვა"),
|
||||
("effect.applyLast", "Last Effect", "ბოლო ეფექტი"),
|
||||
("effect.removeAll", "Remove All", "ყველას წაშლა"),
|
||||
("effect.manage", "Manage Effects...", "ეფექტების მართვა..."),
|
||||
("effect.plugins.load", "Load Effect Plug-in...", "ეფექტის პლაგინის ჩატვირთვა..."),
|
||||
("", "Animation", "ანიმაცია"),
|
||||
("anim.savePreset", "Save Animation Preset...", "ანიმაციის პრესეტის შენახვა..."),
|
||||
("anim.applyPreset", "Apply Animation Preset...", "ანიმაციის პრესეტის გამოყენება..."),
|
||||
("", "Recent Animation Presets", "ბოლო ანიმაციის პრესეტები"),
|
||||
("anim.clearRecentPresets", "Clear Recent Presets", "ბოლო პრესეტების სიის გასუფთავება"),
|
||||
("anim.browsePresets", "Browse Presets...", "პრესეტების დათვალიერება..."),
|
||||
("", "Text Animation Presets", "ტექსტის ანიმაციის პრესეტები"),
|
||||
("layer.applyTextPreset", "Typewriter", "საბეჭდი მანქანა"),
|
||||
("layer.applyTextPreset", "Fade Up Characters", "ასოების ამოსვლა გამოჩენით"),
|
||||
("layer.applyTextPreset", "Bounce In Words", "სიტყვების ხტუნვით შემოსვლა"),
|
||||
("layer.applyTextPreset", "Tracking In", "ასოების შეკუმშვით შემოსვლა"),
|
||||
("layer.applyTextPreset", "Scramble", "არევა"),
|
||||
("layer.applyTextPreset", "Blur In", "გამოჩენა გაბუნდოვნებიდან"),
|
||||
("layer.applyTextPreset", "Jitter", "კანკალი"),
|
||||
("layer.applyTextPreset", "Drop In Lines", "სტრიქონების ჩამოვარდნა"),
|
||||
("anim.addKeyframe", "Add Keyframe", "საკვანძო კადრის დამატება"),
|
||||
("keys.toggleHold", "Toggle Hold Keyframe", "ფიქსირებული საკვანძო კადრის გადართვა"),
|
||||
("keys.interpolation", "Keyframe Interpolation...", "საკვანძო კადრის ინტერპოლაცია..."),
|
||||
("keys.velocity", "Keyframe Velocity...", "საკვანძო კადრის სიჩქარე..."),
|
||||
("", "Keyframe Assistant", "საკვანძო კადრების ასისტენტი"),
|
||||
("keys.audioToKeyframes", "Convert Audio to Keyframes", "აუდიოს საკვანძო კადრებად გარდაქმნა"),
|
||||
("prop.convertExpressionToKeyframes", "Convert Expression to Keyframes", "ექსპრესიის საკვანძო კადრებად გარდაქმნა"),
|
||||
("keys.easyEase", "Easy Ease", "რბილი შენელება"),
|
||||
("keys.easyEaseIn", "Easy Ease In", "რბილი შენელება შესვლისას"),
|
||||
("keys.easyEaseOut", "Easy Ease Out", "რბილი შენელება გამოსვლისას"),
|
||||
("keys.exponentialScale", "Exponential Scale", "ექსპონენციალური მასშტაბი"),
|
||||
("keys.rpfCameraImport", "RPF Camera Import", "RPF კამერის იმპორტი"),
|
||||
("layer.sequence", "Sequence Layers...", "შრეების თანმიმდევრობით განლაგება..."),
|
||||
("keys.timeReverse", "Time-Reverse Keyframes", "საკვანძო კადრების დროში შებრუნება"),
|
||||
("", "Animate Text", "ტექსტის ანიმირება"),
|
||||
("layer.enablePerChar3D", "Enable Per-character 3D", "თითოეული ასოს 3D-ს ჩართვა"),
|
||||
("layer.addTextAnimator", "Anchor Point", "საყრდენი წერტილი"),
|
||||
("layer.addTextAnimator", "Position", "პოზიცია"),
|
||||
("layer.addTextAnimator", "Scale", "მასშტაბი"),
|
||||
("layer.addTextAnimator", "Skew", "დახრა"),
|
||||
("layer.addTextAnimator", "Rotation", "შემობრუნება"),
|
||||
("layer.addTextAnimator", "Opacity", "გაუმჭვირვალობა"),
|
||||
("layer.addTextAnimator", "All Transform Properties", "გარდაქმნის ყველა თვისება"),
|
||||
("", "Fill Color", "შევსების ფერი"),
|
||||
("layer.addTextAnimator", "RGB", "RGB"),
|
||||
("layer.addTextAnimator", "Hue", "ფერის ტონი"),
|
||||
("layer.addTextAnimator", "Saturation", "გაჯერება"),
|
||||
("layer.addTextAnimator", "Brightness", "სიკაშკაშე"),
|
||||
("", "Stroke Color", "კონტურის ფერი"),
|
||||
("layer.addTextAnimator", "Stroke Width", "კონტურის სისქე"),
|
||||
("", "Front", "წინა მხარე"),
|
||||
("", "Bevel", "წაკვეთა"),
|
||||
("", "Side", "გვერდითი მხარე"),
|
||||
("", "Back", "უკანა მხარე"),
|
||||
("layer.addTextAnimator", "Color", "ფერი"),
|
||||
("layer.addTextAnimator", "Tracking", "ასოთაშორისი ინტერვალი"),
|
||||
("layer.addTextAnimator", "Line Anchor", "სტრიქონის საყრდენი"),
|
||||
("layer.addTextAnimator", "Line Spacing", "სტრიქონთა დაშორება"),
|
||||
("layer.addTextAnimator", "Character Offset", "ასოს წანაცვლება"),
|
||||
("layer.addTextAnimator", "Character Value", "ასოს მნიშვნელობა"),
|
||||
("layer.addTextAnimator", "Blur", "გაბუნდოვნება"),
|
||||
("text.animatorFontAxes", "Variable Font Axes", "ცვლადი შრიფტის ღერძები"),
|
||||
("", "Add Text Selector", "ტექსტის სელექტორის დამატება"),
|
||||
("text.addSelector", "Range", "დიაპაზონი"),
|
||||
("text.addSelector", "Wiggly", "რხევითი"),
|
||||
("text.addSelector", "Expression", "ექსპრესია"),
|
||||
("text.removeAllAnimators", "Remove All Text Animators", "ტექსტის ყველა ანიმატორის წაშლა"),
|
||||
("prop.setExpression", "Add Expression", "ექსპრესიის დამატება"),
|
||||
("essential.addProperty", "Add Property to Essential Graphics", "თვისების დამატება ძირითად გრაფიკაში"),
|
||||
("prop.separateDimensions", "Separate Dimensions", "განზომილებების გაყოფა"),
|
||||
("track.camera", "Track Camera", "კამერის ტრეკინგი"),
|
||||
("track.warpStabilizer", "Warp Stabilizer VFX", "Warp Stabilizer VFX"),
|
||||
("track.motion", "Track Motion", "მოძრაობის ტრეკინგი"),
|
||||
("track.stabilize", "Stabilize Motion", "მოძრაობის სტაბილიზაცია"),
|
||||
("track.property", "Track this Property", "ამ თვისების ტრეკინგი"),
|
||||
("anim.reveal", "Reveal Properties with Keyframes", "საკვანძო კადრების მქონე თვისებების ჩვენება"),
|
||||
("anim.reveal", "Reveal Properties with Animation", "ანიმაციის მქონე თვისებების ჩვენება"),
|
||||
("anim.reveal", "Reveal All Modified Properties", "ყველა შეცვლილი თვისების ჩვენება"),
|
||||
("", "View", "ხედი"),
|
||||
("view.newViewer", "New Viewer", "ახალი დამთვალიერებელი"),
|
||||
("view.splitLockedViewer", "Split with New Locked Viewer", "დაყოფა ახალი ჩაკეტილი დამთვალიერებელით"),
|
||||
("view.zoomIn", "Zoom In", "გადიდება"),
|
||||
("view.zoomOut", "Zoom Out", "დაპატარავება"),
|
||||
("", "Resolution", "გარჩევადობა"),
|
||||
("view.res.full", "Full", "სრული"),
|
||||
("view.res.half", "Half", "ნახევარი"),
|
||||
("view.res.third", "Third", "მესამედი"),
|
||||
("view.res.quarter", "Quarter", "მეოთხედი"),
|
||||
("view.res.custom", "Custom...", "მორგებული..."),
|
||||
("view.displayColorManagement", "Use Display Color Management", "ეკრანის ფერთა მართვის გამოყენება"),
|
||||
("", "Simulate Output", "გამოტანის იმიტაცია"),
|
||||
("view.simulateOutput", "No Output Simulation", "გამოტანის იმიტაციის გარეშე"),
|
||||
("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)", "ძველი Macintosh RGB (გამა 1.8)"),
|
||||
("view.simulateOutput", "Internet Standard RGB (sRGB)", "ინტერნეტის სტანდარტული RGB (sRGB)"),
|
||||
("view.simulateOutput", "UHDTV (Rec. 2020)", "UHDTV (Rec. 2020)"),
|
||||
("view.simulateOutput", "Display P3", "Display P3"),
|
||||
("view.simulateOutput", "Linear (1.0 Gamma)", "წრფივი (გამა 1.0)"),
|
||||
("view.customRgb", "My Custom RGB...", "ჩემი მორგებული RGB..."),
|
||||
("view.simulateOutput", "Custom...", "მორგებული..."),
|
||||
("view.rulers", "Show Rulers", "სახაზავების ჩვენება"),
|
||||
("", "Panel Background Color", "პანელის ფონის ფერი"),
|
||||
("view.panelBackground", "Black", "შავი"),
|
||||
("view.panelBackground", "Dark Gray", "მუქი ნაცრისფერი"),
|
||||
("view.panelBackground", "Medium Gray (Default)", "საშუალო ნაცრისფერი (ნაგულისხმევი)"),
|
||||
("view.panelBackground", "Light Gray", "ღია ნაცრისფერი"),
|
||||
("view.panelBackground", "White", "თეთრი"),
|
||||
("view.panelBackground", "Custom", "მორგებული"),
|
||||
("view.panelBackground", "Select Custom Background Color...", "მორგებული ფონის ფერის არჩევა..."),
|
||||
("view.guides", "Show Guides", "დამხმარე ხაზების ჩვენება"),
|
||||
("view.snapToGuides", "Snap to Guides", "დამხმარე ხაზებზე მიბმა"),
|
||||
("view.lockGuides", "Lock Guides", "დამხმარე ხაზების ჩაკეტვა"),
|
||||
("view.addGuide", "Add Guide...", "დამხმარე ხაზის დამატება..."),
|
||||
("view.addPercentGuide", "Add Percentage Guide...", "პროცენტული დამხმარე ხაზის დამატება..."),
|
||||
("view.convertGuides", "Convert Guides to Percentage", "დამხმარე ხაზების პროცენტულად გარდაქმნა"),
|
||||
("view.convertGuides", "Convert Guides to Pixels", "დამხმარე ხაზების პიქსელებად გარდაქმნა"),
|
||||
("view.clearGuides", "Clear Guides", "დამხმარე ხაზების გასუფთავება"),
|
||||
("view.importGuides", "Import Guides...", "დამხმარე ხაზების იმპორტი..."),
|
||||
("view.exportGuides", "Export Guides...", "დამხმარე ხაზების ექსპორტი..."),
|
||||
("view.grid", "Show Grid", "ბადის ჩვენება"),
|
||||
("view.snapToGrid", "Snap to Grid", "ბადეზე მიბმა"),
|
||||
("view.snapping", "Snapping", "მიბმა"),
|
||||
("view.options", "View Options...", "ხედის პარამეტრები..."),
|
||||
("view.layerControls", "Show Layer Controls", "შრის მართვის ელემენტების ჩვენება"),
|
||||
("", "Switch View Layout", "ხედების განლაგების გადართვა"),
|
||||
("view.layout", "1 View", "1 ხედი"),
|
||||
("view.layout", "2 Views", "2 ხედი"),
|
||||
("view.layout", "4 Views", "4 ხედი"),
|
||||
("view.shareViewOptions", "Share View Options", "ხედის პარამეტრების გაზიარება"),
|
||||
("", "Switch 3D View", "3D ხედის გადართვა"),
|
||||
("view.3d.activeCamera", "Active Camera", "აქტიური კამერა"),
|
||||
("view.3d.default", "Default", "ნაგულისხმევი"),
|
||||
("view.3d.front", "Front", "წინიდან"),
|
||||
("view.3d.left", "Left", "მარცხნიდან"),
|
||||
("view.3d.top", "Top", "ზემოდან"),
|
||||
("view.3d.back", "Back", "უკნიდან"),
|
||||
("view.3d.right", "Right", "მარჯვნიდან"),
|
||||
("view.3d.bottom", "Bottom", "ქვემოდან"),
|
||||
("view.3d.custom1", "Custom View 1", "მორგებული ხედი 1"),
|
||||
("view.3d.custom2", "Custom View 2", "მორგებული ხედი 2"),
|
||||
("view.3d.custom3", "Custom View 3", "მორგებული ხედი 3"),
|
||||
("", "Assign Shortcut to 3D View", "მალსახმობის მინიჭება 3D ხედისთვის"),
|
||||
("view.3d.last", "Switch to Last 3D View", "ბოლო 3D ხედზე გადართვა"),
|
||||
("view.lookAtSelected", "Look at Selected Layers", "მონიშნული შრეების დათვალიერება"),
|
||||
("view.lookAtAll", "Look at All Layers", "ყველა შრის დათვალიერება"),
|
||||
("time.set", "Go to Time...", "დროზე გადასვლა..."),
|
||||
("view.fullScreen", "Enter Full Screen", "სრულეკრანიან რეჟიმში გადასვლა"),
|
||||
("", "Window", "ფანჯარა"),
|
||||
("", "Workspace", "სამუშაო სივრცე"),
|
||||
("window.workspace", "Default", "ნაგულისხმევი"),
|
||||
("window.workspace", "Review", "განხილვა"),
|
||||
("window.workspace", "Learn", "სწავლა"),
|
||||
("window.workspace", "Small Screen", "პატარა ეკრანი"),
|
||||
("window.workspace", "Standard", "სტანდარტული"),
|
||||
("window.workspace", "All Panels", "ყველა პანელი"),
|
||||
("window.workspace", "Animation", "ანიმაცია"),
|
||||
("window.workspace", "Color", "ფერი"),
|
||||
("window.workspace", "Effects", "ეფექტები"),
|
||||
("window.workspace", "Essential Graphics", "ძირითადი გრაფიკა"),
|
||||
("window.workspace", "Minimal", "მინიმალური"),
|
||||
("window.workspace", "Motion Tracking", "მოძრაობის ტრეკინგი"),
|
||||
("window.workspace", "Paint", "ხატვა"),
|
||||
("window.workspace", "Text", "ტექსტი"),
|
||||
("window.workspace", "Undocked Panels", "მოხსნილი პანელები"),
|
||||
("window.resetWorkspace", "Reset to Saved Layout", "შენახულ განლაგებაზე დაბრუნება"),
|
||||
("window.saveWorkspace", "Save Changes to this Workspace", "ამ სამუშაო სივრცეში ცვლილებების შენახვა"),
|
||||
("window.saveWorkspaceAs", "Save as New Workspace...", "ახალ სამუშაო სივრცედ შენახვა..."),
|
||||
("window.editWorkspaces", "Edit Workspaces...", "სამუშაო სივრცეების რედაქტირება..."),
|
||||
("", "Assign Shortcut to Workspace", "მალსახმობის მინიჭება სამუშაო სივრცისთვის"),
|
||||
("window.panel", "Align", "სწორება"),
|
||||
("window.panel", "Audio", "აუდიო"),
|
||||
("window.panel", "Brushes", "ფუნჯები"),
|
||||
("window.panel", "Character", "სიმბოლო"),
|
||||
("window.panel", "Content-Aware Fill", "შიგთავსის გათვალისწინებით შევსება"),
|
||||
("window.panel", "Effects & Presets", "ეფექტები და პრესეტები"),
|
||||
("window.panel", "Essential Graphics", "ძირითადი გრაფიკა"),
|
||||
("window.panel", "Info", "ინფორმაცია"),
|
||||
("help.inAppTutorials", "Learn", "სწავლა"),
|
||||
("window.panel", "Lumetri Scopes", "Lumetri Scopes"),
|
||||
("window.panel", "Mask Interpolation", "ნიღბის ინტერპოლაცია"),
|
||||
("window.panel", "Media Browser", "მედიის ბრაუზერი"),
|
||||
("window.panel", "Metadata", "მეტამონაცემები"),
|
||||
("window.panel", "Motion Sketch", "მოძრაობის ესკიზი"),
|
||||
("window.panel", "Paint", "ხატვა"),
|
||||
("window.panel", "Paragraph", "აბზაცი"),
|
||||
("window.panel", "Preview", "წინასწარი ნახვა"),
|
||||
("window.panel", "Progress", "პროგრესი"),
|
||||
("window.panel", "Properties", "თვისებები"),
|
||||
("window.panel", "Script Console", "სკრიპტის კონსოლი"),
|
||||
("window.panel", "Smoother", "დამგლუვებელი"),
|
||||
("window.panel", "Tools", "ხელსაწყოები"),
|
||||
("window.panel", "Tracker", "ტრეკერი"),
|
||||
("window.panel", "Wiggler", "რხევის გენერატორი"),
|
||||
("window.panel", "Composition", "კომპოზიცია"),
|
||||
("window.panel", "Flowchart", "ბლოკ-სქემა"),
|
||||
("window.panel", "Footage", "ვიდეომასალა"),
|
||||
("window.panel", "Layer", "შრე"),
|
||||
("window.panel", "Project", "პროექტი"),
|
||||
("window.panel", "Render Queue", "რენდერის რიგი"),
|
||||
("window.panel", "Timeline", "დროის ხაზი"),
|
||||
("window.panel", "Create Nulls From Paths", "ნულოვანი ობიექტების შექმნა ტრაექტორიებიდან"),
|
||||
("window.panel", "VR Comp Editor", "VR კომპოზიციის რედაქტორი"),
|
||||
("", "Help", "დახმარება"),
|
||||
("help.docs", "EffectCraft Help...", "EffectCraft-ის დახმარება..."),
|
||||
("help.docs", "Scripting Help...", "სკრიპტების დახმარება..."),
|
||||
("help.docs", "Expression Reference...", "ექსპრესიების ცნობარი..."),
|
||||
("help.docs", "Effect Reference...", "ეფექტების ცნობარი..."),
|
||||
("anim.browsePresets", "Animation Presets...", "ანიმაციის პრესეტები..."),
|
||||
("app.keyboardShortcuts", "Keyboard Shortcuts...", "კლავიატურის მალსახმობები..."),
|
||||
("help.inAppTutorials", "In-App Tutorials...", "აპის შიგნით გაკვეთილები..."),
|
||||
("help.onlineTutorials", "Online Tutorials...", "ონლაინ გაკვეთილები..."),
|
||||
("help.systemReport", "System Compatibility Report...", "სისტემის თავსებადობის ანგარიში..."),
|
||||
("help.enableLogging", "Enable Logging", "ჟურნალის ჩართვა"),
|
||||
("help.revealLogFile", "Reveal Logging File", "ჟურნალის ფაილის ჩვენება"),
|
||||
("help.discord", "Join the ArtCraft Discord...", "შემოუერთდით ArtCraft-ის Discord-ს..."),
|
||||
("help.reportIssue", "Provide Feedback...", "გამოხმაურების გაგზავნა..."),
|
||||
("help.website", "ArtCraft Website", "ArtCraft-ის ვებსაიტი"),
|
||||
("help.appPage", "EffectCraft Home Page", "EffectCraft-ის საწყისი გვერდი"),
|
||||
("help.github", "EffectCraft on GitHub", "EffectCraft GitHub-ზე"),
|
||||
("file.openDemoProject", "Open Demo Project", "სადემონსტრაციო პროექტის გახსნა"),
|
||||
];
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@@ -6753,6 +7416,22 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn georgian_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": "ka"})).unwrap();
|
||||
for command in ["file.revealInFinder", "layer.revealInFinder"] {
|
||||
for (source, translated) in [
|
||||
("Reveal in Finder", "Finder-ში ჩვენება"),
|
||||
("Reveal in Explorer", "Explorer-ში ჩვენება"),
|
||||
("Reveal in File Manager", "ფაილების მენეჯერში ჩვენება"),
|
||||
] {
|
||||
assert_eq!(label(&app, command, source), translated);
|
||||
assert_eq!(label(&app, "file.openRecent", source), source);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn keys(nodes: &[MenuNode], out: &mut BTreeSet<(String, String)>) {
|
||||
for node in nodes {
|
||||
match node {
|
||||
@@ -6784,6 +7463,7 @@ mod tests {
|
||||
let mut french_keys = BTreeSet::new();
|
||||
let mut german_keys = BTreeSet::new();
|
||||
let mut czech_keys = BTreeSet::new();
|
||||
let mut georgian_keys = BTreeSet::new();
|
||||
for (catalog, unique) in [
|
||||
(JAPANESE, &mut japanese_keys),
|
||||
(SIMPLIFIED_CHINESE, &mut chinese_keys),
|
||||
@@ -6795,6 +7475,7 @@ mod tests {
|
||||
(FRENCH, &mut french_keys),
|
||||
(GERMAN, &mut german_keys),
|
||||
(CZECH, &mut czech_keys),
|
||||
(GEORGIAN, &mut georgian_keys),
|
||||
] {
|
||||
for (command, en, translated) in catalog {
|
||||
let key = (command.to_string(), en.to_string());
|
||||
@@ -6825,6 +7506,7 @@ mod tests {
|
||||
assert_eq!(russian_keys, french_keys, "the languages must translate the same entries");
|
||||
assert_eq!(french_keys, german_keys, "the languages must translate the same entries");
|
||||
assert_eq!(japanese_keys, czech_keys, "the languages must translate the same entries");
|
||||
assert_eq!(japanese_keys, georgian_keys, "the languages must translate the same entries");
|
||||
}
|
||||
|
||||
/// Exercise each engine spelling on every host: a macOS-only run must still catch a
|
||||
@@ -6911,6 +7593,9 @@ mod tests {
|
||||
(Some("cs-CZ"), "cs"),
|
||||
(Some("cs_CZ.UTF-8"), "cs"),
|
||||
(Some("CS_cz.UTF-8"), "cs"),
|
||||
(Some("ka"), "ka"),
|
||||
(Some("ka-GE"), "ka"),
|
||||
(Some("ka_GE.UTF-8"), "ka"),
|
||||
(Some("en-US"), "en"),
|
||||
(Some("jv-ID"), "en"),
|
||||
(Some("de-DE"), "en"),
|
||||
@@ -6944,9 +7629,15 @@ 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), ("cs", CZECH)]
|
||||
{
|
||||
for (code, catalog) in [
|
||||
("zh-hans", SIMPLIFIED_CHINESE),
|
||||
("zh-hant", TRADITIONAL_CHINESE),
|
||||
("uk", UKRAINIAN),
|
||||
("es", SPANISH),
|
||||
("pt-br", PORTUGUESE),
|
||||
("cs", CZECH),
|
||||
("ka", GEORGIAN),
|
||||
] {
|
||||
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();
|
||||
@@ -7190,6 +7881,44 @@ mod tests {
|
||||
assert_eq!(submenu(&app, "Assign Shortcut to 3D View", "Assign Shortcut to “Top”".into()), "Atribuir atalho à visualização 3D “Top”");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ka_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();
|
||||
let en = crate::native_menu::build(&app);
|
||||
app.session.execute("prefs.set", json!({"key":"general.language", "value":"ka"})).unwrap();
|
||||
assert_eq!(language(&app), "ka");
|
||||
assert!(georgian(&app));
|
||||
assert!(!japanese(&app));
|
||||
let ka = crate::native_menu::build(&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::<Vec<_>>()
|
||||
};
|
||||
assert_eq!(bindings(&en), bindings(&ka));
|
||||
assert_eq!(label(&app, "", "Composition"), "კომპოზიცია");
|
||||
assert_eq!(label(&app, "", "Layer"), "შრე");
|
||||
assert_eq!(label(&app, "comp.new", "New Composition..."), "ახალი კომპოზიცია...");
|
||||
assert_eq!(label(&app, "anim.addKeyframe", "Add Keyframe"), "საკვანძო კადრის დამატება");
|
||||
assert_eq!(label(&app, "unknown.command", "Text"), "Text");
|
||||
assert!(ka.items().iter().any(|i| i.command == "keys.easyEase" && i.label == "რბილი შენელება"));
|
||||
let undo = MenuEntry { label: "Undo".into(), command: "edit.undo".into(), params: json!({}), shortcut: None, alt_shortcuts: vec![] };
|
||||
assert_eq!(entry(&app, &undo, "Can't Undo".into()), "დაბრუნება შეუძლებელია");
|
||||
app.session.history.undo.push(("Comp 1".into(), app.session.project.clone()));
|
||||
assert_eq!(entry(&app, &undo, "Undo Comp 1".into()), "დაბრუნება: Comp 1");
|
||||
let panel =
|
||||
MenuEntry { label: "Layer".into(), command: "window.panel".into(), params: json!({"panel":"layer"}), shortcut: None, alt_shortcuts: vec![] };
|
||||
assert_eq!(entry(&app, &panel, "Layer: File".into()), "შრე: File");
|
||||
assert_eq!(
|
||||
submenu(&app, "Assign Shortcut to Workspace", "Assign Shortcut to “Default” Workspace".into()),
|
||||
"მალსახმობის მინიჭება სამუშაო სივრცისთვის „Default“"
|
||||
);
|
||||
assert_eq!(submenu(&app, "Assign Shortcut to 3D View", "Assign Shortcut to “Top”".into()), "მალსახმობის მინიჭება 3D ხედისთვის „Top“");
|
||||
// A dynamic filename is never translated.
|
||||
app.session.prefs.push_recent("/tmp/File.ecproj");
|
||||
assert!(crate::native_menu::build(&app).items().iter().any(|i| i.command == "file.openRecent" && i.label == "File.ecproj"));
|
||||
assert!(effectcraft_engine::prefs::LANGUAGES.contains(&("ქართული", "ka")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn general_settings_exposes_the_language_automation_id() {
|
||||
let mut app = EffectcraftApp::new(effectcraft_engine::Session::default());
|
||||
|
||||
@@ -70,12 +70,14 @@ fn catalog(language: &str) -> Option<&'static Catalog> {
|
||||
static SIMPLIFIED: Catalog = Catalog { rows: SIMPLIFIED_CHINESE, categories: SIMPLIFIED_CHINESE_CATEGORIES, index: OnceLock::new() };
|
||||
static TRADITIONAL: Catalog = Catalog { rows: TRADITIONAL_CHINESE, categories: TRADITIONAL_CHINESE_CATEGORIES, index: OnceLock::new() };
|
||||
static JAPANESE: Catalog = Catalog { rows: JAPANESE_EFFECTS, categories: JAPANESE_CATEGORIES, index: OnceLock::new() };
|
||||
static GEORGIAN_CATALOG: Catalog = Catalog { rows: GEORGIAN, categories: GEORGIAN_CATEGORIES, index: OnceLock::new() };
|
||||
match language {
|
||||
"zh-hans" => Some(&SIMPLIFIED),
|
||||
"zh-hant" => Some(&TRADITIONAL),
|
||||
// Japanese: the slot the Japanese data point on #821 asked for, so both languages share
|
||||
// this one catalog instead of inventing a second mechanism.
|
||||
"ja" => Some(&JAPANESE),
|
||||
"ka" => Some(&GEORGIAN_CATALOG),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -447,6 +449,346 @@ const TRADITIONAL_CHINESE_CATEGORIES: &[(&str, &str)] = &[];
|
||||
/// Japanese (`ja`) category labels, keyed by the registry's English category.
|
||||
const JAPANESE_CATEGORIES: &[(&str, &str)] = &[];
|
||||
|
||||
/// Georgian (`ka`): one row per effect, ids from [`SIMPLIFIED_CHINESE`]. Written from the meaning
|
||||
/// of the English names, with the terms the Georgian menus and panels use (FilmCraft's Georgian
|
||||
/// for the effects the two apps share). The `CC` series and the brand names (`Cryptomatte`,
|
||||
/// `EXtractoR`, `IDentifier`, `Key Light`, `Unmult`, `Lumetri Color`) stay in English, as
|
||||
/// Adobe's Japanese interface keeps the `CC` series; `VR` and `OCIO` keep their prefix.
|
||||
const GEORGIAN: &[Row] = &[
|
||||
("ec.3d.channelextract", "3D Channel Extract", "3D არხის ამოღება"),
|
||||
("ec.3d.cryptomatte", "Cryptomatte", "Cryptomatte"),
|
||||
("ec.3d.depthmatte", "Depth Matte", "სიღრმის მატი"),
|
||||
("ec.3d.depthoffield", "Depth of Field", "ველის სიღრმე"),
|
||||
("ec.3d.extractor", "EXtractoR", "EXtractoR"),
|
||||
("ec.3d.fog3d", "Fog 3D", "3D ნისლი"),
|
||||
("ec.3d.identifier", "IDentifier", "IDentifier"),
|
||||
("ec.3d.idmatte", "ID Matte", "ID მატი"),
|
||||
("ec.audio.backwards", "Backwards", "უკუღმა"),
|
||||
("ec.audio.basstreble", "Bass & Treble", "ბასი და ტრებლი"),
|
||||
("ec.audio.compressor", "Compressor", "კომპრესორი"),
|
||||
("ec.audio.delay", "Delay", "დაყოვნება"),
|
||||
("ec.audio.distortion", "Distortion", "დამახინჯება"),
|
||||
("ec.audio.flangechorus", "Flange & Chorus", "ფლენჯერი და ქორუსი"),
|
||||
("ec.audio.gate", "Gate", "გეიტი"),
|
||||
("ec.audio.highlowpass", "High-Low Pass", "მაღალი/დაბალი სიხშირეების ფილტრი"),
|
||||
("ec.audio.modulator", "Modulator", "მოდულატორი"),
|
||||
("ec.audio.parametriceq", "Parametric EQ", "პარამეტრული ეკვალაიზერი"),
|
||||
("ec.audio.reverb", "Reverb", "რევერბი"),
|
||||
("ec.audio.stereomixer", "Stereo Mixer", "სტერეომიქშერი"),
|
||||
("ec.audio.tone", "Tone", "ტონი"),
|
||||
("ec.blur.bilateral", "Bilateral Blur", "ბილატერალური გაბუნდოვნება"),
|
||||
("ec.blur.cameralens", "Camera Lens Blur", "კამერის ობიექტივის გაბუნდოვნება"),
|
||||
("ec.blur.camerashakedeblur", "Camera-Shake Deblur", "კამერის რყევით გაბუნდოვნების მოცილება"),
|
||||
("ec.blur.cccross", "CC Cross Blur", "CC Cross Blur"),
|
||||
("ec.blur.ccradial", "CC Radial Blur", "CC Radial Blur"),
|
||||
("ec.blur.ccradialfast", "CC Radial Fast Blur", "CC Radial Fast Blur"),
|
||||
("ec.blur.ccvector", "CC Vector Blur", "CC Vector Blur"),
|
||||
("ec.blur.channel", "Channel Blur", "არხის გაბუნდოვნება"),
|
||||
("ec.blur.compound", "Compound Blur", "შედგენილი გაბუნდოვნება"),
|
||||
("ec.blur.directional", "Directional Blur", "მიმართული გაბუნდოვნება"),
|
||||
("ec.blur.fastbox", "Fast Box Blur", "სწრაფი ბლოკური გაბუნდოვნება"),
|
||||
("ec.blur.gaussian", "Gaussian Blur", "გაუსის გაბუნდოვნება"),
|
||||
("ec.blur.radial", "Radial Blur", "რადიალური გაბუნდოვნება"),
|
||||
("ec.blur.reduceflicker", "Reduce Interlace Flicker", "ნახევარკადრული ციმციმის შემცირება"),
|
||||
("ec.blur.sharpen", "Sharpen", "სიმკვეთრე"),
|
||||
("ec.blur.smart", "Smart Blur", "ჭკვიანი გაბუნდოვნება"),
|
||||
("ec.blur.unsharp", "Unsharp Mask", "არამკვეთრი ნიღაბი"),
|
||||
("ec.channel.arithmetic", "Arithmetic", "არითმეტიკა"),
|
||||
("ec.channel.blend", "Blend", "შერევა"),
|
||||
("ec.channel.calculations", "Calculations", "გამოთვლები"),
|
||||
("ec.channel.cccomposite", "CC Composite", "CC Composite"),
|
||||
("ec.channel.combiner", "Channel Combiner", "არხების გამაერთიანებელი"),
|
||||
("ec.channel.compoundarithmetic", "Compound Arithmetic", "შედგენილი არითმეტიკა"),
|
||||
("ec.channel.invert", "Invert", "ინვერსია"),
|
||||
("ec.channel.minimax", "Minimax", "მინიმაქსი"),
|
||||
("ec.channel.removecolormatting", "Remove Color Matting", "ფერადი მატინგის მოცილება"),
|
||||
("ec.channel.setchannels", "Set Channels", "არხების დაყენება"),
|
||||
("ec.channel.setmatte", "Set Matte", "მატის დაყენება"),
|
||||
("ec.channel.shiftchannels", "Shift Channels", "არხების გადანაცვლება"),
|
||||
("ec.channel.solidcomposite", "Solid Composite", "სოლიდთან კომპოზიტი"),
|
||||
("ec.color.autocolor", "Auto Color", "ავტოფერი"),
|
||||
("ec.color.autocontrast", "Auto Contrast", "ავტოკონტრასტი"),
|
||||
("ec.color.autolevels", "Auto Levels", "ავტოდონეები"),
|
||||
("ec.color.blackwhite", "Black & White", "შავ-თეთრი"),
|
||||
("ec.color.brightnesscontrast", "Brightness & Contrast", "სიკაშკაშე და კონტრასტი"),
|
||||
("ec.color.broadcast", "Broadcast Colors", "სამაუწყებლო ფერები"),
|
||||
("ec.color.cccolorneutralizer", "CC Color Neutralizer", "CC Color Neutralizer"),
|
||||
("ec.color.cccoloroffset", "CC Color Offset", "CC Color Offset"),
|
||||
("ec.color.cckernel", "CC Kernel", "CC Kernel"),
|
||||
("ec.color.cctoner", "CC Toner", "CC Toner"),
|
||||
("ec.color.changecolor", "Change Color", "ფერის შეცვლა"),
|
||||
("ec.color.changetocolor", "Change to Color", "ფერად შეცვლა"),
|
||||
("ec.color.channelmixer", "Channel Mixer", "არხების მიქშერი"),
|
||||
("ec.color.colorama", "Colorama", "კოლორამა"),
|
||||
("ec.color.colorbalance", "Color Balance", "ფერთა ბალანსი"),
|
||||
("ec.color.colorbalancehls", "Color Balance (HLS)", "ფერთა ბალანსი (HLS)"),
|
||||
("ec.color.colorlink", "Color Link", "ფერის ბმა"),
|
||||
("ec.color.colorstabilizer", "Color Stabilizer", "ფერის სტაბილიზატორი"),
|
||||
("ec.color.curves", "Curves", "მრუდები"),
|
||||
("ec.color.equalize", "Equalize", "გათანაბრება"),
|
||||
("ec.color.exposure", "Exposure", "ექსპოზიცია"),
|
||||
("ec.color.gammapedestalgain", "Gamma/Pedestal/Gain", "გამა/საფეხური/გაძლიერება"),
|
||||
("ec.color.huesaturation", "Hue/Saturation", "ფერის ტონი/გაჯერება"),
|
||||
("ec.color.leavecolor", "Leave Color", "ფერის დატოვება"),
|
||||
("ec.color.levels", "Levels", "დონეები"),
|
||||
("ec.color.levelsic", "Levels (Individual Controls)", "დონეები (ცალკეული მართვა)"),
|
||||
("ec.color.lumetri", "Lumetri Color", "Lumetri Color"),
|
||||
("ec.color.ociocdl", "OCIO CDL Transform", "OCIO CDL გარდაქმნა"),
|
||||
("ec.color.ociocolorspace", "OCIO Color Space Transform", "OCIO ფერთა სივრცის გარდაქმნა"),
|
||||
("ec.color.ociodisplay", "OCIO Display Transform", "OCIO ეკრანის გარდაქმნა"),
|
||||
("ec.color.ociofile", "OCIO File Transform", "OCIO ფაილის გარდაქმნა"),
|
||||
("ec.color.ociolook", "OCIO Look Transform", "OCIO ვიზუალური სტილის გარდაქმნა"),
|
||||
("ec.color.photofilter", "Photo Filter", "ფოტოფილტრი"),
|
||||
("ec.color.psarbitrarymap", "PS Arbitrary Map", "PS ნებისმიერი რუკა"),
|
||||
("ec.color.selectivecolor", "Selective Color", "შერჩევითი ფერი"),
|
||||
("ec.color.shadowhighlight", "Shadow/Highlight", "ჩრდილები/ღია ტონები"),
|
||||
("ec.color.tint", "Tint", "ტონირება"),
|
||||
("ec.color.tritone", "Tritone", "სამტონიანი"),
|
||||
("ec.color.vibrance", "Vibrance", "სიხალასე"),
|
||||
("ec.color.videolimiter", "Video Limiter", "ვიდეოლიმიტერი"),
|
||||
("ec.control.angle", "Angle Control", "კუთხის მართვა"),
|
||||
("ec.control.checkbox", "Checkbox Control", "მოსანიშნი ველის მართვა"),
|
||||
("ec.control.color", "Color Control", "ფერის მართვა"),
|
||||
("ec.control.dropdown", "Dropdown Menu Control", "ჩამოსაშლელი მენიუს მართვა"),
|
||||
("ec.control.layer", "Layer Control", "შრის მართვა"),
|
||||
("ec.control.point", "Point Control", "წერტილის მართვა"),
|
||||
("ec.control.point3d", "3D Point Control", "3D წერტილის მართვა"),
|
||||
("ec.control.slider", "Slider Control", "სლაიდერის მართვა"),
|
||||
("ec.control.stereo3d", "Stereo 3D Controls", "სტერეო 3D მართვა"),
|
||||
("ec.distort.bezierwarp", "Bezier Warp", "ბეზიეს დეფორმაცია"),
|
||||
("ec.distort.bulge", "Bulge", "გამობერილობა"),
|
||||
("ec.distort.ccbender", "CC Bender", "CC Bender"),
|
||||
("ec.distort.ccbendit", "CC Bend It", "CC Bend It"),
|
||||
("ec.distort.ccblobbylize", "CC Blobbylize", "CC Blobbylize"),
|
||||
("ec.distort.ccflomotion", "CC Flo Motion", "CC Flo Motion"),
|
||||
("ec.distort.ccgriddler", "CC Griddler", "CC Griddler"),
|
||||
("ec.distort.cclens", "CC Lens", "CC Lens"),
|
||||
("ec.distort.ccpageturn", "CC Page Turn", "CC Page Turn"),
|
||||
("ec.distort.ccpowerpin", "CC Power Pin", "CC Power Pin"),
|
||||
("ec.distort.ccripplepulse", "CC Ripple Pulse", "CC Ripple Pulse"),
|
||||
("ec.distort.ccslant", "CC Slant", "CC Slant"),
|
||||
("ec.distort.ccsmear", "CC Smear", "CC Smear"),
|
||||
("ec.distort.ccsplit", "CC Split", "CC Split"),
|
||||
("ec.distort.ccsplit2", "CC Split 2", "CC Split 2"),
|
||||
("ec.distort.cctiler", "CC Tiler", "CC Tiler"),
|
||||
("ec.distort.cornerpin", "Corner Pin", "კუთხეების მიმაგრება"),
|
||||
("ec.distort.displacementmap", "Displacement Map", "წანაცვლების რუკა"),
|
||||
("ec.distort.liquify", "Liquify", "გათხევადება"),
|
||||
("ec.distort.magnify", "Magnify", "გადიდება"),
|
||||
("ec.distort.meshwarp", "Mesh Warp", "ბადისებრი დეფორმაცია"),
|
||||
("ec.distort.mirror", "Mirror", "სარკე"),
|
||||
("ec.distort.offset", "Offset", "წანაცვლება"),
|
||||
("ec.distort.opticscompensation", "Optics Compensation", "ოპტიკის კომპენსაცია"),
|
||||
("ec.distort.polar", "Polar Coordinates", "პოლარული კოორდინატები"),
|
||||
("ec.distort.puppet", "Puppet", "მარიონეტი"),
|
||||
("ec.distort.reshape", "Reshape", "ფორმის შეცვლა"),
|
||||
("ec.distort.ripple", "Ripple", "ტალღა"),
|
||||
("ec.distort.rollingshutterrepair", "Rolling Shutter Repair", "მცოცავი ჩამკეტის გასწორება"),
|
||||
("ec.distort.smear", "Smear", "გადღაბნა"),
|
||||
("ec.distort.spherize", "Spherize", "სფერიზება"),
|
||||
("ec.distort.transform", "Transform", "გარდაქმნა"),
|
||||
("ec.distort.turbulentdisplace", "Turbulent Displace", "ტურბულენტური წანაცვლება"),
|
||||
("ec.distort.twirl", "Twirl", "გრიგალი"),
|
||||
("ec.distort.twirllegacy", "Twirl (Legacy)", "გრიგალი (მოძველებული)"),
|
||||
("ec.distort.upscale", "Detail-preserving Upscale", "გადიდება დეტალების შენარჩუნებით"),
|
||||
("ec.distort.warp", "Warp", "დეფორმაცია"),
|
||||
("ec.distort.warpstabilizer", "Warp Stabilizer", "დეფორმაციის სტაბილიზატორი"),
|
||||
("ec.distort.wavewarp", "Wave Warp", "ტალღური დეფორმაცია"),
|
||||
("ec.generate.advancedlightning", "Advanced Lightning", "გაფართოებული ელვა"),
|
||||
("ec.generate.audiospectrum", "Audio Spectrum", "აუდიოს სპექტრი"),
|
||||
("ec.generate.audiowaveform", "Audio Waveform", "აუდიოს ტალღის ფორმა"),
|
||||
("ec.generate.beam", "Beam", "სხივი"),
|
||||
("ec.generate.ccgluegun", "CC Glue Gun", "CC Glue Gun"),
|
||||
("ec.generate.cclightburst", "CC Light Burst 2.5", "CC Light Burst 2.5"),
|
||||
("ec.generate.cclightrays", "CC Light Rays", "CC Light Rays"),
|
||||
("ec.generate.cclightsweep", "CC Light Sweep", "CC Light Sweep"),
|
||||
("ec.generate.ccthreads", "CC Threads", "CC Threads"),
|
||||
("ec.generate.cellpattern", "Cell Pattern", "უჯრედების პატერნი"),
|
||||
("ec.generate.checkerboard", "Checkerboard", "ჭადრაკის დაფა"),
|
||||
("ec.generate.circle", "Circle", "წრე"),
|
||||
("ec.generate.ellipse", "Ellipse", "ელიფსი"),
|
||||
("ec.generate.eyedropperfill", "Eyedropper Fill", "პიპეტით შევსება"),
|
||||
("ec.generate.fill", "Fill", "შევსება"),
|
||||
("ec.generate.fourcolor", "4-Color Gradient", "4-ფერიანი გრადიენტი"),
|
||||
("ec.generate.fractal", "Fractal", "ფრაქტალი"),
|
||||
("ec.generate.gradientramp", "Gradient Ramp", "გრადიენტული გადასვლა"),
|
||||
("ec.generate.grid", "Grid", "ბადე"),
|
||||
("ec.generate.lensflare", "Lens Flare", "ობიექტივის ანარეკლი"),
|
||||
("ec.generate.paintbucket", "Paint Bucket", "საღებავის ვედრო"),
|
||||
("ec.generate.radiowaves", "Radio Waves", "რადიოტალღები"),
|
||||
("ec.generate.scribble", "Scribble", "ჯღაბნა"),
|
||||
("ec.generate.stroke", "Stroke", "კონტური"),
|
||||
("ec.generate.vegas", "Vegas", "ვეგასი"),
|
||||
("ec.generate.writeon", "Write-on", "თანდათანობითი წერა"),
|
||||
("ec.key.advancedspill", "Advanced Spill Suppressor", "ფერის გადაღვრის გაფართოებული ჩამხშობი"),
|
||||
("ec.key.ccsimplewireremoval", "CC Simple Wire Removal", "CC Simple Wire Removal"),
|
||||
("ec.key.colordifference", "Color Difference Key", "ფერთა სხვაობის გასაღები"),
|
||||
("ec.key.colorkey", "Color Key", "ფერის გასაღები"),
|
||||
("ec.key.colorrange", "Color Range", "ფერების დიაპაზონი"),
|
||||
("ec.key.differencematte", "Difference Matte", "სხვაობის მატი"),
|
||||
("ec.key.extract", "Extract", "ამოღება"),
|
||||
("ec.key.innerouter", "Inner/Outer Key", "შიდა/გარე გასაღები"),
|
||||
("ec.key.keycleaner", "Key Cleaner", "გასაღების გამწმენდი"),
|
||||
("ec.key.linearcolor", "Linear Color Key", "წრფივი ფერის გასაღები"),
|
||||
("ec.key.luma", "Luma Key", "სიკაშკაშის გასაღები"),
|
||||
("ec.key.screen", "Screen Key", "ეკრანის გასაღები"),
|
||||
("ec.key.spill", "Spill Suppressor", "ფერის გადაღვრის ჩამხშობი"),
|
||||
("ec.key.unmult", "Unmult", "Unmult"),
|
||||
("ec.keying.keylight", "Key Light", "Key Light"),
|
||||
("ec.matte.mattechoker", "Matte Choker", "მატის შემკუმშველი"),
|
||||
("ec.matte.objectmatte", "Object Matte", "ობიექტის მატი"),
|
||||
("ec.matte.refinehard", "Refine Hard Matte", "მკვეთრი მატის დახვეწა"),
|
||||
("ec.matte.refinesoft", "Refine Soft Matte", "რბილი მატის დახვეწა"),
|
||||
("ec.matte.rotobrush", "Roto Brush & Refine Edge", "როტო-ფუნჯი და კიდის დახვეწა"),
|
||||
("ec.matte.simplechoker", "Simple Choker", "მარტივი შემკუმშველი"),
|
||||
("ec.noise.addgrain", "Add Grain", "მარცვლოვნების დამატება"),
|
||||
("ec.noise.curlnoise", "Curl Noise", "გრიგალური ხმაური"),
|
||||
("ec.noise.dustscratches", "Dust & Scratches", "მტვერი და ნაკაწრები"),
|
||||
("ec.noise.fractal", "Fractal Noise", "ფრაქტალური ხმაური"),
|
||||
("ec.noise.matchgrain", "Match Grain", "მარცვლოვნების მისადაგება"),
|
||||
("ec.noise.median", "Median", "მედიანა"),
|
||||
("ec.noise.medianlegacy", "Median (Legacy)", "მედიანა (მოძველებული)"),
|
||||
("ec.noise.noise", "Noise", "ხმაური"),
|
||||
("ec.noise.noisealpha", "Noise Alpha", "ალფა-ხმაური"),
|
||||
("ec.noise.noisehls", "Noise HLS", "HLS ხმაური"),
|
||||
("ec.noise.noisehlsauto", "Noise HLS Auto", "HLS ხმაური (ავტომატური)"),
|
||||
("ec.noise.removegrain", "Remove Grain", "მარცვლოვნების მოცილება"),
|
||||
("ec.noise.turbulent", "Turbulent Noise", "ტურბულენტური ხმაური"),
|
||||
("ec.obsolete.basic3d", "Basic 3D", "საბაზო 3D"),
|
||||
("ec.obsolete.basictext", "Basic Text", "საბაზო ტექსტი"),
|
||||
("ec.obsolete.gaussianlegacy", "Gaussian Blur (Legacy)", "გაუსის გაბუნდოვნება (მოძველებული)"),
|
||||
("ec.obsolete.lightning", "Lightning", "ელვა"),
|
||||
("ec.obsolete.mochashape", "Mocha shape", "Mocha-ს ფიგურა"),
|
||||
("ec.obsolete.pathtext", "Path Text", "ტექსტი ტრაექტორიაზე"),
|
||||
("ec.paint.paint", "Paint", "ხატვა"),
|
||||
("ec.perspective.3dglasses", "3D Glasses", "3D სათვალე"),
|
||||
("ec.perspective.bevelalpha", "Bevel Alpha", "ალფას ფასკა"),
|
||||
("ec.perspective.beveledges", "Bevel Edges", "კიდეების ფასკა"),
|
||||
("ec.perspective.cameratracker", "3D Camera Tracker", "3D კამერის ტრეკერი"),
|
||||
("ec.perspective.cccylinder", "CC Cylinder", "CC Cylinder"),
|
||||
("ec.perspective.ccenvironment", "CC Environment", "CC Environment"),
|
||||
("ec.perspective.ccsphere", "CC Sphere", "CC Sphere"),
|
||||
("ec.perspective.ccspotlight", "CC Spotlight", "CC Spotlight"),
|
||||
("ec.perspective.dropshadow", "Drop Shadow", "ჩრდილი"),
|
||||
("ec.perspective.radialshadow", "Radial Shadow", "რადიალური ჩრდილი"),
|
||||
("ec.sim.carddance", "Card Dance", "მოცეკვავე ბარათები"),
|
||||
("ec.sim.caustics", "Caustics", "კაუსტიკა"),
|
||||
("ec.sim.ccballaction", "CC Ball Action", "CC Ball Action"),
|
||||
("ec.sim.ccbubbles", "CC Bubbles", "CC Bubbles"),
|
||||
("ec.sim.ccdrizzle", "CC Drizzle", "CC Drizzle"),
|
||||
("ec.sim.cchair", "CC Hair", "CC Hair"),
|
||||
("ec.sim.ccmrmercury", "CC Mr. Mercury", "CC Mr. Mercury"),
|
||||
("ec.sim.ccparticlesystems2", "CC Particle Systems II", "CC Particle Systems II"),
|
||||
("ec.sim.ccparticleworld", "CC Particle World", "CC Particle World"),
|
||||
("ec.sim.ccpixelpolly", "CC Pixel Polly", "CC Pixel Polly"),
|
||||
("ec.sim.ccrainfall", "CC Rainfall", "CC Rainfall"),
|
||||
("ec.sim.ccscatterize", "CC Scatterize", "CC Scatterize"),
|
||||
("ec.sim.ccsnowfall", "CC Snowfall", "CC Snowfall"),
|
||||
("ec.sim.ccstarburst", "CC Star Burst", "CC Star Burst"),
|
||||
("ec.sim.foam", "Foam", "ქაფი"),
|
||||
("ec.sim.particleplayground", "Particle Playground", "ნაწილაკების სიმულაცია"),
|
||||
("ec.sim.shatter", "Shatter", "დამსხვრევა"),
|
||||
("ec.sim.waveworld", "Wave World", "ტალღების სამყარო"),
|
||||
("ec.stylize.brushstrokes", "Brush Strokes", "ფუნჯის შტრიხები"),
|
||||
("ec.stylize.cartoon", "Cartoon", "მულტფილმის სტილი"),
|
||||
("ec.stylize.ccblockload", "CC Block Load", "CC Block Load"),
|
||||
("ec.stylize.ccburnfilm", "CC Burn Film", "CC Burn Film"),
|
||||
("ec.stylize.ccglass", "CC Glass", "CC Glass"),
|
||||
("ec.stylize.cchextile", "CC HexTile", "CC HexTile"),
|
||||
("ec.stylize.cckaleida", "CC Kaleida", "CC Kaleida"),
|
||||
("ec.stylize.ccmrsmoothie", "CC Mr. Smoothie", "CC Mr. Smoothie"),
|
||||
("ec.stylize.ccplastic", "CC Plastic", "CC Plastic"),
|
||||
("ec.stylize.ccrepetile", "CC RepeTile", "CC RepeTile"),
|
||||
("ec.stylize.ccthreshold", "CC Threshold", "CC Threshold"),
|
||||
("ec.stylize.ccthresholdrgb", "CC Threshold RGB", "CC Threshold RGB"),
|
||||
("ec.stylize.ccvignette", "CC Vignette", "CC Vignette"),
|
||||
("ec.stylize.coloremboss", "Color Emboss", "ფერადი რელიეფი"),
|
||||
("ec.stylize.emboss", "Emboss", "რელიეფი"),
|
||||
("ec.stylize.findedges", "Find Edges", "კიდეების პოვნა"),
|
||||
("ec.stylize.glow", "Glow", "ნათება"),
|
||||
("ec.stylize.mosaic", "Mosaic", "მოზაიკა"),
|
||||
("ec.stylize.motiontile", "Motion Tile", "მოძრავი ფილები"),
|
||||
("ec.stylize.posterize", "Posterize", "პოსტერიზაცია"),
|
||||
("ec.stylize.roughenedges", "Roughen Edges", "კიდეების დაუხეშება"),
|
||||
("ec.stylize.scatter", "Scatter", "გაბნევა"),
|
||||
("ec.stylize.strobe", "Strobe Light", "სტრობოსკოპი"),
|
||||
("ec.stylize.texturize", "Texturize", "ტექსტურირება"),
|
||||
("ec.stylize.threshold", "Threshold", "ზღვარი"),
|
||||
("ec.text.numbers", "Numbers", "რიცხვები"),
|
||||
("ec.text.timecode", "Timecode", "თაიმკოდი"),
|
||||
("ec.time.ccforcemotionblur", "CC Force Motion Blur", "CC Force Motion Blur"),
|
||||
("ec.time.ccwidetime", "CC Wide Time", "CC Wide Time"),
|
||||
("ec.time.echo", "Echo", "ექო"),
|
||||
("ec.time.pixelmotionblur", "Pixel Motion Blur", "პიქსელების მოძრაობის გაბუნდოვნება"),
|
||||
("ec.time.posterizetime", "Posterize Time", "დროის პოსტერიზაცია"),
|
||||
("ec.time.timedifference", "Time Difference", "დროითი სხვაობა"),
|
||||
("ec.time.timedisplacement", "Time Displacement", "დროითი წანაცვლება"),
|
||||
("ec.time.timewarp", "Timewarp", "Timewarp"),
|
||||
("ec.transition.blockdissolve", "Block Dissolve", "ბლოკური გადადნობა"),
|
||||
("ec.transition.cardwipe", "Card Wipe", "ბარათებით წმენდა"),
|
||||
("ec.transition.ccglasswipe", "CC Glass Wipe", "CC Glass Wipe"),
|
||||
("ec.transition.ccgridwipe", "CC Grid Wipe", "CC Grid Wipe"),
|
||||
("ec.transition.ccimagewipe", "CC Image Wipe", "CC Image Wipe"),
|
||||
("ec.transition.ccjaws", "CC Jaws", "CC Jaws"),
|
||||
("ec.transition.cclightwipe", "CC Light Wipe", "CC Light Wipe"),
|
||||
("ec.transition.cclinesweep", "CC Line Sweep", "CC Line Sweep"),
|
||||
("ec.transition.ccradialscalewipe", "CC Radial ScaleWipe", "CC Radial ScaleWipe"),
|
||||
("ec.transition.ccscalewipe", "CC Scale Wipe", "CC Scale Wipe"),
|
||||
("ec.transition.cctwister", "CC Twister", "CC Twister"),
|
||||
("ec.transition.ccwarpomatic", "CC WarpoMatic", "CC WarpoMatic"),
|
||||
("ec.transition.gradientwipe", "Gradient Wipe", "გრადიენტული წმენდა"),
|
||||
("ec.transition.iriswipe", "Iris Wipe", "დიაფრაგმული წმენდა"),
|
||||
("ec.transition.linearwipe", "Linear Wipe", "წრფივი წმენდა"),
|
||||
("ec.transition.radialwipe", "Radial Wipe", "რადიალური წმენდა"),
|
||||
("ec.transition.venetian", "Venetian Blinds", "ჟალუზი"),
|
||||
("ec.utility.applylut", "Apply Color LUT", "ფერის LUT-ის გამოყენება"),
|
||||
("ec.utility.ccoverbrights", "CC Overbrights", "CC Overbrights"),
|
||||
("ec.utility.cineon", "Cineon Converter", "Cineon-ის გარდამქმნელი"),
|
||||
("ec.utility.colorprofileconverter", "Color Profile Converter", "ფერის პროფილის გარდამქმნელი"),
|
||||
("ec.utility.facemeasurements", "Face Measurements", "სახის გაზომვები"),
|
||||
("ec.utility.facetrackpoints", "Face Track Points", "სახის ტრეკინგის წერტილები"),
|
||||
("ec.utility.growbounds", "Grow Bounds", "საზღვრების გაზრდა"),
|
||||
("ec.utility.hdrcompander", "HDR Compander", "HDR კომპანდერი"),
|
||||
("ec.utility.hdrcompression", "HDR Highlight Compression", "HDR ღია ტონების შეკუმშვა"),
|
||||
("ec.vr.blur", "VR Blur", "VR გაბუნდოვნება"),
|
||||
("ec.vr.chromaticaberrations", "VR Chromatic Aberrations", "VR ქრომატული აბერაციები"),
|
||||
("ec.vr.colorgradients", "VR Color Gradients", "VR ფერადი გრადიენტები"),
|
||||
("ec.vr.converter", "VR Converter", "VR გარდამქმნელი"),
|
||||
("ec.vr.denoise", "VR De-Noise", "VR ხმაურის მოცილება"),
|
||||
("ec.vr.digitalglitch", "VR Digital Glitch", "VR ციფრული ხარვეზი"),
|
||||
("ec.vr.fractalnoise", "VR Fractal Noise", "VR ფრაქტალური ხმაური"),
|
||||
("ec.vr.glow", "VR Glow", "VR ნათება"),
|
||||
("ec.vr.planetosphere", "VR Plane to Sphere", "VR სიბრტყიდან სფეროზე"),
|
||||
("ec.vr.rotatesphere", "VR Rotate Sphere", "VR სფეროს შემობრუნება"),
|
||||
("ec.vr.sharpen", "VR Sharpen", "VR სიმკვეთრე"),
|
||||
("ec.vr.spheretoplane", "VR Sphere to Plane", "VR სფეროდან სიბრტყეზე"),
|
||||
];
|
||||
|
||||
/// Georgian (`ka`) category labels, keyed by the registry's English category.
|
||||
const GEORGIAN_CATEGORIES: &[(&str, &str)] = &[
|
||||
("3D Channel", "3D არხი"),
|
||||
("Audio", "აუდიო"),
|
||||
("Blur & Sharpen", "გაბუნდოვნება და სიმკვეთრე"),
|
||||
("Channel", "არხი"),
|
||||
("Color Correction", "ფერის კორექცია"),
|
||||
("Distort", "დამახინჯება"),
|
||||
("Expression Controls", "ექსპრესიის მართვა"),
|
||||
("Generate", "გენერაცია"),
|
||||
("Immersive Video", "იმერსიული ვიდეო"),
|
||||
("Keying", "კეიინგი"),
|
||||
("Matte", "მატი"),
|
||||
("Noise & Grain", "ხმაური და მარცვლოვნება"),
|
||||
("Obsolete", "მოძველებული"),
|
||||
("Paint", "ხატვა"),
|
||||
("Perspective", "პერსპექტივა"),
|
||||
("Simulation", "სიმულაცია"),
|
||||
("Stylize", "სტილიზაცია"),
|
||||
("Text", "ტექსტი"),
|
||||
("Time", "დრო"),
|
||||
("Transition", "გადასვლა"),
|
||||
("Utility", "დამხმარე"),
|
||||
];
|
||||
|
||||
/// The 21 category folder names the generated Effect menu and Effects & Presets draw, in
|
||||
/// Simplified Chinese. Read from the installed After Effects 2026 (26.5.0.89) Simplified Chinese
|
||||
/// interface (the checklist's `07-类别` sheet); two of them are the interface's own wording where
|
||||
@@ -554,7 +896,9 @@ mod tests {
|
||||
for category in &categories {
|
||||
assert!(SIMPLIFIED_CHINESE_CATEGORIES.iter().any(|(english, _)| english == category), "no catalog row for category {category}");
|
||||
}
|
||||
for (language, rows) in [("zh-hans", SIMPLIFIED_CHINESE_CATEGORIES), ("zh-hant", TRADITIONAL_CHINESE_CATEGORIES), ("ja", JAPANESE_CATEGORIES)] {
|
||||
for (language, rows) in
|
||||
[("zh-hans", SIMPLIFIED_CHINESE_CATEGORIES), ("zh-hant", TRADITIONAL_CHINESE_CATEGORIES), ("ja", JAPANESE_CATEGORIES), ("ka", GEORGIAN_CATEGORIES)]
|
||||
{
|
||||
for (english, translated) in rows {
|
||||
assert!(categories.contains(english), "{language} lists {english}, which is not a category");
|
||||
assert!(!translated.is_empty(), "empty {language} translation for {english}");
|
||||
@@ -562,6 +906,26 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
/// Georgian has a row for every effect the zh-hans catalog has, in the same order and naming
|
||||
/// the same effect, and a label for every category; repeats and renames keep their index.
|
||||
#[test]
|
||||
fn georgian_names_every_effect_and_category() {
|
||||
let hans: Vec<(&str, &str)> = SIMPLIFIED_CHINESE.iter().map(|(id, en, _)| (*id, *en)).collect();
|
||||
let ka: Vec<(&str, &str)> = GEORGIAN.iter().map(|(id, en, _)| (*id, *en)).collect();
|
||||
assert_eq!(hans, ka, "the Georgian effect rows differ from the zh-hans ones");
|
||||
assert!(GEORGIAN.iter().all(|(_, _, translated)| !translated.is_empty()), "an empty Georgian effect name");
|
||||
for category in effects::categories() {
|
||||
assert!(GEORGIAN_CATEGORIES.iter().any(|(english, _)| *english == category), "no Georgian row for category {category}");
|
||||
}
|
||||
set_current("ka");
|
||||
assert_eq!(name("ec.blur.gaussian", "Gaussian Blur"), "გაუსის გაბუნდოვნება");
|
||||
assert_eq!(group("ec.blur.gaussian", "Gaussian Blur 2"), "გაუსის გაბუნდოვნება 2");
|
||||
assert_eq!(group("ec.blur.gaussian", "My Blur"), "My Blur");
|
||||
assert_eq!(category("Blur & Sharpen"), "გაბუნდოვნება და სიმკვეთრე");
|
||||
assert!(matches("ec.blur.gaussian", "Gaussian Blur", "გაუსის"));
|
||||
set_current("en");
|
||||
}
|
||||
|
||||
/// A repeated effect carries the index the engine appends to the group name; a name the user
|
||||
/// typed in Effect Controls stays verbatim.
|
||||
#[test]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -206,6 +206,8 @@ pub fn build(app: &EffectcraftApp) -> NativeMenu {
|
||||
"Serviços"
|
||||
} else if crate::i18n::czech(app) {
|
||||
"Služby"
|
||||
} else if crate::i18n::georgian(app) {
|
||||
"სერვისები"
|
||||
} else {
|
||||
"Services"
|
||||
}
|
||||
@@ -489,6 +491,27 @@ mod tests {
|
||||
assert_eq!(translated, ["Služby", "Skrýt EffectCraft", "Skrýt ostatní", "Zobrazit vše"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn georgian_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": "ka"})).unwrap();
|
||||
fn labels(nodes: &[NativeNode], out: &mut Vec<String>) {
|
||||
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, ["სერვისები", "EffectCraft-ის დამალვა", "სხვების დამალვა", "ყველას ჩვენება"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hide_items_are_predefined_on_macos() {
|
||||
let spec = build(&app());
|
||||
|
||||
@@ -120,7 +120,9 @@ pub fn show(app: &mut EffectcraftApp, ui: &mut egui::Ui, rect: Rect) {
|
||||
divider(&p, x0, w, y - 4.0, &t);
|
||||
section_header(app, ui, &p, x0, w, y + 4.0, "Text Animation", "properties.textAnimation");
|
||||
y += ROW_H + 10.0;
|
||||
let br = Rect::from_min_size(pos2(x0, y), vec2(116.0, 24.0));
|
||||
// Both buttons grow with their (translated) labels; English keeps its 116 / 84 px.
|
||||
let text_w = |s: &str| p.layout_no_wrap(s.to_string(), Tokens::ui(12.0), t.text).size().x;
|
||||
let br = Rect::from_min_size(pos2(x0, y), vec2(116f32.max(text_w(crate::i18n::tr("Add Animator")) + 36.0), 24.0));
|
||||
let resp = ui.interact(br, egui::Id::new("props-add-animator"), Sense::click());
|
||||
p.rect_stroke(br, 4.0, Stroke::new(1.0, if resp.hovered() { t.text_dim } else { t.field_border }), egui::StrokeKind::Inside);
|
||||
icons::paint(&p, Rect::from_center_size(pos2(br.min.x + 14.0, br.center().y), vec2(10.0, 10.0)), Icon::Plus, t.text);
|
||||
@@ -142,7 +144,7 @@ pub fn show(app: &mut EffectcraftApp, ui: &mut egui::Ui, rect: Rect) {
|
||||
}
|
||||
}
|
||||
// Our own presets (original work, see presets/text_animators.json).
|
||||
let pr = Rect::from_min_size(pos2(br.max.x + 8.0, y), vec2(84.0, 24.0));
|
||||
let pr = Rect::from_min_size(pos2(br.max.x + 8.0, y), vec2(84f32.max(text_w(crate::i18n::tr("Presets")) + 16.0), 24.0));
|
||||
let presp = ui.interact(pr, egui::Id::new("props-text-presets"), Sense::click());
|
||||
p.rect_stroke(pr, 4.0, Stroke::new(1.0, if presp.hovered() { t.text_dim } else { t.field_border }), egui::StrokeKind::Inside);
|
||||
p.text(pr.center(), Align2::CENTER_CENTER, crate::i18n::tr("Presets"), Tokens::ui(12.0), t.text);
|
||||
|
||||
+3
-3
@@ -72,7 +72,7 @@ are grouped by area; the issue tracker has the rest.
|
||||
| 13 | **3D model formats and materials** | After Effects 26 imports FBX, USD/USDZ, STL besides glTF and OBJ (`usd_plugins`), and Substance 3D materials with mesh displacement (26.0–26.2); we read glTF, OBJ, STL (binary and ASCII, with facet colours) and FBX 7.x (binary and ASCII: meshes, hierarchy, Lambert/Phong materials and textures; no FBX animation or skinning yet) | Product shots and 3D scenes come as FBX/USDZ | 25–45 h | — · [file-format-parity.md](file-format-parity.md) |
|
||||
| 14 | **Object Matte** (26.2, disk cache in 26.5) | First slice (#783): the Object Matte effect (Effect ▸ Matte) and `objectMatte.apply` turn a point (and optional box) on a reference frame into a matte and follow the object up to 600 frames each way, or segment every frame on its own; Roto Brush's engine, cache and model (MobileSAM from Settings ▸ Roto Brush, classical graph cut without it). Since then: the Object Matte tool in the viewer (click / drag a box, hover crosshair), the box as the model's box prompt, background tracking with progress and cancel, Freeze, and segmentations kept in the disk cache (26.5). Missing: a comparison with After Effects ([plan](fidelity/object-matte.md)) | The new one-click roto | 10–20 h | G7 · [target-app-parity.md](target-app-parity.md) |
|
||||
| 15 | **Hardware video decode and encode** | No VideoToolbox, NVENC, Quick Sync or VA-API; #498 asks for it (answered: CUDA / NVENC need Nvidia's proprietary SDK through FFI, which the no-`unsafe` rule forbids); open PR #819 adds hardware decoding via `filmcraft-platform`; FilmCraft has VideoToolbox / NVENC / VA-API paths to borrow | 4K playback and export speed | 25–45 h | G5/G6 · [hardware-parity.md](hardware-parity.md) |
|
||||
| 16 | **Localization depth** | Menus in 10 languages (ja, zh-hans, zh-hant, uk, es, pt-br, ru, fr, de, cs: 624 rows each); panels in 6 (ja, zh-hans, zh-hant, uk, pt-br, cs); effect names translated in Simplified Chinese (306, plus the generated Effect menu), their ~1,650 parameter names untranslated; Korean and Italian (After Effects ships them) absent; Hangul probe added (#599 closed) | After Effects is used heavily in Japan, China, Korea, Brazil, Europe | 60–110 h + native review | G9 · [localization-parity.md](localization-parity.md) |
|
||||
| 16 | **Localization depth** | Menus in 11 languages (ja, zh-hans, zh-hant, uk, es, pt-br, ru, fr, de, cs, ka: 624 rows each); panels in 7 (ja, zh-hans, zh-hant, uk, pt-br, cs, ka); effect names translated in Simplified Chinese and Georgian (306, plus the generated Effect menu), their ~1,650 parameter names untranslated; Korean and Italian (After Effects ships them) absent; Hangul probe added (#599 closed) | After Effects is used heavily in Japan, China, Korea, Brazil, Europe | 60–110 h + native review | G9 · [localization-parity.md](localization-parity.md) |
|
||||
| 17 | **Media Browser lists files import refuses** | `media_browser.rs` lists AVI; `media::is_importable` has none of them (Targa and Radiance HDR import since #745; DPX and Cineon since #756, log shown as stored: no Cineon Settings conversion yet; MXF OP1a / OP-Atom since #767; FilmCraft has no AVI demuxer); #431 and #324 closed | Confusing failures on common VFX formats | 15–30 h | G6 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 18 | **Relative paths and relinking** | Projects store absolute footage paths; no relink when a project moves | Moving or sharing a project breaks it | 6–12 h | G4 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 19 | **Plug-in ecosystem** | No After Effects SDK hosting (#600, #327 OpenFX, #334, #376 plug-in manager); our WebAssembly API has no third-party plug-ins | Many pro projects depend on Trapcode, Element, Saber… | 40–80 h for API growth; SDK hosting needs an owner decision | G8 · [scripting-parity.md](scripting-parity.md) |
|
||||
@@ -300,8 +300,8 @@ Issues #41–#47 (all from the Linux AppImage 0.1.1, 5 October): panning the vie
|
||||
|
||||
- Localisation of the interface ([localization-parity.md](localization-parity.md)): since 6–12
|
||||
October the menus are translated into Japanese, Simplified and Traditional Chinese, Ukrainian,
|
||||
Spanish, Brazilian Portuguese, Russian, French, German and Czech, and the panel catalog covers
|
||||
Japanese, both Chinese, Ukrainian, Brazilian Portuguese and Czech. Next: effect and parameter
|
||||
Spanish, Brazilian Portuguese, Russian, French, German, Czech and Georgian, and the panel catalog covers
|
||||
Japanese, both Chinese, Ukrainian, Brazilian Portuguese, Czech and Georgian. Next: effect and parameter
|
||||
names, the remaining panel strings (Spanish, Russian, French, German), Korean and Italian, and
|
||||
native-speaker review of all of them.
|
||||
- Accessibility (keyboard navigation, screen readers, contrast), user documentation and
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Localization parity
|
||||
|
||||
> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-12 · **Change:** minor (catalogs recounted at `upstream/main` 470ea7a3: menus in 10 languages, panels in 6, Hangul probe (#599)) · **Target:** Adobe After Effects 2026
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (catalogs recounted at `upstream/main` 470ea7a3: menus in 10 languages, panels in 6, Hangul probe (#599); Georgian: menus, panels and effect names) · **Target:** Adobe After Effects 2026
|
||||
|
||||
How much of EffectCraft's interface is translated, language by language, compared with After
|
||||
Effects. [gaps.md](gaps.md) gap 16 and workstream G9 hold the work;
|
||||
@@ -24,9 +24,9 @@ interface; Arabic and Hebrew text *in layers* is supported through its Middle Ea
|
||||
- **Panels, dialogs, buttons, tooltips:** `crates/ui-egui/src/i18n/ui.rs`, keyed by the English
|
||||
source string, with English fallback. Catalogs exist for Japanese (410 rows), Simplified and
|
||||
Traditional Chinese (506 each), Ukrainian (505), Brazilian Portuguese (400) and Czech (501);
|
||||
counted at 470ea7a3.
|
||||
counted at 470ea7a3; Georgian has every row the Chinese catalogs have.
|
||||
- **Effect names:** `crates/ui-egui/src/i18n/effects.rs`, keyed by **effect id**, in Simplified
|
||||
Chinese (306 rows, one per effect in the registry, plus its 21 categories). The registry's
|
||||
Chinese and Georgian (306 rows, one per effect in the registry, plus its 21 categories). The registry's
|
||||
English name stays the effect's identity: `effect.list`, `effect.apply {"effect": …}`, scripts
|
||||
and expressions match on it, and the property tree stores it as the effect group's name. Only
|
||||
the drawing — the Effect menu, Effect Controls, the Timeline and Effects & Presets — goes
|
||||
@@ -76,13 +76,14 @@ the true percentages are slightly lower.
|
||||
| Korean | `ko` | 0 | — | Hangul fallback probe added (#599, closed); not checked on macOS here | 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 (3):
|
||||
Other languages EffectCraft ships (4):
|
||||
|
||||
| Language | Code | UI strings translated | Status | To `full` |
|
||||
|---|---|---|---|---|
|
||||
| Traditional Chinese | `zh-hant` | 1,130 (≈ 29%): menus 624 rows, panels 506 | partial | 6–9 h + review |
|
||||
| Ukrainian | `uk` | 1,129 (≈ 29%): menus 624 rows, panels 505 | partial | 6–9 h + review |
|
||||
| Czech | `cs` | 1,125 (≈ 29%): menus 624 rows, panels 501 | 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 |
|
||||
| Georgian | `ka` | 1,510 (≈ 38%): menus 628 rows, panels 882 (the Chinese catalogs' 687 plus 195 Georgian-only rows: form dialogs, context menus, column headers), effect names 307 + 21 categories; native-speaker reviewed | partial | 5–8 h |
|
||||
|
||||
Russian (`ru`) has a menu catalog (624 rows, ≈ 16%); After Effects also ships Italian, which EffectCraft does not (8–12 h).
|
||||
|
||||
@@ -104,6 +105,7 @@ can give; none has had it.
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-12 | minor | Recounted: Russian, French, German and Czech menus (#873, #987), Brazilian Portuguese and Czech panels (#830, #987), Hangul probe (#599); overall ≈ 12% to ≈ 18%; Korean and Italian still absent |
|
||||
| 2026-10-14 | minor | Georgian (`ka`): menus 628, panels 882 (195 Georgian-only, in `GEORGIAN_PANELS`), effect names and categories in `effects.rs` |
|
||||
| 2026-10-10 | major | First localization parity document: catalog rows counted for all six languages, the twelve-language table, After Effects' 11 shipped languages from its bundle |
|
||||
| 2026-10-11 | minor | Ukrainian panel catalog brought level with the Chinese ones (495 of 496 rows, counted at this commit); its share rises to ≈ 29%. The other languages' panel counts are the 10 October measurement |
|
||||
| 2026-10-13 | minor | Effect names and the generated Effect menu leave English: `i18n/effects.rs` adds 306 rows keyed by effect id (Simplified Chinese, from After Effects 2026's interface and Adobe's Chinese documentation for the `CC` series) and the 21 category names. Parameter names are still English; no other language has rows |
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ Commands (CLI, MCP, control channel):
|
||||
|
||||
### Settings that change behaviour
|
||||
|
||||
- `general.language`: interface language (`system` / `en` / `ja` / `zh-hans` / `zh-hant` / `uk` / `es` / `pt-br`), Settings ▸ General ▸ Language; menu labels change immediately. `system` (Match System, the default) follows the operating system's interface language where EffectCraft has a translation and is English otherwise: a Simplified Chinese locale (`zh`, `zh-CN`, `zh_CN.UTF-8`, `zh-Hans-CN`, `zh-SG`) selects `zh-hans`, a Traditional one (`zh-TW`, `zh-HK`, `zh-Hant`, `zh_MO`) selects `zh-hant`, a Ukrainian one (`uk`, `uk-UA`, `uk_UA.UTF-8`) selects `uk`, a Spanish one (`es`, `es-ES`, `es_MX.UTF-8`) selects `es`, a Portuguese one (`pt`, `pt-BR`, `pt_PT.UTF-8`) selects `pt-br`; the browser build follows `?lang=` in the address, then the browser's languages (`navigator.languages`). Choose **Español** or **Português (Brasil)** for Spanish or Brazilian Portuguese menus (panels stay in English for now); choose **Українська** for Ukrainian menus and cataloged panel, dialog, button and tooltip text; Ukrainian uses the bundled UI fonts. Native Japanese, Simplified and Traditional Chinese UI uses installed system fonts; the web host must supply a Japanese font. The same setting picks the CJK fallback for the interface *and* the Han preference of the text engine, so the composition's own text is drawn with the same language's glyph forms (the text engine's preference is process-global); swapping the language reinstalls the fonts, so it applies without a restart. Two catalogs back the text: the menus are keyed by `(command, English label)` (`crates/ui-egui/src/i18n.rs`), and the rest of the interface - panels, dialogs, buttons, tooltips - is keyed by its English source string (`crates/ui-egui/src/i18n/ui.rs`, with rows for Japanese, Simplified and Traditional Chinese and Ukrainian), where a panel writes `tr("Rename")`, or `tr_args("Proxy Use: {}", &[&quality])` when the row carries a value. A row that is missing falls back to English, so a new string shows up untranslated rather than empty; the tests in that module fail on an unused row and on a hard-coded string in a converted panel.
|
||||
- `general.language`: interface language (`system` / `en` / `ja` / `zh-hans` / `zh-hant` / `uk` / `es` / `pt-br` / `ka`), Settings ▸ General ▸ Language; menu labels change immediately. `system` (Match System, the default) follows the operating system's interface language where EffectCraft has a translation and is English otherwise: a Simplified Chinese locale (`zh`, `zh-CN`, `zh_CN.UTF-8`, `zh-Hans-CN`, `zh-SG`) selects `zh-hans`, a Traditional one (`zh-TW`, `zh-HK`, `zh-Hant`, `zh_MO`) selects `zh-hant`, a Ukrainian one (`uk`, `uk-UA`, `uk_UA.UTF-8`) selects `uk`, a Spanish one (`es`, `es-ES`, `es_MX.UTF-8`) selects `es`, a Portuguese one (`pt`, `pt-BR`, `pt_PT.UTF-8`) selects `pt-br`, a Georgian one (`ka`, `ka-GE`, `ka_GE.UTF-8`) selects `ka`; the browser build follows `?lang=` in the address, then the browser's languages (`navigator.languages`). Choose **Español** or **Português (Brasil)** for Spanish or Brazilian Portuguese menus (panels stay in English for now); choose **Українська** for Ukrainian menus and cataloged panel, dialog, button and tooltip text; Ukrainian uses the bundled UI fonts. Native Japanese, Simplified and Traditional Chinese UI uses installed system fonts; the web host must supply a Japanese font. The same setting picks the CJK fallback for the interface *and* the Han preference of the text engine, so the composition's own text is drawn with the same language's glyph forms (the text engine's preference is process-global); swapping the language reinstalls the fonts, so it applies without a restart. Two catalogs back the text: the menus are keyed by `(command, English label)` (`crates/ui-egui/src/i18n.rs`), and the rest of the interface - panels, dialogs, buttons, tooltips - is keyed by its English source string (`crates/ui-egui/src/i18n/ui.rs`, with rows for Japanese, Simplified and Traditional Chinese and Ukrainian), where a panel writes `tr("Rename")`, or `tr_args("Proxy Use: {}", &[&quality])` when the row carries a value. A row that is missing falls back to English, so a new string shows up untranslated rather than empty; the tests in that module fail on an unused row and on a hard-coded string in a converted panel.
|
||||
- `general.undoLevels`: Levels of Undo
|
||||
- `general.pathPointSize`: Path Point and Handle Size
|
||||
- `general.recentItems`: Recent Projects Shown
|
||||
|
||||
Reference in New Issue
Block a user