mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-12 05:22:48 +00:00
Merge main into feat/character-anti-aliasing-method
# Conflicts: # docs/target-app-parity.md
This commit is contained in:
Generated
+12
@@ -705,6 +705,17 @@ dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfb"
|
||||
version = "0.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"uuid",
|
||||
"web-time",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.5"
|
||||
@@ -6205,6 +6216,7 @@ dependencies = [
|
||||
name = "vectorcraft-engine"
|
||||
version = "0.19.0"
|
||||
dependencies = [
|
||||
"cfb",
|
||||
"craft-docpath",
|
||||
"crc32fast",
|
||||
"flate2",
|
||||
|
||||
+5
-1
@@ -9,7 +9,7 @@
|
||||
|
||||
**Stage: alpha** · next: beta, ~13 points (ready for real work ~62% → ~75%, and reliable `.ai` exchange) and ~170–270 h away
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Progress log row for the Document Tools add-on's New Symbols from Layers; headline numbers unchanged) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Progress log row for the Arrange Tools add-on's Sort Objects; headline numbers unchanged) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
|
||||
VectorCraft is a clean-room, open-source, pure-Rust reimplementation of the Adobe Illustrator workflow. It runs
|
||||
on macOS, Windows, Linux, FreeBSD and the web (WASM), and agents can drive all of it over MCP, the CLI and a JSON
|
||||
@@ -129,6 +129,8 @@ Ranked; detail in [docs/roadmap.md](docs/roadmap.md) and [docs/gaps.md](docs/gap
|
||||
|
||||
## Progress log
|
||||
|
||||
- 2026-11-01: Randomize Opacity joins the Arrange Tools add-on (Object › Plug-ins › Arrange Tools): each selected object gets its own opacity at random between a minimum and a maximum percent, with a seed that repeats the result, as one undo step (`addon.arrange.randomizeOpacity`, #4925).
|
||||
- 2026-11-01: Sort Objects joins the Arrange Tools add-on (Object › Plug-ins › Arrange Tools): the selected objects are sorted by width, height, area, position, opacity or stacking order (small to large, large to small or at random) and take another of those in that order, trading their values or stepping them evenly, as one undo step (`addon.arrange.sort`, #4917).
|
||||
- 2026-11-01: New Symbols from Layers joins the Document Tools add-on (Object › Plug-ins › Document Tools): one symbol of each top-level layer's art (the layers highlighted in the Layers panel when two or more are, else every layer), named after the layer, made as New Symbol makes one; Convert Layers to Symbols also puts an instance of each in place of its layer's art. Empty layers are skipped and reported; one undo step. A VectorCraft addition: headline numbers unchanged.
|
||||
- 2026-11-01: Document Tools, a built-in add-on (Object › Plug-ins › Document Tools), starts with Save a Timestamped Copy: a copy of the document named `<name>_YYYY-MM-DD_HH-MM` (UTC; `-2`, `-3`… when that name is taken) goes next to it, or into a folder picked for a document never saved, written as File › Save a Copy writes it, so the document keeps its path, title and modified state. Off on the web, which has no clock. A VectorCraft addition: headline numbers unchanged.
|
||||
- 2026-11-01: Divide into Dashes joins the Path Precision Tools add-on (Object › Plug-ins › Path Precision Tools): the selected paths, or only their direct-selected segments, are cut into separate open paths of a dash length measured along the curve, with an optional gap (left empty, or kept as pieces), each keeping the path's appearance; Fit to Corners and Ends stretches or squeezes the lengths so every run starts and ends on a dash. A dialog with Preview, one undo step, at most 100000 pieces. A VectorCraft addition: headline numbers unchanged.
|
||||
@@ -208,6 +210,8 @@ The full earlier record of what landed is kept in [docs/roadmap.md](docs/roadmap
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-11-01 | minor | Progress log row for the Arrange Tools add-on's Randomize Opacity (#4925); headline numbers unchanged. |
|
||||
| 2026-11-01 | minor | Progress log row for the Arrange Tools add-on's Sort Objects (#4917); headline numbers unchanged. |
|
||||
| 2026-11-01 | minor | Progress log row for the Document Tools add-on's New Symbols from Layers (#4927); headline numbers unchanged. |
|
||||
| 2026-11-01 | minor | Progress log row for the Document Tools add-on's Save a Timestamped Copy (#4926); headline numbers unchanged. |
|
||||
| 2026-11-01 | minor | Progress log row for Divide into Dashes (Path Precision Tools add-on, #4950); headline numbers unchanged. |
|
||||
|
||||
@@ -164,6 +164,14 @@ pub const LANGUAGES: &[(&str, &str, Quotes)] = &[
|
||||
("Polish", "pl", Quotes { double: ['„', '”'], single: ['‚', '’'] }),
|
||||
("Czech", "cs", Quotes { double: ['„', '“'], single: ['‚', '‘'] }),
|
||||
("Russian", "ru", Quotes { double: ['«', '»'], single: ['„', '“'] }),
|
||||
// „…” outside, ’…’ inside: Pravopis srpskoga jezika (Matica srpska, 2010, ISBN
|
||||
// 978-86-7946-079-0, т. 168, pp. 133–135) and CLDR
|
||||
// (https://github.com/unicode-org/cldr/blob/main/common/main/sr.xml, `delimiters`).
|
||||
("Serbian: Cyrillic", "sr-Cyrl", Quotes { double: ['„', '”'], single: ['’', '’'] }),
|
||||
("Serbian: Latin", "sr-Latn", Quotes { double: ['„', '”'], single: ['’', '’'] }),
|
||||
// „…“ outside, ‚…‘ inside: CLDR (https://github.com/unicode-org/cldr/blob/main/common/main/hr.xml,
|
||||
// `delimiters`).
|
||||
("Croatian", "hr", Quotes { double: ['„', '“'], single: ['‚', '‘'] }),
|
||||
("Turkish", "tr", Quotes { double: ['“', '”'], single: ['‘', '’'] }),
|
||||
("Japanese", "ja", Quotes { double: ['「', '」'], single: ['『', '』'] }),
|
||||
("Chinese", "zh", Quotes { double: ['“', '”'], single: ['‘', '’'] }),
|
||||
@@ -373,12 +381,19 @@ mod tests {
|
||||
(char_language_name(None), char_language_name(Some("gu")), char_language_name(Some("x-unknown"))),
|
||||
(Some("English: USA"), Some("Gujarati"), None)
|
||||
);
|
||||
// Serbian in either script, and Croatian.
|
||||
assert_eq!(char_language("Serbian: Cyrillic"), Ok(Some("sr-Cyrl")));
|
||||
assert_eq!(char_language("sr-latn"), Ok(Some("sr-Latn")));
|
||||
assert_eq!(char_language("Croatian"), Ok(Some("hr")));
|
||||
assert_eq!(char_language_name(Some("sr-Cyrl")), Some("Serbian: Cyrillic"));
|
||||
// Every entry has a tag of its own, and a name of its own.
|
||||
for (i, (n, t, _)) in LANGUAGES.iter().enumerate() {
|
||||
assert!(LANGUAGES.iter().skip(i + 1).all(|(n2, t2, _)| n2 != n && t2 != t), "{n} {t}");
|
||||
}
|
||||
}
|
||||
|
||||
/// Straight quotes become the language's: opening or closing by what comes before, inner
|
||||
/// quotes as single ones, and the context carried across pieces converted apart.
|
||||
#[test]
|
||||
fn quotes_open_and_close_by_context() {
|
||||
let mut prev = None;
|
||||
@@ -387,6 +402,13 @@ mod tests {
|
||||
let mut prev = Some('(');
|
||||
assert_eq!(german.apply("\"a\"", &mut prev), "„a“");
|
||||
assert_eq!(prev, Some('“'));
|
||||
// Serbian closes high (”), with ’ on both sides of an inner quote; Croatian as German.
|
||||
for name in ["Serbian: Cyrillic", "Serbian: Latin"] {
|
||||
let mut prev = None;
|
||||
assert_eq!(language_quotes(name).unwrap().apply("\"a 'b' c\"", &mut prev), "„a ’b’ c”", "{name}");
|
||||
}
|
||||
let mut prev = None;
|
||||
assert_eq!(language_quotes("croatian").unwrap().apply("\"a 'b' c\"", &mut prev), "„a ‚b‘ c“");
|
||||
// Converting in pieces keeps the context.
|
||||
let mut prev = None;
|
||||
let a = Quotes::ENGLISH.apply("\"", &mut prev);
|
||||
|
||||
@@ -40,6 +40,8 @@ hayro-jpeg2000 = { version = "=0.3.5", default-features = false, features = ["st
|
||||
flate2 = { workspace = true }
|
||||
# The XML parts of Word documents placed as type (place/docx.rs).
|
||||
roxmltree = "0.21"
|
||||
# The compound file that holds a Word 97-2003 document placed as type (place/doc.rs).
|
||||
cfb = "0.15"
|
||||
kurbo = { workspace = true }
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
|
||||
@@ -3,23 +3,28 @@
|
||||
//! Replace with Top Object puts a copy of the topmost selected object in place of each of the
|
||||
//! others; and Set Size of Each gives every selected object an exact width and height. Places and
|
||||
//! sizes are measured and set as `object.setBounds` does. Group Overlapping Objects groups the
|
||||
//! objects whose visual bounds overlap. Its submenu (Object › Plug-ins › Arrange
|
||||
//! Tools), its dialogs and Zoom to Selection (a view command) are the UI's.
|
||||
//! objects whose visual bounds overlap, Randomize Opacity gives each selected object a random
|
||||
//! opacity, and Sort Objects sorts the selected objects by one attribute and gives them another in
|
||||
//! that order. Its submenu (Object › Plug-ins › Arrange Tools), its dialogs and Zoom to Selection
|
||||
//! (a view command) are the UI's.
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::sync::Arc;
|
||||
|
||||
use serde_json::{Value, json};
|
||||
use vectorcraft_color::recolor::Rng;
|
||||
use vectorcraft_doc::{Node, NodeId, OrientedBox};
|
||||
use vectorcraft_geom::{Affine, Point, Rect};
|
||||
use vectorcraft_render::effects;
|
||||
|
||||
use super::super::edit::selected_roots;
|
||||
use super::super::menucmds::whole_or;
|
||||
use super::super::object::{choice, object_bounds_transform, scaling, transform_node, transform_patterns};
|
||||
use super::super::typecmd::refresh_bounds_of;
|
||||
use super::super::{CommandSpec, bad, cmd, has_doc, has_multi, has_selection, number_or, switch_or};
|
||||
use super::super::{CommandSpec, bad, checked_ids_or_selection, cmd, has_doc, has_multi, has_selection, number_or, switch_or};
|
||||
use crate::{EngineError, Result, Session};
|
||||
|
||||
/// The largest gap, width or height (pt) the commands take.
|
||||
@@ -28,8 +33,10 @@ const LIMIT: f64 = 1e6;
|
||||
const LEAST: f64 = 0.001;
|
||||
/// The most columns Arrange in Grid takes.
|
||||
const MAX_COLUMNS: u64 = 10_000;
|
||||
/// The most objects Group Overlapping Objects looks at.
|
||||
/// The most objects Group Overlapping Objects and Sort Objects look at.
|
||||
const MAX_OBJECTS: usize = 20_000;
|
||||
/// The attributes Sort Objects sorts by and gives (`addon.arrange.sort`).
|
||||
pub const SORT_KEYS: [&str; 7] = ["width", "height", "area", "x", "y", "opacity", "stacking"];
|
||||
|
||||
pub fn specs() -> Vec<CommandSpec> {
|
||||
vec![
|
||||
@@ -78,6 +85,24 @@ pub fn specs() -> Vec<CommandSpec> {
|
||||
has_multi,
|
||||
group_overlapping
|
||||
),
|
||||
cmd!(
|
||||
"addon.arrange.randomizeOpacity",
|
||||
"Randomize Opacity",
|
||||
["Object", "Plug-ins", "Arrange Tools"],
|
||||
None,
|
||||
"{min?: % 0..100 (30), max?: % 0..100 (100; not less than min), seed?: whole number (0; the same seed, objects and range give the same opacities), ids?: [id…] (default: the selection)} give each selected object (the top-level ones) its own opacity, picked at random and evenly from min to max, as one undo step; it is the object's opacity, as the Transparency panel sets it → {count}",
|
||||
has_selection,
|
||||
randomize_opacity
|
||||
),
|
||||
cmd!(
|
||||
"addon.arrange.sort",
|
||||
"Sort Objects",
|
||||
["Object", "Plug-ins", "Arrange Tools"],
|
||||
None,
|
||||
"{by?: \"width\" | \"height\" | \"area\" (width × height) | \"x\" (left edge) | \"y\" (top edge) | \"opacity\" (%) | \"stacking\" (stacking order, from the back) (\"area\"), apply?: one of the same (\"stacking\"), order?: \"ascending\" (small to large) | \"descending\" (large to small) | \"random\" (\"ascending\"), distribute?: false (true: the values step evenly from the smallest to the largest; false: the objects trade the values they have), seed?: whole number (0; the order \"random\" picks), scaleStrokes?: the Scale Strokes & Effects preference (width, height and area), ids?: [id…] (default: the selection)} sort the selected objects (the top-level ones, at most 20000) by the attribute `by` and give them the values of `apply` in that order, as one undo step: the first in order gets the smallest value. Sizes and places are measured and set as object.setBounds measures them (Use Preview Bounds), a width, height or area about each object's centre (an area in proportion); stacking order always trades places, and only among the objects in the same layer or group. A run that changes nothing makes no step → {count}",
|
||||
has_multi,
|
||||
sort
|
||||
),
|
||||
]
|
||||
}
|
||||
|
||||
@@ -356,3 +381,155 @@ fn group_overlapping(s: &mut Session, _: &Value) -> Result<Value> {
|
||||
})?;
|
||||
Ok(json!({ "groups": groups.iter().map(|i| i.0).collect::<Vec<_>>(), "grouped": grouped.len() }))
|
||||
}
|
||||
|
||||
fn randomize_opacity(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
const C: &str = "addon.arrange.randomizeOpacity";
|
||||
let min = number_in(p, "min", 30.0, (0.0, 100.0), C)?;
|
||||
let max = number_in(p, "max", 100.0, (0.0, 100.0), C)?;
|
||||
if min > max {
|
||||
return Err(bad(C, "`min` is greater than `max`"));
|
||||
}
|
||||
let mut rng = Rng::new(whole_or(p, "seed", 0, C)?);
|
||||
let ids = checked_ids_or_selection(s, p, C)?;
|
||||
if ids.is_empty() {
|
||||
return Ok(json!({ "count": 0 }));
|
||||
}
|
||||
let (lo, hi) = ((min / 100.0) as f32, (max / 100.0) as f32);
|
||||
s.edit("Randomize Opacity", |d, _| {
|
||||
for id in &ids {
|
||||
let o = rng.range(lo, hi);
|
||||
if let Some(n) = d.node_mut(*id) {
|
||||
n.opacity = o;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
Ok(json!({ "count": ids.len() }))
|
||||
}
|
||||
|
||||
/// An object Sort Objects sorts: its layer or group, its place in it, its box as
|
||||
/// `object.setBounds` measures it and its opacity (%).
|
||||
struct Sorted {
|
||||
id: NodeId,
|
||||
parent: Option<NodeId>,
|
||||
slot: usize,
|
||||
b: OrientedBox,
|
||||
opacity: f64,
|
||||
}
|
||||
|
||||
/// Attribute `key` (one of [`SORT_KEYS`]) of `o`, the `i`th of the objects in stacking order.
|
||||
fn attribute(key: &str, o: &Sorted, i: usize) -> f64 {
|
||||
let r = o.b.rect;
|
||||
// The top-left corner where `object.setBounds` places it (reference point 0).
|
||||
let corner = o.b.to_doc() * Point::new(r.x0, r.y0);
|
||||
match key {
|
||||
"width" => r.width(),
|
||||
"height" => r.height(),
|
||||
"area" => r.width() * r.height(),
|
||||
"x" => corner.x,
|
||||
"y" => corner.y,
|
||||
"opacity" => o.opacity,
|
||||
_ => i as f64,
|
||||
}
|
||||
}
|
||||
|
||||
fn sort(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
const C: &str = "addon.arrange.sort";
|
||||
let by = choice(p, C, "by", &SORT_KEYS)?.unwrap_or("area");
|
||||
let apply = choice(p, C, "apply", &SORT_KEYS)?.unwrap_or("stacking");
|
||||
let order = choice(p, C, "order", &["ascending", "descending", "random"])?.unwrap_or("ascending");
|
||||
let distribute = switch_or(p, "distribute", false, C)?;
|
||||
let mut rng = Rng::new(whole_or(p, "seed", 0, C)?);
|
||||
let strokes = switch_or(p, "scaleStrokes", s.prefs.scale_strokes, C)?;
|
||||
let ids = checked_ids_or_selection(s, p, C)?;
|
||||
if ids.len() > MAX_OBJECTS {
|
||||
return Err(bad(C, "too many objects selected (at most 20000)"));
|
||||
}
|
||||
let d = &s.doc()?.doc;
|
||||
// The objects in stacking order, from the back (their index paths, found in one walk).
|
||||
let paths = d.index_paths(ids.iter().copied());
|
||||
let mut placed: Vec<(&Vec<usize>, NodeId)> = ids.iter().filter_map(|id| Some((paths.get(id)?, *id))).collect();
|
||||
placed.sort_by(|a, b| a.0.cmp(b.0));
|
||||
let items: Vec<Sorted> = placed
|
||||
.into_iter()
|
||||
.filter_map(|(path, id)| {
|
||||
let (&slot, up) = path.split_last()?;
|
||||
let parent = if up.is_empty() { None } else { Some(d.node_at(up)?.id) };
|
||||
Some(Sorted { id, parent, slot, b: s.transform_box(&[id])?, opacity: f64::from(d.node(id)?.opacity) * 100.0 })
|
||||
})
|
||||
.collect();
|
||||
let keys: Vec<f64> = items.iter().enumerate().map(|(i, o)| attribute(by, o, i)).collect();
|
||||
// The objects in sorted order; equal keys keep their stacking order.
|
||||
let mut rank: Vec<usize> = (0..items.len()).collect();
|
||||
match order {
|
||||
"random" => rng.shuffle(&mut rank),
|
||||
"descending" => rank.sort_by(|a, b| keys[*b].total_cmp(&keys[*a])),
|
||||
_ => rank.sort_by(|a, b| keys[*a].total_cmp(&keys[*b])),
|
||||
}
|
||||
let count = json!({ "count": items.len() });
|
||||
if apply == "stacking" {
|
||||
// Each layer or group's objects take its objects' places, from the back, in sorted order.
|
||||
let mut groups: HashMap<Option<NodeId>, Vec<usize>> = HashMap::new();
|
||||
for o in rank.iter().filter_map(|i| items.get(*i)) {
|
||||
groups.entry(o.parent).or_default().push(o.slot);
|
||||
}
|
||||
if groups.values().all(|slots| slots.is_sorted()) {
|
||||
return Ok(count);
|
||||
}
|
||||
s.edit("Sort Objects", |d, _| {
|
||||
for (parent, from) in groups {
|
||||
let ch = d.children_mut(parent)?;
|
||||
let nodes: Vec<Arc<Node>> = from.iter().filter_map(|i| ch.get(*i).cloned()).collect();
|
||||
let mut to = from;
|
||||
to.sort_unstable();
|
||||
for (slot, n) in to.into_iter().zip(nodes) {
|
||||
if let Some(c) = ch.get_mut(slot) {
|
||||
*c = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
return Ok(count);
|
||||
}
|
||||
// The values the objects get, smallest first: theirs, or evenly from the smallest to the largest.
|
||||
let mut values: Vec<f64> = items.iter().enumerate().map(|(i, o)| attribute(apply, o, i)).collect();
|
||||
values.sort_by(f64::total_cmp);
|
||||
if let (true, Some(&lo), Some(&hi)) = (distribute && values.len() > 1, values.first(), values.last()) {
|
||||
let steps = (values.len() - 1) as f64;
|
||||
values = (0..values.len()).map(|j| lo + (hi - lo) * j as f64 / steps).collect();
|
||||
}
|
||||
let wanted: Vec<(&Sorted, f64)> = rank.iter().filter_map(|i| items.get(*i)).zip(values).collect();
|
||||
if apply == "opacity" {
|
||||
if wanted.iter().all(|(o, v)| (o.opacity - v).abs() < 1e-6) {
|
||||
return Ok(count);
|
||||
}
|
||||
s.edit("Sort Objects", |d, _| {
|
||||
for (o, v) in &wanted {
|
||||
if let Some(n) = d.node_mut(o.id) {
|
||||
n.opacity = (v / 100.0) as f32;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
return Ok(count);
|
||||
}
|
||||
let mut xfs = Vec::with_capacity(wanted.len());
|
||||
for (o, v) in wanted {
|
||||
let q = match apply {
|
||||
"x" => json!({ "x": v, "reference": 0 }),
|
||||
"y" => json!({ "y": v, "reference": 0 }),
|
||||
"width" => json!({ "width": v, "strokes": strokes }),
|
||||
"height" => json!({ "height": v, "strokes": strokes }),
|
||||
// An area: both sides in proportion; an object without one keeps its size.
|
||||
_ => {
|
||||
let (w, h) = (o.b.rect.width(), o.b.rect.height());
|
||||
let k = if w * h > 1e-12 { (v / (w * h)).sqrt() } else { 1.0 };
|
||||
json!({ "width": w * k, "height": h * k, "strokes": strokes })
|
||||
}
|
||||
};
|
||||
xfs.push((o.id, object_bounds_transform(s, &q, o.id)?));
|
||||
}
|
||||
transform_each(s, "Sort Objects", strokes, &xfs)?;
|
||||
Ok(count)
|
||||
}
|
||||
|
||||
@@ -256,7 +256,15 @@ fn off_without_a_selection() {
|
||||
let mut s = session();
|
||||
rect(&mut s, 0.0, 0.0, 20.0, 10.0);
|
||||
s.execute("select.none", &json!({})).unwrap();
|
||||
for c in ["addon.arrange.grid", "addon.arrange.swap", "addon.arrange.replace", "addon.arrange.size", "addon.arrange.groupOverlapping"] {
|
||||
for c in [
|
||||
"addon.arrange.grid",
|
||||
"addon.arrange.swap",
|
||||
"addon.arrange.replace",
|
||||
"addon.arrange.size",
|
||||
"addon.arrange.groupOverlapping",
|
||||
"addon.arrange.randomizeOpacity",
|
||||
"addon.arrange.sort",
|
||||
] {
|
||||
assert!(!enabled(&s, c), "{c}");
|
||||
}
|
||||
assert!(!enabled(&Session::new(), "addon.arrange.swap"));
|
||||
@@ -336,3 +344,221 @@ fn group_overlapping_is_off_with_one_object_and_scales_to_many() {
|
||||
assert_eq!(sets.len(), 2000);
|
||||
assert!(sets.iter().all(|s| s.len() == 2 && s[1] == s[0] + 1));
|
||||
}
|
||||
|
||||
fn opacity(s: &Session, id: NodeId) -> f32 {
|
||||
s.doc().unwrap().doc.node(id).unwrap().opacity
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn randomize_opacity_gives_each_object_its_own_opacity_within_the_range() {
|
||||
let mut s = session();
|
||||
let ids: Vec<NodeId> = (0..20).map(|i| rect(&mut s, i as f64 * 10.0, 0.0, 5.0, 5.0)).collect();
|
||||
select(&mut s, &ids);
|
||||
let n = steps(&s);
|
||||
let r = s.execute("addon.arrange.randomizeOpacity", &json!({"min": 30, "max": 60, "seed": 7})).unwrap();
|
||||
assert_eq!(r["count"], json!(20));
|
||||
assert_eq!(steps(&s), n + 1, "one undo step");
|
||||
let first: Vec<f32> = ids.iter().map(|id| opacity(&s, *id)).collect();
|
||||
assert!(first.iter().all(|o| (0.3..=0.6).contains(o)), "{first:?}");
|
||||
assert!(first.windows(2).any(|w| w[0] != w[1]), "each its own: {first:?}");
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
assert!(ids.iter().all(|id| opacity(&s, *id) == 1.0), "undone");
|
||||
// The same seed repeats them; another seed doesn't.
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({"min": 30, "max": 60, "seed": 7})).unwrap();
|
||||
assert_eq!(ids.iter().map(|id| opacity(&s, *id)).collect::<Vec<_>>(), first);
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({"min": 30, "max": 60, "seed": 8})).unwrap();
|
||||
assert_ne!(ids.iter().map(|id| opacity(&s, *id)).collect::<Vec<_>>(), first);
|
||||
// Defaults 30 to 100; min = max gives every object that opacity.
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({})).unwrap();
|
||||
assert!(ids.iter().all(|id| (0.3..=1.0).contains(&opacity(&s, *id))));
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({"min": 45, "max": 45})).unwrap();
|
||||
assert!(ids.iter().all(|id| opacity(&s, *id) == 0.45));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn randomize_opacity_takes_ids_and_leaves_the_rest() {
|
||||
let mut s = session();
|
||||
let a = rect(&mut s, 0.0, 0.0, 5.0, 5.0);
|
||||
let b = rect(&mut s, 10.0, 0.0, 5.0, 5.0);
|
||||
select(&mut s, &[a, b]);
|
||||
let g = NodeId(s.execute("object.group", &json!({})).unwrap()["id"].as_u64().unwrap());
|
||||
let c = rect(&mut s, 20.0, 0.0, 5.0, 5.0);
|
||||
s.execute("select.none", &json!({})).unwrap();
|
||||
assert!(!enabled(&s, "addon.arrange.randomizeOpacity"));
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({"ids": [c.0], "min": 10, "max": 10})).unwrap();
|
||||
assert_eq!((opacity(&s, a), opacity(&s, b), opacity(&s, c)), (1.0, 1.0, 0.1));
|
||||
// A group takes one opacity of its own; the objects inside keep theirs.
|
||||
select(&mut s, &[g]);
|
||||
s.execute("addon.arrange.randomizeOpacity", &json!({"min": 20, "max": 20})).unwrap();
|
||||
assert_eq!((opacity(&s, g), opacity(&s, a), opacity(&s, b)), (0.2, 1.0, 1.0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn randomize_opacity_refuses_bad_params() {
|
||||
let mut s = session();
|
||||
let a = rect(&mut s, 0.0, 0.0, 20.0, 10.0);
|
||||
select(&mut s, &[a]);
|
||||
refuses(
|
||||
&mut s,
|
||||
"addon.arrange.randomizeOpacity",
|
||||
&[
|
||||
json!({"min": -1}),
|
||||
json!({"max": 101}),
|
||||
json!({"min": 80, "max": 20}),
|
||||
json!({"min": 1e308}),
|
||||
json!({"max": "50"}),
|
||||
json!({"seed": -1}),
|
||||
json!({"seed": 1.5}),
|
||||
json!({"seed": "x"}),
|
||||
json!({"ids": [999_999]}),
|
||||
json!({"ids": "x"}),
|
||||
],
|
||||
);
|
||||
let e = s.execute("addon.arrange.randomizeOpacity", &json!({"min": 80, "max": 20})).unwrap_err().to_string();
|
||||
assert!(e.contains("`min` is greater than `max`"), "{e}");
|
||||
}
|
||||
|
||||
fn layer_order(s: &Session) -> Vec<NodeId> {
|
||||
s.doc().unwrap().doc.layers[0].children().unwrap().iter().map(|n| n.id).collect()
|
||||
}
|
||||
|
||||
/// Three squares: `a` 30 wide at x 0, `b` 10 wide at x 100, `c` 20 wide at x 200, all selected.
|
||||
fn squares(s: &mut Session) -> (NodeId, NodeId, NodeId) {
|
||||
let a = rect(s, 0.0, 0.0, 30.0, 30.0);
|
||||
let b = rect(s, 100.0, 0.0, 10.0, 10.0);
|
||||
let c = rect(s, 200.0, 0.0, 20.0, 20.0);
|
||||
select(s, &[a, b, c]);
|
||||
(a, b, c)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_by_area_lines_objects_up_along_x() {
|
||||
let mut s = session();
|
||||
let (a, b, c) = squares(&mut s);
|
||||
let n = steps(&s);
|
||||
let r = s.execute("addon.arrange.sort", &json!({"by": "area", "apply": "x"})).unwrap();
|
||||
assert_eq!(r["count"], json!(3));
|
||||
assert_eq!(steps(&s), n + 1, "one undo step");
|
||||
// Smallest first: b, c, a take the left edges 0, 100, 200; y stays.
|
||||
assert!(near(bounds(&s, b), (0.0, 0.0, 10.0, 10.0)), "{:?}", bounds(&s, b));
|
||||
assert!(near(bounds(&s, c), (100.0, 0.0, 20.0, 20.0)), "{:?}", bounds(&s, c));
|
||||
assert!(near(bounds(&s, a), (200.0, 0.0, 30.0, 30.0)), "{:?}", bounds(&s, a));
|
||||
// Large to small: a, c, b.
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
s.execute("addon.arrange.sort", &json!({"by": "area", "apply": "x", "order": "descending"})).unwrap();
|
||||
assert_eq!((bounds(&s, a).x0, bounds(&s, c).x0, bounds(&s, b).x0), (0.0, 100.0, 200.0));
|
||||
// Already in order: no step.
|
||||
let n = steps(&s);
|
||||
s.execute("addon.arrange.sort", &json!({"by": "area", "apply": "x", "order": "descending"})).unwrap();
|
||||
assert_eq!(steps(&s), n);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_distributes_values_evenly() {
|
||||
let mut s = session();
|
||||
let a = rect(&mut s, 0.0, 0.0, 10.0, 10.0);
|
||||
let b = rect(&mut s, 10.0, 50.0, 10.0, 50.0);
|
||||
let c = rect(&mut s, 200.0, 0.0, 10.0, 20.0);
|
||||
select(&mut s, &[a, b, c]);
|
||||
// Left edges 0, 10, 200 step evenly: 0, 100, 200.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "x", "apply": "x", "distribute": true})).unwrap();
|
||||
assert_eq!((bounds(&s, a).x0, bounds(&s, b).x0, bounds(&s, c).x0), (0.0, 100.0, 200.0));
|
||||
// Heights that step evenly with x (10 to 50), each about its centre.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "x", "apply": "height", "distribute": true})).unwrap();
|
||||
assert!(near(bounds(&s, a), (0.0, 0.0, 10.0, 10.0)), "{:?}", bounds(&s, a));
|
||||
assert!(near(bounds(&s, b), (100.0, 60.0, 10.0, 30.0)), "{:?}", bounds(&s, b));
|
||||
assert!(near(bounds(&s, c), (200.0, -15.0, 10.0, 50.0)), "{:?}", bounds(&s, c));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_restacks_within_each_layer() {
|
||||
let mut s = session();
|
||||
let (a, b, c) = squares(&mut s);
|
||||
// Largest at the back.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "area", "apply": "stacking", "order": "descending"})).unwrap();
|
||||
assert_eq!(layer_order(&s), [a, c, b]);
|
||||
s.execute("addon.arrange.sort", &json!({})).unwrap();
|
||||
assert_eq!(layer_order(&s), [b, c, a], "by area, small to large, into the stacking order by default");
|
||||
// An object in another layer keeps its layer; the others trade places among themselves.
|
||||
s.execute("layer.new", &json!({})).unwrap();
|
||||
let big = rect(&mut s, 0.0, 100.0, 50.0, 50.0);
|
||||
select(&mut s, &[a, b, c, big]);
|
||||
s.execute("addon.arrange.sort", &json!({"order": "descending"})).unwrap();
|
||||
assert_eq!(layer_order(&s), [a, c, b]);
|
||||
let doc = &s.doc().unwrap().doc;
|
||||
assert_ne!(doc.layer_of(big), doc.layer_of(a), "left in its own layer");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_by_stacking_and_opacity() {
|
||||
let mut s = session();
|
||||
let (a, b, c) = squares(&mut s);
|
||||
// Back to front a, b, c; reversed: c, b, a take the left edges 0, 100, 200.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "stacking", "apply": "x", "order": "descending"})).unwrap();
|
||||
assert_eq!((bounds(&s, c).x0, bounds(&s, b).x0, bounds(&s, a).x0), (0.0, 100.0, 200.0));
|
||||
for (id, o) in [(a, 20), (b, 80), (c, 50)] {
|
||||
s.execute("object.setProps", &json!({"ids": [id.0], "opacity": o})).unwrap();
|
||||
}
|
||||
select(&mut s, &[a, b, c]);
|
||||
let opacity = |s: &Session, id| s.doc().unwrap().doc.node(id).unwrap().opacity;
|
||||
// By x, large to small: a (x 200) gets the least opacity, then b, then c.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "x", "apply": "opacity", "order": "descending"})).unwrap();
|
||||
assert_eq!((opacity(&s, a), opacity(&s, b), opacity(&s, c)), (0.2, 0.5, 0.8));
|
||||
// By opacity into the stacking order, large to small: the most opaque at the back.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "opacity", "order": "descending"})).unwrap();
|
||||
assert_eq!(layer_order(&s), [c, b, a]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_by_area_into_areas_scales_in_proportion() {
|
||||
let mut s = session();
|
||||
let (a, b, c) = squares(&mut s);
|
||||
// Areas 900, 100, 400 by x: a (x 0) 100, b 500, c 900.
|
||||
s.execute("addon.arrange.sort", &json!({"by": "x", "apply": "area", "distribute": true})).unwrap();
|
||||
let side = |s: &Session, id| bounds(s, id).width();
|
||||
assert!((side(&s, a) - 10.0).abs() < 1e-6 && (side(&s, b) - 500f64.sqrt()).abs() < 1e-6 && (side(&s, c) - 30.0).abs() < 1e-6);
|
||||
assert!((bounds(&s, b).height() - 500f64.sqrt()).abs() < 1e-6, "in proportion");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_in_random_order_repeats_with_a_seed() {
|
||||
let mut s = session();
|
||||
let ids: Vec<NodeId> = (0..12).map(|i| rect(&mut s, i as f64 * 10.0, 0.0, 5.0, 5.0)).collect();
|
||||
select(&mut s, &ids);
|
||||
s.execute("addon.arrange.sort", &json!({"order": "random", "seed": 5})).unwrap();
|
||||
let first = layer_order(&s);
|
||||
assert_ne!(first, ids, "shuffled");
|
||||
let mut sorted = first.clone();
|
||||
sorted.sort_by_key(|i| i.0);
|
||||
assert_eq!(sorted, ids, "the same objects");
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
assert_eq!(layer_order(&s), ids);
|
||||
s.execute("addon.arrange.sort", &json!({"order": "random", "seed": 5})).unwrap();
|
||||
assert_eq!(layer_order(&s), first, "the same seed, the same order");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_takes_ids_and_refuses_bad_params() {
|
||||
let mut s = session();
|
||||
let (a, b, c) = squares(&mut s);
|
||||
select(&mut s, &[a]);
|
||||
assert!(!enabled(&s, "addon.arrange.sort"));
|
||||
s.execute("addon.arrange.sort", &json!({"ids": [b.0, a.0], "apply": "x"})).unwrap();
|
||||
assert_eq!((bounds(&s, b).x0, bounds(&s, a).x0, bounds(&s, c).x0), (0.0, 100.0, 200.0), "c is left alone");
|
||||
select(&mut s, &[a, b, c]);
|
||||
refuses(
|
||||
&mut s,
|
||||
"addon.arrange.sort",
|
||||
&[
|
||||
json!({"by": "color"}),
|
||||
json!({"apply": 3}),
|
||||
json!({"order": "up"}),
|
||||
json!({"distribute": "yes"}),
|
||||
json!({"seed": -1}),
|
||||
json!({"seed": 0.5}),
|
||||
json!({"scaleStrokes": 1}),
|
||||
json!({"ids": "x"}),
|
||||
json!({"ids": [999_999]}),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ use symbols::selected_instances;
|
||||
pub(crate) use symbols::{instance_in_place, natural_size, normalize, place_xf, set_natural_size, store_symbol};
|
||||
use symbols::{
|
||||
symbol_adjust, symbol_break_link, symbol_delete, symbol_duplicate, symbol_edit, symbol_list, symbol_new, symbol_options, symbol_place,
|
||||
symbol_replace, symbol_select_instances, symbol_set_current, symbol_spray, symbol_update,
|
||||
symbol_replace, symbol_select_instances, symbol_set_current, symbol_spray, symbol_unused, symbol_update,
|
||||
};
|
||||
|
||||
const SIZES_KEY: &str = vectorcraft_doc::SYMBOL_SIZES;
|
||||
@@ -228,7 +228,7 @@ pub fn specs() -> Vec<CommandSpec> {
|
||||
"Delete Symbol",
|
||||
[],
|
||||
None,
|
||||
"{name, expandInstances?: true} delete a symbol; its instances are expanded (or deleted with false)",
|
||||
"{name | names: [name…], expandInstances?: true} delete a symbol (or several, in one undo step); its instances are expanded (or deleted with false)",
|
||||
has_doc,
|
||||
symbol_delete
|
||||
),
|
||||
@@ -269,6 +269,15 @@ pub fn specs() -> Vec<CommandSpec> {
|
||||
has_doc,
|
||||
symbol_set_current
|
||||
),
|
||||
cmd!(
|
||||
query "symbol.unused",
|
||||
"Select All Unused",
|
||||
[],
|
||||
None,
|
||||
"{} → {names: [the symbols nothing places, in panel order]} (the Symbols panel selects them): instances in the art (opacity masks included), graph designs, pattern tiles (with the tiles that pattern editing's Cancel puts back) and brush art count, and so do instances in the art of a symbol that is used",
|
||||
has_doc,
|
||||
symbol_unused
|
||||
),
|
||||
cmd!(query "symbol.selectInstances", "Select All Instances", [], None, "{name} select every instance of a symbol → {count}", has_doc, symbol_select_instances),
|
||||
cmd!(
|
||||
"symbol.spray",
|
||||
|
||||
@@ -107,6 +107,37 @@ fn instances_of(d: &Document, name: Option<&str>) -> Vec<NodeId> {
|
||||
v
|
||||
}
|
||||
|
||||
/// The symbols an instance in `n` (its opacity masks included) places, pushed onto `out`.
|
||||
fn art_symbols(n: &Node, out: &mut Vec<String>) {
|
||||
vectorcraft_doc::swatches::walk_with_masks(n, &mut |m| {
|
||||
if let NodeKind::SymbolInstance { symbol, .. } = &m.kind {
|
||||
out.push(symbol.clone());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Select All Unused (#4918): the symbols nothing places. Instances in the art (opacity masks
|
||||
/// included), graph designs, pattern tiles and the tiles that pattern editing's Cancel puts back,
|
||||
/// and the art of the document's brushes count, and so do the instances in the art of every symbol
|
||||
/// a counted instance places. A symbol placed only inside an unused symbol is unused too.
|
||||
pub(super) fn symbol_unused(s: &mut Session, _: &Value) -> Result<Value> {
|
||||
let d = &s.doc()?.doc;
|
||||
let mut todo = vec![];
|
||||
let lib = brush::library(d);
|
||||
let patterns = d.patterns.iter().chain(d.pattern_edit.iter().filter_map(|pe| pe.original.as_ref()));
|
||||
let trees = d.layers.iter().map(|l| &**l).chain(d.graph_designs.iter().map(|g| &*g.art));
|
||||
trees.chain(patterns.flat_map(|p| p.art.iter().map(|n| &**n))).chain(lib.iter().flat_map(|b| b.art())).for_each(|n| art_symbols(n, &mut todo));
|
||||
let mut used = std::collections::BTreeSet::new();
|
||||
while let Some(name) = todo.pop() {
|
||||
if !used.contains(&name) {
|
||||
d.symbols.iter().filter(|sym| sym.name == name).for_each(|sym| art_symbols(&sym.art, &mut todo));
|
||||
used.insert(name);
|
||||
}
|
||||
}
|
||||
let names: Vec<&str> = d.symbols.iter().map(|sym| sym.name.as_str()).filter(|n| !used.contains(*n)).collect();
|
||||
Ok(json!({ "names": names }))
|
||||
}
|
||||
|
||||
fn symbol_names(d: &Document) -> Vec<String> {
|
||||
d.symbols.iter().map(|s| s.name.clone()).collect()
|
||||
}
|
||||
@@ -417,27 +448,74 @@ pub(super) fn symbol_update(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
Ok(json!({ "name": name, "id": id.0 }))
|
||||
}
|
||||
|
||||
/// How many levels of nested instances Delete Symbol expands before it gives up.
|
||||
const MAX_DELETE_ROUNDS: usize = 256;
|
||||
|
||||
pub(super) fn symbol_delete(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
const C: &str = "symbol.delete";
|
||||
let name = name_param(p, C)?.to_string();
|
||||
if !s.doc()?.doc.symbols.iter().any(|x| x.name == name) {
|
||||
// `names` deletes several symbols in one undo step (the Symbols panel's Select All Unused, #4918).
|
||||
let names: Vec<String> = match p.get("names") {
|
||||
Some(v) => {
|
||||
let a = v.as_array().ok_or_else(|| bad(C, "names must be an array of symbol names"))?;
|
||||
let mut names = Vec::with_capacity(a.len());
|
||||
for n in a {
|
||||
let n = n.as_str().ok_or_else(|| bad(C, "names must be an array of symbol names"))?;
|
||||
if !names.iter().any(|x: &String| x == n) {
|
||||
names.push(n.to_string());
|
||||
}
|
||||
}
|
||||
if names.is_empty() {
|
||||
return Err(bad(C, "names is empty"));
|
||||
}
|
||||
names
|
||||
}
|
||||
None => vec![name_param(p, C)?.to_string()],
|
||||
};
|
||||
let d = &s.doc()?.doc;
|
||||
if let Some(name) = names.iter().find(|n| !d.symbols.iter().any(|x| &x.name == *n)) {
|
||||
return Err(bad(C, format!("no symbol named `{name}`")));
|
||||
}
|
||||
let expand = switch_or(p, "expandInstances", true, C)?;
|
||||
s.edit("Delete Symbol", |d, _| {
|
||||
let inst = instances_of(d, Some(&name));
|
||||
if expand {
|
||||
break_links(d, &inst, true)?;
|
||||
} else {
|
||||
remove_each(d, &inst)?;
|
||||
let label = if names.len() == 1 { "Delete Symbol" } else { "Delete Symbols" };
|
||||
s.edit(label, |d, _| {
|
||||
// Every instance goes before any definition, whatever the order of `names`: expanding an
|
||||
// instance of one symbol can bring out instances of another being deleted (nested in its
|
||||
// art), which expand in turn while their definitions are still there. Each round expands
|
||||
// one level of nesting, so the rounds are capped.
|
||||
let of_names = |d: &Document| {
|
||||
let mut v = vec![];
|
||||
d.walk(|n| {
|
||||
if let NodeKind::SymbolInstance { symbol, .. } = &n.kind
|
||||
&& names.contains(symbol)
|
||||
{
|
||||
v.push(n.id);
|
||||
}
|
||||
});
|
||||
v
|
||||
};
|
||||
for _ in 0..=MAX_DELETE_ROUNDS {
|
||||
let inst = of_names(d);
|
||||
if inst.is_empty() {
|
||||
break;
|
||||
}
|
||||
if expand {
|
||||
break_links(d, &inst, true)?;
|
||||
} else {
|
||||
remove_each(d, &inst)?;
|
||||
}
|
||||
}
|
||||
d.symbols.retain(|x| x.name != name);
|
||||
set_natural_size(d, &name, None);
|
||||
d.set_symbol_registration(&name, SymbolRegistration::CENTER);
|
||||
d.clear_symbol_export_type(&name);
|
||||
d.set_symbol_nine_slice(&name, None);
|
||||
if d.unknown.get(CURRENT_SYMBOL).and_then(Value::as_str) == Some(name.as_str()) {
|
||||
d.unknown.remove(CURRENT_SYMBOL);
|
||||
if !of_names(d).is_empty() {
|
||||
return Err(EngineError::Other("the symbols are nested too deeply to expand their instances".into()));
|
||||
}
|
||||
for name in &names {
|
||||
d.symbols.retain(|x| &x.name != name);
|
||||
set_natural_size(d, name, None);
|
||||
d.set_symbol_registration(name, SymbolRegistration::CENTER);
|
||||
d.clear_symbol_export_type(name);
|
||||
d.set_symbol_nine_slice(name, None);
|
||||
if d.unknown.get(CURRENT_SYMBOL).and_then(Value::as_str) == Some(name.as_str()) {
|
||||
d.unknown.remove(CURRENT_SYMBOL);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
|
||||
@@ -124,8 +124,9 @@ pub(crate) use export_names::{default_name, merge, unique_file_names, with_black
|
||||
use export_names::{distinct_names, write_encoded};
|
||||
use formats::{ARTBOARD, ARTBOARDS, RANGE, USE_ARTBOARDS, writable};
|
||||
pub use formats::{
|
||||
DOCX_EXTS, FORMATS, Format, FormatOption, OPEN_EXTS, PLACE_EXTS, RTF_EXTS, TEXT_EXTS, UNASSOCIATED_EXTS, export_extensions, extension, file_stem,
|
||||
format, format_for_name, has_own_title, library_open_filters, open_filters, place_filters, plugin_formats, titled_for_export, writable_format,
|
||||
DOC_EXTS, DOCX_EXTS, FORMATS, Format, FormatOption, OPEN_EXTS, PLACE_EXTS, RTF_EXTS, TEXT_EXTS, UNASSOCIATED_EXTS, export_extensions, extension,
|
||||
file_stem, format, format_for_name, has_own_title, library_open_filters, open_filters, place_filters, plugin_formats, titled_for_export,
|
||||
writable_format,
|
||||
};
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -566,8 +566,14 @@ pub const RTF_EXTS: &[&str] = &["rtf"];
|
||||
/// Word documents: File → Place sets them as area type with their formatting.
|
||||
pub const DOCX_EXTS: &[&str] = &["docx"];
|
||||
|
||||
/// Every extension File → Place reads: [`OPEN_EXTS`], [`TEXT_EXTS`], [`RTF_EXTS`] and
|
||||
/// [`DOCX_EXTS`].
|
||||
/// Word 97-2003 documents: File → Place sets them as area type with their formatting.
|
||||
pub const DOC_EXTS: &[&str] = &["doc"];
|
||||
|
||||
/// The Place dialog's Word filter: Word documents and Word 97-2003 documents.
|
||||
const WORD_EXTS: &[&str] = &["docx", "doc"];
|
||||
|
||||
/// Every extension File → Place reads: [`OPEN_EXTS`], [`TEXT_EXTS`], [`RTF_EXTS`],
|
||||
/// [`DOCX_EXTS`] and [`DOC_EXTS`].
|
||||
pub const PLACE_EXTS: &[&str] = &[
|
||||
"vectorcraft",
|
||||
"drawcraft",
|
||||
@@ -610,6 +616,7 @@ pub const PLACE_EXTS: &[&str] = &[
|
||||
"txt",
|
||||
"rtf",
|
||||
"docx",
|
||||
"doc",
|
||||
];
|
||||
|
||||
/// One dialog filter per readable format.
|
||||
@@ -645,13 +652,13 @@ pub fn library_open_filters(
|
||||
}
|
||||
|
||||
/// File → Place dialog filters: "All placeable files", then one per placeable format, then text,
|
||||
/// RTF and Word.
|
||||
/// RTF and Word (`.docx` and `.doc`).
|
||||
pub fn place_filters() -> impl Iterator<Item = (&'static str, &'static [&'static str])> {
|
||||
std::iter::once(("All placeable files", PLACE_EXTS))
|
||||
.chain(format_filters().filter(|(_, exts)| exts.iter().all(|ext| PLACE_EXTS.contains(ext))))
|
||||
.chain(std::iter::once(("Text", TEXT_EXTS)))
|
||||
.chain(std::iter::once(("RTF", RTF_EXTS)))
|
||||
.chain(std::iter::once(("Word", DOCX_EXTS)))
|
||||
.chain(std::iter::once(("Word", WORD_EXTS)))
|
||||
}
|
||||
|
||||
/// A format by id or extension (any case, leading dot allowed; `jpeg` finds `jpg`): a built-in
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
//! - An RTF file becomes area type with its character and paragraph formatting ([`rtf`]).
|
||||
//! - A Word document (`.docx`) becomes area type with the character and paragraph formatting its
|
||||
//! styles and direct formatting give ([`docx`]).
|
||||
//! - A Word 97-2003 document (`.doc`) becomes area type the same way, its main text read from its
|
||||
//! compound file, with a warning for each kind of content left out ([`doc`]).
|
||||
//! - A VectorCraft document placed from a file with Link (the default) becomes a placed document:
|
||||
//! one locked object showing the artboard `page`, linked to the file and read again when it
|
||||
//! changes ([`document`]); without Link, an editable copy of its art.
|
||||
@@ -30,6 +32,7 @@
|
||||
//! `place` tool) with several files, which emits one `file.place` per click or drag.
|
||||
|
||||
pub(crate) mod adopt;
|
||||
mod doc;
|
||||
pub(crate) mod document;
|
||||
pub(crate) mod docx;
|
||||
mod rtf;
|
||||
@@ -169,6 +172,15 @@ fn load(p: &Value, cmd: &str, board: Option<Rect>, link_pdf: bool) -> Result<Loa
|
||||
}
|
||||
return Ok(Loaded { name, format: &docx::FORMAT, art: Art::Text(story), natural: TEXT_FRAME, warnings: vec![], link: None, board: None });
|
||||
}
|
||||
// A Word 97-2003 document is recognized by its name or by its compound file's WordDocument
|
||||
// stream.
|
||||
if doc::is_doc(src.name, &src.bytes) {
|
||||
let (story, warnings) = doc::import(&src.bytes, cmd)?;
|
||||
if story.plain_text().trim().is_empty() {
|
||||
return Err(bad(cmd, format!("`{name}` has no text to place")));
|
||||
}
|
||||
return Ok(Loaded { name, format: &doc::FORMAT, art: Art::Text(story), natural: TEXT_FRAME, warnings, link: None, board: None });
|
||||
}
|
||||
let format = fileio::detect(src.name, &src.bytes)
|
||||
.ok_or_else(|| bad(cmd, format!("can't place `{name}`: not a format VectorCraft reads (see document.formats)")))?;
|
||||
let page = match p.get("page") {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1432,3 +1432,72 @@ fn symbol_nine_slice_guides_round_trip() {
|
||||
s.execute("symbol.delete", &json!({"name": "Box copy"})).unwrap();
|
||||
assert!(s.doc().unwrap().doc.unknown.get(vectorcraft_doc::SYMBOL_NINE_SLICE).is_none());
|
||||
}
|
||||
|
||||
/// Symbols panel › Select All Unused (#4918): a symbol counts as used when an instance in the art,
|
||||
/// a pattern tile, the art of a brush or a used symbol places it; one placed only inside an unused
|
||||
/// symbol is unused too. Delete Symbol with `names` deletes several in one undo step.
|
||||
#[test]
|
||||
fn symbol_unused_lists_the_symbols_nothing_places_and_delete_takes_several() {
|
||||
let mut s = session();
|
||||
// A symbol of the selection (a new square at `x` when `x` is given), left placed.
|
||||
let symbol = |s: &mut Session, name: &str, x: Option<f64>| {
|
||||
if let Some(x) = x {
|
||||
rect(s, x, 0.0, 10.0, 10.0);
|
||||
}
|
||||
NodeId(s.execute("symbol.new", &json!({"name": name})).unwrap()["id"].as_u64().unwrap())
|
||||
};
|
||||
let unused =
|
||||
|s: &mut Session| -> Vec<String> { serde_json::from_value(s.execute("symbol.unused", &json!({})).unwrap()["names"].clone()).unwrap() };
|
||||
// Placed: its instance stays on the artboard.
|
||||
symbol(&mut s, "Placed", Some(0.0));
|
||||
// Inner is placed only inside Outer, whose instance stays: both are used.
|
||||
let inner = symbol(&mut s, "Inner", Some(20.0));
|
||||
s.execute("select.set", &json!({"ids": [inner.0]})).unwrap();
|
||||
symbol(&mut s, "Outer", None);
|
||||
// Lonely's and Nested's instances go; Nested is placed only inside Lonely.
|
||||
let nested = symbol(&mut s, "Nested", Some(40.0));
|
||||
s.execute("select.set", &json!({"ids": [nested.0]})).unwrap();
|
||||
let lonely = symbol(&mut s, "Lonely", None);
|
||||
s.execute("edit.clear", &json!({"ids": [lonely.0]})).unwrap();
|
||||
// In a brush's art only.
|
||||
let in_brush = symbol(&mut s, "Brushed", Some(60.0));
|
||||
s.execute("brush.new", &json!({"type": "art", "name": "B", "ids": [in_brush.0]})).unwrap();
|
||||
s.execute("edit.clear", &json!({"ids": [in_brush.0]})).unwrap();
|
||||
assert_eq!(unused(&mut s), ["Nested", "Lonely"], "in panel order");
|
||||
// A placed one becomes unused when its last instance goes.
|
||||
let placed = s.doc().unwrap().doc.layers[0]
|
||||
.children()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.find(|n| matches!(&n.kind, NodeKind::SymbolInstance { symbol, .. } if symbol == "Placed"))
|
||||
.unwrap()
|
||||
.id;
|
||||
s.execute("edit.clear", &json!({"ids": [placed.0]})).unwrap();
|
||||
assert_eq!(unused(&mut s), ["Placed", "Nested", "Lonely"]);
|
||||
// Delete Symbol takes them all in one undo step, and Undo brings them back.
|
||||
let before = s.doc().unwrap().history.undo.len();
|
||||
s.execute("symbol.delete", &json!({"names": ["Placed", "Nested", "Lonely"]})).unwrap();
|
||||
let names = |s: &Session| s.doc().unwrap().doc.symbols.iter().map(|x| x.name.clone()).collect::<Vec<_>>();
|
||||
assert_eq!(names(&s), ["Inner", "Outer", "Brushed"]);
|
||||
assert_eq!(s.doc().unwrap().history.undo.len(), before + 1);
|
||||
assert!(unused(&mut s).is_empty());
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
assert_eq!(names(&s), ["Placed", "Inner", "Outer", "Nested", "Lonely", "Brushed"]);
|
||||
// Deleting a symbol and the one placed inside it, in either order, expands every instance
|
||||
// while both definitions are still there: no instance is left without its symbol.
|
||||
for order in [["Inner", "Outer"], ["Outer", "Inner"]] {
|
||||
s.execute("symbol.delete", &json!({"names": order})).unwrap();
|
||||
let mut dangling = 0;
|
||||
s.doc()
|
||||
.unwrap()
|
||||
.doc
|
||||
.walk(|n| dangling += usize::from(matches!(&n.kind, NodeKind::SymbolInstance { symbol, .. } if symbol == "Inner" || symbol == "Outer")));
|
||||
assert_eq!(dangling, 0, "{order:?}");
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
}
|
||||
// Bad `names` are refused and change nothing.
|
||||
for bad in [json!({"names": []}), json!({"names": "Placed"}), json!({"names": [1]}), json!({"names": ["Placed", "Nope"]})] {
|
||||
assert!(s.execute("symbol.delete", &bad).is_err(), "{bad}");
|
||||
}
|
||||
assert_eq!(names(&s).len(), 6);
|
||||
}
|
||||
|
||||
@@ -467,15 +467,389 @@ fn malformed_docx_fails_cleanly() {
|
||||
assert_eq!(s.doc().unwrap().history.undo.len(), 2, "failed places leave no undo step");
|
||||
}
|
||||
|
||||
/// The bytes of the Prls `prls`: each sprm and its operand.
|
||||
fn prls(prls: &[(u16, &[u8])]) -> Vec<u8> {
|
||||
prls.iter().flat_map(|(sprm, op)| sprm.to_le_bytes().into_iter().chain(op.iter().copied())).collect()
|
||||
}
|
||||
|
||||
/// A style of a [`Word97`] document: its kind (1 paragraph, 2 character), the style it is based
|
||||
/// on, and its paragraph and character properties.
|
||||
type Word97Style = (u16, u16, Vec<u8>, Vec<u8>);
|
||||
|
||||
/// A Word 97-2003 document, built as \[MS-DOC\] lays one out: a file information block, the main
|
||||
/// text's pieces stored last first, one property page per run of up to 16 character or paragraph
|
||||
/// property runs, the piece table, style sheet and font table in the table stream, all in a
|
||||
/// compound file.
|
||||
#[derive(Default)]
|
||||
struct Word97 {
|
||||
/// The main text's pieces: their text and whether it is stored compressed.
|
||||
pieces: Vec<(&'static str, bool)>,
|
||||
/// Character properties of characters `start..end`.
|
||||
chpx: Vec<(u32, u32, Vec<u8>)>,
|
||||
/// The paragraph style and properties of the paragraph whose mark is character `cp`; a
|
||||
/// character's paragraph is the first one whose mark is at or after it.
|
||||
papx: Vec<(u32, u16, Vec<u8>)>,
|
||||
/// The styles by istd; None: an empty slot.
|
||||
styles: Vec<Option<Word97Style>>,
|
||||
fonts: Vec<&'static str>,
|
||||
/// FibBase's flags and `nFib` (0: 0x00C1).
|
||||
flags: u16,
|
||||
nfib: u16,
|
||||
/// The table stream is `0Table` (else `1Table`).
|
||||
zero_table: bool,
|
||||
/// `ccpFtn`, `ccpHdd`, `ccpAtn`, `ccpEdn`, `ccpTxbx` and `ccpHdrTxbx`.
|
||||
stories: [u32; 6],
|
||||
/// Characters `ccpText` gives beyond the pieces.
|
||||
ccp_extra: u32,
|
||||
/// A Clx to write instead of the pieces'.
|
||||
clx: Option<Vec<u8>>,
|
||||
}
|
||||
|
||||
/// One 512-byte property page of `runs` (file positions and properties), written to `wd`; its
|
||||
/// page number.
|
||||
fn property_page(runs: &[(u32, u32, Vec<u8>)], papx: bool, wd: &mut Vec<u8>) -> u32 {
|
||||
let mut page = [0u8; 512];
|
||||
let n = runs.len();
|
||||
for (i, r) in runs.iter().enumerate() {
|
||||
page[4 * i..4 * i + 4].copy_from_slice(&r.0.to_le_bytes());
|
||||
}
|
||||
page[4 * n..4 * n + 4].copy_from_slice(&runs[n - 1].1.to_le_bytes());
|
||||
let mut top = 511;
|
||||
for (i, (_, _, props)) in runs.iter().enumerate() {
|
||||
let blob = match (papx, props.len() % 2) {
|
||||
(false, _) if props.is_empty() => continue,
|
||||
(false, _) => [vec![props.len() as u8], props.clone()].concat(),
|
||||
// PapxInFkp: cb with 2 × cb − 1 bytes, or 0 and cb′ with 2 × cb′ bytes.
|
||||
(true, 1) => [vec![props.len().div_ceil(2) as u8], props.clone()].concat(),
|
||||
(true, _) => [vec![0, (props.len() / 2) as u8], props.clone()].concat(),
|
||||
};
|
||||
top = (top - blob.len()) & !1;
|
||||
page[top..top + blob.len()].copy_from_slice(&blob);
|
||||
page[4 * (n + 1) + if papx { 13 * i } else { i }] = (top / 2) as u8;
|
||||
}
|
||||
page[511] = n as u8;
|
||||
wd.resize(wd.len().div_ceil(512) * 512, 0);
|
||||
let pn = (wd.len() / 512) as u32;
|
||||
wd.extend(page);
|
||||
pn
|
||||
}
|
||||
|
||||
impl Word97 {
|
||||
fn build(&self) -> Vec<u8> {
|
||||
let mut wd = vec![0u8; 900];
|
||||
let mut stored = vec![0u32; self.pieces.len()];
|
||||
for (i, (text, compressed)) in self.pieces.iter().enumerate().rev() {
|
||||
stored[i] = wd.len() as u32;
|
||||
if *compressed {
|
||||
wd.extend(text.chars().map(|c| match c {
|
||||
'“' => 0x93,
|
||||
'”' => 0x94,
|
||||
c => u8::try_from(u32::from(c)).unwrap(),
|
||||
}));
|
||||
} else {
|
||||
// U+FFFF and U+FFFE stand for the high surrogate 0xD800 and the low surrogate 0xDE00
|
||||
// on their own.
|
||||
let unit = |u| match u {
|
||||
0xFFFF => 0xD800,
|
||||
0xFFFE => 0xDE00,
|
||||
u => u,
|
||||
};
|
||||
wd.extend(text.encode_utf16().map(unit).flat_map(u16::to_le_bytes));
|
||||
}
|
||||
}
|
||||
// Each character's file position and size, in character order.
|
||||
let mut chars: Vec<(u32, u32)> = vec![];
|
||||
for ((text, compressed), &at) in self.pieces.iter().zip(&stored) {
|
||||
let w = if *compressed { 1 } else { 2 };
|
||||
chars.extend((0..text.encode_utf16().count() as u32).map(|k| (at + k * w, w)));
|
||||
}
|
||||
let chpx_of = |cp: u32| (0u32, self.chpx.iter().rev().find(|(s, e, _)| (*s..*e).contains(&cp)).map(|r| r.2.clone()).unwrap_or_default());
|
||||
let papx_of = |cp: u32| {
|
||||
let p = self.papx.iter().filter(|(mark, _, _)| *mark >= cp).min_by_key(|(mark, _, _)| *mark);
|
||||
p.map_or((u32::MAX, vec![0, 0]), |(mark, istd, g)| (*mark, [istd.to_le_bytes().to_vec(), g.clone()].concat()))
|
||||
};
|
||||
let mut bins = vec![];
|
||||
for (papx, of) in [(false, &chpx_of as &dyn Fn(u32) -> (u32, Vec<u8>)), (true, &papx_of)] {
|
||||
let mut runs: Vec<(u32, u32, u32, Vec<u8>)> = vec![];
|
||||
for (cp, &(fc, w)) in chars.iter().enumerate() {
|
||||
let (key, props) = of(cp as u32);
|
||||
match runs.last_mut() {
|
||||
Some((_, end, k, p)) if *end == fc && *k == key && *p == props => *end = fc + w,
|
||||
_ => runs.push((fc, fc + w, key, props)),
|
||||
}
|
||||
}
|
||||
// Pages of contiguous runs, 16 at most.
|
||||
let mut groups: Vec<Vec<(u32, u32, Vec<u8>)>> = vec![];
|
||||
for (start, end, _, props) in runs {
|
||||
match groups.last_mut() {
|
||||
Some(g) if g.len() < 16 && g.last().unwrap().1 == start => g.push((start, end, props)),
|
||||
_ => groups.push(vec![(start, end, props)]),
|
||||
}
|
||||
}
|
||||
let mut fcs: Vec<u32> = groups.iter().map(|g| g[0].0).collect();
|
||||
fcs.extend(groups.last().map(|g| g.last().unwrap().1));
|
||||
let pns: Vec<u32> = groups.iter().map(|g| property_page(g, papx, &mut wd)).collect();
|
||||
bins.push([fcs, pns].concat().into_iter().flat_map(u32::to_le_bytes).collect::<Vec<u8>>());
|
||||
}
|
||||
let mut cps = vec![0u32];
|
||||
for (text, _) in &self.pieces {
|
||||
cps.push(cps.last().unwrap() + text.encode_utf16().count() as u32);
|
||||
}
|
||||
let pcds = self.pieces.iter().zip(&stored).flat_map(|((_, compressed), &at)| {
|
||||
let fc = if *compressed { (at * 2) | 0x4000_0000 } else { at };
|
||||
[&[0u8, 0][..], &fc.to_le_bytes(), &[0, 0]].concat()
|
||||
});
|
||||
let plc: Vec<u8> = cps.iter().flat_map(|c| c.to_le_bytes()).chain(pcds).collect();
|
||||
let clx = self.clx.clone().unwrap_or_else(|| [vec![0x02], (plc.len() as u32).to_le_bytes().to_vec(), plc].concat());
|
||||
let words = |v: &[u16]| v.iter().flat_map(|w| w.to_le_bytes()).collect::<Vec<u8>>();
|
||||
let mut stsh = words(&[18, self.styles.len() as u16, 10, 1, 0, 15, 0, 0, 0, 0]);
|
||||
for (istd, s) in self.styles.iter().enumerate() {
|
||||
let Some((stk, base, papx, chpx)) = s else {
|
||||
stsh.extend([0, 0]);
|
||||
continue;
|
||||
};
|
||||
let upx = |bytes: Vec<u8>| [words(&[bytes.len() as u16]), bytes.clone(), vec![0; bytes.len() % 2]].concat();
|
||||
let grlpupx = match stk {
|
||||
1 => [upx([(istd as u16).to_le_bytes().to_vec(), papx.clone()].concat()), upx(chpx.clone())].concat(),
|
||||
_ => upx(chpx.clone()),
|
||||
};
|
||||
let cupx = if *stk == 1 { 2 } else { 1 };
|
||||
let mut std = words(&[0x0FFE, stk | (base << 4), cupx | (0x0FFF << 4), 0, 0, 1, u16::from(b'S'), 0]);
|
||||
std.extend(grlpupx);
|
||||
let len = std.len() as u16;
|
||||
std[6..8].copy_from_slice(&len.to_le_bytes());
|
||||
stsh.extend(len.to_le_bytes());
|
||||
stsh.extend(std);
|
||||
}
|
||||
let mut ffn = words(&[self.fonts.len() as u16, 0]);
|
||||
for name in &self.fonts {
|
||||
let units: Vec<u16> = name.encode_utf16().chain([0]).collect();
|
||||
ffn.push((39 + 2 * units.len()) as u8);
|
||||
ffn.extend([0u8; 39]);
|
||||
ffn.extend(words(&units));
|
||||
}
|
||||
let mut table = vec![];
|
||||
let mut pairs = vec![(0u32, 0u32); 0x5D];
|
||||
for (index, part) in [(1, stsh), (12, bins[0].clone()), (13, bins[1].clone()), (15, ffn), (33, clx)] {
|
||||
pairs[index] = (table.len() as u32, part.len() as u32);
|
||||
table.extend(part);
|
||||
}
|
||||
let mut put = |at: usize, bytes: &[u8]| wd[at..at + bytes.len()].copy_from_slice(bytes);
|
||||
let flags = self.flags | if self.zero_table { 0 } else { 0x0200 };
|
||||
put(0, &words(&[0xA5EC, if self.nfib == 0 { 0x00C1 } else { self.nfib }]));
|
||||
put(10, &words(&[flags, 0x00BF]));
|
||||
put(32, &words(&[14]));
|
||||
put(62, &words(&[22]));
|
||||
put(76, &(chars.len() as u32 + self.ccp_extra).to_le_bytes());
|
||||
for (i, n) in [4, 5, 7, 8, 9, 10].into_iter().zip(self.stories) {
|
||||
put(64 + 4 * i, &n.to_le_bytes());
|
||||
}
|
||||
put(152, &words(&[0x5D]));
|
||||
for (i, (fc, lcb)) in pairs.iter().enumerate() {
|
||||
put(154 + 8 * i, &[fc.to_le_bytes(), lcb.to_le_bytes()].concat());
|
||||
}
|
||||
compound_file(&[("WordDocument", &wd), (if self.zero_table { "0Table" } else { "1Table" }, &table)])
|
||||
}
|
||||
}
|
||||
|
||||
/// A compound file holding `streams`.
|
||||
fn compound_file(streams: &[(&str, &[u8])]) -> Vec<u8> {
|
||||
let mut cf = cfb::CompoundFile::create(std::io::Cursor::new(Vec::new())).unwrap();
|
||||
for (name, bytes) in streams {
|
||||
std::io::Write::write_all(&mut cf.create_stream(name).unwrap(), bytes).unwrap();
|
||||
}
|
||||
cf.flush().unwrap();
|
||||
cf.into_inner().into_inner()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn doc_places_as_area_type_with_its_styles_and_formatting() {
|
||||
let navy: &[u8] = &[0x1F, 0x38, 0x64, 0];
|
||||
// Normal: 11 pt with 8 pt after; Heading (based on Normal): centered, 12 pt before and none
|
||||
// after, in Arial, bold, 16 pt and navy; Emphasis, a character style: italic.
|
||||
let mut styles = vec![
|
||||
Some((1, 0x0FFF, prls(&[(0xA414, &[160, 0])]), prls(&[(0x4A43, &[22, 0])]))),
|
||||
Some((
|
||||
1,
|
||||
0,
|
||||
prls(&[(0x2403, &[1]), (0xA413, &[240, 0]), (0xA414, &[0, 0])]),
|
||||
prls(&[(0x4A4F, &[1, 0]), (0x0835, &[1]), (0x4A43, &[32, 0]), (0x6870, navy)]),
|
||||
)),
|
||||
];
|
||||
styles.resize_with(10, || None);
|
||||
styles.push(Some((2, 0x0FFF, vec![], prls(&[(0x0836, &[1])]))));
|
||||
// The first piece holds characters 0 to 24 ("notes" at 7, the first paragraph mark at 12), the
|
||||
// second "styled" at 25, "2" at 31, "hidden" at 32, "gone" at 38, " café ✓ " at 42, the field
|
||||
// at 50 (its result "7" at 58) and the paragraph mark at 60.
|
||||
let doc = Word97 {
|
||||
pieces: vec![("Report notes\r“Plain” and ", true), ("styled2hiddengone café ✓ \u{13} PAGE \u{14}7\u{15}\r", false)],
|
||||
chpx: vec![
|
||||
(7, 12, prls(&[(0x4A30, &[10, 0])])),
|
||||
(25, 31, prls(&[(0x4A4F, &[2, 0]), (0x0836, &[1]), (0x2A3E, &[1])])),
|
||||
(31, 32, prls(&[(0x2A48, &[1])])),
|
||||
(32, 38, prls(&[(0x083C, &[1])])),
|
||||
(38, 42, prls(&[(0x0800, &[1])])),
|
||||
(42, 50, prls(&[(0x0801, &[1])])),
|
||||
],
|
||||
papx: vec![(12, 1, vec![]), (60, 0, prls(&[(0x840F, &[0xD0, 0x02]), (0x8411, &(-360i16).to_le_bytes()), (0x2403, &[3])]))],
|
||||
styles,
|
||||
fonts: vec!["Times New Roman", "Arial", "Courier New"],
|
||||
..Word97::default()
|
||||
};
|
||||
let mut s = session();
|
||||
s.execute("document.setup", &json!({"superscript": {"size": 50, "position": 40}})).unwrap();
|
||||
let file = json!({"name": "report.doc", "dataBase64": vectorcraft_format::base64_encode(&doc.build())});
|
||||
let r = s.execute("file.place", &file).unwrap();
|
||||
assert_eq!((r["format"].as_str(), r["name"].as_str()), (Some("doc"), Some("report.doc")));
|
||||
let (text, frame) = placed(&s, &r);
|
||||
assert_eq!(text, "Report notes\n“Plain” and styled2 café ✓ 7", "hidden and deleted text and the field's instructions are left out");
|
||||
assert!(close(frame, Rect::new(36.0, 36.0, 364.0, 264.0)), "the artboard less a 36 pt margin: {frame:?}");
|
||||
let n = s.doc().unwrap().doc.node(NodeId(r["ids"][0].as_u64().unwrap())).unwrap().clone();
|
||||
let NodeKind::Text(t) = &n.kind else { panic!("not type") };
|
||||
let runs: Vec<_> = t.runs.iter().map(|r| (r.text.as_str(), r.style.font_family.as_str(), r.style.font_style.as_str(), r.style.size)).collect();
|
||||
assert_eq!(
|
||||
runs,
|
||||
[
|
||||
("Report ", "Arial", "Bold", 16.0),
|
||||
("notes", "Arial", "Bold Italic", 16.0),
|
||||
("\n", "Arial", "Bold", 16.0),
|
||||
("“Plain” and ", "Times New Roman", "Regular", 11.0),
|
||||
("styled", "Courier New", "Italic", 11.0),
|
||||
("2", "Times New Roman", "Regular", 11.0),
|
||||
(" café ✓ 7", "Times New Roman", "Regular", 11.0),
|
||||
]
|
||||
);
|
||||
let navy = vectorcraft_color::Paint::solid(vectorcraft_color::Color::rgb8(0x1F, 0x38, 0x64));
|
||||
assert_eq!((t.runs[0].style.fill == navy, t.runs[1].style.fill == navy, t.runs[3].style.fill == navy), (true, true, false));
|
||||
assert_eq!((t.runs[3].style.underline, t.runs[4].style.underline), (false, true));
|
||||
let superscript = vectorcraft_doc::ScriptMetrics { size: 50.0, position: 40.0 };
|
||||
assert_eq!(t.runs[5].style.position, vectorcraft_doc::CharPosition::Superscript(superscript), "in Document Setup's proportions");
|
||||
let paras = t.paragraph_styles();
|
||||
let summary: Vec<_> = paras.iter().map(|p| (p.justify, p.left_indent, p.first_line_indent, p.space_before, p.space_after)).collect();
|
||||
assert_eq!(summary, [(vectorcraft_doc::Justify::Center, 0.0, 0.0, 12.0, 0.0), (vectorcraft_doc::Justify::JustifyLeft, 36.0, -18.0, 0.0, 8.0)]);
|
||||
let fields = "the Word document's fields were placed as the text of their results";
|
||||
let revisions = "the Word document's tracked changes were accepted: deleted text was left out and inserted text kept";
|
||||
assert_eq!(r["warnings"], json!([fields, revisions]));
|
||||
let st = s.doc().unwrap();
|
||||
assert_eq!((st.history.undo.len(), st.selection.objects.len()), (2, 1), "Document Setup and Place, each one undo step");
|
||||
// Info and the place cursor report it as a Word 97-2003 document, with the same warnings.
|
||||
let info = s.execute("file.place.info", &file).unwrap();
|
||||
assert_eq!((info["format"].as_str(), info["width"].as_f64(), &info["warnings"]), (Some("doc"), Some(468.0), &json!([fields, revisions])));
|
||||
let q = s.execute("file.place.queue", &json!({"files": [file]})).unwrap();
|
||||
assert_eq!((q["count"].as_u64(), q["files"][0]["format"].as_str()), (Some(1), Some("doc")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn doc_tables_breaks_and_other_stories_place_as_paragraphs_and_tabs_with_warnings() {
|
||||
let in_table = prls(&[(0x2416, &[1])]);
|
||||
// A line break; a table row of two cells; a page break inside a paragraph and a section break
|
||||
// that ends one; a picture, a tab and a nonbreaking hyphen; right-to-left justified text.
|
||||
let text = "Line one\u{B}line two\ra\u{7}b\u{7}\u{7}x\u{C}y\rsec\u{C}next\rpic\u{1}ture\tend\u{1E}ok\rrtl\r";
|
||||
let doc = Word97 {
|
||||
pieces: vec![(text, true)],
|
||||
// Marks: the first paragraph's at 17, the cells' at 19 and 21, the row's at 22, the page
|
||||
// break at 24 inside the paragraph that ends at 26, the section break at 30, and the
|
||||
// paragraph marks at 35, 51 and 55.
|
||||
papx: vec![
|
||||
(17, 0, vec![]),
|
||||
(19, 0, in_table.clone()),
|
||||
(21, 0, in_table),
|
||||
(22, 0, prls(&[(0x2416, &[1]), (0x2417, &[1])])),
|
||||
(26, 0, vec![]),
|
||||
(30, 0, vec![]),
|
||||
(35, 0, vec![]),
|
||||
(51, 0, vec![]),
|
||||
(55, 0, prls(&[(0x2441, &[1]), (0x2461, &[3])])),
|
||||
],
|
||||
zero_table: true,
|
||||
stories: [5, 0, 2, 0, 0, 0],
|
||||
..Word97::default()
|
||||
};
|
||||
let mut s = session();
|
||||
// Recognized by its WordDocument stream whatever its name says.
|
||||
let r = s.execute("file.place", &json!({"name": "notes.bin", "dataBase64": vectorcraft_format::base64_encode(&doc.build())})).unwrap();
|
||||
assert_eq!(r["format"].as_str(), Some("doc"));
|
||||
assert_eq!(placed(&s, &r).0, "Line one\nline two\na\tb\nxy\nsec\nnext\npicture\tend\u{2011}ok\nrtl");
|
||||
let n = s.doc().unwrap().doc.node(NodeId(r["ids"][0].as_u64().unwrap())).unwrap().clone();
|
||||
let NodeKind::Text(t) = &n.kind else { panic!("not type") };
|
||||
let last = t.paragraph_styles().last().cloned().unwrap();
|
||||
assert_eq!((last.justify, last.direction), (vectorcraft_doc::Justify::JustifyRight, Some(vectorcraft_doc::ParaDirection::RightToLeft)));
|
||||
assert_eq!(
|
||||
r["warnings"],
|
||||
json!([
|
||||
"the Word document's pictures and embedded objects were left out",
|
||||
"the Word document's tables were placed as paragraphs with their cells separated by tabs",
|
||||
"the Word document's footnotes and comments were left out",
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn malformed_doc_fails_cleanly() {
|
||||
let mut s = session();
|
||||
let place = |s: &mut Session, name: &str, bytes: &[u8]| {
|
||||
s.execute("file.place", &json!({"name": name, "dataBase64": vectorcraft_format::base64_encode(bytes)})).map_err(|e| e.to_string())
|
||||
};
|
||||
let words = || Word97 { pieces: vec![("words\r", true)], ..Word97::default() };
|
||||
let e = place(&mut s, "a.doc", b"Plain words, not a compound file").unwrap_err();
|
||||
assert!(e.contains("not a format VectorCraft reads"), "{e}");
|
||||
// An RTF file named `.doc` is still placed as RTF.
|
||||
let r = place(&mut s, "a.doc", br"{\rtf1 Rich}").unwrap();
|
||||
assert_eq!((r["format"].as_str(), placed(&s, &r).0.as_str()), (Some("rtf"), "Rich"));
|
||||
let e = place(&mut s, "a.doc", &compound_file(&[("Other", b"x")])).unwrap_err();
|
||||
assert!(e.contains("no WordDocument stream"), "{e}");
|
||||
let e = place(&mut s, "a.bin", &compound_file(&[("Other", b"x")])).unwrap_err();
|
||||
assert!(e.contains("not a format VectorCraft reads"), "a compound file of something else isn't read as a Word document: {e}");
|
||||
let e = place(&mut s, "a.doc", &[&[0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1][..], &[0; 600]].concat()).unwrap_err();
|
||||
assert!(e.contains("compound file structure is damaged"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &compound_file(&[("WordDocument", &[0; 900])])).unwrap_err();
|
||||
assert!(e.contains("doesn't start with a file information block"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { nfib: 0x0065, ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("Word 6.0 or Word 95"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { flags: 0x0100, ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("encrypted"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { flags: 0x0004, ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("fast save"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { ccp_extra: 3, ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("doesn't cover its text"), "{e}");
|
||||
// A piece stored past the end of the WordDocument stream.
|
||||
let far = [&0u32.to_le_bytes()[..], &6u32.to_le_bytes(), &[0, 0], &0x00FF_0000u32.to_le_bytes(), &[0, 0]].concat();
|
||||
let clx = [&[0x02][..], &(far.len() as u32).to_le_bytes(), &far].concat();
|
||||
let e = place(&mut s, "a.doc", &Word97 { clx: Some(clx), ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("lies outside its WordDocument stream"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { clx: Some(vec![0x02, 0xFF, 0xFF, 0, 0]), ..words() }.build()).unwrap_err();
|
||||
assert!(e.contains("piece table is damaged"), "{e}");
|
||||
let e = place(&mut s, "a.doc", &Word97 { pieces: vec![("\r\r", true)], ..Word97::default() }.build()).unwrap_err();
|
||||
assert!(e.contains("no text to place"), "{e}");
|
||||
// 16-bit text with half of a surrogate pair is refused rather than placed with a stand-in.
|
||||
let e = place(&mut s, "a.doc", &Word97 { pieces: vec![("bad \u{FFFF} text\r", false)], ..Word97::default() }.build()).unwrap_err();
|
||||
assert!(e.contains("half of a UTF-16 surrogate pair"), "{e}");
|
||||
// A surrogate pair split between two pieces is one character.
|
||||
let r = place(&mut s, "a.doc", &Word97 { pieces: vec![("x\u{FFFF}", false), ("\u{FFFE}y\r", false)], ..Word97::default() }.build()).unwrap();
|
||||
assert_eq!(placed(&s, &r).0, "x\u{10200}y");
|
||||
// A field that ends without a result is left out, with its own warning.
|
||||
let r = place(&mut s, "a.doc", &Word97 { pieces: vec![("a\u{13} PAGE \u{15}b\r", true)], ..Word97::default() }.build()).unwrap();
|
||||
assert_eq!(placed(&s, &r).0, "ab");
|
||||
assert_eq!(r["warnings"], json!(["the Word document's fields without a result that could be read were left out"]));
|
||||
// So is a field that never ends, with the text after it.
|
||||
let r = place(&mut s, "a.doc", &Word97 { pieces: vec![("a\rb\u{13} PAGE c\r", true)], ..Word97::default() }.build()).unwrap();
|
||||
assert_eq!(placed(&s, &r).0, "a\nb");
|
||||
assert_eq!(r["warnings"], json!(["the Word document's fields without a result that could be read were left out"]));
|
||||
let r = place(&mut s, "a.doc", &words().build()).unwrap();
|
||||
assert_eq!(placed(&s, &r).0, "words");
|
||||
assert_eq!(s.doc().unwrap().history.undo.len(), 5, "failed places leave no undo step");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn place_reads_what_open_reads_and_text_files() {
|
||||
use cmd::fileio::{DOCX_EXTS, OPEN_EXTS, PLACE_EXTS, RTF_EXTS, TEXT_EXTS};
|
||||
assert_eq!(PLACE_EXTS, [OPEN_EXTS, TEXT_EXTS, RTF_EXTS, DOCX_EXTS].concat());
|
||||
use cmd::fileio::{DOC_EXTS, DOCX_EXTS, OPEN_EXTS, PLACE_EXTS, RTF_EXTS, TEXT_EXTS};
|
||||
assert_eq!(PLACE_EXTS, [OPEN_EXTS, TEXT_EXTS, RTF_EXTS, DOCX_EXTS, DOC_EXTS].concat());
|
||||
let filters: Vec<_> = cmd::fileio::place_filters().collect();
|
||||
assert_eq!((filters.first(), filters.last()), (Some(&("All placeable files", PLACE_EXTS)), Some(&("Word", DOCX_EXTS))));
|
||||
assert_eq!(filters.get(filters.len() - 3..), Some(&[("Text", TEXT_EXTS), ("RTF", RTF_EXTS), ("Word", DOCX_EXTS)][..]));
|
||||
let word: (&str, &[&str]) = ("Word", &["docx", "doc"]);
|
||||
assert_eq!((filters.first(), filters.last()), (Some(&("All placeable files", PLACE_EXTS)), Some(&word)));
|
||||
assert_eq!(filters.get(filters.len() - 3..), Some(&[("Text", TEXT_EXTS), ("RTF", RTF_EXTS), word][..]));
|
||||
assert!(
|
||||
!cmd::fileio::open_filters().any(|(_, exts)| exts.contains(&"txt") || exts.contains(&"rtf") || exts.contains(&"docx")),
|
||||
!cmd::fileio::open_filters().any(|(_, exts)| ["txt", "rtf", "docx", "doc"].iter().any(|e| exts.contains(e))),
|
||||
"Open doesn't read text, RTF or Word files"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -327,6 +327,7 @@ impl Session {
|
||||
},
|
||||
screen: view.screen,
|
||||
plane_widget: self.prefs.perspective_widget.show.then_some(self.prefs.perspective_widget.position),
|
||||
precise_cursors: self.precise_cursors(),
|
||||
};
|
||||
let tool = &mut self.tool;
|
||||
match crate::guard::catch_panic(|| f(tool.as_mut(), &cx)) {
|
||||
@@ -619,7 +620,12 @@ impl Session {
|
||||
}
|
||||
None => self.with_tool_cx(view, |t, cx| t.cursor(cx, p, mods)),
|
||||
};
|
||||
if self.prefs.use_precise_cursors || self.caps_lock { c.precise() } else { c }
|
||||
if self.precise_cursors() { c.precise() } else { c }
|
||||
}
|
||||
|
||||
/// General › Use Precise Cursors is on, or Caps Lock is.
|
||||
fn precise_cursors(&self) -> bool {
|
||||
self.prefs.use_precise_cursors || self.caps_lock
|
||||
}
|
||||
|
||||
pub fn tool_options(&self) -> Value {
|
||||
|
||||
@@ -589,6 +589,14 @@ fn structured_junk() {
|
||||
("addon.arrange.size", json!({"width": 1e6, "height": 0.001, "reference": 8, "scaleStrokes": true})),
|
||||
("addon.arrange.size", json!({"width": 0.001, "proportional": true, "reference": u64::MAX})),
|
||||
("addon.arrange.groupOverlapping", json!({"ids": "x", "junk": f64::MAX})),
|
||||
("addon.arrange.randomizeOpacity", json!({"min": 0, "max": 100, "seed": u64::MAX})),
|
||||
("addon.arrange.randomizeOpacity", json!({"min": f64::MAX, "max": -1e308, "seed": -1, "ids": [u64::MAX]})),
|
||||
("addon.arrange.randomizeOpacity", json!({"min": 100, "max": 0, "seed": 1e308, "ids": []})),
|
||||
("addon.arrange.sort", json!({"by": "area", "apply": "area", "distribute": true, "scaleStrokes": true})),
|
||||
("addon.arrange.sort", json!({"by": "stacking", "apply": "stacking", "order": "random", "seed": u64::MAX})),
|
||||
("addon.arrange.sort", json!({"by": "opacity", "apply": "y", "order": "descending", "ids": [u64::MAX]})),
|
||||
("addon.arrange.sort", json!({"by": "x", "apply": "opacity", "distribute": true, "seed": 1e308, "ids": []})),
|
||||
("addon.arrange.sort", json!({"by": "nope", "apply": null, "order": 3, "distribute": "x"})),
|
||||
("addon.pathtools.divideDashes", json!({"dash": 1e-308, "gap": -1e308, "fit": "x"})),
|
||||
("addon.pathtools.divideDashes", json!({"dash": 0.01, "gap": 1e6, "fit": true, "removeGaps": false})),
|
||||
("addon.pathtools.divideDashes", json!({"dash": f64::MAX, "gap": [0], "removeGaps": null})),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Untrusted text files placed with File → Place never crash: any bytes, with any Text Import
|
||||
//! Options, place as area type or fail with an error, and so do hostile RTF files and Word
|
||||
//! documents.
|
||||
//! Options, place as area type or fail with an error, and so do hostile RTF files, Word documents
|
||||
//! and Word 97-2003 documents.
|
||||
//!
|
||||
//! `PROPTEST_CASES=20000 cargo test -p vectorcraft-engine --test text_import_fuzz` runs a deeper search.
|
||||
// Integration tests: unwrapping and panicking on failure is fine here, unlike in shipped code (AGENTS.md › Robustness).
|
||||
@@ -91,6 +91,164 @@ proptest! {
|
||||
});
|
||||
prop_assert!(r.is_ok(), "panicked: {:?}", r.err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn any_doc_places_without_panics(
|
||||
text in prop::collection::vec(prop::sample::select(DOC_CHARS.chars().collect::<Vec<_>>()), 1..60),
|
||||
compressed in any::<bool>(),
|
||||
chpx in arb_grpprl(),
|
||||
papx in arb_grpprl(),
|
||||
istd in 0u16..4,
|
||||
stsh in prop_oneof![1 => prop::collection::vec(any::<u8>(), 0..120), 3 => arb_stsh()],
|
||||
ffn in prop::collection::vec(any::<u8>(), 0..80),
|
||||
changes in prop_oneof![
|
||||
3 => Just(vec![]),
|
||||
1 => prop::collection::vec((any::<bool>(), any::<prop::sample::Index>(), any::<u8>()), 1..4),
|
||||
],
|
||||
name in prop::sample::select(vec!["fuzz.doc", "fuzz.bin"]),
|
||||
) {
|
||||
vectorcraft_text::FontDb::global().set_system_fallback(false);
|
||||
let text: String = text.into_iter().collect();
|
||||
let (mut wd, mut table) = word97(&text, compressed, &chpx, istd, &papx, &stsh, &ffn);
|
||||
// A changed byte anywhere in either stream: in the FIB, the text, a property page or a
|
||||
// table.
|
||||
for (in_table, at, byte) in changes {
|
||||
let stream = if in_table { &mut table } else { &mut wd };
|
||||
let i = at.index(stream.len());
|
||||
stream[i] = byte;
|
||||
}
|
||||
let mut cf = cfb::CompoundFile::create(std::io::Cursor::new(Vec::new())).unwrap();
|
||||
std::io::Write::write_all(&mut cf.create_stream("WordDocument").unwrap(), &wd).unwrap();
|
||||
std::io::Write::write_all(&mut cf.create_stream("1Table").unwrap(), &table).unwrap();
|
||||
cf.flush().unwrap();
|
||||
let data = cf.into_inner().into_inner();
|
||||
let r = catch_quiet(|| {
|
||||
let mut s = vectorcraft_engine::Session::new();
|
||||
s.execute("file.new", &json!({"width": 100, "height": 100})).unwrap();
|
||||
let p = json!({"name": name, "dataBase64": vectorcraft_format::base64_encode(&data), "thumbnail": 8});
|
||||
let _ = s.execute("file.place.info", &p);
|
||||
let _ = s.execute("file.place", &p);
|
||||
});
|
||||
prop_assert!(r.is_ok(), "panicked: {:?}", r.err());
|
||||
}
|
||||
}
|
||||
|
||||
/// Characters of a Word document's text: letters, marks of paragraphs, cells and breaks, fields,
|
||||
/// pictures, hyphens and surrogate-free Unicode.
|
||||
const DOC_CHARS: &str = "ab \r\u{7}\u{B}\u{C}\u{13}\u{14}\u{15}\u{1}\u{8}\t\u{1E}\u{1F}(é“✓";
|
||||
|
||||
/// Character and paragraph properties: Prls the Word 97-2003 reader knows, with operands in and out
|
||||
/// of range, and raw bytes.
|
||||
fn arb_grpprl() -> impl Strategy<Value = Vec<u8>> {
|
||||
let prl = prop_oneof![
|
||||
prop::sample::select(vec![
|
||||
&[0x35, 0x08, 0x81][..],
|
||||
&[0x35, 0x08, 0x80],
|
||||
&[0x3C, 0x08, 0x01],
|
||||
&[0x00, 0x08, 0x01],
|
||||
&[0x01, 0x08, 0x01],
|
||||
&[0x55, 0x08, 0x01],
|
||||
&[0x30, 0x4A, 0x0A, 0x00],
|
||||
&[0x30, 0x4A, 0xFF, 0xFF],
|
||||
&[0x43, 0x4A, 0xFF, 0xFF],
|
||||
&[0x4F, 0x4A, 0x07, 0x00],
|
||||
&[0x42, 0x2A, 0x63],
|
||||
&[0x70, 0x68, 1, 2, 3, 0xFF],
|
||||
&[0x45, 0x48, 0x00, 0x80],
|
||||
&[0x03, 0x24, 0x09],
|
||||
&[0x61, 0x24, 0x08],
|
||||
&[0x17, 0x24, 0x01],
|
||||
&[0x4B, 0x24, 0x01],
|
||||
&[0x41, 0x24, 0x01],
|
||||
&[0x0F, 0x84, 0x00, 0x80],
|
||||
&[0x13, 0xA4, 0xFF, 0xFF],
|
||||
&[0x08, 0xD6, 0xFF, 0xFF],
|
||||
&[0x15, 0xC6, 0xFF, 0x7F],
|
||||
&[0x2A, 0xC6, 0xFF],
|
||||
])
|
||||
.prop_map(<[u8]>::to_vec),
|
||||
prop::collection::vec(any::<u8>(), 0..4),
|
||||
];
|
||||
prop::collection::vec(prl, 0..6).prop_map(|p| p.concat())
|
||||
}
|
||||
|
||||
/// A style sheet of up to four styles (paragraph or character, based on another or none) with
|
||||
/// properties of [`arb_grpprl`], or empty slots.
|
||||
fn arb_stsh() -> impl Strategy<Value = Vec<u8>> {
|
||||
let style = prop::option::of((1u16..3, prop_oneof![Just(0x0FFFu16), 0u16..5], arb_grpprl(), arb_grpprl()));
|
||||
prop::collection::vec(style, 0..5).prop_map(|styles| {
|
||||
let words = |v: &[u16]| v.iter().flat_map(|w| w.to_le_bytes()).collect::<Vec<u8>>();
|
||||
let mut stsh = words(&[18, styles.len() as u16, 10, 1, 0, 15, 0, 0, 0, 0]);
|
||||
for s in styles {
|
||||
let Some((stk, base, papx, chpx)) = s else {
|
||||
stsh.extend([0, 0]);
|
||||
continue;
|
||||
};
|
||||
let upx = |b: Vec<u8>| [words(&[b.len() as u16]), b.clone(), vec![0; b.len() % 2]].concat();
|
||||
let (cupx, grlpupx) = if stk == 1 { (2, [upx([vec![0, 0], papx].concat()), upx(chpx)].concat()) } else { (1, upx(chpx)) };
|
||||
let mut std = words(&[0x0FFE, stk | (base << 4), cupx | (0x0FFF << 4), 0, 0, 1, u16::from(b'S'), 0]);
|
||||
std.extend(grlpupx);
|
||||
stsh.extend((std.len() as u16).to_le_bytes());
|
||||
stsh.extend(std);
|
||||
}
|
||||
stsh
|
||||
})
|
||||
}
|
||||
|
||||
/// The WordDocument and table streams of a Word 97-2003 document whose main text is `text` in one
|
||||
/// piece, with one page of character properties `chpx` and one of paragraph properties `papx` of
|
||||
/// style `istd` covering it, and the style sheet `stsh` and font table `ffn`.
|
||||
fn word97(text: &str, compressed: bool, chpx: &[u8], istd: u16, papx: &[u8], stsh: &[u8], ffn: &[u8]) -> (Vec<u8>, Vec<u8>) {
|
||||
let mut wd = vec![0u8; 1024];
|
||||
let at = wd.len() as u32;
|
||||
if compressed {
|
||||
wd.extend(text.chars().map(|c| if c == '“' { 0x93 } else { u32::from(c).min(0xFF) as u8 }));
|
||||
} else {
|
||||
wd.extend(text.encode_utf16().flat_map(u16::to_le_bytes));
|
||||
}
|
||||
let ccp = text.encode_utf16().count() as u32;
|
||||
let end = wd.len() as u32;
|
||||
// One page each: a run of every character, its properties near the page's end.
|
||||
let page = |props: Vec<u8>, papx: bool| {
|
||||
let mut p = vec![0u8; 512];
|
||||
p[0..4].copy_from_slice(&at.to_le_bytes());
|
||||
p[4..8].copy_from_slice(&end.to_le_bytes());
|
||||
let blob = if papx { [vec![0, (props.len() / 2) as u8], props].concat() } else { [vec![props.len() as u8], props].concat() };
|
||||
let top = (511 - blob.len().min(400)) & !1;
|
||||
let n = blob.len().min(511 - top);
|
||||
p[top..top + n].copy_from_slice(&blob[..n]);
|
||||
p[8] = (top / 2) as u8;
|
||||
p[511] = 1;
|
||||
p
|
||||
};
|
||||
let papx_props = [istd.to_le_bytes().to_vec(), papx.to_vec(), vec![0; papx.len() % 2]].concat();
|
||||
wd.resize(wd.len().div_ceil(512) * 512, 0);
|
||||
let chpx_page = (wd.len() / 512) as u32;
|
||||
wd.extend(page(chpx.iter().copied().take(200).collect(), false));
|
||||
wd.extend(page(papx_props.into_iter().take(400).collect(), true));
|
||||
let bte = |pn: u32| [at, end, pn].into_iter().flat_map(u32::to_le_bytes).collect::<Vec<u8>>();
|
||||
let fc = if compressed { (at * 2) | 0x4000_0000 } else { at };
|
||||
let plc = [&0u32.to_le_bytes()[..], &ccp.to_le_bytes(), &[0, 0], &fc.to_le_bytes(), &[0, 0]].concat();
|
||||
let clx = [&[0x02][..], &(plc.len() as u32).to_le_bytes(), &plc].concat();
|
||||
let mut table = vec![];
|
||||
let mut pairs = vec![(0u32, 0u32); 0x5D];
|
||||
for (index, part) in [(1, stsh.to_vec()), (12, bte(chpx_page)), (13, bte(chpx_page + 1)), (15, ffn.to_vec()), (33, clx)] {
|
||||
pairs[index] = (table.len() as u32, part.len() as u32);
|
||||
table.extend(part);
|
||||
}
|
||||
let words = |v: &[u16]| v.iter().flat_map(|w| w.to_le_bytes()).collect::<Vec<u8>>();
|
||||
let mut put = |at: usize, bytes: &[u8]| wd[at..at + bytes.len()].copy_from_slice(bytes);
|
||||
put(0, &words(&[0xA5EC, 0x00C1]));
|
||||
put(10, &words(&[0x0200, 0x00BF]));
|
||||
put(32, &words(&[14]));
|
||||
put(62, &words(&[22]));
|
||||
put(76, &ccp.to_le_bytes());
|
||||
put(80, &1u32.to_le_bytes());
|
||||
put(152, &words(&[0x5D]));
|
||||
for (i, (fc, lcb)) in pairs.iter().enumerate() {
|
||||
put(154 + 8 * i, &[fc.to_le_bytes(), lcb.to_le_bytes()].concat());
|
||||
}
|
||||
(wd, table)
|
||||
}
|
||||
|
||||
/// A well-formed paragraph, or a table row of two such paragraphs.
|
||||
|
||||
@@ -313,4 +313,23 @@ mod tests {
|
||||
let per_run: Vec<usize> = (0..2).map(|r| glyphs.iter().filter(|g| g.run == r).count()).collect();
|
||||
assert_eq!(per_run, [2, 1]);
|
||||
}
|
||||
|
||||
/// Serbian text gets the font's Serbian forms (`locl` for `SRB`): in the bundled Source Sans
|
||||
/// 3 Italic, б, г, д, п, т differ from the Russian ones, in either Serbian list entry.
|
||||
#[test]
|
||||
fn serbian_gets_the_fonts_serbian_forms() {
|
||||
let st = |language: &str| CharStyle {
|
||||
font_family: "Source Sans 3".into(),
|
||||
font_style: "Italic".into(),
|
||||
language: Some(language.to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
let outlines = |language| {
|
||||
layout(FontDb::global(), &TextObject::point(Point::ZERO, "бгдпт", st(language))).glyphs.into_iter().map(|g| g.outline).collect::<Vec<_>>()
|
||||
};
|
||||
let (serbian, russian) = (outlines("sr-Cyrl"), outlines("ru"));
|
||||
assert_eq!((serbian.len(), russian.len()), (5, 5));
|
||||
assert!(serbian.iter().zip(&russian).all(|(s, r)| s != r), "every letter in its Serbian form");
|
||||
assert_eq!(outlines("sr-Latn"), serbian);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,6 +253,9 @@ pub struct ToolContext<'a> {
|
||||
pub screen: Option<ScreenFrame>,
|
||||
/// Where the Plane Switching Widget sits (Perspective Grid Options); None while it's hidden.
|
||||
pub plane_widget: Option<distort::perspective::widget::WidgetCorner>,
|
||||
/// General › Use Precise Cursors, or Caps Lock while it is on: the drawing tools' pointers are
|
||||
/// crosshairs ([`crate::Cursor::precise`]), and the Blob Brush and the Eraser show no tip outline.
|
||||
pub precise_cursors: bool,
|
||||
}
|
||||
|
||||
impl ToolContext<'_> {
|
||||
|
||||
@@ -125,9 +125,11 @@ pub enum Cursor {
|
||||
/// the path. Also while a stroke is drawn back near its start, where releasing the mouse button
|
||||
/// closes the path. A crosshair with a ring.
|
||||
PaintbrushClose,
|
||||
/// The Blob Brush tool.
|
||||
/// The Blob Brush tool: a dot at the brush's centre, the tool drawing the tip's outline round
|
||||
/// it on the canvas.
|
||||
BlobBrush,
|
||||
/// The Eraser tool.
|
||||
/// The Eraser tool: a dot at the tip's centre, the tool drawing the tip's outline round it on
|
||||
/// the canvas.
|
||||
Eraser,
|
||||
/// The Smooth tool.
|
||||
Smooth,
|
||||
@@ -305,8 +307,6 @@ impl Cursor {
|
||||
| Cursor::MagicWand
|
||||
| Cursor::Pencil
|
||||
| Cursor::Paintbrush
|
||||
| Cursor::BlobBrush
|
||||
| Cursor::Eraser
|
||||
| Cursor::Smooth
|
||||
| Cursor::PathEraser
|
||||
| Cursor::Join
|
||||
|
||||
@@ -583,14 +583,16 @@ look = "The Paintbrush cursor with a ring badge (closing the loop), like PenClos
|
||||
[[cursor]]
|
||||
id = "BlobBrush"
|
||||
group = "Drawing and editing tools"
|
||||
shown_when = ["The Blob Brush tool: paints filled shapes that merge with touching ones of the same colour. No brush-size outline shows while hovering."]
|
||||
shown_when = ["The Blob Brush tool: paints filled shapes that merge with touching ones of the same colour. The tool draws the tip's outline (its size, angle and roundness, at the zoom) round the pointer on the canvas, before and while painting; with precise cursors (Caps Lock) the crosshair shows instead."]
|
||||
hotspot = "The brush centre."
|
||||
look = "Only a small dot at the centre: the tip outline drawn on the canvas is the rest of the pointer."
|
||||
|
||||
[[cursor]]
|
||||
id = "Eraser"
|
||||
group = "Drawing and editing tools"
|
||||
shown_when = ["The Eraser tool: a drag erases the area it covers. No size outline shows while hovering."]
|
||||
shown_when = ["The Eraser tool: a drag erases the area it covers. The tool draws the tip's outline (its size, angle and roundness, at the zoom) round the pointer on the canvas, before and while erasing; with precise cursors (Caps Lock) the crosshair shows instead."]
|
||||
hotspot = "The eraser's centre."
|
||||
look = "Only a small dot at the centre, as the Blob Brush's: the tip outline drawn on the canvas is the rest of the pointer."
|
||||
|
||||
[[cursor]]
|
||||
id = "Smooth"
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
|
||||
use serde_json::{Value, json};
|
||||
use vectorcraft_doc::{NodeId, NodeKind};
|
||||
use vectorcraft_geom::Point;
|
||||
use vectorcraft_geom::{Affine, Point};
|
||||
|
||||
use super::{FEEDBACK, blob_area, eraser_area, points_json, polyline};
|
||||
use super::{FEEDBACK, blob_area, blob_tip, eraser_area, eraser_tip, points_json, polyline};
|
||||
use crate::guides::DrawSnap;
|
||||
use crate::{Action, Cursor, Mods, Overlay, PointerEvent, PointerKind, Tool, ToolContext, ToolKey};
|
||||
|
||||
@@ -116,6 +116,9 @@ pub struct GestureTool {
|
||||
pub close_within: f64,
|
||||
/// Smart Guides for the Pencil's ends.
|
||||
snap: DrawSnap,
|
||||
/// Where the Blob Brush's or the Eraser's tip outline shows: the pointer over the canvas,
|
||||
/// unless Cmd/Ctrl lends a selection tool or Alt the Smooth tool.
|
||||
tip_at: Option<Point>,
|
||||
}
|
||||
|
||||
/// The paths a stroke can redraw for selected object `id`: the path itself, or a compound path's
|
||||
@@ -191,6 +194,7 @@ impl GestureTool {
|
||||
edit_within: 12.0,
|
||||
close_within: 15.0,
|
||||
snap: DrawSnap::default(),
|
||||
tip_at: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,6 +278,22 @@ impl GestureTool {
|
||||
start + vectorcraft_geom::constrain_angle_from(p - start, 180.0, self.shift_line.unwrap_or(cx.constrain_angle))
|
||||
}
|
||||
|
||||
/// The Blob Brush's or the Eraser's tip at the pointer, before and while painting: its outline
|
||||
/// `size` across at its angle and roundness, at the zoom, black on a white halo so it reads on
|
||||
/// any art. Precise cursors show only the crosshair, and smoothing shows no tip.
|
||||
fn tip_outline(&self, cx: &ToolContext) -> Vec<Overlay> {
|
||||
let Some(at) = self.tip_at.filter(|_| !self.smoothing && !cx.precise_cursors) else { return vec![] };
|
||||
let tip = if self.id == "blobBrush" { blob_tip(self.angle, self.roundness) } else { eraser_tip(self.angle, self.roundness) };
|
||||
let r = self.size / 2.0;
|
||||
// A tolerance relative to the radius: four arcs at any size or zoom.
|
||||
let circle = kurbo::Shape::to_path(&kurbo::Circle::new(Point::ORIGIN, r), 0.1 * r.max(1e-6));
|
||||
let path = Affine::translate(at.to_vec2()) * tip * circle;
|
||||
vec![
|
||||
Overlay::Path { path: path.clone(), color: [0xff, 0xff, 0xff], width: 3.0, dashed: false },
|
||||
Overlay::Path { path, color: [0, 0, 0], width: 1.0, dashed: false },
|
||||
]
|
||||
}
|
||||
|
||||
/// Forget the stroke.
|
||||
fn clear(&mut self) {
|
||||
self.moved = false;
|
||||
@@ -476,6 +496,9 @@ impl Tool for GestureTool {
|
||||
}
|
||||
fn pointer(&mut self, cx: &ToolContext, ev: &PointerEvent) -> Vec<Action> {
|
||||
let p = ev.pos;
|
||||
if self.varies_size() {
|
||||
self.tip_at = (!ev.mods.cmd && !self.blob_alt_smooths(ev.mods)).then_some(p);
|
||||
}
|
||||
match ev.kind {
|
||||
PointerKind::Move if self.snaps() => {
|
||||
self.snap.hover(cx, p, &[], None);
|
||||
@@ -665,8 +688,12 @@ impl Tool for GestureTool {
|
||||
_ => vec![],
|
||||
}
|
||||
}
|
||||
fn hover_ended(&mut self, _cx: &ToolContext) {
|
||||
self.tip_at = None;
|
||||
}
|
||||
fn deactivate(&mut self, _cx: &ToolContext) -> Vec<Action> {
|
||||
let began = self.began;
|
||||
self.tip_at = None;
|
||||
// Drags past the last preview are in the stroke kept, too, and with Live curve fitting
|
||||
// off the stroke kept is fitted.
|
||||
let stale = (began && (self.previewed != self.points.len() || !self.live_fit) && self.draws_path() && !self.smoothing)
|
||||
@@ -685,6 +712,7 @@ impl Tool for GestureTool {
|
||||
let mut o = self.snap.guides().to_vec();
|
||||
// A path being drawn shows itself, except with the Pencil's Live preview off.
|
||||
if !self.active || self.points.len() < 2 || (self.began && self.previews()) {
|
||||
o.extend(self.tip_outline(cx));
|
||||
return o;
|
||||
}
|
||||
// A Blob Brush drag that smooths shows the Smooth tool's thin line.
|
||||
@@ -727,6 +755,8 @@ impl Tool for GestureTool {
|
||||
let length = self.points.windows(2).map(|w| w[0].distance(w[1])).sum();
|
||||
o.push(Overlay::Measure { p: last + vectorcraft_geom::Vec2::new(cx.tol(12.0), cx.tol(12.0)), text: format!("L: {}", cx.len(length)) });
|
||||
}
|
||||
// Over the stroke's footprint, which reaches the tip's edge at the pointer.
|
||||
o.extend(self.tip_outline(cx));
|
||||
o
|
||||
}
|
||||
fn cursor(&self, cx: &ToolContext, p: Point, m: Mods) -> Cursor {
|
||||
|
||||
@@ -344,7 +344,8 @@ fn blob_brush_shift_keeps_the_stroke_horizontal_or_vertical() {
|
||||
let (d, _) = doc_with_rect();
|
||||
let s = Selection::default();
|
||||
let p = paint();
|
||||
let mut cx = cx(&d, &s, &p);
|
||||
// Precise cursors: no tip outline, only the stroke's own overlay.
|
||||
let mut cx = ToolContext { precise_cursors: true, ..cx(&d, &s, &p) };
|
||||
let shift = Mods { shift: true, ..Default::default() };
|
||||
let mut t = GestureTool::new("blobBrush");
|
||||
let ev = |k, x, y, m| PointerEvent::new(k, x, y).with_mods(m);
|
||||
@@ -1358,7 +1359,8 @@ fn the_eraser_sends_its_tip_and_shows_the_area_it_covers() {
|
||||
let (d, _) = doc_with_rect();
|
||||
let s = Selection::default();
|
||||
let p = paint();
|
||||
let cx = cx(&d, &s, &p);
|
||||
// Precise cursors: no tip outline, only the stroke's own overlay.
|
||||
let cx = ToolContext { precise_cursors: true, ..cx(&d, &s, &p) };
|
||||
let mut t = GestureTool::new("eraser");
|
||||
t.set_option("size", &json!(20));
|
||||
t.pointer(&cx, &PointerEvent::new(PointerKind::Down, 50.0, 150.0));
|
||||
@@ -1438,6 +1440,73 @@ fn the_blob_brush_sends_its_tip_and_shows_the_area_it_covers() {
|
||||
assert!(vectorcraft_geom::Shape::bounding_box(path).height() < 0.1, "{o:?}");
|
||||
}
|
||||
|
||||
/// #4977: the Blob Brush and the Eraser show their tip at the pointer before a press and while
|
||||
/// painting: its outline at its size, angle and roundness, a black line on a white halo, following
|
||||
/// `[` / `]` and Tool Options at once. It goes when the hover ends, with precise cursors (Caps
|
||||
/// Lock), while Cmd/Ctrl lends a selection tool and while Alt lends the Blob Brush the Smooth
|
||||
/// tool. The other gesture tools show none.
|
||||
#[test]
|
||||
fn the_blob_brush_and_the_eraser_show_their_tip_at_the_pointer() {
|
||||
let (d, _) = doc_with_rect();
|
||||
let s = Selection::default();
|
||||
let p = paint();
|
||||
let cx = cx(&d, &s, &p);
|
||||
let bounds = |t: &GestureTool, cx: &ToolContext| match &t.overlays(cx)[..] {
|
||||
[Overlay::Path { path: halo, color: [0xff, 0xff, 0xff], width: 3.0, .. }, Overlay::Path { path, color: [0, 0, 0], width: 1.0, .. }] => {
|
||||
assert_eq!(halo, path);
|
||||
Some(vectorcraft_geom::Shape::bounding_box(path))
|
||||
}
|
||||
[] => None,
|
||||
o => panic!("{o:?}"),
|
||||
};
|
||||
let near = |b: Option<vectorcraft_geom::Rect>, want: (f64, f64, f64, f64)| {
|
||||
let b = b.unwrap_or_else(|| panic!("no tip"));
|
||||
assert!([b.x0 - want.0, b.y0 - want.1, b.x1 - want.2, b.y1 - want.3].iter().all(|e| e.abs() < 0.01), "{b:?} vs {want:?}");
|
||||
};
|
||||
let hover = |t: &mut GestureTool, cx: &ToolContext, m: Mods| t.pointer(cx, &PointerEvent::new(PointerKind::Move, 100.0, 50.0).with_mods(m));
|
||||
for id in ["blobBrush", "eraser"] {
|
||||
let mut t = GestureTool::new(id);
|
||||
assert_eq!(bounds(&t, &cx), None, "{id}: nothing before the pointer comes");
|
||||
hover(&mut t, &cx, Mods::default());
|
||||
near(bounds(&t, &cx), (95.0, 45.0, 105.0, 55.0));
|
||||
// `]` grows it at once, without a move; Tool Options too.
|
||||
t.key(&cx, ToolKey::BracketRight, Mods::default());
|
||||
near(bounds(&t, &cx), (94.5, 44.5, 105.5, 55.5));
|
||||
t.set_option("size", &json!(20));
|
||||
near(bounds(&t, &cx), (90.0, 40.0, 110.0, 60.0));
|
||||
// Upright and a quarter as wide: 5 pt across, 20 pt tall.
|
||||
t.set_option("angle", &json!(90));
|
||||
t.set_option("roundness", &json!(25));
|
||||
near(bounds(&t, &cx), (97.5, 40.0, 102.5, 60.0));
|
||||
// It follows the drag, over the stroke's footprint.
|
||||
t.pointer(&cx, &PointerEvent::new(PointerKind::Down, 100.0, 50.0));
|
||||
t.pointer(&cx, &PointerEvent::new(PointerKind::Drag, 200.0, 50.0));
|
||||
let o = t.overlays(&cx);
|
||||
assert!(matches!(&o[o.len() - 2..], [Overlay::Path { width: 3.0, .. }, Overlay::Path { color: [0, 0, 0], width: 1.0, .. }]), "{id}: {o:?}");
|
||||
t.pointer(&cx, &PointerEvent::new(PointerKind::Up, 200.0, 50.0));
|
||||
let precise = ToolContext { precise_cursors: true, ..crate::testutil::cx(&d, &s, &p) };
|
||||
assert_eq!(bounds(&t, &precise), None, "{id}: precise cursors show the crosshair alone");
|
||||
t.hover_ended(&cx);
|
||||
assert_eq!(bounds(&t, &cx), None, "{id}: gone with the hover");
|
||||
hover(&mut t, &cx, Mods::default());
|
||||
assert!(t.deactivate(&cx).is_empty());
|
||||
assert_eq!(bounds(&t, &cx), None, "{id}: gone with the tool");
|
||||
}
|
||||
// Alt before a press lends the Blob Brush the Smooth tool, and Cmd/Ctrl either tool a
|
||||
// selection tool, whose cursors show instead.
|
||||
let mut t = GestureTool::new("blobBrush");
|
||||
hover(&mut t, &cx, Mods { alt: true, ..Default::default() });
|
||||
assert_eq!(bounds(&t, &cx), None);
|
||||
let mut t = GestureTool::new("eraser");
|
||||
hover(&mut t, &cx, Mods { cmd: true, ..Default::default() });
|
||||
assert_eq!(bounds(&t, &cx), None);
|
||||
for id in ["pencil", "paintbrush", "smooth", "knife", "pathEraser", "join"] {
|
||||
let mut t = GestureTool::new(id);
|
||||
hover(&mut t, &cx, Mods::default());
|
||||
assert!(!t.overlays(&cx).iter().any(|o| matches!(o, Overlay::Path { width, .. } if *width == 3.0)), "{id}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn smooth_needs_selection_and_brackets_resize() {
|
||||
let (d, _) = doc_with_rect();
|
||||
|
||||
@@ -507,6 +507,7 @@ pub(crate) mod testutil {
|
||||
construction_angles: guides::construction_angles(guides::DEFAULT_CONSTRUCTION_ANGLES),
|
||||
screen: None,
|
||||
plane_widget: Some(Default::default()),
|
||||
precise_cursors: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -553,7 +554,13 @@ mod cursor_tests {
|
||||
] {
|
||||
assert_eq!(cursor_at(id, &d, away), c, "{id}");
|
||||
assert_eq!(c.precise(), Cursor::Crosshair, "{id}");
|
||||
assert_eq!(c.stand_in(), Some(if id == "mesh" { Cursor::PenAdd } else { Cursor::Crosshair }), "{id}");
|
||||
// The Blob Brush's and the Eraser's dot is drawn: their tip outline goes round it.
|
||||
let stand_in = match id {
|
||||
"mesh" => Some(Cursor::PenAdd),
|
||||
"blobBrush" | "eraser" => None,
|
||||
_ => Some(Cursor::Crosshair),
|
||||
};
|
||||
assert_eq!(c.stand_in(), stand_in, "{id}");
|
||||
}
|
||||
// Away from a selected path the Pencil shows its new-path cursor, drawn with a star; its
|
||||
// own cursor, for drawing and for a selected path under the pointer, borrows the crosshair.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//! Arrange Tools in the interface: its submenu (Object › Plug-ins › Arrange Tools); the dialogs of
|
||||
//! Arrange in Grid, Replace with Top Object and Set Size of Each, which preview on the canvas and
|
||||
//! run their `addon.arrange.*` command on OK; Group Overlapping Objects; and Zoom to Selection ([`ZOOM`]), which fits the
|
||||
//! active view to the selection.
|
||||
//! Arrange in Grid, Replace with Top Object, Set Size of Each, Randomize Opacity and Sort Objects,
|
||||
//! which preview on the canvas and run their `addon.arrange.*` command on OK; Group Overlapping
|
||||
//! Objects; and Zoom to Selection ([`ZOOM`]), which fits the active view to the selection.
|
||||
|
||||
use egui::Ui;
|
||||
use serde_json::{Value, json};
|
||||
@@ -18,15 +18,21 @@ pub const ZOOM: &str = "addon.arrange.zoomSelection";
|
||||
pub const GRID: &str = "arrangeGrid";
|
||||
pub const REPLACE: &str = "arrangeReplace";
|
||||
pub const SIZE: &str = "arrangeSize";
|
||||
pub const OPACITY: &str = "arrangeOpacity";
|
||||
pub const SORT: &str = "arrangeSort";
|
||||
/// Each dialog's kind, command and heading.
|
||||
const DIALOGS: [(&str, &str, &str); 3] = [
|
||||
const DIALOGS: [(&str, &str, &str); 5] = [
|
||||
(GRID, "addon.arrange.grid", "Arrange in Grid"),
|
||||
(REPLACE, "addon.arrange.replace", "Replace with Top Object"),
|
||||
(SIZE, "addon.arrange.size", "Set Size of Each"),
|
||||
(OPACITY, "addon.arrange.randomizeOpacity", "Randomize Opacity"),
|
||||
(SORT, "addon.arrange.sort", "Sort Objects"),
|
||||
];
|
||||
/// The widths and heights Set Size of Each takes (pt), and the gaps Arrange in Grid takes.
|
||||
const SIZES: std::ops::RangeInclusive<f64> = 0.001..=1e6;
|
||||
const GAPS: std::ops::RangeInclusive<f64> = -1e6..=1e6;
|
||||
/// The seeds the Randomize Opacity dialog offers.
|
||||
const SEEDS: u64 = 1_000_000;
|
||||
const LABEL_W: f32 = 110.0;
|
||||
const FIELD_W: f32 = 90.0;
|
||||
|
||||
@@ -39,6 +45,8 @@ pub fn menu() -> Vec<Item> {
|
||||
Item::Cmd("Replace with Top Object…", "addon.arrange.replace", Value::Null),
|
||||
Item::Cmd("Set Size of Each…", "addon.arrange.size", Value::Null),
|
||||
Item::Cmd("Group Overlapping Objects", "addon.arrange.groupOverlapping", json!({})),
|
||||
Item::Cmd("Randomize Opacity…", "addon.arrange.randomizeOpacity", Value::Null),
|
||||
Item::Cmd("Sort Objects…", "addon.arrange.sort", Value::Null),
|
||||
Item::Sep,
|
||||
Item::Cmd("Zoom to Selection", ZOOM, json!({})),
|
||||
]
|
||||
@@ -57,6 +65,13 @@ pub(crate) fn dialog(app: &VectorcraftApp, id: &str) -> Option<(&'static str, Va
|
||||
"gapX": 10, "gapY": 10, "centerOnArtboard": false,
|
||||
}),
|
||||
REPLACE => json!({ "fit": "keep", "keep": false, "scaleStrokes": strokes }),
|
||||
// A new seed each time the document has changed, so running it again varies the result.
|
||||
OPACITY => json!({ "min": 30, "max": 100, "seed": st.revision % SEEDS }),
|
||||
// The random order's seed (not shown): new whenever the document has changed, so each run
|
||||
// shuffles anew while Preview and OK agree.
|
||||
SORT => json!({
|
||||
"by": "area", "apply": "stacking", "order": "ascending", "distribute": false, "seed": st.revision % SEEDS, "scaleStrokes": strokes,
|
||||
}),
|
||||
// The first selected object's size, as the command measures it (a side it lacks: the least).
|
||||
_ => {
|
||||
let b = st.selection.objects.first().and_then(|id| app.session.transform_box(&[*id])).map_or((100.0, 100.0), |b| {
|
||||
@@ -76,7 +91,11 @@ pub(crate) const SPEC: DialogSpec = DialogSpec {
|
||||
confirm,
|
||||
preview: true,
|
||||
min_width: 320.0,
|
||||
ok_enabled: Some(|_, d| d.kind != SIZE || d.bool("__width") || d.bool("__height")),
|
||||
ok_enabled: Some(|_, d| match d.kind.as_str() {
|
||||
SIZE => d.bool("__width") || d.bool("__height"),
|
||||
OPACITY => d.f64("min", 0.0) <= d.f64("max", 100.0),
|
||||
_ => true,
|
||||
}),
|
||||
..DialogSpec::FORM
|
||||
};
|
||||
|
||||
@@ -126,6 +145,41 @@ fn body(app: &mut VectorcraftApp, ui: &mut Ui, d: &mut Dialog) -> bool {
|
||||
form::check(ui, d, "keep", tl!("Keep Original"));
|
||||
form::check(ui, d, "scaleStrokes", tl!("Scale Strokes & Effects"));
|
||||
}
|
||||
OPACITY => {
|
||||
for (key, label) in [("min", tl!("Minimum:")), ("max", tl!("Maximum:"))] {
|
||||
widgets::label_row(ui, label, LABEL_W, |ui| {
|
||||
if let Some(v) = widgets::range_field(ui, ("arrange", key), d.f64(key, 0.0), 0.0..=100.0, "%", 0, FIELD_W) {
|
||||
d.fields.insert(key.into(), json!(v));
|
||||
}
|
||||
});
|
||||
}
|
||||
widgets::label_row(ui, tl!("Seed:"), LABEL_W, |ui| {
|
||||
if let Some(v) = widgets::range_field(ui, ("arrange", "seed"), d.f64("seed", 0.0), 0.0..=(SEEDS - 1) as f64, "", 0, FIELD_W) {
|
||||
d.fields.insert("seed".into(), json!(v as u64));
|
||||
}
|
||||
});
|
||||
}
|
||||
SORT => {
|
||||
let attributes = [
|
||||
("width", "Width"),
|
||||
("height", "Height"),
|
||||
("area", "Area"),
|
||||
("x", "X Position"),
|
||||
("y", "Y Position"),
|
||||
("opacity", "Opacity"),
|
||||
("stacking", "Stacking Order"),
|
||||
];
|
||||
form::choice(ui, d, "by", tl!("Sort By:"), widths, &attributes);
|
||||
form::choice(ui, d, "apply", tl!("Apply To:"), widths, &attributes);
|
||||
let orders = [("ascending", "Small to Large"), ("descending", "Large to Small"), ("random", "Random")];
|
||||
form::choice(ui, d, "order", tl!("Order:"), widths, &orders);
|
||||
// Stacking order only trades places; only sizes scale strokes.
|
||||
let apply = d.str("apply");
|
||||
ui.add_enabled_ui(apply != "stacking", |ui| form::check(ui, d, "distribute", tl!("Distribute Evenly")));
|
||||
ui.add_enabled_ui(matches!(apply.as_str(), "width" | "height" | "area"), |ui| {
|
||||
form::check(ui, d, "scaleStrokes", tl!("Scale Strokes & Effects"));
|
||||
});
|
||||
}
|
||||
_ => {
|
||||
egui::Grid::new("arrange-size").num_columns(2).spacing([8.0, 6.0]).show(ui, |ui| {
|
||||
for (side, tick, label) in [("width", "__width", tl!("Width:")), ("height", "__height", tl!("Height:"))] {
|
||||
|
||||
@@ -2,7 +2,7 @@ use serde_json::json;
|
||||
use vectorcraft_doc::NodeId;
|
||||
use vectorcraft_engine::Session;
|
||||
|
||||
use super::{GRID, REPLACE, SIZE, ZOOM};
|
||||
use super::{GRID, OPACITY, REPLACE, SIZE, SORT, ZOOM};
|
||||
use crate::tests_labels::painted_text;
|
||||
use crate::{VectorcraftApp, menus};
|
||||
|
||||
@@ -41,6 +41,8 @@ fn the_plugins_submenu_lists_the_tools() {
|
||||
("Replace with Top Object…", "addon.arrange.replace"),
|
||||
("Set Size of Each…", "addon.arrange.size"),
|
||||
("Group Overlapping Objects", "addon.arrange.groupOverlapping"),
|
||||
("Randomize Opacity…", "addon.arrange.randomizeOpacity"),
|
||||
("Sort Objects…", "addon.arrange.sort"),
|
||||
("Zoom to Selection", ZOOM),
|
||||
] {
|
||||
assert_eq!(under(label).and_then(|e| e.command.as_deref()), Some(id), "{label}");
|
||||
@@ -139,3 +141,52 @@ fn group_overlapping_objects_runs_directly() {
|
||||
assert_eq!(doc.parent_of(c), Some(g), "a and c overlap: grouped");
|
||||
assert_ne!(doc.parent_of(b), Some(g), "b is left alone");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn randomize_opacity_opens_its_dialog_and_runs_on_ok() {
|
||||
let (mut app, a, b) = app();
|
||||
click(&mut app, "Randomize Opacity…");
|
||||
assert_eq!(app.ui.dialog.as_ref().map(|d| d.kind.as_str()), Some(OPACITY));
|
||||
let shown = painted_text(&mut app, |app, ui| crate::dialogs::show(app, ui.ctx()));
|
||||
for s in ["Randomize Opacity", "Minimum:", "Maximum:", "Seed:", "Preview"] {
|
||||
assert!(shown.contains(s), "{s} in {shown}");
|
||||
}
|
||||
let d = app.ui.dialog.as_mut().unwrap();
|
||||
assert_eq!((&d.fields["min"], &d.fields["max"]), (&json!(30), &json!(100)));
|
||||
// Minimum above maximum: OK is off.
|
||||
d.fields.insert("min".into(), json!(80));
|
||||
d.fields.insert("max".into(), json!(20));
|
||||
assert!(!(crate::addons::arrange::SPEC.ok_enabled.unwrap())(&app, app.ui.dialog.as_ref().unwrap()));
|
||||
let d = app.ui.dialog.as_mut().unwrap();
|
||||
d.fields.insert("min".into(), json!(40));
|
||||
d.fields.insert("max".into(), json!(60));
|
||||
let n = app.session.doc().unwrap().history.undo.len();
|
||||
crate::dialogs::confirm(&mut app).unwrap();
|
||||
assert!(app.ui.dialog.is_none());
|
||||
assert_eq!(app.session.doc().unwrap().history.undo.len(), n + 1);
|
||||
let doc = &app.session.doc().unwrap().doc;
|
||||
for id in [a, b] {
|
||||
assert!((0.4..=0.6).contains(&doc.node(id).unwrap().opacity), "{id:?}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sort_objects_opens_its_dialog_and_runs_on_ok() {
|
||||
let (mut app, a, b) = app();
|
||||
click(&mut app, "Sort Objects…");
|
||||
assert_eq!(app.ui.dialog.as_ref().map(|d| d.kind.as_str()), Some(SORT));
|
||||
let shown = painted_text(&mut app, |app, ui| crate::dialogs::show(app, ui.ctx()));
|
||||
for s in ["Sort Objects", "Sort By:", "Apply To:", "Order:", "Area", "Stacking Order", "Small to Large", "Distribute Evenly", "Preview"] {
|
||||
assert!(shown.contains(s), "{s} in {shown}");
|
||||
}
|
||||
let d = app.ui.dialog.as_mut().unwrap();
|
||||
assert_eq!((&d.fields["by"], &d.fields["apply"], &d.fields["order"]), (&json!("area"), &json!("stacking"), &json!("ascending")));
|
||||
// Large to small along x: b (the larger) takes the left edge 0, a the left edge 100.
|
||||
d.fields.insert("apply".into(), json!("x"));
|
||||
d.fields.insert("order".into(), json!("descending"));
|
||||
let n = app.session.doc().unwrap().history.undo.len();
|
||||
crate::dialogs::confirm(&mut app).unwrap();
|
||||
assert!(app.ui.dialog.is_none());
|
||||
assert_eq!(app.session.doc().unwrap().history.undo.len(), n + 1);
|
||||
assert_eq!((bounds(&app, b).x0, bounds(&app, a).x0), (0.0, 100.0));
|
||||
}
|
||||
|
||||
@@ -52,13 +52,18 @@ impl VectorcraftApp {
|
||||
Ok(r) => {
|
||||
let n = |k: &str| r[k].as_array().map_or(0, Vec::len);
|
||||
if n("updated") > 0 {
|
||||
self.status(format!("Updated {} linked file(s) changed on disk", n("updated")));
|
||||
self.status(crate::i18n::msg_n(
|
||||
n("updated") as u64,
|
||||
"Updated {n} linked file changed on disk",
|
||||
"Updated {n} linked files changed on disk",
|
||||
&[],
|
||||
));
|
||||
}
|
||||
if n("ask") > 0 {
|
||||
dialogs::missing_links::ask_update_changed(self, r["ask"].as_array().cloned().unwrap_or_default());
|
||||
}
|
||||
if n("modified") > 0 {
|
||||
self.status(format!("{} linked image(s) changed on disk: Update Links shows the new versions", n("modified")));
|
||||
self.status(dialogs::missing_links::changed_on_disk_status(n("modified")));
|
||||
}
|
||||
}
|
||||
Err(e) => self.status(e.to_string()),
|
||||
|
||||
@@ -293,7 +293,12 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
// decode, once per image in the process.
|
||||
let undecoded = vectorcraft_render::newly_undecodable(doc.images.values());
|
||||
if undecoded > 0 {
|
||||
app.status(format!("{undecoded} image(s) couldn't be decoded and show as crossed boxes"));
|
||||
app.status(crate::i18n::msg_n(
|
||||
undecoded as u64,
|
||||
"{n} image couldn't be decoded and shows as a crossed box",
|
||||
"{n} images couldn't be decoded and show as crossed boxes",
|
||||
&[],
|
||||
));
|
||||
}
|
||||
fill_uncovered(app, ui.ctx(), &painter, &key, &doc, rect, &xf);
|
||||
reproject_frame(app, &painter, &xf, rect, (key.doc, v.rotation));
|
||||
|
||||
@@ -120,13 +120,13 @@ pub(super) fn cursor_icon(c: Cursor) -> egui::CursorIcon {
|
||||
Cursor::Blend | Cursor::BlendObject | Cursor::BlendAnchor | Cursor::ShapeBuilder | Cursor::ShapeBuilderErase => C::Crosshair,
|
||||
Cursor::PencilClose | Cursor::PencilStraight | Cursor::PencilContinue | Cursor::PaintbrushClose => C::Crosshair,
|
||||
Cursor::TypeVertical => C::VerticalText,
|
||||
// The system has no tip outline to go round: its crosshair aims as well.
|
||||
Cursor::BlobBrush | Cursor::Eraser => C::Crosshair,
|
||||
// Not drawn yet: the cursor each borrows.
|
||||
Cursor::Lasso
|
||||
| Cursor::MagicWand
|
||||
| Cursor::Pencil
|
||||
| Cursor::Paintbrush
|
||||
| Cursor::BlobBrush
|
||||
| Cursor::Eraser
|
||||
| Cursor::Smooth
|
||||
| Cursor::PathEraser
|
||||
| Cursor::Join
|
||||
|
||||
@@ -2015,7 +2015,7 @@ fn undecodable_images_are_marked_and_reported_once() {
|
||||
app.status("");
|
||||
frame(&mut app, &ctx, vec![]);
|
||||
assert!(app.canvas.shown.as_ref().is_some_and(|(_, o)| o.mark_undecoded_images), "the canvas marks them");
|
||||
assert_eq!(app.ui.status, "2 image(s) couldn't be decoded and show as crossed boxes");
|
||||
assert_eq!(app.ui.status, "2 images couldn't be decoded and show as crossed boxes");
|
||||
app.status("");
|
||||
app.session.doc_mut().unwrap().revision += 1;
|
||||
frame(&mut app, &ctx, vec![]);
|
||||
|
||||
@@ -554,6 +554,11 @@ fn glyph(c: Cursor, p: Pos2) -> Option<Vec<Shape>> {
|
||||
double_arrow(ink, p + vec2(15.0, 18.0), vec2(1.0, 0.0));
|
||||
}
|
||||
Cursor::Crosshair => crosshair(ink, p),
|
||||
// Only the centre: the tool draws the tip's outline round it, at the zoom.
|
||||
Cursor::BlobBrush | Cursor::Eraser => {
|
||||
ink.circle_filled(p, 2.5, HALO);
|
||||
ink.circle_filled(p, 1.25, INK);
|
||||
}
|
||||
// The Pencil's crosshair with the Pen's star where the closing ring goes.
|
||||
Cursor::PencilNew => {
|
||||
crosshair(ink, p);
|
||||
|
||||
@@ -400,7 +400,7 @@ registry! {
|
||||
RearrangeArtboards: [rearrange_artboards::KIND] => rearrange_artboards::SPEC,
|
||||
PathToolOptions: [crate::addons::pathtools::KIND] => crate::addons::pathtools::OPTIONS_SPEC,
|
||||
DivideDashes: [crate::addons::pathtools::dashes::KIND] => crate::addons::pathtools::dashes::SPEC,
|
||||
ArrangeTools: [crate::addons::arrange::GRID, crate::addons::arrange::REPLACE, crate::addons::arrange::SIZE] => crate::addons::arrange::SPEC,
|
||||
ArrangeTools: [crate::addons::arrange::GRID, crate::addons::arrange::REPLACE, crate::addons::arrange::SIZE, crate::addons::arrange::OPACITY, crate::addons::arrange::SORT] => crate::addons::arrange::SPEC,
|
||||
ShortcutImport: [shortcut_import::KIND] => DialogSpec::window(shortcut_import::show, shortcut_import::confirm),
|
||||
}
|
||||
|
||||
|
||||
@@ -372,9 +372,14 @@ fn confirm(app: &mut VectorcraftApp, d: &Dialog) -> Result<Value, String> {
|
||||
match failed.first() {
|
||||
Some(f) => {
|
||||
let (name, reason) = (f["name"].as_str().unwrap_or_default(), f["error"].as_str().unwrap_or_default());
|
||||
app.status(format!("Relinked {n} image(s); {name} couldn't be relinked: {reason}"));
|
||||
app.status(crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"Relinked {n} image; {name} couldn't be relinked: {reason}",
|
||||
"Relinked {n} images; {name} couldn't be relinked: {reason}",
|
||||
&[("name", name), ("reason", reason)],
|
||||
));
|
||||
}
|
||||
None if n > 0 => app.status(format!("Relinked {n} image(s)")),
|
||||
None if n > 0 => app.status(crate::panels::links::relinked_status(n)),
|
||||
None => {}
|
||||
}
|
||||
if d.bool("back") {
|
||||
|
||||
@@ -119,7 +119,7 @@ fn find_in_folder_relinks_the_missing_files_to_the_files_found() {
|
||||
}
|
||||
super::super::confirm(&mut app).unwrap();
|
||||
assert!(app.ui.dialog.is_none());
|
||||
assert_eq!(app.ui.status, "Relinked 2 image(s)");
|
||||
assert_eq!(app.ui.status, "Relinked 2 images");
|
||||
assert_eq!(app.run("links.check", json!({})).unwrap()["missing"], 0);
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ fn files_not_relinked_go_back_to_linked_file_not_found() {
|
||||
assert_eq!((pick(d, "b.png"), pick(d, "c.png")), (&json!(at(&root, "found/b.png")), &Value::Null));
|
||||
assert!(frame(&mut app).contains("Not found"));
|
||||
super::super::confirm(&mut app).unwrap();
|
||||
assert!(app.ui.status.starts_with("Relinked 1 image(s); b.png couldn't be relinked: "), "{}", app.ui.status);
|
||||
assert!(app.ui.status.starts_with("Relinked 1 image; b.png couldn't be relinked: "), "{}", app.ui.status);
|
||||
let d = app.ui.dialog.as_ref().expect("Linked File Not Found again");
|
||||
let names: Vec<&str> = d.fields["missing"].as_array().unwrap().iter().map(|r| r["name"].as_str().unwrap()).collect();
|
||||
assert_eq!((d.kind.as_str(), names.len()), (super::super::missing_links::KIND, 2));
|
||||
|
||||
@@ -54,7 +54,12 @@ fn after_open_for(app: &mut VectorcraftApp, r: &Value, web: bool) {
|
||||
if web {
|
||||
let n = vectorcraft_engine::cmd::fontfiles::missing_fonts(&st.doc).len();
|
||||
if n > 0 && r["warnings"].as_array().is_none_or(Vec::is_empty) {
|
||||
app.status(format!("{n} font(s) aren't available here: their text shows in another font"));
|
||||
app.status(crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"{n} font isn't available here: its text shows in another font",
|
||||
"{n} fonts aren't available here: their text shows in another font",
|
||||
&[],
|
||||
));
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -399,13 +404,20 @@ fn add_fonts(app: &mut VectorcraftApp, d: &Dialog) -> Result<Value, String> {
|
||||
let n = len("copied") + len("kept");
|
||||
let folder = r["folder"].as_str().unwrap_or_default();
|
||||
match r["skipped"].as_array().and_then(|s| s.first()) {
|
||||
None => app.status(format!("{n} font file(s) are now in {folder}")),
|
||||
None => {
|
||||
app.status(crate::i18n::msg_n(n as u64, "{n} font file is now in {folder}", "{n} font files are now in {folder}", &[("folder", folder)]))
|
||||
}
|
||||
Some(first) => {
|
||||
let failed = len("skipped");
|
||||
let file =
|
||||
first["file"].as_str().map(std::path::Path::new).and_then(std::path::Path::file_name).map(|f| f.to_string_lossy().into_owned());
|
||||
let reason = format!("{}: {}", file.unwrap_or_default(), first["reason"].as_str().unwrap_or_default());
|
||||
app.status(format!("{n} font file(s) are now in {folder}; {failed} couldn't be added: {reason}"));
|
||||
app.status(crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"{n} font file is now in {folder}; {failed} couldn't be added: {reason}",
|
||||
"{n} font files are now in {folder}; {failed} couldn't be added: {reason}",
|
||||
&[("failed", &failed.to_string()), ("folder", folder), ("reason", &reason)],
|
||||
));
|
||||
}
|
||||
}
|
||||
Ok(r)
|
||||
|
||||
@@ -357,7 +357,7 @@ fn the_web_says_how_many_fonts_are_missing() {
|
||||
app.run("file.new", json!({"width": 400, "height": 300})).unwrap();
|
||||
app.run("text.create", json!({"x": 10, "y": 40, "text": "Gone", "font": "No Such Font Family"})).unwrap();
|
||||
after_open_for(&mut app, &json!({}), true);
|
||||
assert_eq!(app.ui.status, "1 font(s) aren't available here: their text shows in another font");
|
||||
assert_eq!(app.ui.status, "1 font isn't available here: its text shows in another font");
|
||||
assert!(app.ui.pending_fonts.is_empty());
|
||||
// The open's notes stay on show.
|
||||
app.ui.status = "Opened with 1 note(s): fonts".into();
|
||||
|
||||
@@ -49,7 +49,12 @@ pub fn after_open(app: &mut VectorcraftApp, r: &Value) {
|
||||
let (missing, modified) = (rows("missingLinks"), ids(&rows("modifiedLinks")));
|
||||
if missing.is_empty() || cfg!(target_arch = "wasm32") {
|
||||
if !missing.is_empty() {
|
||||
app.status(format!("{} linked file(s) can't be read here: their previews show", missing.len()));
|
||||
app.status(crate::i18n::msg_n(
|
||||
missing.len() as u64,
|
||||
"{n} linked file can't be read here: its preview shows",
|
||||
"{n} linked files can't be read here: their previews show",
|
||||
&[],
|
||||
));
|
||||
}
|
||||
ask_update(app, modified);
|
||||
} else {
|
||||
@@ -96,13 +101,23 @@ fn ask(app: &mut VectorcraftApp, ids: Vec<Value>, one: &str, other: &str) {
|
||||
return;
|
||||
}
|
||||
if app.session.prefs.update_links != "askWhenModified" {
|
||||
app.status(format!("{} linked image(s) changed on disk: Update Links shows the new versions", ids.len()));
|
||||
app.status(changed_on_disk_status(ids.len()));
|
||||
return;
|
||||
}
|
||||
let detail = crate::i18n::tn(ids.len() as u64, one, other);
|
||||
super::confirm::ask(app, tl!("Update Modified Links"), &detail, "links.update", json!({ "ids": ids }));
|
||||
}
|
||||
|
||||
/// The status bar's line for `n` linked images that changed on disk while Update Links doesn't ask.
|
||||
pub(crate) fn changed_on_disk_status(n: usize) -> String {
|
||||
crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"{n} linked image changed on disk: Update Links shows the new version",
|
||||
"{n} linked images changed on disk: Update Links shows the new versions",
|
||||
&[],
|
||||
)
|
||||
}
|
||||
|
||||
fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool {
|
||||
let t = Tokens::get(ui.ctx());
|
||||
let missing = d.fields.get("missing").and_then(Value::as_array).map_or(&[][..], Vec::as_slice);
|
||||
|
||||
@@ -150,7 +150,7 @@ pub(crate) fn save(app: &mut VectorcraftApp, mut p: Value) -> Result<Value, Stri
|
||||
}
|
||||
match names.first().and_then(Value::as_str).filter(|_| has_warnings(&r)) {
|
||||
Some(first) => io::report_saved(app, first, &r),
|
||||
None => app.status(format!("Downloaded {} file(s)", names.len())),
|
||||
None => app.status(crate::i18n::msg_n(names.len() as u64, "Downloaded {n} file", "Downloaded {n} files", &[])),
|
||||
}
|
||||
return Ok(json!({ "files": names, "bytes": r["bytes"], "warnings": r["warnings"] }));
|
||||
}
|
||||
|
||||
@@ -20,7 +20,14 @@ pub const KIND: &str = "deleteSymbol";
|
||||
pub const USED: &str = "deleteUsedSymbol";
|
||||
|
||||
pub(super) const SPEC: DialogSpec = DialogSpec {
|
||||
heading: |_| tl!("Delete the selected symbol?").into(),
|
||||
heading: |d| {
|
||||
if d.fields.get("names").and_then(Value::as_array).is_some_and(|n| n.len() > 1) {
|
||||
tl!("Delete the selected symbols?")
|
||||
} else {
|
||||
tl!("Delete the selected symbol?")
|
||||
}
|
||||
.into()
|
||||
},
|
||||
body: |_, _, _| false,
|
||||
confirm: confirm_unused,
|
||||
ok: Some("Yes"),
|
||||
@@ -55,6 +62,37 @@ pub(crate) fn ask(app: &mut VectorcraftApp, name: &str, now: bool) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete Symbol for the unused symbols `names` that Select All Unused picked (#4918): asked once
|
||||
/// ("Delete the selected symbols?", or the singular for one), or at once with `now`. Only those still
|
||||
/// unused then (`symbol.unused`: brush art, patterns and nested instances count) go, in one undo step.
|
||||
pub(crate) fn ask_many(app: &mut VectorcraftApp, names: &[String], now: bool) {
|
||||
let Some(uid) = app.session.active().map(|st| st.uid) else { return };
|
||||
if now {
|
||||
// An error already went to the status bar.
|
||||
let _ = delete_unused(app, uid, names);
|
||||
} else {
|
||||
app.ui.dialog = Some(Dialog::new(KIND, json!({ "names": names, "doc": uid })));
|
||||
}
|
||||
}
|
||||
|
||||
/// Deletes those of `names` that are still unused in document `uid` while it is the active one.
|
||||
fn delete_unused(app: &mut VectorcraftApp, uid: u64, names: &[String]) -> DialogResult {
|
||||
if app.session.active().map(|st| st.uid) != Some(uid) {
|
||||
return Ok(Value::Null);
|
||||
}
|
||||
let unused: Vec<String> =
|
||||
app.run("symbol.unused", json!({})).ok().and_then(|r| serde_json::from_value(r["names"].clone()).ok()).unwrap_or_default();
|
||||
let names: Vec<&String> = names.iter().filter(|n| unused.contains(n)).collect();
|
||||
if names.is_empty() {
|
||||
return Ok(Value::Null);
|
||||
}
|
||||
let r = app.run("symbol.delete", json!({ "names": names }));
|
||||
if let Err(e) = &r {
|
||||
app.status(e.clone());
|
||||
}
|
||||
r
|
||||
}
|
||||
|
||||
fn open(app: &mut VectorcraftApp, kind: &str, name: &str, uid: u64) {
|
||||
app.ui.dialog = Some(Dialog::new(kind, json!({ "name": name, "doc": uid })));
|
||||
}
|
||||
@@ -78,6 +116,9 @@ fn target(d: &Dialog) -> (u64, String) {
|
||||
fn confirm_unused(app: &mut VectorcraftApp, d: &Dialog) -> DialogResult {
|
||||
app.ui.dialog = None;
|
||||
let (uid, name) = target(d);
|
||||
if let Some(names) = d.fields.get("names").and_then(|v| serde_json::from_value::<Vec<String>>(v.clone()).ok()) {
|
||||
return delete_unused(app, uid, &names);
|
||||
}
|
||||
match instances(app, uid, &name) {
|
||||
None => Ok(Value::Null),
|
||||
Some(0) => app.run("symbol.delete", json!({ "name": name })),
|
||||
@@ -98,3 +139,19 @@ fn confirm_used(app: &mut VectorcraftApp, d: &Dialog) -> DialogResult {
|
||||
}
|
||||
app.run("symbol.delete", json!({ "name": name, "expandInstances": !d.bool("discard") }))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
/// The question for the symbols Select All Unused picked is plural (#4918).
|
||||
#[test]
|
||||
fn several_symbols_get_the_plural_question() {
|
||||
let one = Dialog::new(KIND, json!({"name": "A", "doc": 1}));
|
||||
let many = Dialog::new(KIND, json!({"names": ["A", "B"], "doc": 1}));
|
||||
assert_eq!((SPEC.heading)(&one), "Delete the selected symbol?");
|
||||
assert_eq!((SPEC.heading)(&many), "Delete the selected symbols?");
|
||||
let picked_one = Dialog::new(KIND, json!({"names": ["A"], "doc": 1}));
|
||||
assert_eq!((SPEC.heading)(&picked_one), "Delete the selected symbol?");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,7 +388,7 @@ fn an_export_made_at_once_waits_for_one_in_the_background() {
|
||||
release.join().unwrap();
|
||||
let file = format!("{folder}/Artboard-1.svg");
|
||||
assert_eq!((written(&files), r["files"].clone()), (vec![file.clone()], json!([file])));
|
||||
assert_eq!(app.ui.status, format!("Exported 1 file(s) to {folder}"));
|
||||
assert_eq!(app.ui.status, format!("Exported 1 file to {folder}"));
|
||||
let _ = std::fs::remove_dir_all(&dir);
|
||||
}
|
||||
|
||||
@@ -489,7 +489,7 @@ fn the_status_bar_says_when_an_image_could_not_be_decoded() {
|
||||
let folder = dir.to_string_lossy().replace('\\', "/");
|
||||
let (mut desktop, log) = app(1, false);
|
||||
desktop.run("file.exportForScreens", json!({"folder": folder, "formats": rows})).unwrap();
|
||||
assert_eq!(desktop.ui.status, format!("Exported 2 file(s) to {folder}"));
|
||||
assert_eq!(desktop.ui.status, format!("Exported 2 files to {folder}"));
|
||||
place(&mut desktop);
|
||||
desktop.run("file.exportForScreens", json!({"folder": folder, "formats": rows, "openLocation": true})).unwrap();
|
||||
assert_eq!(desktop.ui.status, format!("Saved {folder} {NOTE}"));
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
//! rows hold whole messages or templates such as `Couldn't open {name}: {e}`, and the values in
|
||||
//! the placeholders are translated in turn (the reason after `: {e}` is often a message too).
|
||||
//! A `@msgplural` row is a template with a count: its source holds the English `one|other`
|
||||
//! forms, its translation the language's plural forms, and the `{n}` value picks the form.
|
||||
//! forms, its translation the language's plural forms, and the `{n}` value picks the form;
|
||||
//! [`msg_n`] writes such a message in English.
|
||||
|
||||
mod catalog;
|
||||
|
||||
@@ -660,7 +661,31 @@ fn message_at(lang: Lang, s: &str, depth: usize) -> String {
|
||||
let values: Vec<(&str, String)> =
|
||||
caps.into_iter().map(|(k, v)| (k, if depth > 1 { message_at(lang, v, depth - 1) } else { v.to_string() })).collect();
|
||||
let args: Vec<(&str, &str)> = values.iter().map(|(k, v)| (*k, v.as_str())).collect();
|
||||
fmt(template, &args)
|
||||
fill_once(template, &args)
|
||||
}
|
||||
|
||||
/// Fill `{name}` placeholders in one pass: a value that holds `{name}` text stays as it is.
|
||||
/// Unknown placeholders are left as written.
|
||||
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('{') {
|
||||
out.push_str(&rest[..open]);
|
||||
let after = &rest[open + 1..];
|
||||
let filled = after.find('}').and_then(|close| args.iter().find(|(k, _)| *k == &after[..close]).map(|(_, v)| (*v, close)));
|
||||
match filled {
|
||||
Some((value, close)) => {
|
||||
out.push_str(value);
|
||||
rest = &after[close + 1..];
|
||||
}
|
||||
None => {
|
||||
out.push('{');
|
||||
rest = after;
|
||||
}
|
||||
}
|
||||
}
|
||||
out.push_str(rest);
|
||||
out
|
||||
}
|
||||
|
||||
/// [`message`] in the current language, remembering the last answer: the status bar asks for the
|
||||
@@ -685,6 +710,16 @@ pub fn tn(n: u64, one: &str, other: &str) -> String {
|
||||
trn(current(), n, one, other)
|
||||
}
|
||||
|
||||
/// A status or error message with a count, in English: `one` for a count of 1, else `other`, with
|
||||
/// `{n}` and the `args` placeholders filled in one pass, so a value that holds `{name}` text stays
|
||||
/// as it is. Unknown placeholders are left as written. The message stays English, and [`msg`]
|
||||
/// shows it in the interface language through the catalogs' `@msgplural` rows.
|
||||
pub fn msg_n(n: u64, one: &str, other: &str, args: &[(&str, &str)]) -> String {
|
||||
let count = n.to_string();
|
||||
let all: Vec<(&str, &str)> = std::iter::once(("n", count.as_str())).chain(args.iter().copied()).collect();
|
||||
fill_once(if n == 1 { one } else { other }, &all)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
|
||||
@@ -740,6 +740,9 @@ font-technology Variable Променливи
|
||||
Delete Swatch Изтриване на образец
|
||||
Delete Symbol Изтриване на символ
|
||||
Delete the selected symbol? Да се изтрие ли избраният символ?
|
||||
Delete the selected symbols? Да се изтрият ли избраните символи?
|
||||
No unused symbols Няма неизползвани символи
|
||||
Delete Symbols Изтриване на символи
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Един или повече от символите се използват и не могат да бъдат изтрити, докато екземплярите им не бъдат разширени или изтрити.
|
||||
Expand Instances Разширяване на екземплярите
|
||||
Delete Instances Изтриване на екземплярите
|
||||
@@ -2420,6 +2423,7 @@ digits Tamil Тамилски
|
||||
digits Telugu Телугу
|
||||
digits Kannada Каннада
|
||||
digits Malayalam Малаялам
|
||||
Proportional Lining Пропорционални подравнени цифри
|
||||
Proportional Oldstyle Пропорционални стари цифри
|
||||
Pucker & Bloat… Свиване и раздуване…
|
||||
Pucker Tool Инструмент „Свиване“
|
||||
@@ -3207,6 +3211,7 @@ digits Malayalam Малаялам
|
||||
Swap Fill and Stroke (Shift+X) Размяна на запълването и щриха (Shift+X)
|
||||
Swap start and end arrowheads Размяна на началната и крайната стрелка
|
||||
Swap the selected object for the file, keeping its place and transform Замяна на избрания обект с файла, като се запазват мястото и трансформациите му
|
||||
Stylistic Alternates Стилистични алтернативи
|
||||
Swash Декоративен елемент
|
||||
Swatch Conflict Конфликт на образци
|
||||
Swatch Conflicts Конфликти на образци
|
||||
@@ -3276,6 +3281,7 @@ digits Malayalam Малаялам
|
||||
Tabs Табулатори
|
||||
Tabular Lining Таблични подравнени цифри
|
||||
Tabular Oldstyle Таблични стари цифри
|
||||
Titling Alternates Алтернативи за заглавия
|
||||
Target Цел
|
||||
Target Contents Целево съдържание
|
||||
Target: Цел:
|
||||
@@ -3806,7 +3812,6 @@ axis Both И двете
|
||||
@msg Combine Slices: the slices have no bounds Обединяване на парчета: парчетата нямат граници
|
||||
@msg Convert to Artboards: selection has no area Преобразуване в работни области: селекцията няма площ
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Преобразуване в фигура: няма избрани правоъгълници или елипси
|
||||
@msg Copied the CSS of {rules} object(s) Копиран е CSS кодът на {rules} обект(а)
|
||||
@msg Copied the script report Копиран е отчетът за скрипта
|
||||
@msg Corners edits the corners of a path Ъглите редактират ъглите на пътя
|
||||
@msg Couldn't copy to the system clipboard: {e} Неуспешно копиране в системния клипборд: {e}
|
||||
@@ -3823,13 +3828,11 @@ axis Both И двете
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) директно избиране на опорни точки за рязане (не крайните точки на отворени пътища)
|
||||
@msg Divide Objects Below: select a path Разделяне на обектите отдолу: изберете път
|
||||
@msg Divide Objects Below: select exactly one path Разделяне на обектите отдолу: изберете точно един път
|
||||
@msg Downloaded {_1} file(s) Изтеглени файлове: {_1}
|
||||
@msg Downloaded {what} Изтеглено: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Разширяване на облика: селекцията има основен облик
|
||||
@msg Expand: no brush strokes selected Разширяване: няма избрани щрихи на четка
|
||||
@msg Expand: no gradient fills Разширяване: няма запълвания с градиент
|
||||
@msg Expand: nothing to expand Разширяване: няма нищо за разширяване
|
||||
@msg Exported {count} file(s) to {folder} Експортирани са {count} файла в {folder}
|
||||
@msg Exported {path} Експортирано: {path}
|
||||
@msg Flatten Transparency: select objects to flatten Сплескване на прозрачността: изберете обекти за сплескване
|
||||
@msg Flatten Transparency: {e} Сплескване на прозрачността: {e}
|
||||
@@ -4355,10 +4358,6 @@ axis Both И двете
|
||||
@msg {_1} is a live effect (Effect › Plug-ins) {_1} е динамичен ефект (Ефект › Добавки)
|
||||
@msg {_1} is already used by {_2} {_1} вече се използва от {_2}
|
||||
@msg {_1} is reserved by the system {_1} е запазено от системата
|
||||
@msg {_1} linked file(s) can't be read here: their previews show свързаните файлове {_1} не могат да бъдат прочетени тук: показват се техните прегледи
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes изображенията ({undecoded}) не могат да бъдат декодирани: показват се като зачеркнати рамки
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions свързаните изображения {_1} са променени на диска: „Обновяване на връзките“ показва новите версии
|
||||
@msg Updated {_1} linked file(s) changed on disk Обновени са свързани файлове {_1}, променени на диска
|
||||
@msg {_1}: not saved, so not closed {_1}: не е запазен, затова не е затворен
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-битови битови масиви не могат да бъдат прочетени
|
||||
@msg {command} didn't create an object {command} не създаде обект
|
||||
@@ -4378,7 +4377,6 @@ axis Both И двете
|
||||
@msg Couldn't place {name}: {e} Неуспешно поставяне на {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Неуспешно поставяне от клипборда: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} е запазен с {_1} бележка/и: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} е експортиран с {_1} бележка/и: {first}
|
||||
@msg Exported {what} Експортирано: {what}
|
||||
@msg Saved {n} files beside {path} Записани са {n} файла до {path}
|
||||
@msg Saving Запазване
|
||||
@@ -4389,12 +4387,26 @@ axis Both И двете
|
||||
@msg Saving recovery data for {_1} Записване на данни за възстановяване на {_1}
|
||||
@msg Discarded {_1} recovered document(s) Изхвърлени са {_1} възстановени документ(и)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Възстановени са {_1} документ(и): запазете ги, за да ги съхраните
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Вградени са {n} изображения; {missing} липсват: първо ги свържете наново
|
||||
@msg Embedded {n} image(s) Вградени са {n} изображения
|
||||
@msg Relinked {_1} image(s) Презакачени са {_1} изображения
|
||||
@msg Relinked {n} image(s) Свързани наново {n} изображения
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Презакачени са {n} изображения; липсват в тази папка: {_1}
|
||||
@msg Updated {_1} image(s) Обновени са {_1} изображения
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Вградено е {n} изображение; {missing} липсват: първо ги свържете наново|Вградени са {n} изображения; {missing} липсват: първо ги свържете наново
|
||||
@msgplural Embedded {n} image|Embedded {n} images Вградено е {n} изображение|Вградени са {n} изображения
|
||||
@msgplural Relinked {n} image|Relinked {n} images Свързано наново е {n} изображение|Свързани наново са {n} изображения
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Свързано наново е {n} изображение; липсват в тази папка: {names}|Свързани наново са {n} изображения; липсват в тази папка: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Свързано наново е {n} изображение; {name} не можа да бъде свързан наново: {reason}|Свързани наново са {n} изображения; {name} не можа да бъде свързан наново: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Обновено е {n} изображение|Обновени са {n} изображения
|
||||
@msgplural Replaced {n} image|Replaced {n} images Заменено е {n} изображение|Заменени са {n} изображения
|
||||
@msgplural Broke {n} link|Broke {n} links Разкъсана е {n} връзка|Разкъсани са {n} връзки
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Разкъсана е {n} връзка; {missing} не могат да бъдат прочетени: първо ги свържете наново или ги обновете|Разкъсани са {n} връзки; {missing} не могат да бъдат прочетени: първо ги свържете наново или ги обновете
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} свързан файл не може да бъде прочетен тук: показва се неговият преглед|{n} свързани файла не могат да бъдат прочетени тук: показват се техните прегледи
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} изображение не може да бъде декодирано: показва се като зачеркната рамка|{n} изображения не могат да бъдат декодирани: показват се като зачеркнати рамки
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} свързано изображение е променено на диска: „Обновяване на връзките“ показва новата версия|{n} свързани изображения са променени на диска: „Обновяване на връзките“ показва новите версии
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Обновен е {n} свързан файл, променен на диска|Обновени са {n} свързани файла, променени на диска
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} е експортиран с {n} бележка: {first}|{what} е експортиран с {n} бележки: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} шрифтов файл вече е в {folder}|{n} шрифтови файла вече са в {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} шрифтов файл вече е в {folder}; {failed} не можаха да бъдат добавени: {reason}|{n} шрифтови файла вече са в {folder}; {failed} не можаха да бъдат добавени: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} шрифт не е достъпен тук: текстът му се показва в друг шрифт|{n} шрифта не са достъпни тук: техният текст се показва в друг шрифт
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Копиран е CSS кодът на {n} обект|Копиран е CSS кодът на {n} обекта
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Изтеглен е {n} файл|Изтеглени са {n} файла
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Експортиран е {n} файл в {folder}|Експортирани са {n} файла в {folder}
|
||||
@msg Unembedded to {_1} Извадено от вграждане в {_1}
|
||||
@msg Reset {_1} Нулирано: {_1}
|
||||
@msg Sent to {_1} Изпратено към {_1}
|
||||
@@ -4446,9 +4458,6 @@ axis Both И двете
|
||||
@msg every search thread stopped on an internal error (please report this bug) всяка нишка за търсене спря поради вътрешна грешка (моля, докладвайте този бъг)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it Папката със шрифтове на VectorCraft не е зададена тук: десктоп приложението и vectorcraft-cli я задават
|
||||
@msg choose the font files to add изберете шрифтовите файлове за добавяне
|
||||
@msg {n} font file(s) are now in {folder} {n} шрифтов(и) файл(а) вече са в {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} шрифтов(и) файл(а) вече са в {folder}; {failed} не можаха да бъдат добавени: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} шрифт(а) не са достъпни тук: техният текст се показва в друг шрифт
|
||||
@msg not a file не е файл
|
||||
@msg not a font file не е шрифтов файл
|
||||
@msg that document is no longer open този документ вече не е отворен
|
||||
@@ -4457,7 +4466,6 @@ axis Both И двете
|
||||
@msg every numbered name for it is taken in the Fonts folder всяко номерирано име за него е заето в папката със шрифтове
|
||||
@msg every numbered name for {name} is taken in the document's folder всяко номерирано име за {name} е заето в папката на документа
|
||||
@msg No linked files to look for Няма свързани файлове за търсене
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Превързани са {n} изображения; {name} не можа да бъде превързан: {reason}
|
||||
Services Услуги
|
||||
Hide VectorCraft Скриване на VectorCraft
|
||||
Zoom Мащабиране
|
||||
@@ -5995,3 +6003,22 @@ breakText Glyphs Глифи
|
||||
Text Flow Поток на текста
|
||||
By Rows По редове
|
||||
By Columns По колони
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Произволна непрозрачност…
|
||||
Randomize Opacity Произволна непрозрачност
|
||||
Minimum: Минимум:
|
||||
Maximum: Максимум:
|
||||
Seed: Начално число:
|
||||
@msg `min` is greater than `max` `min` е по-голямо от `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Сортиране на обекти…
|
||||
Sort Objects Сортиране на обекти
|
||||
Sort By: Сортиране по:
|
||||
Apply To: Прилагане към:
|
||||
Area Площ
|
||||
X Position Позиция по X
|
||||
Y Position Позиция по Y
|
||||
Stacking Order Ред на подреждане
|
||||
Small to Large От малко към голямо
|
||||
Large to Small От голямо към малко
|
||||
Distribute Evenly Равномерно разпределение
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -664,7 +664,6 @@
|
||||
Links Veze
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? Povezanih slika promijenjenih na disku: {n}. Prikazati nove verzije?|Povezanih slika promijenjenih na disku: {n}. Prikazati nove verzije?|Povezanih slika promijenjenih na disku: {n}. Prikazati nove verzije?
|
||||
Update Changed Links Ažuriraj promijenjene veze
|
||||
@msg Updated {_1} linked file(s) changed on disk Ažurirano povezanih datoteka promijenjenih na disku: {_1}
|
||||
Magic Wand Čarobni štapić
|
||||
Navigator Navigator
|
||||
Pattern Options Opcije uzorka
|
||||
@@ -1780,13 +1779,16 @@ digits Malayalam Malajalam
|
||||
Fractions Razlomci
|
||||
Ligatures are off while the text is tracked. Ligature su isključene dok tekst ima razmak slova.
|
||||
Ordinals Redni brojevi
|
||||
Proportional Lining Proporcionalne brojke
|
||||
Proportional Oldstyle Proporcionalne stare brojke
|
||||
Reset OpenType Features Vrati OpenType mogućnosti na početno
|
||||
Select text to set its OpenType features. Odaberite tekst da postavite njegove OpenType mogućnosti.
|
||||
Standard Ligatures Standardne ligature
|
||||
Stylistic Alternates Stilske alternative
|
||||
Swash Ukrasni potez
|
||||
Tabular Lining Tabelarne brojke
|
||||
Tabular Oldstyle Tabelarne stare brojke
|
||||
Titling Alternates Alternative za naslove
|
||||
Every-line Composer Slagač svih redova
|
||||
First-line Left Indent Lijeva uvlaka prvog reda
|
||||
Hyphenation… Rastavljanje riječi…
|
||||
@@ -3070,6 +3072,9 @@ theme Appearance Izgled
|
||||
Delete Brush Izbriši četkicu
|
||||
Delete Symbol Izbriši simbol
|
||||
Delete the selected symbol? Izbrisati odabrani simbol?
|
||||
Delete the selected symbols? Izbrisati odabrane simbole?
|
||||
No unused symbols Nema nekorištenih simbola
|
||||
Delete Symbols Brisanje simbola
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Jedan ili više simbola se koriste i ne mogu se izbrisati dok se njihove instance ne prošire ili izbrišu.
|
||||
Expand Instances Proširi instance
|
||||
Delete Instances Izbriši instance
|
||||
@@ -4172,7 +4177,6 @@ imageTrace Outline Obris
|
||||
@msg Combine Slices: the slices have no bounds Kombinuj isječke: isječci nemaju granice
|
||||
@msg Convert to Artboards: selection has no area Pretvori u radne ploče: odabir nema površinu
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Pretvori u oblik: nisu odabrani pravougaonici ni elipse
|
||||
@msg Copied the CSS of {rules} object(s) Kopiran CSS objekata: {rules}
|
||||
@msg Copied the script report Izvještaj skripte kopiran
|
||||
@msg Corners edits the corners of a path Uglovi uređuje uglove putanje
|
||||
@msg Couldn't copy to the system clipboard: {e} Nije moguće kopirati u sistemski međuspremnik: {e}
|
||||
@@ -4189,13 +4193,11 @@ imageTrace Outline Obris
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) direktno odaberite sidrene tačke za presijecanje (ne krajnje tačke otvorenih putanja)
|
||||
@msg Divide Objects Below: select a path Podijeli objekte ispod: odaberite putanju
|
||||
@msg Divide Objects Below: select exactly one path Podijeli objekte ispod: odaberite tačno jednu putanju
|
||||
@msg Downloaded {_1} file(s) Preuzeto datoteka: {_1}
|
||||
@msg Downloaded {what} Preuzeto: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Proširi izgled: odabir ima osnovni izgled
|
||||
@msg Expand: no brush strokes selected Proširi: nisu odabrani potezi četkicom
|
||||
@msg Expand: no gradient fills Proširi: nema gradijentnih ispuna
|
||||
@msg Expand: nothing to expand Proširi: nema ničeg za proširivanje
|
||||
@msg Exported {count} file(s) to {folder} Izvezeno datoteka u {folder}: {count}
|
||||
@msg Exported {path} Izvezeno: {path}
|
||||
@msg Flatten Transparency: select objects to flatten Spljošti prozirnost: odaberite objekte za spljoštavanje
|
||||
@msg Flatten Transparency: {e} Spljošti prozirnost: {e}
|
||||
@@ -4752,9 +4754,6 @@ imageTrace Outline Obris
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` ima {size} bajtova (ograničenje {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} već koristi {_2}
|
||||
@msg {_1} is reserved by the system {_1} je rezervisano od strane sistema
|
||||
@msg {_1} linked file(s) can't be read here: their previews show Povezane datoteke koje se ovdje ne mogu pročitati: {_1}; prikazuju se njihovi pregledi
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes Slike koje nije moguće dekodirati prikazuju se kao prekriženi okviri ({undecoded})
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions Povezane slike promijenjene na disku: {_1}; Ažuriraj veze prikazuje nove verzije
|
||||
@msg {_1}: not saved, so not closed {_1}: nije sačuvano, pa nije zatvoreno
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-bitne bitmape ne mogu se pročitati
|
||||
@msg {command} didn't create an object {command} nije kreirala objekat
|
||||
@@ -4774,7 +4773,6 @@ imageTrace Outline Obris
|
||||
@msg Couldn't place {name}: {e} Nije moguće postaviti {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Nije moguće zalijepiti iz međuspremnika: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Sačuvano {path} s bilješkama ({_1}): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Izvezeno {what} s bilješkama ({_1}): {first}
|
||||
@msg Exported {what} Izvezeno: {what}
|
||||
@msg Saved {n} files beside {path} Sačuvano datoteka pored {path}: {n}
|
||||
@msg Saving Čuvanje
|
||||
@@ -4785,12 +4783,26 @@ imageTrace Outline Obris
|
||||
@msg Saving recovery data for {_1} Čuvanje podataka za oporavak za {_1}
|
||||
@msg Discarded {_1} recovered document(s) Odbačeno oporavljenih dokumenata: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Vraćeno oporavljenih dokumenata: {_1}; sačuvajte ih da ih zadržite
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Ugrađeno slika: {n}; nedostaje {missing}: prvo ih ponovo povežite
|
||||
@msg Embedded {n} image(s) Ugrađeno slika: {n}
|
||||
@msg Relinked {_1} image(s) Ponovo povezano slika: {_1}
|
||||
@msg Relinked {n} image(s) Ponovo povezano slika: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Ponovo povezano slika: {n}; nisu u tom folderu: {_1}
|
||||
@msg Updated {_1} image(s) Ažurirano slika: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Ugrađena je {n} slika; nedostaje {missing}: prvo ih ponovo povežite|Ugrađene su {n} slike; nedostaje {missing}: prvo ih ponovo povežite|Ugrađeno je {n} slika; nedostaje {missing}: prvo ih ponovo povežite
|
||||
@msgplural Embedded {n} image|Embedded {n} images Ugrađena je {n} slika|Ugrađene su {n} slike|Ugrađeno je {n} slika
|
||||
@msgplural Relinked {n} image|Relinked {n} images Ponovo je povezana {n} slika|Ponovo su povezane {n} slike|Ponovo je povezano {n} slika
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Ponovo je povezana {n} slika; nisu u tom folderu: {names}|Ponovo su povezane {n} slike; nisu u tom folderu: {names}|Ponovo je povezano {n} slika; nisu u tom folderu: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Ponovo je povezana {n} slika; {name} nije moguće ponovo povezati: {reason}|Ponovo su povezane {n} slike; {name} nije moguće ponovo povezati: {reason}|Ponovo je povezano {n} slika; {name} nije moguće ponovo povezati: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Ažurirana je {n} slika|Ažurirane su {n} slike|Ažurirano je {n} slika
|
||||
@msgplural Replaced {n} image|Replaced {n} images Zamijenjena je {n} slika|Zamijenjene su {n} slike|Zamijenjeno je {n} slika
|
||||
@msgplural Broke {n} link|Broke {n} links Prekinuta je {n} veza|Prekinute su {n} veze|Prekinuto je {n} veza
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Prekinuta je {n} veza; {missing} nije moguće pročitati: prvo ih ponovo povežite ili ažurirajte|Prekinute su {n} veze; {missing} nije moguće pročitati: prvo ih ponovo povežite ili ažurirajte|Prekinuto je {n} veza; {missing} nije moguće pročitati: prvo ih ponovo povežite ili ažurirajte
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} povezana datoteka se ovdje ne može pročitati: prikazuje se njen pregled|{n} povezane datoteke se ovdje ne mogu pročitati: prikazuju se njihovi pregledi|{n} povezanih datoteka se ovdje ne može pročitati: prikazuju se njihovi pregledi
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} sliku nije moguće dekodirati: prikazuje se kao prekriženi okvir|{n} slike nije moguće dekodirati: prikazuju se kao prekriženi okviri|{n} slika nije moguće dekodirati: prikazuju se kao prekriženi okviri
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} povezana slika promijenjena je na disku: Ažuriraj veze prikazuje novu verziju|{n} povezane slike promijenjene su na disku: Ažuriraj veze prikazuje nove verzije|{n} povezanih slika promijenjeno je na disku: Ažuriraj veze prikazuje nove verzije
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Ažurirana je {n} povezana datoteka promijenjena na disku|Ažurirane su {n} povezane datoteke promijenjene na disku|Ažurirano je {n} povezanih datoteka promijenjenih na disku
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Izvezeno {what} s {n} bilješkom: {first}|Izvezeno {what} s {n} bilješke: {first}|Izvezeno {what} s {n} bilješki: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} datoteka fonta sada je u {folder}|{n} datoteke fontova sada su u {folder}|{n} datoteka fontova sada je u {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} datoteka fonta sada je u {folder}; {failed} nije moguće dodati: {reason}|{n} datoteke fontova sada su u {folder}; {failed} nije moguće dodati: {reason}|{n} datoteka fontova sada je u {folder}; {failed} nije moguće dodati: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} font ovdje nije dostupan: njegov tekst se prikazuje drugim fontom|{n} fonta ovdje nisu dostupna: njihov tekst se prikazuje drugim fontom|{n} fontova ovdje nije dostupno: njihov tekst se prikazuje drugim fontom
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Kopiran je CSS {n} objekta|Kopiran je CSS {n} objekta|Kopiran je CSS {n} objekata
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Preuzeta je {n} datoteka|Preuzete su {n} datoteke|Preuzeto je {n} datoteka
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Izvezena je {n} datoteka u {folder}|Izvezene su {n} datoteke u {folder}|Izvezeno je {n} datoteka u {folder}
|
||||
@msg Unembedded to {_1} Ugrađivanje poništeno u {_1}
|
||||
@msg Reset {_1} Vrati na početno: {_1}
|
||||
@msg Sent to {_1} Poslano na {_1}
|
||||
@@ -4842,9 +4854,6 @@ imageTrace Outline Obris
|
||||
@msg every search thread stopped on an internal error (please report this bug) sve niti pretrage su se zaustavile zbog interne greške (molimo prijavite ovu grešku)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it Folder Fontovi VectorCrafta ovdje nije postavljen: postavljaju ga desktop aplikacija i vectorcraft-cli
|
||||
@msg choose the font files to add odaberite datoteke fontova za dodavanje
|
||||
@msg {n} font file(s) are now in {folder} Datoteke fontova ({n}) sada su u {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} Datoteke fontova ({n}) sada su u {folder}; {failed} nije moguće dodati: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font Fontovi koji ovdje nisu dostupni: {n}; njihov tekst se prikazuje drugim fontom
|
||||
@msg not a file nije datoteka
|
||||
@msg not a font file nije datoteka fonta
|
||||
@msg that document is no longer open taj dokument više nije otvoren
|
||||
@@ -4853,7 +4862,6 @@ imageTrace Outline Obris
|
||||
@msg every numbered name for it is taken in the Fonts folder svi numerisani nazivi za njega su zauzeti u folderu Fontovi
|
||||
@msg every numbered name for {name} is taken in the document's folder svi numerisani nazivi za {name} su zauzeti u folderu dokumenta
|
||||
@msg No linked files to look for Nema povezanih datoteka za traženje
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Ponovo povezano slika: {n}; {name} nije moguće ponovo povezati: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` je referenca na korak {r}, koju razrješavaju samo `run` i `command_batch`
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` mora biti niz ID-ova objekata, a ne {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` mora biti niz indeksa sidara, a ne {v}
|
||||
@@ -6028,3 +6036,22 @@ shape Open Otvoren
|
||||
Text Flow Tok teksta
|
||||
By Rows Po redovima
|
||||
By Columns Po kolonama
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Nasumična neprozirnost…
|
||||
Randomize Opacity Nasumična neprozirnost
|
||||
Minimum: Minimum:
|
||||
Maximum: Maksimum:
|
||||
Seed: Početna vrijednost:
|
||||
@msg `min` is greater than `max` `min` je veće od `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Sortiraj objekte…
|
||||
Sort Objects Sortiraj objekte
|
||||
Sort By: Sortiraj po:
|
||||
Apply To: Primijeni na:
|
||||
Area Površina
|
||||
X Position Položaj X
|
||||
Y Position Položaj Y
|
||||
Stacking Order Redoslijed slaganja
|
||||
Small to Large Od manjeg prema većem
|
||||
Large to Small Od većeg prema manjem
|
||||
Distribute Evenly Rasporedi ravnomjerno
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -1057,6 +1057,9 @@
|
||||
Delete Swatch Suprimeix la mostra
|
||||
Delete Symbol Suprimeix el símbol
|
||||
Delete the selected symbol? Voleu suprimir el símbol seleccionat?
|
||||
Delete the selected symbols? Voleu suprimir els símbols seleccionats?
|
||||
No unused symbols No hi ha símbols sense utilitzar
|
||||
Delete Symbols Suprimeix els símbols
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Un o més dels símbols estan en ús i no es poden suprimir fins que se n’expandeixin o se’n suprimeixin les instàncies.
|
||||
Expand Instances Expandeix les instàncies
|
||||
Delete Instances Suprimeix les instàncies
|
||||
@@ -3102,6 +3105,7 @@ digits Malayalam Malaiàlam
|
||||
Proof Setup Configuració de prova
|
||||
Properties Propietats
|
||||
Proportional Metrics Mètriques proporcionals
|
||||
Proportional Lining Xifres proporcionals alineades
|
||||
Proportional Oldstyle Oldstyle proporcional
|
||||
PRs PRs
|
||||
Public Domain Domini públic
|
||||
@@ -4122,6 +4126,7 @@ digits Malayalam Malaiàlam
|
||||
Swap Fill and Stroke (Shift+X) Intercanvia el farciment i el traç (Maj+X)
|
||||
Swap start and end arrowheads Intercanvia les puntes de fletxa inicial i final
|
||||
Swap the selected object for the file, keeping its place and transform Substitueix l’objecte seleccionat pel fitxer, mantenint-ne la posició i la transformació
|
||||
Stylistic Alternates Alternatives estilístiques
|
||||
Swash Volada
|
||||
Swatch Conflict Conflicte de mostres
|
||||
Swatch Conflicts Conflictes de mostres
|
||||
@@ -4179,6 +4184,7 @@ digits Malayalam Malaiàlam
|
||||
Tabs Tabulacions
|
||||
Tabular Lining Xifres tabulars alineades
|
||||
Tabular Oldstyle Xifres tabulars antigues
|
||||
Titling Alternates Alternatives de titulars
|
||||
Tag Etiqueta
|
||||
Tag (open) Etiqueta (oberta)
|
||||
Taper Afusament
|
||||
@@ -4948,7 +4954,6 @@ digits Malayalam Malaiàlam
|
||||
@msg control must be fillStroke, coloring, drawMode or screenMode control ha de ser fillStroke, coloring, drawMode o screenMode
|
||||
@msg Convert to Artboards: selection has no area Converteix en taulers: la selecció no té àrea
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Converteix en forma: no s’ha seleccionat cap rectangle ni el·lipse
|
||||
@msg Copied the CSS of {rules} object(s) S’ha copiat el CSS de {rules} objecte(s)
|
||||
@msg Copied the script report S’ha copiat l’informe de l’script
|
||||
@msg Corners edits the corners of a path Cantonades edita les cantonades d’un traçat
|
||||
@msg could not decode image: {0} no s’ha pogut descodificar la imatge: {0}
|
||||
@@ -4976,12 +4981,9 @@ digits Malayalam Malaiàlam
|
||||
@msg Divide Objects Below: select a path Divideix els objectes de sota: seleccioneu un traçat
|
||||
@msg Divide Objects Below: select exactly one path Divideix els objectes de sota: seleccioneu exactament un traçat
|
||||
@msg docking action contains an unknown panel or an excessive split path l’acció d’acoblament conté un panell desconegut o un camí de divisió excessiu
|
||||
@msg Downloaded {_1} file(s) S’han baixat {_1} fitxer(s)
|
||||
@msg Downloaded {what} S’ha baixat {what}
|
||||
@msg Edit Original opens image and document files only; “{name}” is not one Edita l’original només obre fitxers d’imatge i de document; “{name}” no ho és
|
||||
@msg effect {k} is `{_1}`, not `{id}` l’efecte {k} és `{_1}`, no `{id}`
|
||||
@msg Embedded {n} image(s) S’han incrustat {n} imatge(s)
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first S’han incrustat {n} imatge(s); en falten {missing}: torneu-los a enllaçar primer
|
||||
@msg empty brush stroke traç de pinzell buit
|
||||
@msg empty cutter tallador buit
|
||||
@msg empty path traçat buit
|
||||
@@ -4993,10 +4995,8 @@ digits Malayalam Malaiàlam
|
||||
@msg Expand: no gradient fills Expandeix: no hi ha farciments de degradat
|
||||
@msg Expand: nothing to expand Expandeix: no hi ha res per expandir
|
||||
@msg Export cancelled Exportació cancel·lada
|
||||
@msg Exported {count} file(s) to {folder} S’han exportat {count} fitxer(s) a {folder}
|
||||
@msg Exported {path} S’ha exportat {path}
|
||||
@msg Exported {what} S’ha exportat {what}
|
||||
@msg Exported {what} with {_1} note(s): {first} S’ha exportat {what} amb {_1} nota(es): {first}
|
||||
@msg Exporting {_1} S’està exportant {_1}
|
||||
@msg file version {0} is newer than this VectorCraft supports ({VERSION}) la versió de fitxer {0} és més nova que la que admet aquest VectorCraft ({VERSION})
|
||||
@msg First measured segment no longer exists El primer segment mesurat ja no existeix
|
||||
@@ -5321,10 +5321,26 @@ digits Malayalam Malaiàlam
|
||||
@msg recovery copy `{file}`: {e} còpia de recuperació `{file}`: {e}
|
||||
@msg Release Guides: no guides Allibera les guies: no hi ha guies
|
||||
@msg Release: no layer to put the rectangle in Allibera: no hi ha capa on posar el rectangle
|
||||
@msg Relinked {_1} image(s) S’han tornat a enllaçar {_1} imatge(s)
|
||||
@msg Relinked {n} image(s) S’han tornat a enllaçar {n} imatge(s)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} S’han tornat a enllaçar {n} imatge(s); no són en aquesta carpeta: {_1}
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} S’han tornat a enllaçar {n} imatge(s); no s’ha pogut tornar a enllaçar {name}: {reason}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first S’ha incrustat {n} imatge; en falten {missing}: torneu-los a enllaçar primer|S’han incrustat {n} imatges; en falten {missing}: torneu-los a enllaçar primer
|
||||
@msgplural Embedded {n} image|Embedded {n} images S’ha incrustat {n} imatge|S’han incrustat {n} imatges
|
||||
@msgplural Relinked {n} image|Relinked {n} images S’ha tornat a enllaçar {n} imatge|S’han tornat a enllaçar {n} imatges
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} S’ha tornat a enllaçar {n} imatge; no són en aquesta carpeta: {names}|S’han tornat a enllaçar {n} imatges; no són en aquesta carpeta: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} S’ha tornat a enllaçar {n} imatge; no s’ha pogut tornar a enllaçar {name}: {reason}|S’han tornat a enllaçar {n} imatges; no s’ha pogut tornar a enllaçar {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images S’ha actualitzat {n} imatge|S’han actualitzat {n} imatges
|
||||
@msgplural Replaced {n} image|Replaced {n} images S’ha reemplaçat {n} imatge|S’han reemplaçat {n} imatges
|
||||
@msgplural Broke {n} link|Broke {n} links S’ha trencat {n} enllaç|S’han trencat {n} enllaços
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first S’ha trencat {n} enllaç; no es poden llegir {missing}: torneu-los a enllaçar o actualitzeu-los primer|S’han trencat {n} enllaços; no es poden llegir {missing}: torneu-los a enllaçar o actualitzeu-los primer
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show aquí no es pot llegir {n} fitxer enllaçat: es mostra la seva previsualització|aquí no es poden llegir {n} fitxers enllaçats: es mostren les seves previsualitzacions
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes no s’ha pogut descodificar {n} imatge i es mostra com a caixa creuada|no s’han pogut descodificar {n} imatges i es mostren com a caixes creuades
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} imatge enllaçada ha canviat al disc: Actualitza els enllaços mostra la versió nova|{n} imatges enllaçades han canviat al disc: Actualitza els enllaços mostra les versions noves
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk S’ha actualitzat {n} fitxer enllaçat que ha canviat al disc|S’han actualitzat {n} fitxers enllaçats que han canviat al disc
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} S’ha exportat {what} amb {n} nota: {first}|S’ha exportat {what} amb {n} notes: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} fitxer de tipus de lletra ja és a {folder}|{n} fitxers de tipus de lletra ja són a {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} fitxer de tipus de lletra ja és a {folder}; {failed} no s’han pogut afegir: {reason}|{n} fitxers de tipus de lletra ja són a {folder}; {failed} no s’han pogut afegir: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font aquí no hi ha disponible {n} tipus de lletra: el seu text es mostra amb un altre tipus de lletra|aquí no hi ha disponibles {n} tipus de lletra: el seu text es mostra amb un altre tipus de lletra
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects S’ha copiat el CSS de {n} objecte|S’ha copiat el CSS de {n} objectes
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files S’ha baixat {n} fitxer|S’han baixat {n} fitxers
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} S’ha exportat {n} fitxer a {folder}|S’han exportat {n} fitxers a {folder}
|
||||
@msg Reload the page to go on (changes not saved yet may be lost). Recarrega la pàgina per continuar (els canvis encara no desats es poden perdre).
|
||||
@msg Replace Spine: select a blend and a path Substitueix l’espina: selecciona una fusió i un traçat
|
||||
@msg replace: the object to replace was changed or deleted replace: l’objecte que s’havia de substituir s’ha canviat o suprimit
|
||||
@@ -5577,8 +5593,6 @@ digits Malayalam Malaiàlam
|
||||
@msg unknown workspace (one of {_1}) espai de treball desconegut (un de {_1})
|
||||
@msg unsupported native docking operation operació d’acoblament nadiua no compatible
|
||||
@msg unsupported: {0} no compatible: {0}
|
||||
@msg Updated {_1} image(s) S’han actualitzat {_1} imatge(s)
|
||||
@msg Updated {_1} linked file(s) changed on disk S’han actualitzat {_1} fitxer(s) enllaçat(s) que han canviat al disc
|
||||
@msg variables are locked les variables estan blocades
|
||||
@msg variables that aren't text were left out: {kinds} les variables que no són text s’han omès: {kinds}
|
||||
@msg VectorCraft doesn't search other apps' or the system's folders: {path} VectorCraft no cerca a les carpetes d’altres aplicacions ni del sistema: {path}
|
||||
@@ -5607,8 +5621,6 @@ digits Malayalam Malaiàlam
|
||||
@msg {_1} is already used by {_2} {_1} ja el fa servir {_2}
|
||||
@msg {_1} is an exporter (File › Export › Export As…) {_1} és un exportador (Fitxer › Exporta › Exporta com a…)
|
||||
@msg {_1} is reserved by the system {_1} està reservat pel sistema
|
||||
@msg {_1} linked file(s) can't be read here: their previews show aquí no es poden llegir {_1} fitxer(s) enllaçat(s): es mostren les seves previsualitzacions
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} imatge(s) enllaçada(es) han canviat al disc: Actualitza els enllaços mostra les versions noves
|
||||
@msg {_1}: not saved, so not closed {_1}: no s’ha desat, així que no s’ha tancat
|
||||
@msg {bpp}-bit bitmaps can't be read els mapes de bits de {bpp} bits no es poden llegir
|
||||
@msg {command} didn't create an object {command} no ha creat cap objecte
|
||||
@@ -5630,9 +5642,6 @@ digits Malayalam Malaiàlam
|
||||
@msg {name}: CRC mismatch {name}: CRC no coincideix
|
||||
@msg {name}: no local header {name}: no hi ha capçalera local
|
||||
@msg {name}: no such recovery entry {name}: no hi ha cap entrada de recuperació d’aquest tipus
|
||||
@msg {n} font file(s) are now in {folder} {n} fitxer(s) de tipus de lletra ja són a {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} fitxer(s) de tipus de lletra ja són a {folder}; {failed} no s’han pogut afegir: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font aquí no hi ha disponibles {n} tipus de lletra: el seu text es mostra amb un altre tipus de lletra
|
||||
@msg {path} can't be found: relink it first no es pot trobar {path}: torna a enllaçar-lo primer
|
||||
@msg {path} is not a folder {path} no és una carpeta
|
||||
@msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}: aquí no hi ha cap sistema de fitxers (passa dataBase64 per obrir; omet el camí per obtenir dataBase64)
|
||||
@@ -5640,7 +5649,6 @@ digits Malayalam Malaiàlam
|
||||
@msg {path}: {e} {path}: {e}
|
||||
@msg {status} ({e}) {status} ({e})
|
||||
@msg {tool} isn't in a toolbar group of several tools {tool} no forma part d’un grup de diverses eines a la barra d’eines
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes no s’han pogut descodificar {undecoded} imatge(s) i es mostren com a caixes creuades
|
||||
@msg “{_1}” asks for a heavy budget (each run up to {minutes} minutes and {times} times the usual instructions): install it with `allowHeavy: true` once the user agrees «{_1}» demana un pressupost elevat (cada execució fins a {minutes} minuts i {times} vegades les instruccions habituals): instal·la’l amb `allowHeavy: true` quan l’usuari hi estigui d’acord
|
||||
@msg “{name}” is not a file «{name}» no és un fitxer
|
||||
axis Both Tots dos
|
||||
@@ -6102,3 +6110,22 @@ breakText Glyphs Glifs
|
||||
Text Flow Flux del text
|
||||
By Rows Per files
|
||||
By Columns Per columnes
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opacitat aleatòria…
|
||||
Randomize Opacity Opacitat aleatòria
|
||||
Minimum: Mínim:
|
||||
Maximum: Màxim:
|
||||
Seed: Llavor:
|
||||
@msg `min` is greater than `max` `min` és més gran que `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Ordena els objectes…
|
||||
Sort Objects Ordena els objectes
|
||||
Sort By: Ordena per:
|
||||
Apply To: Aplica a:
|
||||
Area Àrea
|
||||
X Position Posició X
|
||||
Y Position Posició Y
|
||||
Stacking Order Ordre d’apilament
|
||||
Small to Large De petit a gran
|
||||
Large to Small De gran a petit
|
||||
Distribute Evenly Distribueix uniformement
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -674,7 +674,6 @@
|
||||
Links Propojení
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? Na disku se změnil {n} propojený obrázek. Zobrazit novou verzi?|Na disku se změnily {n} propojené obrázky. Zobrazit nové verze?|Na disku se změnilo {n} propojených obrázků. Zobrazit nové verze?
|
||||
Update Changed Links Aktualizovat změněná propojení
|
||||
@msg Updated {_1} linked file(s) changed on disk Aktualizováno propojených souborů změněných na disku: {_1}
|
||||
Magic Wand Kouzelná hůlka
|
||||
Navigator Navigátor
|
||||
Pattern Options Možnosti vzorku
|
||||
@@ -1806,13 +1805,16 @@ digits Malayalam Malajálamské
|
||||
Fractions Zlomky
|
||||
Ligatures are off while the text is tracked. Ligatury jsou vypnuté, když má text prostrkání.
|
||||
Ordinals Řadové číslovky
|
||||
Proportional Lining Proporcionální verzálkové
|
||||
Proportional Oldstyle Proporcionální minuskové
|
||||
Reset OpenType Features Obnovit funkce OpenType
|
||||
Select text to set its OpenType features. Vyberte text, abyste mohli nastavit jeho funkce OpenType.
|
||||
Standard Ligatures Standardní ligatury
|
||||
Stylistic Alternates Stylistické alternativy
|
||||
Swash Ozdobné tvary
|
||||
Tabular Lining Tabulkové verzálkové
|
||||
Tabular Oldstyle Tabulkové minuskové
|
||||
Titling Alternates Titulkové alternativy
|
||||
Every-line Composer Sazba všech řádků
|
||||
First-line Left Indent Odsazení prvního řádku zleva
|
||||
Hyphenation… Dělení slov…
|
||||
@@ -3101,6 +3103,9 @@ theme Appearance Motiv
|
||||
Delete Brush Odstranit štětec
|
||||
Delete Symbol Odstranit symbol
|
||||
Delete the selected symbol? Odstranit vybraný symbol?
|
||||
Delete the selected symbols? Odstranit vybrané symboly?
|
||||
No unused symbols Žádné nepoužité symboly
|
||||
Delete Symbols Odstranit symboly
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Jeden nebo více symbolů se používá a nelze je odstranit, dokud jejich instance nerozložíte nebo neodstraníte.
|
||||
Expand Instances Rozložit instance
|
||||
Delete Instances Odstranit instance
|
||||
@@ -4210,7 +4215,6 @@ imageTrace Outline Obrys
|
||||
@msg Combine Slices: the slices have no bounds Spojit řezy: řezy nemají hranice
|
||||
@msg Convert to Artboards: selection has no area Převést na pracovní plochy: výběr nemá žádnou plochu
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Převést na tvar: nejsou vybrány žádné obdélníky ani elipsy
|
||||
@msg Copied the CSS of {rules} object(s) Zkopírováno CSS objektů: {rules}
|
||||
@msg Copied the script report Zpráva o skriptu zkopírována
|
||||
@msg Corners edits the corners of a path Rohy upravuje rohy cesty
|
||||
@msg Couldn't copy to the system clipboard: {e} Nelze kopírovat do systémové schránky: {e}
|
||||
@@ -4227,13 +4231,11 @@ imageTrace Outline Obrys
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) nástrojem Přímý výběr vyberte kotevní body, kde se má cesta rozdělit (ne koncové body otevřených cest)
|
||||
@msg Divide Objects Below: select a path Rozdělit objekty pod: vyberte cestu
|
||||
@msg Divide Objects Below: select exactly one path Rozdělit objekty pod: vyberte právě jednu cestu
|
||||
@msg Downloaded {_1} file(s) Staženo souborů: {_1}
|
||||
@msg Downloaded {what} Staženo: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Rozložit vzhled: výběr má základní vzhled
|
||||
@msg Expand: no brush strokes selected Rozložit: nejsou vybrány žádné tahy štětcem
|
||||
@msg Expand: no gradient fills Rozložit: žádné přechodové výplně
|
||||
@msg Expand: nothing to expand Rozložit: není co rozložit
|
||||
@msg Exported {count} file(s) to {folder} Exportováno souborů: {count} do {folder}
|
||||
@msg Exported {path} Exportováno: {path}
|
||||
@msg Flatten Transparency: select objects to flatten Sloučit průhlednost: vyberte objekty ke sloučení
|
||||
@msg Flatten Transparency: {e} Sloučit průhlednost: {e}
|
||||
@@ -4792,9 +4794,6 @@ imageTrace Outline Obrys
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` má {size} bajtů (limit {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} už používá {_2}
|
||||
@msg {_1} is reserved by the system Zkratku {_1} si vyhrazuje systém
|
||||
@msg {_1} linked file(s) can't be read here: their previews show propojené soubory ({_1}) zde nelze přečíst: zobrazují se jejich náhledy
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes obrázky ({undecoded}) nelze dekódovat: zobrazují se jako přeškrtnuté rámečky
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions propojené obrázky ({_1}) se na disku změnily: nové verze zobrazí Aktualizovat propojení
|
||||
@msg {_1}: not saved, so not closed {_1}: neuloženo, proto nezavřeno
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}bitové bitmapy nelze přečíst
|
||||
@msg {command} didn't create an object {command} nevytvořil žádný objekt
|
||||
@@ -4814,7 +4813,6 @@ imageTrace Outline Obrys
|
||||
@msg Couldn't place {name}: {e} {name} nelze umístit: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Nelze vložit ze schránky: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Uloženo: {path}, poznámky ({_1}): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Exportováno: {what}, poznámky ({_1}): {first}
|
||||
@msg Exported {what} Exportováno: {what}
|
||||
@msg Saved {n} files beside {path} Uloženo souborů: {n} vedle {path}
|
||||
@msg Saving Ukládání
|
||||
@@ -4825,12 +4823,26 @@ imageTrace Outline Obrys
|
||||
@msg Saving recovery data for {_1} Ukládání dat pro obnovení pro {_1}
|
||||
@msg Discarded {_1} recovered document(s) Zahozeno obnovených dokumentů: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Obnoveno dokumentů: {_1}; pokud je chcete zachovat, uložte je
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Vloženo obrázků: {n}; chybí {missing}: nejprve je znovu propojte
|
||||
@msg Embedded {n} image(s) Vloženo obrázků: {n}
|
||||
@msg Relinked {_1} image(s) Znovu propojeno obrázků: {_1}
|
||||
@msg Relinked {n} image(s) Znovu propojeno obrázků: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Znovu propojeno obrázků: {n}; nejsou v dané složce: {_1}
|
||||
@msg Updated {_1} image(s) Aktualizováno obrázků: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Vložen {n} obrázek; chybí {missing}: nejprve je znovu propojte|Vloženy {n} obrázky; chybí {missing}: nejprve je znovu propojte|Vloženo {n} obrázků; chybí {missing}: nejprve je znovu propojte
|
||||
@msgplural Embedded {n} image|Embedded {n} images Vložen {n} obrázek|Vloženy {n} obrázky|Vloženo {n} obrázků
|
||||
@msgplural Relinked {n} image|Relinked {n} images Znovu propojen {n} obrázek|Znovu propojeny {n} obrázky|Znovu propojeno {n} obrázků
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Znovu propojen {n} obrázek; nejsou v dané složce: {names}|Znovu propojeny {n} obrázky; nejsou v dané složce: {names}|Znovu propojeno {n} obrázků; nejsou v dané složce: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Znovu propojen {n} obrázek; nepodařilo se znovu propojit {name}: {reason}|Znovu propojeny {n} obrázky; nepodařilo se znovu propojit {name}: {reason}|Znovu propojeno {n} obrázků; nepodařilo se znovu propojit {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Aktualizován {n} obrázek|Aktualizovány {n} obrázky|Aktualizováno {n} obrázků
|
||||
@msgplural Replaced {n} image|Replaced {n} images Nahrazen {n} obrázek|Nahrazeny {n} obrázky|Nahrazeno {n} obrázků
|
||||
@msgplural Broke {n} link|Broke {n} links Zrušeno {n} propojení|Zrušena {n} propojení|Zrušeno {n} propojení
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Zrušeno {n} propojení; {missing} nelze přečíst: nejprve je znovu propojte nebo aktualizujte|Zrušena {n} propojení; {missing} nelze přečíst: nejprve je znovu propojte nebo aktualizujte|Zrušeno {n} propojení; {missing} nelze přečíst: nejprve je znovu propojte nebo aktualizujte
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} propojený soubor zde nelze přečíst: zobrazuje se jeho náhled|{n} propojené soubory zde nelze přečíst: zobrazují se jejich náhledy|{n} propojených souborů zde nelze přečíst: zobrazují se jejich náhledy
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} obrázek nelze dekódovat: zobrazuje se jako přeškrtnutý rámeček|{n} obrázky nelze dekódovat: zobrazují se jako přeškrtnuté rámečky|{n} obrázků nelze dekódovat: zobrazují se jako přeškrtnuté rámečky
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions Na disku se změnil {n} propojený obrázek: novou verzi zobrazí Aktualizovat propojení|Na disku se změnily {n} propojené obrázky: nové verze zobrazí Aktualizovat propojení|Na disku se změnilo {n} propojených obrázků: nové verze zobrazí Aktualizovat propojení
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Aktualizován {n} propojený soubor změněný na disku|Aktualizovány {n} propojené soubory změněné na disku|Aktualizováno {n} propojených souborů změněných na disku
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Exportováno: {what}, {n} poznámka: {first}|Exportováno: {what}, {n} poznámky: {first}|Exportováno: {what}, {n} poznámek: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} soubor písma je nyní ve složce {folder}|{n} soubory písem jsou nyní ve složce {folder}|{n} souborů písem je nyní ve složce {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} soubor písma je nyní ve složce {folder}; nepodařilo se přidat {failed}: {reason}|{n} soubory písem jsou nyní ve složce {folder}; nepodařilo se přidat {failed}: {reason}|{n} souborů písem je nyní ve složce {folder}; nepodařilo se přidat {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} písmo zde není k dispozici: jeho text se zobrazuje jiným písmem|{n} písma zde nejsou k dispozici: jejich text se zobrazuje jiným písmem|{n} písem zde není k dispozici: jejich text se zobrazuje jiným písmem
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Zkopírováno CSS {n} objektu|Zkopírováno CSS {n} objektů|Zkopírováno CSS {n} objektů
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Stažen {n} soubor|Staženy {n} soubory|Staženo {n} souborů
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Exportován {n} soubor do {folder}|Exportovány {n} soubory do {folder}|Exportováno {n} souborů do {folder}
|
||||
@msg Unembedded to {_1} Vložení zrušeno, uloženo do: {_1}
|
||||
@msg Reset {_1} Obnoveno: {_1}
|
||||
@msg Sent to {_1} Odesláno do {_1}
|
||||
@@ -4882,9 +4894,6 @@ imageTrace Outline Obrys
|
||||
@msg every search thread stopped on an internal error (please report this bug) všechna vlákna hledání se zastavila na vnitřní chybě (nahlaste prosím tuto chybu)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it složka Fonts VectorCraftu zde není nastavena: nastavuje ji desktopová aplikace a vectorcraft-cli
|
||||
@msg choose the font files to add vyberte soubory písem, které chcete přidat
|
||||
@msg {n} font file(s) are now in {folder} soubory písem ({n}) jsou nyní ve složce {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} soubory písem ({n}) jsou nyní ve složce {folder}; nepodařilo se přidat {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font písma ({n}) zde nejsou k dispozici: jejich text se zobrazuje jiným písmem
|
||||
@msg not a file nejde o soubor
|
||||
@msg not a font file nejde o soubor písma
|
||||
@msg that document is no longer open tento dokument už není otevřen
|
||||
@@ -4893,7 +4902,6 @@ imageTrace Outline Obrys
|
||||
@msg every numbered name for it is taken in the Fonts folder ve složce Fonts jsou obsazena všechna číslovaná jména pro tento soubor
|
||||
@msg every numbered name for {name} is taken in the document's folder ve složce dokumentu jsou obsazena všechna číslovaná jména pro {name}
|
||||
@msg No linked files to look for Žádné propojené soubory k vyhledání
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Znovu propojeno obrázků: {n}; nepodařilo se znovu propojit {name}: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` je odkaz na krok {r}, který vyhodnocují jen `run` a `command_batch`
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` musí být pole ID objektů, ne {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` musí být pole indexů kotevních bodů, ne {v}
|
||||
@@ -6112,3 +6120,22 @@ breakText Glyphs Glyfy
|
||||
Text Flow Tok textu
|
||||
By Rows Po řádcích
|
||||
By Columns Po sloupcích
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Náhodné krytí…
|
||||
Randomize Opacity Náhodné krytí
|
||||
Minimum: Minimum:
|
||||
Maximum: Maximum:
|
||||
Seed: Počáteční hodnota:
|
||||
@msg `min` is greater than `max` `min` je větší než `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Seřadit objekty…
|
||||
Sort Objects Seřadit objekty
|
||||
Sort By: Seřadit podle:
|
||||
Apply To: Použít na:
|
||||
Area Plocha
|
||||
X Position Poloha X
|
||||
Y Position Poloha Y
|
||||
Stacking Order Pořadí vrstvení
|
||||
Small to Large Od nejmenšího po největší
|
||||
Large to Small Od největšího po nejmenší
|
||||
Distribute Evenly Rozmístit rovnoměrně
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -626,7 +626,6 @@
|
||||
Links Links
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} linket billede er ændret på disken. Vis den nye version?|{n} linkede billeder er ændret på disken. Vis de nye versioner?
|
||||
Update Changed Links Opdatér ændrede links
|
||||
@msg Updated {_1} linked file(s) changed on disk Opdaterede {_1} linket fil(er) ændret på disken
|
||||
Magic Wand Magisk tryllestav
|
||||
Navigator Navigator
|
||||
Pattern Options Mønsterindstillinger
|
||||
@@ -1622,13 +1621,16 @@ digits Malayalam Malayalam
|
||||
Fractions Brøker
|
||||
Ligatures are off while the text is tracked. Ligaturer er slået fra, mens der er sporing på teksten.
|
||||
Ordinals Ordenstal
|
||||
Proportional Lining Proportionale versalcifre
|
||||
Proportional Oldstyle Proportionale mediævalcifre
|
||||
Reset OpenType Features Nulstil OpenType-funktioner
|
||||
Select text to set its OpenType features. Markér tekst for at angive dens OpenType-funktioner.
|
||||
Standard Ligatures Standardligaturer
|
||||
Stylistic Alternates Stilistiske alternativer
|
||||
Swash Sving
|
||||
Tabular Lining Tabulære versalcifre
|
||||
Tabular Oldstyle Tabulære mediævalcifre
|
||||
Titling Alternates Titelalternativer
|
||||
Every-line Composer Hverlinjesætter
|
||||
First-line Left Indent Venstre indrykning af første linje
|
||||
Hyphenation… Orddeling…
|
||||
@@ -2857,6 +2859,9 @@ theme Appearance Udseende
|
||||
Delete Brush Slet pensel
|
||||
Delete Symbol Slet symbol
|
||||
Delete the selected symbol? Vil du slette det markerede symbol?
|
||||
Delete the selected symbols? Vil du slette de markerede symboler?
|
||||
No unused symbols Ingen ubrugte symboler
|
||||
Delete Symbols Slet symboler
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Et eller flere af symbolerne er i brug og kan ikke slettes, før deres forekomster er udvidet eller slettet.
|
||||
Expand Instances Udvid forekomster
|
||||
Delete Instances Slet forekomster
|
||||
@@ -3924,7 +3929,6 @@ imageTrace Outline Kontur
|
||||
@msg Combine Slices: the slices have no bounds Kombinér udsnit: udsnittene har ingen grænser
|
||||
@msg Convert to Artboards: selection has no area Konvertér til tegneflader: markeringen har intet areal
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Konvertér til figur: ingen rektangler eller ellipser er markeret
|
||||
@msg Copied the CSS of {rules} object(s) Kopierede CSS fra {rules} objekt(er)
|
||||
@msg Copied the script report Kopierede scriptrapporten
|
||||
@msg Corners edits the corners of a path Hjørner redigerer hjørnerne på en kurve
|
||||
@msg Couldn't copy to the system clipboard: {e} Kunne ikke kopiere til systemets udklipsholder: {e}
|
||||
@@ -3941,13 +3945,11 @@ imageTrace Outline Kontur
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) direkte-markér ankerpunkter, der skal skæres i (ikke endepunkterne på åbne kurver)
|
||||
@msg Divide Objects Below: select a path Opdel objekter nedenunder: markér en kurve
|
||||
@msg Divide Objects Below: select exactly one path Opdel objekter nedenunder: markér præcis én kurve
|
||||
@msg Downloaded {_1} file(s) Downloadede {_1} fil(er)
|
||||
@msg Downloaded {what} Downloadede {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Udvid udseende: markeringen har et grundlæggende udseende
|
||||
@msg Expand: no brush strokes selected Udvid: ingen penselstrøg er markeret
|
||||
@msg Expand: no gradient fills Udvid: ingen gradientfyld
|
||||
@msg Expand: nothing to expand Udvid: intet at udvide
|
||||
@msg Exported {count} file(s) to {folder} Eksporterede {count} fil(er) til {folder}
|
||||
@msg Exported {path} Eksporterede {path}
|
||||
@msg Flatten Transparency: select objects to flatten Fladgør gennemsigtighed: markér objekter, der skal fladgøres
|
||||
@msg Flatten Transparency: {e} Fladgør gennemsigtighed: {e}
|
||||
@@ -4449,8 +4451,6 @@ imageTrace Outline Kontur
|
||||
@msg {_1} is a live effect (Effect › Plug-ins) {_1} er en live-effekt (Effekt › Plug-ins)
|
||||
@msg {_1} is already used by {_2} {_1} bruges allerede af {_2}
|
||||
@msg {_1} is reserved by the system {_1} er reserveret af systemet
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} linket(e) fil(er) kan ikke læses her: deres forhåndsvisninger vises
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} linket(e) billede(r) er ændret på disken: Opdatér links viser de nye versioner
|
||||
@msg {_1}: not saved, so not closed {_1}: ikke gemt, derfor ikke lukket
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-bit bitmaps kan ikke læses
|
||||
@msg {command} didn't create an object {command} oprettede ikke et objekt
|
||||
@@ -4470,7 +4470,6 @@ imageTrace Outline Kontur
|
||||
@msg Couldn't place {name}: {e} Kunne ikke placere {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Kunne ikke indsætte fra udklipsholderen: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Gemte {path} med {_1} note(r): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Eksporterede {what} med {_1} note(r): {first}
|
||||
@msg Exported {what} Eksporterede {what}
|
||||
@msg Saved {n} files beside {path} Gemte {n} filer ved siden af {path}
|
||||
@msg Saving Gemmer
|
||||
@@ -4481,12 +4480,26 @@ imageTrace Outline Kontur
|
||||
@msg Saving recovery data for {_1} Gemmer gendannelsesdata for {_1}
|
||||
@msg Discarded {_1} recovered document(s) Forkastede {_1} gendannet(e) dokument(er)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Genvandt {_1} gendannet(e) dokument(er): gem dem for at beholde dem
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Indlejrede {n} billede(r); {missing} mangler: link dem igen først
|
||||
@msg Embedded {n} image(s) Indlejrede {n} billede(r)
|
||||
@msg Relinked {_1} image(s) Linkede {_1} billede(r) igen
|
||||
@msg Relinked {n} image(s) Linkede {n} billede(r) igen
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Linkede {n} billede(r) igen; ikke i den mappe: {_1}
|
||||
@msg Updated {_1} image(s) Opdaterede {_1} billede(r)
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Indlejrede {n} billede; {missing} mangler: link dem igen først|Indlejrede {n} billeder; {missing} mangler: link dem igen først
|
||||
@msgplural Embedded {n} image|Embedded {n} images Indlejrede {n} billede|Indlejrede {n} billeder
|
||||
@msgplural Relinked {n} image|Relinked {n} images Linkede {n} billede igen|Linkede {n} billeder igen
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Linkede {n} billede igen; ikke i den mappe: {names}|Linkede {n} billeder igen; ikke i den mappe: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Linkede {n} billede igen; {name} kunne ikke linkes igen: {reason}|Linkede {n} billeder igen; {name} kunne ikke linkes igen: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Opdaterede {n} billede|Opdaterede {n} billeder
|
||||
@msgplural Replaced {n} image|Replaced {n} images Erstattede {n} billede|Erstattede {n} billeder
|
||||
@msgplural Broke {n} link|Broke {n} links Brød {n} sammenkædning|Brød {n} sammenkædninger
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Brød {n} sammenkædning; {missing} kan ikke læses: link dem igen eller opdatér dem først|Brød {n} sammenkædninger; {missing} kan ikke læses: link dem igen eller opdatér dem først
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} linket fil kan ikke læses her: dens forhåndsvisning vises|{n} linkede filer kan ikke læses her: deres forhåndsvisninger vises
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} billede kunne ikke afkodes og vises som en overkrydset boks|{n} billeder kunne ikke afkodes og vises som overkrydsede bokse
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} linket billede er ændret på disken: Opdatér links viser den nye version|{n} linkede billeder er ændret på disken: Opdatér links viser de nye versioner
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Opdaterede {n} linket fil ændret på disken|Opdaterede {n} linkede filer ændret på disken
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Eksporterede {what} med {n} note: {first}|Eksporterede {what} med {n} noter: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} skrifttypefil er nu i {folder}|{n} skrifttypefiler er nu i {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} skrifttypefil er nu i {folder}; {failed} kunne ikke tilføjes: {reason}|{n} skrifttypefiler er nu i {folder}; {failed} kunne ikke tilføjes: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} skrifttype er ikke tilgængelig her: teksten vises i en anden skrifttype|{n} skrifttyper er ikke tilgængelige her: teksten vises i en anden skrifttype
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Kopierede CSS fra {n} objekt|Kopierede CSS fra {n} objekter
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Downloadede {n} fil|Downloadede {n} filer
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Eksporterede {n} fil til {folder}|Eksporterede {n} filer til {folder}
|
||||
@msg Unembedded to {_1} Fjernede indlejring til {_1}
|
||||
@msg Reset {_1} Nulstillede {_1}
|
||||
@msg Sent to {_1} Sendte til {_1}
|
||||
@@ -4536,9 +4549,6 @@ imageTrace Outline Kontur
|
||||
@msg every search thread stopped on an internal error (please report this bug) alle søgetråde stoppede ved en intern fejl (rapportér venligst denne programfejl)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it VectorCrafts Fonts-mappe er ikke angivet her: skrivebordsprogrammet og vectorcraft-cli angiver den
|
||||
@msg choose the font files to add vælg de skrifttypefiler, der skal tilføjes
|
||||
@msg {n} font file(s) are now in {folder} {n} skrifttypefil(er) er nu i {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} skrifttypefil(er) er nu i {folder}; {failed} kunne ikke tilføjes: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} skrifttype(r) er ikke tilgængelig(e) her: teksten vises i en anden skrifttype
|
||||
@msg not a file ikke en fil
|
||||
@msg not a font file ikke en skrifttypefil
|
||||
@msg that document is no longer open dokumentet er ikke længere åbent
|
||||
@@ -4547,7 +4557,6 @@ imageTrace Outline Kontur
|
||||
@msg every numbered name for it is taken in the Fonts folder alle nummererede navne til den er optaget i Fonts-mappen
|
||||
@msg every numbered name for {name} is taken in the document's folder alle nummererede navne til {name} er optaget i dokumentets mappe
|
||||
@msg No linked files to look for Ingen linkede filer at lede efter
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Linkede {n} billede(r) igen; {name} kunne ikke linkes igen: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` er trinreferencen {r}, som kun `run` og `command_batch` fortolker
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` skal være et array af objekt-id'er, ikke {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` skal være et array af ankerindekser, ikke {v}
|
||||
@@ -6009,3 +6018,22 @@ breakText Glyphs Glyffer
|
||||
Text Flow Tekstflow
|
||||
By Rows Efter rækker
|
||||
By Columns Efter kolonner
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Tilfældig opacitet…
|
||||
Randomize Opacity Tilfældig opacitet
|
||||
Minimum: Minimum:
|
||||
Maximum: Maksimum:
|
||||
Seed: Startværdi:
|
||||
@msg `min` is greater than `max` `min` er større end `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Sortér objekter…
|
||||
Sort Objects Sortér objekter
|
||||
Sort By: Sortér efter:
|
||||
Apply To: Anvend på:
|
||||
Area Areal
|
||||
X Position X-position
|
||||
Y Position Y-position
|
||||
Stacking Order Stablingsrækkefølge
|
||||
Small to Large Fra lille til stor
|
||||
Large to Small Fra stor til lille
|
||||
Distribute Evenly Fordel jævnt
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -734,6 +734,9 @@ font-technology Variable Variabel
|
||||
Delete Swatch Farbfeld löschen
|
||||
Delete Symbol Symbol löschen
|
||||
Delete the selected symbol? Ausgewähltes Symbol löschen?
|
||||
Delete the selected symbols? Ausgewählte Symbole löschen?
|
||||
No unused symbols Keine nicht verwendeten Symbole
|
||||
Delete Symbols Symbole löschen
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Mindestens eines der Symbole wird verwendet und kann erst gelöscht werden, wenn seine Instanzen umgewandelt oder gelöscht wurden.
|
||||
Expand Instances Instanzen umwandeln
|
||||
Delete Instances Instanzen löschen
|
||||
@@ -2439,6 +2442,7 @@ digits Tamil Tamil
|
||||
digits Telugu Telugu
|
||||
digits Kannada Kannada
|
||||
digits Malayalam Malayalam
|
||||
Proportional Lining Proportionale Versalziffern
|
||||
Proportional Oldstyle Proportionale Mediävalziffern
|
||||
Pucker & Bloat… Zusammenziehen und aufblasen…
|
||||
Pucker Tool Zusammenziehen-Werkzeug
|
||||
@@ -3245,6 +3249,7 @@ effect Points Punkte
|
||||
Swap Fill and Stroke (Shift+X) Fläche und Kontur vertauschen (Shift+X)
|
||||
Swap start and end arrowheads Pfeilspitzen an Anfang und Ende vertauschen
|
||||
Swap the selected object for the file, keeping its place and transform Das ausgewählte Objekt durch die Datei ersetzen; Position und Transformation bleiben erhalten
|
||||
Stylistic Alternates Stilistische Varianten
|
||||
Swash Schwungschrift
|
||||
Swatch Conflict Farbfeldkonflikt
|
||||
Swatch Conflicts Farbfeldkonflikte
|
||||
@@ -3297,6 +3302,7 @@ effect Points Punkte
|
||||
Tabs Tabulatoren
|
||||
Tabular Lining Tabellarische Versalziffern
|
||||
Tabular Oldstyle Tabellarische Mediävalziffern
|
||||
Titling Alternates Titelschriftvarianten
|
||||
Target Ziel
|
||||
Target Contents Inhalt als Ziel auswählen
|
||||
Target: Ziel:
|
||||
@@ -3821,7 +3827,6 @@ theme Appearance Erscheinungsbild
|
||||
@msg Combine Slices: the slices have no bounds Slices kombinieren: Die Slices haben keine Begrenzung
|
||||
@msg Convert to Artboards: selection has no area In Zeichenflächen umwandeln: Die Auswahl hat keine Fläche
|
||||
@msg Convert to Shape: no rectangles or ellipses selected In Form umwandeln: keine Rechtecke oder Ellipsen ausgewählt
|
||||
@msg Copied the CSS of {rules} object(s) CSS von {rules} Objekt(en) kopiert
|
||||
@msg Copied the script report Skriptbericht kopiert
|
||||
@msg Corners edits the corners of a path „Ecken“ bearbeitet die Ecken eines Pfads
|
||||
@msg Couldn't copy to the system clipboard: {e} In die Systemzwischenablage konnte nicht kopiert werden: {e}
|
||||
@@ -3838,13 +3843,11 @@ theme Appearance Erscheinungsbild
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) wählen Sie mit der Direktauswahl die Ankerpunkte aus, an denen geschnitten werden soll (nicht die Endpunkte offener Pfade)
|
||||
@msg Divide Objects Below: select a path Darunterliegende Objekte aufteilen: Wählen Sie einen Pfad aus
|
||||
@msg Divide Objects Below: select exactly one path Darunterliegende Objekte aufteilen: Wählen Sie genau einen Pfad aus
|
||||
@msg Downloaded {_1} file(s) {_1} Datei(en) heruntergeladen
|
||||
@msg Downloaded {what} {what} heruntergeladen
|
||||
@msg Expand Appearance: the selection has a basic appearance Aussehen umwandeln: Die Auswahl hat ein einfaches Aussehen
|
||||
@msg Expand: no brush strokes selected Umwandeln: keine Pinselkonturen ausgewählt
|
||||
@msg Expand: no gradient fills Umwandeln: keine Verlaufsflächen
|
||||
@msg Expand: nothing to expand Umwandeln: nichts umzuwandeln
|
||||
@msg Exported {count} file(s) to {folder} {count} Datei(en) nach {folder} exportiert
|
||||
@msg Exported {path} {path} exportiert
|
||||
@msg Flatten Transparency: select objects to flatten Transparenz reduzieren: Wählen Sie die zu reduzierenden Objekte aus
|
||||
@msg Flatten Transparency: {e} Transparenz reduzieren: {e}
|
||||
@@ -4406,9 +4409,6 @@ theme Appearance Erscheinungsbild
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` ist {size} Byte groß (Grenze {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} wird bereits von {_2} verwendet
|
||||
@msg {_1} is reserved by the system {_1} ist vom System reserviert
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} verknüpfte Datei(en) können hier nicht gelesen werden: Ihre Vorschauen werden angezeigt
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} Bild(er) konnten nicht dekodiert werden und werden als durchgekreuzte Rahmen angezeigt
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} verknüpfte(s) Bild(er) wurde(n) auf dem Datenträger geändert: „Verknüpfungen aktualisieren“ zeigt die neuen Versionen
|
||||
@msg {_1}: not saved, so not closed {_1}: nicht gespeichert, daher nicht geschlossen
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-Bit-Bitmaps können nicht gelesen werden
|
||||
@msg {command} didn't create an object {command} hat kein Objekt erstellt
|
||||
@@ -4428,7 +4428,6 @@ theme Appearance Erscheinungsbild
|
||||
@msg Couldn't place {name}: {e} {name} konnte nicht platziert werden: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Aus der Zwischenablage konnte nicht eingefügt werden: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} mit {_1} Hinweis(en) gespeichert: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} mit {_1} Hinweis(en) exportiert: {first}
|
||||
@msg Exported {what} {what} exportiert
|
||||
@msg Saved {n} files beside {path} {n} Dateien neben {path} gespeichert
|
||||
@msg Saving Wird gespeichert
|
||||
@@ -4439,12 +4438,26 @@ theme Appearance Erscheinungsbild
|
||||
@msg Saving recovery data for {_1} Wiederherstellungsdaten für {_1} werden gespeichert
|
||||
@msg Discarded {_1} recovered document(s) {_1} wiederhergestellte(s) Dokument(e) verworfen
|
||||
@msg Restored {_1} recovered document(s): save them to keep them {_1} wiederhergestellte(s) Dokument(e) geöffnet: Speichern Sie sie, um sie zu behalten
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first {n} Bild(er) eingebettet; {missing} fehlen: Verknüpfen Sie sie zuerst neu
|
||||
@msg Embedded {n} image(s) {n} Bild(er) eingebettet
|
||||
@msg Relinked {_1} image(s) {_1} Bild(er) neu verknüpft
|
||||
@msg Relinked {n} image(s) {n} Bild(er) neu verknüpft
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} {n} Bild(er) neu verknüpft; nicht in diesem Ordner: {_1}
|
||||
@msg Updated {_1} image(s) {_1} Bild(er) aktualisiert
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} Bild eingebettet; {missing} fehlen: Verknüpfen Sie sie zuerst neu|{n} Bilder eingebettet; {missing} fehlen: Verknüpfen Sie sie zuerst neu
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} Bild eingebettet|{n} Bilder eingebettet
|
||||
@msgplural Relinked {n} image|Relinked {n} images {n} Bild neu verknüpft|{n} Bilder neu verknüpft
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} {n} Bild neu verknüpft; nicht in diesem Ordner: {names}|{n} Bilder neu verknüpft; nicht in diesem Ordner: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} {n} Bild neu verknüpft; {name} konnte nicht neu verknüpft werden: {reason}|{n} Bilder neu verknüpft; {name} konnte nicht neu verknüpft werden: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images {n} Bild aktualisiert|{n} Bilder aktualisiert
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} Bild ersetzt|{n} Bilder ersetzt
|
||||
@msgplural Broke {n} link|Broke {n} links {n} Verknüpfung aufgehoben|{n} Verknüpfungen aufgehoben
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} Verknüpfung aufgehoben; {missing} können nicht gelesen werden: Verknüpfen oder aktualisieren Sie sie zuerst|{n} Verknüpfungen aufgehoben; {missing} können nicht gelesen werden: Verknüpfen oder aktualisieren Sie sie zuerst
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} verknüpfte Datei kann hier nicht gelesen werden: Ihre Vorschau wird angezeigt|{n} verknüpfte Dateien können hier nicht gelesen werden: Ihre Vorschauen werden angezeigt
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} Bild konnte nicht dekodiert werden und wird als durchgekreuzter Rahmen angezeigt|{n} Bilder konnten nicht dekodiert werden und werden als durchgekreuzte Rahmen angezeigt
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} verknüpftes Bild wurde auf dem Datenträger geändert: „Verknüpfungen aktualisieren“ zeigt die neue Version|{n} verknüpfte Bilder wurden auf dem Datenträger geändert: „Verknüpfungen aktualisieren“ zeigt die neuen Versionen
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk {n} auf dem Datenträger geänderte verknüpfte Datei aktualisiert|{n} auf dem Datenträger geänderte verknüpfte Dateien aktualisiert
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} mit {n} Hinweis exportiert: {first}|{what} mit {n} Hinweisen exportiert: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} Schriftdatei liegt jetzt in {folder}|{n} Schriftdateien liegen jetzt in {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} Schriftdatei liegt jetzt in {folder}; {failed} konnten nicht hinzugefügt werden: {reason}|{n} Schriftdateien liegen jetzt in {folder}; {failed} konnten nicht hinzugefügt werden: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} Schrift ist hier nicht verfügbar: Ihr Text wird in einer anderen Schrift angezeigt|{n} Schriften sind hier nicht verfügbar: Ihr Text wird in einer anderen Schrift angezeigt
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects CSS von {n} Objekt kopiert|CSS von {n} Objekten kopiert
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} Datei heruntergeladen|{n} Dateien heruntergeladen
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} Datei nach {folder} exportiert|{n} Dateien nach {folder} exportiert
|
||||
@msg Unembedded to {_1} Einbettung aufgehoben, gespeichert unter {_1}
|
||||
@msg Reset {_1} {_1} zurückgesetzt
|
||||
@msg Sent to {_1} An {_1} gesendet
|
||||
@@ -4496,9 +4509,6 @@ theme Appearance Erscheinungsbild
|
||||
@msg every search thread stopped on an internal error (please report this bug) alle Such-Threads wurden mit einem internen Fehler beendet (bitte melden Sie diesen Fehler)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it der Schriftenordner von VectorCraft ist hier nicht festgelegt: Die Desktop-App und vectorcraft-cli legen ihn fest
|
||||
@msg choose the font files to add wählen Sie die Schriftdateien aus, die hinzugefügt werden sollen
|
||||
@msg {n} font file(s) are now in {folder} {n} Schriftdatei(en) liegen jetzt in {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} Schriftdatei(en) liegen jetzt in {folder}; {failed} konnten nicht hinzugefügt werden: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} Schrift(en) sind hier nicht verfügbar: Ihr Text wird in einer anderen Schrift angezeigt
|
||||
@msg not a file keine Datei
|
||||
@msg not a font file keine Schriftdatei
|
||||
@msg that document is no longer open dieses Dokument ist nicht mehr geöffnet
|
||||
@@ -4507,7 +4517,6 @@ theme Appearance Erscheinungsbild
|
||||
@msg every numbered name for it is taken in the Fonts folder alle nummerierten Namen dafür sind im Schriftenordner bereits vergeben
|
||||
@msg every numbered name for {name} is taken in the document's folder alle nummerierten Namen für {name} sind im Ordner des Dokuments bereits vergeben
|
||||
@msg No linked files to look for Keine verknüpften Dateien zum Suchen
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} {n} Bild(er) neu verknüpft; {name} konnte nicht neu verknüpft werden: {reason}
|
||||
|
||||
# The macOS menu bar (native_menu): the app and Window menus' system items, Settings pages.
|
||||
Services Dienste
|
||||
@@ -4603,7 +4612,6 @@ theme Appearance Erscheinungsbild
|
||||
# Linked files changed on disk.
|
||||
Update Changed Links Geänderte Verknüpfungen aktualisieren
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} verknüpftes Bild wurde auf dem Datenträger geändert. Neue Version anzeigen?|{n} verknüpfte Bilder wurden auf dem Datenträger geändert. Neue Versionen anzeigen?
|
||||
@msg Updated {_1} linked file(s) changed on disk {_1} auf dem Datenträger geänderte verknüpfte Datei(en) aktualisiert
|
||||
# Window: the system's title bar (Windows, Linux).
|
||||
System Title Bar Systemtitelleiste
|
||||
# Brush Options: Scatter, Art and Pattern brushes.
|
||||
@@ -5697,3 +5705,22 @@ breakText Glyphs Glyphen
|
||||
Text Flow Textfluss
|
||||
By Rows Nach Zeilen
|
||||
By Columns Nach Spalten
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Zufällige Deckkraft…
|
||||
Randomize Opacity Zufällige Deckkraft
|
||||
Minimum: Minimum:
|
||||
Maximum: Maximum:
|
||||
Seed: Startwert:
|
||||
@msg `min` is greater than `max` `min` ist größer als `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Objekte sortieren…
|
||||
Sort Objects Objekte sortieren
|
||||
Sort By: Sortieren nach:
|
||||
Apply To: Anwenden auf:
|
||||
Area Fläche
|
||||
X Position X-Position
|
||||
Y Position Y-Position
|
||||
Stacking Order Stapelreihenfolge
|
||||
Small to Large Von klein nach groß
|
||||
Large to Small Von groß nach klein
|
||||
Distribute Evenly Gleichmäßig verteilen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -714,6 +714,9 @@ font-technology Variable Μεταβλητές
|
||||
Delete Swatch Διαγραφή δείγματος χρώματος
|
||||
Delete Symbol Διαγραφή συμβόλου
|
||||
Delete the selected symbol? Να διαγραφεί το επιλεγμένο σύμβολο;
|
||||
Delete the selected symbols? Να διαγραφούν τα επιλεγμένα σύμβολα;
|
||||
No unused symbols Δεν υπάρχουν αχρησιμοποίητα σύμβολα
|
||||
Delete Symbols Διαγραφή συμβόλων
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Ένα ή περισσότερα από τα σύμβολα χρησιμοποιούνται και δεν μπορούν να διαγραφούν μέχρι να επεκταθούν ή να διαγραφούν τα στιγμιότυπά τους.
|
||||
Expand Instances Επέκταση στιγμιοτύπων
|
||||
Delete Instances Διαγραφή στιγμιοτύπων
|
||||
@@ -1958,6 +1961,7 @@ font-technology Variable Μεταβλητές
|
||||
Subtract Αφαίρεση
|
||||
Superscript Εκθέτης
|
||||
Superscript: Εκθέτης:
|
||||
Stylistic Alternates Εναλλακτικοί χαρακτήρες στυλ
|
||||
Swash Διακοσμητικά τελειώματα
|
||||
Swatches Δείγματα χρωμάτων
|
||||
New Group Νέα ομάδα
|
||||
@@ -2125,7 +2129,6 @@ axis Both Και τα δύο
|
||||
@msg Combine Slices: the slices have no bounds Συνδυασμός τομών: οι τομές δεν έχουν όρια
|
||||
@msg Convert to Artboards: selection has no area Μετατροπή σε πίνακες σχεδίασης: η επιλογή δεν έχει επιφάνεια
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Μετατροπή σε σχήμα: δεν έχουν επιλεγεί ορθογώνια ή ελλείψεις
|
||||
@msg Copied the CSS of {rules} object(s) Αντιγράφηκαν οι κανόνες CSS από {rules} αντικείμενα
|
||||
@msg Copied the script report Η αναφορά του σεναρίου αντιγράφηκε
|
||||
@msg Corners edits the corners of a path Η εντολή Γωνίες επεξεργάζεται τις γωνίες μιας διαδρομής
|
||||
@msg Couldn't copy to the system clipboard: {e} Δεν ήταν δυνατή η αντιγραφή στο πρόχειρο συστήματος: {e}
|
||||
@@ -2142,13 +2145,11 @@ axis Both Και τα δύο
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) Επιλέξτε άμεσα τα σημεία αγκύρωσης όπου θα γίνει η αποκοπή (όχι τα τελικά σημεία ανοιχτών διαδρομών)
|
||||
@msg Divide Objects Below: select a path Διαίρεση αντικειμένων από κάτω: επιλέξτε μια διαδρομή
|
||||
@msg Divide Objects Below: select exactly one path Διαίρεση αντικειμένων από κάτω: επιλέξτε ακριβώς μία διαδρομή
|
||||
@msg Downloaded {_1} file(s) Έγινε λήψη {_1} αρχείων
|
||||
@msg Downloaded {what} Έγινε λήψη του {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Επέκταση εμφάνισης: η επιλογή έχει βασική εμφάνιση
|
||||
@msg Expand: no brush strokes selected Επέκταση: δεν επιλέχθηκαν πινελιές
|
||||
@msg Expand: no gradient fills Επέκταση: δεν υπάρχουν γεμίσματα ντεγκραντέ
|
||||
@msg Expand: nothing to expand Επέκταση: δεν υπάρχει περιεχόμενο προς επέκταση
|
||||
@msg Exported {count} file(s) to {folder} Εξήχθησαν {count} αρχεία στον φάκελο {folder}
|
||||
@msg Exported {path} Εξήχθη το {path}
|
||||
@msg Flatten Transparency: select objects to flatten Ισοπέδωση διαφάνειας: επιλέξτε αντικείμενα προς ισοπέδωση
|
||||
@msg Flatten Transparency: {e} Ισοπέδωση διαφάνειας: {e}
|
||||
@@ -3079,6 +3080,7 @@ digits Tamil Ταμιλικά
|
||||
digits Telugu Τελούγκου
|
||||
digits Kannada Κανάντα
|
||||
digits Malayalam Μαλαγιάλαμ
|
||||
Proportional Lining Ισοϋψείς αναλογικοί αριθμοί
|
||||
Proportional Oldstyle Αναλογικοί παλαιοτυπικοί αριθμοί
|
||||
Pucker & Bloat… Συρρίκνωση και διόγκωση…
|
||||
Pucker Tool Συρρίκνωση (Pucker Tool)
|
||||
@@ -3699,6 +3701,7 @@ digits Malayalam Μαλαγιάλαμ
|
||||
Tabs Στηλοθέτες
|
||||
Tabular Lining Ισοϋψείς αριθμοί σταθερού πλάτους
|
||||
Tabular Oldstyle Παλαιοτυπικοί αριθμοί σταθερού πλάτους
|
||||
Titling Alternates Εναλλακτικοί χαρακτήρες τίτλων
|
||||
Target Στόχος
|
||||
Target Contents Περιεχόμενα στόχου
|
||||
Tate-chu-yoko Tate-chu-yoko
|
||||
@@ -4439,10 +4442,6 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) το `documentData` έχει {size} byte (όριο {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} το {_1} χρησιμοποιείται ήδη από το {_2}
|
||||
@msg {_1} is reserved by the system Το {_1} είναι δεσμευμένο από το σύστημα
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} συνδεδεμένα αρχεία δεν μπορούν να διαβαστούν εδώ: εμφανίζονται οι προεπισκοπήσεις τους
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} εικόνες δεν ήταν δυνατό να αποκωδικοποιηθούν: εμφανίζονται ως πλαίσια με σταυρό
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} συνδεδεμένες εικόνες άλλαξαν στον δίσκο: η Ενημέρωση συνδέσμων εμφανίζει τις νέες εκδόσεις
|
||||
@msg Updated {_1} linked file(s) changed on disk Ενημερώθηκαν {_1} συνδεδεμένα αρχεία που άλλαξαν στον δίσκο
|
||||
@msg {_1}: not saved, so not closed {_1}: δεν αποθηκεύτηκε και επομένως δεν έκλεισε
|
||||
@msg {bpp}-bit bitmaps can't be read δεν μπορούν να διαβαστούν bitmap {bpp} bit
|
||||
@msg {command} didn't create an object η εντολή {command} δεν δημιούργησε αντικείμενο
|
||||
@@ -4462,7 +4461,6 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg Couldn't place {name}: {e} Δεν ήταν δυνατή η τοποθέτηση του {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Δεν ήταν δυνατή η επικόλληση από το πρόχειρο: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Αποθηκεύτηκε το {path} με {_1} σημειώσεις: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Εξήχθη το {what} με {_1} σημειώσεις: {first}
|
||||
@msg Exported {what} Εξήχθη: {what}
|
||||
@msg Saved {n} files beside {path} Αποθηκεύτηκαν {n} αρχεία δίπλα στο {path}
|
||||
@msg Saving Αποθήκευση σε εξέλιξη
|
||||
@@ -4473,12 +4471,26 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg Saving recovery data for {_1} Αποθήκευση δεδομένων ανάκτησης για {_1}
|
||||
@msg Discarded {_1} recovered document(s) Απορρίφθηκαν {_1} ανακτημένα έγγραφα
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Επαναφέρθηκαν {_1} ανακτημένα έγγραφα: αποθηκεύστε τα για να διατηρηθούν
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Ενσωματώθηκαν {n} εικόνες· λείπουν {missing}: επανασυνδέστε τις πρώτα
|
||||
@msg Embedded {n} image(s) Ενσωματώθηκαν {n} εικόνες
|
||||
@msg Relinked {_1} image(s) Επανασυνδέθηκαν {_1} εικόνες
|
||||
@msg Relinked {n} image(s) Επανασυνδέθηκαν {n} εικόνες
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Επανασυνδέθηκαν {n} εικόνες· δεν βρέθηκαν στον φάκελο: {_1}
|
||||
@msg Updated {_1} image(s) Ενημερώθηκαν {_1} εικόνες
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Ενσωματώθηκε {n} εικόνα· λείπουν {missing}: επανασυνδέστε τις πρώτα|Ενσωματώθηκαν {n} εικόνες· λείπουν {missing}: επανασυνδέστε τις πρώτα
|
||||
@msgplural Embedded {n} image|Embedded {n} images Ενσωματώθηκε {n} εικόνα|Ενσωματώθηκαν {n} εικόνες
|
||||
@msgplural Relinked {n} image|Relinked {n} images Επανασυνδέθηκε {n} εικόνα|Επανασυνδέθηκαν {n} εικόνες
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Επανασυνδέθηκε {n} εικόνα· δεν βρέθηκαν στον φάκελο: {names}|Επανασυνδέθηκαν {n} εικόνες· δεν βρέθηκαν στον φάκελο: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Επανασυνδέθηκε {n} εικόνα· δεν ήταν δυνατή η επανασύνδεση της {name}: {reason}|Επανασυνδέθηκαν {n} εικόνες· δεν ήταν δυνατή η επανασύνδεση της {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Ενημερώθηκε {n} εικόνα|Ενημερώθηκαν {n} εικόνες
|
||||
@msgplural Replaced {n} image|Replaced {n} images Αντικαταστάθηκε {n} εικόνα|Αντικαταστάθηκαν {n} εικόνες
|
||||
@msgplural Broke {n} link|Broke {n} links Καταργήθηκε {n} σύνδεση|Καταργήθηκαν {n} συνδέσεις
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Καταργήθηκε {n} σύνδεση· δεν είναι δυνατή η ανάγνωση {missing}: επανασυνδέστε ή ενημερώστε τες πρώτα|Καταργήθηκαν {n} συνδέσεις· δεν είναι δυνατή η ανάγνωση {missing}: επανασυνδέστε ή ενημερώστε τες πρώτα
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} συνδεδεμένο αρχείο δεν μπορεί να διαβαστεί εδώ: εμφανίζεται η προεπισκόπησή του|{n} συνδεδεμένα αρχεία δεν μπορούν να διαβαστούν εδώ: εμφανίζονται οι προεπισκοπήσεις τους
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} εικόνα δεν ήταν δυνατό να αποκωδικοποιηθεί: εμφανίζεται ως πλαίσιο με σταυρό|{n} εικόνες δεν ήταν δυνατό να αποκωδικοποιηθούν: εμφανίζονται ως πλαίσια με σταυρό
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} συνδεδεμένη εικόνα άλλαξε στον δίσκο: η Ενημέρωση συνδέσμων εμφανίζει τη νέα έκδοση|{n} συνδεδεμένες εικόνες άλλαξαν στον δίσκο: η Ενημέρωση συνδέσμων εμφανίζει τις νέες εκδόσεις
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Ενημερώθηκε {n} συνδεδεμένο αρχείο που άλλαξε στον δίσκο|Ενημερώθηκαν {n} συνδεδεμένα αρχεία που άλλαξαν στον δίσκο
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Εξήχθη το {what} με {n} σημείωση: {first}|Εξήχθη το {what} με {n} σημειώσεις: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} αρχείο γραμματοσειράς βρίσκεται πλέον στον φάκελο {folder}|{n} αρχεία γραμματοσειρών βρίσκονται πλέον στον φάκελο {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} αρχείο γραμματοσειράς βρίσκεται πλέον στον φάκελο {folder}· δεν ήταν δυνατή η προσθήκη {failed}: {reason}|{n} αρχεία γραμματοσειρών βρίσκονται πλέον στον φάκελο {folder}· δεν ήταν δυνατή η προσθήκη {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} γραμματοσειρά δεν είναι διαθέσιμη εδώ: το κείμενό της εμφανίζεται με άλλη γραμματοσειρά|{n} γραμματοσειρές δεν είναι διαθέσιμες εδώ: το κείμενό τους εμφανίζεται με άλλη γραμματοσειρά
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Αντιγράφηκαν οι κανόνες CSS από {n} αντικείμενο|Αντιγράφηκαν οι κανόνες CSS από {n} αντικείμενα
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Έγινε λήψη {n} αρχείου|Έγινε λήψη {n} αρχείων
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Εξήχθη {n} αρχείο στον φάκελο {folder}|Εξήχθησαν {n} αρχεία στον φάκελο {folder}
|
||||
@msg Unembedded to {_1} Καταργήθηκε η ενσωμάτωση στο {_1}
|
||||
@msg Reset {_1} Επαναφορά {_1}
|
||||
@msg Sent to {_1} Στάλθηκε στο {_1}
|
||||
@@ -4530,9 +4542,6 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg every search thread stopped on an internal error (please report this bug) όλα τα νήματα αναζήτησης σταμάτησαν λόγω εσωτερικού σφάλματος (αναφέρετε το πρόβλημα)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it ο φάκελος γραμματοσειρών του VectorCraft δεν έχει καθοριστεί εδώ: τον ορίζουν η εφαρμογή υπολογιστή και το vectorcraft-cli
|
||||
@msg choose the font files to add επιλέξτε τα αρχεία γραμματοσειρών που θέλετε να προσθέσετε
|
||||
@msg {n} font file(s) are now in {folder} {n} αρχεία γραμματοσειρών βρίσκονται πλέον στον φάκελο {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} αρχεία γραμματοσειρών βρίσκονται πλέον στον φάκελο {folder}· δεν ήταν δυνατή η προσθήκη {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} γραμματοσειρές δεν είναι διαθέσιμες εδώ: το κείμενό τους εμφανίζεται με άλλη γραμματοσειρά
|
||||
@msg not a file δεν είναι αρχείο
|
||||
@msg not a font file δεν είναι αρχείο γραμματοσειράς
|
||||
@msg that document is no longer open αυτό το έγγραφο δεν είναι πλέον ανοιχτό
|
||||
@@ -4541,7 +4550,6 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg every numbered name for it is taken in the Fonts folder όλα τα αριθμημένα ονόματά του χρησιμοποιούνται ήδη στον φάκελο γραμματοσειρών
|
||||
@msg every numbered name for {name} is taken in the document's folder όλα τα αριθμημένα ονόματα για το {name} χρησιμοποιούνται ήδη στον φάκελο εγγράφου
|
||||
@msg No linked files to look for Δεν υπάρχουν συνδεδεμένα αρχεία για αναζήτηση
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Επανασυνδέθηκαν {n} εικόνες· δεν ήταν δυνατή η επανασύνδεση της {name}: {reason}
|
||||
Hide VectorCraft Απόκρυψη VectorCraft
|
||||
Bring All to Front Μεταφορά όλων στο προσκήνιο
|
||||
Break Link Κατάργηση σύνδεσης
|
||||
@@ -6064,3 +6072,22 @@ breakText Glyphs Γλύφοι
|
||||
Text Flow Ροή κειμένου
|
||||
By Rows Κατά γραμμές
|
||||
By Columns Κατά στήλες
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Τυχαία αδιαφάνεια…
|
||||
Randomize Opacity Τυχαία αδιαφάνεια
|
||||
Minimum: Ελάχιστο:
|
||||
Maximum: Μέγιστο:
|
||||
Seed: Αρχική τιμή:
|
||||
@msg `min` is greater than `max` Το `min` είναι μεγαλύτερο από το `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Ταξινόμηση αντικειμένων…
|
||||
Sort Objects Ταξινόμηση αντικειμένων
|
||||
Sort By: Ταξινόμηση κατά:
|
||||
Apply To: Εφαρμογή σε:
|
||||
Area Εμβαδόν
|
||||
X Position Θέση X
|
||||
Y Position Θέση Y
|
||||
Stacking Order Σειρά στοίβαξης
|
||||
Small to Large Από μικρό σε μεγάλο
|
||||
Large to Small Από μεγάλο σε μικρό
|
||||
Distribute Evenly Ομοιόμορφη κατανομή
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 164 and column 5.
|
@@ -755,6 +755,9 @@ font-technology Variable Variables
|
||||
Delete Swatch Eliminar muestra
|
||||
Delete Symbol Eliminar símbolo
|
||||
Delete the selected symbol? ¿Eliminar el símbolo seleccionado?
|
||||
Delete the selected symbols? ¿Eliminar los símbolos seleccionados?
|
||||
No unused symbols No hay símbolos sin usar
|
||||
Delete Symbols Eliminar símbolos
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Uno o más de los símbolos están en uso y no se pueden eliminar hasta que se expandan o eliminen sus instancias.
|
||||
Expand Instances Expandir instancias
|
||||
Delete Instances Eliminar instancias
|
||||
@@ -2477,6 +2480,7 @@ digits Tamil Tamil
|
||||
digits Telugu Telugu
|
||||
digits Kannada Canarés
|
||||
digits Malayalam Malayálam
|
||||
Proportional Lining Proporcionales de caja alta
|
||||
Proportional Oldstyle Estilo antiguo proporcional
|
||||
Pucker & Bloat… Fruncir y engordar…
|
||||
Pucker Tool Herramienta Fruncir
|
||||
@@ -3279,6 +3283,7 @@ digits Malayalam Malayálam
|
||||
Swap Fill and Stroke (Shift+X) Intercambiar relleno y trazo (Shift+X)
|
||||
Swap start and end arrowheads Intercambiar puntas de flecha inicial y final
|
||||
Swap the selected object for the file, keeping its place and transform Sustituir el objeto seleccionado por el archivo, conservando su posición y transformación
|
||||
Stylistic Alternates Alternativas estilísticas
|
||||
Swash Decorativa
|
||||
Swatch Conflict Conflicto de muestras
|
||||
Swatch Conflicts Conflictos de muestras
|
||||
@@ -3348,6 +3353,7 @@ digits Malayalam Malayálam
|
||||
Tabs Tabulaciones
|
||||
Tabular Lining Tabulares de caja alta
|
||||
Tabular Oldstyle Tabulares de estilo antiguo
|
||||
Titling Alternates Alternativas de titulares
|
||||
Target Destino
|
||||
Target Contents Contenido de destino
|
||||
Target: Destino:
|
||||
@@ -3901,7 +3907,6 @@ axis Both Ambos
|
||||
@msg Combine Slices: the slices have no bounds Combinar sectores: los sectores no tienen límites
|
||||
@msg Convert to Artboards: selection has no area Convertir en mesas de trabajo: la selección no tiene área
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Convertir en forma: no hay rectángulos ni elipses seleccionados
|
||||
@msg Copied the CSS of {rules} object(s) Se copió el CSS de {rules} objeto(s)
|
||||
@msg Copied the script report Se copió el informe del script
|
||||
@msg Corners edits the corners of a path Esquinas edita las esquinas de un trazado
|
||||
@msg Couldn't copy to the system clipboard: {e} No se pudo copiar al portapapeles del sistema: {e}
|
||||
@@ -3918,13 +3923,11 @@ axis Both Ambos
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) selecciona con Selección directa los puntos de ancla en los que cortar (no los puntos finales de trazados abiertos)
|
||||
@msg Divide Objects Below: select a path Dividir objetos inferiores: selecciona un trazado
|
||||
@msg Divide Objects Below: select exactly one path Dividir objetos inferiores: selecciona exactamente un trazado
|
||||
@msg Downloaded {_1} file(s) Se descargaron {_1} archivo(s)
|
||||
@msg Downloaded {what} Se descargó {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Expandir apariencia: la selección tiene una apariencia básica
|
||||
@msg Expand: no brush strokes selected Expandir: no hay trazos de pincel seleccionados
|
||||
@msg Expand: no gradient fills Expandir: no hay rellenos de degradado
|
||||
@msg Expand: nothing to expand Expandir: no hay nada que expandir
|
||||
@msg Exported {count} file(s) to {folder} Se exportaron {count} archivo(s) a {folder}
|
||||
@msg Exported {path} Se exportó {path}
|
||||
@msg Flatten Transparency: select objects to flatten Acoplar transparencia: selecciona los objetos que quieres acoplar
|
||||
@msg Flatten Transparency: {e} Acoplar transparencia: {e}
|
||||
@@ -4485,10 +4488,6 @@ axis Both Ambos
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` ocupa {size} bytes (límite {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} ya lo usa {_2}
|
||||
@msg {_1} is reserved by the system {_1} está reservado por el sistema
|
||||
@msg {_1} linked file(s) can't be read here: their previews show aquí no se pueden leer {_1} archivo(s) vinculado(s): se muestran sus previsualizaciones
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes no se pudieron descodificar {undecoded} imagen(es): se muestran como recuadros tachados
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} imagen(es) vinculada(s) cambiaron en el disco: Actualizar vínculos muestra las versiones nuevas
|
||||
@msg Updated {_1} linked file(s) changed on disk Se actualizaron {_1} archivo(s) vinculado(s) que cambiaron en el disco
|
||||
@msg {_1}: not saved, so not closed {_1}: no se guardó, así que no se cerró
|
||||
@msg {bpp}-bit bitmaps can't be read no se pueden leer mapas de bits de {bpp} bits
|
||||
@msg {command} didn't create an object {command} no creó ningún objeto
|
||||
@@ -4508,7 +4507,6 @@ axis Both Ambos
|
||||
@msg Couldn't place {name}: {e} No se pudo colocar {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} No se pudo pegar desde el portapapeles: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Se guardó {path} con {_1} nota(s): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Se exportó {what} con {_1} nota(s): {first}
|
||||
@msg Exported {what} Se exportó {what}
|
||||
@msg Saved {n} files beside {path} Se guardaron {n} archivos junto a {path}
|
||||
@msg Saving Guardando
|
||||
@@ -4519,12 +4517,26 @@ axis Both Ambos
|
||||
@msg Saving recovery data for {_1} Guardando datos de recuperación de {_1}
|
||||
@msg Discarded {_1} recovered document(s) Se descartaron {_1} documento(s) recuperado(s)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Se restauraron {_1} documento(s) recuperado(s): guárdalos para conservarlos
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Se incrustaron {n} imagen(es); faltan {missing}: vuelve a vincularlas primero
|
||||
@msg Embedded {n} image(s) Se incrustaron {n} imagen(es)
|
||||
@msg Relinked {_1} image(s) Se volvieron a vincular {_1} imagen(es)
|
||||
@msg Relinked {n} image(s) Se volvieron a vincular {n} imagen(es)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Se volvieron a vincular {n} imagen(es); no están en esa carpeta: {_1}
|
||||
@msg Updated {_1} image(s) Se actualizaron {_1} imagen(es)
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Se incrustó {n} imagen; faltan {missing}: vuelve a vincularlas primero|Se incrustaron {n} imágenes; faltan {missing}: vuelve a vincularlas primero
|
||||
@msgplural Embedded {n} image|Embedded {n} images Se incrustó {n} imagen|Se incrustaron {n} imágenes
|
||||
@msgplural Relinked {n} image|Relinked {n} images Se volvió a vincular {n} imagen|Se volvieron a vincular {n} imágenes
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Se volvió a vincular {n} imagen; no están en esa carpeta: {names}|Se volvieron a vincular {n} imágenes; no están en esa carpeta: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Se volvió a vincular {n} imagen; no se pudo volver a vincular {name}: {reason}|Se volvieron a vincular {n} imágenes; no se pudo volver a vincular {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Se actualizó {n} imagen|Se actualizaron {n} imágenes
|
||||
@msgplural Replaced {n} image|Replaced {n} images Se reemplazó {n} imagen|Se reemplazaron {n} imágenes
|
||||
@msgplural Broke {n} link|Broke {n} links Se rompió {n} vínculo|Se rompieron {n} vínculos
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Se rompió {n} vínculo; no se pueden leer {missing}: vuelve a vincularlos o actualízalos primero|Se rompieron {n} vínculos; no se pueden leer {missing}: vuelve a vincularlos o actualízalos primero
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show aquí no se puede leer {n} archivo vinculado: se muestra su previsualización|aquí no se pueden leer {n} archivos vinculados: se muestran sus previsualizaciones
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes no se pudo descodificar {n} imagen: se muestra como un recuadro tachado|no se pudieron descodificar {n} imágenes: se muestran como recuadros tachados
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} imagen vinculada cambió en el disco: Actualizar vínculos muestra la versión nueva|{n} imágenes vinculadas cambiaron en el disco: Actualizar vínculos muestra las versiones nuevas
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Se actualizó {n} archivo vinculado que cambió en el disco|Se actualizaron {n} archivos vinculados que cambiaron en el disco
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Se exportó {what} con {n} nota: {first}|Se exportó {what} con {n} notas: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} archivo de fuentes ahora está en {folder}|{n} archivos de fuentes ahora están en {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} archivo de fuentes ahora está en {folder}; no se pudieron agregar {failed}: {reason}|{n} archivos de fuentes ahora están en {folder}; no se pudieron agregar {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font aquí no está disponible {n} fuente: su texto se muestra con otra fuente|aquí no están disponibles {n} fuentes: su texto se muestra con otra fuente
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Se copió el CSS de {n} objeto|Se copió el CSS de {n} objetos
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Se descargó {n} archivo|Se descargaron {n} archivos
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Se exportó {n} archivo a {folder}|Se exportaron {n} archivos a {folder}
|
||||
@msg Unembedded to {_1} Se desincrustó en {_1}
|
||||
@msg Reset {_1} Se restableció {_1}
|
||||
@msg Sent to {_1} Se envió a {_1}
|
||||
@@ -4576,9 +4588,6 @@ axis Both Ambos
|
||||
@msg every search thread stopped on an internal error (please report this bug) todos los hilos de búsqueda se detuvieron por un error interno (informa de este error)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it La carpeta Fonts de VectorCraft no está configurada aquí: la configuran la aplicación de escritorio y vectorcraft-cli
|
||||
@msg choose the font files to add elige los archivos de fuentes que quieres agregar
|
||||
@msg {n} font file(s) are now in {folder} {n} archivo(s) de fuentes ahora están en {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} archivo(s) de fuentes ahora están en {folder}; no se pudieron agregar {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font aquí no están disponibles {n} fuente(s): su texto se muestra con otra fuente
|
||||
@msg not a file no es un archivo
|
||||
@msg not a font file no es un archivo de fuente
|
||||
@msg that document is no longer open ese documento ya no está abierto
|
||||
@@ -4587,7 +4596,6 @@ axis Both Ambos
|
||||
@msg every numbered name for it is taken in the Fonts folder todos los nombres numerados para él ya existen en la carpeta Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder todos los nombres numerados para {name} ya existen en la carpeta del documento
|
||||
@msg No linked files to look for No hay archivos vinculados que buscar
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Se volvieron a vincular {n} imagen(es); no se pudo volver a vincular {name}: {reason}
|
||||
|
||||
# The macOS menu bar (native_menu): the app and Window menus' system items, Settings pages.
|
||||
Services Servicios
|
||||
@@ -6054,3 +6062,22 @@ breakText Glyphs Glifos
|
||||
Text Flow Flujo de texto
|
||||
By Rows Por filas
|
||||
By Columns Por columnas
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opacidad aleatoria…
|
||||
Randomize Opacity Opacidad aleatoria
|
||||
Minimum: Mínimo:
|
||||
Maximum: Máximo:
|
||||
Seed: Semilla:
|
||||
@msg `min` is greater than `max` `min` es mayor que `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Ordenar objetos…
|
||||
Sort Objects Ordenar objetos
|
||||
Sort By: Ordenar por:
|
||||
Apply To: Aplicar a:
|
||||
Area Área
|
||||
X Position Posición X
|
||||
Y Position Posición Y
|
||||
Stacking Order Orden de apilamiento
|
||||
Small to Large De menor a mayor
|
||||
Large to Small De mayor a menor
|
||||
Distribute Evenly Distribuir uniformemente
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -665,7 +665,6 @@
|
||||
Links Linkit
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} linkitetty kuva muuttui levyllä. Näytetäänkö uusi versio?|{n} linkitettyä kuvaa muuttui levyllä. Näytetäänkö uudet versiot?
|
||||
Update Changed Links Päivitä muuttuneet linkit
|
||||
@msg Updated {_1} linked file(s) changed on disk Päivitettiin {_1} levyllä muuttunutta linkitettyä tiedostoa
|
||||
Magic Wand Taikasauva
|
||||
Navigator Navigaattori
|
||||
Pattern Options Kuvion asetukset
|
||||
@@ -1767,13 +1766,16 @@ digits Malayalam Malajalam
|
||||
Fractions Murtoluvut
|
||||
Ligatures are off while the text is tracked. Ligatuurit eivät ole käytössä, kun tekstin merkkiväliä on muutettu.
|
||||
Ordinals Järjestysluvut
|
||||
Proportional Lining Suhteelliset numerot
|
||||
Proportional Oldstyle Suhteelliset vanhanaikaiset numerot
|
||||
Reset OpenType Features Palauta OpenType-ominaisuudet
|
||||
Select text to set its OpenType features. Valitse teksti, jonka OpenType-ominaisuudet haluat asettaa.
|
||||
Standard Ligatures Vakioligatuurit
|
||||
Stylistic Alternates Tyylivaihtoehdot
|
||||
Swash Koukerot
|
||||
Tabular Lining Taulukkonumerot
|
||||
Tabular Oldstyle Vanhanaikaiset taulukkonumerot
|
||||
Titling Alternates Otsikkovaihtoehdot
|
||||
Every-line Composer Kaikkien rivien asettelu
|
||||
First-line Left Indent Ensimmäisen rivin vasen sisennys
|
||||
Hyphenation… Tavutus…
|
||||
@@ -3040,6 +3042,9 @@ theme Appearance Ulkoasu
|
||||
Delete Brush Poista sivellin
|
||||
Delete Symbol Poista symboli
|
||||
Delete the selected symbol? Poistetaanko valittu symboli?
|
||||
Delete the selected symbols? Poistetaanko valitut symbolit?
|
||||
No unused symbols Ei käyttämättömiä symboleja
|
||||
Delete Symbols Poista symbolit
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Yksi tai useampi symboleista on käytössä, eikä niitä voi poistaa ennen kuin niiden ilmentymät on laajennettu tai poistettu.
|
||||
Expand Instances Laajenna ilmentymät
|
||||
Delete Instances Poista ilmentymät
|
||||
@@ -4124,7 +4129,6 @@ imageTrace Outline Ääriviiva
|
||||
@msg Combine Slices: the slices have no bounds Yhdistä viipaleet: viipaleilla ei ole rajoja
|
||||
@msg Convert to Artboards: selection has no area Muunna piirtoalustoiksi: valinnalla ei ole pinta-alaa
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Muunna muodoksi: suorakulmioita tai ellipsejä ei ole valittu
|
||||
@msg Copied the CSS of {rules} object(s) Kopioitiin {rules} objektin CSS
|
||||
@msg Copied the script report Komentosarjan raportti kopioitiin
|
||||
@msg Corners edits the corners of a path Kulmat-toiminto muokkaa polun kulmia
|
||||
@msg Couldn't copy to the system clipboard: {e} Järjestelmän leikepöydälle ei voitu kopioida: {e}
|
||||
@@ -4141,13 +4145,11 @@ imageTrace Outline Ääriviiva
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) valitse suoravalinnalla ankkuripisteet, joista leikataan (ei avoimien polkujen päätepisteitä)
|
||||
@msg Divide Objects Below: select a path Jaa alla olevat objektit: valitse polku
|
||||
@msg Divide Objects Below: select exactly one path Jaa alla olevat objektit: valitse tasan yksi polku
|
||||
@msg Downloaded {_1} file(s) Ladattiin {_1} tiedosto(a)
|
||||
@msg Downloaded {what} Ladattiin {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Laajenna ulkoasu: valinnalla on perusulkoasu
|
||||
@msg Expand: no brush strokes selected Laajenna: sivellinviivoja ei ole valittu
|
||||
@msg Expand: no gradient fills Laajenna: ei liukuväritäyttöjä
|
||||
@msg Expand: nothing to expand Laajenna: ei laajennettavaa
|
||||
@msg Exported {count} file(s) to {folder} Vietiin {count} tiedosto(a) kansioon {folder}
|
||||
@msg Exported {path} Vietiin {path}
|
||||
@msg Flatten Transparency: select objects to flatten Litistä läpinäkyvyys: valitse litistettävät objektit
|
||||
@msg Flatten Transparency: {e} Litistä läpinäkyvyys: {e}
|
||||
@@ -4694,9 +4696,6 @@ imageTrace Outline Ääriviiva
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` on {size} tavua (raja {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} on jo käytössä kohteella {_2}
|
||||
@msg {_1} is reserved by the system {_1} on järjestelmän varaama
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} linkitettyä tiedostoa ei voi lukea täällä: niiden esikatselut näytetään
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} kuvaa ei voitu purkaa: ne näkyvät ristillä merkittyinä ruutuina
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} linkitettyä kuvaa muuttui levyllä: Päivitä linkit näyttää uudet versiot
|
||||
@msg {_1}: not saved, so not closed {_1}: ei tallennettu, joten ei suljettu
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-bittisiä bittikarttoja ei voi lukea
|
||||
@msg {command} didn't create an object {command} ei luonut objektia
|
||||
@@ -4716,7 +4715,6 @@ imageTrace Outline Ääriviiva
|
||||
@msg Couldn't place {name}: {e} Kohdetta {name} ei voitu sijoittaa: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Leikepöydältä ei voitu liittää: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Tallennettiin {path}, {_1} huomautus(ta): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Vietiin {what}, {_1} huomautus(ta): {first}
|
||||
@msg Exported {what} Vietiin {what}
|
||||
@msg Saved {n} files beside {path} Tallennettiin {n} tiedostoa kohteen {path} viereen
|
||||
@msg Saving Tallennetaan
|
||||
@@ -4727,12 +4725,26 @@ imageTrace Outline Ääriviiva
|
||||
@msg Saving recovery data for {_1} Tallennetaan palautustietoja: {_1}
|
||||
@msg Discarded {_1} recovered document(s) Hylättiin {_1} palautettu(a) asiakirja(a)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Palautettiin {_1} asiakirja(a): tallenna ne säilyttääksesi ne
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Upotettiin {n} kuva(a); {missing} puuttuu: linkitä ne ensin uudelleen
|
||||
@msg Embedded {n} image(s) Upotettiin {n} kuva(a)
|
||||
@msg Relinked {_1} image(s) Linkitettiin uudelleen {_1} kuva(a)
|
||||
@msg Relinked {n} image(s) Linkitettiin uudelleen {n} kuva(a)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Linkitettiin uudelleen {n} kuva(a); ei kyseisessä kansiossa: {_1}
|
||||
@msg Updated {_1} image(s) Päivitettiin {_1} kuva(a)
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Upotettiin {n} kuva; {missing} puuttuu: linkitä ne ensin uudelleen|Upotettiin {n} kuvaa; {missing} puuttuu: linkitä ne ensin uudelleen
|
||||
@msgplural Embedded {n} image|Embedded {n} images Upotettiin {n} kuva|Upotettiin {n} kuvaa
|
||||
@msgplural Relinked {n} image|Relinked {n} images Linkitettiin uudelleen {n} kuva|Linkitettiin uudelleen {n} kuvaa
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Linkitettiin uudelleen {n} kuva; ei kyseisessä kansiossa: {names}|Linkitettiin uudelleen {n} kuvaa; ei kyseisessä kansiossa: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Linkitettiin uudelleen {n} kuva; kohdetta {name} ei voitu linkittää uudelleen: {reason}|Linkitettiin uudelleen {n} kuvaa; kohdetta {name} ei voitu linkittää uudelleen: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Päivitettiin {n} kuva|Päivitettiin {n} kuvaa
|
||||
@msgplural Replaced {n} image|Replaced {n} images Korvattiin {n} kuva|Korvattiin {n} kuvaa
|
||||
@msgplural Broke {n} link|Broke {n} links Katkaistiin {n} linkki|Katkaistiin {n} linkkiä
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Katkaistiin {n} linkki; {missing} ei voi lukea: linkitä ne uudelleen tai päivitä ne ensin|Katkaistiin {n} linkkiä; {missing} ei voi lukea: linkitä ne uudelleen tai päivitä ne ensin
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} linkitetty tiedosto ei ole luettavissa täällä: sen esikatselu näytetään|{n} linkitettyä tiedostoa ei voi lukea täällä: niiden esikatselut näytetään
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} kuvaa ei voitu purkaa: se näkyy ristillä merkittynä ruutuna|{n} kuvaa ei voitu purkaa: ne näkyvät ristillä merkittyinä ruutuina
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} linkitetty kuva muuttui levyllä: Päivitä linkit näyttää uuden version|{n} linkitettyä kuvaa muuttui levyllä: Päivitä linkit näyttää uudet versiot
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Päivitettiin {n} levyllä muuttunut linkitetty tiedosto|Päivitettiin {n} levyllä muuttunutta linkitettyä tiedostoa
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Vietiin {what}, {n} huomautus: {first}|Vietiin {what}, {n} huomautusta: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} fonttitiedosto on nyt kansiossa {folder}|{n} fonttitiedostoa on nyt kansiossa {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} fonttitiedosto on nyt kansiossa {folder}; {failed} ei voitu lisätä: {reason}|{n} fonttitiedostoa on nyt kansiossa {folder}; {failed} ei voitu lisätä: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} fontti ei ole käytettävissä täällä: sen teksti näytetään toisella fontilla|{n} fonttia ei ole käytettävissä täällä: niiden teksti näytetään toisella fontilla
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Kopioitiin {n} objektin CSS|Kopioitiin {n} objektin CSS
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Ladattiin {n} tiedosto|Ladattiin {n} tiedostoa
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Vietiin {n} tiedosto kansioon {folder}|Vietiin {n} tiedostoa kansioon {folder}
|
||||
@msg Unembedded to {_1} Upotus purettiin kohteeseen {_1}
|
||||
@msg Reset {_1} Palautettiin oletukseksi {_1}
|
||||
@msg Sent to {_1} Lähetettiin kohteeseen {_1}
|
||||
@@ -4784,9 +4796,6 @@ imageTrace Outline Ääriviiva
|
||||
@msg every search thread stopped on an internal error (please report this bug) jokainen hakusäie pysähtyi sisäiseen virheeseen (ilmoita tästä virheestä)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it VectorCraftin Fonts-kansiota ei ole määritetty täällä: työpöytäsovellus ja vectorcraft-cli määrittävät sen
|
||||
@msg choose the font files to add valitse lisättävät fonttitiedostot
|
||||
@msg {n} font file(s) are now in {folder} {n} fonttitiedosto(a) on nyt kansiossa {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} fonttitiedosto(a) on nyt kansiossa {folder}; {failed} ei voitu lisätä: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} fontti(a) ei ole käytettävissä täällä: niiden teksti näytetään toisella fontilla
|
||||
@msg not a file ei tiedosto
|
||||
@msg not a font file ei fonttitiedosto
|
||||
@msg that document is no longer open kyseinen asiakirja ei ole enää auki
|
||||
@@ -4795,7 +4804,6 @@ imageTrace Outline Ääriviiva
|
||||
@msg every numbered name for it is taken in the Fonts folder kaikki sen numeroidut nimet ovat jo käytössä Fonts-kansiossa
|
||||
@msg every numbered name for {name} is taken in the document's folder kaikki kohteen {name} numeroidut nimet ovat jo käytössä asiakirjan kansiossa
|
||||
@msg No linked files to look for Ei etsittäviä linkitettyjä tiedostoja
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Linkitettiin uudelleen {n} kuva(a); kohdetta {name} ei voitu linkittää uudelleen: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` on vaiheviittaus {r}, jonka vain `run` ja `command_batch` ratkaisevat
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` on oltava objektitunnusten taulukko, ei {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` on oltava ankkuri-indeksien taulukko, ei {v}
|
||||
@@ -6142,3 +6150,22 @@ breakText Glyphs Merkit
|
||||
Text Flow Tekstin kulku
|
||||
By Rows Riveittäin
|
||||
By Columns Sarakkeittain
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Satunnainen peittävyys…
|
||||
Randomize Opacity Satunnainen peittävyys
|
||||
Minimum: Pienin:
|
||||
Maximum: Suurin:
|
||||
Seed: Siemen:
|
||||
@msg `min` is greater than `max` `min` on suurempi kuin `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Lajittele objektit…
|
||||
Sort Objects Lajittele objektit
|
||||
Sort By: Lajitteluperuste:
|
||||
Apply To: Käytä kohteeseen:
|
||||
Area Pinta-ala
|
||||
X Position X-sijainti
|
||||
Y Position Y-sijainti
|
||||
Stacking Order Pinoamisjärjestys
|
||||
Small to Large Pienestä suureen
|
||||
Large to Small Suuresta pieneen
|
||||
Distribute Evenly Jaa tasaisesti
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -760,6 +760,9 @@ font-technology Variable Variables
|
||||
Delete Swatch Supprimer la nuance
|
||||
Delete Symbol Supprimer le symbole
|
||||
Delete the selected symbol? Supprimer le symbole sélectionné ?
|
||||
Delete the selected symbols? Supprimer les symboles sélectionnés ?
|
||||
No unused symbols Aucun symbole inutilisé
|
||||
Delete Symbols Supprimer les symboles
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Un ou plusieurs symboles sont utilisés et ne peuvent pas être supprimés tant que leurs instances ne sont pas décomposées ou supprimées.
|
||||
Expand Instances Décomposer les instances
|
||||
Delete Instances Supprimer les instances
|
||||
@@ -2475,6 +2478,7 @@ digits Tamil Tamoul
|
||||
digits Telugu Télougou
|
||||
digits Kannada Kannada
|
||||
digits Malayalam Malayalam
|
||||
Proportional Lining Chiffres proportionnels alignés
|
||||
Proportional Oldstyle Elzévirien proportionnel
|
||||
Pucker & Bloat… Contraction et dilatation…
|
||||
Pucker Tool Outil Contraction
|
||||
@@ -3277,6 +3281,7 @@ digits Malayalam Malayalam
|
||||
Swap Fill and Stroke (Shift+X) Permuter le fond et le contour (Maj+X)
|
||||
Swap start and end arrowheads Permuter les pointes de flèche de début et de fin
|
||||
Swap the selected object for the file, keeping its place and transform Remplacer l’objet sélectionné par le fichier, en conservant sa position et sa transformation
|
||||
Stylistic Alternates Variantes stylistiques
|
||||
Swash Lettres ornées
|
||||
Swatch Conflict Conflit de nuances
|
||||
Swatch Conflicts Conflits de nuances
|
||||
@@ -3346,6 +3351,7 @@ digits Malayalam Malayalam
|
||||
Tabs Tabulations
|
||||
Tabular Lining Chiffres tabulaires alignés
|
||||
Tabular Oldstyle Chiffres tabulaires elzéviriens
|
||||
Titling Alternates Variantes de titrage
|
||||
Target Cible
|
||||
Target Contents Contenu de la cible
|
||||
Target: Cible :
|
||||
@@ -3897,7 +3903,6 @@ axis Both Les deux
|
||||
@msg Combine Slices: the slices have no bounds Combiner les tranches : les tranches n’ont pas de limites
|
||||
@msg Convert to Artboards: selection has no area Convertir en plans de travail : la sélection n’a pas de surface
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Convertir en forme : aucun rectangle ni aucune ellipse sélectionné
|
||||
@msg Copied the CSS of {rules} object(s) CSS de {rules} objet(s) copié
|
||||
@msg Copied the script report Rapport du script copié
|
||||
@msg Corners edits the corners of a path Angles modifie les angles d’un tracé
|
||||
@msg Couldn't copy to the system clipboard: {e} Impossible de copier dans le presse-papiers du système : {e}
|
||||
@@ -3914,13 +3919,11 @@ axis Both Les deux
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) sélectionnez avec l’outil Sélection directe les points d’ancrage où couper (pas les extrémités des tracés ouverts)
|
||||
@msg Divide Objects Below: select a path Diviser les objets inférieurs : sélectionnez un tracé
|
||||
@msg Divide Objects Below: select exactly one path Diviser les objets inférieurs : sélectionnez exactement un tracé
|
||||
@msg Downloaded {_1} file(s) {_1} fichier(s) téléchargé(s)
|
||||
@msg Downloaded {what} {what} téléchargé
|
||||
@msg Expand Appearance: the selection has a basic appearance Décomposer l’aspect : la sélection a un aspect de base
|
||||
@msg Expand: no brush strokes selected Décomposer : aucun contour de forme sélectionné
|
||||
@msg Expand: no gradient fills Décomposer : aucun fond en dégradé
|
||||
@msg Expand: nothing to expand Décomposer : rien à décomposer
|
||||
@msg Exported {count} file(s) to {folder} {count} fichier(s) exporté(s) vers {folder}
|
||||
@msg Exported {path} {path} exporté
|
||||
@msg Flatten Transparency: select objects to flatten Aplatir la transparence : sélectionnez les objets à aplatir
|
||||
@msg Flatten Transparency: {e} Aplatir la transparence : {e}
|
||||
@@ -4481,10 +4484,6 @@ axis Both Les deux
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` fait {size} octets (limite {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} est déjà utilisé par {_2}
|
||||
@msg {_1} is reserved by the system {_1} est réservé par le système
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} fichier(s) lié(s) illisible(s) ici : leurs aperçus sont affichés
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} image(s) impossible(s) à décoder, affichée(s) sous forme de cadres barrés d’une croix
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} image(s) liée(s) modifiée(s) sur le disque : Mettre à jour les liens affiche les nouvelles versions
|
||||
@msg Updated {_1} linked file(s) changed on disk {_1} fichier(s) lié(s) modifié(s) sur le disque mis à jour
|
||||
@msg {_1}: not saved, so not closed {_1} : non enregistré, donc non fermé
|
||||
@msg {bpp}-bit bitmaps can't be read impossible de lire les images bitmap en {bpp} bits
|
||||
@msg {command} didn't create an object {command} n’a créé aucun objet
|
||||
@@ -4504,7 +4503,6 @@ axis Both Les deux
|
||||
@msg Couldn't place {name}: {e} Impossible d’importer {name} : {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Impossible de coller depuis le presse-papiers : {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} enregistré avec {_1} remarque(s) : {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} exporté avec {_1} remarque(s) : {first}
|
||||
@msg Exported {what} {what} exporté
|
||||
@msg Saved {n} files beside {path} {n} fichiers enregistrés à côté de {path}
|
||||
@msg Saving Enregistrement
|
||||
@@ -4515,12 +4513,26 @@ axis Both Les deux
|
||||
@msg Saving recovery data for {_1} Enregistrement des données de récupération de {_1}
|
||||
@msg Discarded {_1} recovered document(s) {_1} document(s) récupéré(s) supprimé(s)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them {_1} document(s) récupéré(s) restauré(s) : enregistrez-les pour les conserver
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first {n} image(s) incorporée(s) ; {missing} manquante(s) : rétablissez d’abord leurs liens
|
||||
@msg Embedded {n} image(s) {n} image(s) incorporée(s)
|
||||
@msg Relinked {_1} image(s) Lien rétabli pour {_1} image(s)
|
||||
@msg Relinked {n} image(s) Lien rétabli pour {n} image(s)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Lien rétabli pour {n} image(s) ; absentes de ce dossier : {_1}
|
||||
@msg Updated {_1} image(s) {_1} image(s) mise(s) à jour
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} image incorporée ; il en manque {missing} : rétablissez d’abord leurs liens|{n} images incorporées ; il en manque {missing} : rétablissez d’abord leurs liens
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} image incorporée|{n} images incorporées
|
||||
@msgplural Relinked {n} image|Relinked {n} images Lien rétabli pour {n} image|Lien rétabli pour {n} images
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Lien rétabli pour {n} image ; absentes de ce dossier : {names}|Lien rétabli pour {n} images ; absentes de ce dossier : {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Lien rétabli pour {n} image, mais impossible de lier à nouveau {name} ({reason})|Lien rétabli pour {n} images, mais impossible de lier à nouveau {name} ({reason})
|
||||
@msgplural Updated {n} image|Updated {n} images {n} image mise à jour|{n} images mises à jour
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} image remplacée|{n} images remplacées
|
||||
@msgplural Broke {n} link|Broke {n} links {n} lien rompu|{n} liens rompus
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} lien rompu ; lecture impossible pour {missing} : rétablissez ou mettez d’abord à jour leurs liens|{n} liens rompus ; lecture impossible pour {missing} : rétablissez ou mettez d’abord à jour leurs liens
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} fichier lié illisible ici : son aperçu est affiché|{n} fichiers liés illisibles ici : leurs aperçus sont affichés
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} image impossible à décoder, affichée sous forme de cadre barré d’une croix|{n} images impossibles à décoder, affichées sous forme de cadres barrés d’une croix
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} image liée modifiée sur le disque : Mettre à jour les liens affiche la nouvelle version|{n} images liées modifiées sur le disque : Mettre à jour les liens affiche les nouvelles versions
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk {n} fichier lié modifié sur le disque mis à jour|{n} fichiers liés modifiés sur le disque mis à jour
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} exporté avec {n} remarque : {first}|{what} exporté avec {n} remarques : {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} fichier de polices se trouve maintenant dans {folder}|{n} fichiers de polices se trouvent maintenant dans {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} fichier de polices se trouve maintenant dans {folder} ; {failed} n’ont pas pu être ajoutés : {reason}|{n} fichiers de polices se trouvent maintenant dans {folder} ; {failed} n’ont pas pu être ajoutés : {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} police indisponible ici : son texte s’affiche dans une autre police|{n} polices indisponibles ici : leur texte s’affiche dans une autre police
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects CSS de {n} objet copié|CSS de {n} objets copié
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} fichier téléchargé|{n} fichiers téléchargés
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} fichier exporté vers {folder}|{n} fichiers exportés vers {folder}
|
||||
@msg Unembedded to {_1} Incorporation annulée vers {_1}
|
||||
@msg Reset {_1} {_1} réinitialisé
|
||||
@msg Sent to {_1} Envoyé à {_1}
|
||||
@@ -4572,9 +4584,6 @@ axis Both Les deux
|
||||
@msg every search thread stopped on an internal error (please report this bug) tous les fils de recherche se sont arrêtés sur une erreur interne (veuillez signaler ce bogue)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it Le dossier Fonts de VectorCraft n’est pas défini ici : l’application de bureau et vectorcraft-cli le définissent
|
||||
@msg choose the font files to add choisissez les fichiers de polices à ajouter
|
||||
@msg {n} font file(s) are now in {folder} {n} fichier(s) de polices se trouvent maintenant dans {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} fichier(s) de polices se trouvent maintenant dans {folder} ; {failed} n’ont pas pu être ajoutés : {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} police(s) indisponible(s) ici : leur texte s’affiche dans une autre police
|
||||
@msg not a file n’est pas un fichier
|
||||
@msg not a font file n’est pas un fichier de police
|
||||
@msg that document is no longer open ce document n’est plus ouvert
|
||||
@@ -4583,7 +4592,6 @@ axis Both Les deux
|
||||
@msg every numbered name for it is taken in the Fonts folder tous les noms numérotés pour ce fichier sont déjà pris dans le dossier Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder tous les noms numérotés pour {name} sont déjà pris dans le dossier du document
|
||||
@msg No linked files to look for Aucun fichier lié à rechercher
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Lien rétabli pour {n} image(s), mais impossible de lier à nouveau {name} ({reason})
|
||||
|
||||
# The macOS menu bar (native_menu): the app and Window menus' system items, Settings pages.
|
||||
Services Services
|
||||
@@ -6109,3 +6117,22 @@ breakText Glyphs Glyphes
|
||||
Text Flow Flux du texte
|
||||
By Rows Par lignes
|
||||
By Columns Par colonnes
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opacité aléatoire…
|
||||
Randomize Opacity Opacité aléatoire
|
||||
Minimum: Minimum :
|
||||
Maximum: Maximum :
|
||||
Seed: Graine :
|
||||
@msg `min` is greater than `max` `min` est supérieur à `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Trier les objets…
|
||||
Sort Objects Trier les objets
|
||||
Sort By: Trier par :
|
||||
Apply To: Appliquer à :
|
||||
Area Surface
|
||||
X Position Position X
|
||||
Y Position Position Y
|
||||
Stacking Order Ordre d’empilement
|
||||
Small to Large Du plus petit au plus grand
|
||||
Large to Small Du plus grand au plus petit
|
||||
Distribute Evenly Répartir uniformément
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -979,6 +979,9 @@ font-technology Variable Változó
|
||||
Delete Swatch Színminta törlése
|
||||
Delete Symbol Szimbólum törlése
|
||||
Delete the selected symbol? Törli a kijelölt szimbólumot?
|
||||
Delete the selected symbols? Törli a kijelölt szimbólumokat?
|
||||
No unused symbols Nincsenek nem használt szimbólumok
|
||||
Delete Symbols Szimbólumok törlése
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Egy vagy több szimbólum használatban van, és nem törölhető, amíg a példányait ki nem bontja vagy nem törli.
|
||||
Expand Instances Példányok kibontása
|
||||
Delete Instances Példányok törlése
|
||||
@@ -3005,6 +3008,7 @@ mark-style Japanese Japán
|
||||
Proof Setup Színpróba beállítása
|
||||
Properties Tulajdonságok
|
||||
Proportional Metrics Arányos metrika
|
||||
Proportional Lining Arányos modern
|
||||
Proportional Oldstyle Arányos régies
|
||||
Public Domain Közkincs
|
||||
Pucker Összehúzás
|
||||
@@ -3948,6 +3952,7 @@ mark-style Japanese Japán
|
||||
Swap Fill and Stroke (Shift+X) Kitöltés és körvonal cseréje (Shift+X)
|
||||
Swap start and end arrowheads Kezdő és záró nyílhegy cseréje
|
||||
Swap the selected object for the file, keeping its place and transform A kijelölt objektum cseréje a fájlra, a helye és az átalakítása megtartásával
|
||||
Stylistic Alternates Stilisztikai változatok
|
||||
Swash Cifra változatok
|
||||
Swatch Conflict Színminta-ütközés
|
||||
Swatch Conflicts Színminta-ütközések
|
||||
@@ -3993,6 +3998,7 @@ mark-style Japanese Japán
|
||||
Tabs Tabulátorok
|
||||
Tabular Lining Táblázatos modern
|
||||
Tabular Oldstyle Táblázatos régies
|
||||
Titling Alternates Címváltozatok
|
||||
Tag Címke
|
||||
Tag (open) Címke (nyitott)
|
||||
Target Célzás
|
||||
@@ -4681,7 +4687,6 @@ imageTrace Outline Körvonal
|
||||
@msg compressed (RLE) bitmaps can't be read yet a tömörített (RLE) bitképek még nem olvashatók
|
||||
@msg Convert to Artboards: selection has no area Átalakítás rajztáblákká: a kijelölésnek nincs területe
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Átalakítás alakzattá: nincs kijelölt téglalap vagy ellipszis
|
||||
@msg Copied the CSS of {rules} object(s) CSS másolva, objektumok: {rules}
|
||||
@msg Copied the script report Szkriptjelentés másolva
|
||||
@msg Corners edits the corners of a path a Sarkok parancs egy útvonal sarkait szerkeszti
|
||||
@msg could not decode image: {0} a kép nem dekódolható: {0}
|
||||
@@ -4706,27 +4711,21 @@ imageTrace Outline Körvonal
|
||||
@msg Divide Objects Below: select a path Alatta lévő objektumok felosztása: jelölj ki egy útvonalat
|
||||
@msg Divide Objects Below: select exactly one path Alatta lévő objektumok felosztása: pontosan egy útvonalat jelölj ki
|
||||
@msg docking action contains an unknown panel or an excessive split path a dokkolási művelet ismeretlen panelt vagy túl hosszú felosztási útvonalat tartalmaz
|
||||
@msg Downloaded {_1} file(s) Letöltött fájlok: {_1}
|
||||
@msg Downloaded {what} Letöltve: {what}
|
||||
@msg effect {k} is `{_1}`, not `{id}` az effektus ({k}) ez: `{_1}`, nem ez: `{id}`
|
||||
@msg Embedded {n} image(s) Beágyazott képek: {n}
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Beágyazott képek: {n}; hiányzik: {missing}, ezeket előbb csatold újra
|
||||
@msg empty brush stroke üres ecsetvonás
|
||||
@msg empty cutter üres vágóobjektum
|
||||
@msg empty path üres útvonal
|
||||
@msg every numbered name for it is taken in the Fonts folder a Fonts mappában minden sorszámozott név foglalt hozzá
|
||||
@msg every numbered name for {name} is taken in the document's folder a dokumentum mappájában minden sorszámozott név foglalt: {name}
|
||||
@msg No linked files to look for Nincs keresendő csatolt fájl
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Újracsatolt képek: {n}; nem sikerült újracsatolni: {name}: {reason}
|
||||
@msg every search thread stopped on an internal error (please report this bug) minden keresési szál belső hibával leállt (kérjük, jelentsd ezt a hibát)
|
||||
@msg Expand Appearance: the selection has a basic appearance Megjelenés kibontása: a kijelölésnek alapmegjelenése van
|
||||
@msg Expand: no brush strokes selected Kibontás: nincs kijelölt ecsetvonás
|
||||
@msg Expand: no gradient fills Kibontás: nincs színátmenetes kitöltés
|
||||
@msg Expand: nothing to expand Kibontás: nincs mit kibontani
|
||||
@msg Exported {count} file(s) to {folder} Exportált fájlok: {count}, mappa: {folder}
|
||||
@msg Exported {path} Exportálva: {path}
|
||||
@msg Exported {what} Exportálva: {what}
|
||||
@msg Exported {what} with {_1} note(s): {first} Exportálva: {what}; megjegyzések: {_1}, az első: {first}
|
||||
@msg Exporting {_1} Exportálás: {_1}
|
||||
@msg Packaging {_1} Csomagolás: {_1}
|
||||
@msg Placing {_1} Elhelyezés: {_1}
|
||||
@@ -5012,9 +5011,26 @@ imageTrace Outline Körvonal
|
||||
@msg recovery copy `{file}`: {e} helyreállítási másolat (`{file}`): {e}
|
||||
@msg Release Guides: no guides Segédvonalak visszaalakítása: nincs segédvonal
|
||||
@msg Release: no layer to put the rectangle in Megszüntetés: nincs réteg, amelybe a téglalap kerülhetne
|
||||
@msg Relinked {_1} image(s) Újracsatolt képek: {_1}
|
||||
@msg Relinked {n} image(s) Újracsatolt képek: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Újracsatolt képek: {n}; nincs a mappában: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Beágyazott képek: {n}; hiányzik: {missing}, ezeket előbb csatold újra
|
||||
@msgplural Embedded {n} image|Embedded {n} images Beágyazott képek: {n}
|
||||
@msgplural Relinked {n} image|Relinked {n} images Újracsatolt képek: {n}
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Újracsatolt képek: {n}; nincs a mappában: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Újracsatolt képek: {n}; nem sikerült újracsatolni: {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Frissített képek: {n}
|
||||
@msgplural Replaced {n} image|Replaced {n} images Lecserélt képek: {n}
|
||||
@msgplural Broke {n} link|Broke {n} links Bontott csatolások: {n}
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Bontott csatolások: {n}; nem olvasható: {missing}, ezeket előbb csatold újra vagy frissítsd
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show Itt nem olvasható csatolt fájlok: {n}; az előnézetük látszik
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes Nem dekódolható képek: {n}; áthúzott keretként látszanak
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions A lemezen módosult csatolt képek: {n}; a Csatolások frissítése az új változatokat mutatja
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Frissített, a lemezen módosult csatolt fájlok: {n}
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Exportálva: {what}; megjegyzések: {n}, az első: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} Betűtípusfájlok száma: {n}, mappa: {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} Betűtípusfájlok száma: {n}, mappa: {folder}; nem sikerült hozzáadni: {failed} ({reason})
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font Nem elérhető betűtípusok: {n}; a szövegük más betűtípussal jelenik meg
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects CSS másolva, objektumok: {n}
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Letöltött fájlok: {n}
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Exportált fájlok: {n}, mappa: {folder}
|
||||
@msg Reload the page to go on (changes not saved yet may be lost). A folytatáshoz töltsd újra az oldalt (a még nem mentett módosítások elveszhetnek).
|
||||
@msg Replace Spine: select a blend and a path Gerinc cseréje: jelölj ki egy összemosást és egy útvonalat
|
||||
@msg Reset {_1} Visszaállítva: {_1}
|
||||
@@ -5225,8 +5241,6 @@ imageTrace Outline Körvonal
|
||||
@msg unknown workspace (one of {_1}) ismeretlen munkaterület (ezek egyike lehet: {_1})
|
||||
@msg unsupported native docking operation nem támogatott natív dokkolási művelet
|
||||
@msg unsupported: {0} nem támogatott: {0}
|
||||
@msg Updated {_1} image(s) Frissített képek: {_1}
|
||||
@msg Updated {_1} linked file(s) changed on disk Frissített, a lemezen módosult csatolt fájlok: {_1}
|
||||
@msg variables are locked a változók zárolva vannak
|
||||
@msg variables that aren't text were left out: {kinds} a nem szöveges változók kimaradtak: {kinds}
|
||||
@msg VectorCraft doesn't search other apps' or the system's folders: {path} a VectorCraft nem keres más alkalmazások és a rendszer mappáiban: {path}
|
||||
@@ -5255,9 +5269,6 @@ imageTrace Outline Körvonal
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) a `documentData` mérete {size} bájt (korlát: {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} már foglalt: {_1} (használja: {_2})
|
||||
@msg {_1} is reserved by the system A(z) {_1} a rendszer számára foglalt
|
||||
@msg {_1} linked file(s) can't be read here: their previews show Itt nem olvasható csatolt fájlok: {_1}; az előnézetük látszik
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes Nem dekódolható képek: {undecoded}; áthúzott keretként látszanak
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions A lemezen módosult csatolt képek: {_1}; a Csatolások frissítése az új változatokat mutatja
|
||||
@msg {_1}: not saved, so not closed {_1}: nincs mentve, ezért nem záródott be
|
||||
@msg {bpp}-bit bitmaps can't be read ilyen bitmélységű bitkép nem olvasható: {bpp}
|
||||
@msg {command} didn't create an object a parancs nem hozott létre objektumot: {command}
|
||||
@@ -5272,9 +5283,6 @@ imageTrace Outline Körvonal
|
||||
@msg {name}: CRC mismatch {name}: CRC-eltérés
|
||||
@msg {name}: no local header {name}: nincs helyi fejléc
|
||||
@msg {name}: no such recovery entry {name}: nincs ilyen helyreállítási bejegyzés
|
||||
@msg {n} font file(s) are now in {folder} Betűtípusfájlok száma: {n}, mappa: {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} Betűtípusfájlok száma: {n}, mappa: {folder}; nem sikerült hozzáadni: {failed} ({reason})
|
||||
@msg {n} font(s) aren't available here: their text shows in another font Nem elérhető betűtípusok: {n}; a szövegük más betűtípussal jelenik meg
|
||||
@msg {path} can't be found: relink it first nem található: {path}; előbb csatold újra
|
||||
@msg {path} is not a folder nem mappa: {path}
|
||||
@msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}: itt nincs fájlrendszer (megnyitáshoz add meg a dataBase64-et; az útvonal elhagyásával dataBase64-et kapsz)
|
||||
@@ -6098,3 +6106,22 @@ breakText Glyphs Glifák
|
||||
Text Flow Szövegfolyás
|
||||
By Rows Soronként
|
||||
By Columns Oszloponként
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Véletlenszerű átlátszatlanság…
|
||||
Randomize Opacity Véletlenszerű átlátszatlanság
|
||||
Minimum: Minimum:
|
||||
Maximum: Maximum:
|
||||
Seed: Kezdőérték:
|
||||
@msg `min` is greater than `max` `min` nagyobb, mint `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Objektumok rendezése…
|
||||
Sort Objects Objektumok rendezése
|
||||
Sort By: Rendezés alapja:
|
||||
Apply To: Alkalmazás erre:
|
||||
Area Terület
|
||||
X Position X pozíció
|
||||
Y Position Y pozíció
|
||||
Stacking Order Halmozási sorrend
|
||||
Small to Large Kicsitől a nagyig
|
||||
Large to Small Nagytól a kicsiig
|
||||
Distribute Evenly Egyenletes elosztás
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -626,7 +626,6 @@
|
||||
Links Tautan
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} gambar tertaut di disk telah berubah. Tampilkan versi baru?
|
||||
Update Changed Links Perbarui tautan yang berubah
|
||||
@msg Updated {_1} linked file(s) changed on disk Telah memperbarui {_1} berkas tertaut yang berubah di disk
|
||||
Magic Wand Tongkat ajaib
|
||||
Navigator Navigator
|
||||
Pattern Options Opsi pola
|
||||
@@ -1622,13 +1621,16 @@ digits Malayalam Malayalam
|
||||
Fractions Pecahan
|
||||
Ligatures are off while the text is tracked. Ligatur nonaktif saat teks diberi tracking.
|
||||
Ordinals Ordinal
|
||||
Proportional Lining Lining proporsional
|
||||
Proportional Oldstyle Oldstyle proporsional
|
||||
Reset OpenType Features Setel ulang fitur OpenType
|
||||
Select text to set its OpenType features. Pilih teks untuk mengatur fitur OpenType-nya.
|
||||
Standard Ligatures Ligatur standar
|
||||
Stylistic Alternates Alternatif gaya
|
||||
Swash Swash
|
||||
Tabular Lining Lining tabular
|
||||
Tabular Oldstyle Oldstyle tabular
|
||||
Titling Alternates Alternatif judul
|
||||
Every-line Composer Komposer tiap baris
|
||||
First-line Left Indent Indentasi kiri baris pertama
|
||||
Hyphenation… Pemenggalan kata…
|
||||
@@ -2857,6 +2859,9 @@ theme Appearance Tampilan
|
||||
Delete Brush Hapus kuas
|
||||
Delete Symbol Hapus simbol
|
||||
Delete the selected symbol? Hapus simbol yang dipilih?
|
||||
Delete the selected symbols? Hapus simbol yang dipilih?
|
||||
No unused symbols Tidak ada simbol yang tidak digunakan
|
||||
Delete Symbols Hapus Simbol
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Satu atau beberapa simbol sedang digunakan dan tidak dapat dihapus sampai instansinya diperluas atau dihapus.
|
||||
Expand Instances Perluas instansi
|
||||
Delete Instances Hapus instansi
|
||||
@@ -3924,7 +3929,6 @@ imageTrace Outline Kontur
|
||||
@msg Combine Slices: the slices have no bounds Gabungkan irisan: irisan tidak memiliki batas
|
||||
@msg Convert to Artboards: selection has no area Konversi ke artboard: seleksi tidak memiliki area
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Konversi ke bentuk: tidak ada persegi panjang atau elips yang dipilih
|
||||
@msg Copied the CSS of {rules} object(s) Berhasil menyalin CSS dari {rules} objek
|
||||
@msg Copied the script report Berhasil menyalin laporan skrip
|
||||
@msg Corners edits the corners of a path Corners menyunting sudut jalur
|
||||
@msg Couldn't copy to the system clipboard: {e} Tidak dapat menyalin ke papan klip sistem: {e}
|
||||
@@ -3941,13 +3945,11 @@ imageTrace Outline Kontur
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) pilih langsung titik jangkar yang akan dipotong (bukan titik ujung jalur terbuka)
|
||||
@msg Divide Objects Below: select a path Bagi objek di bawah: pilih satu jalur
|
||||
@msg Divide Objects Below: select exactly one path Bagi objek di bawah: pilih tepat satu jalur
|
||||
@msg Downloaded {_1} file(s) Berhasil mengunduh {_1} file
|
||||
@msg Downloaded {what} Berhasil mengunduh {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Perluas tampilan: seleksi memiliki tampilan dasar
|
||||
@msg Expand: no brush strokes selected Perluas: tidak ada sapuan kuas yang dipilih
|
||||
@msg Expand: no gradient fills Perluas: tidak ada isian gradien
|
||||
@msg Expand: nothing to expand Perluas: tidak ada yang dapat diperluas
|
||||
@msg Exported {count} file(s) to {folder} Berhasil mengekspor {count} file ke {folder}
|
||||
@msg Exported {path} Berhasil mengekspor {path}
|
||||
@msg Flatten Transparency: select objects to flatten Ratakan transparansi: pilih objek yang akan diratakan
|
||||
@msg Flatten Transparency: {e} Ratakan transparansi: {e}
|
||||
@@ -4449,8 +4451,6 @@ imageTrace Outline Kontur
|
||||
@msg {_1} is a live effect (Effect › Plug-ins) {_1} adalah efek langsung (Efek › Plug-in)
|
||||
@msg {_1} is already used by {_2} {_1} sudah digunakan oleh {_2}
|
||||
@msg {_1} is reserved by the system {_1} dicadangkan oleh sistem
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} berkas tertaut tidak dapat dibaca di sini: yang ditampilkan adalah pratinjaunya
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} gambar tertaut di disk telah berubah: Perbarui Tautan menampilkan versi barunya
|
||||
@msg {_1}: not saved, so not closed {_1}: tidak disimpan, sehingga tidak ditutup
|
||||
@msg {bpp}-bit bitmaps can't be read bitmap {bpp}-bit tidak dapat dibaca
|
||||
@msg {command} didn't create an object {command} tidak membuat objek
|
||||
@@ -4470,7 +4470,6 @@ imageTrace Outline Kontur
|
||||
@msg Couldn't place {name}: {e} Tidak dapat menempatkan {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Tidak dapat menempel dari papan klip: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} disimpan dengan {_1} catatan: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} diekspor dengan {_1} catatan: {first}
|
||||
@msg Exported {what} {what} diekspor
|
||||
@msg Saved {n} files beside {path} {n} berkas disimpan di sebelah {path}
|
||||
@msg Saving Menyimpan
|
||||
@@ -4481,12 +4480,26 @@ imageTrace Outline Kontur
|
||||
@msg Saving recovery data for {_1} Menyimpan data pemulihan untuk {_1}
|
||||
@msg Discarded {_1} recovered document(s) {_1} dokumen hasil pemulihan dibuang
|
||||
@msg Restored {_1} recovered document(s): save them to keep them {_1} dokumen hasil pemulihan dipulihkan: simpan agar tidak hilang
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first {n} gambar tersemat; {missing} hilang: tautkan ulang dulu
|
||||
@msg Embedded {n} image(s) {n} gambar tersemat
|
||||
@msg Relinked {_1} image(s) {_1} gambar ditautkan ulang
|
||||
@msg Relinked {n} image(s) {n} gambar ditautkan ulang
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} {n} gambar ditautkan ulang; tidak ada di folder tersebut: {_1}
|
||||
@msg Updated {_1} image(s) {_1} gambar diperbarui
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} gambar tersemat; {missing} hilang: tautkan ulang dulu
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} gambar tersemat
|
||||
@msgplural Relinked {n} image|Relinked {n} images {n} gambar ditautkan ulang
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} {n} gambar ditautkan ulang; tidak ada di folder tersebut: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} {n} gambar ditautkan ulang; {name} tidak dapat ditautkan ulang: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images {n} gambar diperbarui
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} gambar diganti
|
||||
@msgplural Broke {n} link|Broke {n} links {n} tautan diputus
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} tautan diputus; {missing} tidak dapat dibaca: tautkan ulang atau perbarui dulu
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} berkas tertaut tidak dapat dibaca di sini: yang ditampilkan adalah pratinjaunya
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} gambar tidak dapat didekode dan ditampilkan sebagai kotak bersilang
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} gambar tertaut di disk telah berubah: Perbarui Tautan menampilkan versi barunya
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Telah memperbarui {n} berkas tertaut yang berubah di disk
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} diekspor dengan {n} catatan: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} berkas font kini berada di {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} berkas font kini berada di {folder}; {failed} tidak dapat ditambahkan: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} font tidak tersedia di sini: teksnya ditampilkan dalam font lain
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Berhasil menyalin CSS dari {n} objek
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Berhasil mengunduh {n} file
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Berhasil mengekspor {n} file ke {folder}
|
||||
@msg Unembedded to {_1} Gambar tersemat dilepas ke {_1}
|
||||
@msg Reset {_1} {_1} diatur ulang
|
||||
@msg Sent to {_1} Dikirim ke {_1}
|
||||
@@ -4536,9 +4549,6 @@ imageTrace Outline Kontur
|
||||
@msg every search thread stopped on an internal error (please report this bug) semua utas pencarian berhenti karena kesalahan internal (mohon laporkan bug ini)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it folder Fonts VectorCraft tidak diatur di sini: aplikasi desktop dan vectorcraft-cli yang mengaturnya
|
||||
@msg choose the font files to add pilih berkas font yang akan ditambahkan
|
||||
@msg {n} font file(s) are now in {folder} {n} berkas font kini berada di {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} berkas font kini berada di {folder}; {failed} tidak dapat ditambahkan: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} font tidak tersedia di sini: teksnya ditampilkan dalam font lain
|
||||
@msg not a file bukan berkas
|
||||
@msg not a font file bukan berkas font
|
||||
@msg that document is no longer open dokumen tersebut tidak lagi terbuka
|
||||
@@ -4547,7 +4557,6 @@ imageTrace Outline Kontur
|
||||
@msg every numbered name for it is taken in the Fonts folder semua nama bernomor untuk font tersebut sudah dipakai di folder Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder semua nama bernomor untuk {name} sudah dipakai di folder dokumen
|
||||
@msg No linked files to look for Tidak ada berkas tertaut untuk dicari
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} {n} gambar ditautkan ulang; {name} tidak dapat ditautkan ulang: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` adalah referensi langkah {r}, yang hanya diselesaikan oleh `run` dan `command_batch`
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` harus berupa array id objek, bukan {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` harus berupa array indeks jangkar, bukan {v}
|
||||
@@ -6009,3 +6018,22 @@ breakText Glyphs Glif
|
||||
Text Flow Alur teks
|
||||
By Rows Per baris
|
||||
By Columns Per kolom
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opasitas acak…
|
||||
Randomize Opacity Opasitas acak
|
||||
Minimum: Minimum:
|
||||
Maximum: Maksimum:
|
||||
Seed: Benih:
|
||||
@msg `min` is greater than `max` `min` lebih besar dari `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Urutkan objek…
|
||||
Sort Objects Urutkan objek
|
||||
Sort By: Urutkan menurut:
|
||||
Apply To: Terapkan ke:
|
||||
Area Luas
|
||||
X Position Posisi X
|
||||
Y Position Posisi Y
|
||||
Stacking Order Urutan tumpukan
|
||||
Small to Large Kecil ke besar
|
||||
Large to Small Besar ke kecil
|
||||
Distribute Evenly Distribusikan merata
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2190 and column 5.
|
@@ -755,6 +755,9 @@ font-technology Variable Variabili
|
||||
Delete Swatch Elimina campione
|
||||
Delete Symbol Elimina simbolo
|
||||
Delete the selected symbol? Eliminare il simbolo selezionato?
|
||||
Delete the selected symbols? Eliminare i simboli selezionati?
|
||||
No unused symbols Nessun simbolo inutilizzato
|
||||
Delete Symbols Elimina simboli
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Uno o più simboli sono in uso e non possono essere eliminati finché le loro istanze non vengono espanse o eliminate.
|
||||
Expand Instances Espandi istanze
|
||||
Delete Instances Elimina istanze
|
||||
@@ -2508,6 +2511,7 @@ digits Tamil Tamil
|
||||
digits Telugu Telugu
|
||||
digits Kannada Kannada
|
||||
digits Malayalam Malayalam
|
||||
Proportional Lining Proporzionali allineati
|
||||
Proportional Oldstyle Proporzionali stile antico
|
||||
Pucker & Bloat… Contrai e gonfia…
|
||||
Pucker Tool Strumento Contrai
|
||||
@@ -3313,6 +3317,7 @@ digits Malayalam Malayalam
|
||||
Swap Fill and Stroke (Shift+X) Inverti riempimento e traccia (Shift+X)
|
||||
Swap start and end arrowheads Inverti punte di freccia iniziale e finale
|
||||
Swap the selected object for the file, keeping its place and transform Sostituisci l'oggetto selezionato con il file, mantenendone posizione e trasformazione
|
||||
Stylistic Alternates Alternative stilistiche
|
||||
Swash Ornamentale
|
||||
Swatch Conflict Conflitto campioni
|
||||
Swatch Conflicts Conflitti campioni
|
||||
@@ -3382,6 +3387,7 @@ digits Malayalam Malayalam
|
||||
Tabs Tabulazioni
|
||||
Tabular Lining Tabulari allineati
|
||||
Tabular Oldstyle Tabulari stile antico
|
||||
Titling Alternates Alternative per titoli
|
||||
Target Destinazione
|
||||
Target Contents Contenuto destinazione
|
||||
Target: Destinazione:
|
||||
@@ -3941,7 +3947,6 @@ axis Both Entrambi
|
||||
@msg Combine Slices: the slices have no bounds Combina sezioni: le sezioni non hanno limiti
|
||||
@msg Convert to Artboards: selection has no area Converti in tavole da disegno: la selezione non ha area
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Converti in forma: nessun rettangolo o ellisse selezionato
|
||||
@msg Copied the CSS of {rules} object(s) Copiato il CSS di {rules} oggetto/i
|
||||
@msg Copied the script report Rapporto dello script copiato
|
||||
@msg Corners edits the corners of a path Angoli modifica gli angoli di un tracciato
|
||||
@msg Couldn't copy to the system clipboard: {e} Impossibile copiare negli appunti di sistema: {e}
|
||||
@@ -3958,13 +3963,11 @@ axis Both Entrambi
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) seleziona con Selezione diretta i punti di ancoraggio in cui tagliare (non i punti finali dei tracciati aperti)
|
||||
@msg Divide Objects Below: select a path Dividi oggetti sottostanti: seleziona un tracciato
|
||||
@msg Divide Objects Below: select exactly one path Dividi oggetti sottostanti: seleziona esattamente un tracciato
|
||||
@msg Downloaded {_1} file(s) File scaricati: {_1}
|
||||
@msg Downloaded {what} Scaricato {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Espandi aspetto: la selezione ha un aspetto di base
|
||||
@msg Expand: no brush strokes selected Espandi: nessuna traccia di pennello selezionata
|
||||
@msg Expand: no gradient fills Espandi: nessun riempimento con sfumatura
|
||||
@msg Expand: nothing to expand Espandi: niente da espandere
|
||||
@msg Exported {count} file(s) to {folder} File esportati in {folder}: {count}
|
||||
@msg Exported {path} Esportato {path}
|
||||
@msg Flatten Transparency: select objects to flatten Appiattisci trasparenza: seleziona gli oggetti da appiattire
|
||||
@msg Flatten Transparency: {e} Appiattisci trasparenza: {e}
|
||||
@@ -4525,10 +4528,6 @@ axis Both Entrambi
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` occupa {size} byte (limite {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} è già usato da {_2}
|
||||
@msg {_1} is reserved by the system {_1} è riservato dal sistema
|
||||
@msg {_1} linked file(s) can't be read here: their previews show file collegati non leggibili qui: {_1}; vengono mostrate le loro anteprime
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes immagini non decodificabili: {undecoded}; vengono mostrate come riquadri barrati da una croce
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions immagini collegate modificate su disco: {_1}; Aggiorna collegamenti mostra le nuove versioni
|
||||
@msg Updated {_1} linked file(s) changed on disk File collegati modificati su disco aggiornati: {_1}
|
||||
@msg {_1}: not saved, so not closed {_1}: non salvato, quindi non chiuso
|
||||
@msg {bpp}-bit bitmaps can't be read impossibile leggere bitmap a {bpp} bit
|
||||
@msg {command} didn't create an object {command} non ha creato alcun oggetto
|
||||
@@ -4548,7 +4547,6 @@ axis Both Entrambi
|
||||
@msg Couldn't place {name}: {e} Impossibile inserire {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Impossibile incollare dagli appunti: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Salvato {path} con {_1} nota/e: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Esportato {what} con {_1} nota/e: {first}
|
||||
@msg Exported {what} Esportato {what}
|
||||
@msg Saved {n} files beside {path} Salvati {n} file accanto a {path}
|
||||
@msg Saving Salvataggio
|
||||
@@ -4559,12 +4557,26 @@ axis Both Entrambi
|
||||
@msg Saving recovery data for {_1} Salvataggio dei dati di recupero per {_1}
|
||||
@msg Discarded {_1} recovered document(s) Documenti recuperati scartati: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Documenti recuperati ripristinati: {_1}. Salvali per conservarli
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Immagini incorporate: {n}; mancanti: {missing} (ricollegale prima)
|
||||
@msg Embedded {n} image(s) Immagini incorporate: {n}
|
||||
@msg Relinked {_1} image(s) Immagini ricollegate: {_1}
|
||||
@msg Relinked {n} image(s) Immagini ricollegate: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Immagini ricollegate: {n}; non presenti in quella cartella: {_1}
|
||||
@msg Updated {_1} image(s) Immagini aggiornate: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Incorporata {n} immagine; mancanti: {missing} (ricollegale prima)|Incorporate {n} immagini; mancanti: {missing} (ricollegale prima)
|
||||
@msgplural Embedded {n} image|Embedded {n} images Incorporata {n} immagine|Incorporate {n} immagini
|
||||
@msgplural Relinked {n} image|Relinked {n} images Ricollegata {n} immagine|Ricollegate {n} immagini
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Ricollegata {n} immagine; non presenti in quella cartella: {names}|Ricollegate {n} immagini; non presenti in quella cartella: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Ricollegata {n} immagine; impossibile ricollegare {name}: {reason}|Ricollegate {n} immagini; impossibile ricollegare {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Aggiornata {n} immagine|Aggiornate {n} immagini
|
||||
@msgplural Replaced {n} image|Replaced {n} images Sostituita {n} immagine|Sostituite {n} immagini
|
||||
@msgplural Broke {n} link|Broke {n} links Interrotto {n} collegamento|Interrotti {n} collegamenti
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Interrotto {n} collegamento; impossibile leggerne {missing}: ricollegali o aggiornali prima|Interrotti {n} collegamenti; impossibile leggerne {missing}: ricollegali o aggiornali prima
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} file collegato non leggibile qui: viene mostrata la sua anteprima|{n} file collegati non leggibili qui: vengono mostrate le loro anteprime
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} immagine non decodificabile: viene mostrata come riquadro barrato da una croce|{n} immagini non decodificabili: vengono mostrate come riquadri barrati da una croce
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} immagine collegata modificata su disco: Aggiorna collegamenti mostra la nuova versione|{n} immagini collegate modificate su disco: Aggiorna collegamenti mostra le nuove versioni
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Aggiornato {n} file collegato modificato su disco|Aggiornati {n} file collegati modificati su disco
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Esportato {what} con {n} nota: {first}|Esportato {what} con {n} note: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} file di font ora in {folder}|{n} file di font ora in {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} file di font ora in {folder}; impossibile aggiungerne {failed}: {reason}|{n} file di font ora in {folder}; impossibile aggiungerne {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} font non disponibile qui: il suo testo viene mostrato con un altro font|{n} font non disponibili qui: il loro testo viene mostrato con un altro font
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Copiato il CSS di {n} oggetto|Copiato il CSS di {n} oggetti
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Scaricato {n} file|Scaricati {n} file
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Esportato {n} file in {folder}|Esportati {n} file in {folder}
|
||||
@msg Unembedded to {_1} Incorporamento rimosso, salvato in {_1}
|
||||
@msg Reset {_1} Reimpostato {_1}
|
||||
@msg Sent to {_1} Inviato a {_1}
|
||||
@@ -4616,9 +4628,6 @@ axis Both Entrambi
|
||||
@msg every search thread stopped on an internal error (please report this bug) tutti i thread di ricerca si sono fermati per un errore interno (segnala questo bug)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it La cartella Fonts di VectorCraft non è impostata qui: la impostano l'app desktop e vectorcraft-cli
|
||||
@msg choose the font files to add scegli i file dei font da aggiungere
|
||||
@msg {n} font file(s) are now in {folder} File di font ora in {folder}: {n}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} File di font ora in {folder}: {n}; impossibile aggiungerne {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font font non disponibili qui: {n}; il loro testo viene mostrato con un altro font
|
||||
@msg not a file non è un file
|
||||
@msg not a font file non è un file di font
|
||||
@msg that document is no longer open quel documento non è più aperto
|
||||
@@ -4627,7 +4636,6 @@ axis Both Entrambi
|
||||
@msg every numbered name for it is taken in the Fonts folder tutti i nomi numerati per il file sono già usati nella cartella Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder tutti i nomi numerati per {name} sono già usati nella cartella del documento
|
||||
@msg No linked files to look for Nessun file collegato da cercare
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Immagini ricollegate: {n}; impossibile ricollegare {name}: {reason}
|
||||
|
||||
# The macOS menu bar (native_menu): the app and Window menus' system items, Settings pages.
|
||||
Services Servizi
|
||||
@@ -5731,3 +5739,22 @@ breakText Glyphs Glifi
|
||||
Text Flow Flusso del testo
|
||||
By Rows Per righe
|
||||
By Columns Per colonne
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opacità casuale…
|
||||
Randomize Opacity Opacità casuale
|
||||
Minimum: Minimo:
|
||||
Maximum: Massimo:
|
||||
Seed: Seme:
|
||||
@msg `min` is greater than `max` `min` è maggiore di `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Ordina oggetti…
|
||||
Sort Objects Ordina oggetti
|
||||
Sort By: Ordina per:
|
||||
Apply To: Applica a:
|
||||
Area Area
|
||||
X Position Posizione X
|
||||
Y Position Posizione Y
|
||||
Stacking Order Ordine di sovrapposizione
|
||||
Small to Large Dal più piccolo al più grande
|
||||
Large to Small Dal più grande al più piccolo
|
||||
Distribute Evenly Distribuisci uniformemente
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -1312,6 +1312,9 @@ digits Malayalam マラヤーラム数字
|
||||
Delete Swatch スウォッチを削除
|
||||
Delete Symbol シンボルを削除
|
||||
Delete the selected symbol? 選択したシンボルを削除しますか?
|
||||
Delete the selected symbols? 選択したシンボルを削除しますか?
|
||||
No unused symbols 未使用のシンボルはありません
|
||||
Delete Symbols シンボルを削除
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. 1 つ以上のシンボルが使用中のため、インスタンスを拡張または削除するまで削除できません。
|
||||
Expand Instances インスタンスを拡張
|
||||
Delete Instances インスタンスを削除
|
||||
@@ -3045,6 +3048,7 @@ mark-style Japanese 日本式
|
||||
Superscript: 上付き文字:
|
||||
Swap Fill and Stroke 塗りと線を入れ替え
|
||||
Swap start and end arrowheads 始点と終点の矢印を入れ替え
|
||||
Stylistic Alternates スタイル代替字
|
||||
Swash スワッシュ
|
||||
Swatch Conflict スウォッチの競合
|
||||
Swatch Conflicts スウォッチの競合
|
||||
@@ -3619,6 +3623,7 @@ file-filter Templates テンプレート
|
||||
Preset {} プリセット {}
|
||||
Preview in Browser needs the desktop app (the web downloads files instead) ブラウザーでプレビューにはデスクトップアプリが必要です (Web アプリではファイルがダウンロードされます)
|
||||
Print presets プリントプリセット
|
||||
Proportional Lining プロポーショナルライニング
|
||||
Proportional Oldstyle プロポーショナルオールドスタイル
|
||||
Punctuation 句読点
|
||||
Radius 1 半径 1
|
||||
@@ -3700,6 +3705,7 @@ file-filter Templates テンプレート
|
||||
System Layout システムレイアウト
|
||||
Tabular Lining 等幅ライニング
|
||||
Tabular Oldstyle 等幅オールドスタイル
|
||||
Titling Alternates タイトル代替字
|
||||
Tate-chu-yoko 縦中横
|
||||
Temperature 色温度
|
||||
Template テンプレート
|
||||
@@ -4007,7 +4013,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg the drawing is too large to open 図面が大きすぎて開けません
|
||||
@msg scale must be a number from {_1} to {_2}, not {_3} 縮尺は {_1} から {_2} までの数値にしてください ({_3} は指定できません)
|
||||
@msg an image has no pixels and was left out ピクセルがない画像を省略しました
|
||||
@msg Embedded {n} image(s) 画像を {n} 枚埋め込みました
|
||||
@msg object {0} cannot have children オブジェクト {0} には子オブジェクトを含められません
|
||||
@msg range `{s}` is empty 範囲 `{s}` が空です
|
||||
@msg range `{s}`: `{part}` names no number 範囲 `{s}`: `{part}` に番号が指定されていません
|
||||
@@ -4475,10 +4480,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg the PDF is no longer loaded PDF はもう読み込まれていません
|
||||
@msg no such layer or object 指定されたレイヤーまたはオブジェクトが見つかりません
|
||||
@msg `{tool}` isn't a Liquify tool `{tool}` はゆがみツールではありません
|
||||
@msg {_1} linked file(s) can't be read here: their previews show この環境では {_1} 個のリンクファイルを読み込めません: 代わりにプレビューを表示しています
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} 個の画像をデコードできませんでした: バツ印の付いた枠で表示しています
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} 個のリンク画像がディスク上で変更されました: 「リンクを更新」で新しいバージョンを表示できます
|
||||
@msg Updated {_1} linked file(s) changed on disk ディスク上で変更された {_1} 個のリンクファイルを更新しました
|
||||
@msg pick a colour, gradient or pattern to save as a swatch スウォッチとして保存するカラー、グラデーション、またはパターンを選択してください
|
||||
@msgplural Packaged {n} file ({note}) in {folder}|Packaged {n} files ({note}) in {folder} {n} 個のファイルを {folder} にパッケージしました({note})
|
||||
@msg Packaged {n} file(s){note} {n} 個のファイルをパッケージしました{note}
|
||||
@@ -4506,7 +4507,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg print settings are not an object プリント設定がオブジェクト形式ではありません
|
||||
@msg no colour group `{g}` カラーグループ `{g}` が見つかりません
|
||||
@msg select artwork (or a colour group) to recolor 再配色するアートワーク (またはカラーグループ) を選択してください
|
||||
@msg Downloaded {_1} file(s) {_1} 個のファイルをダウンロードしました
|
||||
@msg Preview in Browser needs the desktop app (the web downloads files instead) 「ブラウザーでプレビュー」にはデスクトップアプリが必要です (Web 版では代わりにファイルをダウンロードします)
|
||||
@msg no file system here この環境にはファイルシステムがありません
|
||||
@msg nothing to preview プレビューするものがありません
|
||||
@@ -4534,7 +4534,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg unknown panel `{raw}` `{raw}` は不明なパネルです
|
||||
@msg x and y must both be numbers x と y はどちらも数値で指定してください
|
||||
@msg Downloaded {what} {what} をダウンロードしました
|
||||
@msg Exported {count} file(s) to {folder} {count} 個のファイルを {folder} に書き出しました
|
||||
@msg Imported {what}: {_1} {what} を読み込みました: {_1}
|
||||
@msg Installed plug-in {_1} プラグイン {_1} をインストールしました
|
||||
@msg Opened with {_1} note(s): {_2} ドキュメントを開きました (注意 {_1} 件): {_2}
|
||||
@@ -4548,7 +4547,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg the document has never been saved ドキュメントはまだ一度も保存されていません
|
||||
@msg the export returned unreadable data 書き出し処理から読み取れないデータが返されました
|
||||
@msg {status} ({e}) {status} ({e})
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} を書き出しましたが、注意事項が {_1} 件あります: {first}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} を保存しましたが、注意事項が {_1} 件あります: {first}
|
||||
@msg Couldn't open {name}: {e} {name} を開けませんでした: {e}
|
||||
@msg Couldn't read {name}: {e} {name} を読み込めませんでした: {e}
|
||||
@@ -4607,7 +4605,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg the library item is damaged ライブラリの項目が破損しています
|
||||
@msg {_1} font families available {_1} 個のフォントファミリーを使用できます
|
||||
@msg {_1} has no {_2} style {_1} には {_2} スタイルがありません
|
||||
@msg Copied the CSS of {rules} object(s) {rules} 個のオブジェクトの CSS をコピーしました
|
||||
@msg Copied the script report スクリプトのレポートをコピーしました
|
||||
@msg Exported {path} {path} を書き出しました
|
||||
@msg no CSS to copy: select objects with CSS of their own コピーする CSS がありません: 独自の CSS を持つオブジェクトを選択してください
|
||||
@@ -4620,12 +4617,27 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg no library `{key}` (see {list}) ライブラリ `{key}` が見つかりません ({list} を参照)
|
||||
@msg select a linked image: an embedded one has no file リンク画像を選択してください: 埋め込み画像にはファイルがありません
|
||||
@msg {path} can't be found: relink it first {path} が見つかりません: 先に再リンクしてください
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first 画像を {n} 枚埋め込みましたが、{missing} 枚は見つかりません: 先に再リンクしてください
|
||||
@msg Relinked {_1} image(s) 画像を {_1} 枚再リンクしました
|
||||
@msg Relinked {n} image(s) 画像を {n} 枚再リンクしました
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} 画像を {n} 枚再リンクしましたが、次の画像はそのフォルダーにありません: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first 画像を {n} 枚埋め込みましたが、{missing} 枚は見つかりません: 先に再リンクしてください
|
||||
@msgplural Embedded {n} image|Embedded {n} images 画像を {n} 枚埋め込みました
|
||||
@msgplural Relinked {n} image|Relinked {n} images 画像を {n} 枚再リンクしました
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} 画像を {n} 枚再リンクしましたが、次の画像はそのフォルダーにありません: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} 画像を {n} 枚再リンクしましたが、{name} は再リンクできませんでした: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images 画像を {n} 枚更新しました
|
||||
@msgplural Replaced {n} image|Replaced {n} images 画像を {n} 枚置換しました
|
||||
@msgplural Broke {n} link|Broke {n} links {n} 個のリンクを解除しました
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} 個のリンクを解除しましたが、{missing} 個は読み込めません: 先に再リンクするか更新してください
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show この環境では {n} 個のリンクファイルを読み込めません: 代わりにプレビューを表示しています
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} 個の画像をデコードできませんでした: バツ印の付いた枠で表示しています
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} 個のリンク画像がディスク上で変更されました: 「リンクを更新」で新しいバージョンを表示できます
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk ディスク上で変更された {n} 個のリンクファイルを更新しました
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} を書き出しましたが、注意事項が {n} 件あります: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} 個のフォントファイルが {folder} に入りました
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} 個のフォントファイルが {folder} に入りましたが、{failed} 個は追加できませんでした: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} 個のフォントはこの環境では使用できません: テキストは別のフォントで表示されます
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects {n} 個のオブジェクトの CSS をコピーしました
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} 個のファイルをダウンロードしました
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} 個のファイルを {folder} に書き出しました
|
||||
@msg Unembedded to {_1} 埋め込みを解除して {_1} に保存しました
|
||||
@msg Updated {_1} image(s) 画像を {_1} 枚更新しました
|
||||
@msg no swatch library `{l}` (see swatch.library.list) スウォッチライブラリ `{l}` が見つかりません (swatch.library.list を参照)
|
||||
@msg no user library folder here この環境にはユーザーライブラリフォルダーがありません
|
||||
@msg Couldn't place {name}: the document it was dropped on was closed {name} を配置できませんでした: ドロップ先のドキュメントは閉じられています
|
||||
@@ -4685,9 +4697,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg every search thread stopped on an internal error (please report this bug) すべての検索スレッドが内部エラーで停止しました (このバグを報告してください)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it この環境では VectorCraft の Fonts フォルダーが設定されていません: デスクトップアプリと vectorcraft-cli が設定します
|
||||
@msg choose the font files to add 追加するフォントファイルを選択してください
|
||||
@msg {n} font file(s) are now in {folder} {n} 個のフォントファイルが {folder} に入りました
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} 個のフォントファイルが {folder} に入りましたが、{failed} 個は追加できませんでした: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} 個のフォントはこの環境では使用できません: テキストは別のフォントで表示されます
|
||||
@msg not a file ファイルではありません
|
||||
@msg not a font file フォントファイルではありません
|
||||
@msg that document is no longer open そのドキュメントはもう開かれていません
|
||||
@@ -4696,7 +4705,6 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg every numbered name for it is taken in the Fonts folder Fonts フォルダーでは、このファイルの番号付きの名前がすべて使われています
|
||||
@msg every numbered name for {name} is taken in the document's folder ドキュメントのフォルダーでは、{name} の番号付きの名前がすべて使われています
|
||||
@msg No linked files to look for 検索するリンクファイルがありません
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} 画像を {n} 枚再リンクしましたが、{name} は再リンクできませんでした: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` はステップ参照 {r} です。ステップ参照を解決できるのは `run` と `command_batch` だけです
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` はオブジェクト ID の配列にしてください ({v} は使えません)
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` はアンカーポイントのインデックスの配列にしてください ({v} は使えません)
|
||||
@@ -5798,3 +5806,22 @@ breakText Glyphs 字形
|
||||
Text Flow テキストの流れ
|
||||
By Rows 行方向
|
||||
By Columns 列方向
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… 不透明度をランダム化…
|
||||
Randomize Opacity 不透明度をランダム化
|
||||
Minimum: 最小:
|
||||
Maximum: 最大:
|
||||
Seed: シード:
|
||||
@msg `min` is greater than `max` `min` が `max` より大きくなっています
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… オブジェクトを並べ替え…
|
||||
Sort Objects オブジェクトを並べ替え
|
||||
Sort By: 並べ替えの基準:
|
||||
Apply To: 適用先:
|
||||
Area 面積
|
||||
X Position X 位置
|
||||
Y Position Y 位置
|
||||
Stacking Order 重ね順
|
||||
Small to Large 小さい順
|
||||
Large to Small 大きい順
|
||||
Distribute Evenly 均等に分布
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -568,7 +568,6 @@
|
||||
Links ბმულები
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? დისკზე შეიცვალა დაკავშირებული გამოსახულებები ({n}). ვაჩვენო ახალი ვერსიები?
|
||||
Update Changed Links შეცვლილი ბმულების განახლება
|
||||
@msg Updated {_1} linked file(s) changed on disk განახლდა დისკზე შეცვლილი დაკავშირებული ფაილები: {_1}
|
||||
Magic Wand ჯადოსნური ჯოხი
|
||||
Navigator ნავიგატორი
|
||||
Pattern Options პატერნის პარამეტრები
|
||||
@@ -1525,13 +1524,16 @@ digits Malayalam მალაიალამური
|
||||
Fractions წილადები
|
||||
Ligatures are off while the text is tracked. ტექსტზე ტრეკინგის დროს ლიგატურები გამორთულია.
|
||||
Ordinals რიგობითი რიცხვები
|
||||
Proportional Lining პროპორციული ხაზოვანი
|
||||
Proportional Oldstyle პროპორციული ძველებური
|
||||
Reset OpenType Features OpenType შესაძლებლობების ჩამოყრა
|
||||
Select text to set its OpenType features. OpenType შესაძლებლობების დასაყენებლად მონიშნეთ ტექსტი.
|
||||
Standard Ligatures სტანდარტული ლიგატურები
|
||||
Stylistic Alternates სტილისტური ალტერნატივები
|
||||
Swash მოხატული ასოები (swash)
|
||||
Tabular Lining ცხრილური ხაზოვანი
|
||||
Tabular Oldstyle ცხრილური ძველებური
|
||||
Titling Alternates სათაურის ალტერნატივები
|
||||
Every-line Composer აბზაცის მიხედვით აწყობა
|
||||
First-line Left Indent პირველი სტრიქონის მარცხენა შეწევა
|
||||
Hyphenation… სიტყვების გადატანა…
|
||||
@@ -2670,6 +2672,9 @@ theme Appearance იერსახე
|
||||
Delete Brush ფუნჯის წაშლა
|
||||
Delete Symbol სიმბოლოს წაშლა
|
||||
Delete the selected symbol? წაიშალოს მონიშნული სიმბოლო?
|
||||
Delete the selected symbols? წაიშალოს მონიშნული სიმბოლოები?
|
||||
No unused symbols გამოუყენებელი სიმბოლოები არ არის
|
||||
Delete Symbols სიმბოლოების წაშლა
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. ერთი ან მეტი სიმბოლო გამოიყენება და მისი წაშლა შეუძლებელია, სანამ მისი ეგზემპლარები არ გაიშლება ან არ წაიშლება.
|
||||
Expand Instances ეგზემპლარების გაშლა
|
||||
Delete Instances ეგზემპლარების წაშლა
|
||||
@@ -3696,7 +3701,6 @@ font-technology Variable ცვლადი
|
||||
@msg Combine Slices: the slices have no bounds ნაჭრების გაერთიანება: ნაჭრებს საზღვრები არ აქვს
|
||||
@msg Convert to Artboards: selection has no area სამუშაო დაფებად გარდაქმნა: მონიშნულს ფართობი არ აქვს
|
||||
@msg Convert to Shape: no rectangles or ellipses selected ფიგურად გარდაქმნა: მართკუთხედები ან ელიფსები მონიშნული არ არის
|
||||
@msg Copied the CSS of {rules} object(s) კოპირებულია ობიექტის CSS ({rules})
|
||||
@msg Corners edits the corners of a path „კუთხეები“ ტრაექტორიის კუთხეებს არედაქტირებს
|
||||
@msg Couldn't copy to the system clipboard: {e} სისტემის გაცვლის ბუფერში კოპირება ვერ მოხერხდა: {e}
|
||||
@msg Couldn't open {name}: {e} {name} ვერ გაიხსნა: {e}
|
||||
@@ -3712,13 +3716,11 @@ font-technology Variable ცვლადი
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) პირდაპირი მონიშვნით მონიშნეთ საყრდენი წერტილები, სადაც გაიჭრება (არა ღია ტრაექტორიების ბოლო წერტილები)
|
||||
@msg Divide Objects Below: select a path ქვედა ობიექტების დაყოფა: მონიშნეთ ტრაექტორია
|
||||
@msg Divide Objects Below: select exactly one path ქვედა ობიექტების დაყოფა: მონიშნეთ ზუსტად ერთი ტრაექტორია
|
||||
@msg Downloaded {_1} file(s) ჩამოტვირთულია ფაილი ({_1})
|
||||
@msg Downloaded {what} ჩამოტვირთულია: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance იერსახის გაშლა: მონიშნულს საბაზისო იერსახე აქვს
|
||||
@msg Expand: no brush strokes selected გაშლა: ფუნჯის შტრიხები მონიშნული არ არის
|
||||
@msg Expand: no gradient fills გაშლა: გრადიენტული შევსებები არ არის
|
||||
@msg Expand: nothing to expand გაშლა: გასაშლელი არაფერია
|
||||
@msg Exported {count} file(s) to {folder} ექსპორტირებულია ფაილი ({count}) საქაღალდეში {folder}
|
||||
@msg Exported {path} ექსპორტირებულია: {path}
|
||||
@msg Flatten Transparency: select objects to flatten გამჭვირვალობის გაბრტყელება: მონიშნეთ გასაბრტყელებელი ობიექტები
|
||||
@msg Flatten Transparency: {e} გამჭვირვალობის გაბრტყელება: {e}
|
||||
@@ -4237,9 +4239,6 @@ font-technology Variable ცვლადი
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` {size} ბაიტია (ლიმიტი {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} უკვე გამოიყენება აქ: {_2}
|
||||
@msg {_1} is reserved by the system {_1} დაჯავშნილია სისტემის მიერ
|
||||
@msg {_1} linked file(s) can't be read here: their previews show მიბმული ფაილების წაკითხვა აქ ვერ ხერხდება ({_1}): ჩანს მათი გადახედვა
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes სურათების დეკოდირება ვერ მოხერხდა ({undecoded}): ისინი ჯვრით გადახაზული ჩარჩოებით ჩანს
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions მიბმული გამოსახულებები შეიცვალა დისკზე ({_1}): ბმულების განახლება აჩვენებს ახალ ვერსიებს
|
||||
@msg {_1}: not saved, so not closed {_1}: არ შენახულა, ამიტომ არ დაიხურა
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-ბიტიანი bitmap-ების წაკითხვა ვერ ხერხდება
|
||||
@msg {command} didn't create an object {command}-მა ობიექტი არ შექმნა
|
||||
@@ -4258,7 +4257,6 @@ font-technology Variable ცვლადი
|
||||
@msg Couldn't place {name}: {e} {name}-ის განთავსება ვერ მოხერხდა: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} გაცვლის ბუფერიდან ჩასმა ვერ მოხერხდა: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} შენახულია {path}, შენიშვნები: {_1}: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} ექსპორტირებულია {what}, შენიშვნები: {_1}: {first}
|
||||
@msg Exported {what} ექსპორტირებულია {what}
|
||||
@msg Saved {n} files beside {path} {path}-ის გვერდით შენახულია ფაილები: {n}
|
||||
@msg Saving შენახვა
|
||||
@@ -4269,12 +4267,26 @@ font-technology Variable ცვლადი
|
||||
@msg Saving recovery data for {_1} {_1}-ის აღდგენის მონაცემების შენახვა
|
||||
@msg Discarded {_1} recovered document(s) უარყოფილია აღდგენილი დოკუმენტები: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them აღდგენილია დოკუმენტები: {_1}: შესანარჩუნებლად შეინახეთ ისინი
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first ჩაშენებულია გამოსახულებები: {n}; აკლია {missing}: ჯერ ხელახლა მიაბით
|
||||
@msg Embedded {n} image(s) ჩაშენებულია გამოსახულებები: {n}
|
||||
@msg Relinked {_1} image(s) ხელახლა მიბმულია გამოსახულებები: {_1}
|
||||
@msg Relinked {n} image(s) ხელახლა მიბმულია გამოსახულებები: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} ხელახლა მიბმულია გამოსახულებები: {n}; იმ საქაღალდეში არ არის: {_1}
|
||||
@msg Updated {_1} image(s) განახლებულია გამოსახულებები: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first ჩაშენებულია გამოსახულებები: {n}; აკლია {missing}: ჯერ ხელახლა მიაბით
|
||||
@msgplural Embedded {n} image|Embedded {n} images ჩაშენებულია გამოსახულებები: {n}
|
||||
@msgplural Relinked {n} image|Relinked {n} images ხელახლა მიბმულია გამოსახულებები: {n}
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} ხელახლა მიბმულია გამოსახულებები: {n}; იმ საქაღალდეში არ არის: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} ხელახლა დაკავშირდა გამოსახულება: {n}; {name} ვერ დაკავშირდა: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images განახლებულია გამოსახულებები: {n}
|
||||
@msgplural Replaced {n} image|Replaced {n} images ჩანაცვლებულია გამოსახულებები: {n}
|
||||
@msgplural Broke {n} link|Broke {n} links გაწყვეტილია ბმულები: {n}
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first გაწყვეტილია ბმულები: {n}; ვერ იკითხება {missing}: ჯერ ხელახლა მიაბით ან განაახლეთ
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show მიბმული ფაილების წაკითხვა აქ ვერ ხერხდება ({n}): ჩანს მათი გადახედვა
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes სურათების დეკოდირება ვერ მოხერხდა ({n}): ისინი ჯვრით გადახაზული ჩარჩოებით ჩანს
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions მიბმული გამოსახულებები შეიცვალა დისკზე ({n}): ბმულების განახლება აჩვენებს ახალ ვერსიებს
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk განახლდა დისკზე შეცვლილი დაკავშირებული ფაილები: {n}
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} ექსპორტირებულია {what}, შენიშვნები: {n}: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} შრიფტის ფაილები ({n}) ახლა აქ არის: {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} შრიფტის ფაილები ({n}) ახლა აქ არის: {folder}; ვერ დაემატა {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font შრიფტები ({n}) აქ მიუწვდომელია: მათი ტექსტი სხვა შრიფტით ჩანს
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects კოპირებულია ობიექტის CSS ({n})
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files ჩამოტვირთულია ფაილი ({n})
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} ექსპორტირებულია ფაილი ({n}) საქაღალდეში {folder}
|
||||
@msg Unembedded to {_1} ჩაშენება მოხსნილია: {_1}
|
||||
@msg Reset {_1} ჩამოყრილია: {_1}
|
||||
@msg Sent to {_1} გაგზავნილია: {_1}
|
||||
@@ -4322,9 +4334,6 @@ font-technology Variable ცვლადი
|
||||
@msg every search thread stopped on an internal error (please report this bug) ძიების ყველა ნაკადი შიდა შეცდომით შეჩერდა (გთხოვთ, შეგვატყობინოთ ეს ხარვეზი)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it VectorCraft-ის შრიფტების საქაღალდე აქ დაყენებული არ არის: მას აყენებს სამაგიდო აპი და vectorcraft-cli
|
||||
@msg choose the font files to add აირჩიეთ დასამატებელი შრიფტის ფაილები
|
||||
@msg {n} font file(s) are now in {folder} შრიფტის ფაილები ({n}) ახლა აქ არის: {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} შრიფტის ფაილები ({n}) ახლა აქ არის: {folder}; ვერ დაემატა {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font შრიფტები ({n}) აქ მიუწვდომელია: მათი ტექსტი სხვა შრიფტით ჩანს
|
||||
@msg not a file ფაილი არ არის
|
||||
@msg not a font file შრიფტის ფაილი არ არის
|
||||
@msg that document is no longer open ის დოკუმენტი აღარ არის გახსნილი
|
||||
@@ -4682,7 +4691,6 @@ font-technology Variable ცვლადი
|
||||
@msg the art on them differs from the page's in {_1}% of it: they come from its editing data all the same მათზე არსებული ნახატი გვერდისგან {_1}%-ით განსხვავდება: მიუხედავად ამისა, ისინი რედაქტირების მონაცემებიდან აიღება
|
||||
@msg every numbered name for {name} is taken in the document's folder დოკუმენტის საქაღალდეში {name}-ის ყველა დანომრილი სახელი დაკავებულია
|
||||
@msg No linked files to look for მოსაძებნი დაკავშირებული ფაილები არ არის
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} ხელახლა დაკავშირდა გამოსახულება: {n}; {name} ვერ დაკავშირდა: {reason}
|
||||
Ruler Origin სახაზავების სათავე
|
||||
Reset Ruler Origin სახაზავების სათავის ჩამოყრა
|
||||
Artistic მხატვრული
|
||||
@@ -6101,3 +6109,22 @@ breakText Glyphs გლიფები
|
||||
Text Flow ტექსტის დინება
|
||||
By Rows სტრიქონების მიხედვით
|
||||
By Columns სვეტების მიხედვით
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… შემთხვევითი გაუმჭვირვალობა…
|
||||
Randomize Opacity შემთხვევითი გაუმჭვირვალობა
|
||||
Minimum: მინიმუმი:
|
||||
Maximum: მაქსიმუმი:
|
||||
Seed: საწყისი რიცხვი:
|
||||
@msg `min` is greater than `max` `min` მეტია, ვიდრე `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… ობიექტების დალაგება…
|
||||
Sort Objects ობიექტების დალაგება
|
||||
Sort By: დალაგება:
|
||||
Apply To: გამოყენება:
|
||||
Area ფართობი
|
||||
X Position X პოზიცია
|
||||
Y Position Y პოზიცია
|
||||
Stacking Order დაწყობის რიგი
|
||||
Small to Large პატარიდან დიდისკენ
|
||||
Large to Small დიდიდან პატარისკენ
|
||||
Distribute Evenly თანაბრად განაწილება
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -1302,6 +1302,9 @@ digits Malayalam 말라얄람어
|
||||
Delete Swatch 견본 삭제
|
||||
Delete Symbol 심볼 삭제
|
||||
Delete the selected symbol? 선택한 심볼을 삭제하시겠습니까?
|
||||
Delete the selected symbols? 선택한 심볼을 모두 삭제하시겠습니까?
|
||||
No unused symbols 사용하지 않는 심볼이 없습니다
|
||||
Delete Symbols 심볼 삭제
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. 하나 이상의 심볼이 사용 중이므로 인스턴스를 확장하거나 삭제하기 전에는 삭제할 수 없습니다.
|
||||
Expand Instances 인스턴스 확장
|
||||
Delete Instances 인스턴스 삭제
|
||||
@@ -3034,6 +3037,7 @@ mark-style Japanese 일본식
|
||||
Superscript: 위 첨자:
|
||||
Swap Fill and Stroke 칠과 선 바꾸기
|
||||
Swap start and end arrowheads 시작과 끝 화살촉 바꾸기
|
||||
Stylistic Alternates 스타일 대체 글자
|
||||
Swash 스워시
|
||||
Swatch Conflict 견본 충돌
|
||||
Swatch Conflicts 견본 충돌
|
||||
@@ -3607,6 +3611,7 @@ file-filter Templates 템플릿
|
||||
Preset {} 프리셋 {}
|
||||
Preview in Browser needs the desktop app (the web downloads files instead) 브라우저에서 미리 보기는 데스크톱 앱이 필요합니다(웹에서는 파일이 다운로드됩니다)
|
||||
Print presets 인쇄 프리셋
|
||||
Proportional Lining 비례 라이닝
|
||||
Proportional Oldstyle 비례 올드스타일
|
||||
Punctuation 문장 부호
|
||||
Radius 1 반지름 1
|
||||
@@ -3688,6 +3693,7 @@ file-filter Templates 템플릿
|
||||
System Layout 시스템 레이아웃
|
||||
Tabular Lining 고정폭 라이닝
|
||||
Tabular Oldstyle 고정폭 올드스타일
|
||||
Titling Alternates 제목 대체 글자
|
||||
Tate-chu-yoko 다테추요코
|
||||
Temperature 색온도
|
||||
Template 템플릿
|
||||
@@ -3934,7 +3940,6 @@ theme Appearance 외관
|
||||
@msg the drawing is too large to open 도면이 너무 커서 열 수 없습니다
|
||||
@msg scale must be a number from {_1} to {_2}, not {_3} 배율은 {_1}에서 {_2} 사이의 숫자여야 합니다: {_3}
|
||||
@msg an image has no pixels and was left out 픽셀이 없는 이미지를 제외했습니다
|
||||
@msg Embedded {n} image(s) 이미지 {n}개를 포함했습니다
|
||||
@msg object {0} cannot have children 개체 {0}에는 하위 항목을 둘 수 없습니다
|
||||
@msg range `{s}` is empty 범위 `{s}`이(가) 비어 있습니다
|
||||
@msg range `{s}`: `{part}` names no number 범위 `{s}`: `{part}`에 숫자가 없습니다
|
||||
@@ -4402,10 +4407,6 @@ theme Appearance 외관
|
||||
@msg the PDF is no longer loaded PDF가 더 이상 로드되어 있지 않습니다
|
||||
@msg no such layer or object 해당 레이어나 개체가 없습니다
|
||||
@msg `{tool}` isn't a Liquify tool `{tool}`은(는) 픽셀 유동화 도구가 아닙니다
|
||||
@msg {_1} linked file(s) can't be read here: their previews show 링크된 파일 {_1}개를 여기서 읽을 수 없습니다: 미리 보기가 표시됩니다
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes 이미지 {undecoded}개를 디코딩할 수 없습니다: X 표시가 된 상자로 표시됩니다
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions 링크된 이미지 {_1}개가 디스크에서 바뀌었습니다: 링크 업데이트를 하면 새 버전이 표시됩니다
|
||||
@msg Updated {_1} linked file(s) changed on disk 디스크에서 바뀐 링크된 파일 {_1}개를 업데이트했습니다
|
||||
@msg pick a colour, gradient or pattern to save as a swatch 견본으로 저장할 색상, 그레이디언트 또는 패턴을 선택하세요
|
||||
@msgplural Packaged {n} file ({note}) in {folder}|Packaged {n} files ({note}) in {folder} {folder}에 파일 {n}개를 패키지했습니다({note})
|
||||
@msg Packaged {n} file(s){note} 파일 {n}개를 패키지했습니다{note}
|
||||
@@ -4433,7 +4434,6 @@ theme Appearance 외관
|
||||
@msg print settings are not an object 인쇄 설정이 개체가 아닙니다
|
||||
@msg no colour group `{g}` 색상 그룹 `{g}`이(가) 없습니다
|
||||
@msg select artwork (or a colour group) to recolor 리컬러할 아트웍(또는 색상 그룹)을 선택하세요
|
||||
@msg Downloaded {_1} file(s) 파일 {_1}개를 다운로드했습니다
|
||||
@msg Preview in Browser needs the desktop app (the web downloads files instead) 브라우저에서 미리 보기는 데스크톱 앱이 필요합니다(웹에서는 파일을 다운로드합니다)
|
||||
@msg no file system here 여기에는 파일 시스템이 없습니다
|
||||
@msg nothing to preview 미리 볼 항목이 없습니다
|
||||
@@ -4461,7 +4461,6 @@ theme Appearance 외관
|
||||
@msg unknown panel `{raw}` 알 수 없는 패널 `{raw}`
|
||||
@msg x and y must both be numbers x와 y는 모두 숫자여야 합니다
|
||||
@msg Downloaded {what} {what}을(를) 다운로드했습니다
|
||||
@msg Exported {count} file(s) to {folder} 파일 {count}개를 {folder}에 내보냈습니다
|
||||
@msg Imported {what}: {_1} {what}을(를) 가져왔습니다: {_1}
|
||||
@msg Installed plug-in {_1} 플러그인 {_1}을(를) 설치했습니다
|
||||
@msg Opened with {_1} note(s): {_2} 참고 {_1}건과 함께 열었습니다: {_2}
|
||||
@@ -4475,7 +4474,6 @@ theme Appearance 외관
|
||||
@msg the document has never been saved 문서가 저장된 적이 없습니다
|
||||
@msg the export returned unreadable data 내보내기가 읽을 수 없는 데이터를 반환했습니다
|
||||
@msg {status} ({e}) {status}({e})
|
||||
@msg Exported {what} with {_1} note(s): {first} 참고 {_1}건과 함께 {what}을(를) 내보냈습니다: {first}
|
||||
@msg Saved {path} with {_1} note(s): {first} 참고 {_1}건과 함께 {path}을(를) 저장했습니다: {first}
|
||||
@msg Couldn't open {name}: {e} {name}을(를) 열 수 없습니다: {e}
|
||||
@msg Couldn't read {name}: {e} {name}을(를) 읽을 수 없습니다: {e}
|
||||
@@ -4534,7 +4532,6 @@ theme Appearance 외관
|
||||
@msg the library item is damaged 라이브러리 항목이 손상되었습니다
|
||||
@msg {_1} font families available 사용 가능한 글꼴 패밀리 {_1}개
|
||||
@msg {_1} has no {_2} style {_1}에는 {_2} 스타일이 없습니다
|
||||
@msg Copied the CSS of {rules} object(s) 개체 {rules}개의 CSS를 복사했습니다
|
||||
@msg Copied the script report 스크립트 보고서를 복사했습니다
|
||||
@msg Exported {path} {path}을(를) 내보냈습니다
|
||||
@msg no CSS to copy: select objects with CSS of their own 복사할 CSS가 없습니다: 자체 CSS가 있는 개체를 선택하세요
|
||||
@@ -4547,12 +4544,27 @@ theme Appearance 외관
|
||||
@msg no library `{key}` (see {list}) 라이브러리 `{key}`이(가) 없습니다({list} 참조)
|
||||
@msg select a linked image: an embedded one has no file 링크된 이미지를 선택하세요: 포함된 이미지에는 파일이 없습니다
|
||||
@msg {path} can't be found: relink it first {path}을(를) 찾을 수 없습니다: 먼저 다시 링크하세요
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first 이미지 {n}개를 포함했으며 {missing}개가 없습니다: 먼저 다시 링크하세요
|
||||
@msg Relinked {_1} image(s) 이미지 {_1}개를 다시 링크했습니다
|
||||
@msg Relinked {n} image(s) 이미지 {n}개를 다시 링크했습니다
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} 이미지 {n}개를 다시 링크했습니다. 해당 폴더에 없음: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first 이미지 {n}개를 포함했으며 {missing}개가 없습니다: 먼저 다시 링크하세요
|
||||
@msgplural Embedded {n} image|Embedded {n} images 이미지 {n}개를 포함했습니다
|
||||
@msgplural Relinked {n} image|Relinked {n} images 이미지 {n}개를 다시 링크했습니다
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} 이미지 {n}개를 다시 링크했습니다. 해당 폴더에 없음: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} 이미지 {n}개를 다시 링크했으며 {name}은(는) 다시 링크할 수 없었습니다: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images 이미지 {n}개를 업데이트했습니다
|
||||
@msgplural Replaced {n} image|Replaced {n} images 이미지 {n}개를 바꿨습니다
|
||||
@msgplural Broke {n} link|Broke {n} links 링크 {n}개를 끊었습니다
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first 링크 {n}개를 끊었으며 {missing}개를 읽을 수 없습니다: 먼저 다시 링크하거나 업데이트하세요
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show 링크된 파일 {n}개를 여기서 읽을 수 없습니다: 미리 보기가 표시됩니다
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes 이미지 {n}개를 디코딩할 수 없습니다: X 표시가 된 상자로 표시됩니다
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions 링크된 이미지 {n}개가 디스크에서 바뀌었습니다: 링크 업데이트를 하면 새 버전이 표시됩니다
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk 디스크에서 바뀐 링크된 파일 {n}개를 업데이트했습니다
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} 참고 {n}건과 함께 {what}을(를) 내보냈습니다: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} 글꼴 파일 {n}개가 이제 {folder}에 있습니다
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} 글꼴 파일 {n}개가 이제 {folder}에 있으며, {failed}개는 추가할 수 없었습니다: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font 글꼴 {n}개를 여기서 사용할 수 없습니다: 해당 텍스트는 다른 글꼴로 표시됩니다
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects 개체 {n}개의 CSS를 복사했습니다
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files 파일 {n}개를 다운로드했습니다
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} 파일 {n}개를 {folder}에 내보냈습니다
|
||||
@msg Unembedded to {_1} {_1}에 포함 해제했습니다
|
||||
@msg Updated {_1} image(s) 이미지 {_1}개를 업데이트했습니다
|
||||
@msg no swatch library `{l}` (see swatch.library.list) 견본 라이브러리 `{l}`이(가) 없습니다(swatch.library.list 참조)
|
||||
@msg no user library folder here 여기에는 사용자 라이브러리 폴더가 없습니다
|
||||
@msg Couldn't place {name}: the document it was dropped on was closed {name}을(를) 가져올 수 없습니다: 놓은 문서가 닫혔습니다
|
||||
@@ -4612,9 +4624,6 @@ theme Appearance 외관
|
||||
@msg every search thread stopped on an internal error (please report this bug) 내부 오류로 모든 검색 스레드가 중지되었습니다(이 버그를 신고해 주세요)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it 여기에는 VectorCraft의 글꼴 폴더가 설정되어 있지 않습니다: 데스크톱 앱과 vectorcraft-cli가 설정합니다
|
||||
@msg choose the font files to add 추가할 글꼴 파일을 선택하세요
|
||||
@msg {n} font file(s) are now in {folder} 글꼴 파일 {n}개가 이제 {folder}에 있습니다
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} 글꼴 파일 {n}개가 이제 {folder}에 있으며, {failed}개는 추가할 수 없었습니다: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font 글꼴 {n}개를 여기서 사용할 수 없습니다: 해당 텍스트는 다른 글꼴로 표시됩니다
|
||||
@msg not a file 파일이 아닙니다
|
||||
@msg not a font file 글꼴 파일이 아닙니다
|
||||
@msg that document is no longer open 해당 문서는 더 이상 열려 있지 않습니다
|
||||
@@ -4623,7 +4632,6 @@ theme Appearance 외관
|
||||
@msg every numbered name for it is taken in the Fonts folder 글꼴 폴더에서 이를 위한 번호 이름이 모두 사용 중입니다
|
||||
@msg every numbered name for {name} is taken in the document's folder 문서 폴더에서 {name}을(를) 위한 번호 이름이 모두 사용 중입니다
|
||||
@msg No linked files to look for 찾을 링크된 파일이 없습니다
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} 이미지 {n}개를 다시 링크했으며 {name}은(는) 다시 링크할 수 없었습니다: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id`는 단계 참조 {r}이며, `run`과 `command_batch`만 이를 해석합니다
|
||||
@msg `ids` must be an array of object ids, not {v} `ids`는 {v}이(가) 아니라 개체 id 배열이어야 합니다
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners`는 {v}이(가) 아니라 앵커 인덱스 배열이어야 합니다
|
||||
@@ -5694,3 +5702,22 @@ breakText Glyphs 글리프
|
||||
Text Flow 텍스트 흐름
|
||||
By Rows 행 방향
|
||||
By Columns 열 방향
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… 불투명도 무작위화…
|
||||
Randomize Opacity 불투명도 무작위화
|
||||
Minimum: 최소:
|
||||
Maximum: 최대:
|
||||
Seed: 시드:
|
||||
@msg `min` is greater than `max` `min`이(가) `max`보다 큽니다
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… 개체 정렬…
|
||||
Sort Objects 개체 정렬
|
||||
Sort By: 정렬 기준:
|
||||
Apply To: 적용 대상:
|
||||
Area 면적
|
||||
X Position X 위치
|
||||
Y Position Y 위치
|
||||
Stacking Order 쌓는 순서
|
||||
Small to Large 작은 것부터
|
||||
Large to Small 큰 것부터
|
||||
Distribute Evenly 균등 분포
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -640,7 +640,6 @@
|
||||
Links Koppelingen
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} gekoppelde afbeelding gewijzigd op de schijf. Nieuwe versie tonen?|{n} gekoppelde afbeeldingen gewijzigd op de schijf. Nieuwe versies tonen?
|
||||
Update Changed Links Gewijzigde koppelingen bijwerken
|
||||
@msg Updated {_1} linked file(s) changed on disk Bijgewerkt: {_1} gekoppelde bestand(en) gewijzigd op de schijf
|
||||
Magic Wand Magische toverstaf
|
||||
Navigator Navigator
|
||||
Pattern Options Patroonopties
|
||||
@@ -1636,13 +1635,16 @@ digits Malayalam Malayalam
|
||||
Fractions Breuken
|
||||
Ligatures are off while the text is tracked. Ligaturen staan uit terwijl de tekst wordt gespatieerd.
|
||||
Ordinals Rangtelwoorden
|
||||
Proportional Lining Proportionele lining
|
||||
Proportional Oldstyle Proportionele oldstyle
|
||||
Reset OpenType Features OpenType-functies herstellen
|
||||
Select text to set its OpenType features. Selecteer tekst om de OpenType-functies in te stellen.
|
||||
Standard Ligatures Standaardligaturen
|
||||
Stylistic Alternates Stilistische alternatieven
|
||||
Swash Swash
|
||||
Tabular Lining Tabulaire lining
|
||||
Tabular Oldstyle Tabulaire oldstyle
|
||||
Titling Alternates Titelalternatieven
|
||||
Every-line Composer Compositie per alinea
|
||||
First-line Left Indent Eerste regel links inspringen
|
||||
Hyphenation… Afbreken…
|
||||
@@ -2871,6 +2873,9 @@ theme Appearance Vormgeving
|
||||
Delete Brush Penseel verwijderen
|
||||
Delete Symbol Symbool verwijderen
|
||||
Delete the selected symbol? Het geselecteerde symbool verwijderen?
|
||||
Delete the selected symbols? De geselecteerde symbolen verwijderen?
|
||||
No unused symbols Geen ongebruikte symbolen
|
||||
Delete Symbols Symbolen verwijderen
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Een of meer van de symbolen zijn in gebruik en kunnen pas worden verwijderd als hun exemplaren zijn uitgebreid of verwijderd.
|
||||
Expand Instances Exemplaren uitbreiden
|
||||
Delete Instances Exemplaren verwijderen
|
||||
@@ -3938,7 +3943,6 @@ imageTrace Outline Contour
|
||||
@msg Combine Slices: the slices have no bounds Slices combineren: de slices hebben geen grenzen
|
||||
@msg Convert to Artboards: selection has no area Converteren naar tekengebieden: de selectie heeft geen oppervlakte
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Converteren naar vorm: geen rechthoeken of ellipsen geselecteerd
|
||||
@msg Copied the CSS of {rules} object(s) CSS van {rules} object(en) gekopieerd
|
||||
@msg Copied the script report Scriptrapport gekopieerd
|
||||
@msg Corners edits the corners of a path Hoeken bewerkt de hoeken van een pad
|
||||
@msg Couldn't copy to the system clipboard: {e} Kon niet naar het systeemklembord kopiëren: {e}
|
||||
@@ -3955,13 +3959,11 @@ imageTrace Outline Contour
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) selecteer met directe selectie ankerpunten om te knippen (niet de eindpunten van open paden)
|
||||
@msg Divide Objects Below: select a path Objecten eronder verdelen: selecteer een pad
|
||||
@msg Divide Objects Below: select exactly one path Objecten eronder verdelen: selecteer precies één pad
|
||||
@msg Downloaded {_1} file(s) {_1} bestand(en) gedownload
|
||||
@msg Downloaded {what} {what} gedownload
|
||||
@msg Expand Appearance: the selection has a basic appearance Vormgeving uitbreiden: de selectie heeft een basisvormgeving
|
||||
@msg Expand: no brush strokes selected Uitbreiden: geen penseelstreken geselecteerd
|
||||
@msg Expand: no gradient fills Uitbreiden: geen verloopvullingen
|
||||
@msg Expand: nothing to expand Uitbreiden: niets om uit te breiden
|
||||
@msg Exported {count} file(s) to {folder} {count} bestand(en) geëxporteerd naar {folder}
|
||||
@msg Exported {path} {path} geëxporteerd
|
||||
@msg Flatten Transparency: select objects to flatten Transparantie afvlakken: selecteer objecten om af te vlakken
|
||||
@msg Flatten Transparency: {e} Transparantie afvlakken: {e}
|
||||
@@ -4461,8 +4463,6 @@ imageTrace Outline Contour
|
||||
@msg {_1} is a live effect (Effect › Plug-ins) {_1} is een live-effect (Effect › Plug-ins)
|
||||
@msg {_1} is already used by {_2} {_1} wordt al gebruikt door {_2}
|
||||
@msg {_1} is reserved by the system {_1} is gereserveerd door het systeem
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} gekoppelde bestand(en) kunnen hier niet worden gelezen: hun voorbeelden worden weergegeven
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} gekoppelde afbeelding(en) zijn gewijzigd op de schijf: Koppelingen bijwerken toont de nieuwe versies
|
||||
@msg {_1}: not saved, so not closed {_1}: niet opgeslagen, dus niet gesloten
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-bits bitmaps kunnen niet worden gelezen
|
||||
@msg {command} didn't create an object {command} heeft geen object gemaakt
|
||||
@@ -4482,7 +4482,6 @@ imageTrace Outline Contour
|
||||
@msg Couldn't place {name}: {e} Kon {name} niet plaatsen: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Kon niet van het klembord plakken: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} opgeslagen met {_1} opmerking(en): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} geëxporteerd met {_1} opmerking(en): {first}
|
||||
@msg Exported {what} {what} geëxporteerd
|
||||
@msg Saved {n} files beside {path} {n} bestanden opgeslagen naast {path}
|
||||
@msg Saving Bezig met opslaan
|
||||
@@ -4493,12 +4492,26 @@ imageTrace Outline Contour
|
||||
@msg Saving recovery data for {_1} Bezig met opslaan van herstelgegevens voor {_1}
|
||||
@msg Discarded {_1} recovered document(s) {_1} hersteld(e) document(en) verworpen
|
||||
@msg Restored {_1} recovered document(s): save them to keep them {_1} hersteld(e) document(en) teruggezet: sla ze op om ze te behouden
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first {n} afbeelding(en) ingesloten; {missing} ontbreken: koppel ze eerst opnieuw
|
||||
@msg Embedded {n} image(s) {n} afbeelding(en) ingesloten
|
||||
@msg Relinked {_1} image(s) {_1} afbeelding(en) opnieuw gekoppeld
|
||||
@msg Relinked {n} image(s) {n} afbeelding(en) opnieuw gekoppeld
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} {n} afbeelding(en) opnieuw gekoppeld; niet in die map: {_1}
|
||||
@msg Updated {_1} image(s) {_1} afbeelding(en) bijgewerkt
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} afbeelding ingesloten; {missing} ontbreken: koppel ze eerst opnieuw|{n} afbeeldingen ingesloten; {missing} ontbreken: koppel ze eerst opnieuw
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} afbeelding ingesloten|{n} afbeeldingen ingesloten
|
||||
@msgplural Relinked {n} image|Relinked {n} images {n} afbeelding opnieuw gekoppeld|{n} afbeeldingen opnieuw gekoppeld
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} {n} afbeelding opnieuw gekoppeld; niet in die map: {names}|{n} afbeeldingen opnieuw gekoppeld; niet in die map: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} {n} afbeelding opnieuw gekoppeld; {name} kon niet opnieuw worden gekoppeld: {reason}|{n} afbeeldingen opnieuw gekoppeld; {name} kon niet opnieuw worden gekoppeld: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images {n} afbeelding bijgewerkt|{n} afbeeldingen bijgewerkt
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} afbeelding vervangen|{n} afbeeldingen vervangen
|
||||
@msgplural Broke {n} link|Broke {n} links {n} koppeling verbroken|{n} koppelingen verbroken
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} koppeling verbroken; {missing} kunnen niet worden gelezen: koppel ze eerst opnieuw of werk ze bij|{n} koppelingen verbroken; {missing} kunnen niet worden gelezen: koppel ze eerst opnieuw of werk ze bij
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} gekoppeld bestand kan hier niet worden gelezen: het voorbeeld wordt weergegeven|{n} gekoppelde bestanden kunnen hier niet worden gelezen: hun voorbeelden worden weergegeven
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} afbeelding kon niet worden gedecodeerd en wordt als doorgekruist vak weergegeven|{n} afbeeldingen konden niet worden gedecodeerd en worden als doorgekruiste vakken weergegeven
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} gekoppelde afbeelding is gewijzigd op de schijf: Koppelingen bijwerken toont de nieuwe versie|{n} gekoppelde afbeeldingen zijn gewijzigd op de schijf: Koppelingen bijwerken toont de nieuwe versies
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Bijgewerkt: {n} gekoppeld bestand gewijzigd op de schijf|Bijgewerkt: {n} gekoppelde bestanden gewijzigd op de schijf
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} geëxporteerd met {n} opmerking: {first}|{what} geëxporteerd met {n} opmerkingen: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} er staat nu {n} lettertypebestand in {folder}|er staan nu {n} lettertypebestanden in {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} er staat nu {n} lettertypebestand in {folder}; {failed} konden niet worden toegevoegd: {reason}|er staan nu {n} lettertypebestanden in {folder}; {failed} konden niet worden toegevoegd: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} lettertype hier niet beschikbaar: de tekst verschijnt in een ander lettertype|{n} lettertypen hier niet beschikbaar: de tekst verschijnt in een ander lettertype
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects CSS van {n} object gekopieerd|CSS van {n} objecten gekopieerd
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} bestand gedownload|{n} bestanden gedownload
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} bestand geëxporteerd naar {folder}|{n} bestanden geëxporteerd naar {folder}
|
||||
@msg Unembedded to {_1} Extern gemaakt: {_1}
|
||||
@msg Reset {_1} {_1} opnieuw ingesteld
|
||||
@msg Sent to {_1} Verzonden naar {_1}
|
||||
@@ -4548,9 +4561,6 @@ imageTrace Outline Contour
|
||||
@msg every search thread stopped on an internal error (please report this bug) elke zoekthread is gestopt door een interne fout (meld deze bug)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it de map Lettertypen van VectorCraft is hier niet ingesteld: de desktopapp en vectorcraft-cli stellen die in
|
||||
@msg choose the font files to add kies de lettertypebestanden die je wilt toevoegen
|
||||
@msg {n} font file(s) are now in {folder} er staan nu {n} lettertypebestand(en) in {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} er staan nu {n} lettertypebestand(en) in {folder}; {failed} konden niet worden toegevoegd: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} lettertype(n) hier niet beschikbaar: de tekst verschijnt in een ander lettertype
|
||||
@msg not a file geen bestand
|
||||
@msg not a font file geen lettertypebestand
|
||||
@msg that document is no longer open dat document is niet langer geopend
|
||||
@@ -4559,7 +4569,6 @@ imageTrace Outline Contour
|
||||
@msg every numbered name for it is taken in the Fonts folder elke genummerde naam ervoor is al vergeven in de map Lettertypen
|
||||
@msg every numbered name for {name} is taken in the document's folder elke genummerde naam voor {name} is al vergeven in de map van het document
|
||||
@msg No linked files to look for Geen gekoppelde bestanden om naar te zoeken
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} {n} afbeelding(en) opnieuw gekoppeld; {name} kon niet opnieuw worden gekoppeld: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` is de stapverwijzing {r}, die alleen `run` en `command_batch` oplossen
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` moet een array van object-id's zijn, niet {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` moet een array van ankerindices zijn, niet {v}
|
||||
@@ -6053,3 +6062,22 @@ breakText Glyphs Glyphs
|
||||
Text Flow Tekstdoorloop
|
||||
By Rows Per rij
|
||||
By Columns Per kolom
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Willekeurige dekking…
|
||||
Randomize Opacity Willekeurige dekking
|
||||
Minimum: Minimum:
|
||||
Maximum: Maximum:
|
||||
Seed: Startwaarde:
|
||||
@msg `min` is greater than `max` `min` is groter dan `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Objecten sorteren…
|
||||
Sort Objects Objecten sorteren
|
||||
Sort By: Sorteren op:
|
||||
Apply To: Toepassen op:
|
||||
Area Oppervlakte
|
||||
X Position X-positie
|
||||
Y Position Y-positie
|
||||
Stacking Order Stapelvolgorde
|
||||
Small to Large Van klein naar groot
|
||||
Large to Small Van groot naar klein
|
||||
Distribute Evenly Gelijkmatig verdelen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -622,7 +622,6 @@
|
||||
Links Łącza
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? Połączone obrazy zmienione na dysku: {n}. Pokazać nowe wersje?|Połączone obrazy zmienione na dysku: {n}. Pokazać nowe wersje?|Połączone obrazy zmienione na dysku: {n}. Pokazać nowe wersje?
|
||||
Update Changed Links Aktualizuj zmienione łącza
|
||||
@msg Updated {_1} linked file(s) changed on disk Zaktualizowano połączone pliki zmienione na dysku: {_1}
|
||||
Magic Wand Różdżka
|
||||
Navigator Nawigator
|
||||
Pattern Options Opcje wzorka
|
||||
@@ -1725,13 +1724,16 @@ digits Malayalam Malajalam
|
||||
Fractions Ułamki
|
||||
Ligatures are off while the text is tracked. Ligatury są wyłączone, gdy tekst ma zmienione światło.
|
||||
Ordinals Liczebniki porządkowe
|
||||
Proportional Lining Proporcjonalne nowoczesne
|
||||
Proportional Oldstyle Proporcjonalne nautyczne
|
||||
Reset OpenType Features Resetuj funkcje OpenType
|
||||
Select text to set its OpenType features. Zaznacz tekst, aby ustawić jego funkcje OpenType.
|
||||
Standard Ligatures Ligatury standardowe
|
||||
Stylistic Alternates Alternatywy stylistyczne
|
||||
Swash Ozdobniki
|
||||
Tabular Lining Tabelaryczne nowoczesne
|
||||
Tabular Oldstyle Tabelaryczne nautyczne
|
||||
Titling Alternates Alternatywy tytułowe
|
||||
Every-line Composer Kompozytor wielowierszowy
|
||||
First-line Left Indent Wcięcie pierwszego wiersza
|
||||
Hyphenation… Dzielenie wyrazów…
|
||||
@@ -2980,6 +2982,9 @@ theme Appearance Wygląd
|
||||
Delete Brush Usuń pędzel
|
||||
Delete Symbol Usuń symbol
|
||||
Delete the selected symbol? Usunąć zaznaczony symbol?
|
||||
Delete the selected symbols? Usunąć zaznaczone symbole?
|
||||
No unused symbols Brak nieużywanych symboli
|
||||
Delete Symbols Usuń symbole
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Co najmniej jeden z symboli jest używany i nie można go usunąć, dopóki jego wystąpienia nie zostaną rozszerzone lub usunięte.
|
||||
Expand Instances Rozszerz wystąpienia
|
||||
Delete Instances Usuń wystąpienia
|
||||
@@ -4033,7 +4038,6 @@ imageTrace Outline Kontur
|
||||
@msg Combine Slices: the slices have no bounds Połącz plasterki: plasterki nie mają granic
|
||||
@msg Convert to Artboards: selection has no area Konwertuj na obszary kompozycji: zaznaczenie nie ma powierzchni
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Konwertuj na kształt: nie zaznaczono prostokątów ani elips
|
||||
@msg Copied the CSS of {rules} object(s) Skopiowano CSS obiektów: {rules}
|
||||
@msg Copied the script report Skopiowano raport skryptu
|
||||
@msg Corners edits the corners of a path Narożniki edytuje narożniki ścieżki
|
||||
@msg Couldn't copy to the system clipboard: {e} Nie udało się skopiować do schowka systemowego: {e}
|
||||
@@ -4050,13 +4054,11 @@ imageTrace Outline Kontur
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) zaznacz bezpośrednio punkty kontrolne, w których ma nastąpić cięcie (nie punkty końcowe otwartych ścieżek)
|
||||
@msg Divide Objects Below: select a path Podziel obiekty poniżej: zaznacz ścieżkę
|
||||
@msg Divide Objects Below: select exactly one path Podziel obiekty poniżej: zaznacz dokładnie jedną ścieżkę
|
||||
@msg Downloaded {_1} file(s) Pobrane pliki: {_1}
|
||||
@msg Downloaded {what} Pobrano {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Rozszerz wygląd: zaznaczenie ma wygląd podstawowy
|
||||
@msg Expand: no brush strokes selected Rozszerz: nie zaznaczono pociągnięć pędzla
|
||||
@msg Expand: no gradient fills Rozszerz: brak wypełnień gradientem
|
||||
@msg Expand: nothing to expand Rozszerz: nie ma czego rozszerzać
|
||||
@msg Exported {count} file(s) to {folder} Wyeksportowane pliki do {folder}: {count}
|
||||
@msg Exported {path} Wyeksportowano {path}
|
||||
@msg Flatten Transparency: select objects to flatten Spłaszcz przezroczystość: zaznacz obiekty do spłaszczenia
|
||||
@msg Flatten Transparency: {e} Spłaszcz przezroczystość: {e}
|
||||
@@ -4618,9 +4620,6 @@ imageTrace Outline Kontur
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` ma {size} bajtów (limit {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} jest już używany przez {_2}
|
||||
@msg {_1} is reserved by the system Skrót {_1} jest zarezerwowany przez system
|
||||
@msg {_1} linked file(s) can't be read here: their previews show połączonych plików nie można tu odczytać ({_1}): wyświetlane są ich podglądy
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes nie udało się zdekodować obrazów ({undecoded}): są wyświetlane jako przekreślone ramki
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions połączone obrazy zmienione na dysku: {_1} — Aktualizuj łącza pokaże nowe wersje
|
||||
@msg {_1}: not saved, so not closed {_1}: nie zapisano, więc nie zamknięto
|
||||
@msg {bpp}-bit bitmaps can't be read nie można odczytać bitmap {bpp}-bitowych
|
||||
@msg {command} didn't create an object {command} nie utworzyło obiektu
|
||||
@@ -4640,7 +4639,6 @@ imageTrace Outline Kontur
|
||||
@msg Couldn't place {name}: {e} Nie udało się umieścić {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Nie udało się wkleić ze schowka: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Zapisano {path}, uwagi ({_1}): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Wyeksportowano {what}, uwagi ({_1}): {first}
|
||||
@msg Exported {what} Wyeksportowano {what}
|
||||
@msg Saved {n} files beside {path} Zapisane pliki obok {path}: {n}
|
||||
@msg Saving Zapisywanie
|
||||
@@ -4651,12 +4649,26 @@ imageTrace Outline Kontur
|
||||
@msg Saving recovery data for {_1} Zapisywanie danych odzyskiwania dla {_1}
|
||||
@msg Discarded {_1} recovered document(s) Odrzucone odzyskane dokumenty: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Przywrócone odzyskane dokumenty: {_1} — zapisz je, aby je zachować
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Osadzone obrazy: {n}; brakujące: {missing} — najpierw połącz je ponownie
|
||||
@msg Embedded {n} image(s) Osadzone obrazy: {n}
|
||||
@msg Relinked {_1} image(s) Ponownie połączone obrazy: {_1}
|
||||
@msg Relinked {n} image(s) Ponownie połączone obrazy: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Ponownie połączone obrazy: {n}; nie ma ich w tym folderze: {_1}
|
||||
@msg Updated {_1} image(s) Zaktualizowane obrazy: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Osadzono {n} obraz; brakuje {missing}: najpierw połącz je ponownie|Osadzono {n} obrazy; brakuje {missing}: najpierw połącz je ponownie|Osadzono {n} obrazów; brakuje {missing}: najpierw połącz je ponownie
|
||||
@msgplural Embedded {n} image|Embedded {n} images Osadzono {n} obraz|Osadzono {n} obrazy|Osadzono {n} obrazów
|
||||
@msgplural Relinked {n} image|Relinked {n} images Ponownie połączono {n} obraz|Ponownie połączono {n} obrazy|Ponownie połączono {n} obrazów
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Ponownie połączono {n} obraz; nie ma ich w tym folderze: {names}|Ponownie połączono {n} obrazy; nie ma ich w tym folderze: {names}|Ponownie połączono {n} obrazów; nie ma ich w tym folderze: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Ponownie połączono {n} obraz; nie udało się ponownie połączyć {name}: {reason}|Ponownie połączono {n} obrazy; nie udało się ponownie połączyć {name}: {reason}|Ponownie połączono {n} obrazów; nie udało się ponownie połączyć {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Zaktualizowano {n} obraz|Zaktualizowano {n} obrazy|Zaktualizowano {n} obrazów
|
||||
@msgplural Replaced {n} image|Replaced {n} images Zastąpiono {n} obraz|Zastąpiono {n} obrazy|Zastąpiono {n} obrazów
|
||||
@msgplural Broke {n} link|Broke {n} links Zerwano {n} łącze|Zerwano {n} łącza|Zerwano {n} łączy
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Zerwano {n} łącze; nie można odczytać {missing}: najpierw połącz je ponownie lub zaktualizuj|Zerwano {n} łącza; nie można odczytać {missing}: najpierw połącz je ponownie lub zaktualizuj|Zerwano {n} łączy; nie można odczytać {missing}: najpierw połącz je ponownie lub zaktualizuj
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show nie można tu odczytać {n} połączonego pliku: wyświetlany jest jego podgląd|nie można tu odczytać {n} połączonych plików: wyświetlane są ich podglądy|nie można tu odczytać {n} połączonych plików: wyświetlane są ich podglądy
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes nie udało się zdekodować {n} obrazu: jest wyświetlany jako przekreślona ramka|nie udało się zdekodować {n} obrazów: są wyświetlane jako przekreślone ramki|nie udało się zdekodować {n} obrazów: są wyświetlane jako przekreślone ramki
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} połączony obraz zmienił się na dysku: Aktualizuj łącza pokaże nową wersję|{n} połączone obrazy zmieniły się na dysku: Aktualizuj łącza pokaże nowe wersje|{n} połączonych obrazów zmieniło się na dysku: Aktualizuj łącza pokaże nowe wersje
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Zaktualizowano {n} połączony plik zmieniony na dysku|Zaktualizowano {n} połączone pliki zmienione na dysku|Zaktualizowano {n} połączonych plików zmienionych na dysku
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Wyeksportowano {what} z {n} uwagą: {first}|Wyeksportowano {what} z {n} uwagami: {first}|Wyeksportowano {what} z {n} uwagami: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} plik czcionki jest teraz w {folder}|{n} pliki czcionek są teraz w {folder}|{n} plików czcionek jest teraz w {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} plik czcionki jest teraz w {folder}; nie udało się dodać {failed}: {reason}|{n} pliki czcionek są teraz w {folder}; nie udało się dodać {failed}: {reason}|{n} plików czcionek jest teraz w {folder}; nie udało się dodać {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} czcionka jest tu niedostępna: jej tekst jest wyświetlany inną czcionką|{n} czcionki są tu niedostępne: ich tekst jest wyświetlany inną czcionką|{n} czcionek jest tu niedostępnych: ich tekst jest wyświetlany inną czcionką
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Skopiowano CSS {n} obiektu|Skopiowano CSS {n} obiektów|Skopiowano CSS {n} obiektów
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Pobrano {n} plik|Pobrano {n} pliki|Pobrano {n} plików
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Wyeksportowano {n} plik do {folder}|Wyeksportowano {n} pliki do {folder}|Wyeksportowano {n} plików do {folder}
|
||||
@msg Unembedded to {_1} Wyodrębniono do {_1}
|
||||
@msg Reset {_1} Zresetowano {_1}
|
||||
@msg Sent to {_1} Wysłano do {_1}
|
||||
@@ -4708,9 +4720,6 @@ imageTrace Outline Kontur
|
||||
@msg every search thread stopped on an internal error (please report this bug) wszystkie wątki wyszukiwania zatrzymały się na błędzie wewnętrznym (zgłoś ten błąd)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it folder czcionek VectorCraft nie jest tu ustawiony: ustawia go aplikacja desktopowa i vectorcraft-cli
|
||||
@msg choose the font files to add wybierz pliki czcionek do dodania
|
||||
@msg {n} font file(s) are now in {folder} pliki czcionek w {folder}: {n}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} pliki czcionek w {folder}: {n}; nie udało się dodać: {failed} ({reason})
|
||||
@msg {n} font(s) aren't available here: their text shows in another font niedostępne czcionki: {n} — ich tekst jest wyświetlany inną czcionką
|
||||
@msg not a file to nie jest plik
|
||||
@msg not a font file to nie jest plik czcionki
|
||||
@msg that document is no longer open ten dokument nie jest już otwarty
|
||||
@@ -4719,7 +4728,6 @@ imageTrace Outline Kontur
|
||||
@msg every numbered name for it is taken in the Fonts folder wszystkie numerowane nazwy dla niego są zajęte w folderze czcionek
|
||||
@msg every numbered name for {name} is taken in the document's folder wszystkie numerowane nazwy dla {name} są zajęte w folderze dokumentu
|
||||
@msg No linked files to look for Brak połączonych plików do wyszukania
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Ponownie połączone obrazy: {n}; nie udało się ponownie połączyć {name}: {reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` to odwołanie do kroku {r}, które rozwiązują tylko `run` i `command_batch`
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` musi być tablicą identyfikatorów obiektów, nie {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` musi być tablicą indeksów punktów, nie {v}
|
||||
@@ -5967,3 +5975,22 @@ breakText Glyphs Glify
|
||||
Text Flow Przepływ tekstu
|
||||
By Rows Wierszami
|
||||
By Columns Kolumnami
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Losowe krycie…
|
||||
Randomize Opacity Losowe krycie
|
||||
Minimum: Minimum:
|
||||
Maximum: Maksimum:
|
||||
Seed: Ziarno:
|
||||
@msg `min` is greater than `max` `min` jest większe niż `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Sortuj obiekty…
|
||||
Sort Objects Sortuj obiekty
|
||||
Sort By: Sortuj według:
|
||||
Apply To: Zastosuj do:
|
||||
Area Pole
|
||||
X Position Położenie X
|
||||
Y Position Położenie Y
|
||||
Stacking Order Kolejność ułożenia
|
||||
Small to Large Od najmniejszego do największego
|
||||
Large to Small Od największego do najmniejszego
|
||||
Distribute Evenly Rozmieść równomiernie
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -668,6 +668,9 @@
|
||||
Delete Swatch Excluir Amostra
|
||||
Delete Symbol Excluir Símbolo
|
||||
Delete the selected symbol? Excluir o símbolo selecionado?
|
||||
Delete the selected symbols? Excluir os símbolos selecionados?
|
||||
No unused symbols Nenhum símbolo não utilizado
|
||||
Delete Symbols Excluir símbolos
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Um ou mais símbolos estão em uso e não podem ser excluídos até que suas instâncias sejam expandidas ou excluídas.
|
||||
Expand Instances Expandir Instâncias
|
||||
Delete Instances Excluir Instâncias
|
||||
@@ -2706,6 +2709,7 @@ digits Malayalam Malaiala
|
||||
Superscript: Sobrescrito:
|
||||
Swap Fill and Stroke Trocar Preenchimento e Traçado
|
||||
Swap start and end arrowheads Trocar pontas de seta inicial e final
|
||||
Stylistic Alternates Variantes Estilísticas
|
||||
Swash Ornamento
|
||||
Swatch Conflict Conflito de Amostra
|
||||
Swatch Conflicts Conflitos de Amostra
|
||||
@@ -2888,7 +2892,6 @@ digits Malayalam Malaiala
|
||||
Update Links Atualizar Links
|
||||
Update Changed Links Atualizar Links alterados
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} imagem vinculada alterada no disco. Mostrar a nova versão?|{n} imagens vinculadas alteradas no disco. Mostrar as novas versões?
|
||||
@msg Updated {_1} linked file(s) changed on disk {_1} arquivo(s) vinculado(s) alterado(s) no disco atualizado(s)
|
||||
Update Modified Links Atualizar Links Modificados
|
||||
Use Use
|
||||
Use Artboards Usar Mesas de Trabalho
|
||||
@@ -3488,7 +3491,6 @@ axis Both Ambos
|
||||
@msg Combine Slices: the slices have no bounds Combinar fatias: as fatias não têm limites
|
||||
@msg Convert to Artboards: selection has no area Converter em pranchetas: a seleção não tem área
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Converter em forma: nenhum retângulo ou elipse selecionado
|
||||
@msg Copied the CSS of {rules} object(s) CSS de {rules} objeto(s) copiado
|
||||
@msg Corners edits the corners of a path Cantos edita os cantos de um traçado
|
||||
@msg Couldn't copy to the system clipboard: {e} Não foi possível copiar para a área de transferência do sistema: {e}
|
||||
@msg Couldn't open {name}: {e} Não foi possível abrir {name}: {e}
|
||||
@@ -3504,13 +3506,11 @@ axis Both Ambos
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) selecione diretamente os pontos de ancoragem onde cortar (não as extremidades de traçados abertos)
|
||||
@msg Divide Objects Below: select a path Dividir objetos abaixo: selecione um traçado
|
||||
@msg Divide Objects Below: select exactly one path Dividir objetos abaixo: selecione exatamente um traçado
|
||||
@msg Downloaded {_1} file(s) {_1} arquivo(s) baixado(s)
|
||||
@msg Downloaded {what} {what} baixado
|
||||
@msg Expand Appearance: the selection has a basic appearance Expandir aparência: a seleção tem uma aparência básica
|
||||
@msg Expand: no brush strokes selected Expandir: nenhum traço de pincel selecionado
|
||||
@msg Expand: no gradient fills Expandir: nenhum preenchimento em gradiente
|
||||
@msg Expand: nothing to expand Expandir: nada para expandir
|
||||
@msg Exported {count} file(s) to {folder} {count} arquivo(s) exportado(s) para {folder}
|
||||
@msg Exported {path} {path} exportado
|
||||
@msg Flatten Transparency: select objects to flatten Achatar transparência: selecione os objetos a achatar
|
||||
@msg Flatten Transparency: {e} Achatar transparência: {e}
|
||||
@@ -4060,9 +4060,6 @@ axis Both Ambos
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` tem {size} bytes (limite {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} já é usado por {_2}
|
||||
@msg {_1} is reserved by the system {_1} é reservado pelo sistema
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} arquivo(s) vinculado(s) não podem ser lidos aqui: suas visualizações são exibidas
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes não foi possível decodificar {undecoded} imagem(ns): elas aparecem como caixas marcadas com um X
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} imagem(ns) vinculada(s) mudou(aram) no disco: Atualizar links mostra as novas versões
|
||||
@msg {_1}: not saved, so not closed {_1}: não salvo, portanto não fechado
|
||||
@msg {bpp}-bit bitmaps can't be read bitmaps de {bpp} bits não podem ser lidos
|
||||
@msg {command} didn't create an object {command} não criou um objeto
|
||||
@@ -4081,7 +4078,6 @@ axis Both Ambos
|
||||
@msg Couldn't place {name}: {e} Não foi possível inserir {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Não foi possível colar da área de transferência: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path} salvo com {_1} observação(ões): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {what} exportado com {_1} observação(ões): {first}
|
||||
@msg Exported {what} {what} exportado
|
||||
@msg Saved {n} files beside {path} {n} arquivos salvos ao lado de {path}
|
||||
@msg Saving Salvando
|
||||
@@ -4092,12 +4088,26 @@ axis Both Ambos
|
||||
@msg Saving recovery data for {_1} Salvando dados de recuperação de {_1}
|
||||
@msg Discarded {_1} recovered document(s) {_1} documento(s) recuperado(s) descartado(s)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them {_1} documento(s) recuperado(s) restaurado(s): salve-os para mantê-los
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first {n} imagem(ns) incorporada(s); {missing} ausente(s): revincule-as primeiro
|
||||
@msg Embedded {n} image(s) {n} imagem(ns) incorporada(s)
|
||||
@msg Relinked {_1} image(s) {_1} imagem(ns) revinculada(s)
|
||||
@msg Relinked {n} image(s) {n} imagem(ns) revinculada(s)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} {n} imagem(ns) revinculada(s); fora dessa pasta: {_1}
|
||||
@msg Updated {_1} image(s) {_1} imagem(ns) atualizada(s)
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} imagem incorporada; faltam {missing}: revincule-as primeiro|{n} imagens incorporadas; faltam {missing}: revincule-as primeiro
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} imagem incorporada|{n} imagens incorporadas
|
||||
@msgplural Relinked {n} image|Relinked {n} images {n} imagem revinculada|{n} imagens revinculadas
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} {n} imagem revinculada; fora dessa pasta: {names}|{n} imagens revinculadas; fora dessa pasta: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} {n} imagem revinculada; não foi possível revincular {name}: {reason}|{n} imagens revinculadas; não foi possível revincular {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images {n} imagem atualizada|{n} imagens atualizadas
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} imagem substituída|{n} imagens substituídas
|
||||
@msgplural Broke {n} link|Broke {n} links {n} vínculo quebrado|{n} vínculos quebrados
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} vínculo quebrado; não é possível ler {missing}: revincule-os ou atualize-os primeiro|{n} vínculos quebrados; não é possível ler {missing}: revincule-os ou atualize-os primeiro
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} arquivo vinculado não pode ser lido aqui: sua visualização é exibida|{n} arquivos vinculados não podem ser lidos aqui: suas visualizações são exibidas
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes não foi possível decodificar {n} imagem: ela aparece como uma caixa marcada com um X|não foi possível decodificar {n} imagens: elas aparecem como caixas marcadas com um X
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} imagem vinculada mudou no disco: Atualizar links mostra a nova versão|{n} imagens vinculadas mudaram no disco: Atualizar links mostra as novas versões
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk {n} arquivo vinculado alterado no disco atualizado|{n} arquivos vinculados alterados no disco atualizados
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} exportado com {n} observação: {first}|{what} exportado com {n} observações: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} arquivo de fonte agora está em {folder}|{n} arquivos de fonte agora estão em {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} arquivo de fonte agora está em {folder}; não foi possível adicionar {failed}: {reason}|{n} arquivos de fonte agora estão em {folder}; não foi possível adicionar {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} fonte não está disponível aqui: o texto dela aparece em outra fonte|{n} fontes não estão disponíveis aqui: o texto delas aparece em outra fonte
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects CSS de {n} objeto copiado|CSS de {n} objetos copiado
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} arquivo baixado|{n} arquivos baixados
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} arquivo exportado para {folder}|{n} arquivos exportados para {folder}
|
||||
@msg Unembedded to {_1} Desincorporado para {_1}
|
||||
@msg Reset {_1} Redefinir {_1}
|
||||
@msg Sent to {_1} Enviado para {_1}
|
||||
@@ -4147,9 +4157,6 @@ axis Both Ambos
|
||||
@msg every search thread stopped on an internal error (please report this bug) todos os processos de pesquisa pararam por um erro interno (relate este bug)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it A pasta Fontes do VectorCraft não está definida aqui: o aplicativo para desktop e o vectorcraft-cli a definem
|
||||
@msg choose the font files to add escolha os arquivos de fonte a adicionar
|
||||
@msg {n} font file(s) are now in {folder} {n} arquivo(s) de fonte agora está(ão) em {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} arquivo(s) de fonte agora está(ão) em {folder}; {failed} não pôde(puderam) ser adicionado(s): {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} fonte(s) não está(ão) disponível(is) aqui: o texto delas aparece em outra fonte
|
||||
@msg not a file não é um arquivo
|
||||
@msg not a font file não é um arquivo de fonte
|
||||
@msg that document is no longer open esse documento não está mais aberto
|
||||
@@ -4624,6 +4631,7 @@ axis Both Ambos
|
||||
Preset {} Predefinido {}
|
||||
Preview in Browser needs the desktop app (the web downloads files instead) A visualização no navegador exige o aplicativo para desktop (na web, os arquivos são baixados)
|
||||
Print presets Predefinidos de impressão
|
||||
Proportional Lining Alinhado Proporcional
|
||||
Proportional Oldstyle Antigo Proporcional
|
||||
Punctuation Pontuação
|
||||
Radius 1 Raio 1
|
||||
@@ -4727,6 +4735,7 @@ axis Both Ambos
|
||||
System Layout Layout do Sistema
|
||||
Tabular Lining Alinhado Tabular
|
||||
Tabular Oldstyle Antigo Tabular
|
||||
Titling Alternates Variantes de Titulação
|
||||
Tate-chu-yoko Tate-chu-yoko
|
||||
Temperature Temperatura
|
||||
Templates Modelos
|
||||
@@ -4788,7 +4797,6 @@ axis Both Ambos
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise o texto de área em molduras baixas demais para uma linha da fonte em que aparece recebeu molduras mais altas ({_1}): senão o texto não apareceria
|
||||
@msg every numbered name for {name} is taken in the document's folder todos os nomes numerados para {name} já existem na pasta do documento
|
||||
@msg No linked files to look for Nenhum arquivo vinculado para procurar
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} {n} imagem(ns) revinculada(s); não foi possível revincular {name}: {reason}
|
||||
De-Interlace Desentrelaçar
|
||||
Eliminate Eliminar
|
||||
Create New Fields by Criar Novos Campos por
|
||||
@@ -6186,3 +6194,22 @@ swatch Yellow Green Verde-amarelado
|
||||
Text Flow Fluxo do texto
|
||||
By Rows Por linhas
|
||||
By Columns Por colunas
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Opacidade aleatória…
|
||||
Randomize Opacity Opacidade aleatória
|
||||
Minimum: Mínimo:
|
||||
Maximum: Máximo:
|
||||
Seed: Semente:
|
||||
@msg `min` is greater than `max` `min` é maior que `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Classificar objetos…
|
||||
Sort Objects Classificar objetos
|
||||
Sort By: Classificar por:
|
||||
Apply To: Aplicar a:
|
||||
Area Área
|
||||
X Position Posição X
|
||||
Y Position Posição Y
|
||||
Stacking Order Ordem de empilhamento
|
||||
Small to Large Do menor para o maior
|
||||
Large to Small Do maior para o menor
|
||||
Distribute Evenly Distribuir uniformemente
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -753,6 +753,9 @@ font-technology Variable Вариативные
|
||||
Delete Swatch Удалить образец
|
||||
Delete Symbol Удалить символ
|
||||
Delete the selected symbol? Удалить выбранный символ?
|
||||
Delete the selected symbols? Удалить выбранные символы?
|
||||
No unused symbols Нет неиспользуемых символов
|
||||
Delete Symbols Удалить символы
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Один или несколько символов используются, и их нельзя удалить, пока их экземпляры не будут разобраны или удалены.
|
||||
Expand Instances Разобрать экземпляры
|
||||
Delete Instances Удалить экземпляры
|
||||
@@ -2504,6 +2507,7 @@ digits Tamil Тамильские
|
||||
digits Telugu Телугу
|
||||
digits Kannada Каннада
|
||||
digits Malayalam Малаялам
|
||||
Proportional Lining Пропорциональные цифры
|
||||
Proportional Oldstyle Пропорциональные старого стиля
|
||||
Pucker & Bloat… Сморщивание и раздувание…
|
||||
Pucker Tool Инструмент «Сморщивание»
|
||||
@@ -3309,6 +3313,7 @@ digits Malayalam Малаялам
|
||||
Swap Fill and Stroke (Shift+X) Поменять заливку и обводку (Shift+X)
|
||||
Swap start and end arrowheads Поменять начальную и конечную стрелки
|
||||
Swap the selected object for the file, keeping its place and transform Заменить выделенный объект файлом, сохранив его положение и преобразование
|
||||
Stylistic Alternates Стилистические альтернативы
|
||||
Swash Росчерк
|
||||
Swatch Conflict Конфликт образцов
|
||||
Swatch Conflicts Конфликты образцов
|
||||
@@ -3378,6 +3383,7 @@ digits Malayalam Малаялам
|
||||
Tabs Табуляции
|
||||
Tabular Lining Табличные цифры
|
||||
Tabular Oldstyle Табличные старого стиля
|
||||
Titling Alternates Альтернативы для заголовков
|
||||
Target Объект
|
||||
Target Contents Содержимое объекта
|
||||
Target: Объект:
|
||||
@@ -3937,7 +3943,6 @@ axis Both Оба
|
||||
@msg Combine Slices: the slices have no bounds Объединение фрагментов: у фрагментов нет границ
|
||||
@msg Convert to Artboards: selection has no area Преобразование в монтажные области: у выделения нет области
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Преобразование в фигуру: не выделены прямоугольники или эллипсы
|
||||
@msg Copied the CSS of {rules} object(s) Скопирован CSS для {rules} объекта(ов)
|
||||
@msg Copied the script report Отчёт о сценарии скопирован
|
||||
@msg Corners edits the corners of a path «Углы» редактирует углы контура
|
||||
@msg Couldn't copy to the system clipboard: {e} Не удалось скопировать в системный буфер обмена: {e}
|
||||
@@ -3954,13 +3959,11 @@ axis Both Оба
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) выделите прямым выделением опорные точки для разреза (не конечные точки открытых контуров)
|
||||
@msg Divide Objects Below: select a path Разделение объектов ниже: выделите контур
|
||||
@msg Divide Objects Below: select exactly one path Разделение объектов ниже: выделите ровно один контур
|
||||
@msg Downloaded {_1} file(s) Скачано файлов: {_1}
|
||||
@msg Downloaded {what} Скачано: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Разбор оформления: у выделения основное оформление
|
||||
@msg Expand: no brush strokes selected Разбор: не выделены мазки кисти
|
||||
@msg Expand: no gradient fills Разбор: нет градиентных заливок
|
||||
@msg Expand: nothing to expand Разбор: нечего разбирать
|
||||
@msg Exported {count} file(s) to {folder} Экспортировано файлов: {count} в {folder}
|
||||
@msg Exported {path} Экспортировано: {path}
|
||||
@msg Flatten Transparency: select objects to flatten Объединение прозрачностей: выделите объекты для объединения
|
||||
@msg Flatten Transparency: {e} Объединение прозрачностей: {e}
|
||||
@@ -4521,10 +4524,6 @@ axis Both Оба
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` занимает {size} байт (предел {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} уже используется {_2}
|
||||
@msg {_1} is reserved by the system Сочетание {_1} зарезервировано системой
|
||||
@msg {_1} linked file(s) can't be read here: their previews show здесь невозможно прочитать связанных файлов: {_1}: отображаются их предварительные просмотры
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes не удалось декодировать изображения ({undecoded}): они показаны как перечёркнутые рамки
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions связанных изображений ({_1}) изменились на диске: «Обновить связи» покажет новые версии
|
||||
@msg Updated {_1} linked file(s) changed on disk Обновлено связанных файлов, измененных на диске: {_1}
|
||||
@msg {_1}: not saved, so not closed {_1}: не сохранён, поэтому не закрыт
|
||||
@msg {bpp}-bit bitmaps can't be read растровые изображения с глубиной {bpp} бит не читаются
|
||||
@msg {command} didn't create an object {command} не создал объект
|
||||
@@ -4544,7 +4543,6 @@ axis Both Оба
|
||||
@msg Couldn't place {name}: {e} Не удалось поместить {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Не удалось вставить из буфера обмена: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Сохранено: {path} с примечаниями ({_1}) : {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Экспортировано: {what} с примечаниями ({_1}) : {first}
|
||||
@msg Exported {what} Экспортировано: {what}
|
||||
@msg Saved {n} files beside {path} Сохранено файлов: {n} рядом с {path}
|
||||
@msg Saving Сохранение
|
||||
@@ -4555,12 +4553,26 @@ axis Both Оба
|
||||
@msg Saving recovery data for {_1} Сохранение данных восстановления для {_1}
|
||||
@msg Discarded {_1} recovered document(s) Отменено восстановленных документов: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Восстановлено документов: {_1}: сохраните их, чтобы оставить
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Внедрено изображений: {n}; отсутствует {missing}: сначала восстановите связи
|
||||
@msg Embedded {n} image(s) Внедрено изображений: {n}
|
||||
@msg Relinked {_1} image(s) Восстановлена связь с изображениями: {_1}
|
||||
@msg Relinked {n} image(s) Восстановлена связь с изображениями: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Восстановлена связь с изображениями: {n}; нет в этой папке: {_1}
|
||||
@msg Updated {_1} image(s) Обновлено изображений: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Внедрено {n} изображение; отсутствует {missing}: сначала восстановите связи|Внедрено {n} изображения; отсутствует {missing}: сначала восстановите связи|Внедрено {n} изображений; отсутствует {missing}: сначала восстановите связи
|
||||
@msgplural Embedded {n} image|Embedded {n} images Внедрено {n} изображение|Внедрено {n} изображения|Внедрено {n} изображений
|
||||
@msgplural Relinked {n} image|Relinked {n} images Восстановлена связь с {n} изображением|Восстановлена связь с {n} изображениями|Восстановлена связь с {n} изображениями
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Восстановлена связь с {n} изображением; нет в этой папке: {names}|Восстановлена связь с {n} изображениями; нет в этой папке: {names}|Восстановлена связь с {n} изображениями; нет в этой папке: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Восстановлена связь с {n} изображением; не удалось восстановить связь с {name}: {reason}|Восстановлена связь с {n} изображениями; не удалось восстановить связь с {name}: {reason}|Восстановлена связь с {n} изображениями; не удалось восстановить связь с {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Обновлено {n} изображение|Обновлено {n} изображения|Обновлено {n} изображений
|
||||
@msgplural Replaced {n} image|Replaced {n} images Заменено {n} изображение|Заменено {n} изображения|Заменено {n} изображений
|
||||
@msgplural Broke {n} link|Broke {n} links Разорвана {n} связь|Разорвано {n} связи|Разорвано {n} связей
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Разорвана {n} связь; не удаётся прочитать {missing}: сначала восстановите или обновите их связи|Разорвано {n} связи; не удаётся прочитать {missing}: сначала восстановите или обновите их связи|Разорвано {n} связей; не удаётся прочитать {missing}: сначала восстановите или обновите их связи
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show здесь невозможно прочитать {n} связанный файл: отображается его предварительный просмотр|здесь невозможно прочитать {n} связанных файла: отображаются их предварительные просмотры|здесь невозможно прочитать {n} связанных файлов: отображаются их предварительные просмотры
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes не удалось декодировать {n} изображение: оно показано как перечёркнутая рамка|не удалось декодировать {n} изображения: они показаны как перечёркнутые рамки|не удалось декодировать {n} изображений: они показаны как перечёркнутые рамки
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} связанное изображение изменилось на диске: «Обновить связи» покажет новую версию|{n} связанных изображения изменились на диске: «Обновить связи» покажет новые версии|{n} связанных изображений изменились на диске: «Обновить связи» покажет новые версии
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Обновлён {n} связанный файл, изменённый на диске|Обновлено {n} связанных файла, изменённых на диске|Обновлено {n} связанных файлов, изменённых на диске
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Экспортировано: {what} с {n} примечанием: {first}|Экспортировано: {what} с {n} примечаниями: {first}|Экспортировано: {what} с {n} примечаниями: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} файл шрифта теперь в {folder}|{n} файла шрифтов теперь в {folder}|{n} файлов шрифтов теперь в {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} файл шрифта теперь в {folder}; не удалось добавить {failed}: {reason}|{n} файла шрифтов теперь в {folder}; не удалось добавить {failed}: {reason}|{n} файлов шрифтов теперь в {folder}; не удалось добавить {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font здесь недоступен {n} шрифт: его текст отображается другим шрифтом|здесь недоступно {n} шрифта: их текст отображается другим шрифтом|здесь недоступно {n} шрифтов: их текст отображается другим шрифтом
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Скопирован CSS {n} объекта|Скопирован CSS {n} объектов|Скопирован CSS {n} объектов
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Скачан {n} файл|Скачано {n} файла|Скачано {n} файлов
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Экспортирован {n} файл в {folder}|Экспортировано {n} файла в {folder}|Экспортировано {n} файлов в {folder}
|
||||
@msg Unembedded to {_1} Извлечено в {_1}
|
||||
@msg Reset {_1} Сброшено: {_1}
|
||||
@msg Sent to {_1} Отправлено в {_1}
|
||||
@@ -4612,9 +4624,6 @@ axis Both Оба
|
||||
@msg every search thread stopped on an internal error (please report this bug) все потоки поиска остановились из-за внутренней ошибки (сообщите об этой ошибке)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it Папка Fonts VectorCraft здесь не задана: её задают настольное приложение и vectorcraft-cli
|
||||
@msg choose the font files to add выберите файлы шрифтов для добавления
|
||||
@msg {n} font file(s) are now in {folder} Файлов шрифтов теперь в {folder}: {n}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} Файлов шрифтов теперь в {folder}: {n}; не удалось добавить {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font здесь недоступно шрифтов: {n}; их текст отображается другим шрифтом
|
||||
@msg not a file не файл
|
||||
@msg not a font file не файл шрифта
|
||||
@msg that document is no longer open этот документ больше не открыт
|
||||
@@ -4623,7 +4632,6 @@ axis Both Оба
|
||||
@msg every numbered name for it is taken in the Fonts folder все нумерованные имена для него уже заняты в папке Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder все нумерованные имена для {name} уже заняты в папке документа
|
||||
@msg No linked files to look for Нет связанных файлов для поиска
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Восстановлена связь с изображениями: {n}; не удалось восстановить связь с {name}: {reason}
|
||||
|
||||
# The macOS menu bar (native_menu): the app and Window menus' system items, Settings pages.
|
||||
Services Службы
|
||||
@@ -6089,3 +6097,22 @@ breakText Glyphs Глифы
|
||||
Text Flow Поток текста
|
||||
By Rows По строкам
|
||||
By Columns По столбцам
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Случайная непрозрачность…
|
||||
Randomize Opacity Случайная непрозрачность
|
||||
Minimum: Минимум:
|
||||
Maximum: Максимум:
|
||||
Seed: Начальное число:
|
||||
@msg `min` is greater than `max` `min` больше, чем `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Сортировать объекты…
|
||||
Sort Objects Сортировать объекты
|
||||
Sort By: Сортировать по:
|
||||
Apply To: Применить к:
|
||||
Area Площадь
|
||||
X Position Положение по X
|
||||
Y Position Положение по Y
|
||||
Stacking Order Порядок наложения
|
||||
Small to Large От меньшего к большему
|
||||
Large to Small От большего к меньшему
|
||||
Distribute Evenly Распределить равномерно
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -742,6 +742,9 @@ font-technology Variable Variabla
|
||||
Delete Swatch Radera färgruta
|
||||
Delete Symbol Radera symbol
|
||||
Delete the selected symbol? Vill du radera den markerade symbolen?
|
||||
Delete the selected symbols? Vill du radera de markerade symbolerna?
|
||||
No unused symbols Inga oanvända symboler
|
||||
Delete Symbols Radera symboler
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. En eller flera av symbolerna används och kan inte raderas förrän deras instanser har expanderats eller raderats.
|
||||
Expand Instances Expandera instanser
|
||||
Delete Instances Radera instanser
|
||||
@@ -2420,6 +2423,7 @@ digits Tamil Tamil
|
||||
digits Telugu Telugu
|
||||
digits Kannada Kannada
|
||||
digits Malayalam Malayalam
|
||||
Proportional Lining Proportionella versalsiffror
|
||||
Proportional Oldstyle Proportionella medievalsiffror
|
||||
Pucker & Bloat… Dra ihop och svullna…
|
||||
Pucker Tool Verktyget Dra ihop
|
||||
@@ -3207,6 +3211,7 @@ digits Malayalam Malayalam
|
||||
Swap Fill and Stroke (Shift+X) Byt plats på fyllning och kontur (Shift+X)
|
||||
Swap start and end arrowheads Byt plats på start- och slutpilspets
|
||||
Swap the selected object for the file, keeping its place and transform Ersätt det markerade objektet med filen och behåll dess placering och transformering
|
||||
Stylistic Alternates Stilistiska alternativ
|
||||
Swash Swash
|
||||
Swatch Conflict Färgrutekonflikt
|
||||
Swatch Conflicts Färgrutekonflikter
|
||||
@@ -3276,6 +3281,7 @@ digits Malayalam Malayalam
|
||||
Tabs Tabbstopp
|
||||
Tabular Lining Tabellsiffror, versala
|
||||
Tabular Oldstyle Medievalsiffror i tabellbredd
|
||||
Titling Alternates Rubrikalternativ
|
||||
Target Mål
|
||||
Target Contents Målets innehåll
|
||||
Target: Mål:
|
||||
@@ -3818,7 +3824,6 @@ axis Both Båda
|
||||
@msg Combine Slices: the slices have no bounds Kombinera skivor: skivorna har inga gränser
|
||||
@msg Convert to Artboards: selection has no area Konvertera till ritytor: markeringen har ingen area
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Konvertera till form: inga rektanglar eller ellipser är markerade
|
||||
@msg Copied the CSS of {rules} object(s) Kopierade CSS för {rules} objekt
|
||||
@msg Copied the script report Kopierade skriptrapporten
|
||||
@msg Corners edits the corners of a path Hörn redigerar hörnen på en bana
|
||||
@msg Couldn't copy to the system clipboard: {e} Kunde inte kopiera till systemets urklipp: {e}
|
||||
@@ -3835,13 +3840,11 @@ axis Both Båda
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) direktmarkera ankarpunkter att klippa vid (inte slutpunkterna på öppna banor)
|
||||
@msg Divide Objects Below: select a path Dela objekt under: markera en bana
|
||||
@msg Divide Objects Below: select exactly one path Dela objekt under: markera exakt en bana
|
||||
@msg Downloaded {_1} file(s) Hämtade {_1} fil(er)
|
||||
@msg Downloaded {what} Hämtade {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Expandera utseende: markeringen har ett grundläggande utseende
|
||||
@msg Expand: no brush strokes selected Expandera: inga penseldrag är markerade
|
||||
@msg Expand: no gradient fills Expandera: inga gradientfyllningar
|
||||
@msg Expand: nothing to expand Expandera: ingenting att expandera
|
||||
@msg Exported {count} file(s) to {folder} Exporterade {count} fil(er) till {folder}
|
||||
@msg Exported {path} Exporterade {path}
|
||||
@msg Flatten Transparency: select objects to flatten Platta till transparens: markera objekt att platta till
|
||||
@msg Flatten Transparency: {e} Platta till transparens: {e}
|
||||
@@ -4390,10 +4393,6 @@ axis Both Båda
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` är {size} byte (gräns {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} används redan av {_2}
|
||||
@msg {_1} is reserved by the system {_1} är reserverat av systemet
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} länkade fil(er) kan inte läsas här: deras förhandsgranskningar visas
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} bild(er) kunde inte avkodas och visas som överkryssade rutor
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} länkade bild(er) har ändrats på disken: Uppdatera länkar visar de nya versionerna
|
||||
@msg Updated {_1} linked file(s) changed on disk Uppdaterade {_1} länkade fil(er) som ändrats på disken
|
||||
@msg {_1}: not saved, so not closed {_1}: inte sparat, så inte stängt
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp}-bitars bitmappar kan inte läsas
|
||||
@msg {command} didn't create an object {command} skapade inget objekt
|
||||
@@ -4413,7 +4412,6 @@ axis Both Båda
|
||||
@msg Couldn't place {name}: {e} Kunde inte placera {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Kunde inte klistra in från urklippet: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Sparade {path} med {_1} anteckning(ar): {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Exporterade {what} med {_1} anteckning(ar): {first}
|
||||
@msg Exported {what} Exporterade {what}
|
||||
@msg Saved {n} files beside {path} Sparade {n} filer bredvid {path}
|
||||
@msg Saving Sparar
|
||||
@@ -4424,12 +4422,26 @@ axis Both Båda
|
||||
@msg Saving recovery data for {_1} Sparar återställningsdata för {_1}
|
||||
@msg Discarded {_1} recovered document(s) Kastade {_1} återställda dokument
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Återställde {_1} återskapade dokument: spara dem för att behålla dem
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Bäddade in {n} bild(er); {missing} saknas: länka om dem först
|
||||
@msg Embedded {n} image(s) Bäddade in {n} bild(er)
|
||||
@msg Relinked {_1} image(s) Omlänkade {_1} bild(er)
|
||||
@msg Relinked {n} image(s) Omlänkade {n} bild(er)
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Omlänkade {n} bild(er); finns inte i mappen: {_1}
|
||||
@msg Updated {_1} image(s) Uppdaterade {_1} bild(er)
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Bäddade in {n} bild; {missing} saknas: länka om dem först|Bäddade in {n} bilder; {missing} saknas: länka om dem först
|
||||
@msgplural Embedded {n} image|Embedded {n} images Bäddade in {n} bild|Bäddade in {n} bilder
|
||||
@msgplural Relinked {n} image|Relinked {n} images Omlänkade {n} bild|Omlänkade {n} bilder
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Omlänkade {n} bild; finns inte i mappen: {names}|Omlänkade {n} bilder; finns inte i mappen: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Omlänkade {n} bild; {name} kunde inte omlänkas: {reason}|Omlänkade {n} bilder; {name} kunde inte omlänkas: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Uppdaterade {n} bild|Uppdaterade {n} bilder
|
||||
@msgplural Replaced {n} image|Replaced {n} images Ersatte {n} bild|Ersatte {n} bilder
|
||||
@msgplural Broke {n} link|Broke {n} links Bröt {n} länk|Bröt {n} länkar
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Bröt {n} länk; {missing} kan inte läsas: länka om eller uppdatera dem först|Bröt {n} länkar; {missing} kan inte läsas: länka om eller uppdatera dem först
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} länkad fil kan inte läsas här: dess förhandsgranskning visas|{n} länkade filer kan inte läsas här: deras förhandsgranskningar visas
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} bild kunde inte avkodas och visas som en överkryssad ruta|{n} bilder kunde inte avkodas och visas som överkryssade rutor
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} länkad bild har ändrats på disken: Uppdatera länkar visar den nya versionen|{n} länkade bilder har ändrats på disken: Uppdatera länkar visar de nya versionerna
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Uppdaterade {n} länkad fil som ändrats på disken|Uppdaterade {n} länkade filer som ändrats på disken
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Exporterade {what} med {n} anteckning: {first}|Exporterade {what} med {n} anteckningar: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} typsnittsfil finns nu i {folder}|{n} typsnittsfiler finns nu i {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} typsnittsfil finns nu i {folder}; {failed} kunde inte läggas till: {reason}|{n} typsnittsfiler finns nu i {folder}; {failed} kunde inte läggas till: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} typsnitt är inte tillgängligt här: dess text visas med ett annat typsnitt|{n} typsnitt är inte tillgängliga här: deras text visas med ett annat typsnitt
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Kopierade CSS för {n} objekt|Kopierade CSS för {n} objekt
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Hämtade {n} fil|Hämtade {n} filer
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Exporterade {n} fil till {folder}|Exporterade {n} filer till {folder}
|
||||
@msg Unembedded to {_1} Extraherad till {_1}
|
||||
@msg Reset {_1} Återställ {_1}
|
||||
@msg Sent to {_1} Skickat till {_1}
|
||||
@@ -4481,9 +4493,6 @@ axis Both Båda
|
||||
@msg every search thread stopped on an internal error (please report this bug) alla söktrådar stoppades av ett internt fel (rapportera gärna felet)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it VectorCrafts mapp Fonts anges inte här: den anges av skrivbordsappen och vectorcraft-cli
|
||||
@msg choose the font files to add välj de typsnittsfiler som ska läggas till
|
||||
@msg {n} font file(s) are now in {folder} {n} typsnittsfil(er) finns nu i {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} typsnittsfil(er) finns nu i {folder}; {failed} kunde inte läggas till: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} typsnitt är inte tillgängliga här: deras text visas med ett annat typsnitt
|
||||
@msg not a file inte en fil
|
||||
@msg not a font file inte en typsnittsfil
|
||||
@msg that document is no longer open det dokumentet är inte längre öppet
|
||||
@@ -4492,7 +4501,6 @@ axis Both Båda
|
||||
@msg every numbered name for it is taken in the Fonts folder alla numrerade namn för den är upptagna i mappen Typsnitt
|
||||
@msg every numbered name for {name} is taken in the document's folder alla numrerade namn för {name} är upptagna i dokumentets mapp
|
||||
@msg No linked files to look for Inga länkade filer att leta efter
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Omlänkade {n} bild(er); {name} kunde inte omlänkas: {reason}
|
||||
Services Tjänster
|
||||
Hide VectorCraft Göm VectorCraft
|
||||
Zoom Zoom
|
||||
@@ -6164,3 +6172,22 @@ breakText Glyphs Glyfer
|
||||
Text Flow Textflöde
|
||||
By Rows Radvis
|
||||
By Columns Kolumnvis
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Slumpmässig opacitet…
|
||||
Randomize Opacity Slumpmässig opacitet
|
||||
Minimum: Minimum:
|
||||
Maximum: Maximum:
|
||||
Seed: Startvärde:
|
||||
@msg `min` is greater than `max` `min` är större än `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Sortera objekt…
|
||||
Sort Objects Sortera objekt
|
||||
Sort By: Sortera efter:
|
||||
Apply To: Tillämpa på:
|
||||
Area Area
|
||||
X Position X-position
|
||||
Y Position Y-position
|
||||
Stacking Order Staplingsordning
|
||||
Small to Large Från liten till stor
|
||||
Large to Small Från stor till liten
|
||||
Distribute Evenly Fördela jämnt
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -1517,6 +1517,63 @@ fn messages_with_a_count_take_the_plural_form() {
|
||||
assert_eq!(message(cs, "Packaged 21 files"), "Zabaleno 21 souborů");
|
||||
}
|
||||
|
||||
/// The link, font and export status messages with a count, in English for a count of 1 and of 2.
|
||||
const COUNTED_STATUS_MESSAGES: &[(&str, &str)] = &[
|
||||
("1 linked file can't be read here: its preview shows", "2 linked files can't be read here: their previews show"),
|
||||
("1 image couldn't be decoded and shows as a crossed box", "2 images couldn't be decoded and show as crossed boxes"),
|
||||
("1 linked image changed on disk: Update Links shows the new version", "2 linked images changed on disk: Update Links shows the new versions"),
|
||||
("Updated 1 linked file changed on disk", "Updated 2 linked files changed on disk"),
|
||||
("Exported /out/a.svg with 1 note: a note", "Exported /out/a.svg with 2 notes: a note"),
|
||||
("Embedded 1 image; 1 missing: relink them first", "Embedded 2 images; 1 missing: relink them first"),
|
||||
("Embedded 1 image", "Embedded 2 images"),
|
||||
("Relinked 1 image", "Relinked 2 images"),
|
||||
("Relinked 1 image; not in that folder: a.png", "Relinked 2 images; not in that folder: a.png"),
|
||||
("Relinked 1 image; a.png couldn't be relinked: a reason", "Relinked 2 images; a.png couldn't be relinked: a reason"),
|
||||
("Updated 1 image", "Updated 2 images"),
|
||||
("Replaced 1 image", "Replaced 2 images"),
|
||||
("Broke 1 link", "Broke 2 links"),
|
||||
("Broke 1 link; 1 can't be read: relink or update them first", "Broke 2 links; 1 can't be read: relink or update them first"),
|
||||
("1 font file is now in /fonts", "2 font files are now in /fonts"),
|
||||
("1 font file is now in /fonts; 1 couldn't be added: a reason", "2 font files are now in /fonts; 1 couldn't be added: a reason"),
|
||||
("1 font isn't available here: its text shows in another font", "2 fonts aren't available here: their text shows in another font"),
|
||||
("Copied the CSS of 1 object", "Copied the CSS of 2 objects"),
|
||||
("Downloaded 1 file", "Downloaded 2 files"),
|
||||
("Exported 1 file to /out", "Exported 2 files to /out"),
|
||||
];
|
||||
|
||||
/// The link, font and export status messages name a count of 1 in the singular and other counts in
|
||||
/// the plural, and every complete catalog translates both, in the form its plural rule picks.
|
||||
#[test]
|
||||
fn counted_status_messages_take_the_plural_form() {
|
||||
use crate::panels::links::{relinked_status, updated_status};
|
||||
assert_eq!((relinked_status(1), relinked_status(2)), ("Relinked 1 image".to_string(), "Relinked 2 images".to_string()));
|
||||
assert_eq!((updated_status(1), updated_status(2)), ("Updated 1 image".to_string(), "Updated 2 images".to_string()));
|
||||
assert_eq!(crate::dialogs::missing_links::changed_on_disk_status(1), COUNTED_STATUS_MESSAGES[2].0);
|
||||
assert_eq!(crate::dialogs::missing_links::changed_on_disk_status(2), COUNTED_STATUS_MESSAGES[2].1);
|
||||
assert_eq!(crate::io::exported_with_notes("/out/a.svg", 1, "a note"), COUNTED_STATUS_MESSAGES[4].0);
|
||||
assert_eq!(crate::io::exported_with_notes("/out/a.svg", 2, "a note"), COUNTED_STATUS_MESSAGES[4].1);
|
||||
// A value that holds placeholder text is not filled in again.
|
||||
assert_eq!(crate::io::exported_with_notes("/out/{first}.svg", 1, "{n}"), "Exported /out/{first}.svg with 1 note: {n}");
|
||||
for code in COMPLETE_MESSAGES {
|
||||
let lang = Lang::from_code(code).expect("registered");
|
||||
for s in COUNTED_STATUS_MESSAGES.iter().flat_map(|(one, other)| [one, other]) {
|
||||
assert_ne!(message(lang, s), *s, "{code}: {s}");
|
||||
}
|
||||
}
|
||||
let cs = cs();
|
||||
assert_eq!(message(cs, &relinked_status(1)), "Znovu propojen 1 obrázek");
|
||||
assert_eq!(message(cs, &relinked_status(3)), "Znovu propojeny 3 obrázky");
|
||||
assert_eq!(message(cs, &relinked_status(5)), "Znovu propojeno 5 obrázků");
|
||||
assert_eq!(message(de(), &updated_status(1)), "1 Bild aktualisiert");
|
||||
assert_eq!(message(de(), &updated_status(2)), "2 Bilder aktualisiert");
|
||||
let noted = crate::io::exported_with_notes("/out/{n}.svg", 1, "{what}");
|
||||
assert_eq!(message(de(), ¬ed), "/out/{n}.svg mit 1 Hinweis exportiert: {what}");
|
||||
let ru = Lang::from_code("ru").expect("registered");
|
||||
assert_eq!(message(ru, COUNTED_STATUS_MESSAGES[19].0), "Экспортирован 1 файл в /out");
|
||||
assert_eq!(message(ru, "Exported 3 files to /out"), "Экспортировано 3 файла в /out");
|
||||
assert_eq!(message(ru, "Exported 5 files to /out"), "Экспортировано 5 файлов в /out");
|
||||
}
|
||||
|
||||
/// The scan reads the message of an error made with one of the engine's [`ERROR_HELPERS`] or with
|
||||
/// an error enum's variant, `EngineError::Disabled`'s reason included: a literal or a `format!`
|
||||
/// string, on the call's line or wrapped over several lines, in the same template form as the
|
||||
|
||||
@@ -734,6 +734,9 @@ font-technology Variable Değişken
|
||||
Delete Swatch Renk Örneğini Sil
|
||||
Delete Symbol Sembolü Sil
|
||||
Delete the selected symbol? Seçili sembol silinsin mi?
|
||||
Delete the selected symbols? Seçili semboller silinsin mi?
|
||||
No unused symbols Kullanılmayan sembol yok
|
||||
Delete Symbols Sembolleri Sil
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Sembollerden biri veya birkaçı kullanımda ve örnekleri genişletilene ya da silinene kadar silinemez.
|
||||
Expand Instances Örnekleri Genişlet
|
||||
Delete Instances Örnekleri Sil
|
||||
@@ -2297,6 +2300,7 @@ digits Tamil Tamilce
|
||||
digits Telugu Telugu
|
||||
digits Kannada Kannada
|
||||
digits Malayalam Malayalam
|
||||
Proportional Lining Orantılı Astar
|
||||
Proportional Oldstyle Orantılı Eski Stil
|
||||
Pucker & Bloat… Büzüşme ve Şişkinlik…
|
||||
Pucker Tool Büzme Aracı
|
||||
@@ -3103,6 +3107,7 @@ digits Malayalam Malayalam
|
||||
Swap Fill and Stroke (Shift+X) Dolgu ve Konturu Değiştir (Shift+X)
|
||||
Swap start and end arrowheads Başlangıç ve bitiş ok uçlarını değiştirin
|
||||
Swap the selected object for the file, keeping its place and transform Seçilen nesneyi, yerini koruyarak dosyayla değiştirin ve dönüştürün
|
||||
Stylistic Alternates Stilistik Alternatifler
|
||||
Swash çalkalama
|
||||
Swatch Conflict Renk Örneği Çatışması
|
||||
Swatch Conflicts Renk Örneği Çatışmaları
|
||||
@@ -3172,6 +3177,7 @@ digits Malayalam Malayalam
|
||||
Tabs Sekmeler
|
||||
Tabular Lining Sekmeli Astar
|
||||
Tabular Oldstyle Tablolu Eski Stil
|
||||
Titling Alternates Başlık Alternatifleri
|
||||
Target Hedef
|
||||
Target Contents Hedef İçerikler
|
||||
Target: Hedef:
|
||||
@@ -3706,7 +3712,6 @@ axis Both Her İkisi
|
||||
@msg Combine Slices: the slices have no bounds Dilimleri Birleştir: dilimlerin sınırları yoktur
|
||||
@msg Convert to Artboards: selection has no area Çalışma Yüzeylerine Dönüştür: seçimin alanı yok
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Şekle Dönüştür: seçili dikdörtgen veya elips yok
|
||||
@msg Copied the CSS of {rules} object(s) {rules} nesnelerinin CSS'si kopyalandı
|
||||
@msg Copied the script report Komut dosyası raporu kopyalandı
|
||||
@msg Corners edits the corners of a path Köşeler bir yolun köşelerini düzenler
|
||||
@msg Couldn't copy to the system clipboard: {e} Sistem panosuna kopyalanamadı: {e}
|
||||
@@ -3723,13 +3728,11 @@ axis Both Her İkisi
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) kesilecek bağlantı noktalarını doğrudan seçin (açık yolların bitiş noktalarını değil)
|
||||
@msg Divide Objects Below: select a path Aşağıdaki Nesneleri Böl: bir yol seçin
|
||||
@msg Divide Objects Below: select exactly one path Aşağıdaki Nesneleri Böl: tam olarak bir yol seçin
|
||||
@msg Downloaded {_1} file(s) İndirilen {_1} dosya(lar)ı
|
||||
@msg Downloaded {what} {what} indirildi
|
||||
@msg Expand Appearance: the selection has a basic appearance Görünümü Genişlet: seçimin temel bir görünümü vardır
|
||||
@msg Expand: no brush strokes selected Genişlet: seçili fırça darbesi yok
|
||||
@msg Expand: no gradient fills Genişlet: degrade dolgu yok
|
||||
@msg Expand: nothing to expand Genişlet: genişletilecek bir şey yok
|
||||
@msg Exported {count} file(s) to {folder} {count} dosyası/dosyaları {folder}'ye aktarıldı
|
||||
@msg Exported {path} Dışa aktarılan {path}
|
||||
@msg Flatten Transparency: select objects to flatten Düzleştir Şeffaflığı: düzleştirilecek nesneleri seçin
|
||||
@msg Flatten Transparency: {e} Şeffaflığı Düzleştir: {e}
|
||||
@@ -4236,10 +4239,6 @@ axis Both Her İkisi
|
||||
@msg {_1} font families available {_1} yazı tipi aileleri mevcut
|
||||
@msg {_1} is a live effect (Effect › Plug-ins) {_1} canlı bir efekttir (Efekt › Eklentiler)
|
||||
@msg {_1} is already used by {_2} {_1} zaten {_2} tarafından kullanılıyor
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} bağlantılı dosya(lar) burada okunamıyor: önizlemeleri gösteriliyor
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} görüntünün kodu çözülemedi: çarpı işaretli kutular olarak gösteriliyor
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} bağlantılı görseller diskte değiştirildi: Güncelleme Bağlantıları yeni sürümleri gösteriyor
|
||||
@msg Updated {_1} linked file(s) changed on disk Güncellenmiş {_1} bağlantılı dosya(lar) diskte değiştirildi
|
||||
@msg {_1}: not saved, so not closed {_1}: kaydedilmedi, dolayısıyla kapatılmadı
|
||||
@msg {bpp}-bit bitmaps can't be read {bpp} bit bit eşlemleri okunamıyor
|
||||
@msg {command} didn't create an object {command} bir nesne yaratmadı
|
||||
@@ -4259,7 +4258,6 @@ axis Both Her İkisi
|
||||
@msg Couldn't place {name}: {e} {name} yerleştirilemedi: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Panodan yapıştırılamadı: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} {path}, {_1} notlarıyla kaydedildi: {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} {_1} notlarıyla birlikte dışa aktarılan {what}: {first}
|
||||
@msg Exported {what} Dışa aktarılan {what}
|
||||
@msg Saved {n} files beside {path} {path}'nin yanında kaydedilen {n} dosyaları
|
||||
@msg Saving Kaydediliyor
|
||||
@@ -4270,12 +4268,26 @@ axis Both Her İkisi
|
||||
@msg Saving recovery data for {_1} {_1} için kurtarma verileri kaydediliyor
|
||||
@msg Discarded {_1} recovered document(s) Atılan {_1} kurtarılan belge(ler)
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Geri yüklenen {_1} kurtarılan belge(ler): saklamak için bunları kaydedin
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Gömülü {n} görselleri; {missing} eksik: önce onları yeniden bağlayın
|
||||
@msg Embedded {n} image(s) Gömülü {n} görselleri
|
||||
@msg Relinked {_1} image(s) Yeniden bağlanan {_1} görselleri
|
||||
@msg Relinked {n} image(s) Yeniden bağlanan {n} görselleri
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Yeniden bağlanan {n} görselleri; bu klasörde değil: {_1}
|
||||
@msg Updated {_1} image(s) Güncellenmiş {_1} görselleri
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first {n} görsel gömüldü; {missing} eksik: önce onları yeniden bağlayın
|
||||
@msgplural Embedded {n} image|Embedded {n} images {n} görsel gömüldü
|
||||
@msgplural Relinked {n} image|Relinked {n} images {n} görsel yeniden bağlandı
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} {n} görsel yeniden bağlandı; bu klasörde değil: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} {n} görsel yeniden bağlandı; {name} yeniden bağlanamadı: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images {n} görsel güncellendi
|
||||
@msgplural Replaced {n} image|Replaced {n} images {n} görsel değiştirildi
|
||||
@msgplural Broke {n} link|Broke {n} links {n} bağlantı kesildi
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first {n} bağlantı kesildi; {missing} okunamıyor: önce onları yeniden bağlayın veya güncelleyin
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} bağlantılı dosya burada okunamıyor: önizlemeleri gösteriliyor
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} görüntünün kodu çözülemedi: çarpı işaretli kutular olarak gösteriliyor
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} bağlantılı görsel diskte değişti: Bağlantıları Güncelle yeni sürümleri gösterir
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Diskte değişen {n} bağlantılı dosya güncellendi
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} {what} {n} notla dışa aktarıldı: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} yazı tipi dosyası artık {folder} içinde
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} yazı tipi dosyası artık {folder} içinde; {failed} eklenemedi: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} yazı tipi burada kullanılamıyor: metni başka bir yazı tipiyle gösteriliyor
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects {n} nesnenin CSS'si kopyalandı
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files {n} dosya indirildi
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} {n} dosya {folder} klasörüne aktarıldı
|
||||
@msg Unembedded to {_1} {_1}'ye gömülü değil
|
||||
@msg Reset {_1} {_1}'yi sıfırla
|
||||
@msg Sent to {_1} {_1}'ye gönderildi
|
||||
@@ -4327,9 +4339,6 @@ axis Both Her İkisi
|
||||
@msg every search thread stopped on an internal error (please report this bug) her arama dizisi dahili bir hata nedeniyle durduruldu (lütfen bu hatayı bildirin)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it VectorCraft'ın Fonts klasörü burada ayarlanmamış: masaüstü uygulaması ve Vectorcraft-cli bunu ayarlıyor
|
||||
@msg choose the font files to add eklenecek yazı tipi dosyalarını seçin
|
||||
@msg {n} font file(s) are now in {folder} {n} yazı tipi dosyası/dosyaları artık {folder}'de
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} yazı tipi dosyası/dosyaları artık {folder}'de; {failed} eklenemedi: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} yazı tipleri burada mevcut değil: metinleri başka bir yazı tipinde gösteriliyor
|
||||
@msg not a file dosya değil
|
||||
@msg not a font file yazı tipi dosyası değil
|
||||
@msg that document is no longer open bu belge artık açık değil
|
||||
@@ -4338,7 +4347,6 @@ axis Both Her İkisi
|
||||
@msg every numbered name for it is taken in the Fonts folder bunun için numaralandırılmış her ad Yazı Tipleri klasöründe alınır
|
||||
@msg every numbered name for {name} is taken in the document's folder {name} için numaralandırılmış her ad belgenin klasöründe alınır
|
||||
@msg No linked files to look for Aranacak bağlantılı dosya yok
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Yeniden bağlanan {n} görselleri; {name} yeniden bağlanamadı: {reason}
|
||||
Services Hizmetler
|
||||
Hide VectorCraft VectorCraft'ı gizle
|
||||
Zoom Yakınlaştır
|
||||
@@ -6069,3 +6077,22 @@ breakText Glyphs Glifler
|
||||
Text Flow Metin Akışı
|
||||
By Rows Satırlara Göre
|
||||
By Columns Sütunlara Göre
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Rastgele Opaklık…
|
||||
Randomize Opacity Rastgele Opaklık
|
||||
Minimum: En Az:
|
||||
Maximum: En Çok:
|
||||
Seed: Başlangıç Değeri:
|
||||
@msg `min` is greater than `max` `min`, `max` değerinden büyük
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Nesneleri Sırala…
|
||||
Sort Objects Nesneleri Sırala
|
||||
Sort By: Sıralama Ölçütü:
|
||||
Apply To: Uygulanacak Değer:
|
||||
Area Alan
|
||||
X Position X Konumu
|
||||
Y Position Y Konumu
|
||||
Stacking Order İstifleme Sırası
|
||||
Small to Large Küçükten Büyüğe
|
||||
Large to Small Büyükten Küçüğe
|
||||
Distribute Evenly Eşit Dağıt
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -749,6 +749,9 @@ font-technology Variable Варіативні
|
||||
Delete Swatch Видалити зразок
|
||||
Delete Symbol Видалити символ
|
||||
Delete the selected symbol? Видалити вибраний символ?
|
||||
Delete the selected symbols? Видалити вибрані символи?
|
||||
No unused symbols Немає невикористаних символів
|
||||
Delete Symbols Видалити символи
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Один або кілька символів використовуються, і їх не можна видалити, доки їхні екземпляри не буде розібрано або видалено.
|
||||
Expand Instances Розібрати екземпляри
|
||||
Delete Instances Видалити екземпляри
|
||||
@@ -2500,6 +2503,7 @@ digits Tamil Тамільські
|
||||
digits Telugu Телугу
|
||||
digits Kannada Каннада
|
||||
digits Malayalam Малаялам
|
||||
Proportional Lining Пропорційні цифри
|
||||
Proportional Oldstyle Пропорційні цифри старого стилю
|
||||
Pucker & Bloat… Зморщування та роздування …
|
||||
Pucker Tool Інструмент «Зморщування»
|
||||
@@ -3306,6 +3310,7 @@ effect Points Точки
|
||||
Swap Fill and Stroke (Shift+X) Змінити заливку та обведення (Shift+X)
|
||||
Swap start and end arrowheads Поміняти початкову та кінцеву стрілки
|
||||
Swap the selected object for the file, keeping its place and transform Замінити виділений об’єкт файлом, зберігши його положення та перетворення
|
||||
Stylistic Alternates Стилістичні альтернативи
|
||||
Swash Розчерк
|
||||
Swatch Conflict Конфлікт зразків
|
||||
Swatch Conflicts Конфлікти зразків
|
||||
@@ -3375,6 +3380,7 @@ effect Points Точки
|
||||
Tabs Табуляції
|
||||
Tabular Lining Табличні цифри
|
||||
Tabular Oldstyle Табличні цифри старого стилю
|
||||
Titling Alternates Альтернативи для заголовків
|
||||
Target Об’єкт
|
||||
Target Contents Вміст об’єкта
|
||||
Target: Об’єкт:
|
||||
@@ -3925,7 +3931,6 @@ axis Both Обидві
|
||||
@msg Combine Slices: the slices have no bounds Об’єднання фрагментів: фрагменти не мають кордонів
|
||||
@msg Convert to Artboards: selection has no area Перетворення на монтажні області: виділення не має області
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Перетворення на фігуру: не виділено прямокутники або еліпси
|
||||
@msg Copied the CSS of {rules} object(s) Скопійовано CSS об’єктів: {rules}
|
||||
@msg Copied the script report Звіт про сценарій скопійовано
|
||||
@msg Corners edits the corners of a path «Кути» редагує кути контуру
|
||||
@msg Couldn't copy to the system clipboard: {e} Не вдалося скопіювати до системного буфера обміну: {e}
|
||||
@@ -3942,13 +3947,11 @@ axis Both Обидві
|
||||
@msg direct-select anchor points to cut at (not the end points of open paths) виділіть прямим виділенням опорні точки для розрізу (не кінцеві точки відкритих контурів)
|
||||
@msg Divide Objects Below: select a path Поділ об’єктів нижче: виділіть контур
|
||||
@msg Divide Objects Below: select exactly one path Поділ об’єктів нижче: виділіть рівно один контур
|
||||
@msg Downloaded {_1} file(s) Завантажено файли: {_1}
|
||||
@msg Downloaded {what} Завантажено: {what}
|
||||
@msg Expand Appearance: the selection has a basic appearance Розбір оформлення: виділення основне оформлення
|
||||
@msg Expand: no brush strokes selected Розбір: не виділено мазки пензлі
|
||||
@msg Expand: no gradient fills Розбір: немає градієнтних заливок
|
||||
@msg Expand: nothing to expand Розбір: нема чого розбирати
|
||||
@msg Exported {count} file(s) to {folder} Експортовано файли: {count} до {folder}
|
||||
@msg Exported {path} Експортовано: {path}
|
||||
@msg Flatten Transparency: select objects to flatten Зведення прозорості: виділіть об’єкти для зведення
|
||||
@msg Flatten Transparency: {e} Зведення прозорості: {e}
|
||||
@@ -4509,10 +4512,6 @@ axis Both Обидві
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` займає {size} байт (межа {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} вже використовується {_2}
|
||||
@msg {_1} is reserved by the system Сполучення {_1} зарезервоване системою
|
||||
@msg {_1} linked file(s) can't be read here: their previews show тут неможливо прочитати пов’язані файли: {_1}: відображаються їх попередні перегляди
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes не вдалося декодувати зображення ({undecoded}): вони показані як перекреслені рамки
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions пов’язаних зображень ({_1}) змінилися на диску: «Оновити зв’язки» покаже нові версії
|
||||
@msg Updated {_1} linked file(s) changed on disk Оновлено пов’язаних файлів, змінених на диску: {_1}
|
||||
@msg {_1}: not saved, so not closed {_1}: не збережено, тому не закрито
|
||||
@msg {bpp}-bit bitmaps can't be read растрові зображення з глибиною {bpp} біт не читаються
|
||||
@msg {command} didn't create an object {command} не створив об’єкт
|
||||
@@ -4532,7 +4531,6 @@ axis Both Обидві
|
||||
@msg Couldn't place {name}: {e} Не вдалося помістити {name}: {e}
|
||||
@msg Couldn't paste from the clipboard: {e} Не вдалося вставити з буфера обміну: {e}
|
||||
@msg Saved {path} with {_1} note(s): {first} Збережено: {path} з примітками ({_1}) : {first}
|
||||
@msg Exported {what} with {_1} note(s): {first} Експортовано: {what} з примітками ({_1}) : {first}
|
||||
@msg Exported {what} Експортовано: {what}
|
||||
@msg Saved {n} files beside {path} Збережено файлів: {n} поруч із {path}
|
||||
@msg Saving Збереження
|
||||
@@ -4543,12 +4541,26 @@ axis Both Обидві
|
||||
@msg Saving recovery data for {_1} Збереження даних відновлення для {_1}
|
||||
@msg Discarded {_1} recovered document(s) Скасовано відновлених документів: {_1}
|
||||
@msg Restored {_1} recovered document(s): save them to keep them Відновлено документів: {_1}: збережіть їх, щоб залишити
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Вбудовано зображень: {n}; відсутніх: {missing}. Спочатку відновіть їхні зв’язки
|
||||
@msg Embedded {n} image(s) Вбудовано зображення: {n}
|
||||
@msg Relinked {_1} image(s) Відновлено зв’язок із зображеннями: {_1}
|
||||
@msg Relinked {n} image(s) Відновлено зв’язок із зображеннями: {n}
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Відновлено зв’язок із зображеннями: {n}; немає в цій папці: {_1}
|
||||
@msg Updated {_1} image(s) Оновлено зображень: {_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Вбудовано {n} зображення; відсутніх: {missing}. Спочатку відновіть їхні зв’язки|Вбудовано {n} зображення; відсутніх: {missing}. Спочатку відновіть їхні зв’язки|Вбудовано {n} зображень; відсутніх: {missing}. Спочатку відновіть їхні зв’язки
|
||||
@msgplural Embedded {n} image|Embedded {n} images Вбудовано {n} зображення|Вбудовано {n} зображення|Вбудовано {n} зображень
|
||||
@msgplural Relinked {n} image|Relinked {n} images Відновлено зв’язок із {n} зображенням|Відновлено зв’язок із {n} зображеннями|Відновлено зв’язок із {n} зображеннями
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Відновлено зв’язок із {n} зображенням; немає в цій папці: {names}|Відновлено зв’язок із {n} зображеннями; немає в цій папці: {names}|Відновлено зв’язок із {n} зображеннями; немає в цій папці: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Відновлено зв’язок із {n} зображенням; не вдалося відновити зв’язок із {name}: {reason}|Відновлено зв’язок із {n} зображеннями; не вдалося відновити зв’язок із {name}: {reason}|Відновлено зв’язок із {n} зображеннями; не вдалося відновити зв’язок із {name}: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Оновлено {n} зображення|Оновлено {n} зображення|Оновлено {n} зображень
|
||||
@msgplural Replaced {n} image|Replaced {n} images Замінено {n} зображення|Замінено {n} зображення|Замінено {n} зображень
|
||||
@msgplural Broke {n} link|Broke {n} links Розірвано {n} зв’язок|Розірвано {n} зв’язки|Розірвано {n} зв’язків
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Розірвано {n} зв’язок; не вдається прочитати {missing}: спочатку відновіть або оновіть їхні зв’язки|Розірвано {n} зв’язки; не вдається прочитати {missing}: спочатку відновіть або оновіть їхні зв’язки|Розірвано {n} зв’язків; не вдається прочитати {missing}: спочатку відновіть або оновіть їхні зв’язки
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show тут неможливо прочитати {n} пов’язаний файл: відображається його попередній перегляд|тут неможливо прочитати {n} пов’язані файли: відображаються їх попередні перегляди|тут неможливо прочитати {n} пов’язаних файлів: відображаються їх попередні перегляди
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes не вдалося декодувати {n} зображення: воно показане як перекреслена рамка|не вдалося декодувати {n} зображення: вони показані як перекреслені рамки|не вдалося декодувати {n} зображень: вони показані як перекреслені рамки
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} пов’язане зображення змінилося на диску: «Оновити зв’язки» покаже нову версію|{n} пов’язані зображення змінилися на диску: «Оновити зв’язки» покаже нові версії|{n} пов’язаних зображень змінилися на диску: «Оновити зв’язки» покаже нові версії
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Оновлено {n} пов’язаний файл, змінений на диску|Оновлено {n} пов’язані файли, змінені на диску|Оновлено {n} пов’язаних файлів, змінених на диску
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Експортовано: {what} з {n} приміткою: {first}|Експортовано: {what} з {n} примітками: {first}|Експортовано: {what} з {n} примітками: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} файл шрифту тепер у {folder}|{n} файли шрифтів тепер у {folder}|{n} файлів шрифтів тепер у {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} файл шрифту тепер у {folder}; не вдалося додати {failed}: {reason}|{n} файли шрифтів тепер у {folder}; не вдалося додати {failed}: {reason}|{n} файлів шрифтів тепер у {folder}; не вдалося додати {failed}: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font тут недоступний {n} шрифт: його текст показано іншим шрифтом|тут недоступні {n} шрифти: їхній текст показано іншим шрифтом|тут недоступно {n} шрифтів: їхній текст показано іншим шрифтом
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Скопійовано CSS {n} об’єкта|Скопійовано CSS {n} об’єктів|Скопійовано CSS {n} об’єктів
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Завантажено {n} файл|Завантажено {n} файли|Завантажено {n} файлів
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Експортовано {n} файл до {folder}|Експортовано {n} файли до {folder}|Експортовано {n} файлів до {folder}
|
||||
@msg Unembedded to {_1} Вилучено у {_1}
|
||||
@msg Reset {_1} Скинуто: {_1}
|
||||
@msg Sent to {_1} Відправлено до {_1}
|
||||
@@ -4600,9 +4612,6 @@ axis Both Обидві
|
||||
@msg every search thread stopped on an internal error (please report this bug) усі потоки пошуку зупинилися через внутрішню помилку (повідомте про цю помилку)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it Папку Fonts VectorCraft тут не задано: її задають настільна програма та vectorcraft-cli
|
||||
@msg choose the font files to add виберіть файли шрифтів для додавання
|
||||
@msg {n} font file(s) are now in {folder} Файлів шрифтів тепер у {folder}: {n}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} Файлів шрифтів тепер у {folder}: {n}; не вдалося додати {failed}: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font тут недоступно шрифтів: {n}; їхній текст показано іншим шрифтом
|
||||
@msg not a file не файл
|
||||
@msg not a font file не файл шрифту
|
||||
@msg that document is no longer open цей документ більше не відкрито
|
||||
@@ -4611,7 +4620,6 @@ axis Both Обидві
|
||||
@msg every numbered name for it is taken in the Fonts folder усі нумеровані імена для нього вже зайняті в папці Fonts
|
||||
@msg every numbered name for {name} is taken in the document's folder усі нумеровані імена для {name} уже зайняті в папці документа
|
||||
@msg No linked files to look for Немає пов’язаних файлів для пошуку
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Відновлено зв’язок із зображеннями: {n}; не вдалося відновити зв’язок із {name}: {reason}
|
||||
Services Служби
|
||||
Hide VectorCraft Приховати VectorCraft
|
||||
Zoom Масштаб
|
||||
@@ -5711,3 +5719,22 @@ breakText Glyphs Гліфи
|
||||
Text Flow Потік тексту
|
||||
By Rows За рядками
|
||||
By Columns За стовпцями
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Випадкова непрозорість…
|
||||
Randomize Opacity Випадкова непрозорість
|
||||
Minimum: Мінімум:
|
||||
Maximum: Максимум:
|
||||
Seed: Початкове число:
|
||||
@msg `min` is greater than `max` `min` більше за `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Сортувати об’єкти…
|
||||
Sort Objects Сортувати об’єкти
|
||||
Sort By: Сортувати за:
|
||||
Apply To: Застосувати до:
|
||||
Area Площа
|
||||
X Position Положення за X
|
||||
Y Position Положення за Y
|
||||
Stacking Order Порядок накладання
|
||||
Small to Large Від меншого до більшого
|
||||
Large to Small Від більшого до меншого
|
||||
Distribute Evenly Розподілити рівномірно
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 178 and column 5.
|
@@ -875,6 +875,9 @@ font-technology Variable Biến thiên
|
||||
Delete Swatch Xóa mẫu màu
|
||||
Delete Symbol Xóa ký hiệu
|
||||
Delete the selected symbol? Xóa ký hiệu đã chọn?
|
||||
Delete the selected symbols? Xóa các ký hiệu đã chọn?
|
||||
No unused symbols Không có ký hiệu nào chưa dùng
|
||||
Delete Symbols Xóa các ký hiệu
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. Một hoặc nhiều ký hiệu đang được sử dụng và không thể xóa cho đến khi các thực thể của chúng được mở rộng hoặc xóa.
|
||||
Expand Instances Mở rộng thực thể
|
||||
Delete Instances Xóa thực thể
|
||||
@@ -2787,6 +2790,7 @@ mark-style Japanese Kiểu Nhật
|
||||
Proof Setup Thiết lập thử nghiệm
|
||||
Properties Thuộc tính
|
||||
Proportional Metrics Số liệu theo tỷ lệ
|
||||
Proportional Lining Số tỷ lệ đứng
|
||||
Proportional Oldstyle Kiểu cũ theo tỷ lệ
|
||||
Pucker & Bloat… Nhíu & Phồng…
|
||||
Pucker Tool Công cụ Nhíu
|
||||
@@ -3665,6 +3669,7 @@ mark-style Japanese Kiểu Nhật
|
||||
Swap Fill and Stroke (Shift+X) Đổi màu tô và nét (Shift+X)
|
||||
Swap start and end arrowheads Đổi đầu mũi tên bắt đầu và kết thúc
|
||||
Swap the selected object for the file, keeping its place and transform Thay đối tượng đã chọn bằng tệp, giữ nguyên vị trí và biến đổi
|
||||
Stylistic Alternates Ký tự thay thế theo phong cách
|
||||
Swash Swash
|
||||
Swatch Conflict Xung đột mẫu màu
|
||||
Swatch Conflicts Xung đột mẫu màu
|
||||
@@ -3703,6 +3708,7 @@ mark-style Japanese Kiểu Nhật
|
||||
Tabs Tab
|
||||
Tabular Lining Số bảng đứng
|
||||
Tabular Oldstyle Số bảng kiểu cũ
|
||||
Titling Alternates Ký tự thay thế cho tiêu đề
|
||||
Taper Thu dần
|
||||
Target Mục tiêu
|
||||
Target Contents Nội dung mục tiêu
|
||||
@@ -4332,7 +4338,6 @@ theme Appearance Giao diện
|
||||
@msg compressed (RLE) bitmaps can't be read yet bitmap nén (RLE) chưa thể đọc được
|
||||
@msg Convert to Artboards: selection has no area Chuyển thành bảng vẽ: vùng chọn không có diện tích
|
||||
@msg Convert to Shape: no rectangles or ellipses selected Chuyển thành hình dạng: chưa chọn hình chữ nhật hay hình elip
|
||||
@msg Copied the CSS of {rules} object(s) Đã sao chép CSS của {rules} đối tượng
|
||||
@msg Copied the script report Đã sao chép báo cáo script
|
||||
@msg Corners edits the corners of a path Corners chỉnh sửa các góc của đường dẫn
|
||||
@msg could not decode image: {0} không thể giải mã ảnh: {0}
|
||||
@@ -4357,11 +4362,8 @@ theme Appearance Giao diện
|
||||
@msg Divide Objects Below: select a path Chia đối tượng bên dưới: hãy chọn một đường dẫn
|
||||
@msg Divide Objects Below: select exactly one path Chia đối tượng bên dưới: chọn đúng một đường dẫn
|
||||
@msg docking action contains an unknown panel or an excessive split path hành động neo chứa bảng không xác định hoặc đường dẫn tách quá dài
|
||||
@msg Downloaded {_1} file(s) Đã tải xuống {_1} tệp
|
||||
@msg Downloaded {what} Đã tải xuống {what}
|
||||
@msg effect {k} is `{_1}`, not `{id}` hiệu ứng {k} là `{_1}`, không phải `{id}`
|
||||
@msg Embedded {n} image(s) Đã nhúng {n} ảnh
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first Đã nhúng {n} ảnh; thiếu {missing}: hãy liên kết lại trước
|
||||
@msg empty brush stroke nét cọ trống
|
||||
@msg empty cutter dao cắt trống
|
||||
@msg empty path đường dẫn trống
|
||||
@@ -4372,10 +4374,8 @@ theme Appearance Giao diện
|
||||
@msg Expand: no brush strokes selected Mở rộng: chưa chọn nét cọ
|
||||
@msg Expand: no gradient fills Mở rộng: không có tô chuyển sắc
|
||||
@msg Expand: nothing to expand Mở rộng: không có gì để mở rộng
|
||||
@msg Exported {count} file(s) to {folder} Đã xuất {count} tệp vào {folder}
|
||||
@msg Exported {path} Đã xuất {path}
|
||||
@msg Exported {what} Đã xuất {what}
|
||||
@msg Exported {what} with {_1} note(s): {first} Đã xuất {what} với {_1} ghi chú: {first}
|
||||
@msg Exporting {_1} Đang xuất {_1}
|
||||
@msg Packaging {_1} Đang đóng gói {_1}
|
||||
@msg Placing {_1} Đang đặt {_1}
|
||||
@@ -4664,10 +4664,26 @@ theme Appearance Giao diện
|
||||
@msg recovery copy `{file}`: {e} bản sao phục hồi `{file}`: {e}
|
||||
@msg Release Guides: no guides Giải phóng đường căn: không có đường căn
|
||||
@msg Release: no layer to put the rectangle in Giải phóng: không có lớp để đặt hình chữ nhật
|
||||
@msg Relinked {_1} image(s) Đã liên kết lại {_1} ảnh
|
||||
@msg Relinked {n} image(s) Đã liên kết lại {n} ảnh
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} Đã liên kết lại {n} ảnh; không có trong thư mục đó: {_1}
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} Đã liên kết lại {n} ảnh; {name} không thể liên kết lại: {reason}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first Đã nhúng {n} ảnh; thiếu {missing}: hãy liên kết lại trước
|
||||
@msgplural Embedded {n} image|Embedded {n} images Đã nhúng {n} ảnh
|
||||
@msgplural Relinked {n} image|Relinked {n} images Đã liên kết lại {n} ảnh
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} Đã liên kết lại {n} ảnh; không có trong thư mục đó: {names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} Đã liên kết lại {n} ảnh; {name} không thể liên kết lại: {reason}
|
||||
@msgplural Updated {n} image|Updated {n} images Đã cập nhật {n} ảnh
|
||||
@msgplural Replaced {n} image|Replaced {n} images Đã thay thế {n} ảnh
|
||||
@msgplural Broke {n} link|Broke {n} links Đã ngắt {n} liên kết
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first Đã ngắt {n} liên kết; không thể đọc {missing}: hãy liên kết lại hoặc cập nhật trước
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show {n} tệp liên kết không thể đọc ở đây: bản xem trước được hiển thị
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes {n} hình ảnh không thể giải mã: chúng hiển thị dưới dạng khung có dấu gạch chéo
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions {n} ảnh liên kết đã thay đổi trên đĩa: Cập nhật liên kết hiển thị phiên bản mới
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk Đã cập nhật {n} tệp liên kết đã thay đổi trên đĩa
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} Đã xuất {what} với {n} ghi chú: {first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} tệp phông chữ hiện ở trong {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} tệp phông chữ hiện ở trong {folder}; {failed} không thể thêm: {reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font {n} phông chữ không khả dụng ở đây: văn bản hiển thị bằng phông khác
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects Đã sao chép CSS của {n} đối tượng
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files Đã tải xuống {n} tệp
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} Đã xuất {n} tệp vào {folder}
|
||||
@msg Reload the page to go on (changes not saved yet may be lost). Tải lại trang để tiếp tục (các thay đổi chưa lưu có thể bị mất).
|
||||
@msg Replace Spine: select a blend and a path Thay thế trục: chọn một đối tượng hòa trộn và một đường dẫn
|
||||
@msg Reset {_1} Đã đặt lại {_1}
|
||||
@@ -4886,8 +4902,6 @@ theme Appearance Giao diện
|
||||
@msg unknown workspace (one of {_1}) không gian làm việc không xác định (một trong {_1})
|
||||
@msg unsupported native docking operation thao tác neo gốc không được hỗ trợ
|
||||
@msg unsupported: {0} không được hỗ trợ: {0}
|
||||
@msg Updated {_1} image(s) Đã cập nhật {_1} ảnh
|
||||
@msg Updated {_1} linked file(s) changed on disk Đã cập nhật {_1} tệp liên kết đã thay đổi trên đĩa
|
||||
@msg variables are locked biến số bị khóa
|
||||
@msg variables that aren't text were left out: {kinds} các biến số không phải văn bản đã bị bỏ qua: {kinds}
|
||||
@msg VectorCraft doesn't search other apps' or the system's folders: {path} VectorCraft không tìm kiếm trong thư mục của ứng dụng khác hoặc hệ thống: {path}
|
||||
@@ -4916,9 +4930,6 @@ theme Appearance Giao diện
|
||||
@msg `documentData` is {size} bytes (limit {MAX_DOCUMENT_DATA}) `documentData` có {size} byte (giới hạn {MAX_DOCUMENT_DATA})
|
||||
@msg {_1} is already used by {_2} {_1} đã được dùng bởi {_2}
|
||||
@msg {_1} is reserved by the system {_1} được hệ thống dành riêng
|
||||
@msg {_1} linked file(s) can't be read here: their previews show {_1} tệp liên kết không thể đọc ở đây: bản xem trước được hiển thị
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes {undecoded} hình ảnh không thể giải mã: chúng hiển thị dưới dạng khung có dấu gạch chéo
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions {_1} ảnh liên kết đã thay đổi trên đĩa: Cập nhật liên kết hiển thị phiên bản mới
|
||||
@msg {_1}: not saved, so not closed {_1}: chưa lưu, nên không đóng
|
||||
@msg {bpp}-bit bitmaps can't be read bitmap {bpp}-bit không thể đọc được
|
||||
@msg {command} didn't create an object {command} không tạo đối tượng
|
||||
@@ -4935,9 +4946,6 @@ theme Appearance Giao diện
|
||||
@msg {name}: CRC mismatch {name}: CRC không khớp
|
||||
@msg {name}: no local header {name}: không có tiêu đề cục bộ
|
||||
@msg {name}: no such recovery entry {name}: không có mục phục hồi như vậy
|
||||
@msg {n} font file(s) are now in {folder} {n} tệp phông chữ hiện ở trong {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} tệp phông chữ hiện ở trong {folder}; {failed} không thể thêm: {reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font {n} phông chữ không khả dụng ở đây: văn bản hiển thị bằng phông khác
|
||||
@msg {path} can't be found: relink it first {path} không tìm thấy: hãy liên kết lại trước
|
||||
@msg {path} is not a folder {path} không phải là thư mục
|
||||
@msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}: không có hệ thống tệp ở đây (truyền dataBase64 để mở; bỏ path để nhận dataBase64)
|
||||
@@ -5714,3 +5722,22 @@ breakText Glyphs Glyph
|
||||
Text Flow Luồng văn bản
|
||||
By Rows Theo hàng
|
||||
By Columns Theo cột
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… Độ mờ ngẫu nhiên…
|
||||
Randomize Opacity Độ mờ ngẫu nhiên
|
||||
Minimum: Tối thiểu:
|
||||
Maximum: Tối đa:
|
||||
Seed: Giá trị khởi đầu:
|
||||
@msg `min` is greater than `max` `min` lớn hơn `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… Sắp xếp đối tượng…
|
||||
Sort Objects Sắp xếp đối tượng
|
||||
Sort By: Sắp xếp theo:
|
||||
Apply To: Áp dụng cho:
|
||||
Area Diện tích
|
||||
X Position Vị trí X
|
||||
Y Position Vị trí Y
|
||||
Stacking Order Thứ tự xếp chồng
|
||||
Small to Large Từ nhỏ đến lớn
|
||||
Large to Small Từ lớn đến nhỏ
|
||||
Distribute Evenly Phân bố đều
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 200 and column 5.
|
@@ -698,6 +698,9 @@
|
||||
Delete Swatch 删除色板
|
||||
Delete Symbol 删除符号
|
||||
Delete the selected symbol? 要删除所选符号吗?
|
||||
Delete the selected symbols? 要删除所选的多个符号吗?
|
||||
No unused symbols 没有未使用的符号
|
||||
Delete Symbols 删除符号
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. 一个或多个符号正在使用中,在扩展或删除其实例之前无法删除。
|
||||
Expand Instances 扩展实例
|
||||
Delete Instances 删除实例
|
||||
@@ -2380,6 +2383,7 @@ digits Tamil 泰米尔数字
|
||||
digits Telugu 泰卢固数字
|
||||
digits Kannada 卡纳达数字
|
||||
digits Malayalam 马拉雅拉姆数字
|
||||
Proportional Lining 比例齐线数字
|
||||
Proportional Oldstyle 比例旧式数字
|
||||
Pucker & Bloat… 缩拢与膨胀…
|
||||
Pucker Tool 收缩工具
|
||||
@@ -3145,6 +3149,7 @@ digits Malayalam 马拉雅拉姆数字
|
||||
Swap Fill and Stroke (Shift+X) 切换填色和描边 (Shift+X)
|
||||
Swap start and end arrowheads 对调起点与终点箭头
|
||||
Swap the selected object for the file, keeping its place and transform 以文件替换选择的对象,并保留其位置与变形
|
||||
Stylistic Alternates 风格替代字
|
||||
Swash 花饰字
|
||||
Swatch Conflict 色板冲突
|
||||
Swatch Conflicts 色板冲突
|
||||
@@ -3214,6 +3219,7 @@ digits Malayalam 马拉雅拉姆数字
|
||||
Tabs 制表符
|
||||
Tabular Lining 等宽齐线数字
|
||||
Tabular Oldstyle 等宽旧式数字
|
||||
Titling Alternates 标题替代字
|
||||
Target 目标
|
||||
Target Contents 目标内容
|
||||
Target: 目标:
|
||||
@@ -3400,7 +3406,6 @@ digits Malayalam 马拉雅拉姆数字
|
||||
Update Links 更新链接
|
||||
Update Changed Links 更新已更改的链接
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? 有 {n} 个链接图像已在磁盘上更改。要显示新版本吗?
|
||||
@msg Updated {_1} linked file(s) changed on disk 已更新 {_1} 个在磁盘上更改的链接文件
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 链接的图片在找到其文件之前显示文件中存储的低分辨率预览:请在“链接”面板中重新链接
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 框架高度不足以容纳所显示字体一行的区域文字已加高框架 ({_1}):否则文字不会显示
|
||||
Update Modified Links 更新已修改的链接
|
||||
@@ -3745,7 +3750,6 @@ imageTrace Outline 轮廓
|
||||
@msg the drawing is too large to open 图纸过大,无法打开
|
||||
@msg scale must be a number from {_1} to {_2}, not {_3} 比例必须是 {_1} 到 {_2} 之间的数字,而不是 {_3}
|
||||
@msg an image has no pixels and was left out 已略去没有像素的图像
|
||||
@msg Embedded {n} image(s) 已嵌入 {n} 张图像
|
||||
@msg object {0} cannot have children 对象 {0} 不能包含子对象
|
||||
@msg range `{s}` is empty 范围 `{s}` 为空
|
||||
@msg range `{s}`: `{part}` names no number 范围 `{s}`:`{part}` 未指定数字
|
||||
@@ -4196,9 +4200,6 @@ imageTrace Outline 轮廓
|
||||
@msg the PDF is no longer loaded 该 PDF 已不再加载
|
||||
@msg no such layer or object 没有此图层或对象
|
||||
@msg `{tool}` isn't a Liquify tool `{tool}` 不是液化工具
|
||||
@msg {_1} linked file(s) can't be read here: their previews show 此处无法读取 {_1} 个链接文件:显示的是其预览
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes 无法解码 {undecoded} 张图像:它们显示为打叉的方框
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions 有 {_1} 个链接图像已在磁盘上更改:“更新链接”可显示新版本
|
||||
@msg pick a colour, gradient or pattern to save as a swatch 请选取要保存为色板的颜色、渐变或图案
|
||||
@msgplural Packaged {n} file ({note}) in {folder}|Packaged {n} files ({note}) in {folder} 已将 {n} 个文件打包到 {folder}({note})
|
||||
@msg Packaged {n} file(s){note} 已打包 {n} 个文件{note}
|
||||
@@ -4226,7 +4227,6 @@ imageTrace Outline 轮廓
|
||||
@msg print settings are not an object 打印设置不是对象
|
||||
@msg no colour group `{g}` 没有颜色组 `{g}`
|
||||
@msg select artwork (or a colour group) to recolor 请选择要重新着色的图稿 (或颜色组)
|
||||
@msg Downloaded {_1} file(s) 已下载 {_1} 个文件
|
||||
@msg Preview in Browser needs the desktop app (the web downloads files instead) “在浏览器中预览”需要桌面应用 (网页版会改为下载文件)
|
||||
@msg no file system here 此处没有文件系统
|
||||
@msg nothing to preview 没有可预览的内容
|
||||
@@ -4254,7 +4254,6 @@ imageTrace Outline 轮廓
|
||||
@msg unknown panel `{raw}` 未知面板 `{raw}`
|
||||
@msg x and y must both be numbers x 和 y 都必须是数字
|
||||
@msg Downloaded {what} 已下载 {what}
|
||||
@msg Exported {count} file(s) to {folder} 已将 {count} 个文件导出到 {folder}
|
||||
@msg Imported {what}: {_1} 已导入 {what}:{_1}
|
||||
@msg Installed plug-in {_1} 已安装增效工具 {_1}
|
||||
@msg Opened with {_1} note(s): {_2} 已打开,有 {_1} 条注释:{_2}
|
||||
@@ -4268,7 +4267,6 @@ imageTrace Outline 轮廓
|
||||
@msg the document has never been saved 该文档从未保存过
|
||||
@msg the export returned unreadable data 导出返回了无法读取的数据
|
||||
@msg {status} ({e}) {status} ({e})
|
||||
@msg Exported {what} with {_1} note(s): {first} 已导出 {what},有 {_1} 条注释:{first}
|
||||
@msg Saved {path} with {_1} note(s): {first} 已保存 {path},有 {_1} 条注释:{first}
|
||||
@msg Couldn't open {name}: {e} 无法打开 {name}:{e}
|
||||
@msg Couldn't read {name}: {e} 无法读取 {name}:{e}
|
||||
@@ -4324,7 +4322,6 @@ imageTrace Outline 轮廓
|
||||
@msg the library item is damaged 库项目已损坏
|
||||
@msg {_1} font families available 有 {_1} 个可用的字体系列
|
||||
@msg {_1} has no {_2} style {_1} 没有 {_2} 样式
|
||||
@msg Copied the CSS of {rules} object(s) 已复制 {rules} 个对象的 CSS
|
||||
@msg Copied the script report 已复制脚本报告
|
||||
@msg Exported {path} 已导出 {path}
|
||||
@msg no CSS to copy: select objects with CSS of their own 没有可复制的 CSS:请选择带有自身 CSS 的对象
|
||||
@@ -4337,12 +4334,27 @@ imageTrace Outline 轮廓
|
||||
@msg no library `{key}` (see {list}) 没有库 `{key}` (请参阅 {list})
|
||||
@msg select a linked image: an embedded one has no file 请选择链接的图像:嵌入的图像没有文件
|
||||
@msg {path} can't be found: relink it first 找不到 {path}:请先重新链接
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first 已嵌入 {n} 张图像;缺少 {missing} 张:请先重新链接
|
||||
@msg Relinked {_1} image(s) 已重新链接 {_1} 张图像
|
||||
@msg Relinked {n} image(s) 已重新链接 {n} 张图像
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} 已重新链接 {n} 张图像;不在该文件夹中:{_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first 已嵌入 {n} 张图像;缺少 {missing} 张:请先重新链接
|
||||
@msgplural Embedded {n} image|Embedded {n} images 已嵌入 {n} 张图像
|
||||
@msgplural Relinked {n} image|Relinked {n} images 已重新链接 {n} 张图像
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} 已重新链接 {n} 张图像;不在该文件夹中:{names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} 已重新链接 {n} 张图像;无法重新链接 {name}:{reason}
|
||||
@msgplural Updated {n} image|Updated {n} images 已更新 {n} 张图像
|
||||
@msgplural Replaced {n} image|Replaced {n} images 已替换 {n} 张图像
|
||||
@msgplural Broke {n} link|Broke {n} links 已断开 {n} 个链接
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first 已断开 {n} 个链接;有 {missing} 个无法读取:请先重新链接或更新
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show 此处无法读取 {n} 个链接文件:显示的是其预览
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes 无法解码 {n} 张图像:它们显示为打叉的方框
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions 有 {n} 个链接图像已在磁盘上更改:“更新链接”可显示新版本
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk 已更新 {n} 个在磁盘上更改的链接文件
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} 已导出 {what},有 {n} 条注释:{first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} 个字体文件现已位于 {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} 个字体文件现已位于 {folder};有 {failed} 个无法添加:{reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font 此处没有 {n} 种字体:使用它们的文字以其他字体显示
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects 已复制 {n} 个对象的 CSS
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files 已下载 {n} 个文件
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} 已将 {n} 个文件导出到 {folder}
|
||||
@msg Unembedded to {_1} 已取消嵌入到 {_1}
|
||||
@msg Updated {_1} image(s) 已更新 {_1} 张图像
|
||||
@msg no swatch library `{l}` (see swatch.library.list) 没有色板库 `{l}` (请参阅 swatch.library.list)
|
||||
@msg no user library folder here 此处没有用户库文件夹
|
||||
@msg Couldn't place {name}: the document it was dropped on was closed 无法置入 {name}:将它拖放到的文档已关闭
|
||||
@@ -4399,9 +4411,6 @@ imageTrace Outline 轮廓
|
||||
@msg every search thread stopped on an internal error (please report this bug) 所有搜索线程均因内部错误而停止 (请报告此错误)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it 此处未设置 VectorCraft 的字体文件夹:桌面应用和 vectorcraft-cli 会设置该文件夹
|
||||
@msg choose the font files to add 请选择要添加的字体文件
|
||||
@msg {n} font file(s) are now in {folder} {n} 个字体文件现已位于 {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} 个字体文件现已位于 {folder};有 {failed} 个无法添加:{reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font 此处没有 {n} 种字体:使用它们的文字以其他字体显示
|
||||
@msg not a file 不是文件
|
||||
@msg not a font file 不是字体文件
|
||||
@msg that document is no longer open 该文档已不再打开
|
||||
@@ -4410,7 +4419,6 @@ imageTrace Outline 轮廓
|
||||
@msg every numbered name for it is taken in the Fonts folder 字体文件夹中所有带编号的名称均已被占用
|
||||
@msg every numbered name for {name} is taken in the document's folder 文档所在文件夹中 {name} 的所有带编号的名称均已被占用
|
||||
@msg No linked files to look for 没有要查找的链接文件
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} 已重新链接 {n} 张图像;无法重新链接 {name}:{reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` 是步骤引用 {r},只有 `run` 和 `command_batch` 能解析它
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` 必须是由对象 id 组成的数组,而不是 {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` 必须是由锚点索引组成的数组,而不是 {v}
|
||||
@@ -5954,3 +5962,22 @@ breakText Glyphs 字形
|
||||
Text Flow 文本流向
|
||||
By Rows 按行
|
||||
By Columns 按列
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… 随机不透明度…
|
||||
Randomize Opacity 随机不透明度
|
||||
Minimum: 最小值:
|
||||
Maximum: 最大值:
|
||||
Seed: 种子:
|
||||
@msg `min` is greater than `max` `min` 大于 `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… 排序对象…
|
||||
Sort Objects 排序对象
|
||||
Sort By: 排序依据:
|
||||
Apply To: 应用于:
|
||||
Area 面积
|
||||
X Position X 位置
|
||||
Y Position Y 位置
|
||||
Stacking Order 堆叠顺序
|
||||
Small to Large 从小到大
|
||||
Large to Small 从大到小
|
||||
Distribute Evenly 均匀分布
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -717,6 +717,9 @@ font-technology Variable 可變
|
||||
Delete Swatch 刪除色票
|
||||
Delete Symbol 刪除符號
|
||||
Delete the selected symbol? 要刪除選取的符號嗎?
|
||||
Delete the selected symbols? 要刪除選取的多個符號嗎?
|
||||
No unused symbols 沒有未使用的符號
|
||||
Delete Symbols 刪除符號
|
||||
One or more of the symbols are in use and cannot be deleted until their instances are expanded or deleted. 一個或多個符號正在使用中,在展開或刪除其範例之前無法刪除。
|
||||
Expand Instances 展開範例
|
||||
Delete Instances 刪除範例
|
||||
@@ -1672,7 +1675,6 @@ file-filter Templates 範本
|
||||
@msg the drawing is too large to open 圖面過大,無法開啟
|
||||
@msg scale must be a number from {_1} to {_2}, not {_3} 比例必須是 {_1} 到 {_2} 之間的數字,而非 {_3}
|
||||
@msg an image has no pixels and was left out 已略過沒有像素的影像
|
||||
@msg Embedded {n} image(s) 已內嵌 {n} 個影像
|
||||
@msg object {0} cannot have children 物件 {0} 不能有子物件
|
||||
@msg range `{s}` is empty 範圍 `{s}` 是空的
|
||||
@msg range `{s}`: `{part}` names no number 範圍 `{s}`:`{part}` 沒有指定數字
|
||||
@@ -2121,9 +2123,6 @@ file-filter Templates 範本
|
||||
@msg the PDF is no longer loaded 此 PDF 已不再載入
|
||||
@msg no such layer or object 沒有這個圖層或物件
|
||||
@msg `{tool}` isn't a Liquify tool `{tool}` 不是液化工具
|
||||
@msg {_1} linked file(s) can't be read here: their previews show 此處無法讀取 {_1} 個連結檔案:顯示的是其預覽
|
||||
@msg {undecoded} image(s) couldn't be decoded and show as crossed boxes 無法解碼 {undecoded} 張影像:它們顯示為打叉的方框
|
||||
@msg {_1} linked image(s) changed on disk: Update Links shows the new versions 有 {_1} 個連結影像已在磁碟上變更:「更新連結」可顯示新版本
|
||||
@msg pick a colour, gradient or pattern to save as a swatch 請挑選要儲存為色票的顏色、漸層或圖樣
|
||||
@msgplural Packaged {n} file ({note}) in {folder}|Packaged {n} files ({note}) in {folder} 已將 {n} 個檔案封裝到 {folder}({note})
|
||||
@msg Packaged {n} file(s){note} 已封裝 {n} 個檔案{note}
|
||||
@@ -2151,7 +2150,6 @@ file-filter Templates 範本
|
||||
@msg print settings are not an object 列印設定不是物件
|
||||
@msg no colour group `{g}` 沒有顏色群組 `{g}`
|
||||
@msg select artwork (or a colour group) to recolor 請選取要重新上色的圖稿 (或顏色群組)
|
||||
@msg Downloaded {_1} file(s) 已下載 {_1} 個檔案
|
||||
@msg Preview in Browser needs the desktop app (the web downloads files instead) 「在瀏覽器中預覽」需要桌面應用程式 (網頁版會改為下載檔案)
|
||||
@msg no file system here 此處沒有檔案系統
|
||||
@msg nothing to preview 沒有可預覽的內容
|
||||
@@ -2179,7 +2177,6 @@ file-filter Templates 範本
|
||||
@msg unknown panel `{raw}` 未知的面板 `{raw}`
|
||||
@msg x and y must both be numbers x 和 y 都必須是數字
|
||||
@msg Downloaded {what} 已下載 {what}
|
||||
@msg Exported {count} file(s) to {folder} 已將 {count} 個檔案匯出至 {folder}
|
||||
@msg Imported {what}: {_1} 已匯入 {what}:{_1}
|
||||
@msg Installed plug-in {_1} 已安裝增效模組 {_1}
|
||||
@msg Opened with {_1} note(s): {_2} 已開啟,附有 {_1} 則註解:{_2}
|
||||
@@ -2193,7 +2190,6 @@ file-filter Templates 範本
|
||||
@msg the document has never been saved 文件從未儲存過
|
||||
@msg the export returned unreadable data 匯出傳回了無法讀取的資料
|
||||
@msg {status} ({e}) {status} ({e})
|
||||
@msg Exported {what} with {_1} note(s): {first} 已匯出 {what},附有 {_1} 則註解:{first}
|
||||
@msg Saved {path} with {_1} note(s): {first} 已儲存 {path},附有 {_1} 則註解:{first}
|
||||
@msg Couldn't open {name}: {e} 無法開啟 {name}:{e}
|
||||
@msg Couldn't read {name}: {e} 無法讀取 {name}:{e}
|
||||
@@ -2249,7 +2245,6 @@ file-filter Templates 範本
|
||||
@msg the library item is damaged 資料庫項目已損毀
|
||||
@msg {_1} font families available 有 {_1} 個可用的字體家族
|
||||
@msg {_1} has no {_2} style {_1} 沒有 {_2} 樣式
|
||||
@msg Copied the CSS of {rules} object(s) 已複製 {rules} 個物件的 CSS
|
||||
@msg Copied the script report 已複製指令碼報告
|
||||
@msg Exported {path} 已匯出 {path}
|
||||
@msg no CSS to copy: select objects with CSS of their own 沒有可複製的 CSS:請選取有自己 CSS 的物件
|
||||
@@ -2262,12 +2257,27 @@ file-filter Templates 範本
|
||||
@msg no library `{key}` (see {list}) 沒有資料庫 `{key}` (請參閱 {list})
|
||||
@msg select a linked image: an embedded one has no file 請選取連結的影像:內嵌的影像沒有檔案
|
||||
@msg {path} can't be found: relink it first 找不到 {path}:請先重新連結
|
||||
@msg Embedded {n} image(s); {missing} missing: relink them first 已內嵌 {n} 個影像;遺失 {missing} 個:請先重新連結
|
||||
@msg Relinked {_1} image(s) 已重新連結 {_1} 個影像
|
||||
@msg Relinked {n} image(s) 已重新連結 {n} 個影像
|
||||
@msg Relinked {n} image(s); not in that folder: {_1} 已重新連結 {n} 個影像;不在該資料夾中:{_1}
|
||||
@msgplural Embedded {n} image; {missing} missing: relink them first|Embedded {n} images; {missing} missing: relink them first 已內嵌 {n} 個影像;遺失 {missing} 個:請先重新連結
|
||||
@msgplural Embedded {n} image|Embedded {n} images 已內嵌 {n} 個影像
|
||||
@msgplural Relinked {n} image|Relinked {n} images 已重新連結 {n} 個影像
|
||||
@msgplural Relinked {n} image; not in that folder: {names}|Relinked {n} images; not in that folder: {names} 已重新連結 {n} 個影像;不在該資料夾中:{names}
|
||||
@msgplural Relinked {n} image; {name} couldn't be relinked: {reason}|Relinked {n} images; {name} couldn't be relinked: {reason} 已重新連結 {n} 個影像;無法重新連結 {name}:{reason}
|
||||
@msgplural Updated {n} image|Updated {n} images 已更新 {n} 個影像
|
||||
@msgplural Replaced {n} image|Replaced {n} images 已取代 {n} 個影像
|
||||
@msgplural Broke {n} link|Broke {n} links 已中斷 {n} 個連結
|
||||
@msgplural Broke {n} link; {missing} can't be read: relink or update them first|Broke {n} links; {missing} can't be read: relink or update them first 已中斷 {n} 個連結;有 {missing} 個無法讀取:請先重新連結或更新
|
||||
@msgplural {n} linked file can't be read here: its preview shows|{n} linked files can't be read here: their previews show 此處無法讀取 {n} 個連結檔案:顯示的是其預覽
|
||||
@msgplural {n} image couldn't be decoded and shows as a crossed box|{n} images couldn't be decoded and show as crossed boxes 無法解碼 {n} 張影像:它們顯示為打叉的方框
|
||||
@msgplural {n} linked image changed on disk: Update Links shows the new version|{n} linked images changed on disk: Update Links shows the new versions 有 {n} 個連結影像已在磁碟上變更:「更新連結」可顯示新版本
|
||||
@msgplural Updated {n} linked file changed on disk|Updated {n} linked files changed on disk 已更新 {n} 個在磁碟上變更的連結檔案
|
||||
@msgplural Exported {what} with {n} note: {first}|Exported {what} with {n} notes: {first} 已匯出 {what},附有 {n} 則註解:{first}
|
||||
@msgplural {n} font file is now in {folder}|{n} font files are now in {folder} {n} 個字體檔案現已位於 {folder}
|
||||
@msgplural {n} font file is now in {folder}; {failed} couldn't be added: {reason}|{n} font files are now in {folder}; {failed} couldn't be added: {reason} {n} 個字體檔案現已位於 {folder};有 {failed} 個無法加入:{reason}
|
||||
@msgplural {n} font isn't available here: its text shows in another font|{n} fonts aren't available here: their text shows in another font 此處沒有 {n} 種字體:使用這些字體的文字會以其他字體顯示
|
||||
@msgplural Copied the CSS of {n} object|Copied the CSS of {n} objects 已複製 {n} 個物件的 CSS
|
||||
@msgplural Downloaded {n} file|Downloaded {n} files 已下載 {n} 個檔案
|
||||
@msgplural Exported {n} file to {folder}|Exported {n} files to {folder} 已將 {n} 個檔案匯出至 {folder}
|
||||
@msg Unembedded to {_1} 已取消內嵌至 {_1}
|
||||
@msg Updated {_1} image(s) 已更新 {_1} 個影像
|
||||
@msg no swatch library `{l}` (see swatch.library.list) 沒有色票資料庫 `{l}` (請參閱 swatch.library.list)
|
||||
@msg no user library folder here 此處沒有使用者資料庫資料夾
|
||||
@msg Couldn't place {name}: the document it was dropped on was closed 無法置入 {name}:放置它的文件已關閉
|
||||
@@ -2324,9 +2334,6 @@ file-filter Templates 範本
|
||||
@msg every search thread stopped on an internal error (please report this bug) 所有搜尋執行緒都因內部錯誤而停止 (請回報此錯誤)
|
||||
@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it 此處未設定 VectorCraft 的字體資料夾:桌面應用程式和 vectorcraft-cli 會設定它
|
||||
@msg choose the font files to add 請選擇要加入的字體檔案
|
||||
@msg {n} font file(s) are now in {folder} {n} 個字體檔案現已位於 {folder}
|
||||
@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} 個字體檔案現已位於 {folder};有 {failed} 個無法加入:{reason}
|
||||
@msg {n} font(s) aren't available here: their text shows in another font 此處沒有 {n} 種字體:使用這些字體的文字會以其他字體顯示
|
||||
@msg not a file 不是檔案
|
||||
@msg not a font file 不是字體檔案
|
||||
@msg that document is no longer open 該文件已不再開啟
|
||||
@@ -2335,7 +2342,6 @@ file-filter Templates 範本
|
||||
@msg every numbered name for it is taken in the Fonts folder 字體資料夾中所有編號名稱都已被使用
|
||||
@msg every numbered name for {name} is taken in the document's folder 文件所在資料夾中 {name} 的所有編號名稱都已被使用
|
||||
@msg No linked files to look for 沒有要尋找的連結檔案
|
||||
@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} 已重新連結 {n} 個影像;無法重新連結 {name}:{reason}
|
||||
@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` 是步驟參照 {r},只有 `run` 和 `command_batch` 能解析它
|
||||
@msg `ids` must be an array of object ids, not {v} `ids` 必須是由物件 id 組成的陣列,而非 {v}
|
||||
@msg `corners` must be an array of anchor indices, not {v} `corners` 必須是由錨點索引組成的陣列,而非 {v}
|
||||
@@ -3322,6 +3328,7 @@ digits Tamil 坦米爾數字
|
||||
digits Telugu 泰盧固數字
|
||||
digits Kannada 坎那達數字
|
||||
digits Malayalam 馬來亞拉姆數字
|
||||
Proportional Lining 比例齊線數字
|
||||
Proportional Oldstyle 比例舊式數字
|
||||
Pucker & Bloat… 縮攏與膨脹…
|
||||
Pucker Tool 縮攏工具
|
||||
@@ -4125,6 +4132,7 @@ digits Malayalam 馬來亞拉姆數字
|
||||
Swap Fill and Stroke (Shift+X) 對調填色與筆畫 (Shift+X)
|
||||
Swap start and end arrowheads 對調起點與終點箭頭
|
||||
Swap the selected object for the file, keeping its place and transform 以檔案取代選取的物件,並保留其位置與變形
|
||||
Stylistic Alternates 風格替代字
|
||||
Swash 花體字
|
||||
Swatch Conflict 色票衝突
|
||||
Swatch Conflicts 色票衝突
|
||||
@@ -4194,6 +4202,7 @@ digits Malayalam 馬來亞拉姆數字
|
||||
Tabs 定位點
|
||||
Tabular Lining 等寬齊線數字
|
||||
Tabular Oldstyle 等寬舊式數字
|
||||
Titling Alternates 標題替代字
|
||||
Target 目標
|
||||
Target Contents 目標內容
|
||||
Target: 目標:
|
||||
@@ -4383,7 +4392,6 @@ digits Malayalam 馬來亞拉姆數字
|
||||
Update Links 更新連結
|
||||
Update Changed Links 更新已變更的連結
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? 有 {n} 個連結影像已在磁碟上變更。要顯示新版本嗎?
|
||||
@msg Updated {_1} linked file(s) changed on disk 已更新 {_1} 個在磁碟上變更的連結檔案
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 連結的圖片在找到其檔案之前顯示檔案中儲存的低解析度預覽:請在「連結」面板中重新連結
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 框架高度不足以容納所顯示字體一行的區域文字已加高框架 ({_1}):否則文字不會顯示
|
||||
Update Modified Links 更新已修改的連結
|
||||
@@ -5751,3 +5759,22 @@ breakText Glyphs 字符
|
||||
Text Flow 文字流向
|
||||
By Rows 依列
|
||||
By Columns 依欄
|
||||
# Arrange Tools add-on: Randomize Opacity.
|
||||
Randomize Opacity… 隨機不透明度…
|
||||
Randomize Opacity 隨機不透明度
|
||||
Minimum: 最小值:
|
||||
Maximum: 最大值:
|
||||
Seed: 種子:
|
||||
@msg `min` is greater than `max` `min` 大於 `max`
|
||||
# Arrange Tools add-on: Sort Objects.
|
||||
Sort Objects… 排序物件…
|
||||
Sort Objects 排序物件
|
||||
Sort By: 排序依據:
|
||||
Apply To: 套用至:
|
||||
Area 面積
|
||||
X Position X 位置
|
||||
Y Position Y 位置
|
||||
Stacking Order 堆疊順序
|
||||
Small to Large 從小到大
|
||||
Large to Small 從大到小
|
||||
Distribute Evenly 均勻分佈
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -18,7 +18,7 @@ mod open;
|
||||
mod save;
|
||||
|
||||
pub use export::{EXPORT_CANCELLED, cancel_exports, export, export_for_screens, export_pdf, hide_exports, reveal, save_command_output};
|
||||
pub(crate) use export::{export_files, file_url, open_in_app, reveal_path, run_to_file, save_command_output_named};
|
||||
pub(crate) use export::{export_files, exported_with_notes, file_url, open_in_app, reveal_path, run_to_file, save_command_output_named};
|
||||
#[cfg(test)]
|
||||
pub(crate) use open::open_file;
|
||||
pub(crate) use open::opened;
|
||||
|
||||
@@ -91,7 +91,7 @@ pub fn export(app: &mut VectorcraftApp, format: Option<&str>, path: Option<Strin
|
||||
};
|
||||
let warnings: Vec<&str> = r["warnings"].as_array().map(|w| w.iter().filter_map(Value::as_str).collect()).unwrap_or_default();
|
||||
app.status(match warnings.first() {
|
||||
Some(first) => format!("Exported {what} with {} note(s): {first}", warnings.len()),
|
||||
Some(first) => exported_with_notes(&what, warnings.len(), first),
|
||||
None => format!("Exported {what}"),
|
||||
});
|
||||
Ok(r)
|
||||
@@ -102,6 +102,12 @@ pub fn export(app: &mut VectorcraftApp, format: Option<&str>, path: Option<Strin
|
||||
Ok(r)
|
||||
}
|
||||
|
||||
/// The status bar's line for an export of `what` with `n` notes, the first of them `first`.
|
||||
pub(crate) fn exported_with_notes(what: &str, n: usize, first: &str) -> String {
|
||||
let (one, other) = ("Exported {what} with {n} note: {first}", "Exported {what} with {n} notes: {first}");
|
||||
crate::i18n::msg_n(n as u64, one, other, &[("what", what), ("first", first)])
|
||||
}
|
||||
|
||||
/// Run an engine command that returns `{dataBase64}` and write the bytes to a picked path
|
||||
/// (Export Selection, Save for Office Documents, Text Export Options and the presets dialogs'
|
||||
/// Export…), reported with the first of the command's warnings ([`report_saved`]).
|
||||
@@ -273,7 +279,7 @@ fn report_exported(app: &mut VectorcraftApp, r: Value, folder: &str, open_locati
|
||||
};
|
||||
if returned.is_empty() {
|
||||
let first = r["path"].as_str().or_else(|| r["files"][0].as_str());
|
||||
let mut status = format!("Exported {count} file(s) to {folder}");
|
||||
let mut status = crate::i18n::msg_n(count as u64, "Exported {n} file to {folder}", "Exported {n} files to {folder}", &[("folder", folder)]);
|
||||
if warned {
|
||||
status = saved_status(r["path"].as_str().unwrap_or(folder), &r);
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ pub(crate) fn copy(app: &mut VectorcraftApp, p: &Value) -> Result<Value, String>
|
||||
let css = r["css"].as_str().filter(|c| !c.is_empty()).ok_or("no CSS to copy: select objects with CSS of their own")?.to_string();
|
||||
let rules = r["rules"].as_array().map_or(0, Vec::len);
|
||||
app.clipboard_out = Some(css.clone());
|
||||
app.status(format!("Copied the CSS of {rules} object(s)"));
|
||||
app.status(crate::i18n::msg_n(rules as u64, "Copied the CSS of {n} object", "Copied the CSS of {n} objects", &[]));
|
||||
Ok(json!({ "css": css, "rules": rules }))
|
||||
}
|
||||
|
||||
@@ -208,7 +208,7 @@ pub(crate) fn export_file(app: &mut VectorcraftApp, p: &Value) -> Result<Value,
|
||||
let warnings: Vec<&str> = r["warnings"].as_array().map(|w| w.iter().filter_map(Value::as_str).collect()).unwrap_or_default();
|
||||
let what = &path;
|
||||
app.status(match warnings.first() {
|
||||
Some(first) => format!("Exported {what} with {} note(s): {first}", warnings.len()),
|
||||
Some(first) => io::exported_with_notes(what, warnings.len(), first),
|
||||
None => format!("Exported {path}"),
|
||||
});
|
||||
Ok(json!({ "path": path, "rules": r["rules"], "images": images, "warnings": r["warnings"] }))
|
||||
|
||||
@@ -117,6 +117,16 @@ fn report(app: &mut VectorcraftApp, r: Result<Value, String>, done: impl FnOnce(
|
||||
app.status(msg);
|
||||
}
|
||||
|
||||
/// The status bar's line for `n` relinked images.
|
||||
pub(crate) fn relinked_status(n: usize) -> String {
|
||||
crate::i18n::msg_n(n as u64, "Relinked {n} image", "Relinked {n} images", &[])
|
||||
}
|
||||
|
||||
/// The status bar's line for `n` images read again from their updated files.
|
||||
pub(crate) fn updated_status(n: usize) -> String {
|
||||
crate::i18n::msg_n(n as u64, "Updated {n} image", "Updated {n} images", &[])
|
||||
}
|
||||
|
||||
/// Relink images `ids` to a picked file.
|
||||
pub(crate) fn relink(app: &mut VectorcraftApp, ids: Vec<u64>) {
|
||||
crate::picks::button(app, move |app| relink_picked(app, ids.clone()));
|
||||
@@ -126,7 +136,7 @@ fn relink_picked(app: &mut VectorcraftApp, ids: Vec<u64>) {
|
||||
let pick = crate::FilePick { filters: crate::FilePick::filters(vectorcraft_engine::cmd::fileio::place_filters()), ..Default::default() };
|
||||
let Some(path) = crate::picks::open(app, &pick) else { return };
|
||||
let r = app.run("links.relink", json!({ "ids": ids, "path": path }));
|
||||
report(app, r, |v| format!("Relinked {} image(s)", v["relinked"].as_array().map_or(0, Vec::len)));
|
||||
report(app, r, |v| relinked_status(v["relinked"].as_array().map_or(0, Vec::len)));
|
||||
}
|
||||
|
||||
/// Replace images `ids` with a picked file (Control bar, Properties): it keeps its own aspect
|
||||
@@ -137,7 +147,7 @@ pub(crate) fn replace(app: &mut VectorcraftApp, ids: Vec<u64>) {
|
||||
let pick = crate::FilePick { filters: crate::FilePick::filters(vectorcraft_engine::cmd::fileio::place_filters()), ..Default::default() };
|
||||
let Some(path) = crate::picks::open(app, &pick) else { return };
|
||||
let r = app.run("links.relink", json!({ "ids": ids.clone(), "path": path, "preserve": "fit" }));
|
||||
report(app, r, |v| format!("Replaced {} image(s)", v["relinked"].as_array().map_or(0, Vec::len)));
|
||||
report(app, r, |v| crate::i18n::msg_n(v["relinked"].as_array().map_or(0, Vec::len) as u64, "Replaced {n} image", "Replaced {n} images", &[]));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -153,7 +163,12 @@ fn relink_to_picked_folder(app: &mut VectorcraftApp, ids: Vec<u64>) {
|
||||
report(app, r, |v| {
|
||||
let missed: Vec<&str> = v["notFound"].as_array().into_iter().flatten().filter_map(Value::as_str).collect();
|
||||
let n = v["relinked"].as_array().map_or(0, Vec::len);
|
||||
if missed.is_empty() { format!("Relinked {n} image(s)") } else { format!("Relinked {n} image(s); not in that folder: {}", missed.join(", ")) }
|
||||
if missed.is_empty() {
|
||||
relinked_status(n)
|
||||
} else {
|
||||
let (one, other) = ("Relinked {n} image; not in that folder: {names}", "Relinked {n} images; not in that folder: {names}");
|
||||
crate::i18n::msg_n(n as u64, one, other, &[("names", &missed.join(", "))])
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -400,7 +415,7 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
if widgets::icon_button_enabled(ui, "rotate-cw", tl!("Update Link"), false, !modified.is_empty(), 24.0).clicked() {
|
||||
let r = app.run("links.update", json!({ "ids": modified }));
|
||||
report(app, r, |v| format!("Updated {} image(s)", v["updated"].as_array().map_or(0, Vec::len)));
|
||||
report(app, r, |v| updated_status(v["updated"].as_array().map_or(0, Vec::len)));
|
||||
}
|
||||
if widgets::icon_button_enabled(ui, "zoom-in", tl!("Go To Link"), false, sel.len() == 1, 24.0).clicked()
|
||||
&& let Some(id) = sel.first().and_then(|r| r["id"].as_u64())
|
||||
@@ -424,7 +439,16 @@ fn break_link(app: &mut VectorcraftApp, ids: Vec<u64>) {
|
||||
report(app, r, |v| {
|
||||
let missing = v["missing"].as_array().map_or(0, Vec::len);
|
||||
let n = v["embedded"].as_array().map_or(0, Vec::len);
|
||||
if missing == 0 { format!("Broke {n} link(s)") } else { format!("Broke {n} link(s); {missing} can't be read: relink or update them first") }
|
||||
if missing == 0 {
|
||||
crate::i18n::msg_n(n as u64, "Broke {n} link", "Broke {n} links", &[])
|
||||
} else {
|
||||
crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"Broke {n} link; {missing} can't be read: relink or update them first",
|
||||
"Broke {n} links; {missing} can't be read: relink or update them first",
|
||||
&[("missing", &missing.to_string())],
|
||||
)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -534,7 +558,7 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
if menu_item(ui, tl!("Update Link"), sel.iter().any(|r| status_is(r, "modified")), false) {
|
||||
let r = app.run("links.update", json!({ "ids": ids(&sel, |r| status_is(r, "modified")) }));
|
||||
report(app, r, |v| format!("Updated {} image(s)", v["updated"].as_array().map_or(0, Vec::len)));
|
||||
report(app, r, |v| updated_status(v["updated"].as_array().map_or(0, Vec::len)));
|
||||
}
|
||||
if menu_item(ui, tl!("Edit Original"), sel.iter().any(|r| r["linked"] == true && !status_is(r, "missing")), false) {
|
||||
crate::menus::invoke(app, "links.editOriginal", json!({}));
|
||||
@@ -545,7 +569,16 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
report(app, r, |v| {
|
||||
let missing = v["missing"].as_array().map_or(0, Vec::len);
|
||||
let n = v["embedded"].as_array().map_or(0, Vec::len);
|
||||
if missing == 0 { format!("Embedded {n} image(s)") } else { format!("Embedded {n} image(s); {missing} missing: relink them first") }
|
||||
if missing == 0 {
|
||||
crate::i18n::msg_n(n as u64, "Embedded {n} image", "Embedded {n} images", &[])
|
||||
} else {
|
||||
crate::i18n::msg_n(
|
||||
n as u64,
|
||||
"Embedded {n} image; {missing} missing: relink them first",
|
||||
"Embedded {n} images; {missing} missing: relink them first",
|
||||
&[("missing", &missing.to_string())],
|
||||
)
|
||||
}
|
||||
});
|
||||
}
|
||||
if menu_item(ui, tl!("Unembed…"), embedded.len() == 1, false)
|
||||
|
||||
@@ -3,16 +3,74 @@
|
||||
|
||||
use egui::Ui;
|
||||
use serde_json::json;
|
||||
use vectorcraft_text::OtFeatures;
|
||||
use vectorcraft_text::{EXTRA_FEATURES, OtFeatures};
|
||||
|
||||
use super::character::{text_editing, text_style};
|
||||
use crate::VectorcraftApp;
|
||||
use crate::widgets::{self, menu_item};
|
||||
|
||||
/// A checkbox row: label and the feature flag it toggles.
|
||||
type Toggle = (&'static str, fn(&mut OtFeatures) -> &mut bool);
|
||||
/// The feature a checkbox row toggles: a named flag, or a tag of [`EXTRA_FEATURES`].
|
||||
#[derive(Clone, Copy)]
|
||||
enum Flag {
|
||||
Field(fn(&mut OtFeatures) -> &mut bool),
|
||||
Extra(&'static str),
|
||||
}
|
||||
|
||||
const FIGURES: [&str; 4] = ["Default Figure", "Tabular Lining", "Proportional Oldstyle", "Tabular Oldstyle"];
|
||||
/// A checkbox row: label and the feature it toggles.
|
||||
type Toggle = (&'static str, Flag);
|
||||
|
||||
const FIGURES: [&str; 5] = ["Default Figure", "Tabular Lining", "Proportional Lining", "Proportional Oldstyle", "Tabular Oldstyle"];
|
||||
|
||||
/// The bit of [`OtFeatures::extra`] that turns `tag` on (0 for a tag outside [`EXTRA_FEATURES`]).
|
||||
fn extra_bit(tag: &str) -> u32 {
|
||||
EXTRA_FEATURES.iter().position(|t| *t == tag).map_or(0, |i| 1 << i)
|
||||
}
|
||||
|
||||
impl Flag {
|
||||
fn get(self, f: &OtFeatures) -> bool {
|
||||
match self {
|
||||
Flag::Field(field) => *field(&mut f.clone()),
|
||||
Flag::Extra(tag) => f.extra & extra_bit(tag) != 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn put(self, f: &mut OtFeatures, on: bool) {
|
||||
match self {
|
||||
Flag::Field(field) => *field(f) = on,
|
||||
Flag::Extra(tag) if on => f.extra |= extra_bit(tag),
|
||||
Flag::Extra(tag) => f.extra &= !extra_bit(tag),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The Figure menu entry `f` shows: Default Figure, Tabular Lining, Proportional Lining
|
||||
/// (`pnum` and `lnum`), Proportional Oldstyle or Tabular Oldstyle.
|
||||
fn figure(f: &OtFeatures) -> usize {
|
||||
let proportional_lining = extra_bit("pnum") | extra_bit("lnum");
|
||||
match (f.tabular_figures, f.oldstyle_figures) {
|
||||
(false, false) if f.extra & proportional_lining == proportional_lining => 2,
|
||||
(false, false) => 0,
|
||||
(true, false) => 1,
|
||||
(false, true) => 3,
|
||||
(true, true) => 4,
|
||||
}
|
||||
}
|
||||
|
||||
/// `f` with Figure menu entry `i` chosen: the entry's features on, the other figure features off.
|
||||
/// Tabular Lining keeps an `lnum` the type already has and clears `pnum`; Proportional Oldstyle
|
||||
/// keeps a `pnum` and clears `lnum`; Default Figure and Tabular Oldstyle clear both.
|
||||
fn set_figure(f: &mut OtFeatures, i: usize) {
|
||||
f.tabular_figures = i == 1 || i == 4;
|
||||
f.oldstyle_figures = i >= 3;
|
||||
f.extra &= !match i {
|
||||
1 => extra_bit("pnum"),
|
||||
3 => extra_bit("lnum"),
|
||||
_ => extra_bit("pnum") | extra_bit("lnum"),
|
||||
};
|
||||
if i == 2 {
|
||||
f.extra |= extra_bit("pnum") | extra_bit("lnum");
|
||||
}
|
||||
}
|
||||
|
||||
/// Apply `f` to the selection's features (the Type tool range, or whole objects).
|
||||
fn set(app: &mut VectorcraftApp, f: OtFeatures) {
|
||||
@@ -36,31 +94,16 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let mut next = cur;
|
||||
ui.horizontal(|ui| {
|
||||
widgets::dim_label(ui, tl!("Figure:"));
|
||||
let fig = match (cur.tabular_figures, cur.oldstyle_figures) {
|
||||
(false, false) => 0,
|
||||
(true, false) => 1,
|
||||
(false, true) => 2,
|
||||
(true, true) => 3,
|
||||
};
|
||||
let fig = figure(&cur);
|
||||
if let Some(i) = widgets::dropdown(ui, "ot-figure", FIGURES[fig], &FIGURES, 170.0) {
|
||||
next.tabular_figures = i == 1 || i == 3;
|
||||
next.oldstyle_figures = i >= 2;
|
||||
set_figure(&mut next, i);
|
||||
}
|
||||
});
|
||||
widgets::divider(ui);
|
||||
let rows: [Toggle; 7] = [
|
||||
(tl!("Standard Ligatures"), |f| &mut f.ligatures),
|
||||
(tl!("Contextual Alternates"), |f| &mut f.contextual),
|
||||
(tl!("Discretionary Ligatures"), |f| &mut f.discretionary_ligatures),
|
||||
(tl!("Swash"), |f| &mut f.swash),
|
||||
(tl!("Small Caps"), |f| &mut f.small_caps),
|
||||
(tl!("Ordinals"), |f| &mut f.ordinals),
|
||||
(tl!("Fractions"), |f| &mut f.fractions),
|
||||
];
|
||||
for (label, field) in rows {
|
||||
let on = *field(&mut next.clone());
|
||||
for (label, flag) in rows() {
|
||||
let on = flag.get(&next);
|
||||
if widgets::check(ui, label, on, true) {
|
||||
*field(&mut next) = !on;
|
||||
flag.put(&mut next, !on);
|
||||
}
|
||||
}
|
||||
if cur.ligatures && vectorcraft_text::ligatures_suppressed_by(st.tracking) && !vectorcraft_text::explicit_ligatures(&st.features) {
|
||||
@@ -71,6 +114,21 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
}
|
||||
|
||||
/// The panel's checkbox rows, in the order they are drawn.
|
||||
fn rows() -> [Toggle; 9] {
|
||||
[
|
||||
(tl!("Standard Ligatures"), Flag::Field(|f| &mut f.ligatures)),
|
||||
(tl!("Contextual Alternates"), Flag::Field(|f| &mut f.contextual)),
|
||||
(tl!("Discretionary Ligatures"), Flag::Field(|f| &mut f.discretionary_ligatures)),
|
||||
(tl!("Swash"), Flag::Field(|f| &mut f.swash)),
|
||||
(tl!("Stylistic Alternates"), Flag::Extra("salt")),
|
||||
(tl!("Titling Alternates"), Flag::Extra("titl")),
|
||||
(tl!("Small Caps"), Flag::Field(|f| &mut f.small_caps)),
|
||||
(tl!("Ordinals"), Flag::Field(|f| &mut f.ordinals)),
|
||||
(tl!("Fractions"), Flag::Field(|f| &mut f.fractions)),
|
||||
]
|
||||
}
|
||||
|
||||
pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
if menu_item(ui, tl!("Reset OpenType Features"), text_style(app).is_some(), false) {
|
||||
set(app, OtFeatures::default());
|
||||
@@ -96,4 +154,95 @@ mod tests {
|
||||
set(&mut app, OtFeatures { ligatures: false, fractions: true, ..Default::default() });
|
||||
assert_eq!(text_style(&app).unwrap().0.features, ["-liga", "frac"]);
|
||||
}
|
||||
|
||||
fn selected_text() -> VectorcraftApp {
|
||||
let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default());
|
||||
app.session.execute("file.new", &json!({"width": 100, "height": 100})).unwrap();
|
||||
let id = app.session.execute("text.create", &json!({"x": 10, "y": 40, "text": "Ag 12"})).unwrap()["id"].clone();
|
||||
app.session.execute("select.set", &json!({"ids": [id]})).unwrap();
|
||||
app
|
||||
}
|
||||
|
||||
fn features(app: &VectorcraftApp) -> OtFeatures {
|
||||
OtFeatures::from_tags(text_style(app).unwrap().0.features.iter().map(String::as_str))
|
||||
}
|
||||
|
||||
/// The Stylistic Alternates and Titling Alternates rows turn `salt` and `titl` on and off
|
||||
/// on the selected type.
|
||||
#[test]
|
||||
fn alternates_rows_set_and_clear_their_features() {
|
||||
for (label, tag) in [("Stylistic Alternates", "salt"), ("Titling Alternates", "titl")] {
|
||||
let mut app = selected_text();
|
||||
let Some((_, flag)) = rows().into_iter().find(|(l, _)| *l == label) else {
|
||||
panic!("no {label} row");
|
||||
};
|
||||
let mut f = features(&app);
|
||||
assert!(!flag.get(&f), "{label} starts off");
|
||||
flag.put(&mut f, true);
|
||||
set(&mut app, f);
|
||||
assert_eq!(text_style(&app).unwrap().0.features, [tag], "{label} on");
|
||||
assert!(flag.get(&features(&app)));
|
||||
let mut f = features(&app);
|
||||
flag.put(&mut f, false);
|
||||
set(&mut app, f);
|
||||
assert!(text_style(&app).unwrap().0.features.is_empty(), "{label} off");
|
||||
}
|
||||
}
|
||||
|
||||
/// The Figure menu lists its five entries in order; Proportional Lining sets `pnum` and
|
||||
/// `lnum` and clears `tnum` and `onum`, Tabular Lining clears `pnum`, Proportional Oldstyle
|
||||
/// clears `lnum`, and Default Figure and Tabular Oldstyle clear `pnum` and `lnum`.
|
||||
#[test]
|
||||
fn proportional_lining_figures() {
|
||||
assert_eq!(FIGURES, ["Default Figure", "Tabular Lining", "Proportional Lining", "Proportional Oldstyle", "Tabular Oldstyle"]);
|
||||
let mut app = selected_text();
|
||||
let mut f = features(&app);
|
||||
set_figure(&mut f, 4);
|
||||
set(&mut app, f);
|
||||
assert_eq!(text_style(&app).unwrap().0.features, ["onum", "tnum"]);
|
||||
let mut f = features(&app);
|
||||
set_figure(&mut f, 2);
|
||||
set(&mut app, f);
|
||||
assert_eq!(text_style(&app).unwrap().0.features, ["pnum", "lnum"]);
|
||||
assert_eq!(figure(&features(&app)), 2);
|
||||
for (i, want) in [(0, vec![]), (1, vec!["tnum", "lnum"]), (3, vec!["onum", "pnum"]), (4, vec!["onum", "tnum"])] {
|
||||
let mut f = features(&app);
|
||||
set_figure(&mut f, 2);
|
||||
set_figure(&mut f, i);
|
||||
set(&mut app, f);
|
||||
assert_eq!(text_style(&app).unwrap().0.features, want, "{}", FIGURES[i]);
|
||||
assert_eq!(figure(&features(&app)), i);
|
||||
}
|
||||
// `pnum` alone is not Proportional Lining.
|
||||
assert_eq!(figure(&OtFeatures::from_tags(["pnum"])), 0);
|
||||
}
|
||||
|
||||
/// Choosing Proportional Oldstyle on type with `pnum` and `onum` keeps `pnum`.
|
||||
#[test]
|
||||
fn proportional_oldstyle_keeps_pnum() {
|
||||
let mut app = selected_text();
|
||||
set(&mut app, OtFeatures::from_tags(["pnum", "onum"]));
|
||||
let mut f = features(&app);
|
||||
assert_eq!(figure(&f), 3);
|
||||
set_figure(&mut f, 3);
|
||||
set(&mut app, f);
|
||||
let tags = text_style(&app).unwrap().0.features;
|
||||
assert!(tags.iter().any(|t| t == "pnum"), "{tags:?}");
|
||||
assert!(tags.iter().any(|t| t == "onum"), "{tags:?}");
|
||||
assert_eq!(figure(&features(&app)), 3);
|
||||
}
|
||||
|
||||
/// Choosing Tabular Lining on type with `lnum`, or with `tnum` and `lnum`, keeps `lnum`.
|
||||
#[test]
|
||||
fn tabular_lining_keeps_lnum() {
|
||||
for start in [&["lnum"][..], &["tnum", "lnum"][..]] {
|
||||
let mut app = selected_text();
|
||||
set(&mut app, OtFeatures::from_tags(start.iter().copied()));
|
||||
let mut f = features(&app);
|
||||
set_figure(&mut f, 1);
|
||||
set(&mut app, f);
|
||||
assert_eq!(text_style(&app).unwrap().0.features, ["tnum", "lnum"], "{start:?}");
|
||||
assert_eq!(figure(&features(&app)), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,6 +201,10 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let names: Vec<String> = doc.symbols.iter().map(|s| s.name.clone()).collect();
|
||||
let list: bool = pstate(ui.ctx(), "sym-list");
|
||||
let sel = current(app);
|
||||
let uid = app.session.active().map(|d| d.uid);
|
||||
let marked = marked(ui.ctx(), uid, &names);
|
||||
// The symbols drawn selected: the ones Select All Unused picked, else the current one.
|
||||
let on = |n: &str| if marked.is_empty() { sel.as_deref() == Some(n) } else { marked.iter().any(|m| m == n) };
|
||||
let mut clicked: Option<(String, bool)> = None;
|
||||
let list_rect = widgets::list_box(ui, |ui| {
|
||||
ui.set_min_height(110.0);
|
||||
@@ -214,7 +218,7 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let (r, resp) = ui.allocate_exact_size(vec2(ui.available_width(), 26.0), Sense::click_and_drag());
|
||||
// Dragged onto the canvas, the symbol is placed there.
|
||||
widgets::drag_source(ui, &resp, || PanelDrag::Symbol(n.clone()));
|
||||
if sel.as_deref() == Some(n.as_str()) {
|
||||
if on(n) {
|
||||
ui.painter().rect_filled(r, 0.0, t.row_selected);
|
||||
} else if resp.hovered() {
|
||||
ui.painter().rect_filled(r, 0.0, t.hover);
|
||||
@@ -233,7 +237,7 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let (r, resp) = ui.allocate_exact_size(vec2(44.0, 44.0), Sense::click_and_drag());
|
||||
widgets::drag_source(ui, &resp, || PanelDrag::Symbol(n.clone()));
|
||||
chip(ui, &doc, &keys, r.shrink(2.0), n);
|
||||
let on = sel.as_deref() == Some(n.as_str());
|
||||
let on = on(n);
|
||||
ui.painter().rect_stroke(
|
||||
r,
|
||||
0.0,
|
||||
@@ -258,6 +262,8 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
app.status(e);
|
||||
}
|
||||
if let Some((n, place)) = clicked {
|
||||
// A click picks one symbol again.
|
||||
set_pstate(ui.ctx(), MARKED, (uid, Vec::<String>::new()));
|
||||
app.run("symbol.setCurrent", json!({"name": n})).ok();
|
||||
if place {
|
||||
app.run("symbol.place", json!({"name": n})).ok();
|
||||
@@ -286,16 +292,17 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
app.run(cmd, p).ok();
|
||||
}
|
||||
// Alt deletes an unused symbol without asking; a symbol with instances still asks.
|
||||
if widgets::icon_button_enabled(ui, "trash-2", tl!("Delete Symbol"), false, sel.is_some(), 24.0).clicked()
|
||||
&& let Some(n) = &sel
|
||||
{
|
||||
crate::dialogs::symbol_delete::ask(app, n, super::alt_held(ui));
|
||||
if widgets::icon_button_enabled(ui, "trash-2", tl!("Delete Symbol"), false, sel.is_some() || !marked.is_empty(), 24.0).clicked() {
|
||||
delete(app, &marked, sel.as_deref(), super::alt_held(ui));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let sel = current(app);
|
||||
let names: Vec<String> = app.session.active().map(|d| d.doc.symbols.iter().map(|s| s.name.clone()).collect()).unwrap_or_default();
|
||||
let uid = app.session.active().map(|d| d.uid);
|
||||
let marked = marked(ui.ctx(), uid, &names);
|
||||
let has_sel = app.session.active().is_some_and(|d| !d.selection.is_empty());
|
||||
let inst = has_instances_selected(app);
|
||||
let name = json!({"name": sel});
|
||||
@@ -310,10 +317,8 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
}
|
||||
// Asks first, as the panel's button does; the menu item has no Alt shortcut.
|
||||
if menu_item(ui, tl!("Delete Symbol"), sel.is_some(), false)
|
||||
&& let Some(n) = &sel
|
||||
{
|
||||
crate::dialogs::symbol_delete::ask(app, n, false);
|
||||
if menu_item(ui, tl!("Delete Symbol"), sel.is_some() || !marked.is_empty(), false) {
|
||||
delete(app, &marked, sel.as_deref(), false);
|
||||
}
|
||||
let items: [(&str, bool, &str, Value); 7] = [
|
||||
(tl!("Symbol Options…"), sel.is_some(), "ui.symbolOptions", json!({"edit": true, "name": sel})),
|
||||
@@ -330,6 +335,18 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
}
|
||||
ui.separator();
|
||||
// Select All Unused (#4918): the symbols nothing places show selected, and Delete Symbol
|
||||
// deletes them all.
|
||||
if menu_item(ui, tl!("Select All Unused"), !names.is_empty(), false)
|
||||
&& let Ok(r) = app.run("symbol.unused", json!({}))
|
||||
{
|
||||
let unused: Vec<String> = serde_json::from_value(r["names"].clone()).unwrap_or_default();
|
||||
if unused.is_empty() {
|
||||
app.status(tl!("No unused symbols"));
|
||||
}
|
||||
set_pstate(ui.ctx(), MARKED, (uid, unused));
|
||||
}
|
||||
ui.separator();
|
||||
let list: bool = pstate(ui.ctx(), "sym-list");
|
||||
if menu_item(ui, tl!("Thumbnail View"), true, !list) {
|
||||
set_pstate(ui.ctx(), "sym-list", false);
|
||||
@@ -345,6 +362,31 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
}
|
||||
}
|
||||
|
||||
/// The panel state key of the symbols Select All Unused picked.
|
||||
const MARKED: &str = "sym-unused";
|
||||
|
||||
/// The symbols Select All Unused picked in the active document (`uid`) that it still has (`names`);
|
||||
/// none once another document is active.
|
||||
fn marked(ctx: &egui::Context, uid: Option<u64>, names: &[String]) -> Vec<String> {
|
||||
let (of, mut marked): (Option<u64>, Vec<String>) = pstate(ctx, MARKED);
|
||||
if of != uid {
|
||||
return vec![];
|
||||
}
|
||||
marked.retain(|m| names.contains(m));
|
||||
marked
|
||||
}
|
||||
|
||||
/// Delete Symbol: the symbols Select All Unused picked (`marked`) when there are any, asked about
|
||||
/// once unless `now` (Alt), else the current symbol `sel`.
|
||||
fn delete(app: &mut VectorcraftApp, marked: &[String], sel: Option<&str>, now: bool) {
|
||||
match (marked, sel) {
|
||||
([], Some(n)) => crate::dialogs::symbol_delete::ask(app, n, now),
|
||||
([], None) => {}
|
||||
// Picked by Select All Unused, even one: deleted only while still unused.
|
||||
(names, _) => crate::dialogs::symbol_delete::ask_many(app, names, now),
|
||||
}
|
||||
}
|
||||
|
||||
/// Save Symbol Library… for the document's symbols (`names`: the one selected in the panel).
|
||||
fn save_library(app: &mut VectorcraftApp, names: Vec<String>) {
|
||||
if let Err(e) = app.run("ui.saveSymbolLibrary", json!({ "names": names })) {
|
||||
@@ -598,6 +640,90 @@ mod tests {
|
||||
crate::tests_removeanchors::shapes_text(&out.shapes.iter().map(|c| c.shape.clone()).collect::<Vec<_>>())
|
||||
}
|
||||
|
||||
/// Clicks the menu item labelled `label`.
|
||||
fn click_menu(ctx: &egui::Context, app: &mut VectorcraftApp, label: &str) {
|
||||
let labels = menu_frame(ctx, app, vec![]);
|
||||
let item = labels.iter().find(|(t, _)| t.trim() == label).map(|(_, r)| r.center()).unwrap_or_else(|| panic!("{label} in the menu"));
|
||||
menu_frame(ctx, app, vec![egui::Event::PointerMoved(item), button(item, true)]);
|
||||
menu_frame(ctx, app, vec![button(item, false)]);
|
||||
}
|
||||
|
||||
/// #4918: Select All Unused picks the symbols nothing places, Delete Symbol asks once and
|
||||
/// deletes them all in one undo step, and a click on a symbol picks one again.
|
||||
#[test]
|
||||
fn select_all_unused_picks_the_unused_symbols_and_delete_deletes_them() {
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
app.run("file.new", json!({"width": 200, "height": 100})).unwrap();
|
||||
for (i, name) in ["A", "B", "C"].into_iter().enumerate() {
|
||||
app.run("shape.rectangle", json!({"x": 10.0 + 40.0 * i as f64, "y": 10, "width": 30, "height": 20})).unwrap();
|
||||
let id = app.run("symbol.new", json!({"name": name})).unwrap()["id"].as_u64().unwrap();
|
||||
// A and C lose their instances; B keeps its own.
|
||||
if name != "B" {
|
||||
app.run("edit.clear", json!({"ids": [id]})).unwrap();
|
||||
}
|
||||
}
|
||||
let ctx = egui::Context::default();
|
||||
crate::theme::install_fonts(&ctx);
|
||||
click_menu(&ctx, &mut app, "Select All Unused");
|
||||
let names = symbols(&mut app);
|
||||
assert_eq!(marked(&ctx, uid(&app), &names), ["A", "C"]);
|
||||
let undo = app.session.active().unwrap().history.undo.len();
|
||||
click_menu(&ctx, &mut app, "Delete Symbol");
|
||||
assert_eq!(app.ui.dialog.as_ref().map(|d| d.kind.as_str()), Some(crate::dialogs::symbol_delete::KIND));
|
||||
assert_eq!(app.ui.dialog.as_ref().unwrap().fields["names"], json!(["A", "C"]), "asked once, about both");
|
||||
crate::dialogs::confirm(&mut app).unwrap();
|
||||
assert_eq!(symbols(&mut app), ["B"]);
|
||||
assert_eq!(app.session.active().unwrap().history.undo.len(), undo + 1, "one undo step");
|
||||
assert!(marked(&ctx, uid(&app), &symbols(&mut app)).is_empty(), "the deleted ones are no longer picked");
|
||||
// Undone, they are back; Select All Unused again, then a click on a symbol picks just it.
|
||||
app.run("edit.undo", json!({})).unwrap();
|
||||
click_menu(&ctx, &mut app, "Select All Unused");
|
||||
assert_eq!(marked(&ctx, uid(&app), &symbols(&mut app)).len(), 2);
|
||||
frame(&ctx, &mut app, vec![]);
|
||||
let tile = pos2(26.0, 26.0);
|
||||
frame(&ctx, &mut app, vec![egui::Event::PointerMoved(tile), button(tile, true)]);
|
||||
frame(&ctx, &mut app, vec![button(tile, false)]);
|
||||
assert!(marked(&ctx, uid(&app), &symbols(&mut app)).is_empty());
|
||||
// With nothing unused, the item reports it and picks nothing.
|
||||
app.run("symbol.delete", json!({"names": ["A", "C"]})).unwrap();
|
||||
click_menu(&ctx, &mut app, "Select All Unused");
|
||||
assert!(marked(&ctx, uid(&app), &symbols(&mut app)).is_empty());
|
||||
}
|
||||
|
||||
fn uid(app: &VectorcraftApp) -> Option<u64> {
|
||||
app.session.active().map(|d| d.uid)
|
||||
}
|
||||
|
||||
/// Picks made in one document don't carry to another with symbols of the same names, and a
|
||||
/// picked symbol that gained a use since (here in a brush's art) isn't deleted (#4918 review).
|
||||
#[test]
|
||||
fn picked_symbols_stay_with_their_document_and_are_rechecked_before_deleting() {
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
let make = |app: &mut VectorcraftApp| {
|
||||
app.run("file.new", json!({"width": 200, "height": 100})).unwrap();
|
||||
app.run("shape.rectangle", json!({"x": 10, "y": 10, "width": 30, "height": 20})).unwrap();
|
||||
let id = app.run("symbol.new", json!({"name": "A"})).unwrap()["id"].as_u64().unwrap();
|
||||
app.run("edit.clear", json!({"ids": [id]})).unwrap();
|
||||
};
|
||||
make(&mut app);
|
||||
let ctx = egui::Context::default();
|
||||
crate::theme::install_fonts(&ctx);
|
||||
click_menu(&ctx, &mut app, "Select All Unused");
|
||||
assert_eq!(marked(&ctx, uid(&app), &symbols(&mut app)), ["A"]);
|
||||
make(&mut app);
|
||||
assert!(marked(&ctx, uid(&app), &symbols(&mut app)).is_empty(), "not in the other document");
|
||||
// Back in the first one: A gains a use in a brush's art, then Delete (Alt: no question).
|
||||
click_menu(&ctx, &mut app, "Select All Unused");
|
||||
let id = app.run("symbol.place", json!({"name": "A"})).unwrap()["id"].as_u64().unwrap();
|
||||
app.run("brush.new", json!({"type": "art", "name": "B", "ids": [id]})).unwrap();
|
||||
app.run("edit.clear", json!({"ids": [id]})).unwrap();
|
||||
let names = symbols(&mut app);
|
||||
let picked = marked(&ctx, uid(&app), &names);
|
||||
assert_eq!(picked, ["A"]);
|
||||
delete(&mut app, &picked, None, true);
|
||||
assert_eq!(symbols(&mut app), ["A"], "still used by the brush, so kept");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn new_symbol_asks_for_symbol_options_before_making_the_symbol() {
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
|
||||
@@ -143,6 +143,6 @@ fn export_says_in_the_status_bar_when_an_image_could_not_be_decoded() {
|
||||
vectorcraft_testkit::fixtures::place_cut_png(&mut app.session, &png, json!({}));
|
||||
let r = app.run("css.exportFile", json!({"path": "/tmp/site/site.css", "scope": "all", "rasterize": true})).unwrap();
|
||||
assert_eq!(r["warnings"], json!([WARNING]));
|
||||
assert_eq!(app.ui.status, format!("Exported /tmp/site/site.css with 1 note(s): {WARNING}"));
|
||||
assert_eq!(app.ui.status, format!("Exported /tmp/site/site.css with 1 note: {WARNING}"));
|
||||
assert_eq!(log.borrow().len(), 3, "the sheet and the image's picture are still written");
|
||||
}
|
||||
|
||||
@@ -615,7 +615,7 @@ fn link_menu(app: &mut VectorcraftApp, ui: &mut egui::Ui, id: u64, linked: bool)
|
||||
}
|
||||
if widgets::menu_item(ui, tl!("Update Link"), linked, false) {
|
||||
let msg = match app.run("links.update", json!({ "ids": [id] })) {
|
||||
Ok(v) => format!("Updated {} image(s)", v["updated"].as_array().map_or(0, Vec::len)),
|
||||
Ok(v) => crate::panels::links::updated_status(v["updated"].as_array().map_or(0, Vec::len)),
|
||||
Err(e) => e,
|
||||
};
|
||||
app.status(msg);
|
||||
|
||||
@@ -17,7 +17,7 @@ from the public specifications, and users' own `.ai` files are used locally only
|
||||
|
||||
| | Illustrator | VectorCraft | Notes |
|
||||
|---|---:|---:|---|
|
||||
| Formats opened or placed | ~30 | 27 | missing: FreeHand, CorelDRAW, DWG, HEIC/HEIF, PICT, Pixar, Word `.doc`, PS |
|
||||
| Formats opened or placed | ~30 | 28 | missing: FreeHand, CorelDRAW, DWG, HEIC/HEIF, PICT, Pixar, PS |
|
||||
| Formats saved (Save As) | 6 (AI, AIT, PDF, EPS, SVG, SVGZ) | 6 + native | `.ai` written PDF-compatible (no Illustrator editing data) or as legacy version 7 (layers and groups, one artboard per file) |
|
||||
| Formats exported | ~16 | 17 | missing: DWG, 3D (OBJ/USDA/glTF); extra: GIF/PNG-8 palette export, DXF up to 2018, layered PSD |
|
||||
| **Overall (weighted by use)** | | **~75%** | `.ai` and PDF dominate the weighting |
|
||||
@@ -113,7 +113,7 @@ the app's own editing copy of a file (an EPS after its `%%EOF`, a `.ai`'s `AIPri
|
||||
| Text `.txt` | place, export | place (Text Import Options) | yes | |
|
||||
| RTF `.rtf` | place | place (area type with fonts, size, bold, italic, underline, strikethrough, caps, superscript and subscript, color, alignment, indents and paragraph spacing) | no | `tests/textimport.rs`, `place/rtf.rs`; fuzzed (`text_import_fuzz.rs`); `\'hh` bytes read as Windows-1252 or Mac Roman only |
|
||||
| Word `.docx` | place | place (area type with the document's styles and its fonts, size, bold, italic, underline, strikethrough, caps, superscript and subscript, color, alignment, indents and paragraph spacing) | no | `tests/textimport.rs`, `place/docx.rs`; fuzzed (`text_import_fuzz.rs`); list numbers, pictures and text boxes are left out |
|
||||
| Word `.doc` | place | no | no | |
|
||||
| Word `.doc` | place | place (area type with the same formatting as `.docx`, from the style sheet's styles and direct formatting; Word 97 and later) | no | `tests/textimport.rs`, `place/doc.rs`; fuzzed (`text_import_fuzz.rs`); pictures, headers, footers, notes, comments and text boxes are left out with a warning; encrypted and fast-saved documents are refused |
|
||||
| CSS | export (CSS Properties) | — | yes | |
|
||||
| OBJ / USDA / glTF | 3D export | — | no | needs 3D (gap G3) |
|
||||
| Affinity `.af`, `.afdesign`, `.afpub` | no | yes (beyond Illustrator) | no (#665) | 51 pinned files, [affinity-validation.md](affinity-validation.md) |
|
||||
|
||||
+25
-4
@@ -1561,7 +1561,8 @@ already walks Image Trace. Short agent entry points:
|
||||
of `symbol.list` carry `nineSlice`: the guides or `null`; `type` is Symbol Type, `static` by default for the command
|
||||
and `dynamic` by default in the Symbol Options dialog),
|
||||
`symbol.place {name?, x?, y?}`, `symbol.breakLink {ids?}`, `symbol.replace`, `symbol.edit`, `symbol.duplicate`,
|
||||
`symbol.selectInstances {name}`. `symbol.new` and `symbol.duplicate {name, newName?}` trim the white space around the
|
||||
`symbol.selectInstances {name}`, `symbol.delete {name | names, expandInstances?}` (`names` deletes several in one
|
||||
undo step). `symbol.new` and `symbol.duplicate {name, newName?}` trim the white space around the
|
||||
name they are given, as `symbol.options` trims `newName`; a blank one gives "New Symbol" or "<name> copy".
|
||||
- Dynamic symbols: an instance of a symbol whose `type` is `dynamic` changes the appearance of objects in the symbol's
|
||||
art for itself only and stays linked. `symbol.instance.setAppearance {id?, path, fill?, stroke?, opacity?, blend?}`
|
||||
@@ -1577,6 +1578,11 @@ already walks Image Trace. Short agent entry points:
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"symbol.instance.setAppearance","params":{"id":42,"path":[1],"fill":"#d0021b","opacity":80}}}
|
||||
```
|
||||
- The Symbols panel menu's Select All Unused: `symbol.unused` (a query) lists the symbols nothing places, in panel
|
||||
order, and the panel shows them selected; its Delete Symbol then deletes them all, asked once, in one undo step.
|
||||
Instances in the art (opacity masks included), graph designs, pattern tiles (with the tiles that pattern editing's
|
||||
Cancel puts back) and the art of the document's brushes count, and so do the instances in the art of a symbol that
|
||||
is used; a symbol placed only inside an unused symbol is unused too.
|
||||
- The Brushes panel menu's Select All Unused: `brush.unused` (a query) lists the brushes no stroke paints with, in
|
||||
library order, and the panel selects them. Strokes in the art (opacity masks included), symbols, graph designs,
|
||||
pattern tiles (with the tiles that pattern editing's Cancel puts back) and graphic styles count, and so do the
|
||||
@@ -3832,6 +3838,19 @@ more than 16 MiB or nests elements more than 256 deep, and a document with more
|
||||
paragraphs or runs are refused.
|
||||
`file.place` answers `format: "docx"`.
|
||||
|
||||
A Word 97-2003 document (a compound file named `.doc`, or one that holds a `WordDocument` stream; an RTF file named
|
||||
`.doc` is placed as RTF) is placed the same way and keeps the same formatting, taken from the style sheet's default
|
||||
font, the paragraph style and the character style (and the styles each is based on) and direct formatting. Its main
|
||||
text is read; table cells are separated by tabs and each row is a paragraph, and a field places as its result. Hidden
|
||||
and deleted text, field instructions, pictures and embedded objects, headers, footers, notes, comments and text boxes
|
||||
are left out, and `warnings` names each kind of content left out or changed once (pictures and objects, fields,
|
||||
tracked changes, tables, and the other stories the document has); a field with no result is left out with its own
|
||||
warning. Documents saved by Word 6.0 or Word 95, encrypted or password-protected documents and documents last saved with
|
||||
fast save are refused, and so are a stream larger than 64 MiB, a document with more than 4 MiB of text, 100,000 pieces,
|
||||
16,384 pages of properties or 100,000 paragraphs or runs, one whose 16-bit text holds half of a surrogate pair, and one
|
||||
whose structures lie outside their streams.
|
||||
`file.place` answers `format: "doc"`.
|
||||
|
||||
## PDF presets
|
||||
|
||||
`pdf.preset.list` lists the built-in presets (`VectorCraft Default`, which preserves editing, then High Quality Print,
|
||||
@@ -6352,12 +6371,14 @@ as `object.setBounds` measures them (Use Preview Bounds), except Arrange in Grid
|
||||
| `addon.arrange.replace` | `fit`: `keep`, `bounds` (the replaced object's width and height), `proportional` (fits inside them) (`keep`); `scaleStrokes`; `keep` (false) | Puts a copy of the topmost selected object centred on each of the other selected objects, in that object's place in the stacking order; the replaced objects are deleted unless `keep` (the copy then goes right above each). Needs two objects or more; the copies are selected. → `{ids}` |
|
||||
| `addon.arrange.size` | `width`, `height` pt, 0.001…1000000 (at least one); `proportional` (false: a side not given stays; true: it follows the given one in proportion); `reference` 0…8 (4, the centre); `scaleStrokes` | Gives every selected object that width and height, keeping its reference point in place (the 9-point grid row by row from the top-left). |
|
||||
| `addon.arrange.groupOverlapping` | none | Groups the selected objects (at most 20000) wherever their visual bounds overlap or touch, chains included: when A overlaps B and B overlaps C, all three go in one group. Only objects in the same layer or group are grouped together; objects that overlap nothing stay as they are. Each new group goes where its frontmost member was in the stacking order, and the groups and the objects left alone stay selected; with nothing overlapping it makes no step. Needs two objects or more. → `{groups: [id…], grouped}` (how many objects went into groups) |
|
||||
| `addon.arrange.randomizeOpacity` | `min`, `max` % 0…100 (30, 100; `min` not more than `max`); `seed` whole number (0); `ids` (the selection) | Gives each selected object its own opacity (the object opacity the Transparency panel sets), picked at random and evenly from `min` to `max`; the same seed, objects and range give the same opacities. Groups take one opacity of their own; the objects inside keep theirs. → `{count}` |
|
||||
| `addon.arrange.sort` | `by`, `apply`: `width`, `height`, `area` (width × height), `x` (left edge), `y` (top edge), `opacity` (%), `stacking` (stacking order from the back) (`area`, `stacking`); `order`: `ascending` (small to large), `descending` (large to small), `random` (`ascending`); `distribute` (false); `seed` whole number (0, for `random`); `scaleStrokes`; `ids` (the selection) | Sorts the selected objects (at most 20000) by `by` and gives them the values of `apply` in that order: the first gets the smallest value. Without `distribute` the objects trade the values they have; with it the values step evenly from the smallest to the largest. A width, height or area changes about each object's centre (an area in proportion), a place moves the top-left corner. Stacking order always trades places, and only among objects in the same layer or group. Needs two objects or more. → `{count}` |
|
||||
|
||||
Zoom to Selection is the UI command `addon.arrange.zoomSelection {}` (remote mode only): it zooms and centres the
|
||||
active view so the selection's visual bounds fill the window with a margin, as `view.fitArtboard` fits the artboard,
|
||||
and fails with nothing selected. Arrange in Grid…, Replace with Top Object… and Set Size of Each… open dialogs
|
||||
(`ui.menuDialog {command}`, dialog kinds `arrangeGrid`, `arrangeReplace` and `arrangeSize`) whose fields are the
|
||||
command's parameters, with Preview; Set Size of Each's `__width` and `__height` say which sizes OK applies.
|
||||
and fails with nothing selected. Arrange in Grid…, Replace with Top Object…, Set Size of Each…, Randomize Opacity… and Sort Objects… open dialogs
|
||||
(`ui.menuDialog {command}`, dialog kinds `arrangeGrid`, `arrangeReplace`, `arrangeSize`, `arrangeOpacity` and `arrangeSort`) whose
|
||||
fields are the command's parameters, with Preview (Randomize Opacity's seed, and Sort Objects' `seed`, which is not shown, start new whenever the document has changed); Set Size of Each's `__width` and `__height` say which sizes OK applies.
|
||||
|
||||
```json
|
||||
{"name":"run_command","arguments":{"command":"addon.arrange.grid","params":{"columns":4,"gapX":12,"gapY":12}}}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Parity with Adobe Illustrator
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Area Type Options › Text Flow, #4978; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x; public release notes through 30.7, August 2026)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Arrange Tools add-on: Sort Objects, #4917; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x; public release notes through 30.7, August 2026)
|
||||
|
||||
## Feature submission evidence
|
||||
|
||||
@@ -591,6 +591,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
- The History panel, Edit › Undo and Edit › Redo translate the names of the steps that apply or redefine a character or paragraph style and of the step that redefines a graphic style: each such step keeps its template (`Apply {name}`, `Redefine {name}`, `Redefine Graphic Style “{name}”`) and the style's name, every complete catalog has a row for each template, and the panel and the menu show the style's name as the document holds it, except the Normal styles' names, which they show in the interface language (`steps_named_after_a_style_list_the_template_around_the_name`, `undo_and_redo_name_a_style_step_around_the_style_name`).
|
||||
- Localised UI: menus (in-window and native), panels, dialogs, toolbar and Preferences read from per-language catalogs (`crates/ui-egui/src/i18n`, see `docs/development.md`); Traditional Chinese (Taiwan), Simplified Chinese (mainland), Japanese, Korean, Vietnamese, German, Spanish, French, Italian, Polish, Brazilian Portuguese, Russian, Ukrainian, Georgian and Catalan ship complete, and Czech covers every menu label (and more), with system-locale detection on macOS, Windows, Linux and the web (the browser's languages, or `?lang=`), a Language preference and, on macOS, a VectorCraft ▸ Language menu. Names are never translated (fonts and their styles, layers, artboards, saved presets, user libraries, custom workspaces, recent files, plug-ins).
|
||||
The counts that Package's status and question, the folder search of Missing Fonts and Find Linked Files, the modified and missing linked file prompts and the CSS Properties panel's notes show use the interface language's plural forms instead of a fixed "(s)" form. Evidence: `the_missing_links_note_uses_each_count_form` in `crates/ui-egui/src/dialogs/tests_package.rs`, `the_modified_links_question_uses_each_count_form` in `crates/ui-egui/src/dialogs/missing_links.rs`, `search_counts_use_each_count_form` in `crates/ui-egui/src/dialogs/missing_fonts/tests.rs` and `the_unnamed_objects_note_uses_each_count_form` in `crates/ui-egui/src/panels/tests_css_properties.rs`.
|
||||
The status bar's messages for relinked, replaced, updated and embedded images, broken links, linked files that can't be read or changed on disk, images that can't be decoded, added and unavailable fonts, copied CSS, downloads and exports with their notes name one item in the singular and more in the plural, in English and in each language's plural forms (`counted_status_messages_take_the_plural_form` in `crates/ui-egui/src/i18n/tests.rs`).
|
||||
- Edit › Undo and Edit › Redo, in the in-window and native menus, name the step in the interface language as the History panel lists it (`panels::history::step_name`), so when the catalog has no plain row for a step named after an effect, such as Feather, the menu shows the translation of the effect's menu row without its ellipsis (`undo_and_redo_name_the_step_as_the_history_panel_does`).
|
||||
- The History panel translates the undo step names the engine, the tools and the shell write as literals: the untranslated report (`untranslated_report`) lists any a complete catalog lacks, and a step whose catalog row exists only with an ellipsis (such as an effect's menu name) shows that row without the ellipsis.
|
||||
- The History panel menu has Step Backward and Step Forward, which run Edit › Undo and Edit › Redo and are disabled when there is no step to undo or redo, and Set History Limit…, which opens Preferences at Performance, where History States is set. Not done: a new document from the selected state.
|
||||
@@ -606,6 +607,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
- Swatch and graphic style libraries, Libraries panel files, presets and plug-ins open wherever they are dropped on the window, as File › Open opens them.
|
||||
- **Symbol libraries** ([public source](https://helpx.adobe.com/illustrator/desktop/manage-objects/traces-mockups-symbols/create-or-import-symbol-libraries.html)): Window › Symbol Libraries and the Symbols panel's Symbol Libraries Menu open each library in a library panel of its own, as swatch and graphic style libraries do. The built-in library, Basic Shapes, is original art generated in code (`crates/engine/src/cmd/symbollib.rs`). A click on a symbol adds it to the document's Symbols as one undo step, with its Symbol Options (size, registration, export type, 9-slice guides) and every resource it uses (the symbols it nests, patterns, swatches, brushes, graphic styles, images), and makes it the current symbol; a symbol the document already has is not added again and another symbol of the same name keeps its name, the library's comes in numbered. Thumbnails, in the library panels and the Symbols panel, draw a symbol with the symbols it nests and the patterns and images it uses. Dragging a library symbol onto the canvas also places an instance there, in the same step ([placing from a library](https://helpx.adobe.com/illustrator/desktop/manage-objects/traces-mockups-symbols/create-and-place-symbols.html)). Save Symbols (the library menu) and Save Symbol Library… (the Symbols panel menu) write the document's symbols as a `.vectorcraft` document holding only them, into the user library folder (listed under User Defined) or a file; Other Library… reads the symbols of any document VectorCraft opens; a file it can't read is an error and opens no panel. Tests: `crates/engine/src/tests/symbollib.rs`, `crates/ui-egui/src/panels/tests_symbol_libraries.rs`, `panels::symbols::tests::thumbnails_show_the_symbols_a_symbol_nests`, `canvas::tests::a_library_symbol_dropped_on_the_canvas_is_added_and_placed_there_in_one_step`.
|
||||
- **Delete Symbol asks first** ([Symbols panel](https://helpx.adobe.com/illustrator/desktop/manage-objects/traces-mockups-symbols/symbols-panel-options.html), [symbol libraries](https://helpx.adobe.com/illustrator/desktop/manage-objects/traces-mockups-symbols/create-or-import-symbol-libraries.html), [Alt-click Delete](https://helpx.adobe.com/illustrator/using/default-keyboard-shortcuts.html)): the Symbols panel's Delete Symbol button and menu item ask "Delete the selected symbol?" with Yes and No for a symbol no instance uses. For a symbol with placed instances they ask with Expand Instances (the instances become ordinary art), Delete Instances and Cancel; either Instances button deletes the symbol in one undo step. Alt-click on the button deletes an unused symbol without asking and still asks about one with instances. A question left open while another document became active deletes nothing. `symbol.delete` itself does not ask. Tests: `panels::symbols::tests::delete_symbol_asks_first_and_alt_click_deletes_an_unused_symbol_at_once`, `the_in_use_question_expands_or_deletes_the_instances`, `a_stale_delete_symbol_question_deletes_nothing`, `the_delete_symbol_questions_show_their_buttons`.
|
||||
- **Symbols › Select All Unused** ([Symbols panel](https://helpx.adobe.com/illustrator/desktop/manage-objects/traces-mockups-symbols/symbols-panel-options.html), #4918): the Symbols panel menu's Select All Unused shows the symbols nothing places selected (`symbol.unused`): instances in the art (opacity masks included), graph designs, pattern tiles and brush art count, and so do instances in a used symbol's art. Delete Symbol, the button or the menu item, then asks "Delete the selected symbols?" once and deletes those still unused in one undo step (`symbol.delete {names}`); Alt-click on the button deletes them without asking, and a click on a symbol picks just it again. Tests: `tests::brushsym::symbol_unused_lists_the_symbols_nothing_places_and_delete_takes_several`, `panels::symbols::tests::select_all_unused_picks_the_unused_symbols_and_delete_deletes_them`, `dialogs::symbol_delete::tests::several_symbols_get_the_plural_question`.
|
||||
- **Brush libraries** ([public source](https://helpx.adobe.com/illustrator/desktop/paint-and-fill/apply-and-edit-strokes/create-new-brush-libraries.html), [import](https://helpx.adobe.com/illustrator/desktop/paint-and-fill/apply-and-edit-strokes/import-brushes-from-brush-libraries-or-other-files.html), [Brushes panel](https://helpx.adobe.com/illustrator/desktop/paint-and-fill/apply-and-edit-strokes/brushes-panel-overview.html)): Window › Brush Libraries, the Brushes panel's Brush Libraries Menu and its menu's Open Brush Library open each library in a library panel of its own, as swatch, graphic style and symbol libraries do. The built-in libraries (Art Ribbons, Calligraphic Nibs, Pattern Borders, Scatter Shapes) are original brushes generated in code (`crates/engine/src/cmd/brushlib.rs`); Striped Ribbon's art is filled with the library's own pattern and Sparkles scatters the library's own symbol. A click on a brush adds it to the document's Brushes as one undo step with every resource its art uses (patterns, symbols, swatches, graphic styles, images), makes it the current brush and, with paths selected, applies it to them in the same step; a brush the document already has is not added again and a different brush of the same name comes in numbered ("Wave 2"). Shift/Cmd-clicks select brushes for Add to Brushes; a brush dragged onto a path is added and applied to it, and one dragged onto the Brushes panel is added. Save Brushes… / the Brushes panel's Save Brush Library… write the document's brushes (or the selected ones) as a `.vectorcraft` library into the `Brushes` folder next to the preferences, listed under User Defined, or to a file; Other Library… reads the brushes of any document VectorCraft opens. Thumbnails, in the library panels, the Brushes panel and Brush Options, render brush art with the patterns and symbols it uses. Copying brushed art now carries the patterns and symbols its brush's art uses too. Tests: `crates/engine/src/tests/brushlib.rs`, `crates/ui-egui/src/panels/tests_brush_libraries.rs`, `panels::brushes::tests::library_brush_previews_show_the_patterns_their_art_uses`, `canvas::tests::a_library_brush_dropped_on_a_path_is_added_and_applied_in_one_step`.
|
||||
- A canvas context menu: right-click selects the object under the pointer and lists what applies to the selection (Undo/Redo, clipboard, group, isolation, join, Remove Anchor Points when anchors are selected, masks, compound paths, guides, Transform, Arrange, Select, Export Selection), or the view commands on empty canvas.
|
||||
- A right-click over locked objects adds an Unlock submenu to the canvas context menu. The submenu lists up to 20 locked objects under the pointer, topmost first, by the name the Layers panel shows, and choosing one unlocks it (`layer.setProps`). A locked group is listed as one item. Objects on hidden, locked or template layers are not listed.
|
||||
@@ -854,6 +856,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
The Every-line Composer composes a paragraph whose characters differ in line metrics (type size, font, leading or vertical scale, or an inline graphic taller than the text) in rectangular area type, rows and columns included. In area type of another shape, or with text wrap, such a paragraph is broken with the Single-line Composer.
|
||||
The Character panel's Small Caps, Superscript and Subscript buttons and the panel menu's items of the same names turn small caps and the superscript or subscript position on and off for the selected type, or for the text the Type tool has selected (`text.setFormat` or `text.setRangeStyle` `{smallCaps, position}`), in Document Setup's proportions. Turning Superscript on turns Subscript off, and turning Subscript on turns Superscript off. A button or item shows as on when the first selected character (at a caret, the character before it) has its attribute.
|
||||
The Character panel's Anti-aliasing Method dropdown, under Character Rotation, sets how the edges of the selected type objects are drawn as pixels (`text.setFormat {antiAlias}`), for the whole object, with each frame of a thread keeping its own method, on the canvas, in raster exports and when the type is rasterized. VectorCraft defines the methods: Sharp, the default, draws edges as before; None paints a pixel only where the type covers at least half of it; Crisp shows a pixel covered by a share c at `2c - 0.5`, and Strong shows it at `2c`, each kept between 0 and 1. SVG, PDF and EPS export are unchanged.
|
||||
The OpenType panel's Stylistic Alternates and Titling Alternates checkboxes turn `salt` and `titl` on and off for the selected type, and its Figure menu lists Default Figure, Tabular Lining, Proportional Lining, Proportional Oldstyle and Tabular Oldstyle; Proportional Lining sets `pnum` and `lnum` and turns `tnum` and `onum` off, Tabular Lining turns `pnum` off and keeps `lnum`, Proportional Oldstyle turns `lnum` off and keeps `pnum`, and Default Figure and Tabular Oldstyle turn `pnum` and `lnum` off. Behavior reference: [Format text with OpenType features](https://helpx.adobe.com/illustrator/desktop/design-with-text/special-characters-glyphs/format-text-with-opentype-features.html) and [Use swashes, titling alternates, or stylistic alternates](https://helpx.adobe.com/illustrator/desktop/design-with-text/special-characters-glyphs/use-swashes-titling-alternates-or-stylistic-alternates.html) (public documentation). Tests: `panels::opentype::tests`.
|
||||
- **Paragraph alignment:** the shared Paragraph/Properties alignment row leaves every button unselected when the paragraphs it acts on differ. Auto resolves per paragraph; choosing an alignment uses the existing command. Headless paragraph_mixed_alignment_* regressions exercise mixed → Center → Undo, caret/uniform states, Unicode range boundaries, Auto/direction, split runs and grouped text. These regressions and full integration CI pass. Original captures confirm mixed → Center → Undo in the existing alignment-button layout. The [public Paragraph panel guide](https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/paragraph-panel-overview.html) lists the seven controls, but does not specify mixed-state rendering. Other paragraph fields remain outside this change; scores and hours unchanged.
|
||||
For Auto Size area type in columns, the bisection for the frame's height runs on the lines of the one-column layout, and its result is checked with at most two layouts of the columns. When the text wraps around objects or does not fit the one-column layout, or when the check fails, the columns are laid out at every step of the bisection, as before. Typing at the start of a story of 50,000 characters in 2 columns took 1,670 ms a keystroke and now takes 292 ms (release build, `auto_height_in_columns_typing_timing`).
|
||||
Exports to PDF, EPS, SVG, EMF, WMF and the raster formats warn about the area type and type on a path that they draw without the text that doesn't fit, and give their ids, as Print and Print Preview do.
|
||||
@@ -1094,6 +1097,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
- File › Place reads RTF files as area type with their formatting: each run's font, size, bold and italic, underline, strikethrough, caps, superscript or subscript, baseline shift and color, and each paragraph's alignment, indents, space before and after and direction. Table cells are separated by tabs; hidden text, pictures, headers, footers and notes are left out (`file.place`, `crates/engine/src/tests/textimport.rs`).
|
||||
- File › Place reads Word `.docx` documents as area type with the same formatting, taken from the document defaults, the paragraph and character styles (their toggle properties reversing each other) and direct formatting, the theme's fonts included. Table rows are paragraphs with their cells separated by tabs; hidden and deleted text, field instructions, pictures, headers, footers and notes are left out (`file.place`, `crates/engine/src/tests/textimport.rs`).
|
||||
- A Word paragraph justified with a low, medium or high kashida length places justified with Insert Kashidas set to Short, Medium or Long (`file.place`, `crates/engine/src/tests/textimport.rs`).
|
||||
- File › Place reads Word 97-2003 `.doc` documents as area type with the same formatting, read from the main text's pieces, the style sheet's paragraph and character styles and direct formatting. Table rows are paragraphs with their cells separated by tabs and fields place as their results; fields without a result, hidden and deleted text, pictures, headers, footers, notes, comments and text boxes are left out, and `warnings` names each kind left out or changed. Encrypted documents, documents last saved with fast save and Word 6.0 and Word 95 documents are refused (`file.place`, `crates/engine/src/tests/textimport.rs`).
|
||||
- On the desktop, File › Place reads and decodes files off the UI thread, one at a time, and places each once it is read, with "Placing" in the status bar and the busy spinner until then: the Place dialog's OK, a file dropped on the canvas, a click or drag of the place cursor, and the OK of the PDF, DXF and text import options. The files and thumbnails the place cursor is loaded with are read the same way, and the Place dialog's lines about its files are read on a thread of their own. Files are placed in the order they were started; a file is not placed while a dialog is open or a drag is under way, and a file whose document was closed meanwhile is not placed. `file.place` and `file.place.queue` over MCP and scripts reply as before.
|
||||
- The pixels of a PNG, JPEG, GIF or WebP file that Place decodes to check them are kept in the image store the renderers share, so the canvas's first frame with the placed image draws them without decoding the file again on the UI thread: File › Place, a file dropped on the canvas, a click or drag of the place cursor, `file.place`, and Paste of such an image. A CMYK JPEG is still decoded when it is first drawn (`crates/ui-egui/src/placing.rs`, `crates/render/src/tests.rs`).
|
||||
- A photo whose EXIF orientation turns or flips it (a camera held upright or upside down) is placed and opened upright, as it was taken; the image is stored as it is seen (#4284).
|
||||
@@ -1410,6 +1414,14 @@ dialogs, Preview and Cancel, Zoom to Selection) and `command_sweep`. Commands: `
|
||||
|
||||
A VectorCraft addition, not a feature of the reference app, so no area score moves. Object › Plug-ins › Arrange Tools › Group Overlapping Objects groups the top-level selected objects wherever their visual bounds overlap or touch, chains included (A overlapping B and B overlapping C makes one group of three), only among objects of the same layer or group; objects that overlap nothing stay as they are, each new group takes its frontmost member's place in the stacking order, and the groups and the loose objects stay selected. One undo step; at most 20000 objects, compared by a sweep along x with union-find. Tests: `group_overlapping_*` in `cmd::addons::arrange::tests` in `vectorcraft-engine` (chains, loners, stacking order, layers kept apart, visual bounds, no step when nothing overlaps, many objects), `group_overlapping_objects_runs_directly` in `vectorcraft-ui-egui` and `command_sweep`. Commands: `docs/mcp.md` › Arrange Tools add-on.
|
||||
|
||||
## Arrange Tools add-on: Randomize Opacity (2026-11-01)
|
||||
|
||||
A VectorCraft addition, not a feature of the reference app, so no area score moves. Object › Plug-ins › Arrange Tools › Randomize Opacity… gives each top-level selected object (or each of `ids`) its own object opacity, picked at random and evenly between a minimum and a maximum percent (30 to 100 by default); a seed (0 by default; the dialog starts with a new one whenever the document has changed) repeats a result exactly. A group takes one opacity of its own and the objects inside keep theirs. One undo step; a minimum above the maximum, a percent outside 0 to 100 or a seed that is not a whole number is refused without a change. Tests: `randomize_opacity_*` in `cmd::addons::arrange::tests` in `vectorcraft-engine` (range, one undo step, same and different seeds, defaults, `ids`, groups, bad params), `randomize_opacity_opens_its_dialog_and_runs_on_ok` in `vectorcraft-ui-egui` and `command_sweep`. Commands: `docs/mcp.md` › Arrange Tools add-on.
|
||||
|
||||
## Arrange Tools add-on: Sort Objects (2026-11-01)
|
||||
|
||||
A VectorCraft addition, not a feature of the reference app, so no area score moves. Object › Plug-ins › Arrange Tools › Sort Objects… sorts the top-level selected objects (or `ids`, at most 20000) by one attribute (width, height, area, x or y position, opacity or stacking order; small to large, large to small, or a random order from a seed) and gives them another in that order, the first the smallest value: the objects trade the values they have, or with Distribute Evenly the values step evenly from the smallest to the largest. Lining objects up left to right by size, restacking them so the largest is at the back, or giving them heights that step with their x position are each one run. Sizes and places are measured and set as `object.setBounds` measures them (Use Preview Bounds); a width, height or area changes about each object's centre (an area in proportion), and stacking order trades places only among objects of the same layer or group. One undo step; no step when nothing changes. Tests: `sort_*` in `cmd::addons::arrange::tests` in `vectorcraft-engine` (each attribute sorted by and applied, both directions, distribute, layers kept apart, the seeded random order, `ids`, no step when in order, bad params), `sort_objects_opens_its_dialog_and_runs_on_ok` in `vectorcraft-ui-egui` and `command_sweep`. Commands: `docs/mcp.md` › Arrange Tools add-on.
|
||||
|
||||
## Path Precision Tools add-on: Divide into Dashes (2026-11-01)
|
||||
|
||||
A VectorCraft addition, not a feature of the reference app, so no area score moves. Object › Plug-ins › Path Precision Tools › Divide into Dashes… cuts the selected paths into separate open paths along the curve (arc length, not straight distance): each `dash` long (0.01 to 1000000 pt, 10 by default) with `gap` between them (0 by default: the pieces touch); the gap pieces are left out unless Remove Gaps is off. With direct-selected segments (or anchors) only those runs are divided, the pattern running on across segments that follow one another, and the rest of such a path stays as pieces of its own. Fit to Corners and Ends gives every run between corners and ends a whole number of dashes, all stretched or squeezed alike so it starts and ends on a dash (a closed path without corners holds whole periods); otherwise the lengths are exact and each run's last piece is what is left. Every piece keeps the path's appearance and is selected; one undo step; at most 100000 pieces (more is refused). The dialog takes lengths in any unit and previews on the canvas. Tests: `dashes::tests` in `vectorcraft-pathops` (exact and fitted lengths, curves measured along them, picked segments on open and closed paths, the piece cap and bad patterns), `divide_into_dashes_*` in `cmd::addons::pathtools::tests` in `vectorcraft-engine` (gaps removed or kept, fitted lengths, the stroke kept, one undo step, selected segments only, bad params and too many pieces refused), `divide_into_dashes_opens_its_dialog_previews_and_runs_on_ok` in `vectorcraft-ui-egui` and `command_sweep`. Commands: `docs/mcp.md` › Path Precision Tools add-on.
|
||||
@@ -1430,6 +1442,9 @@ Symbols area (#4938), from the public symbol documentation ([create and place sy
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-11-01 | minor | Arrange Tools add-on (a VectorCraft addition): Randomize Opacity (#4925); evidence added; scores unchanged. |
|
||||
| 2026-11-01 | minor | Arrange Tools add-on (a VectorCraft addition): Sort Objects (#4917); evidence added; scores unchanged. |
|
||||
| 2026-11-01 | minor | Symbols panel: Select All Unused (`symbol.unused`) shows the symbols nothing places selected, and Delete Symbol deletes them all, asked once, in one undo step (`symbol.delete {names}`, #4918); scores and hours unchanged |
|
||||
| 2026-11-01 | minor | Type core: Area Type Options › Text Flow (#4978): area type with several rows and columns fills them by columns (the default) or by rows, from the dialog's radio buttons or `text.areaOptions {flow}`; evidence updated; scores unchanged. |
|
||||
| 2026-11-01 | minor | Symbols: dynamic symbols (#4938): Symbol Options › Symbol Type, per-instance appearance for objects of a dynamic symbol's art that stays linked through redefinition, Break Link baking, Reset and Static dropping it; evidence added. Score unchanged at 87% (estimated), hours 5–9 → 4–8. |
|
||||
| 2026-11-01 | minor | Artboard background colors in output (#4937): raster exports (a transparent background too), PDF, SVG and EPS pages, `.ai` files' PDF pages, Export for Screens and print (and its preview) draw each artboard's color behind its art, inside the artboard and in the color's own model; Export for Screens has Include Artboard Fill beside Include Bleed (on by default, remembered; `includeArtboardFill`, also on `document.export` and `file.print`); editing data keeps the color as the artboard's, and Export for Screens' document rows keep it too; evidence updated; scores unchanged. |
|
||||
|
||||
+3
-2
@@ -1,6 +1,6 @@
|
||||
# Type parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Area Type Options › Text Flow by rows or by columns, #4978; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Serbian in Cyrillic and Latin and Croatian among the languages, with their quote marks; previously minor: Area Type Options › Text Flow by rows or by columns, #4978; scores unchanged) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
|
||||
Type is Illustrator's largest single area by use (weight 13 of 105 across "Type core" and "Type advanced" in
|
||||
[target-app-parity.md](target-app-parity.md)). This checklist lists the features one by one. Status is from the
|
||||
@@ -60,7 +60,7 @@ against Illustrator's public documentation; **estimated** unless noted.
|
||||
| CJK: Proportional Metrics (`palt` in horizontal type, `vpal` in vertical type) | done | #966 |
|
||||
| CJK: manual tate-chu-yoko | done | Character panel menu › Tate-chu-yoko (`text.setFormat` / `text.setRangeStyle {tateChuYoko}`), with Show East Asian Options: marked characters stand side by side across one em of a vertical column, squeezed to the em when wider; two or three half-width digits still do so without the mark; horizontal type keeps the mark and does not move them. Up/Down and Left/Right settings remain. Evidence: `tests_vertical::manual_tate_chu_yoko_sets_marked_characters_across_one_em`, `typecmd::tate_chu_yoko_is_a_character_attribute_saved_only_when_on` |
|
||||
| CJK: ruby, manual tate-chu-yoko | partial | ruby (ふりがな) for live text (`type.ruby`): a reading over a byte range, above (right of the column in vertical type) or below, start/centre/end alignment, size, overhang or squeeze; saved natively, laid out with its line growing, drawn on the canvas, in SVG and PDF (as outlines where ruby is present), in EPS, EMF/WMF and legacy `.ai` (legacy `.ai` writes type with ruby as outlines), and kept by Create Outlines, Expand Appearance and flattening, each glyph where the layout puts it (`typecmd::ruby_tests::create_outlines_keeps_the_ruby_where_it_is_laid_out`); manual tate-chu-yoko missing | #633 |
|
||||
| Language per character (Character panel › Language, character styles), text shaped in it | done | `text.setFormat` / `text.setRangeStyle {language}` by name or BCP 47 tag, one of Document Setup's languages (Hindi, Marathi, Gujarati, Bengali, Punjabi, Tamil, Telugu, Kannada, Malayalam, Odia and Urdu added, #4943); the shaper gets the tag, so the font's language forms apply (OpenType `locl`: Turkish keeps `fi` apart and the dot on its i, #4940); new type takes the document's language; saved as the tag only when set, carried by character styles (#4946). Not yet: hyphenation and spelling by it, `.ai`/PDF import of a text's language, paragraph styles. Evidence: `features::tests::language_picks_the_fonts_forms`, `typecmd::area_tests::language_is_a_character_attribute_saved_only_when_set` |
|
||||
| Language per character (Character panel › Language, character styles), text shaped in it | done | `text.setFormat` / `text.setRangeStyle {language}` by name or BCP 47 tag, one of Document Setup's languages (Hindi, Marathi, Gujarati, Bengali, Punjabi, Tamil, Telugu, Kannada, Malayalam, Odia and Urdu added, #4943; Serbian: Cyrillic, Serbian: Latin and Croatian); the shaper gets the tag, so the font's language forms apply (OpenType `locl`: Turkish keeps `fi` apart and the dot on its i, #4940); new type takes the document's language; saved as the tag only when set, carried by character styles (#4946). Not yet: hyphenation and spelling by it, `.ai`/PDF import of a text's language, paragraph styles. Evidence: `features::tests::language_picks_the_fonts_forms`, `features::tests::serbian_gets_the_fonts_serbian_forms`, `typecmd::area_tests::language_is_a_character_attribute_saved_only_when_set` |
|
||||
| No Break | done | Character panel menu (`text.setFormat` / `text.setRangeStyle {noBreak}`): the marked characters stay on one line, including across a space; a run that does not fit after earlier text moves together, and a run longer than the line stays together. Evidence: `layout::wrapping_tests::no_break_keeps_marked_characters_on_one_line`, `tests::no_break_keeps_marked_words_on_one_line`, `typecmd::no_break_is_a_character_attribute_saved_only_when_on` |
|
||||
| CJK: ruby | missing | #633 |
|
||||
| Inline symbols in text | beyond Illustrator | not scored |
|
||||
@@ -72,6 +72,7 @@ Character Styles menu New/Redefine and footer New capture the first selected cha
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-11-01 | minor | Serbian: Cyrillic (`sr-Cyrl`), Serbian: Latin (`sr-Latn`) and Croatian (`hr`) in the language list, with their quote marks (Serbian „…” and ’…’ per the Pravopis srpskoga jezika, Matica srpska 2010, ISBN 978-86-7946-079-0, т. 168, and [CLDR `sr`](https://github.com/unicode-org/cldr/blob/main/common/main/sr.xml); Croatian „…“ and ‚…‘ per [CLDR `hr`](https://github.com/unicode-org/cldr/blob/main/common/main/hr.xml)); Serbian text gets the fonts' Serbian forms (italic б, г, д, п, т); scores unchanged |
|
||||
| 2026-11-01 | minor | Area Type Options › Text Flow (#4978): By Rows / By Columns radio buttons and `text.areaOptions {flow}`; area type with several rows and columns fills them across each row first or down each column first (the default, so existing documents are unchanged; saved only when by rows); scores unchanged |
|
||||
| 2026-11-01 | minor | Digits (#4942): the native digits of Devanagari, Bengali, Gurmukhi, Gujarati, Odia, Tamil, Telugu, Kannada and Malayalam in the Character panel menu › Digits and `{digits}`; scores unchanged |
|
||||
| 2026-11-01 | minor | Language per character (#4946): Character panel › Language, `text.setFormat` / `text.setRangeStyle {language}`, character styles; text is shaped in its language (`locl`, #4940); new type takes the document's; Indian languages in the list (#4943); scores unchanged |
|
||||
|
||||
+7
-1
@@ -1,6 +1,6 @@
|
||||
# UI and interaction parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Layers panel: a blend's spine row, #4820) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-11-01 · **Change:** minor (Arrange Tools add-on: Sort Objects, #4917) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
|
||||
## Feature submission evidence
|
||||
|
||||
@@ -87,6 +87,7 @@ tools, never checked side by side) isn't captured row by row.
|
||||
| Anchor Point and Curvature tools' own cursors | done | the caret on the anchor it converts; the pen nib with a curve badge |
|
||||
| Free Transform's Cmd/Ctrl side-shear cursor | done | two arrows passing along the side (ShearH, ShearV), instead of the resize arrow across it |
|
||||
| Cursors of their own for Lasso, Magic Wand, the freehand tools, Shaper, Live Paint Bucket, Measure, Print Tiling, the symbolism tools, vertical type, Scissors (over a segment and away), Mesh and Puppet Warp | partial | each tool returns its own cursor and Use Precise Cursors turns them into the crosshair; until they're drawn they borrow the crosshair, the I-beam, the Pen's add cursor or not-allowed |
|
||||
| Blob Brush and Eraser: the tip's outline at the pointer | done | before a press and while painting, the outline of the tip (its size, angle and roundness, at the zoom) follows the pointer, black on a white halo, round a small centre dot; `[` / `]` and Tool Options change it at once; precise cursors (Caps Lock) show only the crosshair; it goes when the pointer leaves the canvas, while Cmd/Ctrl lends a selection tool and while Alt lends the Blob Brush the Smooth tool (#4977); `crates/tools/src/draw2/gesture.rs` and its tests |
|
||||
| Busy cursor during long operations | done | Background open, save and export show the system progress cursor (gap G1) |
|
||||
| Each anchor snaps to Smart Guides and construction angles | done | `DrawSnap` |
|
||||
| Curvature tool: click/drag points, double-click or Alt-click for a corner, temporary Direct Selection, point conversion | partial | circular point markers without direction handles or duplicate markers, Anchor Size and Hide Edges regression-tested (#1236, in part); curve geometry: each stretch of three points follows the circle through them (handles along its tangent, chord/(3·cos²(α/2)) long, shorter in a turn tighter than 30°), open ends curving in, the same rule for the rubber band, dragged, inserted and converted points (#1236, in part); neighbours of a point dragged on an existing path keep their tangents, and modifiers requested in #975 remain |
|
||||
@@ -333,6 +334,8 @@ next unit in the order a right-click on a ruler lists them, from Feet back to Po
|
||||
| Outline view keeps template layers in Preview, dimmed | done | #1486; a picture placed to be traced stays visible under the outlines |
|
||||
| Arrange Tools add-on (VectorCraft addition): Object › Plug-ins › Arrange Tools runs Arrange in Grid… (grid by row, one row or one column; columns, H and V spacing, Center on Artboard; Preview), Swap Objects, Swap Objects and Sizes, Replace with Top Object… (Actual Size, Bounds or Bounds (Fit Proportionally); Keep Original; Scale Strokes & Effects; Preview), Set Size of Each… (Width and Height each ticked on or off, Constrain Width and Height Proportions with one side, the reference point, Scale Strokes & Effects; Preview) and Zoom to Selection, each one undo step | done | `addon.arrange.*`, `crates/engine/src/cmd/addons/arrange.rs`, `crates/ui-egui/src/addons/arrange.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
| Arrange Tools add-on (VectorCraft addition): Object › Plug-ins › Arrange Tools › Group Overlapping Objects groups the selected objects whose visual bounds overlap or touch (chains included, within one layer or group), each group at its frontmost member's stacking place, one undo step | done | #4928; `addon.arrange.groupOverlapping`, `crates/engine/src/cmd/addons/arrange.rs` and its tests; not a feature of the reference app, so it is not scored |
|
||||
| Arrange Tools add-on (VectorCraft addition): Object › Plug-ins › Arrange Tools › Randomize Opacity… gives each selected object its own opacity at random between Minimum and Maximum (%), with a Seed that repeats it and Preview, one undo step | done | #4925; `addon.arrange.randomizeOpacity`, `crates/engine/src/cmd/addons/arrange.rs`, `crates/ui-egui/src/addons/arrange.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
| Arrange Tools add-on (VectorCraft addition): Object › Plug-ins › Arrange Tools › Sort Objects… sorts the selected objects by Sort By (width, height, area, X or Y position, opacity, stacking order) in an Order (Small to Large, Large to Small, Random) and gives them Apply To in that order, trading the values or with Distribute Evenly; Scale Strokes & Effects; Preview; one undo step | done | #4917; `addon.arrange.sort`, `crates/engine/src/cmd/addons/arrange.rs`, `crates/ui-egui/src/addons/arrange.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
| Document Tools add-on (VectorCraft addition): Object › Plug-ins › Document Tools › Save a Timestamped Copy writes `<name>_YYYY-MM-DD_HH-MM.<ext>` next to the document (a folder picked for one never saved), which keeps its path, title and modified state; off on the web | done | #4926; `addon.document.saveTimestampedCopy`, `crates/engine/src/cmd/addons/document.rs`, `crates/ui-egui/src/addons/document.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
| Document Tools add-on (VectorCraft addition): Object › Plug-ins › Document Tools › New Symbols from Layers makes a symbol of each layer's art named after the layer (the highlighted layers when two or more are, else all); Convert Layers to Symbols also replaces each layer's art with an instance in place; empty layers skipped, one undo step | done | #4927; `addon.document.symbolsFromLayers`, `crates/engine/src/cmd/addons/document.rs`, `crates/ui-egui/src/addons/document.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
| Smart Pen add-on (VectorCraft addition): Object › Plug-ins › Smart Pen selects the Smart Pen Tool, which the All Tools drawer lists under its own heading but neither toolbar shows as shipped (no shortcut), and opens the Smart Pen panel (next segment straight or curved; Remove Points Keep Shape, Make Smooth, Make Corner, Retract Handles, Close or Join). The tool draws (click: straight or curved segment, a curve after a straight one tangent; drag: smooth anchor, Alt breaks the handle, Shift 45°, Space moves it; Tab switches a segment; rubber band; close, join, continue) and edits without switching tools (click selects a point, drag moves it, Alt-click removes it keeping the shape, Shift+Alt-click deletes it, double-click toggles smooth/corner; handle drags with Shift and Alt; segment drags reshape, Alt-click adds a point) | done | `addon.pen.*`, `crates/tools/src/addons/smart_pen.rs`, `crates/ui-egui/src/addons/pen.rs` and their tests; not a feature of the reference app, so it is not scored |
|
||||
@@ -388,6 +391,9 @@ separate. Scores and hours unchanged. [Behavior and command details](development
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-11-01 | minor | Arrange Tools add-on (a VectorCraft addition): Randomize Opacity (#4925); scores and estimates unchanged |
|
||||
| 2026-11-01 | minor | Arrange Tools add-on (a VectorCraft addition): Sort Objects (#4917); scores and estimates unchanged |
|
||||
| 2026-11-01 | minor | Blob Brush and Eraser: the tip's outline (size, angle, roundness, at the zoom) follows the pointer before and while painting, around a small centre dot, updating at once with `[` / `]` and Tool Options; precise cursors (Caps Lock) show only the crosshair (#4977); scores and estimates unchanged (estimated) |
|
||||
| 2026-11-01 | minor | Layers panel: an open blend lists its spine as a `<Path>` row below its key objects, and a click selects the blend so Direct Selection edits the spine (#4820); scores and estimates unchanged |
|
||||
| 2026-11-01 | minor | Pen with Cmd/Ctrl held: the lent Selection tool no longer scales the path being drawn by bounding-box handles the canvas hides while its end anchor is selected (a flat path did nothing under a resize pointer); a Cmd drag moves the path instead, and with Direct Selection moves anchors and segments, one undo step each (#4980); scores and estimates unchanged |
|
||||
| 2026-11-01 | minor | Dynamic symbols (#4938): Symbol Options › Symbol Type; per-instance appearance for objects of a dynamic symbol's art; Reset in the Properties panel and the Symbols panel menu; on-canvas Direct Selection of the parts remains |
|
||||
|
||||
Reference in New Issue
Block a user