From 65f55d65ea9681ab40ec50c24a204f3b90cece5f Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Tue, 3 Nov 2026 16:03:59 -0800 Subject: [PATCH] .ai save: errors and notes name the legacy or non-PDF-compatible .ai Option errors and notes for a .ai save called the file a "PDF-compatible .ai" even when the save wrote a version 7 file (aiVersion: "7") or a file without PDF content (pdfCompatible: false). - Option errors: a version 7 .ai is now called a "legacy .ai (version 7)" in the errors for its artboard, artboards and range options. A .ai saved without PDF content is called a "non-PDF-compatible .ai" in every .ai option error (includeLinked and embedProfiles included), and a "non-PDF-compatible .ait template" when Save as Template writes it. aiVersion: "7" takes precedence over pdfCompatible: false, as it does when the file is written. - The error for encoding a version 7 .ai of several artboards as one file names the legacy .ai. - The note for a native option the file does not read (version, preview, precision) names the same kind of file. - The error for aiVersion: "7" on a .ait template no longer says that a .ait template is always PDF-compatible, since Save as Template writes one without PDF content. It now reads "aiVersion 7 writes legacy .ai files, not .ait templates", with its rows in the message catalogs updated. A PDF-compatible file keeps its name. --- crates/engine/src/cmd/fileio/encode.rs | 5 ++- crates/engine/src/cmd/fileio/legacy_ai.rs | 12 +++++-- crates/engine/src/cmd/fileio/save.rs | 38 ++++++++++++++++++----- crates/engine/src/tests/legacy_ai.rs | 25 +++++++++++++++ crates/engine/src/tests/saveoptions.rs | 27 ++++++++++++++++ crates/ui-egui/src/i18n/bs.tsv | 2 +- crates/ui-egui/src/i18n/ca.tsv | 2 +- crates/ui-egui/src/i18n/cs.tsv | 2 +- crates/ui-egui/src/i18n/de.tsv | 2 +- crates/ui-egui/src/i18n/el.tsv | 2 +- crates/ui-egui/src/i18n/es.tsv | 2 +- crates/ui-egui/src/i18n/fi.tsv | 2 +- crates/ui-egui/src/i18n/fr.tsv | 2 +- crates/ui-egui/src/i18n/hu.tsv | 2 +- crates/ui-egui/src/i18n/it.tsv | 2 +- crates/ui-egui/src/i18n/ja.tsv | 2 +- crates/ui-egui/src/i18n/ka.tsv | 2 +- crates/ui-egui/src/i18n/ko.tsv | 2 +- crates/ui-egui/src/i18n/pl.tsv | 2 +- crates/ui-egui/src/i18n/pt-br.tsv | 2 +- crates/ui-egui/src/i18n/ru.tsv | 2 +- crates/ui-egui/src/i18n/sv.tsv | 2 +- crates/ui-egui/src/i18n/tr.tsv | 2 +- crates/ui-egui/src/i18n/uk.tsv | 2 +- crates/ui-egui/src/i18n/vi.tsv | 2 +- crates/ui-egui/src/i18n/zh-hans.tsv | 2 +- crates/ui-egui/src/i18n/zh-hant.tsv | 2 +- 27 files changed, 117 insertions(+), 34 deletions(-) diff --git a/crates/engine/src/cmd/fileio/encode.rs b/crates/engine/src/cmd/fileio/encode.rs index a80701071..b125e48a8 100644 --- a/crates/engine/src/cmd/fileio/encode.rs +++ b/crates/engine/src/cmd/fileio/encode.rs @@ -420,7 +420,10 @@ pub fn encode(doc: &Document, format: &str, p: &Value) -> Result> { /// font; PDF, EPS, SVG, EMF, WMF and the raster formats: type that doesn't fit its frame). pub fn encode_with_warnings(doc: &Document, format: &str, p: &Value) -> Result<(Vec, Vec)> { let f = super::writable(C, Some(format), None)?; - encode_all(doc, f.id, p)?.single(f) + let enc = encode_all(doc, f.id, p)?; + // The error for a version 7 .ai of several artboards names the legacy .ai. + let legacy = f.id == "ai" && super::legacy_ai::wanted(C, f, p)?; + enc.single(&if legacy { super::legacy_ai::named(f) } else { *f }) } /// [`encode`], with every file the export writes. diff --git a/crates/engine/src/cmd/fileio/legacy_ai.rs b/crates/engine/src/cmd/fileio/legacy_ai.rs index 1d9d23590..d4820242d 100644 --- a/crates/engine/src/cmd/fileio/legacy_ai.rs +++ b/crates/engine/src/cmd/fileio/legacy_ai.rs @@ -41,7 +41,7 @@ use super::super::{Affine, EngineError, NodeId, Result, bad}; use super::{ArtboardPick, Encoded, Format}; /// Does `p` ask a save in `f` for a legacy `.ai` file of version 7 (`aiVersion: "7"`)? An unknown -/// version is an error, and so is version 7 for a `.ait` template, which is PDF-compatible only. +/// version is an error, and so is version 7 for a `.ait` template, which is never a legacy file. pub(super) fn wanted(cmd: &str, f: &Format, p: &Value) -> Result { let legacy = match p.get("aiVersion") { None | Some(Value::Null) => false, @@ -51,11 +51,17 @@ pub(super) fn wanted(cmd: &str, f: &Format, p: &Value) -> Result { Some(v) => return Err(bad(cmd, format!("aiVersion {v}: \"pdf\" (PDF-compatible, the default) or \"7\" (legacy .ai, version 7)"))), }; if legacy && f.id == "ait" { - return Err(bad(cmd, "aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible")); + return Err(bad(cmd, "aiVersion 7 writes legacy .ai files, not .ait templates")); } Ok(legacy) } +/// `f` (the `.ai` format, whose label names the PDF-compatible file) named, in its errors, as the +/// legacy `.ai` file. +pub(super) fn named(f: &Format) -> Format { + Format { label: "legacy .ai (version 7)", ..*f } +} + /// What a legacy `.ai` does with the images it can't hold (`transparentImages`). #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum SeeThrough { @@ -109,7 +115,7 @@ pub(super) fn encode(cmd: &str, f: &Format, doc: &Document, p: &Value) -> Result } let mode = see_through(cmd, p)?; let (hidden, outline_text) = (hidden_objects(cmd, p)?, outline_text(cmd, p)?); - let picked: ArtboardPick = super::encode::options(f, p)?; + let picked: ArtboardPick = super::encode::options(&named(f), p)?; let boards = picked.resolve(n).map_err(|e| bad(cmd, e))?.unwrap_or_else(|| (0..n).collect()); let mut enc = Encoded { warnings: vec![FIDELITY.to_string()], ..Encoded::default() }; if boards.len() > 1 { diff --git a/crates/engine/src/cmd/fileio/save.rs b/crates/engine/src/cmd/fileio/save.rs index de67968da..89339850e 100644 --- a/crates/engine/src/cmd/fileio/save.rs +++ b/crates/engine/src/cmd/fileio/save.rs @@ -249,11 +249,6 @@ pub fn save_plan(s: &Session, mode: SaveMode, p: &Value) -> Result { if let Some((key, top, inner)) = disagreeing_option(p, is_svg(format)).map_err(|e| bad(cmd, e))? { return Err(bad(cmd, format!("`{key}: {top}` and `options.{key}: {inner}` disagree: give the option once"))); } - let notes = NATIVE_OPTIONS - .iter() - .filter(|k| p.get(**k).is_some_and(|v| !v.is_null()) && !reads_option(format, k)) - .map(|k| format!("`{k}` was not used: {} files don't read it", format.label)) - .collect(); let mut given: Map = match p.get("options") { Some(Value::Object(o)) => o.iter().filter(|(k, _)| reads_option(format, k)).map(|(k, v)| (k.clone(), v.clone())).collect(), None | Some(Value::Null) => Map::new(), @@ -293,6 +288,12 @@ pub fn save_plan(s: &Session, mode: SaveMode, p: &Value) -> Result { if let Some(path) = &path { super::check_not_lossy_overwrite(st, path, p, cmd)?; } + let written = written_as(cmd, format, &Value::Object(options.clone())); + let notes = NATIVE_OPTIONS + .iter() + .filter(|k| p.get(**k).is_some_and(|v| !v.is_null()) && !reads_option(format, k)) + .map(|k| format!("`{k}` was not used: {} files don't read it", written.label)) + .collect(); Ok(SavePlan { mode, path, format, options, name, folder, modified, notes }) } @@ -576,6 +577,25 @@ fn blank_pages(doc: &Document) -> Document { /// Why a `.ai` file saved without PDF content looks empty elsewhere. const NOT_PDF_COMPATIBLE: &str = "saved without PDF content: VectorCraft opens it as before, other apps show empty pages"; +/// `f` (`.ai` or `.ait`) named, in its option errors, as a file saved without PDF content. +fn without_pdf(f: &Format) -> Format { + let label = if f.id == "ait" { "non-PDF-compatible .ait template" } else { "non-PDF-compatible .ai" }; + Format { label, ..*f } +} + +/// `f` named, in its errors and notes, as the file a save with options `p` writes: a version 7 +/// `.ai` as the legacy `.ai`, and a `.ai` or `.ait` with `pdfCompatible: false` as one saved +/// without PDF content. +fn written_as(cmd: &str, f: &Format, p: &Value) -> Format { + if f.id == "ai" && super::legacy_ai::wanted(cmd, f, p).unwrap_or(false) { + super::legacy_ai::named(f) + } else if matches!(f.id, "ai" | "ait") && !bool_or(p, "pdfCompatible", true) { + without_pdf(f) + } else { + *f + } +} + /// `e`, an error of the export encoders, under the save command `cmd` instead of /// `document.export`. fn named_for_save(cmd: &str, e: crate::EngineError) -> crate::EngineError { @@ -585,8 +605,9 @@ fn named_for_save(cmd: &str, e: crate::EngineError) -> crate::EngineError { } } -/// The shared Save and Export encoder for PDF-compatible `.ai` files (and `.ait` templates, the -/// same file). +/// The shared Save and Export encoder for `.ai` files (and `.ait` templates, the same file): +/// PDF-compatible by default, without PDF content (`pdfCompatible: false`), or legacy version 7 +/// `.ai` files (`aiVersion: "7"`). pub(super) fn encode_ai(cmd: &str, f: &Format, doc: &Document, p: &Value) -> Result { if super::legacy_ai::wanted(cmd, f, p)? { return super::legacy_ai::encode(cmd, f, doc, p); @@ -605,8 +626,9 @@ pub(super) fn encode_ai(cmd: &str, f: &Format, doc: &Document, p: &Value) -> Res } } } - let native_options = super::native::ai_options(cmd, f, doc, ¶ms)?; let pdf_compatible = bool_or(¶ms, "pdfCompatible", true); + let f = &if pdf_compatible { *f } else { without_pdf(f) }; + let native_options = super::native::ai_options(cmd, f, doc, ¶ms)?; if !pdf_compatible { let picked: ArtboardPick = super::encode::options(f, ¶ms)?; let picked = picked.resolve(doc.artboards.len()).map_err(|e| bad(cmd, e))?; diff --git a/crates/engine/src/tests/legacy_ai.rs b/crates/engine/src/tests/legacy_ai.rs index 90c728a2f..70218cf76 100644 --- a/crates/engine/src/tests/legacy_ai.rs +++ b/crates/engine/src/tests/legacy_ai.rs @@ -93,6 +93,31 @@ fn the_default_stays_pdf_compatible_and_other_versions_are_refused() { assert_eq!(v["options"]["aiVersion"]["value"], "pdf", "{v}"); } +#[test] +fn errors_name_the_legacy_ai_not_the_pdf_compatible_one() { + let mut s = three_boards(); + for (cmd, p) in [ + ("file.saveCopy", json!({"format": "ai", "aiVersion": "7", "artboard": "2"})), + ("document.export", json!({"format": "ai", "aiVersion": "7", "range": 2})), + ] { + let e = s.execute(cmd, &p).unwrap_err().to_string(); + assert!(e.contains("legacy .ai (version 7) options: invalid type") && !e.contains("PDF-compatible"), "{cmd}: {e}"); + } + // Version 7 writes a legacy .ai whatever pdfCompatible says, and its errors and notes name it. + let e = s.execute("file.saveCopy", &json!({"format": "ai", "aiVersion": "7", "pdfCompatible": false, "artboard": "2"})).unwrap_err().to_string(); + assert!(e.contains("legacy .ai (version 7) options: invalid type"), "{e}"); + let r = s.execute("file.saveCopy", &json!({"format": "ai", "aiVersion": "7", "artboard": 1, "version": 3})).unwrap(); + assert!(r["warnings"].to_string().contains("`version` was not used: legacy .ai (version 7) files don't read it"), "{r}"); + // Several artboards are several files, which one encoded file can't hold. + let d = &s.doc().unwrap().doc; + let e = crate::cmd::fileio::encode_with_warnings(d, "ai", &json!({"aiVersion": "7"})).unwrap_err().to_string(); + assert!(e.contains("legacy .ai (version 7) writes one file per artboard here") && !e.contains("PDF-compatible"), "{e}"); + assert!(crate::cmd::fileio::encode_with_warnings(d, "ai", &json!({"aiVersion": "7", "artboard": 2})).is_ok()); + // The PDF-compatible file keeps its name. + let e = s.execute("document.export", &json!({"format": "ai", "includeLinked": "yes"})).unwrap_err().to_string(); + assert!(e.contains("PDF-compatible .ai options: invalid type") && !e.contains("legacy"), "{e}"); +} + #[test] fn transparency_and_appearances_are_written_as_plain_art_and_type_as_text() { let mut s = Session::new(); diff --git a/crates/engine/src/tests/saveoptions.rs b/crates/engine/src/tests/saveoptions.rs index d52cbba61..2a55357eb 100644 --- a/crates/engine/src/tests/saveoptions.rs +++ b/crates/engine/src/tests/saveoptions.rs @@ -213,6 +213,33 @@ fn ai_without_pdf_content_and_compression() { assert!(loose.len() > packed.len(), "{} vs {}", loose.len(), packed.len()); } +#[test] +fn ai_option_errors_name_a_file_saved_without_pdf_content() { + let mut s = three_boards(); + for p in + [json!({"format": "ai", "pdfCompatible": false, "artboard": "2"}), json!({"format": "ai", "pdfCompatible": false, "includeLinked": "yes"})] + { + let e = s.execute("file.saveCopy", &p).unwrap_err().to_string(); + assert!(e.contains("non-PDF-compatible .ai options: invalid type"), "{p}: {e}"); + } + let e = s.execute("document.export", &json!({"format": "ai", "pdfCompatible": false, "artboard": "2"})).unwrap_err().to_string(); + assert!(e.contains("`document.export`") && e.contains("non-PDF-compatible .ai options: invalid type"), "{e}"); + let p = json!({"format": "ait", "pdfCompatible": false, "includeLinked": "yes"}); + let e = s.execute("file.saveAsTemplate", &p).unwrap_err().to_string(); + assert!(e.contains("non-PDF-compatible .ait template options: invalid type"), "{e}"); + // A template saved without PDF content is written. + let r = s.execute("file.saveAsTemplate", &json!({"format": "ait", "pdfCompatible": false})).unwrap(); + assert!(r["warnings"].to_string().contains("without PDF content"), "{r}"); + // So are the notes on native options the file doesn't read. + let r = s.execute("file.saveCopy", &json!({"format": "ai", "pdfCompatible": false, "version": 3})).unwrap(); + assert!(r["warnings"].to_string().contains("`version` was not used: non-PDF-compatible .ai files don't read it"), "{r}"); + // A PDF-compatible file keeps its name. + let e = s.execute("file.saveCopy", &json!({"format": "ai", "includeLinked": "yes"})).unwrap_err().to_string(); + assert!(e.contains("PDF-compatible .ai options: invalid type") && !e.contains("non-PDF"), "{e}"); + let r = s.execute("file.saveCopy", &json!({"format": "ai", "version": 3})).unwrap(); + assert!(r["warnings"].to_string().contains("`version` was not used: PDF-compatible .ai files don't read it"), "{r}"); +} + #[test] fn a_remembered_artboard_the_document_no_longer_has_is_dropped() { let dir = Folder::new("remembered-artboards"); diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index 705c5d7e7..20744b85e 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -4256,7 +4256,7 @@ imageTrace Outline Obris @msg Save for Web: the image is empty Sačuvaj za web: slika je prazna @msg Save writes {_1}, not {_2}: use document.export for other formats Sačuvaj zapisuje {_1}, a ne {_2}: za druge formate koristite document.export @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Sačuvaj zapisuje {_1}, a ne {_2}: za zapisivanje koristite file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 zapisuje naslijeđene .ai datoteke; .ait predložak je uvijek kompatibilan s PDF-om +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 zapisuje naslijeđene .ai datoteke, a ne .ait predloške @msg Saved recovery data for {title} Sačuvani podaci za oporavak za {title} @msg Saved to User Defined: {_1} Sačuvano u korisnički definisano: {_1} @msg Saved {path} Sačuvano: {path} diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index 97d2024dd..02ccc1939 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -4920,7 +4920,7 @@ digits Malayalam Malaiàlam @msg a {width}×{height} screenshot's byte count overflows el recompte de bytes d’una captura de pantalla de {width}×{height} es desborda @msg action is required cal una acció @msg add a format to export afegiu un format per exportar -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 escriu fitxers .ai heretats; una plantilla .ait sempre és compatible amb PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 escriu fitxers .ai heretats, no plantilles .ait @msg already editing a pattern ja s’està editant un motiu @msg an exporter always gets an export's budget: leave `budget` out un exportador sempre rep el pressupost d’una exportació: ometeu `budget` @msg an image has no pixels and was left out una imatge no té píxels i s’ha omès diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 56228845d..aa81fbca3 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -4304,7 +4304,7 @@ imageTrace Outline Obrys @msg Save for Web: the image is empty Uložit pro web: obraz je prázdný @msg Save writes {_1}, not {_2}: use document.export for other formats Uložení zapisuje {_1}, ne {_2}: pro jiné formáty použijte document.export @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Uložení zapisuje {_1}, ne {_2}: k jeho zápisu použijte file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 zapisuje starší soubory .ai; šablona .ait je vždy kompatibilní s PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 zapisuje starší soubory .ai, ne šablony .ait @msg Saved recovery data for {title} Data pro obnovení uložena pro {title} @msg Saved to User Defined: {_1} Uloženo do uživatelských knihoven: {_1} @msg Saved {path} Uloženo: {path} diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 11793dc22..0e1bf7ece 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -3911,7 +3911,7 @@ theme Appearance Erscheinungsbild @msg Save for Web: the image is empty Für Web speichern: Das Bild ist leer @msg Save writes {_1}, not {_2}: use document.export for other formats „Speichern“ schreibt {_1}, nicht {_2}: Verwenden Sie document.export für andere Formate @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it „Speichern“ schreibt {_1}, nicht {_2}: Verwenden Sie dafür file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 schreibt ältere .ai-Dateien; eine .ait-Vorlage ist immer PDF-kompatibel +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 schreibt ältere .ai-Dateien, keine .ait-Vorlagen @msg Saved recovery data for {title} Wiederherstellungsdaten für {title} gespeichert @msg Saved to User Defined: {_1} In „Benutzerdefiniert“ gespeichert: {_1} @msg Saved {path} {path} gespeichert diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 687a4a8e8..01471ba16 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -2203,7 +2203,7 @@ axis Both Και τα δύο @msg Save for Web: the image is empty Αποθήκευση για ιστό: η εικόνα είναι κενή @msg Save writes {_1}, not {_2}: use document.export for other formats Η αποθήκευση γράφει {_1}, όχι {_2}: χρησιμοποιήστε το document.export για άλλες μορφές @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Η αποθήκευση γράφει {_1}, όχι {_2}: χρησιμοποιήστε το file.saveAsTemplate για να το γράψετε -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible Το aiVersion 7 γράφει αρχεία .ai παλαιού τύπου· ένα πρότυπο .ait είναι πάντα συμβατό με PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates Το aiVersion 7 γράφει αρχεία .ai παλαιού τύπου, όχι πρότυπα .ait @msg Saved recovery data for {title} Αποθηκεύτηκαν δεδομένα ανάκτησης για το {title} @msg Saved to User Defined: {_1} Αποθηκεύτηκε στις προσαρμοσμένες ρυθμίσεις: {_1} @msg Saved {path} Αποθηκεύτηκε το {path} diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index eb0aeaeab..b68ba40d6 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -3996,7 +3996,7 @@ axis Both Ambos @msg Save for Web: the image is empty Guardar para web: la imagen está vacía @msg Save writes {_1}, not {_2}: use document.export for other formats Guardar escribe {_1}, no {_2}: usa document.export para otros formatos @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Guardar escribe {_1}, no {_2}: usa file.saveAsTemplate para escribirlo -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 escribe archivos .ai heredados; una plantilla .ait siempre es compatible con PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 escribe archivos .ai heredados, no plantillas .ait @msg Saved recovery data for {title} Se guardaron los datos de recuperación de {title} @msg Saved to User Defined: {_1} Se guardó en Definido por el usuario: {_1} @msg Saved {path} Se guardó {path} diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 806ad1dbd..e44dac5b1 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -4218,7 +4218,7 @@ imageTrace Outline Ääriviiva @msg Save for Web: the image is empty Tallenna verkkoon: kuva on tyhjä @msg Save writes {_1}, not {_2}: use document.export for other formats Tallenna kirjoittaa muotoa {_1}, ei {_2}: käytä muille muodoille komentoa document.export @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Tallenna kirjoittaa muotoa {_1}, ei {_2}: kirjoita se komennolla file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 kirjoittaa vanhoja .ai-tiedostoja; .ait-malli on aina PDF-yhteensopiva +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 kirjoittaa vanhoja .ai-tiedostoja, ei .ait-malleja @msg Saved recovery data for {title} Tallennettiin palautustiedot: {title} @msg Saved to User Defined: {_1} Tallennettiin kohteeseen Käyttäjän määrittämä: {_1} @msg Saved {path} Tallennettiin {path} diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index f64610257..e435b22b8 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -3986,7 +3986,7 @@ axis Both Les deux @msg Save for Web: the image is empty Enregistrer pour le Web : l’image est vide @msg Save writes {_1}, not {_2}: use document.export for other formats Enregistrer écrit du {_1}, pas du {_2} : utilisez document.export pour les autres formats @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Enregistrer écrit du {_1}, pas du {_2} : utilisez file.saveAsTemplate pour l’écrire -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 écrit des fichiers .ai hérités, alors qu’un modèle .ait est toujours compatible PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 écrit des fichiers .ai hérités, pas des modèles .ait @msg Saved recovery data for {title} Données de récupération enregistrées pour {title} @msg Saved to User Defined: {_1} Enregistré dans Défini par l’utilisateur : {_1} @msg Saved {path} {path} enregistré diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index d5c9f279a..1b6037294 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -5103,7 +5103,7 @@ imageTrace Outline Körvonal @msg Save for Web: the image is empty Mentés webre: a kép üres @msg Save writes {_1}, not {_2}: use document.export for other formats a Mentés ezt írja: {_1}, ezt nem: {_2}; más formátumhoz használd a document.export parancsot @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it a Mentés ezt írja: {_1}, ezt nem: {_2}; ennek írásához használd a file.saveAsTemplate parancsot -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible az aiVersion 7 régi .ai fájlokat ír; egy .ait sablon mindig PDF-kompatibilis +@msg aiVersion 7 writes legacy .ai files, not .ait templates az aiVersion 7 régi .ai fájlokat ír, nem .ait sablonokat @msg saved panel layout is invalid; reset the workspace first a mentett panelelrendezés érvénytelen; előbb állítsd vissza a munkaterületet @msg Saved recovery data for {title} Helyreállítási adatok mentve: {title} @msg Saved to User Defined: {_1} Mentve a felhasználóiak közé: {_1} diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index c95b9d71d..f51eb524a 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -4038,7 +4038,7 @@ axis Both Entrambi @msg Save for Web: the image is empty Salva per il web: l'immagine è vuota @msg Save writes {_1}, not {_2}: use document.export for other formats Salva scrive {_1}, non {_2}: usa document.export per gli altri formati @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Salva scrive {_1}, non {_2}: usa file.saveAsTemplate per scriverlo -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 scrive file .ai tradizionali; un modello .ait è sempre compatibile PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 scrive file .ai tradizionali, non modelli .ait @msg Saved recovery data for {title} Dati di recupero salvati per {title} @msg Saved to User Defined: {_1} Salvato in Definito dall'utente: {_1} @msg Saved {path} Salvato {path} diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index eb3d1fc5e..8630535a5 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -4153,7 +4153,7 @@ swatch Bright Violet ビビッドバイオレット @msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}: この環境にはファイルシステムがありません (開くには dataBase64 を渡し、dataBase64 を受け取るにはパスを省略してください) @msg Save writes {_1}, not {_2}: use document.export for other formats 保存できる形式は {_1} のみで、{_2} 形式では保存できません: ほかの形式には document.export を使用してください @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it 保存できる形式は {_1} のみで、{_2} 形式では保存できません: この形式で保存するには file.saveAsTemplate を使用してください -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 は従来の .ai ファイルを書き出します。.ait テンプレートは常に PDF 互換です +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 は従来の .ai ファイルを書き出し、.ait テンプレートは書き出しません @msg no changes since the last save 前回の保存以降、変更はありません @msg unknown format `{f}` (Save writes {_1}) `{f}` は不明な形式です (保存できる形式: {_1}) @msg `svg` must be an object of SVG options (see document.formats) `svg` には SVG オプションのオブジェクトを指定してください (document.formats を参照) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index a504987b6..6cf5cdb6b 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -5521,7 +5521,7 @@ imageTrace Outline კონტური @msg its editing data is for a {w} × {h} pt page, the file's {pw} × {ph} pt page at {scale} მისი რედაქტირების მონაცემები {w} × {h} pt გვერდს ეკუთვნის: ეს ფაილის {pw} × {ph} pt გვერდია მასშტაბით {scale} @msg no history to clear გასასუფთავებელი ისტორია არ არის @msg {_1} files are written by file.saveAsTemplate {_1} ფაილებს წერს file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 წერს ძველი ფორმატის .ai ფაილებს; .ait შაბლონი ყოველთვის PDF-თან თავსებადია +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 წერს ძველი ფორმატის .ai ფაილებს და არა .ait შაბლონებს @msg the file's variable library was partly read (entries skipped: {_1}): the Variables panel lists the rest ფაილის ცვლადების ბიბლიოთეკა მხოლოდ ნაწილობრივ იქნა წაკითხული (გამოტოვებული ჩანაწერები: {_1}): პანელი „ცვლადები“ დანარჩენს აჩვენებს @msg the file's variable library couldn't be read: the Variables panel doesn't list it ფაილის ცვლადების ბიბლიოთეკის წაკითხვა ვერ მოხერხდა: პანელი „ცვლადები“ მას არ აჩვენებს @msg a variable of unknown kind can't be bound to objects უცნობი სახის ცვლადის ობიექტებთან დაკავშირება შეუძლებელია diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 1702c2d15..338be6dce 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -4080,7 +4080,7 @@ theme Appearance 외관 @msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}: 여기에는 파일 시스템이 없습니다(열려면 dataBase64를 전달하고, dataBase64를 얻으려면 경로를 생략하세요) @msg Save writes {_1}, not {_2}: use document.export for other formats 저장은 {_2}이(가) 아닌 {_1}(으)로 기록합니다. 다른 형식은 document.export를 사용하세요 @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it 저장은 {_2}이(가) 아닌 {_1}(으)로 기록합니다. 이 형식으로 기록하려면 file.saveAsTemplate를 사용하세요 -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7은(는) 레거시 .ai 파일을 기록합니다. .ait 템플릿은 항상 PDF 호환입니다 +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7은(는) 레거시 .ai 파일을 기록하며 .ait 템플릿은 기록하지 않습니다 @msg no changes since the last save 마지막 저장 이후 변경 내용이 없습니다 @msg unknown format `{f}` (Save writes {_1}) 알 수 없는 형식 `{f}`(저장은 {_1}(으)로 기록) @msg `svg` must be an object of SVG options (see document.formats) `svg`는 SVG 옵션 개체여야 합니다(document.formats 참조) diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index a2bce6ac5..4cb23d6ac 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -4127,7 +4127,7 @@ imageTrace Outline Kontur @msg Save for Web: the image is empty Zapisz dla Internetu: obraz jest pusty @msg Save writes {_1}, not {_2}: use document.export for other formats Zapis tworzy {_1}, nie {_2}: dla innych formatów użyj document.export @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Zapis tworzy {_1}, nie {_2}: aby go zapisać, użyj file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 zapisuje starsze pliki .ai; szablon .ait jest zawsze zgodny z PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 zapisuje starsze pliki .ai, a nie szablony .ait @msg Saved recovery data for {title} Zapisano dane odzyskiwania dla {title} @msg Saved to User Defined: {_1} Zapisano w zdefiniowanych przez użytkownika: {_1} @msg Saved {path} Zapisano {path} diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index b6efe4bf7..f53f0798e 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -3590,7 +3590,7 @@ axis Both Ambos @msg Save for Web: the image is empty Salvar para Web: a imagem está vazia @msg Save writes {_1}, not {_2}: use document.export for other formats Salvar grava {_1}, não {_2}: use document.export para outros formatos @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Salvar grava {_1}, não {_2}: use file.saveAsTemplate para gravá-lo -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 grava arquivos .ai legados; um modelo .ait é sempre compatível com PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 grava arquivos .ai legados, não modelos .ait @msg Saved recovery data for {title} Dados de recuperação de {title} salvos @msg Saved to User Defined: {_1} Salvo em Definido pelo usuário: {_1} @msg Saved {path} {path} salvo diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 999b1f155..c5a493ad8 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -4033,7 +4033,7 @@ axis Both Оба @msg Save for Web: the image is empty Сохранить для web: изображение пусто @msg Save writes {_1}, not {_2}: use document.export for other formats Сохранение записывает {_1}, а не {_2}: используйте document.export для других форматов @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Сохранение записывает {_1}, а не {_2}: чтобы записать его, используйте file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 записывает устаревшие файлы .ai; шаблон .ait всегда совместим с PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 записывает устаревшие файлы .ai, а не шаблоны .ait @msg Saved recovery data for {title} Сохранены данные восстановления для {title} @msg Saved to User Defined: {_1} Сохранено в «Пользовательский»: {_1} @msg Saved {path} Сохранено: {path} diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 7f815addf..77d5c41b6 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -3907,7 +3907,7 @@ axis Both Båda @msg Save for Web: the image is empty Spara för webb: bilden är tom @msg Save writes {_1}, not {_2}: use document.export for other formats Spara skriver {_1}, inte {_2}: använd document.export för andra format @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Spara skriver {_1}, inte {_2}: använd file.saveAsTemplate för att skriva det -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 skriver äldre .ai-filer; en .ait-mall är alltid PDF-kompatibel +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 skriver äldre .ai-filer, inte .ait-mallar @msg Saved recovery data for {title} Sparade återställningsdata för {title} @msg Saved to User Defined: {_1} Sparat i Användardefinierat: {_1} @msg Saved {path} Sparade {path} diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 0517c552a..efbcf6934 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -5402,7 +5402,7 @@ theme Appearance Görünüm @msg more than {MAX_CSV_ROWS} data sets: Import Data Sets reads at most {MAX_CSV_ROWS} {MAX_CSV_ROWS} veri setinden fazla: Veri Kümelerini İçe Aktar en fazla {MAX_CSV_ROWS} tane okur @msg more than {MAX_CSV_COLS} variables: Import Data Sets reads at most {MAX_CSV_COLS} {MAX_CSV_COLS} değişkenden fazla: Veri Kümelerini İçe Aktar en fazla {MAX_CSV_COLS} tane okur @msg x and y must be finite x ve y sonlu olmalıdır -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 eski .ai dosyalarını yazar; bir .ait şablonu her zaman PDF uyumludur +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 eski .ai dosyalarını yazar, .ait şablonlarını yazmaz @msg Edit Original opens image and document files only; “{name}” is not one Özgünü Düzenle yalnızca görüntü ve belge dosyalarını açar; “{name}” bunlardan biri değil @msg its editing data is for a {w} × {h} pt page, not the file's {pw} × {ph} pt page düzenleme verileri {w} × {h} pt boyutunda bir sayfa içindir, dosyanın {pw} × {ph} pt sayfası için değil @msg its editing data is for a {w} × {h} pt page, the file's {pw} × {ph} pt page at {scale} düzenleme verileri {w} × {h} pt boyutunda bir sayfa içindir, dosyanın {scale} ölçeğindeki {pw} × {ph} pt sayfası diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 71d331032..b7d8962a9 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -4022,7 +4022,7 @@ axis Both Обидві @msg Save for Web: the image is empty Зберегти для Інтернету: зображення пусте @msg Save writes {_1}, not {_2}: use document.export for other formats Збереження записує {_1}, а не {_2}: використовуйте document.export для інших форматів @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Збереження записує {_1}, а не {_2}: щоб записати його, використовуйте file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 записує застарілі файли .ai; шаблон .ait завжди сумісний із PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 записує застарілі файли .ai, а не шаблони .ait @msg Saved recovery data for {title} Збережено дані відновлення для {title} @msg Saved to User Defined: {_1} Збережено в «Користувацькі»: {_1} @msg Saved {path} Збережено: {path} diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 8110a2d20..41a5d4c64 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -4757,7 +4757,7 @@ theme Appearance Giao diện @msg Save for Web: the image is empty Lưu cho Web: ảnh trống @msg Save writes {_1}, not {_2}: use document.export for other formats Lưu ghi {_1}, không phải {_2}: dùng document.export cho các định dạng khác @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it Lưu ghi {_1}, không phải {_2}: dùng file.saveAsTemplate để ghi định dạng này -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 ghi tệp .ai cũ; mẫu .ait luôn tương thích PDF +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 ghi tệp .ai cũ, không ghi mẫu .ait @msg saved panel layout is invalid; reset the workspace first bố cục bảng đã lưu không hợp lệ; hãy đặt lại không gian làm việc trước @msg Saved recovery data for {title} Đã lưu dữ liệu phục hồi cho {title} @msg Saved to User Defined: {_1} Đã lưu vào Người dùng tùy chỉnh: {_1} diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index aaf791fea..8e383be64 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -5434,7 +5434,7 @@ lighting Light 光源 Enable Guides for 9-Slice Scaling 启用 9-slice 缩放参考线 @msg cancelled; nothing was changed 已取消;未做任何更改 @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it 保存会写入 {_1},而不是 {_2}:要写入该格式请使用 file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 写入旧版 .ai 文件;.ait 模板始终与 PDF 兼容 +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 写入旧版 .ai 文件,不写入 .ait 模板 @msg a mask has more than one art block 蒙版包含多个图稿块 @msg mask art ends outside a mask dictionary 蒙版图稿在蒙版字典之外结束 @msg `{key}` must be a #rrggbb color `{key}` 必须是 #rrggbb 格式的颜色 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index a0bf8bf80..e401ee090 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -2496,7 +2496,7 @@ file-filter Templates 範本 @msg the action has no steps 動作沒有步驟 @msg cancelled; nothing was changed 已取消;未做任何變更 @msg Save writes {_1}, not {_2}: use file.saveAsTemplate to write it 「儲存」會寫入 {_1},而非 {_2}:若要寫入該格式,請使用 file.saveAsTemplate -@msg aiVersion 7 writes legacy .ai files; a .ait template is always PDF-compatible aiVersion 7 會寫入舊版 .ai 檔案;.ait 範本一律與 PDF 相容 +@msg aiVersion 7 writes legacy .ai files, not .ait templates aiVersion 7 會寫入舊版 .ai 檔案,不會寫入 .ait 範本 @msg a mask has more than one art block 遮色片含有多個圖稿區塊 @msg mask art ends outside a mask dictionary 遮色片圖稿在遮色片字典之外結束 @msg `{key}` must be a #rrggbb color `{key}` 必須是 #rrggbb 格式的顏色