mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-14 13:36:53 +00:00
i18n: messages with escaped JSON braces match their catalog rows
Catalog rows now read `{{` and `}}` as a literal `{` and `}`, in the
English source and in the translation, as in a Rust format string. A `{`
with no `}` after it is literal text instead of dropping the row.
- The plugin.run errors for an importer, an exporter and a live effect
(`document.open {"importer": ...}` and the like) now show translated
with the plug-in's id and JSON kept, in the 22 catalogs that list them.
Their rows were keyed as `{{"importer"}"}}`, which never matched.
- The test that keys a format string keeps `{{`/`}}` and numbers only real
placeholders, so its expected keys match the runtime text. Two junk
rows it produced for the RTF error (hi, sv) are removed.
This commit is contained in:
@@ -677,13 +677,23 @@ fn message_at(lang: Lang, s: &str, depth: usize) -> String {
|
||||
}
|
||||
|
||||
/// Fill `{name}` placeholders in one pass: a value that holds `{name}` text stays as it is.
|
||||
/// Unknown placeholders are left as written.
|
||||
/// Unknown placeholders are left as written. `{{` and `}}` are a literal `{` and `}`.
|
||||
fn fill_once(template: &str, args: &[(&str, &str)]) -> String {
|
||||
let mut rest = template;
|
||||
let mut out = String::with_capacity(rest.len());
|
||||
while let Some(open) = rest.find('{') {
|
||||
while let Some(open) = rest.find(['{', '}']) {
|
||||
out.push_str(&rest[..open]);
|
||||
let after = &rest[open + 1..];
|
||||
if rest[open..].starts_with('}') {
|
||||
out.push('}');
|
||||
rest = after.strip_prefix('}').unwrap_or(after);
|
||||
continue;
|
||||
}
|
||||
if let Some(escaped) = after.strip_prefix('{') {
|
||||
out.push('{');
|
||||
rest = escaped;
|
||||
continue;
|
||||
}
|
||||
let filled = after.find('}').and_then(|close| args.iter().find(|(k, _)| *k == &after[..close]).map(|(_, v)| (*v, close)));
|
||||
match filled {
|
||||
Some((value, close)) => {
|
||||
|
||||
@@ -7135,7 +7135,9 @@ breakText Glyphs Glifs
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` «{shown}» obre fitxers {_1}, no `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` és un complement del tipus `{_2}`, no un importador
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` és un complement del tipus `{_2}`, no un exportador
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` és un importador: obriu un fitxer amb document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` és un importador: obriu un fitxer amb document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` és un exportador: exporteu amb document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` és un efecte dinàmic: apliqueu-lo amb effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects l’importador no ha retornat cap objecte
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` un importador retorna `objects` i `warnings`, no `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads el fitxer supera els {MAX_INPUT_BYTES} bytes que llegeix un importador
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -47,23 +47,42 @@ const MAX_MESSAGE_LEN: usize = 2000;
|
||||
|
||||
impl Template {
|
||||
/// `None` for a template that can't be matched reliably: no literal text, or two placeholders
|
||||
/// in a row (where one ends and the next begins is unknowable).
|
||||
/// in a row (where one ends and the next begins is unknowable). `{{` and `}}` are a literal `{`
|
||||
/// and `}`, as in a Rust format string, and so is a `{` with no `}` after it.
|
||||
fn parse(source: &str, forms: Vec<String>, counted: bool) -> Option<Template> {
|
||||
let mut pieces = Vec::new();
|
||||
let mut text = String::new();
|
||||
let mut rest = source;
|
||||
while let Some(a) = rest.find('{') {
|
||||
while let Some(a) = rest.find(['{', '}']) {
|
||||
text.push_str(rest.get(..a)?);
|
||||
let after = rest.get(a + 1..)?;
|
||||
let b = after.find('}')?;
|
||||
if a > 0 {
|
||||
pieces.push(Piece::Text(rest.get(..a)?.to_string()));
|
||||
let brace = if rest.get(a..)?.starts_with('{') { '{' } else { '}' };
|
||||
if let Some(escaped) = after.strip_prefix(brace) {
|
||||
text.push(brace);
|
||||
rest = escaped;
|
||||
continue;
|
||||
}
|
||||
if brace == '}' {
|
||||
text.push('}');
|
||||
rest = after;
|
||||
continue;
|
||||
}
|
||||
let Some(b) = after.find('}') else {
|
||||
text.push('{');
|
||||
rest = after;
|
||||
continue;
|
||||
};
|
||||
if !text.is_empty() {
|
||||
pieces.push(Piece::Text(std::mem::take(&mut text)));
|
||||
} else if matches!(pieces.last(), Some(Piece::Hole(_))) {
|
||||
return None;
|
||||
}
|
||||
pieces.push(Piece::Hole(after.get(..b)?.to_string()));
|
||||
rest = after.get(b + 1..)?;
|
||||
}
|
||||
if !rest.is_empty() {
|
||||
pieces.push(Piece::Text(rest.to_string()));
|
||||
text.push_str(rest);
|
||||
if !text.is_empty() {
|
||||
pieces.push(Piece::Text(text));
|
||||
}
|
||||
let literal = pieces.iter().map(|p| if let Piece::Text(t) = p { t.len() } else { 0 }).sum();
|
||||
(literal > 0).then_some(Template { pieces, literal, forms, counted })
|
||||
@@ -175,7 +194,7 @@ impl Catalog {
|
||||
c.plurals.insert(src, tr.split('|').map(str::to_string).collect());
|
||||
}
|
||||
"@msg" => {
|
||||
if src.contains('{') {
|
||||
if src.contains('{') || src.contains("}}") {
|
||||
c.templates.extend(Template::parse(&src, vec![tr], false));
|
||||
} else {
|
||||
c.messages.insert(src, tr);
|
||||
@@ -237,13 +256,17 @@ impl Catalog {
|
||||
}
|
||||
}
|
||||
|
||||
/// `{name}` placeholders of a template, in order of appearance.
|
||||
/// `{name}` placeholders of a template, in order of appearance; `{{` is a literal brace.
|
||||
#[cfg(test)]
|
||||
pub fn placeholders(s: &str) -> Vec<&str> {
|
||||
let mut out = Vec::new();
|
||||
let mut rest = s;
|
||||
while let Some(a) = rest.find('{') {
|
||||
let after = &rest[a + 1..];
|
||||
if let Some(escaped) = after.strip_prefix('{') {
|
||||
rest = escaped;
|
||||
continue;
|
||||
}
|
||||
match after.find('}') {
|
||||
Some(b) => {
|
||||
out.push(&after[..b]);
|
||||
|
||||
@@ -7154,7 +7154,9 @@ breakText Glyphs Glyfy
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` „{shown}“ otevírá soubory {_1}, ne `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` je zásuvný modul druhu `{_2}`, ne importní zásuvný modul
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` je zásuvný modul druhu `{_2}`, ne exportní zásuvný modul
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` je importní zásuvný modul: otevřete soubor pomocí document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` je importní zásuvný modul: otevřete soubor pomocí document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` je exportní zásuvný modul: exportujte pomocí document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` je živý efekt: použijte ho pomocí effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects importní zásuvný modul nevrátil žádné objekty
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` importní zásuvný modul vrací `objects` a `warnings`, ne `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads soubor je větší než {MAX_INPUT_BYTES} bajtů, které importní zásuvný modul čte
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6749,7 +6749,9 @@ breakText Glyphs Glyphen
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` „{shown}“ öffnet {_1}-Dateien, nicht `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` ist ein Plug-in der Art `{_2}`, kein Import-Plug-in
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` ist ein Plug-in der Art `{_2}`, kein Export-Plug-in
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` ist ein Import-Plug-in: Öffnen Sie eine Datei mit document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` ist ein Import-Plug-in: Öffnen Sie eine Datei mit document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` ist ein Export-Plug-in: Exportieren Sie mit document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` ist ein Live-Effekt: Wenden Sie ihn mit effect.apply {{"effect": "{_2}"}} an
|
||||
@msg the importer returned no objects das Import-Plug-in hat keine Objekte zurückgegeben
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` ein Import-Plug-in gibt `objects` und `warnings` zurück, nicht `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads die Datei ist größer als die {MAX_INPUT_BYTES} Byte, die ein Import-Plug-in liest
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7106,7 +7106,9 @@ breakText Glyphs Γλύφοι
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` το «{shown}» ανοίγει αρχεία {_1}, όχι `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer το `{_1}` είναι πρόσθετο τύπου `{_2}`, όχι πρόσθετο εισαγωγής
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter το `{_1}` είναι πρόσθετο τύπου `{_2}`, όχι πρόσθετο εξαγωγής
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} το `{_1}` είναι πρόσθετο εισαγωγής: ανοίξτε ένα αρχείο με document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} το `{_1}` είναι πρόσθετο εισαγωγής: ανοίξτε ένα αρχείο με document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} το `{_1}` είναι πρόσθετο εξαγωγής: κάντε εξαγωγή με document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} το `{_1}` είναι δυναμικό εφέ: εφαρμόστε το με effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects το πρόσθετο εισαγωγής δεν επέστρεψε κανένα αντικείμενο
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` ένα πρόσθετο εισαγωγής επιστρέφει `objects` και `warnings`, όχι `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads το αρχείο είναι μεγαλύτερο από τα {MAX_INPUT_BYTES} byte που διαβάζει ένα πρόσθετο εισαγωγής
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -7097,7 +7097,9 @@ breakText Glyphs Glifos
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` «{shown}» abre archivos {_1}, no `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` es un plugin de tipo `{_2}`, no un plugin de importación
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` es un plugin de tipo `{_2}`, no un plugin de exportación
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` es un plugin de importación: abra un archivo con document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` es un plugin de importación: abra un archivo con document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` es un plugin de exportación: exporte con document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` es un efecto interactivo: aplíquelo con effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects el plugin de importación no devolvió ningún objeto
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` un plugin de importación devuelve `objects` y `warnings`, no `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads el archivo supera los {MAX_INPUT_BYTES} bytes que lee un plugin de importación
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7189,7 +7189,9 @@ breakText Glyphs Merkit
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` ”{shown}” avaa {_1}-tiedostoja, ei `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` on lajin `{_2}` laajennus, ei tuontilaajennus
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` on lajin `{_2}` laajennus, ei vientilaajennus
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` on tuontilaajennus: avaa tiedosto komennolla document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` on tuontilaajennus: avaa tiedosto komennolla document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` on vientilaajennus: vie komennolla document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` on live-tehoste: käytä sitä komennolla effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects tuontilaajennus ei palauttanut objekteja
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` tuontilaajennus palauttaa `objects` ja `warnings`, ei `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads tiedosto on suurempi kuin tuontilaajennuksen lukemat {MAX_INPUT_BYTES} tavua
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7149,7 +7149,9 @@ breakText Glyphs Glyphes
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` « {shown} » ouvre les fichiers {_1}, pas `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` est un module externe de type `{_2}`, pas un module externe d’importation
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` est un module externe de type `{_2}`, pas un module externe d’exportation
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` est un module externe d’importation : ouvrez un fichier avec document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` est un module externe d’importation : ouvrez un fichier avec document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` est un module externe d’exportation : exportez avec document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` est un effet dynamique : appliquez-le avec effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects le module externe d’importation n’a renvoyé aucun objet
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` un module externe d’importation renvoie `objects` et `warnings`, pas `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads le fichier dépasse les {MAX_INPUT_BYTES} octets qu’un module externe d’importation lit
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5754,8 +5754,8 @@ antiAlias Sharp शार्प
|
||||
@msg `{_1}` has no brushes to apply `{_1}` को लागू करने के लिए कोई ब्रश नहीं है
|
||||
@msg `{_1}` has no symbols to place `{_1}` के पास कोई सिंबल नहीं है
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` `{_2}` प्रकार का प्लग-इन है, निर्यातक नहीं
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect"}"}} `{_1}` एक लाइव इफ़ेक्ट है: इसे effect.apply {{"effect"}"}} के साथ लागू करें
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format"}"}} `{_1}` एक एक्सपोर्टर है: document.export {{"format"}"}} से एक्सपोर्ट करें
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` एक लाइव इफ़ेक्ट है: इसे effect.apply {{"effect": "{_2}"}} के साथ लागू करें
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` एक एक्सपोर्टर है: document.export {{"format": "{_2}"}} से एक्सपोर्ट करें
|
||||
@msg `{_1}` is built in and always listed `{_1}` बनाया गया है और हमेशा सूचीबद्ध है
|
||||
@msg `{_1}` is no save command `{_1}` कोई बचत आदेश नहीं है
|
||||
@msg `{_1}` is not a font file the last text.findFontFiles search found `{_1}` पिछली text.findFontFiles सर्च में मिली फ़ॉन्ट फ़ाइल नहीं है
|
||||
@@ -7376,7 +7376,6 @@ antiAlias Sharp शार्प
|
||||
@msg not an export presets file: {e} एक निर्यात प्रीसेट फ़ाइल नहीं: {e}
|
||||
@msg not an image VectorCraft reads (see document.formats) यह ऐसी इमेज नहीं है जिसे VectorCraft पढ़ सके (document.formats देखें)
|
||||
@msg not an RTF file: it doesn't start with {\\rtf RTF फ़ाइल नहीं: यह {\rtf के साथ शुरू नहीं होता है
|
||||
@msg not an RTF file: it doesn't start with not an RTF file: it doesn't start with {\rtf RTF फ़ाइल: यह एक RTF फ़ाइल के साथ शुरू नहीं होता है: यह {\rtf के साथ शुरू नहीं होता है
|
||||
@msg not area type (text in a frame) outside perspective नहीं क्षेत्र के प्रकार (एक फ्रेम में टेक्स्ट) बाहर पर्सपेक्टिव
|
||||
@msg not editing an opacity mask एक opacity मास्क संपादित न करें
|
||||
@msg not found नहीं मिला
|
||||
@@ -8580,7 +8579,7 @@ theme Appearance अपीयरेंस
|
||||
@msg `importer` must be a plug-in format id (see document.formats) `importer` किसी प्लग-इन का फ़ॉर्मेट id होना चाहिए (document.formats देखें)
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}” {_1} फ़ाइलें खोलता है, `{_2}` नहीं
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` `{_2}` प्रकार का प्लग-इन है, इंपोर्टर नहीं
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` एक इंपोर्टर है: document.open {{"importer"}"}} से फ़ाइल खोलें
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` एक इंपोर्टर है: document.open {{"importer": "{_2}"}} से फ़ाइल खोलें
|
||||
@msg the importer returned no objects इंपोर्टर ने कोई ऑब्जेक्ट नहीं लौटाया
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` इंपोर्टर `objects` और `warnings` लौटाता है, `{key}` नहीं
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads फ़ाइल उन {MAX_INPUT_BYTES} बाइट्स से बड़ी है जो इंपोर्टर पढ़ता है
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -7138,7 +7138,9 @@ breakText Glyphs Glifák
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` „{shown}” {_1} fájlokat nyit meg, nem `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}`: `{_2}` fajtájú bővítmény, nem importáló bővítmény
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}`: `{_2}` fajtájú bővítmény, nem exportáló bővítmény
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` importáló bővítmény: nyisson meg egy fájlt a document.open {{"importer"}"}} paranccsal
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` importáló bővítmény: nyisson meg egy fájlt a document.open {{"importer": "{_2}"}} paranccsal
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` exportáló bővítmény: exportáljon a document.export {{"format": "{_2}"}} paranccsal
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` élő effektus: alkalmazza az effect.apply {{"effect": "{_2}"}} paranccsal
|
||||
@msg the importer returned no objects az importáló bővítmény nem adott vissza objektumot
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` az importáló bővítmény `objects` és `warnings` értéket ad vissza, nem `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads a fájl nagyobb annál a {MAX_INPUT_BYTES} bájtnál, amit egy importáló bővítmény beolvas
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6783,7 +6783,9 @@ breakText Glyphs Glifi
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` «{shown}» apre file {_1}, non `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` è un plug-in di tipo `{_2}`, non un plug-in di importazione
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` è un plug-in di tipo `{_2}`, non un plug-in di esportazione
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` è un plug-in di importazione: apri un file con document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` è un plug-in di importazione: apri un file con document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` è un plug-in di esportazione: esporta con document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` è un effetto dinamico: applicalo con effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects il plug-in di importazione non ha restituito alcun oggetto
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` un plug-in di importazione restituisce `objects` e `warnings`, non `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads il file supera i {MAX_INPUT_BYTES} byte che un plug-in di importazione legge
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6848,7 +6848,9 @@ breakText Glyphs 字形
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` 「{shown}」が開くのは {_1} ファイルで、`{_2}` ではありません
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` は種類 `{_2}` のプラグインで、読み込みプラグインではありません
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` は種類 `{_2}` のプラグインで、書き出しプラグインではありません
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` は読み込みプラグインです: document.open {{"importer"}"}} でファイルを開いてください
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` は読み込みプラグインです: document.open {{"importer": "{_2}"}} でファイルを開いてください
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` は書き出しプラグインです: document.export {{"format": "{_2}"}} で書き出してください
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` はライブ効果です: effect.apply {{"effect": "{_2}"}} で適用してください
|
||||
@msg the importer returned no objects 読み込みプラグインがオブジェクトを返しませんでした
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` 読み込みプラグインが返すのは `objects` と `warnings` で、`{key}` ではありません
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads ファイルが読み込みプラグインの読み取る {MAX_INPUT_BYTES} バイトを超えています
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7263,7 +7263,9 @@ font-script Japanese იაპონური
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` „{shown}“ ხსნის {_1} ფაილებს და არა `{_2}`-ს
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` არის `{_2}` სახის პლაგინი და არა იმპორტის პლაგინი
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` არის `{_2}` სახის პლაგინი და არა ექსპორტის პლაგინი
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` იმპორტის პლაგინია: გახსენით ფაილი document.open {{"importer"}"}}-ით
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` იმპორტის პლაგინია: გახსენით ფაილი document.open {{"importer": "{_2}"}}-ით
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` ექსპორტის პლაგინია: მოახდინეთ ექსპორტი document.export {{"format": "{_2}"}}-ით
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` ცოცხალი ეფექტია: გამოიყენეთ ის effect.apply {{"effect": "{_2}"}}-ით
|
||||
@msg the importer returned no objects იმპორტის პლაგინმა ობიექტები არ დააბრუნა
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` იმპორტის პლაგინი აბრუნებს `objects`-ს და `warnings`-ს და არა `{key}`-ს
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads ფაილი აღემატება {MAX_INPUT_BYTES} ბაიტს, რომელსაც იმპორტის პლაგინი კითხულობს
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -6744,7 +6744,9 @@ breakText Glyphs 글리프
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}”은(는) {_1} 파일을 엽니다. `{_2}`은(는) 열지 않습니다
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}`은(는) `{_2}` 종류의 플러그인이며 가져오기 플러그인이 아닙니다
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}`은(는) `{_2}` 종류의 플러그인이며 내보내기 플러그인이 아닙니다
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}`은(는) 가져오기 플러그인입니다: document.open {{"importer"}"}}로 파일을 여세요
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}`은(는) 가져오기 플러그인입니다: document.open {{"importer": "{_2}"}}로 파일을 여세요
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}`은(는) 내보내기 플러그인입니다: document.export {{"format": "{_2}"}}로 내보내세요
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}`은(는) 라이브 효과입니다: effect.apply {{"effect": "{_2}"}}로 적용하세요
|
||||
@msg the importer returned no objects 가져오기 플러그인이 개체를 반환하지 않았습니다
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` 가져오기 플러그인은 `{key}`가 아닌 `objects`와 `warnings`를 반환합니다
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads 파일이 가져오기 플러그인이 읽는 {MAX_INPUT_BYTES}바이트보다 큽니다
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7010,7 +7010,9 @@ breakText Glyphs Glify
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` „{shown}” otwiera pliki {_1}, a nie `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` to wtyczka rodzaju `{_2}`, a nie wtyczka importu
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` to wtyczka rodzaju `{_2}`, a nie wtyczka eksportu
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` to wtyczka importu: otwórz plik za pomocą document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` to wtyczka importu: otwórz plik za pomocą document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` to wtyczka eksportu: eksportuj za pomocą document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` to efekt na żywo: zastosuj go za pomocą effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects wtyczka importu nie zwróciła żadnych obiektów
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` wtyczka importu zwraca `objects` i `warnings`, a nie `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads plik jest większy niż {MAX_INPUT_BYTES} bajtów, które odczytuje wtyczka importu
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -7227,7 +7227,9 @@ swatch Yellow Green Verde-amarelado
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}” abre arquivos {_1}, não `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` é um plug-in do tipo `{_2}`, não um plug-in de importação
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` é um plug-in do tipo `{_2}`, não um plug-in de exportação
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` é um plug-in de importação: abra um arquivo com document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` é um plug-in de importação: abra um arquivo com document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` é um plug-in de exportação: exporte com document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` é um efeito dinâmico: aplique-o com effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects o plug-in de importação não retornou nenhum objeto
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` um plug-in de importação retorna `objects` e `warnings`, não `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads o arquivo é maior que os {MAX_INPUT_BYTES} bytes que um plug-in de importação lê
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -7243,7 +7243,9 @@ shape Open Открытый
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` «{shown}» открывает файлы {_1}, а не `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` является модулем вида `{_2}`, а не модулем импорта
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` является модулем вида `{_2}`, а не модулем экспорта
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` — модуль импорта: откройте файл с помощью document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` — модуль импорта: откройте файл с помощью document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` — модуль экспорта: экспортируйте с помощью document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` — динамический эффект: примените его с помощью effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects модуль импорта не вернул ни одного объекта
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` модуль импорта возвращает `objects` и `warnings`, а не `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads файл больше {MAX_INPUT_BYTES} байт, которые читает модуль импорта
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -7263,8 +7263,8 @@ digits Hindi Hindi
|
||||
@msg {what} would print on more than {MAX_TILES} tiles: scale it down {what} skulle skrivas ut på fler än {MAX_TILES} rutor: skala ned det
|
||||
@msg `{_1}` can't be edited or removed `{_1}` kan inte redigeras eller tas bort
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` är ett plugin av typen `{_2}`, inte en exportfunktion
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect"}"}} `{_1}` är en live-effekt: använd den med effect.apply {{"effect"}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format"}"}} `{_1}` är en exportfunktion: exportera med document.export {{"format"}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` är en live-effekt: använd den med effect.apply {{"effect": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` är en exportfunktion: exportera med document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is built in and always listed `{_1}` är inbyggd och listas alltid
|
||||
@msg `{_1}` is not a font file the last text.findFontFiles search found `{_1}` är inte en typsnittsfil som den senaste sökningen med text.findFontFiles hittade
|
||||
@msg `{_1}` would be overwritten by the package: choose a different folder or name `{_1}` skulle skrivas över av paketet: välj en annan mapp eller ett annat namn
|
||||
@@ -8102,7 +8102,6 @@ digits Hindi Hindi
|
||||
@msg not a Word document: its package has no main document part inte ett Word-dokument: dess paket saknar huvuddokumentdel
|
||||
@msg not a Word document: its WordDocument stream doesn't start with a file information block inte ett Word-dokument: dess WordDocument-ström börjar inte med ett filinformationsblock
|
||||
@msg not an image VectorCraft reads (see document.formats) inte en bild som VectorCraft kan läsa (se document.formats)
|
||||
@msg not an RTF file: it doesn't start with not an RTF file: it doesn't start with {\rtf inte en RTF-fil: den börjar inte med inte en RTF-fil: den börjar inte med {\rtf
|
||||
@msg not area type (text in a frame) outside perspective inte områdestext (text i en ram) utanför perspektivet
|
||||
@msg not editing an opacity mask redigerar inte en opacitetsmask
|
||||
@msg not JSON: {e} inte JSON: {e}
|
||||
@@ -8597,7 +8596,7 @@ digits Hindi Hindi
|
||||
@msg `importer` must be a plug-in format id (see document.formats) `importer` måste vara ett formatid för ett plugin (se document.formats)
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` ”{shown}” öppnar {_1}-filer, inte `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` är ett plugin av typen `{_2}`, inte en importfunktion
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` är en importfunktion: öppna en fil med document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` är en importfunktion: öppna en fil med document.open {{"importer": "{_2}"}}
|
||||
@msg the importer returned no objects importfunktionen returnerade inga objekt
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` en importfunktion returnerar `objects` och `warnings`, inte `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads filen är större än de {MAX_INPUT_BYTES} byte som en importfunktion läser
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -1786,6 +1786,81 @@ fn templates_that_start_with_text_match_first() {
|
||||
assert_eq!(c.message("a.wasm is 9 bytes (limit 8)").map(|(f, _)| f), Some("sized {_1}"));
|
||||
}
|
||||
|
||||
/// `{{` and `}}` in a message row are literal braces, in the English source and in the
|
||||
/// translation, as in a Rust format string; only the other `{name}` are placeholders.
|
||||
#[test]
|
||||
fn message_rows_read_doubled_braces_as_literal_braces() {
|
||||
let c = Catalog::parse(concat!(
|
||||
"@msg\t`{_1}` runs with plugin.run {{\"id\": \"{_2}\"}}\t`{_1}`: plugin.run {{\"id\": \"{_2}\"}} (fr)\n",
|
||||
"@msg\tbraces {{}} and {_1}\tbraces {{}} with {_1}\n",
|
||||
"@msg\tonly {{literal}} braces\tliteral {{braces}}\n",
|
||||
"@msg\tnot an RTF file: it doesn't start with {\\\\rtf\tno RTF: {\\\\rtf\n",
|
||||
));
|
||||
let (form, caps) = c.message(r#"`a.b` runs with plugin.run {"id": "plugin:a.b"}"#).expect("matches");
|
||||
assert_eq!(caps, [("_1", "a.b"), ("_2", "plugin:a.b")]);
|
||||
assert_eq!(fill_once(form, &caps), r#"`a.b`: plugin.run {"id": "plugin:a.b"} (fr)"#);
|
||||
assert!(c.message(r#"`a.b` runs with plugin.run {{"id": "plugin:a.b"}}"#).is_none());
|
||||
let (form, caps) = c.message("braces {} and x").expect("matches");
|
||||
assert_eq!(fill_once(form, &caps), "braces {} with x");
|
||||
let (form, caps) = c.message("only {literal} braces").expect("matches");
|
||||
assert_eq!(fill_once(form, &caps), "literal {braces}");
|
||||
// A `{` with no `}` after it is literal text too.
|
||||
assert_eq!(c.message(r"not an RTF file: it doesn't start with {\rtf").map(|(f, _)| f), Some(r"no RTF: {\rtf"));
|
||||
assert_eq!(placeholders(r#"{{"id": "{_2}"}} {{x}} {n}"#), ["_2", "n"]);
|
||||
}
|
||||
|
||||
/// A format string's `{{` and `}}` stay literal braces in its catalog key, and only its real
|
||||
/// placeholders are numbered.
|
||||
#[test]
|
||||
fn message_keys_keep_doubled_braces() {
|
||||
assert_eq!(
|
||||
as_template(r#"`{}` is an importer: open a file with document.open {{"importer": "{}"}}"#),
|
||||
r#"`{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}}"#
|
||||
);
|
||||
assert_eq!(as_template("{k} must be {{size?, position?}}"), "{k} must be {{size?, position?}}");
|
||||
assert_eq!(as_template(r"it doesn't start with {\rtf"), r"it doesn't start with {\rtf");
|
||||
}
|
||||
|
||||
/// `plugin.run` of an importer, an exporter or a live effect names the command that runs it with
|
||||
/// the JSON that picks it, and every complete-message catalog translates that error with the
|
||||
/// plug-in's id and the JSON kept.
|
||||
#[test]
|
||||
fn plugin_run_of_another_kind_is_translated_with_its_json() {
|
||||
use serde_json::json;
|
||||
use vectorcraft_plugins::wat as tpl;
|
||||
let mut s = vectorcraft_engine::Session::new();
|
||||
let plugins = [
|
||||
("test.i18n.reader", tpl::importer("test.i18n.reader", r#"["ti18n"]"#, "{}"), "is an importer"),
|
||||
("test.i18n.writer", tpl::exporter("test.i18n.writer", r#"["ti18n"]"#, "{}"), "is an exporter"),
|
||||
("test.i18n.effect", tpl::manifest("test.i18n.effect", "effect", "{}"), "is a live effect"),
|
||||
];
|
||||
for (_, manifest, _) in &plugins {
|
||||
let wasm = wat::parse_str(tpl::module(manifest, tpl::ECHO, "", 1)).unwrap();
|
||||
s.execute("plugin.install", &json!({"dataBase64": vectorcraft_format::base64_encode(&wasm)})).unwrap();
|
||||
}
|
||||
s.execute("file.new", &json!({})).unwrap();
|
||||
let errors: Vec<(String, &str, &str)> =
|
||||
plugins.iter().map(|(id, _, english)| (s.execute("plugin.run", &json!({"id": id})).unwrap_err().to_string(), *id, *english)).collect();
|
||||
for (id, _, _) in &plugins {
|
||||
s.execute("plugin.remove", &json!({"id": id})).unwrap();
|
||||
}
|
||||
for code in COMPLETE_MESSAGES {
|
||||
let lang = Lang::from_code(code).expect("registered");
|
||||
for (e, id, english) in &errors {
|
||||
assert!(e.contains(english), "{e}");
|
||||
let json = &e[e.rfind('{').unwrap()..];
|
||||
assert!(json.ends_with('}') && json.contains(id), "{e}");
|
||||
let shown = message(lang, e);
|
||||
assert!(!shown.contains(english) && shown.contains(json) && shown.contains(&format!("`{id}`")), "{code}: {e} -> {shown}");
|
||||
}
|
||||
}
|
||||
assert!(
|
||||
message(de(), &errors[0].0).ends_with(r#"Öffnen Sie eine Datei mit document.open {"importer": "plugin.test.i18n.reader"}"#),
|
||||
"{}",
|
||||
message(de(), &errors[0].0)
|
||||
);
|
||||
}
|
||||
|
||||
/// A `@msgplural` row translates both English forms of a message with a count, and the count
|
||||
/// picks the language's form.
|
||||
#[test]
|
||||
@@ -3515,7 +3590,8 @@ fn string_literal(s: &str) -> Option<String> {
|
||||
}
|
||||
}
|
||||
|
||||
/// A format string as a catalog template (see [`message_literals`]).
|
||||
/// A format string as a catalog template (see [`message_literals`]). `{{` and `}}` stay as they
|
||||
/// are, the catalogs' literal braces.
|
||||
fn as_template(s: &str) -> String {
|
||||
let mut out = String::new();
|
||||
let mut unnamed = 0;
|
||||
@@ -3523,7 +3599,15 @@ fn as_template(s: &str) -> String {
|
||||
while let Some(a) = rest.find('{') {
|
||||
out.push_str(&rest[..a]);
|
||||
let after = &rest[a + 1..];
|
||||
let Some(b) = after.find('}') else { break };
|
||||
if let Some(escaped) = after.strip_prefix('{') {
|
||||
out.push_str("{{");
|
||||
rest = escaped;
|
||||
continue;
|
||||
}
|
||||
let Some(b) = after.find('}') else {
|
||||
out.push_str(&rest[a..]);
|
||||
return out;
|
||||
};
|
||||
let name = after[..b].split(':').next().unwrap_or("");
|
||||
if name.is_empty() {
|
||||
unnamed += 1;
|
||||
|
||||
@@ -7110,7 +7110,9 @@ breakText Glyphs Glifler
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}” {_1} dosyalarını açar, `{_2}` dosyasını değil
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}`, `{_2}` türünde bir eklentidir, içe aktarma eklentisi değildir
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}`, `{_2}` türünde bir eklentidir, dışa aktarma eklentisi değildir
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` bir içe aktarma eklentisidir: dosyayı document.open {{"importer"}"}} ile açın
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` bir içe aktarma eklentisidir: dosyayı document.open {{"importer": "{_2}"}} ile açın
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` bir dışa aktarma eklentisidir: document.export {{"format": "{_2}"}} ile dışa aktarın
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` canlı bir efekttir: effect.apply {{"effect": "{_2}"}} ile uygulayın
|
||||
@msg the importer returned no objects içe aktarma eklentisi hiç nesne döndürmedi
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` içe aktarma eklentisi `{key}` değil, `objects` ve `warnings` döndürür
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads dosya, içe aktarma eklentisinin okuduğu {MAX_INPUT_BYTES} bayttan büyük
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -6763,7 +6763,9 @@ breakText Glyphs Гліфи
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` «{shown}» відкриває файли {_1}, а не `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` є модулем виду `{_2}`, а не модулем імпорту
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` є модулем виду `{_2}`, а не модулем експорту
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` - модуль імпорту: відкрийте файл за допомогою document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` - модуль імпорту: відкрийте файл за допомогою document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` - модуль експорту: експортуйте за допомогою document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` - динамічний ефект: застосуйте його за допомогою effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects модуль імпорту не повернув жодного об’єкта
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` модуль імпорту повертає `objects` і `warnings`, а не `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads файл більший за {MAX_INPUT_BYTES} байтів, які читає модуль імпорту
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -6764,7 +6764,9 @@ breakText Glyphs Glyph
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}” mở tệp {_1}, không phải `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` là plug-in loại `{_2}`, không phải plug-in nhập
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` là plug-in loại `{_2}`, không phải plug-in xuất
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` là plug-in nhập: hãy mở tệp bằng document.open {{"importer"}"}}
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` là plug-in nhập: hãy mở tệp bằng document.open {{"importer": "{_2}"}}
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` là plug-in xuất: hãy xuất bằng document.export {{"format": "{_2}"}}
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` là hiệu ứng trực tiếp: hãy áp dụng bằng effect.apply {{"effect": "{_2}"}}
|
||||
@msg the importer returned no objects plug-in nhập không trả về đối tượng nào
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` plug-in nhập trả về `objects` và `warnings`, không phải `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads tệp lớn hơn {MAX_INPUT_BYTES} byte mà plug-in nhập đọc
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 204 and column 5.
|
@@ -6995,7 +6995,9 @@ breakText Glyphs 字形
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` “{shown}” 打开的是 {_1} 文件,不是 `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` 是 `{_2}` 类型的增效工具,不是导入增效工具
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` 是 `{_2}` 类型的增效工具,不是导出增效工具
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` 是导入增效工具:请用 document.open {{"importer"}"}} 打开文件
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` 是导入增效工具:请用 document.open {{"importer": "{_2}"}} 打开文件
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` 是导出增效工具:请用 document.export {{"format": "{_2}"}} 导出
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` 是实时效果:请用 effect.apply {{"effect": "{_2}"}} 应用
|
||||
@msg the importer returned no objects 导入增效工具未返回任何对象
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` 导入增效工具返回 `objects` 和 `warnings`,不是 `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads 文件超过导入增效工具读取的 {MAX_INPUT_BYTES} 字节
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6801,7 +6801,9 @@ breakText Glyphs 字符
|
||||
@msg “{shown}” opens {_1} files, not `{_2}` 「{shown}」開啟的是 {_1} 檔案,不是 `{_2}`
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an importer `{_1}` 是 `{_2}` 類型的增效模組,不是匯入增效模組
|
||||
@msg `{_1}` is a plug-in of kind `{_2}`, not an exporter `{_1}` 是 `{_2}` 類型的增效模組,不是匯出增效模組
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer"}"}} `{_1}` 是匯入增效模組:請用 document.open {{"importer"}"}} 開啟檔案
|
||||
@msg `{_1}` is an importer: open a file with document.open {{"importer": "{_2}"}} `{_1}` 是匯入增效模組:請用 document.open {{"importer": "{_2}"}} 開啟檔案
|
||||
@msg `{_1}` is an exporter: export with document.export {{"format": "{_2}"}} `{_1}` 是匯出增效模組:請用 document.export {{"format": "{_2}"}} 匯出
|
||||
@msg `{_1}` is a live effect: apply it with effect.apply {{"effect": "{_2}"}} `{_1}` 是即時效果:請用 effect.apply {{"effect": "{_2}"}} 套用
|
||||
@msg the importer returned no objects 匯入增效模組未傳回任何物件
|
||||
@msg an importer returns `objects` and `warnings`, not `{key}` 匯入增效模組傳回 `objects` 和 `warnings`,不是 `{key}`
|
||||
@msg the file is larger than the {MAX_INPUT_BYTES} bytes an importer reads 檔案超過匯入增效模組讀取的 {MAX_INPUT_BYTES} 位元組
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
Reference in New Issue
Block a user