diff --git a/Cargo.lock b/Cargo.lock index 0a1689bff7..ce5569cde9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6855,6 +6855,7 @@ dependencies = [ "serde", "serde_json", "toml", + "vectorcraft-apischema", "vectorcraft-brush", "vectorcraft-cad", "vectorcraft-color", diff --git a/crates/ui-egui/Cargo.toml b/crates/ui-egui/Cargo.toml index 8e30081d7f..2ea7ac8079 100644 --- a/crates/ui-egui/Cargo.toml +++ b/crates/ui-egui/Cargo.toml @@ -68,6 +68,7 @@ rustix = { workspace = true, features = ["std", "process"] } [dev-dependencies] egui_kittest = { workspace = true, features = ["wgpu", "snapshot"] } +vectorcraft-apischema = { workspace = true } vectorcraft-testkit = { workspace = true } # A variable font built in code (no font file is committed). vectorcraft-text = { workspace = true, features = ["test-fonts"] } diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 50d41f094e..4ec89b8e32 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -660,7 +660,8 @@ const MESSAGE_DEPTH: usize = 5; /// Translate a status or error message for display (see the module docs). Unknown messages, and /// parts of them (file names, numbers, a reason with no entry, a JSON object or array such as /// `{"objects": [...]}`, a value the message quotes in `"…"`, `“…”` or backticks, such as a -/// symbol's name), stay as they are. +/// symbol's name), stay as they are. A part that starts with `{` or `[` is translated only +/// when it is a whole message with an exact entry, such as `[x, y] (two numbers)`. pub fn message(lang: Lang, s: &str) -> String { message_at(lang, s, MESSAGE_DEPTH) } @@ -671,9 +672,16 @@ fn message_at(lang: Lang, s: &str, depth: usize) -> String { let form = count.map_or(forms.len().saturating_sub(1), |n| (lang.0.plural)(n).min(forms.len().saturating_sub(1))); let Some(template) = forms.get(form) else { return s.to_string() }; let quoted = |v: &str| [('"', '"'), ('“', '”'), ('`', '`')].iter().any(|(a, b)| s.contains(&format!("{a}{v}{b}"))); - let nested = |v: &str| depth > 1 && !v.starts_with(['{', '[']) && !quoted(v); - let values: Vec<(&str, String)> = - caps.into_iter().map(|(k, v)| (k, if nested(v) { message_at(lang, v, depth - 1) } else { v.to_string() })).collect(); + let nested = |v: &str| { + if depth <= 1 || quoted(v) { + v.to_string() + } else if v.starts_with(['{', '[']) { + lang.catalog().exact_message(v).unwrap_or(v).to_string() + } else { + message_at(lang, v, depth - 1) + } + }; + let values: Vec<(&str, String)> = caps.into_iter().map(|(k, v)| (k, nested(v))).collect(); let args: Vec<(&str, &str)> = values.iter().map(|(k, v)| (*k, v.as_str())).collect(); fill_once(template, &args) } diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index daed8ba259..b70648cc9a 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -4192,6 +4192,7 @@ axis Both И двете @msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` трябва да бъде цяло число между {min} и {max} (получено е {x}) @msg `{key}` must be between {min} and {max} (got {x}) `{key}` трябва да бъде между {min} и {max} (получено е {x}) @msg `{key}` must be one of {_1} `{key}` трябва да бъде едно от {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` трябва да бъде едно от {_1}, а не {got} @msg `{key}` must be true or false `{key}` трябва да бъде true или false @msg `{k}` must be [x, y] `{k}` трябва да бъде [x, y] @msg `{name}` has no options `{name}` няма опции diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index e1e980e40b..75596c0015 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -4562,6 +4562,7 @@ imageTrace Outline Obris @msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` mora biti cijeli broj između {min} i {max} (dobiveno {x}) @msg `{key}` must be between {min} and {max} (got {x}) `{key}` mora biti između {min} i {max} (dobiveno {x}) @msg `{key}` must be one of {_1} `{key}` mora biti jedno od {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` mora biti jedno od {_1}, a ne {got} @msg `{key}` must be true or false `{key}` mora biti true ili false @msg `top` and `below` can't both be true `top` i `below` ne mogu oba biti true @msg `select` must be true or false `select` mora biti true ili false diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index de51d9949f..945dcf5d11 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -6478,6 +6478,35 @@ digits Malayalam Malaiàlam @msg the path has no anchor points el traçat no té punts d’ancoratge @msg too many anchor points (limit {MAX_ANCHORS}) massa punts d’ancoratge (límit {MAX_ANCHORS}) @msg true or false true o false +@msg a number >= {_1} un nombre >= {_1} +@msg a number > {_1} un nombre > {_1} +@msg a number <= {_1} un nombre <= {_1} +@msg a number < {_1} un nombre < {_1} +@msg a number {_1} to {_2} un nombre de {_1} a {_2} +@msg a number >= {_1} and < {_2} un nombre >= {_1} i < {_2} +@msg a number > {_1} and <= {_2} un nombre > {_1} i <= {_2} +@msg a number > {_1} and < {_2} un nombre > {_1} i < {_2} +@msg a number ({_1}) un nombre ({_1}) +@msg a number >= {_1} ({_2}) un nombre >= {_1} ({_2}) +@msg a number > {_1} ({_2}) un nombre > {_1} ({_2}) +@msg a number <= {_1} ({_2}) un nombre <= {_1} ({_2}) +@msg a number < {_1} ({_2}) un nombre < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) un nombre de {_1} a {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) un nombre >= {_1} i < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) un nombre > {_1} i <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) un nombre > {_1} i < {_2} ({_3}) +@msg an integer un enter +@msg an integer >= {_1} un enter >= {_1} +@msg an integer <= {_1} un enter <= {_1} +@msg an integer {_1} to {_2} un enter de {_1} a {_2} +@msg one of {_1} un de {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` ha de ser un de {_1}, no {got} +@msg an object id (a non-negative integer) un identificador d’objecte (un enter no negatiu) +@msg a list of object ids una llista d’identificadors d’objecte +@msg a color (a string, [r, g, b] or an object) un color (una cadena, [r, g, b] o un objecte) +@msg [x, y] (two numbers) [x, y] (dos nombres) +@msg an object un objecte +@msg a list una llista @msg unknown key `{k}`; the keys here are {_1} clau desconeguda `{k}`; les claus aquí són {_1} @msg {_1} is listed twice {_1} apareix dues vegades @msg {_1} is not the id of an input object {_1} no és l’id d’un objecte d’entrada diff --git a/crates/ui-egui/src/i18n/catalog.rs b/crates/ui-egui/src/i18n/catalog.rs index ac659ac4b2..ab3abff6f5 100644 --- a/crates/ui-egui/src/i18n/catalog.rs +++ b/crates/ui-egui/src/i18n/catalog.rs @@ -249,6 +249,12 @@ impl Catalog { self.templates.iter().find_map(|t| t.captures(s).map(|caps| (t.forms.as_slice(), caps))) } + /// The translation of a status or error message that has an exact `@msg` entry; templates are + /// not tried. + pub fn exact_message(&self, s: &str) -> Option<&str> { + self.messages.get(s).map(String::as_str) + } + /// The plural form `index` of the message whose English forms are `one|other`. pub fn plural(&self, one: &str, other: &str, index: usize) -> Option<&str> { let forms = self.plurals.get(&format!("{one}|{other}"))?; diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 9322569879..9c29a3068b 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -6393,6 +6393,35 @@ axis Y Axis osa Y @msg the path has no anchor points cesta nemá žádné kotevní body @msg too many anchor points (limit {MAX_ANCHORS}) příliš mnoho kotevních bodů (limit {MAX_ANCHORS}) @msg true or false true nebo false +@msg a number >= {_1} číslo >= {_1} +@msg a number > {_1} číslo > {_1} +@msg a number <= {_1} číslo <= {_1} +@msg a number < {_1} číslo < {_1} +@msg a number {_1} to {_2} číslo od {_1} do {_2} +@msg a number >= {_1} and < {_2} číslo >= {_1} a < {_2} +@msg a number > {_1} and <= {_2} číslo > {_1} a <= {_2} +@msg a number > {_1} and < {_2} číslo > {_1} a < {_2} +@msg a number ({_1}) číslo ({_1}) +@msg a number >= {_1} ({_2}) číslo >= {_1} ({_2}) +@msg a number > {_1} ({_2}) číslo > {_1} ({_2}) +@msg a number <= {_1} ({_2}) číslo <= {_1} ({_2}) +@msg a number < {_1} ({_2}) číslo < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) číslo od {_1} do {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) číslo >= {_1} a < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) číslo > {_1} a <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) číslo > {_1} a < {_2} ({_3}) +@msg an integer celé číslo +@msg an integer >= {_1} celé číslo >= {_1} +@msg an integer <= {_1} celé číslo <= {_1} +@msg an integer {_1} to {_2} celé číslo od {_1} do {_2} +@msg one of {_1} jedna z hodnot {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` musí být jedna z hodnot {_1}, nikoli {got} +@msg an object id (a non-negative integer) ID objektu (nezáporné celé číslo) +@msg a list of object ids seznam ID objektů +@msg a color (a string, [r, g, b] or an object) barva (řetězec, [r, g, b] nebo objekt) +@msg [x, y] (two numbers) [x, y] (dvě čísla) +@msg an object objekt +@msg a list seznam @msg unknown key `{k}`; the keys here are {_1} neznámý klíč `{k}`; zde platné klíče jsou {_1} @msg {_1} is listed twice {_1} je uveden dvakrát @msg {_1} is not the id of an input object {_1} není ID vstupního objektu diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index d903dbc707..f674ecce29 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -4308,6 +4308,7 @@ imageTrace Outline Kontur @msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` skal være et heltal mellem {min} og {max} (fik {x}) @msg `{key}` must be between {min} and {max} (got {x}) `{key}` skal være mellem {min} og {max} (fik {x}) @msg `{key}` must be one of {_1} `{key}` skal være en af {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` skal være en af {_1}, ikke {got} @msg `{key}` must be true or false `{key}` skal være true eller false @msg `{k}` must be [x, y] `{k}` skal være [x, y] @msg `{name}` has no options `{name}` har ingen indstillinger diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index a726a5b8eb..7e2a636d2a 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -5984,6 +5984,35 @@ axis Y Axis Y-Achse @msg the path has no anchor points der Pfad hat keine Ankerpunkte @msg too many anchor points (limit {MAX_ANCHORS}) zu viele Ankerpunkte (Grenze {MAX_ANCHORS}) @msg true or false true oder false +@msg a number >= {_1} eine Zahl >= {_1} +@msg a number > {_1} eine Zahl > {_1} +@msg a number <= {_1} eine Zahl <= {_1} +@msg a number < {_1} eine Zahl < {_1} +@msg a number {_1} to {_2} eine Zahl von {_1} bis {_2} +@msg a number >= {_1} and < {_2} eine Zahl >= {_1} und < {_2} +@msg a number > {_1} and <= {_2} eine Zahl > {_1} und <= {_2} +@msg a number > {_1} and < {_2} eine Zahl > {_1} und < {_2} +@msg a number ({_1}) eine Zahl ({_1}) +@msg a number >= {_1} ({_2}) eine Zahl >= {_1} ({_2}) +@msg a number > {_1} ({_2}) eine Zahl > {_1} ({_2}) +@msg a number <= {_1} ({_2}) eine Zahl <= {_1} ({_2}) +@msg a number < {_1} ({_2}) eine Zahl < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) eine Zahl von {_1} bis {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) eine Zahl >= {_1} und < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) eine Zahl > {_1} und <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) eine Zahl > {_1} und < {_2} ({_3}) +@msg an integer eine ganze Zahl +@msg an integer >= {_1} eine ganze Zahl >= {_1} +@msg an integer <= {_1} eine ganze Zahl <= {_1} +@msg an integer {_1} to {_2} eine ganze Zahl von {_1} bis {_2} +@msg one of {_1} einer der Werte {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` muss einer der Werte {_1} sein, nicht {got} +@msg an object id (a non-negative integer) eine Objekt-ID (eine nicht negative ganze Zahl) +@msg a list of object ids eine Liste von Objekt-IDs +@msg a color (a string, [r, g, b] or an object) eine Farbe (eine Zeichenkette, [r, g, b] oder ein Objekt) +@msg [x, y] (two numbers) [x, y] (zwei Zahlen) +@msg an object ein Objekt +@msg a list eine Liste @msg unknown key `{k}`; the keys here are {_1} unbekannter Schlüssel `{k}`; die Schlüssel hier sind {_1} @msg {_1} is listed twice {_1} ist doppelt aufgeführt @msg {_1} is not the id of an input object {_1} ist nicht die ID eines Eingabeobjekts diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index fd6c9c5ffe..ec8ca831b2 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -6344,6 +6344,35 @@ axis Y Axis Άξονας Y @msg the path has no anchor points η διαδρομή δεν έχει σημεία αγκύρωσης @msg too many anchor points (limit {MAX_ANCHORS}) πάρα πολλά σημεία αγκύρωσης (όριο {MAX_ANCHORS}) @msg true or false true ή false +@msg a number >= {_1} αριθμός >= {_1} +@msg a number > {_1} αριθμός > {_1} +@msg a number <= {_1} αριθμός <= {_1} +@msg a number < {_1} αριθμός < {_1} +@msg a number {_1} to {_2} αριθμός από {_1} έως {_2} +@msg a number >= {_1} and < {_2} αριθμός >= {_1} και < {_2} +@msg a number > {_1} and <= {_2} αριθμός > {_1} και <= {_2} +@msg a number > {_1} and < {_2} αριθμός > {_1} και < {_2} +@msg a number ({_1}) αριθμός ({_1}) +@msg a number >= {_1} ({_2}) αριθμός >= {_1} ({_2}) +@msg a number > {_1} ({_2}) αριθμός > {_1} ({_2}) +@msg a number <= {_1} ({_2}) αριθμός <= {_1} ({_2}) +@msg a number < {_1} ({_2}) αριθμός < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) αριθμός από {_1} έως {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) αριθμός >= {_1} και < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) αριθμός > {_1} και <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) αριθμός > {_1} και < {_2} ({_3}) +@msg an integer ακέραιος +@msg an integer >= {_1} ακέραιος >= {_1} +@msg an integer <= {_1} ακέραιος <= {_1} +@msg an integer {_1} to {_2} ακέραιος από {_1} έως {_2} +@msg one of {_1} μία από τις τιμές {_1} +@msg `{path}` must be one of {_1}, not {got} Το `{path}` πρέπει να είναι μία από τις τιμές {_1}, όχι {got} +@msg an object id (a non-negative integer) αναγνωριστικό αντικειμένου (μη αρνητικός ακέραιος) +@msg a list of object ids λίστα αναγνωριστικών αντικειμένων +@msg a color (a string, [r, g, b] or an object) χρώμα (συμβολοσειρά, [r, g, b] ή αντικείμενο) +@msg [x, y] (two numbers) [x, y] (δύο αριθμοί) +@msg an object αντικείμενο +@msg a list λίστα @msg unknown key `{k}`; the keys here are {_1} άγνωστο κλειδί `{k}`· τα κλειδιά εδώ είναι {_1} @msg {_1} is listed twice το {_1} αναφέρεται δύο φορές @msg {_1} is not the id of an input object το {_1} δεν είναι αναγνωριστικό αντικειμένου εισόδου diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 5c4699832a..fc2a9290b8 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -6335,6 +6335,35 @@ axis Y Axis Eje Y @msg the path has no anchor points el trazado no tiene puntos de ancla @msg too many anchor points (limit {MAX_ANCHORS}) demasiados puntos de ancla (límite {MAX_ANCHORS}) @msg true or false true o false +@msg a number >= {_1} un número >= {_1} +@msg a number > {_1} un número > {_1} +@msg a number <= {_1} un número <= {_1} +@msg a number < {_1} un número < {_1} +@msg a number {_1} to {_2} un número de {_1} a {_2} +@msg a number >= {_1} and < {_2} un número >= {_1} y < {_2} +@msg a number > {_1} and <= {_2} un número > {_1} y <= {_2} +@msg a number > {_1} and < {_2} un número > {_1} y < {_2} +@msg a number ({_1}) un número ({_1}) +@msg a number >= {_1} ({_2}) un número >= {_1} ({_2}) +@msg a number > {_1} ({_2}) un número > {_1} ({_2}) +@msg a number <= {_1} ({_2}) un número <= {_1} ({_2}) +@msg a number < {_1} ({_2}) un número < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) un número de {_1} a {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) un número >= {_1} y < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) un número > {_1} y <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) un número > {_1} y < {_2} ({_3}) +@msg an integer un entero +@msg an integer >= {_1} un entero >= {_1} +@msg an integer <= {_1} un entero <= {_1} +@msg an integer {_1} to {_2} un entero de {_1} a {_2} +@msg one of {_1} uno de {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` debe ser uno de {_1}, no {got} +@msg an object id (a non-negative integer) un id. de objeto (un entero no negativo) +@msg a list of object ids una lista de id. de objeto +@msg a color (a string, [r, g, b] or an object) un color (una cadena, [r, g, b] o un objeto) +@msg [x, y] (two numbers) [x, y] (dos números) +@msg an object un objeto +@msg a list una lista @msg unknown key `{k}`; the keys here are {_1} clave desconocida `{k}`; las claves aquí son {_1} @msg {_1} is listed twice {_1} aparece dos veces @msg {_1} is not the id of an input object {_1} no es el id de un objeto de entrada diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index d96c255437..35e5c8b2b9 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -6423,6 +6423,35 @@ axis Y Axis Y-akseli @msg the path has no anchor points polulla ei ole ankkuripisteitä @msg too many anchor points (limit {MAX_ANCHORS}) liian monta ankkuripistettä (raja {MAX_ANCHORS}) @msg true or false true tai false +@msg a number >= {_1} luku >= {_1} +@msg a number > {_1} luku > {_1} +@msg a number <= {_1} luku <= {_1} +@msg a number < {_1} luku < {_1} +@msg a number {_1} to {_2} luku, joka on vähintään {_1} ja enintään {_2} +@msg a number >= {_1} and < {_2} luku >= {_1} ja < {_2} +@msg a number > {_1} and <= {_2} luku > {_1} ja <= {_2} +@msg a number > {_1} and < {_2} luku > {_1} ja < {_2} +@msg a number ({_1}) luku ({_1}) +@msg a number >= {_1} ({_2}) luku >= {_1} ({_2}) +@msg a number > {_1} ({_2}) luku > {_1} ({_2}) +@msg a number <= {_1} ({_2}) luku <= {_1} ({_2}) +@msg a number < {_1} ({_2}) luku < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) luku, joka on vähintään {_1} ja enintään {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) luku >= {_1} ja < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) luku > {_1} ja <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) luku > {_1} ja < {_2} ({_3}) +@msg an integer kokonaisluku +@msg an integer >= {_1} kokonaisluku >= {_1} +@msg an integer <= {_1} kokonaisluku <= {_1} +@msg an integer {_1} to {_2} kokonaisluku, joka on vähintään {_1} ja enintään {_2} +@msg one of {_1} jokin arvoista {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` on oltava jokin arvoista {_1}, ei {got} +@msg an object id (a non-negative integer) objektitunnus (ei-negatiivinen kokonaisluku) +@msg a list of object ids objektitunnusten luettelo +@msg a color (a string, [r, g, b] or an object) väri (merkkijono, [r, g, b] tai objekti) +@msg [x, y] (two numbers) [x, y] (kaksi lukua) +@msg an object objekti +@msg a list luettelo @msg unknown key `{k}`; the keys here are {_1} tuntematon avain `{k}`; tässä käytettävät avaimet ovat {_1} @msg {_1} is listed twice {_1} on luettelossa kahdesti @msg {_1} is not the id of an input object {_1} ei ole syöteobjektin tunnus diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index b1bd34e96a..82391dff60 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -6388,6 +6388,35 @@ axis Y Axis Axe Y @msg the path has no anchor points le tracé n’a aucun point d’ancrage @msg too many anchor points (limit {MAX_ANCHORS}) trop de points d’ancrage (limite {MAX_ANCHORS}) @msg true or false true ou false +@msg a number >= {_1} un nombre >= {_1} +@msg a number > {_1} un nombre > {_1} +@msg a number <= {_1} un nombre <= {_1} +@msg a number < {_1} un nombre < {_1} +@msg a number {_1} to {_2} un nombre de {_1} à {_2} +@msg a number >= {_1} and < {_2} un nombre >= {_1} et < {_2} +@msg a number > {_1} and <= {_2} un nombre > {_1} et <= {_2} +@msg a number > {_1} and < {_2} un nombre > {_1} et < {_2} +@msg a number ({_1}) un nombre ({_1}) +@msg a number >= {_1} ({_2}) un nombre >= {_1} ({_2}) +@msg a number > {_1} ({_2}) un nombre > {_1} ({_2}) +@msg a number <= {_1} ({_2}) un nombre <= {_1} ({_2}) +@msg a number < {_1} ({_2}) un nombre < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) un nombre de {_1} à {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) un nombre >= {_1} et < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) un nombre > {_1} et <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) un nombre > {_1} et < {_2} ({_3}) +@msg an integer un entier +@msg an integer >= {_1} un entier >= {_1} +@msg an integer <= {_1} un entier <= {_1} +@msg an integer {_1} to {_2} un entier de {_1} à {_2} +@msg one of {_1} l’une des valeurs {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` doit être l’une des valeurs {_1}, pas {got} +@msg an object id (a non-negative integer) un identifiant d’objet (un entier positif ou nul) +@msg a list of object ids une liste d’identifiants d’objet +@msg a color (a string, [r, g, b] or an object) une couleur (une chaîne, [r, g, b] ou un objet) +@msg [x, y] (two numbers) [x, y] (deux nombres) +@msg an object un objet +@msg a list une liste @msg unknown key `{k}`; the keys here are {_1} clé inconnue `{k}` ; les clés ici sont {_1} @msg {_1} is listed twice {_1} figure deux fois @msg {_1} is not the id of an input object {_1} n’est pas l’identifiant d’un objet d’entrée diff --git a/crates/ui-egui/src/i18n/hi.tsv b/crates/ui-egui/src/i18n/hi.tsv index 21494684d1..2a6f9a84df 100644 --- a/crates/ui-egui/src/i18n/hi.tsv +++ b/crates/ui-egui/src/i18n/hi.tsv @@ -5546,6 +5546,35 @@ antiAlias Sharp शार्प @msg the path has no anchor points पाथ में कोई एंकर पॉइंट नहीं है @msg too many anchor points (limit {MAX_ANCHORS}) बहुत अधिक एंकर पॉइंट (सीमा {MAX_ANCHORS}) @msg true or false true या false +@msg a number >= {_1} एक संख्या >= {_1} +@msg a number > {_1} एक संख्या > {_1} +@msg a number <= {_1} एक संख्या <= {_1} +@msg a number < {_1} एक संख्या < {_1} +@msg a number {_1} to {_2} {_1} से {_2} तक की एक संख्या +@msg a number >= {_1} and < {_2} एक संख्या >= {_1} और < {_2} +@msg a number > {_1} and <= {_2} एक संख्या > {_1} और <= {_2} +@msg a number > {_1} and < {_2} एक संख्या > {_1} और < {_2} +@msg a number ({_1}) एक संख्या ({_1}) +@msg a number >= {_1} ({_2}) एक संख्या >= {_1} ({_2}) +@msg a number > {_1} ({_2}) एक संख्या > {_1} ({_2}) +@msg a number <= {_1} ({_2}) एक संख्या <= {_1} ({_2}) +@msg a number < {_1} ({_2}) एक संख्या < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} से {_2} तक की एक संख्या ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) एक संख्या >= {_1} और < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) एक संख्या > {_1} और <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) एक संख्या > {_1} और < {_2} ({_3}) +@msg an integer एक पूर्णांक +@msg an integer >= {_1} एक पूर्णांक >= {_1} +@msg an integer <= {_1} एक पूर्णांक <= {_1} +@msg an integer {_1} to {_2} {_1} से {_2} तक का एक पूर्णांक +@msg one of {_1} {_1} में से एक +@msg `{path}` must be one of {_1}, not {got} `{path}` {_1} में से एक होना चाहिए, {got} नहीं +@msg an object id (a non-negative integer) एक ऑब्जेक्ट id (एक गैर-नकारात्मक पूर्णांक) +@msg a list of object ids ऑब्जेक्ट ids की एक सूची +@msg a color (a string, [r, g, b] or an object) एक रंग (एक स्ट्रिंग, [r, g, b] या एक ऑब्जेक्ट) +@msg [x, y] (two numbers) [x, y] (दो संख्याएँ) +@msg an object एक ऑब्जेक्ट +@msg a list एक सूची @msg unknown key `{k}`; the keys here are {_1} अज्ञात कुंजी `{k}`; यहाँ की कुंजियाँ {_1} हैं @msg {_1} is listed twice {_1} दो बार सूचीबद्ध है @msg {_1} is not the id of an input object {_1} किसी इनपुट ऑब्जेक्ट का id नहीं है diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index a45258e5fe..50551e2063 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -6376,6 +6376,35 @@ axis Y Axis Y tengely @msg the path has no anchor points az útvonalnak nincsenek horgonypontjai @msg too many anchor points (limit {MAX_ANCHORS}) túl sok horgonypont (korlát: {MAX_ANCHORS}) @msg true or false true vagy false +@msg a number >= {_1} szám >= {_1} +@msg a number > {_1} szám > {_1} +@msg a number <= {_1} szám <= {_1} +@msg a number < {_1} szám < {_1} +@msg a number {_1} to {_2} {_1} és {_2} közötti szám +@msg a number >= {_1} and < {_2} szám >= {_1} és < {_2} +@msg a number > {_1} and <= {_2} szám > {_1} és <= {_2} +@msg a number > {_1} and < {_2} szám > {_1} és < {_2} +@msg a number ({_1}) szám ({_1}) +@msg a number >= {_1} ({_2}) szám >= {_1} ({_2}) +@msg a number > {_1} ({_2}) szám > {_1} ({_2}) +@msg a number <= {_1} ({_2}) szám <= {_1} ({_2}) +@msg a number < {_1} ({_2}) szám < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} és {_2} közötti szám ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) szám >= {_1} és < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) szám > {_1} és <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) szám > {_1} és < {_2} ({_3}) +@msg an integer egész szám +@msg an integer >= {_1} egész szám >= {_1} +@msg an integer <= {_1} egész szám <= {_1} +@msg an integer {_1} to {_2} {_1} és {_2} közötti egész szám +@msg one of {_1} {_1} közül az egyik +@msg `{path}` must be one of {_1}, not {got} `{path}`: {_1} közül az egyik kell, nem ez: {got} +@msg an object id (a non-negative integer) objektumazonosító (nemnegatív egész szám) +@msg a list of object ids objektumazonosítók listája +@msg a color (a string, [r, g, b] or an object) szín (karakterlánc, [r, g, b] vagy objektum) +@msg [x, y] (two numbers) [x, y] (két szám) +@msg an object objektum +@msg a list lista @msg unknown key `{k}`; the keys here are {_1} ismeretlen kulcs: `{k}`; az itt használható kulcsok: {_1} @msg {_1} is listed twice {_1} kétszer szerepel @msg {_1} is not the id of an input object {_1} nem egy bemeneti objektum azonosítója diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index 4afb33ff7b..a80ba4a759 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -4308,6 +4308,7 @@ imageTrace Outline Kontur @msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` harus berupa bilangan bulat antara {min} dan {max} (diperoleh {x}) @msg `{key}` must be between {min} and {max} (got {x}) `{key}` harus di antara {min} dan {max} (diperoleh {x}) @msg `{key}` must be one of {_1} `{key}` harus salah satu dari {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` harus salah satu dari {_1}, bukan {got} @msg `{key}` must be true or false `{key}` harus true atau false @msg `{k}` must be [x, y] `{k}` harus [x, y] @msg `{name}` has no options `{name}` tidak memiliki opsi diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 7f86ca6e48..a61a82a0b2 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -6018,6 +6018,35 @@ axis Y Axis Asse Y @msg the path has no anchor points il tracciato non ha punti di ancoraggio @msg too many anchor points (limit {MAX_ANCHORS}) troppi punti di ancoraggio (limite {MAX_ANCHORS}) @msg true or false true o false +@msg a number >= {_1} un numero >= {_1} +@msg a number > {_1} un numero > {_1} +@msg a number <= {_1} un numero <= {_1} +@msg a number < {_1} un numero < {_1} +@msg a number {_1} to {_2} un numero da {_1} a {_2} +@msg a number >= {_1} and < {_2} un numero >= {_1} e < {_2} +@msg a number > {_1} and <= {_2} un numero > {_1} e <= {_2} +@msg a number > {_1} and < {_2} un numero > {_1} e < {_2} +@msg a number ({_1}) un numero ({_1}) +@msg a number >= {_1} ({_2}) un numero >= {_1} ({_2}) +@msg a number > {_1} ({_2}) un numero > {_1} ({_2}) +@msg a number <= {_1} ({_2}) un numero <= {_1} ({_2}) +@msg a number < {_1} ({_2}) un numero < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) un numero da {_1} a {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) un numero >= {_1} e < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) un numero > {_1} e <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) un numero > {_1} e < {_2} ({_3}) +@msg an integer un intero +@msg an integer >= {_1} un intero >= {_1} +@msg an integer <= {_1} un intero <= {_1} +@msg an integer {_1} to {_2} un intero da {_1} a {_2} +@msg one of {_1} uno tra {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` deve essere uno tra {_1}, non {got} +@msg an object id (a non-negative integer) un ID di oggetto (un intero non negativo) +@msg a list of object ids un elenco di ID di oggetti +@msg a color (a string, [r, g, b] or an object) un colore (una stringa, [r, g, b] o un oggetto) +@msg [x, y] (two numbers) [x, y] (due numeri) +@msg an object un oggetto +@msg a list un elenco @msg unknown key `{k}`; the keys here are {_1} chiave sconosciuta `{k}`; le chiavi qui sono {_1} @msg {_1} is listed twice {_1} è elencato due volte @msg {_1} is not the id of an input object {_1} non è l’id di un oggetto di input diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index da64b3cde6..0eab273ce5 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -6083,6 +6083,35 @@ axis Y Axis Y 軸 @msg the path has no anchor points パスにアンカーポイントがありません @msg too many anchor points (limit {MAX_ANCHORS}) アンカーポイントが多すぎます (上限 {MAX_ANCHORS}) @msg true or false true または false +@msg a number >= {_1} {_1} 以上の数値 +@msg a number > {_1} {_1} より大きい数値 +@msg a number <= {_1} {_1} 以下の数値 +@msg a number < {_1} {_1} 未満の数値 +@msg a number {_1} to {_2} {_1} から {_2} までの数値 +@msg a number >= {_1} and < {_2} {_1} 以上 {_2} 未満の数値 +@msg a number > {_1} and <= {_2} {_1} より大きく {_2} 以下の数値 +@msg a number > {_1} and < {_2} {_1} より大きく {_2} 未満の数値 +@msg a number ({_1}) 数値 ({_1}) +@msg a number >= {_1} ({_2}) {_1} 以上の数値 ({_2}) +@msg a number > {_1} ({_2}) {_1} より大きい数値 ({_2}) +@msg a number <= {_1} ({_2}) {_1} 以下の数値 ({_2}) +@msg a number < {_1} ({_2}) {_1} 未満の数値 ({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} から {_2} までの数値 ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) {_1} 以上 {_2} 未満の数値 ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) {_1} より大きく {_2} 以下の数値 ({_3}) +@msg a number > {_1} and < {_2} ({_3}) {_1} より大きく {_2} 未満の数値 ({_3}) +@msg an integer 整数 +@msg an integer >= {_1} {_1} 以上の整数 +@msg an integer <= {_1} {_1} 以下の整数 +@msg an integer {_1} to {_2} {_1} から {_2} までの整数 +@msg one of {_1} {_1} のいずれか +@msg `{path}` must be one of {_1}, not {got} `{path}` は {_1} のいずれかにしてください ({got} は使えません) +@msg an object id (a non-negative integer) オブジェクト ID (0 以上の整数) +@msg a list of object ids オブジェクト ID のリスト +@msg a color (a string, [r, g, b] or an object) カラー (文字列、[r, g, b] またはオブジェクト) +@msg [x, y] (two numbers) [x, y] (2 つの数値) +@msg an object オブジェクト +@msg a list リスト @msg unknown key `{k}`; the keys here are {_1} `{k}` は不明なキーです。ここで使えるキー: {_1} @msg {_1} is listed twice {_1} が 2 回指定されています @msg {_1} is not the id of an input object {_1} は入力オブジェクトの ID ではありません diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 3765f9ce96..60b8da3c43 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -6344,6 +6344,35 @@ axis Y Axis Y ღერძი @msg the path has no anchor points ტრაექტორიას საყრდენი წერტილები არ აქვს @msg too many anchor points (limit {MAX_ANCHORS}) ძალიან ბევრი საყრდენი წერტილი (ლიმიტი {MAX_ANCHORS}) @msg true or false true ან false +@msg a number >= {_1} რიცხვი >= {_1} +@msg a number > {_1} რიცხვი > {_1} +@msg a number <= {_1} რიცხვი <= {_1} +@msg a number < {_1} რიცხვი < {_1} +@msg a number {_1} to {_2} რიცხვი {_1}-დან {_2}-მდე +@msg a number >= {_1} and < {_2} რიცხვი >= {_1} და < {_2} +@msg a number > {_1} and <= {_2} რიცხვი > {_1} და <= {_2} +@msg a number > {_1} and < {_2} რიცხვი > {_1} და < {_2} +@msg a number ({_1}) რიცხვი ({_1}) +@msg a number >= {_1} ({_2}) რიცხვი >= {_1} ({_2}) +@msg a number > {_1} ({_2}) რიცხვი > {_1} ({_2}) +@msg a number <= {_1} ({_2}) რიცხვი <= {_1} ({_2}) +@msg a number < {_1} ({_2}) რიცხვი < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) რიცხვი {_1}-დან {_2}-მდე ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) რიცხვი >= {_1} და < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) რიცხვი > {_1} და <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) რიცხვი > {_1} და < {_2} ({_3}) +@msg an integer მთელი რიცხვი +@msg an integer >= {_1} მთელი რიცხვი >= {_1} +@msg an integer <= {_1} მთელი რიცხვი <= {_1} +@msg an integer {_1} to {_2} მთელი რიცხვი {_1}-დან {_2}-მდე +@msg one of {_1} ერთ-ერთი მნიშვნელობა {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` უნდა იყოს ერთ-ერთი მნიშვნელობა {_1} და არა {got} +@msg an object id (a non-negative integer) ობიექტის იდენტიფიკატორი (არაუარყოფითი მთელი რიცხვი) +@msg a list of object ids ობიექტების იდენტიფიკატორების სია +@msg a color (a string, [r, g, b] or an object) ფერი (სტრიქონი, [r, g, b] ან ობიექტი) +@msg [x, y] (two numbers) [x, y] (ორი რიცხვი) +@msg an object ობიექტი +@msg a list სია @msg unknown key `{k}`; the keys here are {_1} უცნობი გასაღები `{k}`; აქ გასაღებებია: {_1} @msg {_1} is listed twice {_1} ორჯერაა მითითებული @msg {_1} is not the id of an input object {_1} შემავალი ობიექტის ID არ არის diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 7f666576e8..c94aa99e91 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -5979,6 +5979,35 @@ axis Y Axis Y축 @msg the path has no anchor points 패스에 앵커 포인트가 없습니다 @msg too many anchor points (limit {MAX_ANCHORS}) 앵커 포인트가 너무 많습니다(한도 {MAX_ANCHORS}) @msg true or false true 또는 false +@msg a number >= {_1} {_1} 이상인 숫자 +@msg a number > {_1} {_1} 초과인 숫자 +@msg a number <= {_1} {_1} 이하인 숫자 +@msg a number < {_1} {_1} 미만인 숫자 +@msg a number {_1} to {_2} {_1} 이상 {_2} 이하인 숫자 +@msg a number >= {_1} and < {_2} {_1} 이상 {_2} 미만인 숫자 +@msg a number > {_1} and <= {_2} {_1} 초과 {_2} 이하인 숫자 +@msg a number > {_1} and < {_2} {_1} 초과 {_2} 미만인 숫자 +@msg a number ({_1}) 숫자({_1}) +@msg a number >= {_1} ({_2}) {_1} 이상인 숫자({_2}) +@msg a number > {_1} ({_2}) {_1} 초과인 숫자({_2}) +@msg a number <= {_1} ({_2}) {_1} 이하인 숫자({_2}) +@msg a number < {_1} ({_2}) {_1} 미만인 숫자({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} 이상 {_2} 이하인 숫자({_3}) +@msg a number >= {_1} and < {_2} ({_3}) {_1} 이상 {_2} 미만인 숫자({_3}) +@msg a number > {_1} and <= {_2} ({_3}) {_1} 초과 {_2} 이하인 숫자({_3}) +@msg a number > {_1} and < {_2} ({_3}) {_1} 초과 {_2} 미만인 숫자({_3}) +@msg an integer 정수 +@msg an integer >= {_1} {_1} 이상인 정수 +@msg an integer <= {_1} {_1} 이하인 정수 +@msg an integer {_1} to {_2} {_1} 이상 {_2} 이하인 정수 +@msg one of {_1} {_1} 중 하나 +@msg `{path}` must be one of {_1}, not {got} `{path}`은(는) {_1} 중 하나여야 합니다({got} 사용 불가) +@msg an object id (a non-negative integer) 개체 ID(음수가 아닌 정수) +@msg a list of object ids 개체 ID 목록 +@msg a color (a string, [r, g, b] or an object) 색상(문자열, [r, g, b] 또는 개체) +@msg [x, y] (two numbers) [x, y](숫자 두 개) +@msg an object 개체 +@msg a list 목록 @msg unknown key `{k}`; the keys here are {_1} 알 수 없는 키 `{k}`: 여기서 사용할 수 있는 키: {_1} @msg {_1} is listed twice {_1}이(가) 두 번 나열되었습니다 @msg {_1} is not the id of an input object {_1}은(는) 입력 개체의 ID가 아닙니다 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index a19832082c..44c3fb209c 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -4322,6 +4322,7 @@ imageTrace Outline Contour @msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` moet een geheel getal tussen {min} en {max} zijn (kreeg {x}) @msg `{key}` must be between {min} and {max} (got {x}) `{key}` moet tussen {min} en {max} liggen (kreeg {x}) @msg `{key}` must be one of {_1} `{key}` moet een van {_1} zijn +@msg `{path}` must be one of {_1}, not {got} `{path}` moet een van {_1} zijn, niet {got} @msg `{key}` must be true or false `{key}` moet true of false zijn @msg `{k}` must be [x, y] `{k}` moet [x, y] zijn @msg `{name}` has no options `{name}` heeft geen opties diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index bf1a03dfad..5c4179c782 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -6247,6 +6247,35 @@ axis Y Axis Oś Y @msg the path has no anchor points ścieżka nie ma punktów kontrolnych @msg too many anchor points (limit {MAX_ANCHORS}) za dużo punktów kontrolnych (limit {MAX_ANCHORS}) @msg true or false true lub false +@msg a number >= {_1} liczbą >= {_1} +@msg a number > {_1} liczbą > {_1} +@msg a number <= {_1} liczbą <= {_1} +@msg a number < {_1} liczbą < {_1} +@msg a number {_1} to {_2} liczbą od {_1} do {_2} +@msg a number >= {_1} and < {_2} liczbą >= {_1} i < {_2} +@msg a number > {_1} and <= {_2} liczbą > {_1} i <= {_2} +@msg a number > {_1} and < {_2} liczbą > {_1} i < {_2} +@msg a number ({_1}) liczbą ({_1}) +@msg a number >= {_1} ({_2}) liczbą >= {_1} ({_2}) +@msg a number > {_1} ({_2}) liczbą > {_1} ({_2}) +@msg a number <= {_1} ({_2}) liczbą <= {_1} ({_2}) +@msg a number < {_1} ({_2}) liczbą < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) liczbą od {_1} do {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) liczbą >= {_1} i < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) liczbą > {_1} i <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) liczbą > {_1} i < {_2} ({_3}) +@msg an integer liczbą całkowitą +@msg an integer >= {_1} liczbą całkowitą >= {_1} +@msg an integer <= {_1} liczbą całkowitą <= {_1} +@msg an integer {_1} to {_2} liczbą całkowitą od {_1} do {_2} +@msg one of {_1} jedną z wartości {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` musi być jedną z wartości {_1}, a nie {got} +@msg an object id (a non-negative integer) identyfikatorem obiektu (nieujemną liczbą całkowitą) +@msg a list of object ids listą identyfikatorów obiektów +@msg a color (a string, [r, g, b] or an object) kolorem (ciągiem znaków, [r, g, b] lub obiektem) +@msg [x, y] (two numbers) [x, y] (dwiema liczbami) +@msg an object obiektem +@msg a list listą @msg unknown key `{k}`; the keys here are {_1} nieznany klucz `{k}`; klucze w tym miejscu to {_1} @msg {_1} is listed twice {_1} występuje dwa razy @msg {_1} is not the id of an input object {_1} nie jest identyfikatorem obiektu wejściowego diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index d803238b6e..2302dbcd5c 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -6308,6 +6308,35 @@ axis Y Axis Eixo Y @msg the path has no anchor points o caminho não tem pontos de ancoragem @msg too many anchor points (limit {MAX_ANCHORS}) pontos de ancoragem demais (limite {MAX_ANCHORS}) @msg true or false true ou false +@msg a number >= {_1} um número >= {_1} +@msg a number > {_1} um número > {_1} +@msg a number <= {_1} um número <= {_1} +@msg a number < {_1} um número < {_1} +@msg a number {_1} to {_2} um número de {_1} a {_2} +@msg a number >= {_1} and < {_2} um número >= {_1} e < {_2} +@msg a number > {_1} and <= {_2} um número > {_1} e <= {_2} +@msg a number > {_1} and < {_2} um número > {_1} e < {_2} +@msg a number ({_1}) um número ({_1}) +@msg a number >= {_1} ({_2}) um número >= {_1} ({_2}) +@msg a number > {_1} ({_2}) um número > {_1} ({_2}) +@msg a number <= {_1} ({_2}) um número <= {_1} ({_2}) +@msg a number < {_1} ({_2}) um número < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) um número de {_1} a {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) um número >= {_1} e < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) um número > {_1} e <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) um número > {_1} e < {_2} ({_3}) +@msg an integer um inteiro +@msg an integer >= {_1} um inteiro >= {_1} +@msg an integer <= {_1} um inteiro <= {_1} +@msg an integer {_1} to {_2} um inteiro de {_1} a {_2} +@msg one of {_1} um de {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` deve ser um de {_1}, não {got} +@msg an object id (a non-negative integer) um ID de objeto (um inteiro não negativo) +@msg a list of object ids uma lista de IDs de objeto +@msg a color (a string, [r, g, b] or an object) uma cor (uma string, [r, g, b] ou um objeto) +@msg [x, y] (two numbers) [x, y] (dois números) +@msg an object um objeto +@msg a list uma lista @msg unknown key `{k}`; the keys here are {_1} chave desconhecida `{k}`; as chaves aqui são {_1} @msg {_1} is listed twice {_1} aparece duas vezes @msg {_1} is not the id of an input object {_1} não é o id de um objeto de entrada diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 245f2240f4..6c60695805 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -6004,6 +6004,35 @@ axis Y Axis Ось Y @msg the path has no anchor points у контура нет опорных точек @msg too many anchor points (limit {MAX_ANCHORS}) слишком много опорных точек (предел {MAX_ANCHORS}) @msg true or false true или false +@msg a number >= {_1} число >= {_1} +@msg a number > {_1} число > {_1} +@msg a number <= {_1} число <= {_1} +@msg a number < {_1} число < {_1} +@msg a number {_1} to {_2} число от {_1} до {_2} +@msg a number >= {_1} and < {_2} число >= {_1} и < {_2} +@msg a number > {_1} and <= {_2} число > {_1} и <= {_2} +@msg a number > {_1} and < {_2} число > {_1} и < {_2} +@msg a number ({_1}) число ({_1}) +@msg a number >= {_1} ({_2}) число >= {_1} ({_2}) +@msg a number > {_1} ({_2}) число > {_1} ({_2}) +@msg a number <= {_1} ({_2}) число <= {_1} ({_2}) +@msg a number < {_1} ({_2}) число < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) число от {_1} до {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) число >= {_1} и < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) число > {_1} и <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) число > {_1} и < {_2} ({_3}) +@msg an integer целое число +@msg an integer >= {_1} целое число >= {_1} +@msg an integer <= {_1} целое число <= {_1} +@msg an integer {_1} to {_2} целое число от {_1} до {_2} +@msg one of {_1} одно из значений {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` должно быть одним из значений {_1}, а не {got} +@msg an object id (a non-negative integer) идентификатор объекта (неотрицательное целое число) +@msg a list of object ids список идентификаторов объектов +@msg a color (a string, [r, g, b] or an object) цвет (строка, [r, g, b] или объект) +@msg [x, y] (two numbers) [x, y] (два числа) +@msg an object объект +@msg a list список @msg unknown key `{k}`; the keys here are {_1} неизвестный ключ `{k}`; здесь допустимы ключи {_1} @msg {_1} is listed twice {_1} указан дважды @msg {_1} is not the id of an input object {_1} не является идентификатором входного объекта diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 7fe13c9677..88d15715e7 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -6379,6 +6379,35 @@ axis Y Axis Y-axel @msg the path has no anchor points banan har inga ankarpunkter @msg too many anchor points (limit {MAX_ANCHORS}) för många ankarpunkter (gräns {MAX_ANCHORS}) @msg true or false true eller false +@msg a number >= {_1} ett tal >= {_1} +@msg a number > {_1} ett tal > {_1} +@msg a number <= {_1} ett tal <= {_1} +@msg a number < {_1} ett tal < {_1} +@msg a number {_1} to {_2} ett tal från {_1} till {_2} +@msg a number >= {_1} and < {_2} ett tal >= {_1} och < {_2} +@msg a number > {_1} and <= {_2} ett tal > {_1} och <= {_2} +@msg a number > {_1} and < {_2} ett tal > {_1} och < {_2} +@msg a number ({_1}) ett tal ({_1}) +@msg a number >= {_1} ({_2}) ett tal >= {_1} ({_2}) +@msg a number > {_1} ({_2}) ett tal > {_1} ({_2}) +@msg a number <= {_1} ({_2}) ett tal <= {_1} ({_2}) +@msg a number < {_1} ({_2}) ett tal < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) ett tal från {_1} till {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) ett tal >= {_1} och < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) ett tal > {_1} och <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) ett tal > {_1} och < {_2} ({_3}) +@msg an integer ett heltal +@msg an integer >= {_1} ett heltal >= {_1} +@msg an integer <= {_1} ett heltal <= {_1} +@msg an integer {_1} to {_2} ett heltal från {_1} till {_2} +@msg one of {_1} ett av {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` måste vara ett av {_1}, inte {got} +@msg an object id (a non-negative integer) ett objekt-id (ett icke-negativt heltal) +@msg a list of object ids en lista med objekt-id:n +@msg a color (a string, [r, g, b] or an object) en färg (en sträng, [r, g, b] eller ett objekt) +@msg [x, y] (two numbers) [x, y] (två tal) +@msg an object ett objekt +@msg a list en lista @msg unknown key `{k}`; the keys here are {_1} okänd nyckel `{k}`; nycklarna här är {_1} @msg {_1} is listed twice {_1} finns två gånger @msg {_1} is not the id of an input object {_1} är inte id:t för ett indataobjekt diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index 3b9105422a..460ad52a70 100644 --- a/crates/ui-egui/src/i18n/tests.rs +++ b/crates/ui-egui/src/i18n/tests.rs @@ -2915,6 +2915,14 @@ fn parameter_schema_errors_are_translated() { s.execute("file.new", &json!({})).unwrap(); let errors = [ (s.execute("view.saved.new", &json!({"center": [0, 0], "zoom": -1})).unwrap_err().to_string(), "`zoom`", "must be", "-1"), + (s.execute("view.saved.new", &json!({"center": [0, 0], "zoom": -1})).unwrap_err().to_string(), "`zoom`", "a number > 0", "-1"), + (s.execute("view.saved.new", &json!({"center": 5, "zoom": 1})).unwrap_err().to_string(), "`center`", "two numbers", "5"), + ( + s.execute("view.saved.new", &json!({"center": [0, 0], "zoom": 1, "rotation": "x"})).unwrap_err().to_string(), + "`rotation`", + "a number (deg)", + "\"x\"", + ), (s.execute("view.saved.new", &json!({"center": [0, 0]})).unwrap_err().to_string(), "`zoom`", "missing", ""), (s.execute("view.saved.list", &json!(5)).unwrap_err().to_string(), "5", "must be", ""), ]; @@ -2936,6 +2944,152 @@ fn parameter_schema_errors_are_translated() { } } +/// The phrases a parameter schema's error uses for what a value must be, as `@msg` sources: one +/// for each type, and for a number each range and unit form. +const SCHEMA_PHRASES: &[&str] = &[ + "a number", + "a number >= {_1}", + "a number > {_1}", + "a number <= {_1}", + "a number < {_1}", + "a number {_1} to {_2}", + "a number >= {_1} and < {_2}", + "a number > {_1} and <= {_2}", + "a number > {_1} and < {_2}", + "a number ({_1})", + "a number >= {_1} ({_2})", + "a number > {_1} ({_2})", + "a number <= {_1} ({_2})", + "a number < {_1} ({_2})", + "a number {_1} to {_2} ({_3})", + "a number >= {_1} and < {_2} ({_3})", + "a number > {_1} and <= {_2} ({_3})", + "a number > {_1} and < {_2} ({_3})", + "an integer", + "an integer >= {_1}", + "an integer <= {_1}", + "an integer {_1} to {_2}", + "true or false", + "a string", + "one of {_1}", + "an object id (a non-negative integer)", + "a list of object ids", + "a color (a string, [r, g, b] or an object)", + "[x, y] (two numbers)", + "an object", + "a list", +]; + +/// What a value of each parameter type must be is translated in every language that translates +/// every message, for every range and unit of a number: the matched row's placeholders take the +/// bounds, the unit and the names exactly as the English gives them, and the whole error keeps +/// the parameter's path and the refused value. +#[test] +fn parameter_schema_expected_phrases_are_translated() { + use serde_json::{Value, json}; + use vectorcraft_apischema::{Bound, Param, ParamSchema, Problem, Type}; + let number = |min, max, unit| Type::Number { min, max, unit }; + let (incl, excl) = (|x| Some(Bound::Inclusive(x)), |x| Some(Bound::Exclusive(x))); + // (type, a value it refuses, the placeholder values of the phrase's row) + let cases: Vec<(Type, Value, Vec<&str>)> = vec![ + (Type::NUMBER, json!("x"), vec![]), + (number(incl(-2.5), None, None), json!(-3), vec!["-2.5"]), + (number(excl(0.0), None, None), json!(0), vec!["0"]), + (number(None, incl(1.5), None), json!(2), vec!["1.5"]), + (number(None, excl(100.0), None), json!(100), vec!["100"]), + (number(incl(-1.0), incl(1.0), None), json!(2), vec!["-1", "1"]), + (number(incl(0.0), excl(360.0), None), json!(360), vec!["0", "360"]), + (number(excl(0.0), incl(1.0), None), json!(0), vec!["0", "1"]), + (number(excl(-0.5), excl(0.5), None), json!(1), vec!["-0.5", "0.5"]), + (number(None, None, Some("deg")), json!("x"), vec!["deg"]), + (number(incl(0.25), None, Some("pt")), json!(0), vec!["0.25", "pt"]), + (number(excl(0.0), None, Some("pt")), json!(0), vec!["0", "pt"]), + (number(None, incl(-1.0), Some("mm")), json!(0), vec!["-1", "mm"]), + (number(None, excl(10.0), Some("px")), json!(10), vec!["10", "px"]), + (number(incl(0.0), incl(100.0), Some("%")), json!(101), vec!["0", "100", "%"]), + (number(incl(-180.0), excl(180.0), Some("deg")), json!(180), vec!["-180", "180", "deg"]), + (number(excl(0.0), incl(1000.0), Some("pt")), json!(0), vec!["0", "1000", "pt"]), + (number(excl(-1.0), excl(1.0), Some("in")), json!(1), vec!["-1", "1", "in"]), + (Type::Integer { min: None, max: None }, json!(1.5), vec![]), + (Type::Integer { min: Some(1), max: None }, json!(0), vec!["1"]), + (Type::Integer { min: None, max: Some(-1) }, json!(0), vec!["-1"]), + (Type::Integer { min: Some(1), max: Some(25) }, json!(26), vec!["1", "25"]), + (Type::Boolean, json!(1), vec![]), + (Type::String, json!(1), vec![]), + (Type::Enum(&["left", "center", "right"]), json!("top"), vec![r#""left", "center", "right""#]), + (Type::Enum(&["only"]), json!("other"), vec![r#""only""#]), + (Type::Id, json!(-1), vec![]), + (Type::Ids, json!(5), vec![]), + (Type::Color, json!(5), vec![]), + (Type::Point, json!(5), vec![]), + (Type::Object(&[]), json!(5), vec![]), + (Type::Array(&Type::NUMBER), json!(5), vec![]), + ]; + let one = |name: &'static str, ty: Type| ParamSchema::new(Box::leak(Box::new([Param::new(name, ty)])), ""); + let inner: &'static [Param] = Box::leak(Box::new([Param::new("zoom", number(excl(0.0), None, None))])); + let nested = one("edits", Type::Array(Box::leak(Box::new(Type::Object(inner))))); + let mut errors: Vec<_> = cases.iter().map(|(ty, bad, caps)| (one("x", *ty).validate(&json!({ "x": bad })), caps.clone())).collect(); + errors.push((nested.validate(&json!({"edits": [{"zoom": 1}, {"zoom": -1}]})), vec!["0"])); + let mut seen = std::collections::BTreeSet::new(); + for code in COMPLETE_MESSAGES { + let lang = Lang::from_code(code).expect("registered"); + let (entries, _) = parse_entries(lang.0.source); + for phrase in SCHEMA_PHRASES { + assert!(entries.iter().any(|(ctx, src, _)| ctx == "@msg" && src == phrase), "{code}: no row for {phrase:?}"); + } + for (result, caps) in &errors { + let Err(e) = result else { panic!("accepted: {result:?}") }; + let Problem::WrongType { expected, got } = &e.problem else { panic!("{e}") }; + seen.insert(expected.clone()); + let (_, matched) = lang.catalog().message(expected).unwrap_or_else(|| panic!("{code}: no row matches {expected:?}")); + let values: Vec<&str> = matched.iter().map(|(_, v)| *v).collect(); + assert_eq!(&values, caps, "{code}: {expected:?}"); + let phrase = message(lang, expected); + assert_ne!(&phrase, expected, "{code}"); + let mut from = 0; + for value in caps { + let at = phrase[from..].find(value).unwrap_or_else(|| panic!("{code}: {value:?} in {expected:?} -> {phrase:?}")); + from += at + value.len(); + } + let shown = message(lang, &e.to_string()); + let path = format!("`{}`", e.path); + let kept = caps.iter().all(|value| shown.contains(value)); + assert!(kept && shown.contains(&path) && shown.contains(got.as_str()), "{code}: {shown}"); + assert!(!holds_word(&shown, expected) && !shown.contains("must be") && !shown.contains(", not "), "{code}: {shown}"); + } + } + // A catalog's `{key}` must be one of {_1}` row would take `"a", "b", not "c"` as its list. + let enum_error = one("x", Type::Enum(&["a", "b"])).validate(&json!({"x": "c"})).map_or_else(|e| e.to_string(), |_| String::new()); + assert_eq!(enum_error, r#"`x` must be one of "a", "b", not "c""#); + for lang in Lang::all().filter(|l| l.code() != Lang::EN.code() && !l.0.source.is_empty()) { + let shown = message(lang, &enum_error); + assert!(!shown.contains(", not ") && shown.contains(r#""a", "b""#) && shown.contains(r#""c""#), "{}: {shown}", lang.code()); + } + for phrase in + ["a number > -0.5 and < 0.5", "a number 0 to 100 (%)", "an integer 1 to 25", r#"one of "left", "center", "right""#, "[x, y] (two numbers)"] + { + assert!(seen.contains(phrase), "{phrase:?} not in {seen:?}"); + } +} + +/// A JSON object or array inside a translated message stays as it is, and an exact message that +/// starts with a bracket is still translated. +#[test] +fn bracketed_message_parts_translate_only_as_exact_messages() { + for code in COMPLETE_MESSAGES { + let lang = Lang::from_code(code).expect("registered"); + let point = message(lang, "[x, y] (two numbers)"); + assert_ne!(point, "[x, y] (two numbers)", "{code}"); + assert!(point.contains("[x, y]"), "{code}: {point}"); + for got in ["[1]", "[1, 2, 3]", r#"{"objects": [1]}"#, r#"[{"a": 1}, "b: c", …"#] { + let shown = message(lang, &format!("`center` must be [x, y] (two numbers), not {got}")); + assert!(shown.contains(&point) && shown.contains(got), "{code}: {shown}"); + let shown = message(lang, &format!("`p` must be an object, not {got}")); + assert!(shown.contains(got) && !shown.contains("an object"), "{code}: {shown}"); + } + } +} + /// The warning for a PDF/X file that leaves out the document's bleed is translated in every catalog, /// alone and in the status bar's note. #[test] diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 34d3948e24..2c86a6cc50 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -6349,6 +6349,35 @@ axis Y Axis Y ekseni @msg the path has no anchor points yolun bağlantı noktası yok @msg too many anchor points (limit {MAX_ANCHORS}) çok fazla bağlantı noktası (sınır {MAX_ANCHORS}) @msg true or false true veya false +@msg a number >= {_1} bir sayı >= {_1} +@msg a number > {_1} bir sayı > {_1} +@msg a number <= {_1} bir sayı <= {_1} +@msg a number < {_1} bir sayı < {_1} +@msg a number {_1} to {_2} {_1} ile {_2} arasında bir sayı +@msg a number >= {_1} and < {_2} bir sayı >= {_1} ve < {_2} +@msg a number > {_1} and <= {_2} bir sayı > {_1} ve <= {_2} +@msg a number > {_1} and < {_2} bir sayı > {_1} ve < {_2} +@msg a number ({_1}) bir sayı ({_1}) +@msg a number >= {_1} ({_2}) bir sayı >= {_1} ({_2}) +@msg a number > {_1} ({_2}) bir sayı > {_1} ({_2}) +@msg a number <= {_1} ({_2}) bir sayı <= {_1} ({_2}) +@msg a number < {_1} ({_2}) bir sayı < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} ile {_2} arasında bir sayı ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) bir sayı >= {_1} ve < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) bir sayı > {_1} ve <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) bir sayı > {_1} ve < {_2} ({_3}) +@msg an integer bir tam sayı +@msg an integer >= {_1} bir tam sayı >= {_1} +@msg an integer <= {_1} bir tam sayı <= {_1} +@msg an integer {_1} to {_2} {_1} ile {_2} arasında bir tam sayı +@msg one of {_1} {_1} değerlerinden biri +@msg `{path}` must be one of {_1}, not {got} `{path}` {_1} değerlerinden biri olmalıdır, {got} değil +@msg an object id (a non-negative integer) bir nesne kimliği (negatif olmayan bir tam sayı) +@msg a list of object ids bir nesne kimlikleri listesi +@msg a color (a string, [r, g, b] or an object) bir renk (bir dize, [r, g, b] veya bir nesne) +@msg [x, y] (two numbers) [x, y] (iki sayı) +@msg an object bir nesne +@msg a list bir liste @msg unknown key `{k}`; the keys here are {_1} bilinmeyen anahtar `{k}`; buradaki anahtarlar: {_1} @msg {_1} is listed twice {_1} iki kez listelenmiş @msg {_1} is not the id of an input object {_1} bir girdi nesnesinin kimliği değil diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index c23443765a..732351cce6 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -5998,6 +5998,35 @@ axis Y Axis Вісь Y @msg the path has no anchor points контур не має опорних точок @msg too many anchor points (limit {MAX_ANCHORS}) забагато опорних точок (межа {MAX_ANCHORS}) @msg true or false true або false +@msg a number >= {_1} число >= {_1} +@msg a number > {_1} число > {_1} +@msg a number <= {_1} число <= {_1} +@msg a number < {_1} число < {_1} +@msg a number {_1} to {_2} число від {_1} до {_2} +@msg a number >= {_1} and < {_2} число >= {_1} і < {_2} +@msg a number > {_1} and <= {_2} число > {_1} і <= {_2} +@msg a number > {_1} and < {_2} число > {_1} і < {_2} +@msg a number ({_1}) число ({_1}) +@msg a number >= {_1} ({_2}) число >= {_1} ({_2}) +@msg a number > {_1} ({_2}) число > {_1} ({_2}) +@msg a number <= {_1} ({_2}) число <= {_1} ({_2}) +@msg a number < {_1} ({_2}) число < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) число від {_1} до {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) число >= {_1} і < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) число > {_1} і <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) число > {_1} і < {_2} ({_3}) +@msg an integer ціле число +@msg an integer >= {_1} ціле число >= {_1} +@msg an integer <= {_1} ціле число <= {_1} +@msg an integer {_1} to {_2} ціле число від {_1} до {_2} +@msg one of {_1} одне зі значень {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` має бути одним зі значень {_1}, а не {got} +@msg an object id (a non-negative integer) ідентифікатор об’єкта (невід’ємне ціле число) +@msg a list of object ids список ідентифікаторів об’єктів +@msg a color (a string, [r, g, b] or an object) колір (рядок, [r, g, b] або об’єкт) +@msg [x, y] (two numbers) [x, y] (два числа) +@msg an object об’єкт +@msg a list список @msg unknown key `{k}`; the keys here are {_1} невідомий ключ `{k}`; тут допустимі ключі {_1} @msg {_1} is listed twice {_1} вказано двічі @msg {_1} is not the id of an input object {_1} не є ідентифікатором вхідного об’єкта diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index ee04ac4ec3..5bc28166eb 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -5999,6 +5999,35 @@ axis Y Axis Trục Y @msg the path has no anchor points đường dẫn không có điểm neo @msg too many anchor points (limit {MAX_ANCHORS}) quá nhiều điểm neo (giới hạn {MAX_ANCHORS}) @msg true or false true hoặc false +@msg a number >= {_1} một số >= {_1} +@msg a number > {_1} một số > {_1} +@msg a number <= {_1} một số <= {_1} +@msg a number < {_1} một số < {_1} +@msg a number {_1} to {_2} một số từ {_1} đến {_2} +@msg a number >= {_1} and < {_2} một số >= {_1} và < {_2} +@msg a number > {_1} and <= {_2} một số > {_1} và <= {_2} +@msg a number > {_1} and < {_2} một số > {_1} và < {_2} +@msg a number ({_1}) một số ({_1}) +@msg a number >= {_1} ({_2}) một số >= {_1} ({_2}) +@msg a number > {_1} ({_2}) một số > {_1} ({_2}) +@msg a number <= {_1} ({_2}) một số <= {_1} ({_2}) +@msg a number < {_1} ({_2}) một số < {_1} ({_2}) +@msg a number {_1} to {_2} ({_3}) một số từ {_1} đến {_2} ({_3}) +@msg a number >= {_1} and < {_2} ({_3}) một số >= {_1} và < {_2} ({_3}) +@msg a number > {_1} and <= {_2} ({_3}) một số > {_1} và <= {_2} ({_3}) +@msg a number > {_1} and < {_2} ({_3}) một số > {_1} và < {_2} ({_3}) +@msg an integer một số nguyên +@msg an integer >= {_1} một số nguyên >= {_1} +@msg an integer <= {_1} một số nguyên <= {_1} +@msg an integer {_1} to {_2} một số nguyên từ {_1} đến {_2} +@msg one of {_1} một trong các giá trị {_1} +@msg `{path}` must be one of {_1}, not {got} `{path}` phải là một trong các giá trị {_1}, không phải {got} +@msg an object id (a non-negative integer) một ID đối tượng (một số nguyên không âm) +@msg a list of object ids một danh sách ID đối tượng +@msg a color (a string, [r, g, b] or an object) một màu (một chuỗi, [r, g, b] hoặc một đối tượng) +@msg [x, y] (two numbers) [x, y] (hai số) +@msg an object một đối tượng +@msg a list một danh sách @msg unknown key `{k}`; the keys here are {_1} khóa không xác định `{k}`; các khóa ở đây là {_1} @msg {_1} is listed twice {_1} được liệt kê hai lần @msg {_1} is not the id of an input object {_1} không phải là id của một đối tượng đầu vào diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index 82a1ca63a9..10b313f84a 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -6231,6 +6231,35 @@ axis Y Axis Y 轴 @msg the path has no anchor points 路径没有锚点 @msg too many anchor points (limit {MAX_ANCHORS}) 锚点过多(上限 {MAX_ANCHORS}) @msg true or false true 或 false +@msg a number >= {_1} 大于或等于 {_1} 的数字 +@msg a number > {_1} 大于 {_1} 的数字 +@msg a number <= {_1} 小于或等于 {_1} 的数字 +@msg a number < {_1} 小于 {_1} 的数字 +@msg a number {_1} to {_2} {_1} 到 {_2} 之间的数字 +@msg a number >= {_1} and < {_2} 大于或等于 {_1} 且小于 {_2} 的数字 +@msg a number > {_1} and <= {_2} 大于 {_1} 且小于或等于 {_2} 的数字 +@msg a number > {_1} and < {_2} 大于 {_1} 且小于 {_2} 的数字 +@msg a number ({_1}) 数字({_1}) +@msg a number >= {_1} ({_2}) 大于或等于 {_1} 的数字({_2}) +@msg a number > {_1} ({_2}) 大于 {_1} 的数字({_2}) +@msg a number <= {_1} ({_2}) 小于或等于 {_1} 的数字({_2}) +@msg a number < {_1} ({_2}) 小于 {_1} 的数字({_2}) +@msg a number {_1} to {_2} ({_3}) {_1} 到 {_2} 之间的数字({_3}) +@msg a number >= {_1} and < {_2} ({_3}) 大于或等于 {_1} 且小于 {_2} 的数字({_3}) +@msg a number > {_1} and <= {_2} ({_3}) 大于 {_1} 且小于或等于 {_2} 的数字({_3}) +@msg a number > {_1} and < {_2} ({_3}) 大于 {_1} 且小于 {_2} 的数字({_3}) +@msg an integer 整数 +@msg an integer >= {_1} 大于或等于 {_1} 的整数 +@msg an integer <= {_1} 小于或等于 {_1} 的整数 +@msg an integer {_1} to {_2} {_1} 到 {_2} 之间的整数 +@msg one of {_1} {_1} 之一 +@msg `{path}` must be one of {_1}, not {got} `{path}` 必须是 {_1} 之一,而不是 {got} +@msg an object id (a non-negative integer) 对象 ID(非负整数) +@msg a list of object ids 对象 ID 列表 +@msg a color (a string, [r, g, b] or an object) 颜色(字符串、[r, g, b] 或对象) +@msg [x, y] (two numbers) [x, y](两个数字) +@msg an object 对象 +@msg a list 列表 @msg unknown key `{k}`; the keys here are {_1} 未知键 `{k}`;此处可用的键:{_1} @msg {_1} is listed twice {_1} 列出了两次 @msg {_1} is not the id of an input object {_1} 不是输入对象的 ID diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 41a56e0615..2d4570d10c 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -6036,6 +6036,35 @@ axis Y Axis Y 軸 @msg the path has no anchor points 路徑沒有錨點 @msg too many anchor points (limit {MAX_ANCHORS}) 錨點過多(上限 {MAX_ANCHORS}) @msg true or false true 或 false +@msg a number >= {_1} 大於或等於 {_1} 的數字 +@msg a number > {_1} 大於 {_1} 的數字 +@msg a number <= {_1} 小於或等於 {_1} 的數字 +@msg a number < {_1} 小於 {_1} 的數字 +@msg a number {_1} to {_2} 介於 {_1} 到 {_2} 之間的數字 +@msg a number >= {_1} and < {_2} 大於或等於 {_1} 且小於 {_2} 的數字 +@msg a number > {_1} and <= {_2} 大於 {_1} 且小於或等於 {_2} 的數字 +@msg a number > {_1} and < {_2} 大於 {_1} 且小於 {_2} 的數字 +@msg a number ({_1}) 數字({_1}) +@msg a number >= {_1} ({_2}) 大於或等於 {_1} 的數字({_2}) +@msg a number > {_1} ({_2}) 大於 {_1} 的數字({_2}) +@msg a number <= {_1} ({_2}) 小於或等於 {_1} 的數字({_2}) +@msg a number < {_1} ({_2}) 小於 {_1} 的數字({_2}) +@msg a number {_1} to {_2} ({_3}) 介於 {_1} 到 {_2} 之間的數字({_3}) +@msg a number >= {_1} and < {_2} ({_3}) 大於或等於 {_1} 且小於 {_2} 的數字({_3}) +@msg a number > {_1} and <= {_2} ({_3}) 大於 {_1} 且小於或等於 {_2} 的數字({_3}) +@msg a number > {_1} and < {_2} ({_3}) 大於 {_1} 且小於 {_2} 的數字({_3}) +@msg an integer 整數 +@msg an integer >= {_1} 大於或等於 {_1} 的整數 +@msg an integer <= {_1} 小於或等於 {_1} 的整數 +@msg an integer {_1} to {_2} 介於 {_1} 到 {_2} 之間的整數 +@msg one of {_1} {_1} 其中之一 +@msg `{path}` must be one of {_1}, not {got} `{path}` 必須是 {_1} 其中之一,而不是 {got} +@msg an object id (a non-negative integer) 物件 ID(非負整數) +@msg a list of object ids 物件 ID 清單 +@msg a color (a string, [r, g, b] or an object) 顏色(字串、[r, g, b] 或物件) +@msg [x, y] (two numbers) [x, y](兩個數字) +@msg an object 物件 +@msg a list 清單 @msg unknown key `{k}`; the keys here are {_1} 未知的鍵 `{k}`;此處可用的鍵:{_1} @msg {_1} is listed twice {_1} 列出了兩次 @msg {_1} is not the id of an input object {_1} 不是輸入物件的 ID diff --git a/docs/mcp.md b/docs/mcp.md index 9583f3eba5..f53902ce6a 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -1823,6 +1823,11 @@ parameter error, ``invalid parameters for ``: `` is nested too deeply` value. A schema that is wrong in itself, such as one that nests past 16 levels or puts a list of ids or a point inside 16 lists, is an internal error in the command, and the command does not run. +The command API returns these errors in English. The desktop app's status bar shows them in the interface language, +the requirement after "must be" included (a number and its range and unit, an integer, a list of names, an object id, +a color, a point, an object or a list); the parameter's path, the refused value, the bounds, the unit and the names stay +as the English gives them. + An omitted value with a `default` takes it (`rotation` 0 in `view.saved.new`); the journal keeps the params as they were given. Saved steps played from a journal or an action keep a key the schema does not name, unless its value nests more than 16 levels deep, and the values of the parameters it names are checked as in a new call. The schemas of built-in commands belong to API level 3 diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index dc1fa3c5e3..e9b9aa444f 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -867,6 +867,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur - The errors of the blend spine commands (Move Spine Point, Reshape Spine Segment, Add Spine Point and Delete Spine Point) show in the status bar in the interface language: each has a row in every catalog that translates all status and error messages and in Bulgarian (`blend_spine_param_errors_are_translated`). - The errors of the 3D effects (Extrude & Bevel, Revolve, Inflate, Rotate and their Classic forms) show in the status bar in the interface language: the art a 3D effect cannot build a solid from, invalid light, graphics and surface settings, and the notes for an object that draws no 3D faces or more wireframe edges than the limit. Each has a row in every catalog that translates all status and error messages, and the effect's name and the values in the message are translated or kept as written (`three_d_refusals_are_translated_in_every_complete_catalog`, `three_d_refusals_translate_with_their_values`). - The errors of the parameter checks that many commands share show in the status bar in the interface language: a value that is not a number where a number goes (`object.move` with `"dx": "60 mm"`, and `object.rotate`, `object.setBounds` and the other commands that call `check_numbers`), a missing number or index, `ids` that are not a list of object ids, an object id that is not a non-negative integer or names no object, and a date that is not Unix seconds. Each has a row in every catalog that translates all status and error messages, and in Bulgarian, Danish, Indonesian and Dutch (`shared_param_check_errors_are_translated`). + - A parameter schema's errors show in the status bar with what the value must be in the interface language, for every type a schema has (a number with each kind of range and with a unit, an integer and its range, true or false, a string, a list of names, an object id, a list of object ids, a color, a point, an object and a list), in every catalog that translates all status and error messages; the path, the refused value, the bounds, the unit and the names stay as the English gives them. The error for a value that is not one of its names is also translated in Bulgarian, Bosnian, Danish, Indonesian and Dutch (`parameter_schema_expected_phrases_are_translated`, `bracketed_message_parts_translate_only_as_exact_messages`). - Export commands run through MCP, the control channel or the CLI refuse a key that no format takes, and a command that writes one format (`document.exportPdf`, `document.exportEps`, `document.exportDxf`) or takes one format's options (`document.pdfSettings`, `pdf.preset.save`) refuses a key that format doesn't take. An unknown key inside `marks`, `bleed`, `compression`, `output`, `advanced`, `security` or `flattener` is refused by its path. - Save commands run through MCP, the control channel or the CLI (`document.save`, `file.saveAs`, `file.saveCopy`, `file.saveAsTemplate`, `app.save`) refuse a key that no save format takes, beside the path or in `options`. Export for Screens refuses a key it doesn't take, and a key that no format takes in a format row or in a format's settings, by its path (`formats[1].marks.useDocumentBleed`); Export Assets (`assets.export`, `assets.settings.set`) checks the rows and settings it is given the same way. - Commands that read their `ids` (or `slices`) list themselves refuse a list with an entry that is not a non-negative integer, and a value that is not a list, and change nothing; they no longer drop the entry and act on the rest (Copy Appearance From, the Edit Colors commands and Overprint Black, Find and Replace, `layer.highlight`, `layer.move`, `library.add`, the Links panel commands, `object.transform`, Make Pattern, the Repeat commands, the slice commands, Join, Average and Join, `plugin.run`, `symbol.edit`, Make Opacity Mask; `tests::ids_without_selection::an_ids_entry_that_is_not_an_id_is_refused_and_changes_nothing`). The error for an entry of an object id list names the key, the entry and its value ("`ids` entry 1 is true, not a non-negative integer object id"), with a row in every catalog that has the other object id errors.