mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-07 13:23:22 +00:00
Type: Find Font's Replace With Font From lists the document's, recent or installed fonts
Squashed from #5217 onto main.
This commit is contained in:
@@ -168,9 +168,21 @@ impl VectorcraftApp {
|
||||
if matches!(id, "dataset.select" | "dataset.next" | "dataset.prev") {
|
||||
self.ui.status.clear();
|
||||
}
|
||||
if matches!(id, "text.setStyle" | "text.setRangeStyle")
|
||||
&& let Some(font) = params.get("font").and_then(Value::as_str)
|
||||
{
|
||||
// A font applied with Character's font menu or Find Font's Change becomes the newest recent font.
|
||||
// Find Font's Change records the family the text now carries (any name of it is stored as its
|
||||
// own name), and only when it changed some text.
|
||||
let applied = match id {
|
||||
"text.setStyle" | "text.setRangeStyle" => params.get("font").and_then(Value::as_str).map(str::to_string),
|
||||
"text.replaceFont" if v["runs"].as_u64().is_some_and(|n| n > 0) => {
|
||||
let to = ¶ms["to"];
|
||||
to["family"].as_str().and_then(|family| {
|
||||
let style = to["style"].as_str().unwrap_or("Regular");
|
||||
vectorcraft_text::FontDb::global().resolve(family, style).map(|(face, _)| face.family.clone())
|
||||
})
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
if let Some(font) = applied.as_deref() {
|
||||
let r = &mut self.ui.recent_fonts;
|
||||
r.retain(|f| !f.eq_ignore_ascii_case(font));
|
||||
r.insert(0, font.to_string());
|
||||
|
||||
+301
-11
@@ -1,6 +1,7 @@
|
||||
//! Type → Find Font…: the fonts the document uses (missing ones marked), Find (select the text
|
||||
//! using a font), Change / Change All to another installed font, and Find in Folder… (the missing
|
||||
//! fonts' files, in the Missing Fonts dialog: `ui.findFontsInFolder`).
|
||||
//! using a font), Change / Change All to another font from the list Replace With Font From shows
|
||||
//! (the document's fonts, the recent fonts or every installed font), and Find in Folder… (the
|
||||
//! missing fonts' files, in the Missing Fonts dialog: `ui.findFontsInFolder`).
|
||||
|
||||
use egui::Ui;
|
||||
use serde_json::{Value, json};
|
||||
@@ -22,9 +23,90 @@ pub fn open_on_missing(app: &mut VectorcraftApp) {
|
||||
open_at(app, first.unwrap_or(0));
|
||||
}
|
||||
|
||||
/// Open the dialog with the document's font `selected` (an index into `text.fonts`) chosen.
|
||||
/// Open the dialog with the document's font `selected` (an index into `text.fonts`) chosen, and
|
||||
/// System's font ([`system_family`]) to change to.
|
||||
fn open_at(app: &mut VectorcraftApp, selected: usize) {
|
||||
app.ui.dialog = Some(Dialog::new("findFont", json!({ "selected": selected, "family": "Source Sans 3", "style": "", "selectionOnly": false })));
|
||||
app.ui.dialog = Some(Dialog::new(
|
||||
"findFont",
|
||||
json!({ "selected": selected, "family": system_family(), "style": "", "selectionOnly": false, "replaceFrom": "system" }),
|
||||
));
|
||||
}
|
||||
|
||||
/// The font System chooses: Source Sans 3 when it is installed, otherwise the font menu's first
|
||||
/// family (none when the menu is empty).
|
||||
fn system_family() -> String {
|
||||
system_family_in(installed, &vectorcraft_text::FontDb::global().menu_family_list())
|
||||
}
|
||||
|
||||
/// [`system_family`] for the installed check `is_installed` and the font menu `menu`.
|
||||
fn system_family_in(is_installed: impl Fn(&str) -> bool, menu: &[String]) -> String {
|
||||
const PREFERRED: &str = "Source Sans 3";
|
||||
if is_installed(PREFERRED) { PREFERRED.to_string() } else { menu.first().cloned().unwrap_or_default() }
|
||||
}
|
||||
|
||||
/// Replace With Font From's lists (the `replaceFrom` field): the document's fonts, the recent
|
||||
/// fonts and every installed font.
|
||||
const SOURCES: [&str; 3] = ["document", "recent", "system"];
|
||||
const SOURCE_LABELS: [&str; 3] = ["Document", "Recent", "System"];
|
||||
|
||||
/// The families Replace With Font From lists. `None` is System: the font menu, every installed
|
||||
/// family. Document lists the families `text.fonts` names, once each, in its order; Recent lists
|
||||
/// the font menu's recent families (newest first, Number of Recent Fonts at most) that are
|
||||
/// installed.
|
||||
fn replacement_families(app: &VectorcraftApp, source: &str, used: &[Value]) -> Option<Vec<String>> {
|
||||
let names: Vec<String> = match source {
|
||||
"document" => used.iter().filter_map(|f| f["family"].as_str()).map(str::to_string).collect(),
|
||||
"recent" => {
|
||||
let installed = vectorcraft_text::FontDb::global().menu_family_list();
|
||||
app.recent_fonts().iter().filter_map(|r| installed.iter().find(|f| f.eq_ignore_ascii_case(r)).cloned()).collect()
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
let mut out: Vec<String> = vec![];
|
||||
for n in names {
|
||||
if !out.iter().any(|o| o.eq_ignore_ascii_case(&n)) {
|
||||
out.push(n);
|
||||
}
|
||||
}
|
||||
Some(out)
|
||||
}
|
||||
|
||||
/// Is `family` installed: it resolves to a face of its own, as `text.replaceFont` requires.
|
||||
fn installed(family: &str) -> bool {
|
||||
!family.is_empty()
|
||||
&& vectorcraft_text::FontDb::global().resolve(family, "Regular").is_some_and(|(_, m)| m != vectorcraft_text::FontMatch::Missing)
|
||||
}
|
||||
|
||||
/// Can Change and Change All replace with the dialog's font: a family is chosen, it is installed,
|
||||
/// and it is one of the list Replace With Font From shows (System's list is the font menu).
|
||||
fn can_replace(d: &Dialog, families: Option<&[String]>) -> bool {
|
||||
let family = d.str("family");
|
||||
match families {
|
||||
Some(list) => can_replace_in(&family, installed, list),
|
||||
None => can_replace_in(&family, installed, &vectorcraft_text::FontDb::global().menu_family_list()),
|
||||
}
|
||||
}
|
||||
|
||||
/// [`can_replace`] for the installed check `is_installed` and the shown list `list`.
|
||||
fn can_replace_in(family: &str, is_installed: impl Fn(&str) -> bool, list: &[String]) -> bool {
|
||||
is_installed(family) && list.iter().any(|f| f.eq_ignore_ascii_case(family))
|
||||
}
|
||||
|
||||
/// Show list `source` ([`SOURCES`]): the chosen family stays when the list has it and it is
|
||||
/// installed, otherwise the list's first installed family (none when there is none) is chosen in
|
||||
/// its closest style. System chooses [`system_family`].
|
||||
fn set_source(app: &VectorcraftApp, d: &mut Dialog, source: &str, used: &[Value]) {
|
||||
d.fields.insert("replaceFrom".into(), json!(source));
|
||||
let families = replacement_families(app, source, used);
|
||||
if can_replace(d, families.as_deref()) {
|
||||
return;
|
||||
}
|
||||
let family = match families {
|
||||
Some(l) => l.into_iter().find(|f| installed(f)),
|
||||
None => Some(system_family()),
|
||||
};
|
||||
d.fields.insert("family".into(), json!(family.unwrap_or_default()));
|
||||
d.fields.insert("style".into(), json!(""));
|
||||
}
|
||||
|
||||
fn fonts(app: &mut VectorcraftApp) -> Vec<Value> {
|
||||
@@ -81,13 +163,31 @@ pub fn show(app: &mut VectorcraftApp, ctx: &egui::Context) {
|
||||
}
|
||||
ui.add_space(10.0);
|
||||
widgets::subheader(ui, tl!("Replace With Font"));
|
||||
let source = d.str("replaceFrom");
|
||||
ui.horizontal(|ui| {
|
||||
widgets::field_label(ui, tl!("Replace With Font From"));
|
||||
let at = SOURCES.iter().position(|s| *s == source).unwrap_or(2);
|
||||
if let Some(i) = widgets::dropdown_named(ui, "ff-from", Some(tl!("Replace With Font From")), SOURCE_LABELS[at], &SOURCE_LABELS, 120.0) {
|
||||
set_source(app, &mut d, SOURCES[i], &list);
|
||||
}
|
||||
});
|
||||
let families = replacement_families(app, &d.str("replaceFrom"), &list);
|
||||
let fam = d.str("family");
|
||||
ui.horizontal(|ui| {
|
||||
// Picks the font only: nothing is previewed on the document.
|
||||
let pick = font_menu::font_menu(ui, "ff-family", &fam, 220.0, sample.as_deref(), font_menu::MenuLook::of(app));
|
||||
if let Some((f, style)) = font_menu::picked(app, pick) {
|
||||
d.fields.insert("family".into(), json!(f));
|
||||
d.fields.insert("style".into(), json!(style.unwrap_or_default()));
|
||||
if let Some(families) = &families {
|
||||
// Font names are shown as they are.
|
||||
let names: Vec<&str> = families.iter().map(String::as_str).collect();
|
||||
if let Some(i) = widgets::dropdown_names_named(ui, "ff-family-list", Some(tl!("Replace With Font")), &fam, &names, 220.0) {
|
||||
d.fields.insert("family".into(), json!(families[i]));
|
||||
d.fields.insert("style".into(), json!(""));
|
||||
}
|
||||
} else {
|
||||
// Picks the font only: nothing is previewed on the document.
|
||||
let pick = font_menu::font_menu(ui, "ff-family", &fam, 220.0, sample.as_deref(), font_menu::MenuLook::of(app));
|
||||
if let Some((f, style)) = font_menu::picked(app, pick) {
|
||||
d.fields.insert("family".into(), json!(f));
|
||||
d.fields.insert("style".into(), json!(style.unwrap_or_default()));
|
||||
}
|
||||
}
|
||||
let styles = vectorcraft_text::FontDb::global().styles(&d.str("family"));
|
||||
// "(closest)" is ours; the font's style names are shown as they are.
|
||||
@@ -101,15 +201,17 @@ pub fn show(app: &mut VectorcraftApp, ctx: &egui::Context) {
|
||||
}
|
||||
});
|
||||
ui.add_space(14.0);
|
||||
// An empty list (Recent before any font was applied) leaves nothing to change to.
|
||||
let replace = sel < list.len() && can_replace(&d, families.as_deref());
|
||||
ui.horizontal(|ui| {
|
||||
let has = sel < list.len();
|
||||
if ui.add_enabled(has, egui::Button::new(tl!("Find"))).clicked() {
|
||||
act = Some("find");
|
||||
}
|
||||
if ui.add_enabled(has, egui::Button::new(tl!("Change"))).on_hover_text(tl!("In the selected objects")).clicked() {
|
||||
if ui.add_enabled(replace, egui::Button::new(tl!("Change"))).on_hover_text(tl!("In the selected objects")).clicked() {
|
||||
act = Some("change");
|
||||
}
|
||||
if ui.add_enabled(has, egui::Button::new(tl!("Change All"))).clicked() {
|
||||
if ui.add_enabled(replace, egui::Button::new(tl!("Change All"))).clicked() {
|
||||
act = Some("changeAll");
|
||||
}
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
@@ -225,6 +327,194 @@ mod tests {
|
||||
crate::dialogs::cancel(&mut app);
|
||||
}
|
||||
|
||||
/// A document set in Inter and Source Serif 4 (Inter twice), with Inter the one recent font.
|
||||
fn two_font_document() -> VectorcraftApp {
|
||||
let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default());
|
||||
app.session.execute("file.new", &json!({"width": 100, "height": 100})).unwrap();
|
||||
for (y, font) in [(20, "Inter"), (40, "Source Serif 4"), (60, "Inter")] {
|
||||
app.session.execute("text.create", &json!({"x": 10, "y": y, "text": "Hi", "font": font})).unwrap();
|
||||
}
|
||||
app.ui.recent_fonts = vec!["Inter".into()];
|
||||
app
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn replace_with_font_from_lists_the_document_s_recent_or_installed_fonts() {
|
||||
let mut app = two_font_document();
|
||||
let used = fonts(&mut app);
|
||||
let mut document = replacement_families(&app, "document", &used).unwrap();
|
||||
document.sort();
|
||||
assert_eq!(document, ["Inter", "Source Serif 4"]);
|
||||
assert_eq!(replacement_families(&app, "recent", &used).unwrap(), ["Inter"]);
|
||||
assert_eq!(replacement_families(&app, "system", &used), None, "System is the font menu of every installed family");
|
||||
open(&mut app);
|
||||
assert_eq!(app.ui.dialog.as_ref().unwrap().str("replaceFrom"), "system");
|
||||
for source in SOURCES {
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
set_source(&app, &mut d, source, &used);
|
||||
let listed = replacement_families(&app, source, &used);
|
||||
assert!(can_replace(&d, listed.as_deref()), "{source}: {}", d.str("family"));
|
||||
app.ui.dialog = Some(d);
|
||||
let text = crate::tests_labels::painted_text(&mut app, |app, ui| show(app, ui.ctx()));
|
||||
assert!(text.contains("Replace With Font From"), "{text}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn change_all_replaces_with_a_font_from_the_document() {
|
||||
let mut app = two_font_document();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
set_source(&app, &mut d, "document", &used);
|
||||
d.fields.insert("family".into(), json!("Inter"));
|
||||
let from = used.iter().find(|f| f["family"] == "Source Serif 4").unwrap().clone();
|
||||
change(&mut app, &d, &from, true).unwrap();
|
||||
let families: Vec<Value> = fonts(&mut app).iter().map(|f| f["family"].clone()).collect();
|
||||
assert_eq!(families, [json!("Inter")]);
|
||||
}
|
||||
|
||||
/// A font applied with Change All becomes Recent's first family.
|
||||
#[test]
|
||||
fn change_all_adds_the_new_font_to_recent() {
|
||||
let mut app = two_font_document();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
d.fields.insert("family".into(), json!("Source Serif 4"));
|
||||
let from = used.iter().find(|f| f["family"] == "Inter").unwrap().clone();
|
||||
change(&mut app, &d, &from, true).unwrap();
|
||||
let used = fonts(&mut app);
|
||||
assert_eq!(replacement_families(&app, "recent", &used).unwrap(), ["Source Serif 4", "Inter"]);
|
||||
}
|
||||
|
||||
/// A Change All that changes no text (the font's only text is locked) leaves Recent as it was.
|
||||
#[test]
|
||||
fn a_change_all_that_changes_nothing_leaves_recent_unchanged() {
|
||||
let mut app = two_font_document();
|
||||
app.run("select.font", json!({"family": "Source Serif 4"})).unwrap();
|
||||
app.run("object.lock", json!({})).unwrap();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
d.fields.insert("family".into(), json!("Source Sans 3"));
|
||||
let from = used.iter().find(|f| f["family"] == "Source Serif 4").unwrap().clone();
|
||||
assert_eq!(change(&mut app, &d, &from, true).unwrap()["runs"], 0);
|
||||
assert_eq!(app.ui.recent_fonts, ["Inter"]);
|
||||
}
|
||||
|
||||
/// Change to another name of an installed family records the family's own name in Recent.
|
||||
#[test]
|
||||
fn change_records_the_family_s_own_name_in_recent() {
|
||||
let mut app = two_font_document();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
d.fields.insert("family".into(), json!("SourceSerif4-Regular"));
|
||||
let from = used.iter().find(|f| f["family"] == "Inter").unwrap().clone();
|
||||
assert_eq!(change(&mut app, &d, &from, true).unwrap()["runs"], 2);
|
||||
assert_eq!(app.ui.recent_fonts, ["Source Serif 4", "Inter"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn an_empty_recent_list_leaves_nothing_to_change_to() {
|
||||
let mut app = two_font_document();
|
||||
app.ui.recent_fonts.clear();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
set_source(&app, &mut d, "recent", &used);
|
||||
assert_eq!(replacement_families(&app, "recent", &used).unwrap(), Vec::<String>::new());
|
||||
assert_eq!(d.str("family"), "");
|
||||
assert!(!can_replace(&d, Some(&[])));
|
||||
app.ui.dialog = Some(d);
|
||||
let text = crate::tests_labels::painted_text(&mut app, |app, ui| show(app, ui.ctx()));
|
||||
assert!(text.contains("Recent"), "{text}");
|
||||
assert_eq!(app.ui.status, "");
|
||||
}
|
||||
|
||||
/// Document lists a missing family, but Change and Change All stay off for it, in every list.
|
||||
#[test]
|
||||
fn a_missing_document_font_is_listed_but_not_offered_to_change_to() {
|
||||
let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default());
|
||||
app.session.execute("file.new", &json!({"width": 100, "height": 100})).unwrap();
|
||||
for (y, font) in [(20, "Missing Family"), (40, "Inter")] {
|
||||
app.session.execute("text.create", &json!({"x": 10, "y": y, "text": "Hi", "font": font})).unwrap();
|
||||
}
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let document = replacement_families(&app, "document", &used).unwrap();
|
||||
assert!(document.iter().any(|f| f == "Missing Family"), "{document:?}");
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
d.fields.insert("family".into(), json!("Missing Family"));
|
||||
set_source(&app, &mut d, "document", &used);
|
||||
assert_eq!(d.str("family"), "Inter", "the first installed family is chosen");
|
||||
assert!(can_replace(&d, Some(&document)));
|
||||
d.fields.insert("family".into(), json!("Missing Family"));
|
||||
assert!(!can_replace(&d, Some(&document)));
|
||||
assert!(!can_replace(&d, None), "System");
|
||||
set_source(&app, &mut d, "system", &used);
|
||||
assert!(can_replace(&d, None), "System chooses an installed family: {}", d.str("family"));
|
||||
// A document set only in a missing family leaves nothing to change to.
|
||||
app.session.execute("file.new", &json!({"width": 100, "height": 100})).unwrap();
|
||||
app.session.execute("text.create", &json!({"x": 10, "y": 20, "text": "Hi", "font": "Missing Family"})).unwrap();
|
||||
let used = fonts(&mut app);
|
||||
set_source(&app, &mut d, "document", &used);
|
||||
assert_eq!(d.str("family"), "");
|
||||
assert!(!can_replace(&d, replacement_families(&app, "document", &used).as_deref()));
|
||||
}
|
||||
|
||||
/// An empty Recent list clears the font; System then chooses an installed one again.
|
||||
#[test]
|
||||
fn system_after_an_empty_recent_list_chooses_an_installed_font() {
|
||||
let mut app = two_font_document();
|
||||
app.ui.recent_fonts.clear();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
set_source(&app, &mut d, "recent", &used);
|
||||
assert_eq!(d.str("family"), "");
|
||||
set_source(&app, &mut d, "system", &used);
|
||||
assert_eq!((d.str("family").as_str(), d.str("style").as_str()), ("Source Sans 3", ""));
|
||||
assert!(can_replace(&d, None));
|
||||
}
|
||||
|
||||
/// The dialog opens on System's font: Source Sans 3 when it is installed, otherwise the font
|
||||
/// menu's first family.
|
||||
#[test]
|
||||
fn the_dialog_opens_on_an_installed_font() {
|
||||
let menu = ["Inter".to_string(), "Source Serif 4".to_string()];
|
||||
assert_eq!(system_family_in(|_| true, &menu), "Source Sans 3");
|
||||
assert_eq!(system_family_in(|f| f != "Source Sans 3", &menu), "Inter");
|
||||
assert_eq!(system_family_in(|_| false, &[]), "");
|
||||
let mut app = two_font_document();
|
||||
open(&mut app);
|
||||
let d = app.ui.dialog.clone().unwrap();
|
||||
assert_eq!(d.str("family"), system_family());
|
||||
assert!(can_replace(&d, None), "{}", d.str("family"));
|
||||
}
|
||||
|
||||
/// A family that is installed but left out of the font menu (a hidden `.` family that
|
||||
/// Document lists) cannot be changed to from System.
|
||||
#[test]
|
||||
fn system_offers_only_the_font_menu_s_families() {
|
||||
let menu = ["Inter".to_string()];
|
||||
assert!(can_replace_in("inter", |_| true, &menu));
|
||||
assert!(!can_replace_in(".Hidden", |_| true, &menu));
|
||||
assert!(!can_replace_in("Inter", |_| false, &menu));
|
||||
let hidden = vectorcraft_text::FontDb::global().family_list().iter().find(|f| f.starts_with('.') && installed(f)).cloned();
|
||||
if let Some(hidden) = hidden {
|
||||
let mut app = two_font_document();
|
||||
open(&mut app);
|
||||
let used = fonts(&mut app);
|
||||
let mut d = app.ui.dialog.clone().unwrap();
|
||||
d.fields.insert("family".into(), json!(hidden));
|
||||
assert!(!can_replace(&d, None), "{hidden}");
|
||||
set_source(&app, &mut d, "system", &used);
|
||||
assert_eq!(d.str("family"), system_family());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rows_flag_missing_fonts_substituted_styles_and_lacking_characters() {
|
||||
let row = |status: &str, glyphs: u64| json!({"status": status, "resolved": {"style": "W4"}, "missingGlyphs": glyphs});
|
||||
|
||||
@@ -2640,6 +2640,8 @@ digits Malayalam Малаялам
|
||||
Replace Spine Замяна на оста
|
||||
Replace Symbol Замяна на символ
|
||||
Replace With Font Замяна с шрифт
|
||||
Replace With Font From Замяна с шрифт от
|
||||
System Система
|
||||
Replaces the saved preset of that name. Заменя записаната предварителна настройка с това име.
|
||||
Replace… Замяна…
|
||||
Require a password to open the document Изискване на парола за отваряне на документа
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3918,6 +3918,8 @@ effect Regular Obično
|
||||
In the selected objects U odabranim objektima
|
||||
Find in Folder… Pronađi u folderu…
|
||||
Replace With Font Zamijeni fontom
|
||||
Replace With Font From Zamijeni fontom iz
|
||||
System Sistem
|
||||
— substituted by {style} — zamijenjeno stilom {style}
|
||||
— {n} characters from another font — {n} znakova iz drugog fonta
|
||||
All Scripts Sve skripte
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3340,6 +3340,8 @@ digits Malayalam Malaiàlam
|
||||
Replace Spine Reemplaça l’espina
|
||||
Replace Symbol Reemplaça el símbol
|
||||
Replace With Font Reemplaça per un tipus de lletra
|
||||
Replace With Font From Reemplaça per un tipus de lletra de
|
||||
System Sistema
|
||||
Replace “{name}”, the file this document was opened from? Voleu reemplaçar “{name}”, el fitxer amb què es va obrir aquest document?
|
||||
Replaces the saved preset of that name. Reemplaça el preajust desat amb aquest nom.
|
||||
Replace… Reemplaça…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3960,6 +3960,8 @@ effect Regular Pravidelný
|
||||
In the selected objects Ve vybraných objektech
|
||||
Find in Folder… Najít ve složce…
|
||||
Replace With Font Nahradit písmem
|
||||
Replace With Font From Nahradit písmem z
|
||||
System Systém
|
||||
— substituted by {style} — nahrazeno řezem {style}
|
||||
— {n} characters from another font — znaky z jiného písma: {n}
|
||||
All Scripts Všechny systémy písma
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3680,6 +3680,8 @@ effect Regular Regular
|
||||
In the selected objects I de markerede objekter
|
||||
Find in Folder… Find i mappe…
|
||||
Replace With Font Erstat med skrifttype
|
||||
Replace With Font From Erstat med skrifttype fra
|
||||
System System
|
||||
— substituted by {style} — erstattet af {style}
|
||||
— {n} characters from another font — {n} tegn fra en anden skrifttype
|
||||
All Scripts Alle scripts
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2667,6 +2667,8 @@ digits Malayalam Malayalam
|
||||
Replace Spine Achse ersetzen
|
||||
Replace Symbol Symbol ersetzen
|
||||
Replace With Font Durch Schrift ersetzen
|
||||
Replace With Font From Ersetzende Schrift aus
|
||||
System System
|
||||
Replaces the saved preset of that name. Ersetzt die gespeicherte Vorgabe dieses Namens.
|
||||
Replace… Ersetzen…
|
||||
Require a password to open the document Kennwort zum Öffnen des Dokuments verlangen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3263,6 +3263,8 @@ digits Malayalam Μαλαγιάλαμ
|
||||
Replace Spine Αντικατάσταση κεντρικής καμπύλης
|
||||
Replace Symbol Αντικατάσταση συμβόλου
|
||||
Replace With Font Αντικατάσταση με γραμματοσειρά
|
||||
Replace With Font From Αντικατάσταση με γραμματοσειρά από
|
||||
System Σύστημα
|
||||
Replaces the saved preset of that name. Αντικαθιστά την αποθηκευμένη προεπιλογή με αυτό το όνομα.
|
||||
Require a password to open the document Απαίτηση κωδικού για το άνοιγμα εγγράφου
|
||||
Reset Bounding Box Επαναφορά πλαισίου οριοθέτησης
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 163 and column 5.
|
@@ -2710,6 +2710,8 @@ digits Malayalam Malayálam
|
||||
Replace Spine Reemplazar eje
|
||||
Replace Symbol Reemplazar símbolo
|
||||
Replace With Font Reemplazar con fuente
|
||||
Replace With Font From Reemplazar con fuente de
|
||||
System Sistema
|
||||
Replaces the saved preset of that name. Reemplaza el preajuste guardado con ese nombre.
|
||||
Replace… Reemplazar…
|
||||
Require a password to open the document Solicitar una contraseña para abrir el documento
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3879,6 +3879,8 @@ effect Regular Normaali
|
||||
In the selected objects Valituissa objekteissa
|
||||
Find in Folder… Etsi kansiosta…
|
||||
Replace With Font Korvaa fontilla
|
||||
Replace With Font From Korvaavan fontin lähde
|
||||
System Järjestelmä
|
||||
— substituted by {style} — korvattu tyylillä {style}
|
||||
— {n} characters from another font — {n} merkkiä toisesta fontista
|
||||
All Scripts Kaikki kirjoitusjärjestelmät
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2702,6 +2702,8 @@ digits Malayalam Malayalam
|
||||
Replace Spine Remplacer la dorsale
|
||||
Replace Symbol Remplacer le symbole
|
||||
Replace With Font Remplacer par la police
|
||||
Replace With Font From Remplacer par une police de
|
||||
System Système
|
||||
Replaces the saved preset of that name. Remplace le paramètre prédéfini enregistré sous ce nom.
|
||||
Replace… Remplacer…
|
||||
Require a password to open the document Exiger un mot de passe pour ouvrir le document
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3236,6 +3236,8 @@ mark-style Japanese Japán
|
||||
Replace Spine Gerinc cseréje
|
||||
Replace Symbol Szimbólum cseréje
|
||||
Replace With Font Helyettesítő betűtípus
|
||||
Replace With Font From Helyettesítő betűtípus forrása
|
||||
System Rendszer
|
||||
Replace “{name}”, the file this document was opened from? Felülírod ezt a fájlt, amelyből a dokumentumot megnyitottad: „{name}”?
|
||||
Replaces the saved preset of that name. Felülírja az azonos nevű mentett előbeállítást.
|
||||
Replace… Csere…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3680,6 +3680,8 @@ effect Regular Reguler
|
||||
In the selected objects Di objek yang dipilih
|
||||
Find in Folder… Temukan di folder…
|
||||
Replace With Font Ganti dengan font
|
||||
Replace With Font From Ganti dengan font dari
|
||||
System Sistem
|
||||
— substituted by {style} — digantikan oleh {style}
|
||||
— {n} characters from another font — {n} karakter dari font lain
|
||||
All Scripts Semua skrip
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2211 and column 5.
|
@@ -2743,6 +2743,8 @@ digits Malayalam Malayalam
|
||||
Replace Spine Sostituisci dorsale
|
||||
Replace Symbol Sostituisci simbolo
|
||||
Replace With Font Sostituisci con font
|
||||
Replace With Font From Sostituisci con font da
|
||||
System Sistema
|
||||
Replaces the saved preset of that name. Sostituisce il preset salvato con quel nome.
|
||||
Replace… Sostituisci…
|
||||
Require a password to open the document Richiedi una password per aprire il documento
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2728,6 +2728,8 @@ mark-style Japanese 日本式
|
||||
Replace Font フォントを置換
|
||||
Replace Symbol シンボルを置き換え
|
||||
Replace With Font 置換するフォント
|
||||
Replace With Font From 置換するフォントの一覧
|
||||
System システム
|
||||
Replace it with another file, or ignore it: its images keep showing the preview saved with the document. 別のファイルに置き換えるか、無視してください。無視した場合、画像にはドキュメントに保存されたプレビューが表示され続けます。
|
||||
Replaces the saved preset of that name. 同じ名前の保存済みプリセットを置き換えます。
|
||||
Replace… 置換…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3463,6 +3463,8 @@ effect Regular ჩვეულებრივი
|
||||
In the selected objects მონიშნულ ობიექტებში
|
||||
Find in Folder… საქაღალდეში ძებნა…
|
||||
Replace With Font ჩანაცვლება შრიფტით
|
||||
Replace With Font From ჩანაცვლების შრიფტის წყარო
|
||||
System სისტემა
|
||||
— substituted by {style} — ჩანაცვლებულია: {style}
|
||||
— {n} characters from another font — სხვა შრიფტის სიმბოლოები: {n}
|
||||
All Scripts ყველა დამწერლობა
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -2717,6 +2717,8 @@ mark-style Japanese 일본식
|
||||
Replace Font 글꼴 바꾸기
|
||||
Replace Symbol 심볼 바꾸기
|
||||
Replace With Font 바꿀 글꼴
|
||||
Replace With Font From 바꿀 글꼴 목록
|
||||
System 시스템
|
||||
Replace it with another file, or ignore it: its images keep showing the preview saved with the document. 다른 파일로 바꾸거나 무시하세요. 무시하면 해당 이미지는 문서에 저장된 미리 보기로 계속 표시됩니다.
|
||||
Replaces the saved preset of that name. 같은 이름으로 저장된 사전 설정을 대체합니다.
|
||||
Replace… 바꾸기…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3694,6 +3694,8 @@ effect Regular Regelmatig
|
||||
In the selected objects In de geselecteerde objecten
|
||||
Find in Folder… Zoeken in map…
|
||||
Replace With Font Vervangen door lettertype
|
||||
Replace With Font From Vervangen door lettertype uit
|
||||
System Systeem
|
||||
— substituted by {style} — vervangen door {style}
|
||||
— {n} characters from another font — {n} tekens van een ander lettertype
|
||||
All Scripts Alle scripts
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3800,6 +3800,8 @@ effect Regular Normalny
|
||||
In the selected objects W zaznaczonych obiektach
|
||||
Find in Folder… Znajdź w folderze…
|
||||
Replace With Font Zastąp czcionką
|
||||
Replace With Font From Zastąp czcionką z
|
||||
System System
|
||||
— substituted by {style} — zastąpiona przez {style}
|
||||
— {n} characters from another font — znaki z innej czcionki: {n}
|
||||
All Scripts Wszystkie skrypty
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2258,6 +2258,8 @@ digits Malayalam Malaiala
|
||||
Replace Spine Substituir Coluna
|
||||
Replace Symbol Substituir Símbolo
|
||||
Replace With Font Substituir Com Fonte
|
||||
Replace With Font From Substituir Com Fonte De
|
||||
System Sistema
|
||||
Replace it with another file, or ignore it: its images keep showing the preview saved with the document. Substitua por outro arquivo, ou ignore-o: suas imagens continuam mostrando a pré-visualização salva com o documento.
|
||||
Replaces the saved preset of that name. Substitui o predefinido salvo com esse nome.
|
||||
Replace… Substituir…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -2738,6 +2738,8 @@ digits Malayalam Малаялам
|
||||
Replace Spine Заменить остов
|
||||
Replace Symbol Заменить символ
|
||||
Replace With Font Заменить шрифтом
|
||||
Replace With Font From Заменить шрифтом из
|
||||
System Система
|
||||
Replaces the saved preset of that name. Заменяет сохранённый набор с таким именем.
|
||||
Replace… Заменить…
|
||||
Require a password to open the document Требовать пароль для открытия документа
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2646,6 +2646,8 @@ digits Malayalam Malayalam
|
||||
Replace Spine Ersätt ryggrad
|
||||
Replace Symbol Ersätt symbol
|
||||
Replace With Font Ersätt med typsnitt
|
||||
Replace With Font From Ersätt med typsnitt från
|
||||
System System
|
||||
Replaces the saved preset of that name. Ersätter den sparade förinställningen med samma namn.
|
||||
Replace… Ersätt…
|
||||
Require a password to open the document Kräv lösenord för att öppna dokumentet
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -2517,6 +2517,8 @@ digits Malayalam Malayalam
|
||||
Replace Spine Omurgayı Değiştir
|
||||
Replace Symbol Sembolü Değiştir
|
||||
Replace With Font Yazı Tipiyle Değiştir
|
||||
Replace With Font From Değiştirilecek Yazı Tipi Kaynağı
|
||||
System Sistem
|
||||
Replaces the saved preset of that name. Bu adın kayıtlı ön ayarını değiştirir.
|
||||
Replace… Değiştir…
|
||||
Require a password to open the document Belgeyi açmak için parola gerektir
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -2735,6 +2735,8 @@ digits Malayalam Малаялам
|
||||
Replace Spine Замінити вісь
|
||||
Replace Symbol Замінити символ
|
||||
Replace With Font Замінити шрифтом
|
||||
Replace With Font From Замінити шрифтом з
|
||||
System Система
|
||||
Replaces the saved preset of that name. Замінює збережений набір із таким ім’ям.
|
||||
Replace… Замінити…
|
||||
Require a password to open the document Вимагати пароль для відкриття документа
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 177 and column 5.
|
@@ -3004,6 +3004,8 @@ mark-style Japanese Kiểu Nhật
|
||||
Replace Spine Thay thế trục
|
||||
Replace Symbol Thay thế ký hiệu
|
||||
Replace With Font Thay thế bằng phông chữ
|
||||
Replace With Font From Thay thế bằng phông chữ từ
|
||||
System Hệ thống
|
||||
Replace “{name}”, the file this document was opened from? Thay thế “{name}”, tệp mà tài liệu này được mở từ đó?
|
||||
Replaces the saved preset of that name. Thay thế thiết lập sẵn đã lưu có tên đó.
|
||||
Replace… Thay thế…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 199 and column 5.
|
@@ -2613,6 +2613,8 @@ digits Malayalam 马拉雅拉姆数字
|
||||
Replace Spine 替换脊线
|
||||
Replace Symbol 替换符号
|
||||
Replace With Font 替换为字体
|
||||
Replace With Font From 替换字体来源
|
||||
System 系统
|
||||
Replaces the saved preset of that name. 替换同名已存预设。
|
||||
Replace… 替换…
|
||||
Require a password to open the document 打开文档时需要密码
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -3595,6 +3595,8 @@ digits Malayalam 馬來亞拉姆數字
|
||||
Replace Spine 取代脊線
|
||||
Replace Symbol 取代符號
|
||||
Replace With Font 取代為字體
|
||||
Replace With Font From 取代字體來源
|
||||
System 系統
|
||||
Replaces the saved preset of that name. 取代同名的已儲存預設集。
|
||||
Replace… 取代…
|
||||
Require a password to open the document 開啟文件時需要密碼
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user