mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-25 18:27:02 -06:00
Commands: an unknown command id is answered with the nearest command id
A misspelled parameter key got a did-you-mean suggestion, but a misspelled command id only got "unknown command `select.al`", through the CLI, MCP and the control channel alike. Session::execute now names the nearest command id, using the same matching as parameter keys (ignoring case), and action.batch does the same for an unknown step. An id with no near match keeps the plain error. The matching skips candidates whose length differs by more than the allowed number of edits, so a very long unknown command id or parameter key is answered at once instead of being measured against every command id or accepted key. The new message has a row in every catalog, and docs/mcp.md's Parameter keys section shows it.
This commit is contained in:
@@ -56,7 +56,13 @@ pub(super) fn action_batch(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
return Err(bad(C, "batches cannot nest"));
|
||||
}
|
||||
if find_command(id).is_none() {
|
||||
return Err(bad(C, format!("commands[{i}]: unknown command `{id}`")));
|
||||
return Err(bad(
|
||||
C,
|
||||
match super::super::params::nearest_command(id) {
|
||||
Some(near) => format!("commands[{i}]: unknown command `{id}`; did you mean `{near}`?"),
|
||||
None => format!("commands[{i}]: unknown command `{id}`"),
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
let source = str_param(p, "source").unwrap_or("folder");
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
use serde_json::Value;
|
||||
|
||||
use super::{bad, find_command};
|
||||
use super::{bad, command_specs, find_command};
|
||||
use crate::Result;
|
||||
|
||||
/// What a params description says about the keys of the params object.
|
||||
@@ -208,8 +208,12 @@ fn distance(a: &str, b: &str) -> usize {
|
||||
|
||||
/// The key of `keys` a misspelt `key` most likely meant: the nearest one, when it is near.
|
||||
fn nearest<'a>(key: &str, keys: &[&'a str]) -> Option<&'a str> {
|
||||
let near = keys.iter().map(|k| (distance(key, k), *k)).min()?;
|
||||
(near.0 <= (key.chars().count() / 3).max(1)).then_some(near.1)
|
||||
let len = key.chars().count();
|
||||
let most = (len / 3).max(1);
|
||||
// A key whose length differs by more than `most` is more than `most` edits away and isn't
|
||||
// measured.
|
||||
let near = keys.iter().filter(|k| k.chars().count().abs_diff(len) <= most).map(|k| (distance(key, k), *k)).min()?;
|
||||
(near.0 <= most).then_some(near.1)
|
||||
}
|
||||
|
||||
/// `params` has only keys the description `doc` of command `id` names, or the parameter error
|
||||
@@ -480,6 +484,21 @@ pub fn check_params(id: &str, params: &Value) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// The command id a misspelled `id`, which names no command, most likely meant: the nearest one,
|
||||
/// when it is near (as [`check_keys`] matches a misspelled key).
|
||||
pub(crate) fn nearest_command(id: &str) -> Option<&'static str> {
|
||||
let ids: Vec<&'static str> = command_specs().iter().map(|c| c.id).collect();
|
||||
nearest(id, &ids)
|
||||
}
|
||||
|
||||
/// The error for `id`, which names no command: with the nearest command id, when one is near.
|
||||
pub(crate) fn unknown_command(id: &str) -> crate::EngineError {
|
||||
match nearest_command(id) {
|
||||
Some(near) => crate::EngineError::UnknownCommandNear(id.to_string(), near.to_string()),
|
||||
None => crate::EngineError::UnknownCommand(id.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::Session {
|
||||
/// [`check_params`], and [`check_effect_params`] for the effects `effect.setParams` edits in
|
||||
/// this session's document (not as a step of a `command.batch`: what it edits is only there
|
||||
|
||||
@@ -45,6 +45,9 @@ pub use vectorcraft_tools as tools;
|
||||
pub enum EngineError {
|
||||
#[error("unknown command `{0}`")]
|
||||
UnknownCommand(String),
|
||||
/// An unknown command id, with the command id it most likely misspells.
|
||||
#[error("unknown command `{0}`; did you mean `{1}`?")]
|
||||
UnknownCommandNear(String, String),
|
||||
#[error("command `{0}` is not available right now: {1}")]
|
||||
Disabled(String, String),
|
||||
#[error("invalid parameters for `{cmd}`: {msg}")]
|
||||
@@ -1785,7 +1788,7 @@ impl Session {
|
||||
|
||||
/// Execute a command by id. This is THE entry point for every frontend.
|
||||
pub fn execute(&mut self, id: &str, params: &Value) -> Result<Value> {
|
||||
let spec = find_command(id).ok_or_else(|| EngineError::UnknownCommand(id.to_string()))?;
|
||||
let spec = find_command(id).ok_or_else(|| cmd::params::unknown_command(id))?;
|
||||
// The crate's own tests are the audit of the params descriptions (#1442): a key a test
|
||||
// passes that its command's description doesn't name fails the test.
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -90,6 +90,42 @@ fn unknown_and_disabled() {
|
||||
assert!(matches!(s.execute("object.group", &json!({})), Err(EngineError::Disabled(..))));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_command_names_the_nearest_id() {
|
||||
let mut s = session();
|
||||
for typo in ["select.al", "Select.All", "selcet.all"] {
|
||||
let e = s.execute(typo, &json!({})).unwrap_err();
|
||||
assert!(matches!(&e, EngineError::UnknownCommandNear(id, near) if id == typo && near == "select.all"), "{typo}: {e:?}");
|
||||
assert_eq!(e.to_string(), format!("unknown command `{typo}`; did you mean `select.all`?"));
|
||||
}
|
||||
let e = s.execute("nope", &json!({})).unwrap_err();
|
||||
assert!(matches!(&e, EngineError::UnknownCommand(id) if id == "nope"), "{e:?}");
|
||||
assert_eq!(e.to_string(), "unknown command `nope`");
|
||||
let e = s.execute("command.batch", &json!({"commands": [{"command": "select.al", "params": {}}]})).unwrap_err();
|
||||
assert!(e.to_string().contains("did you mean `select.all`?"), "{e}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_long_unknown_command_id_is_answered_at_once() {
|
||||
let mut s = session();
|
||||
let long = "x".repeat(200_000);
|
||||
let start = std::time::Instant::now();
|
||||
assert!(matches!(s.execute(&long, &json!({})), Err(EngineError::UnknownCommand(_))));
|
||||
let e = crate::check_params("file.new", &json!({ long.as_str(): 1 })).unwrap_err();
|
||||
assert!(e.to_string().contains("the command takes:"), "{e}");
|
||||
assert!(start.elapsed() < std::time::Duration::from_secs(2), "{:?}", start.elapsed());
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
#[test]
|
||||
fn action_batch_names_the_nearest_command_id() {
|
||||
let mut s = session();
|
||||
let e = s.execute("action.batch", &json!({"source": "dataSets", "commands": [{"command": "select.al"}]})).unwrap_err();
|
||||
assert_eq!(e.to_string(), "invalid parameters for `action.batch`: commands[0]: unknown command `select.al`; did you mean `select.all`?");
|
||||
let e = s.execute("action.batch", &json!({"source": "dataSets", "commands": [{"command": "nope"}]})).unwrap_err();
|
||||
assert_eq!(e.to_string(), "invalid parameters for `action.batch`: commands[0]: unknown command `nope`");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn group_ungroup() {
|
||||
let mut s = session();
|
||||
|
||||
@@ -4224,6 +4224,7 @@ axis Both И двете
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) клавишните комбинации за инструменти трябва да са един клавиш (по избор със Shift)
|
||||
@msg truncated съкратено
|
||||
@msg unknown command `{0}` непозната команда `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? непозната команда `{0}`; имахте ли предвид `{1}`?
|
||||
@msg unknown effect `{id}` непознат ефект `{id}`
|
||||
@msg unknown format непознат формат
|
||||
@msg unknown format `{f}` (Save writes {_1}) непознат формат `{f}` (Запазването записва {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4629,6 +4629,7 @@ imageTrace Outline Obrys
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) zkratky nástrojů musí být jediná klávesa (volitelně se Shift)
|
||||
@msg truncated zkráceno
|
||||
@msg unknown command `{0}` neznámý příkaz `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? neznámý příkaz `{0}`; mysleli jste `{1}`?
|
||||
@msg unknown effect `{id}` neznámý efekt `{id}`
|
||||
@msg unknown format neznámý formát
|
||||
@msg unknown format `{f}` (Save writes {_1}) neznámý formát `{f}` (Uložit zapisuje {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4324,6 +4324,7 @@ imageTrace Outline Kontur
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) værktøjsgenveje skal være en enkelt tast (eventuelt med Skift)
|
||||
@msg truncated afkortet
|
||||
@msg unknown command `{0}` ukendt kommando `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? ukendt kommando `{0}`; mente du `{1}`?
|
||||
@msg unknown effect `{id}` ukendt effekt `{id}`
|
||||
@msg unknown format ukendt format
|
||||
@msg unknown format `{f}` (Save writes {_1}) ukendt format `{f}` (Gem skriver {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4252,6 +4252,7 @@ theme Appearance Erscheinungsbild
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) Tastaturbefehle für Werkzeuge müssen aus einer einzelnen Taste bestehen (optional mit Shift)
|
||||
@msg truncated abgeschnitten
|
||||
@msg unknown command `{0}` unbekannter Befehl `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? unbekannter Befehl `{0}`; meinten Sie `{1}`?
|
||||
@msg unknown effect `{id}` unbekannter Effekt `{id}`
|
||||
@msg unknown format unbekanntes Format
|
||||
@msg unknown format `{f}` (Save writes {_1}) unbekanntes Format `{f}` („Speichern“ schreibt {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4300,6 +4300,7 @@ theme Appearance Εμφάνιση
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) οι συντομεύσεις εργαλείων πρέπει να περιλαμβάνουν ένα πλήκτρο (προαιρετικά με Shift)
|
||||
@msg truncated περικομμένο
|
||||
@msg unknown command `{0}` άγνωστη εντολή `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? άγνωστη εντολή `{0}`· μήπως εννοείτε `{1}`;
|
||||
@msg unknown effect `{id}` άγνωστο εφέ `{id}`
|
||||
@msg unknown format άγνωστη μορφή
|
||||
@msg unknown format `{f}` (Save writes {_1}) άγνωστη μορφή `{f}` (η Αποθήκευση υποστηρίζει {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2069 and column 19.
|
@@ -4327,6 +4327,7 @@ axis Both Ambos
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) los atajos de herramientas deben ser una sola tecla (opcionalmente con Shift)
|
||||
@msg truncated truncado
|
||||
@msg unknown command `{0}` comando desconocido `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? comando desconocido `{0}`; ¿quiso decir `{1}`?
|
||||
@msg unknown effect `{id}` efecto desconocido `{id}`
|
||||
@msg unknown format formato desconocido
|
||||
@msg unknown format `{f}` (Save writes {_1}) formato desconocido `{f}` (Guardar escribe {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4536,6 +4536,7 @@ imageTrace Outline Ääriviiva
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) työkalujen pikanäppäinten on oltava yksittäinen näppäin (valinnaisesti Vaihto-näppäimen kanssa)
|
||||
@msg truncated katkaistu
|
||||
@msg unknown command `{0}` tuntematon komento `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? tuntematon komento `{0}`; tarkoititko `{1}`?
|
||||
@msg unknown effect `{id}` tuntematon tehoste `{id}`
|
||||
@msg unknown format tuntematon muoto
|
||||
@msg unknown format `{f}` (Save writes {_1}) tuntematon muoto `{f}` (Tallenna kirjoittaa muotoja {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4324,6 +4324,7 @@ axis Both Les deux
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) les raccourcis d’outils doivent être une seule touche (éventuellement avec Maj)
|
||||
@msg truncated tronqué
|
||||
@msg unknown command `{0}` commande inconnue `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? commande inconnue `{0}` ; vouliez-vous dire `{1}` ?
|
||||
@msg unknown effect `{id}` effet inconnu `{id}`
|
||||
@msg unknown format format inconnu
|
||||
@msg unknown format `{f}` (Save writes {_1}) format inconnu `{f}` (Enregistrer écrit {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5075,6 +5075,7 @@ imageTrace Outline Körvonal
|
||||
@msg truncated csonka
|
||||
@msg Unembedded to {_1} Beágyazás megszüntetve, ide: {_1}
|
||||
@msg unknown command `{0}` ismeretlen parancs: `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? ismeretlen parancs: `{0}`; erre gondolt: `{1}`?
|
||||
@msg unknown effect `{id}` ismeretlen effektus: `{id}`
|
||||
@msg unknown format ismeretlen formátum
|
||||
@msg unknown format `{f}` (Save writes {_1}) ismeretlen formátum: `{f}` (a Mentés ezeket írja: {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4324,6 +4324,7 @@ imageTrace Outline Kontur
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) pintasan alat harus satu tombol (opsional dengan Shift)
|
||||
@msg truncated terpotong
|
||||
@msg unknown command `{0}` perintah `{0}` tidak dikenal
|
||||
@msg unknown command `{0}`; did you mean `{1}`? perintah `{0}` tidak dikenal; apakah maksud Anda `{1}`?
|
||||
@msg unknown effect `{id}` efek `{id}` tidak dikenal
|
||||
@msg unknown format format tidak dikenal
|
||||
@msg unknown format `{f}` (Save writes {_1}) format `{f}` tidak dikenal (Simpan menulis {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 3840 and column 19.
|
@@ -4367,6 +4367,7 @@ axis Both Entrambi
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) le scelte rapide degli strumenti devono essere un singolo tasto (eventualmente con Shift)
|
||||
@msg truncated troncato
|
||||
@msg unknown command `{0}` comando sconosciuto `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? comando sconosciuto `{0}`; forse intendevate `{1}`?
|
||||
@msg unknown effect `{id}` effetto sconosciuto `{id}`
|
||||
@msg unknown format formato sconosciuto
|
||||
@msg unknown format `{f}` (Save writes {_1}) formato sconosciuto `{f}` (Salva scrive {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4190,6 +4190,7 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg objects can't be nested more than 32 deep オブジェクトは 32 階層より深く入れ子にできません
|
||||
@msg the SVG's elements are nested more than {0} deep SVG の要素が {0} 階層より深く入れ子になっています
|
||||
@msg unknown command `{0}` `{0}` は不明なコマンドです
|
||||
@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 path has too many points ポイントが多すぎるパスがあります
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4089,6 +4089,7 @@ font-technology Variable ცვლადი
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) ხელსაწყოს მალსახმობი ერთი კლავიში უნდა იყოს (სურვილისამებრ Shift-ით)
|
||||
@msg truncated შეკვეცილია
|
||||
@msg unknown command `{0}` უცნობი ბრძანება `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? უცნობი ბრძანება `{0}`; იქნებ `{1}` იგულისხმეთ?
|
||||
@msg unknown effect `{id}` უცნობი ეფექტი `{id}`
|
||||
@msg unknown format უცნობი ფორმატი
|
||||
@msg unknown format `{f}` (Save writes {_1}) უცნობი ფორმატი `{f}` (შენახვა წერს: {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4122,6 +4122,7 @@ theme Appearance 외관
|
||||
@msg objects can't be nested more than 32 deep 개체는 32단계보다 깊게 중첩할 수 없습니다
|
||||
@msg the SVG's elements are nested more than {0} deep SVG 요소가 {0}단계보다 깊게 중첩되어 있습니다
|
||||
@msg unknown command `{0}` 알 수 없는 명령 `{0}`
|
||||
@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 path has too many points 패스의 점이 너무 많습니다
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4336,6 +4336,7 @@ imageTrace Outline Contour
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) gereedschapsneltoetsen moeten uit één toets bestaan (eventueel met Shift)
|
||||
@msg truncated afgekapt
|
||||
@msg unknown command `{0}` onbekende opdracht `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? onbekende opdracht `{0}`; bedoelde je `{1}`?
|
||||
@msg unknown effect `{id}` onbekend effect `{id}`
|
||||
@msg unknown format onbekende indeling
|
||||
@msg unknown format `{f}` (Save writes {_1}) onbekende indeling `{f}` (Opslaan schrijft {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4454,6 +4454,7 @@ imageTrace Outline Kontur
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) skróty narzędzi muszą być pojedynczym klawiszem (opcjonalnie z Shift)
|
||||
@msg truncated obcięty
|
||||
@msg unknown command `{0}` nieznane polecenie `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? nieznane polecenie `{0}`; czy chodziło o `{1}`?
|
||||
@msg unknown effect `{id}` nieznany efekt `{id}`
|
||||
@msg unknown format nieznany format
|
||||
@msg unknown format `{f}` (Save writes {_1}) nieznany format `{f}` (zapis tworzy {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3900,6 +3900,7 @@ axis Both Ambos
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) os atalhos de ferramenta devem ser uma única tecla (opcionalmente com Shift)
|
||||
@msg truncated truncado
|
||||
@msg unknown command `{0}` comando desconhecido `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? comando desconhecido `{0}`; você quis dizer `{1}`?
|
||||
@msg unknown effect `{id}` efeito desconhecido `{id}`
|
||||
@msg unknown format formato desconhecido
|
||||
@msg unknown format `{f}` (Save writes {_1}) formato desconhecido `{f}` (Salvar grava {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -4363,6 +4363,7 @@ axis Both Оба
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) сочетания инструментов должны быть одной клавишей (необязательно с Shift)
|
||||
@msg truncated усечено
|
||||
@msg unknown command `{0}` неизвестная команда `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? неизвестная команда `{0}`; возможно, имелась в виду `{1}`?
|
||||
@msg unknown effect `{id}` неизвестный эффект `{id}`
|
||||
@msg unknown format неизвестный формат
|
||||
@msg unknown format `{f}` (Save writes {_1}) неизвестный формат `{f}` (сохранение записывает {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4236,6 +4236,7 @@ axis Both Båda
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) kortkommandon för verktyg måste vara en enda tangent (eventuellt med Shift)
|
||||
@msg truncated avkortad
|
||||
@msg unknown command `{0}` okänt kommando `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? okänt kommando `{0}`; menade du `{1}`?
|
||||
@msg unknown effect `{id}` okänd effekt `{id}`
|
||||
@msg unknown format okänt format
|
||||
@msg unknown format `{f}` (Save writes {_1}) okänt format `{f}` (Spara skriver {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -4088,6 +4088,7 @@ axis Both Her İkisi
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) araç kısayolları tek tuş olmalıdır (isteğe bağlı olarak Shift ile)
|
||||
@msg truncated kesik
|
||||
@msg unknown command `{0}` bilinmeyen komut `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? bilinmeyen komut `{0}`; `{1}` mi demek istediniz?
|
||||
@msg unknown effect `{id}` bilinmeyen etki `{id}`
|
||||
@msg unknown format bilinmeyen format
|
||||
@msg unknown format `{f}` (Save writes {_1}) bilinmeyen format `{f}` (Kaydet, {_1} yazar)
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -4351,6 +4351,7 @@ axis Both Обидві
|
||||
@msg tool shortcuts must be a single key (optionally with Shift) поєднання інструментів має бути однією клавішею (необов’язково з Shift)
|
||||
@msg truncated усічено
|
||||
@msg unknown command `{0}` невідома команда `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? невідома команда `{0}`; можливо, ви мали на увазі `{1}`?
|
||||
@msg unknown effect `{id}` невідомий ефект `{id}`
|
||||
@msg unknown format невідомий формат
|
||||
@msg unknown format `{f}` (Save writes {_1}) невідомий формат `{f}` (збереження записує {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 749 and column 40.
|
@@ -4730,6 +4730,7 @@ theme Appearance Giao diện
|
||||
@msg truncated bị cắt ngắn
|
||||
@msg Unembedded to {_1} Đã bỏ nhúng vào {_1}
|
||||
@msg unknown command `{0}` lệnh không xác định `{0}`
|
||||
@msg unknown command `{0}`; did you mean `{1}`? lệnh không xác định `{0}`; ý bạn là `{1}`?
|
||||
@msg unknown effect `{id}` hiệu ứng không xác định `{id}`
|
||||
@msg unknown format định dạng không xác định
|
||||
@msg unknown format `{f}` (Save writes {_1}) định dạng không xác định `{f}` (Lưu ghi {_1})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 4054 and column 10.
|
@@ -3921,6 +3921,7 @@ imageTrace Outline 轮廓
|
||||
@msg objects can't be nested more than 32 deep 对象的嵌套不能超过 32 层
|
||||
@msg the SVG's elements are nested more than {0} deep SVG 的元素嵌套超过 {0} 层
|
||||
@msg unknown command `{0}` 未知命令 `{0}`
|
||||
@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 path has too many points 某条路径的点过多
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -1901,6 +1901,7 @@ file-filter Templates 範本
|
||||
@msg objects can't be nested more than 32 deep 物件的巢狀層級不能超過 32 層
|
||||
@msg the SVG's elements are nested more than {0} deep SVG 的元素巢狀超過 {0} 層
|
||||
@msg unknown command `{0}` 未知的指令 `{0}`
|
||||
@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 path has too many points 有一條路徑的點過多
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1030,6 +1030,14 @@ of the format they write (one object can carry several formats' options). A comm
|
||||
(`document.setup`, `text.areaOptions`) says so the same way. The app's own journal isn't checked: an action or
|
||||
journal recorded by an older version replays as it did, except for an effect `color` that the effect can't read.
|
||||
|
||||
An unknown command id is matched the same way as an unknown parameter key: the error names the nearest command id when
|
||||
one is near, ignoring case. A step of `command.batch` or `action.batch` gets the same suggestion in its step error:
|
||||
|
||||
```json
|
||||
{"id": "select.al"}
|
||||
→ unknown command `select.al`; did you mean `select.all`?
|
||||
```
|
||||
|
||||
These Object menu commands refuse a string or another value that is not a number with
|
||||
`` `scaleH` must be a number, not "50" ``, naming the key, and change nothing: `scaleH`, `scaleV`, `moveH`, `moveV`
|
||||
and `rotate` in `object.transformEach`; `ppi` in `object.rasterize`; `width`, `height`, `spacingX` and `spacingY` in
|
||||
|
||||
Reference in New Issue
Block a user