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:
dotCooCoo
2026-11-03 16:38:24 +07:00
committed by bflatastic
parent af17c648c0
commit fbab0bdd43
29 changed files with 369 additions and 14 deletions
+15 -3
View File
@@ -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 = &params["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
View File
@@ -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});
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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.
+2
View File
@@ -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