From 795cbc060d07d566199d3647e097c8e989a3d417 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Sun, 1 Nov 2026 06:05:43 -0800 Subject: [PATCH 1/2] .ai import: graphs open as their drawn art, with a note A graph in a legacy .ai, or in a current file's editing data, is written as `%_Gs`, its data and settings on `%_` lines, its drawn art in a group with a `%_... Go` tag after each object, and `%_GS`. The reader stopped on the graph operators as ones it doesn't know, so such a file did not open through its layers. The reader now leaves the graph's records out with their operands and reads the drawn art as usual: the bars, lines and labels come in as the groups, paths and type they are written as. Paint operators on `%_` lines between `Gt` and `GT` set nothing. One note per file says the graphs came in as plain art without their data or settings. A graph that starts inside another, or doesn't end before its layer does, keeps the art read so far with a second note. Graph operators outside a graph stay unknown. --- crates/engine/tests/import_fuzz.rs | 39 ++++++ crates/eps/src/import/ai/read.rs | 11 +- crates/eps/src/import/ai/read/document.rs | 3 + crates/eps/src/import/ai/read/ops.rs | 45 ++++++- crates/eps/src/import/ai/read/types.rs | 25 ++++ crates/eps/src/import/ai/tests.rs | 142 +++++++++++++++++++++ crates/eps/src/import/tests_illustrator.rs | 31 +++++ crates/ui-egui/src/i18n/ca.tsv | 1 + crates/ui-egui/src/i18n/cs.tsv | 1 + crates/ui-egui/src/i18n/de.tsv | 1 + crates/ui-egui/src/i18n/el.tsv | 1 + crates/ui-egui/src/i18n/es.tsv | 1 + crates/ui-egui/src/i18n/fi.tsv | 1 + crates/ui-egui/src/i18n/fr.tsv | 1 + crates/ui-egui/src/i18n/hu.tsv | 1 + crates/ui-egui/src/i18n/it.tsv | 1 + crates/ui-egui/src/i18n/ja.tsv | 1 + crates/ui-egui/src/i18n/ka.tsv | 1 + crates/ui-egui/src/i18n/ko.tsv | 1 + crates/ui-egui/src/i18n/pl.tsv | 1 + crates/ui-egui/src/i18n/pt-br.tsv | 1 + crates/ui-egui/src/i18n/ru.tsv | 1 + crates/ui-egui/src/i18n/sv.tsv | 1 + crates/ui-egui/src/i18n/tr.tsv | 1 + crates/ui-egui/src/i18n/uk.tsv | 1 + crates/ui-egui/src/i18n/vi.tsv | 1 + crates/ui-egui/src/i18n/zh-hans.tsv | 1 + crates/ui-egui/src/i18n/zh-hant.tsv | 1 + docs/file-format-parity.md | 2 + 29 files changed, 313 insertions(+), 6 deletions(-) diff --git a/crates/engine/tests/import_fuzz.rs b/crates/engine/tests/import_fuzz.rs index c7c7ebf9d..34bb1a436 100644 --- a/crates/engine/tests/import_fuzz.rs +++ b/crates/engine/tests/import_fuzz.rs @@ -5248,3 +5248,42 @@ proptest! { survive("mutated .ai blend", || Some(vectorcraft_eps::layered_ai(&private, Document::new(100.0, 100.0), vec![], false, true, 1.0).0))?; } } + +/// A graph in `.ai` editing data, written by hand from the version 7 specification's chapter 17: +/// its data and settings on `%_` lines (cells, strings, an array, a name), then its drawn art, a bar +/// with its `Go` tag and an empty group, in a group. +fn graph_text() -> String { + "%_Gs\n%_10 10 110 90 Gb\n%_3 0 0 12 1 1 0 0 2 30 0 Gy\n%_6 1 1 0 80 70 0 50 60 80 70 Gd\n%_0 1 Gj\n\ + %_1 () Ga 0 12 0 0 0 0 0 () 0 0 GA\n%_40 Gw\n%_2 2 1 1 Gz\n%_() Gc (East) Gc (Q1) Gc 7 Gc GC\n\ + %_Gt\n%_(Bars) GD [1 2 3] 0 Ge\n%_/Name 1 Gi\n%_0.5 G\n%_0 g\n%_GT\n\ + u\n0 0 0 1 k\n10 10 m\n10 50 L\n30 50 L\n30 10 L\nf\n%_2 0 0 0 Go\nu\nU\nU\n%_GS\n" + .to_string() +} + +proptest! { + #![proptest_config(config())] + + /// A `.ai` graph whose records are damaged, cut or hostile never panics. With only the numbers + /// in its records changed, the records keep their shape, and the bar still comes in. + #[test] + fn ai_graph_never_panics(cut in 0usize..700, edits in prop::collection::vec((0usize..700, prop::sample::select(vec!['0', '9', '-', '.', ' ', '\n', '(', ')', '[', ']', '/', '%', '_', 'G', 's', 'S', 't', 'T', 'u', 'U'])), 0..12), digits in prop::collection::vec((0usize..600, 0u8..10), 0..12)) { + let text = mutate_text(&graph_text(), cut, &edits); + let private = ai_private(&text); + survive("mutated .ai graph", || Some(vectorcraft_eps::layered_ai(&private, Document::new(100.0, 100.0), vec![], false, true, 1.0).0))?; + let src = graph_text(); + let records = src.find("u\n0 0 0 1 k").unwrap_or(0).max(1); + let mut kept: Vec = src.chars().collect(); + for (at, d) in digits { + if let Some(c) = kept.get_mut(at % records).filter(|c| c.is_ascii_digit()) { + *c = char::from(b'0' + d); + } + } + let (doc, notes, read) = vectorcraft_eps::layered_ai(&ai_private(&kept.into_iter().collect::()), Document::new(4000.0, 200.0), vec![], false, true, 1.0); + prop_assert!(read, "{:?}", notes); + let mut paths = 0; + doc.walk(|n| paths += usize::from(matches!(n.kind, vectorcraft_doc::NodeKind::Path { .. }))); + prop_assert_eq!(paths, 1, "{:?}", notes); + prop_assert!(notes.iter().any(|n| n.contains("graphs come in as plain art")), "{:?}", notes); + prop_assert!(!notes.iter().any(|n| n.contains("art this can't read")), "the records aren't art: {:?}", notes); + } +} diff --git a/crates/eps/src/import/ai/read.rs b/crates/eps/src/import/ai/read.rs index a18ba51d1..0202b43c2 100644 --- a/crates/eps/src/import/ai/read.rs +++ b/crates/eps/src/import/ai/read.rs @@ -51,6 +51,10 @@ //! - Type in the legacy format (version 7 specification §15): `type To` … `TO`, read by //! [`legacy_text`]. //! +//! - Graphs (version 7 specification §17): `%_Gs`, the graph's data and settings on `%_` lines, +//! its drawn art as ordinary groups, paths and type (each object followed by `%_… Go`), `%_GS`. +//! The drawn art is read; the data and settings are left out, with a note. +//! //! - Swatches: the palette (`%AI5_BeginPalette`), read by [`super::palette`], replaces the //! default swatches. //! @@ -92,9 +96,9 @@ use art::preview_png; pub use document::{PaletteSwatches, VariableLibrary, artboards, palette, variables}; pub(crate) use document::{slot_frame, slot_of}; pub use types::IMAGE_TOO_LARGE; -use types::{BLEND_BUDGET, FLIP, Frame, GState, Kind, PatternHead, PendingEnvelope, Place, Raster}; +use types::{BLEND_BUDGET, FLIP, Frame, GState, Graph, Kind, PatternHead, PendingEnvelope, Place, Raster}; #[cfg(test)] -pub use types::{NON_NATIVE_ART, NON_NATIVE_ART_UNREAD, VERSIONED_UNENDED}; +pub use types::{GRAPH_PLAIN, GRAPH_UNENDED, NON_NATIVE_ART, NON_NATIVE_ART_UNREAD, VERSIONED_UNENDED}; pub(super) use types::{blend_mode, blend_name}; #[path = "legacy_text.rs"] @@ -302,6 +306,8 @@ struct Reader<'a> { /// The legacy text object being read (`To` … `TO`), and the modal type attributes. text: Option, type_state: legacy_text::TypeState, + /// The graph being read (see [`Reader::graph_record`]). + graph: Option, } /// A section comment's marker without its `AI_` prefix and value (`AI14_BeginSymbol` → @@ -399,6 +405,7 @@ impl<'a> Reader<'a> { pattern_tiles: HashMap::new(), text: None, type_state: legacy_text::TypeState::default(), + graph: None, } } diff --git a/crates/eps/src/import/ai/read/document.rs b/crates/eps/src/import/ai/read/document.rs index 91d8661b9..bae133be7 100644 --- a/crates/eps/src/import/ai/read/document.rs +++ b/crates/eps/src/import/ai/read/document.rs @@ -529,6 +529,9 @@ impl<'a> Reader<'a> { } pub(super) fn finish(mut self) -> Result { + if self.graph.take().is_some() { + self.warn(super::types::GRAPH_UNENDED); + } // Envelopes whose plugin never closed them keep their drawn art. if !self.envelopes.is_empty() { self.envelopes.clear(); diff --git a/crates/eps/src/import/ai/read/ops.rs b/crates/eps/src/import/ai/read/ops.rs index 5e3974f55..215db7340 100644 --- a/crates/eps/src/import/ai/read/ops.rs +++ b/crates/eps/src/import/ai/read/ops.rs @@ -1,9 +1,9 @@ use super::containers::close; use super::document::slot_of; -use super::types::{BLENDS, FLIP, Frame, IGNORED, Kind, MAX_DEPTH}; +use super::types::{BLENDS, FLIP, Frame, GRAPH_OPS, GRAPH_PLAIN, GRAPH_UNENDED, IGNORED, Kind, MAX_DEPTH}; use super::{ - Affine, Appearance, AppearanceItem, Arc, BlendMode, Dash, FillLayer, FillRule, Gradient, GradientDef, HashMap, HashSet, Instance, Knockout, - LayerColor, LineCap, LineJoin, Node, NodeId, NodeKind, Paint, Reader, Rect, StrokeLayer, V, obj, paint, + Affine, Appearance, AppearanceItem, Arc, BlendMode, Dash, FillLayer, FillRule, Gradient, GradientDef, Graph, HashMap, HashSet, Instance, + Knockout, LayerColor, LineCap, LineJoin, Node, NodeId, NodeKind, Paint, Reader, Rect, StrokeLayer, V, obj, paint, }; impl<'a> Reader<'a> { @@ -77,6 +77,9 @@ impl<'a> Reader<'a> { let mesh_ended = std::mem::take(&mut self.mesh_ended); let vals = self.operands(); let vals = self.take_head(vals); + if self.graph_record(w, hidden) { + return Ok(()); + } // Only `Bh` reads an undefined number. Anywhere else it would reach a point or a size, so // the operator is one the reader doesn't know, as before. if w != "Bh" && !self.frames.is_empty() && vals.iter().any(|v| matches!(v, V::Num(n) if n.is_nan())) { @@ -145,7 +148,14 @@ impl<'a> Reader<'a> { a.name = vals.iter().rev().find_map(V::text).unwrap_or_default(); } } - "LB" => self.end_layer()?, + "LB" => { + // A graph started in this layer that hasn't ended doesn't go on past it. + if self.graph.as_ref().is_some_and(|g| g.frames >= self.frames.len()) { + self.graph = None; + self.warn(GRAPH_UNENDED); + } + self.end_layer()? + } // Paths. "m" | "l" | "L" | "c" | "C" | "v" | "V" | "y" | "Y" => self.path_op(w, &vals)?, "h" => close(&mut self.path), @@ -324,6 +334,33 @@ impl<'a> Reader<'a> { Ok(()) } + /// A graph's records (version 7 specification §17 and appendix A): `%_Gs` starts the graph on + /// a layer, `GS` ends it, and its data and settings (the operators in [`GRAPH_OPS`], and any + /// operator on a `%_` line between `Gt` and `GT`) are left out with their operands. Its drawn + /// art, and anything else, is read as usual. `true` when `w` was one of them. + fn graph_record(&mut self, w: &str, hidden: bool) -> bool { + let Some(g) = self.graph.as_mut() else { + // Outside a graph, its operators stay ones the reader doesn't know. + if w == "Gs" && hidden && !self.frames.is_empty() { + self.graph = Some(Graph { settings: false, frames: self.frames.len() }); + self.warn(GRAPH_PLAIN); + return true; + } + return false; + }; + match w { + // A graph doesn't start inside another: the one being read goes on. + "Gs" => self.warn(GRAPH_UNENDED), + "GS" => self.graph = None, + "Gt" => g.settings = true, + "GT" => g.settings = false, + _ if GRAPH_OPS.contains(&w) => {} + _ if hidden && g.settings => {} + _ => return false, + } + true + } + /// `… Lb`: a layer's options, `visible preview unlocked printing dimmed`, then the colour index /// and its RGB. The colour index is at 5 with fewer than ten operands, 6 with ten to twelve /// (`masks` before it) and 7 with thirteen or more (one more flag before it). Four places after diff --git a/crates/eps/src/import/ai/read/types.rs b/crates/eps/src/import/ai/read/types.rs index 733b79f04..36d2af433 100644 --- a/crates/eps/src/import/ai/read/types.rs +++ b/crates/eps/src/import/ai/read/types.rs @@ -301,3 +301,28 @@ pub const NON_NATIVE_ART_UNREAD: &str = "non-native art (a placed PDF's content) /// The name of the group a `/ForeignObject`'s art comes in as. pub const NON_NATIVE_ART: &str = "Non-native art"; + +/// The note for a file with a graph (`%_Gs` … `%_GS`): its drawn art comes in, its data and +/// settings don't. +pub const GRAPH_PLAIN: &str = "graphs come in as plain art, without their data or settings"; + +/// The note for a graph that starts inside another or doesn't end before its layer does: the art +/// read so far is kept, and what follows the layer is read as usual. +pub const GRAPH_UNENDED: &str = "a graph's records don't end where they should: its art was read as it is"; + +/// A graph's records (the version 7 specification's chapter 17 and appendix A): two-letter +/// operators starting with `G`, read and left out with their operands. +pub(super) const GRAPH_OPS: &[&str] = &[ + "G1", "G+", "Ga", "GA", "Gb", "Gc", "GC", "Gd", "GD", "Ge", "Gf", "Gg", "Gi", "Gj", "Gl", "Gm", "Go", "Gp", "Gr", "Gs", "GS", "Gt", "GT", "Gv", + "Gw", "GX", "Gx", "Gy", "Gz", +]; + +/// A graph being read (`%_Gs` … `%_GS`). +#[derive(Debug)] +pub(super) struct Graph { + /// Between `Gt` and `GT`, where the graph's settings may use paint and type operators on `%_` + /// lines too. + pub(super) settings: bool, + /// How many frames were open at its `Gs`: a layer that ends with fewer ends the graph. + pub(super) frames: usize, +} diff --git a/crates/eps/src/import/ai/tests.rs b/crates/eps/src/import/ai/tests.rs index e645841cd..9c5af3a32 100644 --- a/crates/eps/src/import/ai/tests.rs +++ b/crates/eps/src/import/ai/tests.rs @@ -3811,3 +3811,145 @@ fn an_objects_on_path_group_in_versioned_content_opens_once() { assert_eq!(kids[0].children().unwrap().len(), 5); assert!(kids[0].extras().objects_on_path.is_some()); } + +use read::{GRAPH_PLAIN, GRAPH_UNENDED}; + +/// Editing data in the legacy format (version 7 specification, chapter 2): `%AI5_FileFormat 2.0`, +/// the art size and the template box in the header, then `body`. +fn stream7(body: &str) -> String { + format!( + "%!PS-Adobe-3.0\n%%Creator: test\n%AI5_FileFormat 2.0\n%AI5_ArtSize: 612 792\n%AI3_TemplateBox: 306 396 306 396\n%%EndComments\n\ + %%BeginProlog\n%%EndProlog\n%%BeginSetup\n%%EndSetup\n{body}\n%%PageTrailer\ngsave annotatepage grestore showpage\n%%Trailer\n%%EOF\n" + ) +} + +/// One layer named `name` in the legacy format (ten operands before `Lb`) holding `art`. +fn layer7(name: &str, art: &str) -> String { + format!("%AI5_BeginLayer\n1 1 1 1 0 0 0 79 128 255 Lb\n({name}) Ln\n0 A\n{art}\nLB\n%AI5_EndLayer--\n") +} + +/// A graph's data on `%_` lines, in the order the version 7 specification's chapter 17 gives: +/// bounds, style and dialog settings, a subscription, three axes, a column width and the table +/// (two rows of two cells, one of them empty). +const GRAPH_DATA: &str = "%_Gs\n%_10 10 110 90 Gb\n%_3 0 0 12 1 1 0 0 2 30 0 Gy\n%_6 1 1 0 80 70 0\n%_ 50 60 80 70 Gd\n%_0 1 Gj\n\ + %_1 () Ga 0 12 0 0 0 0 0 () 0 0 GA\n%_2 () Ga 0 12 0 1 0.5 0 1 () 0 0 GA\n%_3 () Ga 0 12 0 4 1 0 0 () 0 0 GA\n%_40 Gw\n\ + %_2 2 1 1 Gz\n%_() Gc (East) Gc\n%_(Q1) Gc 7 Gc GC\n"; + +/// A graph's settings (`Gt` … `GT`): a design's name and paint operators on `%_` lines. +const GRAPH_SETTINGS: &str = "%_Gt\n%_(Bars) GD\n%_0.5 G\n%_0 g\n%_1 0 Gv\n%_GT\n"; + +/// A graph whose drawn art is `art` (in its group, then `%_GS`). +fn graph(settings: &str, art: &str) -> String { + format!("{GRAPH_DATA}{settings}u\n{art}U\n%_GS\n") +} + +/// A filled bar of a graph, with its `Go` tag. +fn bar(x: f64) -> String { + format!("0 0 0 1 k\n{}f\n%_2 0 0 0 Go\n", rect_path(x, 10.0, x + 20.0, 50.0)) +} + +/// The gray (`k`) of `n`'s stroke. +fn stroke_k(n: &Node) -> Option { + match n.appearance.stroke().and_then(|s| s.paint.color()) { + Some(Color::Gray { k }) => Some(k), + _ => None, + } +} + +/// A graph opens as its drawn art: the bar comes in, in its group, with one note. +#[test] +fn a_graph_opens_as_its_drawn_art() { + let r = read(stream7(&layer7("Graph", &graph(GRAPH_SETTINGS, &bar(10.0)))).as_bytes()).unwrap(); + let a = art(&r.doc); + assert_eq!(a.len(), 1); + let NodeKind::Group { children, clip: false } = &a[0].kind else { panic!("{:?}", a[0].kind) }; + assert_eq!(children.len(), 1); + assert!(matches!(children[0].kind, NodeKind::Path { .. })); + assert_eq!(fill(&children[0]).color(), Some(Color::cmyk(0.0, 0.0, 0.0, 1.0))); + assert_eq!(r.warnings, [GRAPH_PLAIN]); + assert!(r.hidden_unread.is_empty(), "the records aren't unread art: {:?}", r.hidden_unread); + // Two graphs, the second without settings: one note still. + let two = format!("{}{}", graph(GRAPH_SETTINGS, &bar(10.0)), graph("", &bar(40.0))); + let r = read(stream7(&layer7("Graph", &two)).as_bytes()).unwrap(); + assert_eq!(art(&r.doc).len(), 2); + assert_eq!(r.warnings, [GRAPH_PLAIN]); + // A graph with only the records a minimal one needs (bounds and table), and the newer header. + let minimal = "%_Gs\n%_0 0 50 50 Gb\n%_1 1 1 1 Gz\n%_3 Gc GC\n"; + let r = read_ok(&layer(&format!("{minimal}u\n{}U\n%_GS\n", bar(0.0)))); + assert_eq!(art(&r.doc).len(), 1); + assert_eq!(r.warnings, [GRAPH_PLAIN]); +} + +/// Paint operators on `%_` lines in a graph's settings set nothing; the same operators in its drawn +/// art, and after it, paint as usual. +#[test] +fn a_graphs_settings_paint_nothing_and_its_drawn_art_paints_as_usual() { + let stroked = |x: f64| format!("{}S\n", rect_path(x, 60.0, x + 5.0, 70.0)); + let drawn = format!("{}0.25 G\n{}", stroked(0.0), stroked(10.0)); + let body = format!("0.75 G\n{}0.5 G\n{}", graph(GRAPH_SETTINGS, &drawn), stroked(20.0)); + let r = read(stream7(&layer7("Graph", &body)).as_bytes()).unwrap(); + let a = art(&r.doc); + assert_eq!(a.len(), 2); + let kids = a[0].children().unwrap(); + assert_eq!(stroke_k(&kids[0]), Some(0.25), "the gray set before the graph, not its settings' `%_0.5 G`"); + assert_eq!(stroke_k(&kids[1]), Some(0.75), "a gray set in the drawn art"); + assert_eq!(stroke_k(&a[1]), Some(0.5), "a gray set after the graph"); +} + +/// Graph operators outside a graph stay operators the reader doesn't know: an error on a layer that +/// shows, noted as unread on `%_` lines (as any operator there), and no graph note. +#[test] +fn graph_operators_outside_a_graph_are_unknown() { + for stray in ["Gs\n", "Go\n", "1 2 Gc\n"] { + let err = read(stream7(&layer7("L", &format!("{}{stray}", rect_path(0.0, 0.0, 5.0, 5.0)))).as_bytes()).unwrap_err(); + assert!(err.contains("operators VectorCraft doesn't know"), "{stray}: {err}"); + } + for (stray, op) in [("%_2 0 0 0 Go\n", "`Go`"), ("%_GS\n", "`GS`"), ("%_1 2 Gc\n", "`Gc`")] { + let r = read(stream7(&layer7("L", &format!("{}f\n{stray}", rect_path(0.0, 0.0, 5.0, 5.0)))).as_bytes()).unwrap(); + assert!(r.hidden_unread.contains(op), "{stray}: {:?}", r.hidden_unread); + assert!(r.warnings.is_empty(), "{stray}: {:?}", r.warnings); + } +} + +/// A graph that starts inside another is noted and the first goes on; one that doesn't end stops at +/// its layer's end, with the art read so far, and the next layer reads as usual. +#[test] +fn malformed_graphs_keep_their_art() { + let nested = format!("{GRAPH_DATA}u\n{}%_Gs\n{}U\n%_GS\n", bar(0.0), bar(30.0)); + let r = read(stream7(&layer7("Graph", &nested)).as_bytes()).unwrap(); + assert_eq!(art(&r.doc)[0].children().unwrap().len(), 2); + assert_eq!(r.warnings, [GRAPH_PLAIN, GRAPH_UNENDED]); + + let unended = format!("{GRAPH_DATA}%_Gt\nu\n{}U\n", bar(0.0)); + let next = format!("%_0.5 G\n{}S\n", rect_path(0.0, 60.0, 5.0, 70.0)); + let r = read(stream7(&format!("{}{}", layer7("Graph", &unended), layer7("Next", &next))).as_bytes()).unwrap(); + assert_eq!(art(&r.doc).len(), 1, "the drawn art read before the layer ended"); + let after = r.doc.layers[1].children().unwrap(); + assert_eq!(stroke_k(&after[0]), Some(0.5), "the next layer isn't in the graph's settings"); + assert_eq!(r.warnings, [GRAPH_PLAIN, GRAPH_UNENDED]); + + // One that doesn't end before the file does. + let cut = stream7(&layer7("Graph", &format!("{GRAPH_DATA}u\n{}U\n", bar(0.0)))).replace("LB\n%AI5_EndLayer--\n", ""); + assert!(read(cut.as_bytes()).is_err(), "a layer that doesn't end is still an error"); +} + +/// A graph's records in the shapes the specification's appendix A gives: several cells on one line, +/// strings, arrays and names as operands, and empty groups among its drawn art. +#[test] +fn a_graphs_records_take_their_operands() { + let settings = "%_Gt\n%_(Bars) GD [1 2 3] 0 Ge\n%_/Name 1 Gi (a) (b) Gl\n%_1 2 3 4 Gm 0 Gp 1 Gr 0 G+ 2 G1 0 Gf 0 Gg 0 Gx 1 GX\n%_GT\n"; + let drawn = format!("u\nU\nu\nu\nU\nU\n{}", bar(10.0)); + let r = read(stream7(&layer7("Graph", &graph(settings, &drawn))).as_bytes()).unwrap(); + let a = art(&r.doc); + assert_eq!(a.len(), 1); + let kids = a[0].children().unwrap(); + fn paths(n: &Node) -> usize { + match n.children() { + Some(c) => c.iter().map(|c| paths(c)).sum(), + None => usize::from(matches!(n.kind, NodeKind::Path { .. })), + } + } + assert!(matches!(kids.last().map(|k| &k.kind), Some(NodeKind::Path { .. })), "the bar is kept after the empty groups: {kids:?}"); + assert_eq!(paths(&a[0]), 1, "the empty groups hold no art"); + assert_eq!(r.warnings, [GRAPH_PLAIN]); +} diff --git a/crates/eps/src/import/tests_illustrator.rs b/crates/eps/src/import/tests_illustrator.rs index f642e33b2..d5261cc4b 100644 --- a/crates/eps/src/import/tests_illustrator.rs +++ b/crates/eps/src/import/tests_illustrator.rs @@ -123,6 +123,37 @@ fn a_postscript_ai_that_names_its_prolog_without_including_it_opens_with_its_lay assert_eq!(tree(d.layers[1].children().unwrap()), "p"); } +/// A `.ai` in PostScript form with a graph on each of two layers (version 7 specification §17): its +/// data on `%_` lines, then its drawn art in a group, each object followed by `%_… Go`. +fn graphs_on_layers() -> String { + let graph = |x: u32| { + format!( + "%_Gs\n%_{x} 10 {} 90 Gb\n%_2 0 0 12 1 1 0 0 2 30 0 Gy\n%_1 1 1 1 Gz\n%_() Gc 5 Gc GC\n%_Gt\n%_0.5 g\n%_GT\n\ + u\n0 0 0 1 k\n{x} 10 m\n{} 10 L\n{} 50 L\n{x} 50 L\n{x} 10 L\nf\n%_1 0 0 0 Go\nu\nU\nU\n%_GS\n", + x + 60, + x + 20, + x + 20 + ) + }; + NAMED_PROLOG + .replace("10 10 L\nS\nLB", &format!("10 10 L\nS\n{}LB", graph(100))) + .replace("190 90 L\nS\nLB", &format!("190 90 L\nS\n{}LB", graph(10))) +} + +#[test] +fn graphs_open_as_their_drawn_art_on_their_layers() { + let r = import(graphs_on_layers().as_bytes()).unwrap(); + assert!(!r.preview, "read through the layers, not a fallback preview"); + let d = &r.document; + let names: Vec<_> = d.layers.iter().map(|l| l.name.clone().unwrap_or_default()).collect(); + assert_eq!(names, ["SECTION::Cut", "SECTION::Hatch"]); + assert_eq!(tree(d.layers[0].children().unwrap()), "p g[p g[]]"); + assert_eq!(tree(d.layers[1].children().unwrap()), "p g[p g[]]"); + let notes: Vec<_> = r.warnings.iter().filter(|w| w.contains("graphs come in as plain art")).collect(); + assert_eq!(notes.len(), 1, "{:?}", r.warnings); + assert!(!r.warnings.iter().any(|w| w.contains("doesn't know") || w.contains("couldn't be read")), "{:?}", r.warnings); +} + /// A `.ai` in PostScript form whose layers can't be read either says why, after what stopped its /// program. #[test] diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index dcc26cdf3..f0f251af5 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -4871,6 +4871,7 @@ digits Malayalam Malaiàlam @msg an image of {w} × {h} pixels is shown at reduced size una imatge de {w} × {h} píxels es mostra a mida reduïda @msg an image of {w} × {h} pixels is too large to draw una imatge de {w} × {h} píxels és massa gran per dibuixar-la @msg an image VectorCraft can't read was left out s’ha omès una imatge que VectorCraft no pot llegir +@msg graphs come in as plain art, without their data or settings els gràfics s’importen com a il·lustració normal, sense les seves dades ni la seva configuració @msg an image whose data is cut short was left out s’ha omès una imatge les dades de la qual estan tallades @msg an object can't be read no es pot llegir un objecte @msg an object in perspective would leave the edited grid un objecte en perspectiva sortiria de la quadrícula editada diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 18b26838a..8e70cbe16 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -4886,6 +4886,7 @@ imageTrace Outline Obrys @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objekty s více výplněmi nebo tahy, efekty či štětci byly načteny jako vykreslený vzhled ({_1}): jejich vzhled zatím nelze upravovat @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it přechod „{name}“ není v souboru definován: zastupuje ho plná barva @msg an image VectorCraft can't read was left out obrázek, který VectorCraft neumí přečíst, byl vynechán +@msg graphs come in as plain art, without their data or settings grafy se načtou jako obyčejná grafika, bez svých dat a nastavení @msg an image whose data is cut short was left out obrázek s useknutými daty byl vynechán @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel propojené obrázky se zobrazují jako náhled v nízkém rozlišení uložený v souboru, dokud se nenajdou jejich soubory: znovu je propojte v panelu Propojení @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise text v oblasti v rámcích příliš nízkých pro řádek písma, ve kterém se zde zobrazuje, dostal vyšší rámce ({_1}): jinak by nebyl vidět diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index c47af8415..92544f799 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -4495,6 +4495,7 @@ theme Appearance Erscheinungsbild @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet Objekte mit mehreren Flächen oder Konturen, Effekten oder Pinseln wurden so übernommen, wie sie gezeichnet aussehen ({_1}): Ihr Aussehen ist noch nicht bearbeitbar @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it der Verlauf „{name}“ ist in der Datei nicht definiert: Eine einfache Farbe steht an seiner Stelle @msg an image VectorCraft can't read was left out ein Bild, das VectorCraft nicht lesen kann, wurde ausgelassen +@msg graphs come in as plain art, without their data or settings Diagramme werden als einfache Grafik übernommen, ohne ihre Daten und Einstellungen @msg an image whose data is cut short was left out ein Bild mit abgeschnittenen Daten wurde ausgelassen @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel verknüpfte Bilder zeigen die in der Datei gespeicherte Vorschau in niedriger Auflösung, bis ihre Dateien gefunden werden: Verknüpfen Sie sie im Bedienfeld „Verknüpfungen“ neu @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise Flächentext in Rahmen, die für eine Zeile der Schrift, in der er hier erscheint, zu niedrig sind, hat höhere Rahmen bekommen ({_1}): Sonst wäre der Text nicht zu sehen diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index e7e2f4ec7..002d87bc6 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -4528,6 +4528,7 @@ digits Malayalam Μαλαγιάλαμ @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet τα αντικείμενα με πολλαπλά γεμίσματα, περιγράμματα, εφέ ή πινέλα εισήχθησαν ως απεικονίσεις ({_1}): η εμφάνισή τους δεν είναι ακόμη επεξεργάσιμη @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it το ντεγκραντέ «{name}» δεν ορίζεται στο αρχείο: χρησιμοποιείται στη θέση του ένα συμπαγές χρώμα @msg an image VectorCraft can't read was left out παραλείφθηκε εικόνα που δεν μπορεί να διαβάσει το VectorCraft +@msg graphs come in as plain art, without their data or settings τα γραφήματα εισάγονται ως απλή γραφική, χωρίς τα δεδομένα και τις ρυθμίσεις τους @msg an image whose data is cut short was left out παραλείφθηκε εικόνα με περικομμένα δεδομένα @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel οι συνδεδεμένες εικόνες εμφανίζουν την προεπισκόπηση χαμηλής ανάλυσης που έχει αποθηκευτεί, μέχρι να βρεθούν τα αρχεία τους: επανασυνδέστε τις στον πίνακα Σύνδεσμοι @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise οι περιοχές κειμένου με πλαίσια πολύ μικρά για μία γραμμή της γραμματοσειράς τους απέκτησαν μεγαλύτερο ύψος ({_1}), διαφορετικά το κείμενο δεν θα εμφανιζόταν diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 4a102b8e9..eb73811fa 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -4580,6 +4580,7 @@ axis Both Ambos @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet los objetos con varios rellenos o trazos, efectos o pinceles se importaron con su aspecto dibujado ({_1}): su aspecto aún no se puede editar @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it el degradado “{name}” no está definido en el archivo: lo sustituye un color sólido @msg an image VectorCraft can't read was left out se omitió una imagen que VectorCraft no puede leer +@msg graphs come in as plain art, without their data or settings los gráficos se importan como ilustración normal, sin sus datos ni sus ajustes @msg an image whose data is cut short was left out se omitió una imagen con datos incompletos @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel las imágenes vinculadas muestran la vista previa de baja resolución guardada en el archivo hasta que se encuentren sus archivos: vuelva a vincularlas en el panel Vínculos @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise el texto de área en marcos demasiado bajos para una línea de la fuente en que se muestra recibió marcos más altos ({_1}): de otro modo no se vería diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index f0133e1fd..2f5517537 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -4788,6 +4788,7 @@ imageTrace Outline Ääriviiva @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objektit, joilla on useita täyttöjä tai viivoja, tehosteita tai siveltimiä, tuotiin piirretyn näköisinä ({_1}): niiden ulkoasua ei voi vielä muokata @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it liukuväriä “{name}” ei ole määritetty tiedostossa: sen tilalla on tasaväri @msg an image VectorCraft can't read was left out kuva, jota VectorCraft ei voi lukea, jätettiin pois +@msg graphs come in as plain art, without their data or settings kaaviot tuodaan tavallisena grafiikkana ilman niiden tietoja ja asetuksia @msg an image whose data is cut short was left out kuva, jonka data on katkennut, jätettiin pois @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel linkitetyt kuvat näyttävät tiedostoon tallennetun matalan tarkkuuden esikatselun, kunnes niiden tiedostot löytyvät: linkitä ne uudelleen Linkit-paneelissa @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise aluetekstin kehykset, jotka olivat liian matalia yhdelle riville niiden fontilla, korotettiin ({_1}): muuten niiden teksti ei näkyisi diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index c8dead30f..1d0de0ead 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -4570,6 +4570,7 @@ axis Both Les deux @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet les objets à plusieurs fonds ou contours, effets ou formes ont été importés tels qu’ils sont dessinés ({_1}) : leur aspect n’est pas encore modifiable @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it le dégradé « {name} » n’est pas défini dans le fichier : une couleur unie le remplace @msg an image VectorCraft can't read was left out une image que VectorCraft ne peut pas lire a été ignorée +@msg graphs come in as plain art, without their data or settings les graphes sont importés comme illustration ordinaire, sans leurs données ni leurs réglages @msg an image whose data is cut short was left out une image aux données tronquées a été ignorée @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel les images liées affichent l’aperçu basse résolution enregistré dans le fichier tant que leurs fichiers ne sont pas trouvés : liez-les à nouveau dans le panneau Liens @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise le texte captif dans des cadres trop bas pour une ligne de la police dans laquelle il s’affiche a reçu des cadres plus hauts ({_1}) : il ne s’afficherait pas autrement diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index e978c4be5..f50272984 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -4616,6 +4616,7 @@ imageTrace Outline Körvonal @msg add a format to export adj meg egy exportálási formátumot @msg already editing a pattern már folyik egy mintázat szerkesztése @msg an image VectorCraft can't read was left out kimaradt egy kép, amelyet a VectorCraft nem tud olvasni +@msg graphs come in as plain art, without their data or settings a diagramok egyszerű grafikaként kerülnek be, adataik és beállításaik nélkül @msg an image whose data is cut short was left out kimaradt egy csonka adatú kép @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel a csatolt képek a fájlban mentett kis felbontású előnézetet mutatják, amíg a fájljaik elő nem kerülnek: csatold őket újra a Csatolások panelen @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise a túl alacsony keretben lévő területszöveg, amelybe a megjelenítő betűtípus egy sora sem fér el, magasabb keretet kapott ({_1}): különben nem látszana diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 474ead3c9..71b06b3e1 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -4621,6 +4621,7 @@ axis Both Entrambi @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet gli oggetti con più riempimenti o tratti, effetti o pennelli sono stati importati come appaiono disegnati ({_1}): il loro aspetto non è ancora modificabile @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it la sfumatura “{name}” non è definita nel file: la sostituisce un colore pieno @msg an image VectorCraft can't read was left out un'immagine che VectorCraft non può leggere è stata omessa +@msg graphs come in as plain art, without their data or settings i grafici vengono importati come grafica semplice, senza i loro dati e le loro impostazioni @msg an image whose data is cut short was left out un'immagine con dati incompleti è stata omessa @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel le immagini collegate mostrano l'anteprima a bassa risoluzione salvata nel file finché i loro file non vengono trovati: ricollegale nel pannello Collegamenti @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise il testo in area in cornici troppo basse per una riga del font in cui viene mostrato ha ricevuto cornici più alte ({_1}): altrimenti non sarebbe visibile diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 321befe60..a0311c606 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -4323,6 +4323,7 @@ swatch Bright Violet ビビッドバイオレット @msg its objects are nested too deeply オブジェクトの入れ子が深すぎます @msg its section ending with `%{end}` doesn't end `%{end}` で終わるはずのセクションが終わっていません @msg an image VectorCraft can't read was left out VectorCraft で読み込めない画像は除外されました +@msg graphs come in as plain art, without their data or settings グラフは通常のアートとして読み込まれ、データと設定は保持されません @msg an image whose data is cut short was left out データが途中で切れている画像は除外されました @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel リンク画像は、元のファイルが見つかるまで、ファイルに保存された低解像度のプレビューで表示されます:リンクパネルで再リンクしてください @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 表示に使われるフォントの 1 行に対して低すぎるフレーム内のエリア内文字は、フレームを高くしました ({_1}): そうしないと文字が表示されません diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 78240b56f..7f81f6115 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -4319,6 +4319,7 @@ font-technology Variable ცვლადი @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet რამდენიმე შევსების ან კონტურის, ეფექტის ან ფუნჯის მქონე ობიექტები შემოვიდა დახატული სახით ({_1}): მათი იერსახე ჯერ არ რედაქტირდება @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it გრადიენტი „{name}“ ფაილში განსაზღვრული არ არის: მის ნაცვლად ერთგვაროვანი ფერია @msg an image VectorCraft can't read was left out გამოსახულება, რომელსაც VectorCraft ვერ კითხულობს, გამოტოვებულია +@msg graphs come in as plain art, without their data or settings დიაგრამები შემოდის როგორც ჩვეულებრივი გრაფიკა, მათი მონაცემებისა და პარამეტრების გარეშე @msg an image whose data is cut short was left out გამოსახულება, რომლის მონაცემებიც შეკვეცილია, გამოტოვებულია @msg its editing data doesn't say where its art is მისი რედაქტირების მონაცემები არ მიუთითებს, სად არის მისი ნახატი @msg this file was saved without PDF compatibility, and its editing data can't be read ({why}) ეს ფაილი PDF-თავსებადობის გარეშეა შენახული და მისი რედაქტირების მონაცემების წაკითხვა ვერ ხერხდება ({why}) diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 0518295a4..bae596c9c 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -4250,6 +4250,7 @@ theme Appearance 외관 @msg its objects are nested too deeply 개체가 너무 깊게 중첩되어 있습니다 @msg its section ending with `%{end}` doesn't end `%{end}`로 끝나는 구역이 끝나지 않습니다 @msg an image VectorCraft can't read was left out VectorCraft가 읽을 수 없는 이미지는 제외했습니다 +@msg graphs come in as plain art, without their data or settings 그래프는 데이터와 설정 없이 일반 아트로 가져왔습니다 @msg an image whose data is cut short was left out 데이터가 잘린 이미지는 제외했습니다 @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 연결된 그림은 해당 파일을 찾을 때까지 파일에 저장된 저해상도 미리 보기로 표시됩니다: 링크 패널에서 다시 연결하세요 @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 표시되는 글꼴의 한 줄보다 낮은 프레임의 영역 문자는 프레임을 더 높였습니다({_1}). 그렇지 않으면 문자가 표시되지 않습니다 diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 23ca0d0ea..74df16a57 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -4712,6 +4712,7 @@ imageTrace Outline Kontur @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet obiekty z kilkoma wypełnieniami lub obrysami, efektami albo pędzlami wczytano jako ich narysowany wygląd ({_1}): ich wyglądu nie można jeszcze edytować @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it gradient „{name}” nie jest zdefiniowany w pliku: zastąpiono go jednolitym kolorem @msg an image VectorCraft can't read was left out pominięto obraz, którego VectorCraft nie potrafi odczytać +@msg graphs come in as plain art, without their data or settings wykresy są wczytywane jako zwykła grafika, bez ich danych i ustawień @msg an image whose data is cut short was left out pominięto obraz z uciętymi danymi @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel połączone obrazy pokazują zapisany w pliku podgląd niskiej rozdzielczości, dopóki ich pliki nie zostaną znalezione: połącz je ponownie w panelu Łącza @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise tekst akapitowy w ramkach niższych niż wiersz wyświetlanej czcionki otrzymał wyższe ramki ({_1}): inaczej tekst nie byłby widoczny diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 152b931e9..391c3f95f 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -4162,6 +4162,7 @@ axis Both Ambos @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objetos com vários preenchimentos ou traços, efeitos ou pincéis entraram com a aparência desenhada ({_1}): sua aparência ainda não é editável @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it o gradiente “{name}” não está definido no arquivo: uma cor sólida o substitui @msg an image VectorCraft can't read was left out uma imagem que o VectorCraft não consegue ler foi omitida +@msg graphs come in as plain art, without their data or settings os gráficos são importados como arte comum, sem seus dados nem configurações @msg an image whose data is cut short was left out uma imagem com dados incompletos foi omitida @msg its editing data doesn't say where its art is seus dados de edição não indicam onde está a arte @msg this file was saved without PDF compatibility, and its editing data can't be read ({why}) este arquivo foi salvo sem compatibilidade com PDF e seus dados de edição não podem ser lidos ({why}) diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index be893970f..5dadcaf0f 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -4616,6 +4616,7 @@ axis Both Оба @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet объекты с несколькими заливками или обводками, эффектами или кистями импортированы в нарисованном виде ({_1}): их оформление пока нельзя редактировать @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it градиент «{name}» не определён в файле: вместо него используется сплошной цвет @msg an image VectorCraft can't read was left out изображение, которое VectorCraft не может прочитать, пропущено +@msg graphs come in as plain art, without their data or settings диаграммы импортируются как обычная графика, без их данных и настроек @msg an image whose data is cut short was left out изображение с обрезанными данными пропущено @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel связанные изображения показываются как сохранённый в файле просмотр низкого разрешения, пока их файлы не найдены: восстановите связи на панели «Связи» @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise текст в области в рамках, слишком низких для строки шрифта, которым он отображается, получил более высокие рамки ({_1}): иначе он не был бы виден diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 1426e7e5a..a683d9985 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -4479,6 +4479,7 @@ axis Both Båda @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objekt med flera fyllningar eller konturer, effekter eller penslar importerades som sitt ritade utseende ({_1}): deras utseende går inte att redigera än @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it gradienten ”{name}” är inte definierad i filen: en enfärgad fyllning används i stället @msg an image VectorCraft can't read was left out en bild som VectorCraft inte kan läsa utelämnades +@msg graphs come in as plain art, without their data or settings diagram läses in som vanlig grafik, utan sina data och inställningar @msg an image whose data is cut short was left out en bild med avkortade data utelämnades @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel länkade bilder visar förhandsgranskningen med låg upplösning som sparats i filen tills deras filer hittas: länka om dem i panelen Länkar @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise områdestext i ramar som var för låga för en rad i det typsnitt den visas med fick högre ramar ({_1}): annars skulle texten inte synas diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 4f12e77d0..43caacf20 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -4317,6 +4317,7 @@ axis Both Her İkisi @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet çeşitli dolgulara veya konturlara, efektlere veya fırçalara sahip nesneler çizilmiş görünümleri olarak geldi ({_1}): görünümleri henüz düzenlenemez @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it “{name}” degradesi dosyada tanımlı değil: onun yerine düz bir renk geliyor @msg an image VectorCraft can't read was left out VectorCraft'ın okuyamadığı bir resim dışarıda bırakıldı +@msg graphs come in as plain art, without their data or settings grafikler, verileri ve ayarları olmadan düz çizim olarak içe aktarılır @msg an image whose data is cut short was left out verileri kısa kesilen bir resim dışarıda bırakıldı @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel bağlantılı resimler, dosyaları bulunana kadar dosyaya kaydedilen düşük çözünürlüklü önizlemeyi gösterir: bunları Bağlantılar panelinde yeniden bağlayın @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise çerçevelerdeki alan türü, daha uzun çerçevelerde gösterdiği yazı tipinin bir satırı için çok kısa ({_1}): bunların türü aksi halde gösterilmez diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index f0f7b333b..c97e58ea7 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -4605,6 +4605,7 @@ axis Both Обидві @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet об’єкти з кількома заливками або обведеннями, ефектами або пензлями імпортовані в намальованому вигляді ({_1}): їх оформлення поки що не можна редагувати @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it градієнт «{name}» не визначено у файлі: замість нього використовується суцільний колір @msg an image VectorCraft can't read was left out зображення, яке VectorCraft не може прочитати, пропущено +@msg graphs come in as plain art, without their data or settings діаграми імпортуються як звичайна графіка, без їхніх даних і налаштувань @msg an image whose data is cut short was left out зображення з обрізаними даними пропущено @msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel пов’язані зображення показуються як збережений у файлі перегляд низької роздільності, доки їхні файли не знайдено: відновіть зв’язки на панелі «Зв’язки» @msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise текст в області в рамках, занизьких для рядка шрифту, яким він показується, отримав вищі рамки ({_1}): інакше його не було б видно diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index c6c740617..30a658006 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -4268,6 +4268,7 @@ theme Appearance Giao diện @msg add a format to export thêm định dạng để xuất @msg already editing a pattern đang chỉnh sửa họa tiết @msg an image VectorCraft can't read was left out một ảnh VectorCraft không đọc được đã bị bỏ qua +@msg graphs come in as plain art, without their data or settings biểu đồ được nhập dưới dạng hình vẽ thường, không kèm dữ liệu và thiết lập của chúng @msg an image whose data is cut short was left out một ảnh bị cắt ngắn dữ liệu đã bị bỏ qua @msg an object can't be read không thể đọc một đối tượng @msg an object in perspective would leave the edited grid đối tượng trong phối cảnh sẽ rời khỏi lưới đang chỉnh sửa diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index b260148aa..b5de6cab5 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -4048,6 +4048,7 @@ imageTrace Outline 轮廓 @msg its objects are nested too deeply 其对象嵌套过深 @msg its section ending with `%{end}` doesn't end 其以 `%{end}` 结束的部分没有结束 @msg an image VectorCraft can't read was left out 已略去 VectorCraft 无法读取的图像 +@msg graphs come in as plain art, without their data or settings 图表作为普通图稿导入,不保留其数据和设置 @msg an image whose data is cut short was left out 已略去数据不完整的图像 @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it 文件中未定义渐变“{name}”:已改用纯色代替 @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet 带有多个填色或描边、效果或画笔的对象已按其绘制外观导入 ({_1}):其外观尚不可编辑 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 808b6a708..6d386f111 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1970,6 +1970,7 @@ file-filter Templates 範本 @msg its objects are nested too deeply 其物件巢狀層級過深 @msg its section ending with `%{end}` doesn't end 其以 `%{end}` 結尾的區段沒有結束 @msg an image VectorCraft can't read was left out 已略過 VectorCraft 無法讀取的影像 +@msg graphs come in as plain art, without their data or settings 圖表以一般圖稿匯入,不保留其資料與設定 @msg an image whose data is cut short was left out 已略過資料不完整的影像 @msg gradient “{name}” isn't defined in the file: a plain colour stands in for it 檔案中未定義漸層「{name}」:已改用單色替代 @msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet 具有多個填色或筆畫、效果或筆刷的物件已依其繪製外觀匯入 ({_1}):其外觀目前尚無法編輯 diff --git a/docs/file-format-parity.md b/docs/file-format-parity.md index 32d87a1ac..27ef5b5e8 100644 --- a/docs/file-format-parity.md +++ b/docs/file-format-parity.md @@ -91,6 +91,8 @@ private editing data. VectorCraft: without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868. lines lost (#779), some files 4× slower to open since the editing data is read whole (#758), live effects, brushes and symbols come in as their drawn look (#637; pattern fills are read since #1025); legacy `.ai` + without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868. Graphs (`%_Gs` … `%_GS`) + come in as their drawn art, as plain groups, paths and type, without their data or settings, with a note. without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868, with its paragraphs' letter and word spacing (`TC`, `TW`), hanging punctuation (`Tq`) and hyphenation (`Th`). - Estimate: **~65%** for real exchange with Illustrator users (open: ~75%; save: PDF-compatible, or legacy From f6e262c92e562e60599ffdf58cebc00898fea542 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Mon, 2 Nov 2026 11:24:17 +0700 Subject: [PATCH 2/2] .ai import: translate the note for a graph whose records don't end --- crates/ui-egui/src/i18n/ca.tsv | 1 + crates/ui-egui/src/i18n/cs.tsv | 1 + crates/ui-egui/src/i18n/de.tsv | 1 + crates/ui-egui/src/i18n/el.tsv | 1 + crates/ui-egui/src/i18n/es.tsv | 1 + crates/ui-egui/src/i18n/fi.tsv | 1 + crates/ui-egui/src/i18n/fr.tsv | 1 + crates/ui-egui/src/i18n/hu.tsv | 1 + crates/ui-egui/src/i18n/it.tsv | 1 + crates/ui-egui/src/i18n/ja.tsv | 1 + crates/ui-egui/src/i18n/ka.tsv | 1 + crates/ui-egui/src/i18n/ko.tsv | 1 + crates/ui-egui/src/i18n/pl.tsv | 1 + crates/ui-egui/src/i18n/pt-br.tsv | 1 + crates/ui-egui/src/i18n/ru.tsv | 1 + crates/ui-egui/src/i18n/sv.tsv | 1 + crates/ui-egui/src/i18n/tr.tsv | 1 + crates/ui-egui/src/i18n/uk.tsv | 1 + crates/ui-egui/src/i18n/vi.tsv | 1 + crates/ui-egui/src/i18n/zh-hans.tsv | 1 + crates/ui-egui/src/i18n/zh-hant.tsv | 1 + 21 files changed, 21 insertions(+) diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index f0f251af5..423990a6d 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -4814,6 +4814,7 @@ digits Malayalam Malaiàlam @msg `{to}` is not an available name `{to}` no és un nom disponible @msg `{what}` closes nothing `{what}` no tanca res @msg `{what}` closes something it didn't open `{what}` tanca una cosa que no havia obert +@msg a graph's records don't end where they should: its art was read as it is els registres d’un gràfic no acaben on haurien: la seva il·lustració s’ha llegit tal com és @msg `{w}` takes no operands `{w}` no admet operands @msg a wraparound group is inside a compound path un grup d’ajustament del text és dins d’un traçat compost @msg a bitmap is empty un mapa de bits és buit diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 8e70cbe16..0e064c772 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -4872,6 +4872,7 @@ imageTrace Outline Obrys @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead nejde o logo s plnými barvami ({_1} % jeho plných ploch odpovídá několika plným barvám), takže režim Ploché logo by z jeho přechodů udělal skvrny: použijte místo toho režim Barva @msg `{what}` closes nothing `{what}` nic neuzavírá @msg `{what}` closes something it didn't open `{what}` uzavírá něco, co neotevřel +@msg a graph's records don't end where they should: its art was read as it is záznamy grafu nekončí tam, kde mají: jeho kresba byla načtena tak, jak je @msg `{w}` takes no operands `{w}` nepřijímá žádné operandy @msg a wraparound group is inside a compound path skupina obtékání textu je uvnitř složené cesty @msg a path has too many points cesta má příliš mnoho bodů diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 92544f799..1c1005fc7 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -4481,6 +4481,7 @@ theme Appearance Erscheinungsbild @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead dies ist kein Logo aus flächigen Farben ({_1} % seiner einfarbigen Bereiche entsprechen wenigen flächigen Farben), daher würde der Modus „Flaches Logo“ seine Verläufe in Flecken zerlegen: Verwenden Sie stattdessen den Modus „Farbe“ @msg `{what}` closes nothing `{what}` schließt nichts @msg `{what}` closes something it didn't open `{what}` schließt etwas, das es nicht geöffnet hat +@msg a graph's records don't end where they should: its art was read as it is die Datensätze eines Diagramms enden nicht dort, wo sie sollten: seine Grafik wurde so gelesen, wie sie ist @msg `{w}` takes no operands `{w}` nimmt keine Operanden @msg a wraparound group is inside a compound path eine Textumfluss-Gruppe liegt in einem zusammengesetzten Pfad @msg a path has too many points ein Pfad hat zu viele Punkte diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 002d87bc6..7c0d512fa 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -4514,6 +4514,7 @@ digits Malayalam Μαλαγιάλαμ @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead αυτό δεν είναι λογότυπο επίπεδων χρωμάτων ({_1}% των συμπαγών περιοχών του αντιστοιχούν σε λίγα χρώματα), επομένως η λειτουργία Επίπεδο λογότυπο θα μετατρέψει τα ντεγκραντέ σε κηλίδες: χρησιμοποιήστε τη λειτουργία Χρώμα @msg `{what}` closes nothing το `{what}` δεν κλείνει κανένα στοιχείο @msg `{what}` closes something it didn't open το `{what}` κλείνει στοιχείο που δεν άνοιξε +@msg a graph's records don't end where they should: its art was read as it is οι εγγραφές ενός γραφήματος δεν τελειώνουν εκεί που πρέπει: το έργο του διαβάστηκε όπως είναι @msg `{w}` takes no operands το `{w}` δεν δέχεται τελεστέους @msg a wraparound group is inside a compound path μια ομάδα αναδίπλωσης κειμένου βρίσκεται μέσα σε σύνθετη διαδρομή @msg a path has too many points η διαδρομή έχει υπερβολικά πολλά σημεία diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index eb73811fa..2f3ef3207 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -4566,6 +4566,7 @@ axis Both Ambos @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead esto no es un logotipo de colores planos ({_1}% de sus zonas sólidas coinciden con unos pocos colores planos), así que el modo Logotipo plano convertiría sus degradados en manchas: usa el modo Color @msg `{what}` closes nothing `{what}` no cierra nada @msg `{what}` closes something it didn't open `{what}` cierra algo que no abrió +@msg a graph's records don't end where they should: its art was read as it is los registros de un gráfico no terminan donde deberían: su ilustración se leyó tal cual @msg `{w}` takes no operands `{w}` no admite operandos @msg a wraparound group is inside a compound path un grupo de ceñir texto está dentro de un trazado compuesto @msg a path has too many points un trazado tiene demasiados puntos diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 2f5517537..e544b5461 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -4774,6 +4774,7 @@ imageTrace Outline Ääriviiva @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead tämä ei ole tasavärinen logo ({_1} % sen yhtenäisistä alueista vastaa muutamaa tasaväriä), joten Tasavärilogo-tila muuttaisi sen liukuvärit laikuiksi: käytä sen sijaan Väri-tilaa @msg `{what}` closes nothing `{what}` ei sulje mitään @msg `{what}` closes something it didn't open `{what}` sulkee jotain, mitä se ei avannut +@msg a graph's records don't end where they should: its art was read as it is kaavion tietueet eivät pääty siihen, mihin niiden pitäisi: sen piirros luettiin sellaisenaan @msg `{w}` takes no operands `{w}` ei ota operandeja @msg a wraparound group is inside a compound path tekstin rivitysryhmä on yhdistelmäpolun sisällä @msg a path has too many points polulla on liian monta pistettä diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 1d0de0ead..c6a0b0bf5 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -4556,6 +4556,7 @@ axis Both Les deux @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead ce n’est pas un logo en aplats ({_1} % de ses zones pleines correspondent à quelques couleurs unies), donc le mode Logo en aplats transformerait ses dégradés en taches : utilisez le mode Couleur @msg `{what}` closes nothing `{what}` ne ferme rien @msg `{what}` closes something it didn't open `{what}` ferme quelque chose qu’il n’a pas ouvert +@msg a graph's records don't end where they should: its art was read as it is les enregistrements d’un graphe ne se terminent pas là où ils le devraient : son illustration a été lue telle quelle @msg `{w}` takes no operands `{w}` n’accepte aucun opérande @msg a wraparound group is inside a compound path un groupe d’habillage de texte se trouve dans un tracé transparent @msg a path has too many points un tracé a trop de points diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index f50272984..3da51358e 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -4557,6 +4557,7 @@ imageTrace Outline Körvonal @msg `{to}` is not an available name ez a név nem használható: `{to}` @msg `{what}` closes nothing `{what}` semmit sem zár le @msg `{what}` closes something it didn't open `{what}` olyat zár le, amit nem nyitott meg +@msg a graph's records don't end where they should: its art was read as it is egy grafikon rekordjai nem ott érnek véget, ahol kellene: a grafikája úgy lett beolvasva, ahogy van @msg `{w}` takes no operands `{w}` nem fogad operandusokat @msg a wraparound group is inside a compound path egy szövegkörbefuttatási csoport összetett útvonalon belül van @msg a bitmap is empty egy bitkép üres diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 71b06b3e1..bf4cac799 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -4607,6 +4607,7 @@ axis Both Entrambi @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead questo non è un logo a colori piatti ({_1}% delle sue aree piene corrisponde a pochi colori piatti), quindi la modalità Logo piatto trasformerebbe i suoi sfumati in macchie: usa la modalità Colore @msg `{what}` closes nothing `{what}` non chiude nulla @msg `{what}` closes something it didn't open `{what}` chiude qualcosa che non ha aperto +@msg a graph's records don't end where they should: its art was read as it is i record di un grafico non finiscono dove dovrebbero: la sua grafica è stata letta così com’è @msg `{w}` takes no operands `{w}` non accetta operandi @msg a wraparound group is inside a compound path un gruppo di testo attorno si trova in un tracciato composto @msg a path has too many points un tracciato ha troppi punti diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index a0311c606..9cfbf8cfd 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -4311,6 +4311,7 @@ swatch Bright Violet ビビッドバイオレット @msg unknown command `{0}`; did you mean `{1}`? `{0}` は不明なコマンドです。`{1}` のことですか? @msg `{what}` closes nothing `{what}` に対応する開始部分がありません @msg `{what}` closes something it didn't open `{what}` が対応しない開始部分を閉じています +@msg a graph's records don't end where they should: its art was read as it is グラフのレコードが正しい位置で終わっていません: アートはそのまま読み込まれました @msg `{w}` takes no operands `{w}` はオペランドを取りません @msg a wraparound group is inside a compound path テキストの回り込みグループが複合パスの中にあります @msg a path has too many points ポイントが多すぎるパスがあります diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 7f81f6115..9b2a0b0f6 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -4305,6 +4305,7 @@ font-technology Variable ცვლადი @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead ეს ერთფეროვანი ლოგო არ არის (მისი მყარი არეების {_1}% რამდენიმე ერთგვაროვან ფერს ემთხვევა), ამიტომ Flat Logo რეჟიმი მის გრადიენტებს ლაქებად აქცევდა: გამოიყენეთ Color რეჟიმი @msg `{what}` closes nothing `{what}` არაფერს ხურავს @msg `{what}` closes something it didn't open `{what}` ხურავს იმას, რაც არ გაუხსნია +@msg a graph's records don't end where they should: its art was read as it is დიაგრამის ჩანაწერები იქ არ მთავრდება, სადაც უნდა: მისი გრაფიკა წაკითხულია ისე, როგორც არის @msg `{w}` takes no operands `{w}` ოპერანდებს არ იღებს @msg a wraparound group is inside a compound path ტექსტის გარსშემოვლების ჯგუფი შედგენილი ტრაექტორიის შიგნითაა @msg a path has too many points ტრაექტორიას ზედმეტად ბევრი წერტილი აქვს diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index bae596c9c..7ce3bacc4 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -4238,6 +4238,7 @@ theme Appearance 외관 @msg unknown command `{0}`; did you mean `{1}`? 알 수 없는 명령 `{0}`: `{1}`을(를) 의미하셨습니까? @msg `{what}` closes nothing `{what}`이(가) 닫는 항목이 없습니다 @msg `{what}` closes something it didn't open `{what}`이(가) 열지 않은 항목을 닫습니다 +@msg a graph's records don't end where they should: its art was read as it is 그래프의 레코드가 끝나야 할 곳에서 끝나지 않습니다: 아트는 있는 그대로 읽었습니다 @msg `{w}` takes no operands `{w}`은(는) 피연산자를 받지 않습니다 @msg a wraparound group is inside a compound path 문자 감싸기 그룹이 컴파운드 패스 안에 있습니다 @msg a path has too many points 패스의 점이 너무 많습니다 diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 74df16a57..acfee2fba 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -4698,6 +4698,7 @@ imageTrace Outline Kontur @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead to nie jest logo z płaskimi kolorami ({_1}% jego jednolitych obszarów pasuje do kilku płaskich kolorów), więc tryb Płaskie logo zamieniłby jego gradienty w plamy: użyj trybu Kolor @msg `{what}` closes nothing `{what}` niczego nie zamyka @msg `{what}` closes something it didn't open `{what}` zamyka coś, czego nie otworzył +@msg a graph's records don't end where they should: its art was read as it is rekordy wykresu nie kończą się tam, gdzie powinny: jego grafika została wczytana tak, jak jest @msg `{w}` takes no operands `{w}` nie przyjmuje operandów @msg a wraparound group is inside a compound path grupa oblewania tekstem jest wewnątrz ścieżki złożonej @msg a path has too many points ścieżka ma zbyt wiele punktów diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 391c3f95f..f65b54563 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -4148,6 +4148,7 @@ axis Both Ambos @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead este não é um logotipo de cores chapadas ({_1}% de suas áreas sólidas correspondem a poucas cores chapadas), então o modo Logotipo plano transformaria seus gradientes em manchas: use o modo Cor @msg `{what}` closes nothing `{what}` não fecha nada @msg `{what}` closes something it didn't open `{what}` fecha algo que não abriu +@msg a graph's records don't end where they should: its art was read as it is os registros de um gráfico não terminam onde deveriam: sua arte foi lida como está @msg `{w}` takes no operands `{w}` não aceita operandos @msg a wraparound group is inside a compound path um grupo de quebra de texto está dentro de um traçado composto @msg a path has too many points um traçado tem pontos demais diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 5dadcaf0f..1195322cf 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -4602,6 +4602,7 @@ axis Both Оба @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead это не логотип из плоских цветов ({_1}% его сплошных областей совпадает с несколькими плоскими цветами), поэтому режим «Плоский логотип» превратил бы градиенты в пятна: используйте режим «Цвет» @msg `{what}` closes nothing `{what}` ничего не закрывает @msg `{what}` closes something it didn't open `{what}` закрывает то, что не открывал +@msg a graph's records don't end where they should: its art was read as it is записи диаграммы не заканчиваются там, где должны: её графика прочитана как есть @msg `{w}` takes no operands `{w}` не принимает операндов @msg a wraparound group is inside a compound path группа обтекания текстом находится внутри составного контура @msg a path has too many points в контуре слишком много точек diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index a683d9985..f7d8b5bfb 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -4465,6 +4465,7 @@ axis Both Båda @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead det här är ingen logotyp i platta färger ({_1} % av dess enfärgade ytor matchar några få platta färger), så läget Platt logotyp skulle göra om dess gradienter till fläckar: använd läget Färg i stället @msg `{what}` closes nothing `{what}` stänger ingenting @msg `{what}` closes something it didn't open `{what}` stänger något som den inte öppnade +@msg a graph's records don't end where they should: its art was read as it is ett diagrams poster slutar inte där de ska: dess grafik lästes som den är @msg `{w}` takes no operands `{w}` tar inga operander @msg a wraparound group is inside a compound path en textombrytningsgrupp ligger inuti en sammansatt bana @msg a path has too many points en bana har för många punkter diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 43caacf20..91d6c39b5 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -4303,6 +4303,7 @@ axis Both Her İkisi @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead bu düz renkli bir logo değildir (düz alanların %{_1}'si birkaç düz renkle eşleşir), dolayısıyla Düz Logo modu degradelerini yamalara dönüştürür: bunun yerine Renk modunu kullanın @msg `{what}` closes nothing `{what}` hiçbir şeyi kapatmaz @msg `{what}` closes something it didn't open `{what}` açmadığı bir şeyi kapatıyor +@msg a graph's records don't end where they should: its art was read as it is bir grafiğin kayıtları bitmesi gereken yerde bitmiyor: resmi olduğu gibi okundu @msg `{w}` takes no operands `{w}` işlenen almaz @msg a wraparound group is inside a compound path bir metin kaydırma grubu bileşik bir yolun içinde @msg a path has too many points bir yolun çok fazla noktası var diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index c97e58ea7..72eafbe9a 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -4591,6 +4591,7 @@ axis Both Обидві @msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead це не логотип із плоских кольорів ({_1}% його суцільних областей збігається з кількома плоскими кольорами), тому режим «Плоский логотип» перетворив би градієнти на плями: використовуйте режим «Колір» @msg `{what}` closes nothing `{what}` нічого не закриває @msg `{what}` closes something it didn't open `{what}` закриває те, що не відкривав +@msg a graph's records don't end where they should: its art was read as it is записи діаграми не закінчуються там, де мають: її графіку прочитано як є @msg `{w}` takes no operands `{w}` не приймає операндів @msg a wraparound group is inside a compound path група обтікання текстом розташована всередині складеного контуру @msg a path has too many points у контурі занадто багато точок diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 30a658006..906d3727b 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -4209,6 +4209,7 @@ theme Appearance Giao diện @msg `{to}` is not an available name `{to}` không phải là tên khả dụng @msg `{what}` closes nothing `{what}` không đóng gì @msg `{what}` closes something it didn't open `{what}` đóng thứ nó chưa mở +@msg a graph's records don't end where they should: its art was read as it is các bản ghi của một biểu đồ không kết thúc đúng chỗ: hình vẽ của nó được đọc nguyên trạng @msg `{w}` takes no operands `{w}` không nhận toán hạng @msg a wraparound group is inside a compound path một nhóm bao văn bản nằm trong một đường dẫn phức @msg a bitmap is empty ảnh bitmap trống diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index b5de6cab5..ea2563e81 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -4036,6 +4036,7 @@ imageTrace Outline 轮廓 @msg unknown command `{0}`; did you mean `{1}`? 未知命令 `{0}`;您是否想输入 `{1}`? @msg `{what}` closes nothing `{what}` 没有可结束的内容 @msg `{what}` closes something it didn't open `{what}` 结束了并非由它开始的内容 +@msg a graph's records don't end where they should: its art was read as it is 图表的记录没有在应有的位置结束:其图稿按原样读取 @msg `{w}` takes no operands `{w}` 不接受操作数 @msg a wraparound group is inside a compound path 文本绕排组位于复合路径内 @msg a path has too many points 某条路径的点过多 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 6d386f111..efe0ca5d4 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1958,6 +1958,7 @@ file-filter Templates 範本 @msg unknown command `{0}`; did you mean `{1}`? 未知的指令 `{0}`;您是指 `{1}` 嗎? @msg `{what}` closes nothing `{what}` 沒有可結束的內容 @msg `{what}` closes something it didn't open `{what}` 結束了並非由它開始的內容 +@msg a graph's records don't end where they should: its art was read as it is 圖表的記錄沒有在應有的位置結束:其圖稿按原樣讀取 @msg `{w}` takes no operands `{w}` 不接受運算元 @msg a wraparound group is inside a compound path 文字繞圖群組位於複合路徑內 @msg a path has too many points 有一條路徑的點過多