From 0c40e0a6557998abb3c3a3ecb2f677b2c197a099 Mon Sep 17 00:00:00 2001 From: u8array Date: Mon, 5 Oct 2026 22:19:55 +0200 Subject: [PATCH] chore(fonts): shared issue texts, an Add label and a tolerant name reader --- src-tauri/src/system_fonts.rs | 68 ++++++++++++++----- src/components/Fonts/AddFontDialog.tsx | 7 +- .../Fonts/FontManager.systemFonts.test.tsx | 2 +- src/components/Fonts/FontManager.test.tsx | 2 +- .../PrinterSettings/StoredFontsTab.tsx | 3 +- src/lib/fontNameIssueText.ts | 7 ++ src/locales/ar.ts | 3 +- src/locales/bg.ts | 3 +- src/locales/cs.ts | 3 +- src/locales/da.ts | 3 +- src/locales/de.ts | 3 +- src/locales/el.ts | 3 +- src/locales/en.ts | 3 +- src/locales/es.ts | 3 +- src/locales/et.ts | 3 +- src/locales/fa.ts | 3 +- src/locales/fi.ts | 3 +- src/locales/fr.ts | 3 +- src/locales/he.ts | 3 +- src/locales/hr.ts | 3 +- src/locales/hu.ts | 3 +- src/locales/it.ts | 3 +- src/locales/ja.ts | 3 +- src/locales/ko.ts | 3 +- src/locales/lt.ts | 3 +- src/locales/lv.ts | 3 +- src/locales/nl.ts | 3 +- src/locales/no.ts | 3 +- src/locales/pl.ts | 3 +- src/locales/pt.ts | 3 +- src/locales/ro.ts | 3 +- src/locales/sk.ts | 3 +- src/locales/sl.ts | 3 +- src/locales/sr.ts | 3 +- src/locales/sv.ts | 3 +- src/locales/tr.ts | 3 +- src/locales/zh-hans.ts | 3 +- src/locales/zh-hant.ts | 3 +- src/test/systemFontCap.test.ts | 2 +- 39 files changed, 131 insertions(+), 56 deletions(-) create mode 100644 src/lib/fontNameIssueText.ts diff --git a/src-tauri/src/system_fonts.rs b/src-tauri/src/system_fonts.rs index 3f51692f..83a44713 100644 --- a/src-tauri/src/system_fonts.rs +++ b/src-tauri/src/system_fonts.rs @@ -245,14 +245,21 @@ fn name_string(name: &[u8], id: u16) -> Option { let mut mac = None; for i in 0..count { let rec = 6 + i * 12; - if u16_at(name, rec + 6)? != id { + // Records are fixed and sequential, so a short one ends the table. + let Some(record) = name.get(rec..rec + 12) else { + break; + }; + if u16_at(record, 6)? != id { continue; } - let platform = u16_at(name, rec)?; - let encoding = u16_at(name, rec + 2)?; - let len = u16_at(name, rec + 8)? as usize; - let at = strings + u16_at(name, rec + 10)? as usize; - let data = name.get(at..at + len)?; + let platform = u16_at(record, 0)?; + let encoding = u16_at(record, 2)?; + let len = u16_at(record, 8)? as usize; + let at = strings + u16_at(record, 10)? as usize; + // One record pointing outside the table must not hide the others. + let Some(data) = name.get(at..at + len) else { + continue; + }; match (platform, encoding) { (3, 1) | (3, 10) | (0, _) => { let units: Vec = data @@ -314,17 +321,13 @@ mod tests { .collect::>() }; let (fam, sty) = (utf16(family), utf16(style)); - let mut name = Vec::new(); - name.extend(0u16.to_be_bytes()); - name.extend(2u16.to_be_bytes()); - name.extend((6u16 + 2 * 12).to_be_bytes()); - for (id, data, offset) in [(1u16, &fam, 0u16), (2, &sty, fam.len() as u16)] { - for v in [3u16, 1, 0x0409, id, data.len() as u16, offset] { - name.extend(v.to_be_bytes()); - } - } - name.extend(&fam); - name.extend(&sty); + let name = name_table( + &[ + [3, 1, 0x0409, 1, fam.len() as u16, 0], + [3, 1, 0x0409, 2, sty.len() as u16, fam.len() as u16], + ], + &[fam, sty].concat(), + ); let mut os2 = vec![0u8; 78]; os2[8..10].copy_from_slice(&fs_type.to_be_bytes()); let mut tables: Vec<(&[u8; 4], Vec)> = vec![ @@ -411,6 +414,37 @@ mod tests { assert!(!parse(&font("A", "B", 0x0008, false)).unwrap().restricted); } + /// Records as platform, encoding, language, id, length and offset into `pool`. + fn name_table(records: &[[u16; 6]], pool: &[u8]) -> Vec { + let mut table = Vec::new(); + table.extend(0u16.to_be_bytes()); + table.extend((records.len() as u16).to_be_bytes()); + table.extend((6 + 12 * records.len() as u16).to_be_bytes()); + for record in records { + for v in record { + table.extend(v.to_be_bytes()); + } + } + table.extend(pool); + table + } + + #[test] + fn skips_a_name_record_that_points_outside_the_table() { + let table = name_table( + &[[3, 1, 0x0409, 1, 2, 0xFFF0], [3, 1, 0x0409, 1, 2, 0]], + &[0, 65], + ); + assert_eq!(name_string(&table, 1).as_deref(), Some("A")); + } + + #[test] + fn keeps_the_fallback_name_when_the_record_count_overstates_the_table() { + let mut table = name_table(&[[1, 0, 0, 1, 1, 0]], b"B"); + table[2..4].copy_from_slice(&2u16.to_be_bytes()); + assert_eq!(name_string(&table, 1).as_deref(), Some("B")); + } + #[test] fn rejects_a_foreign_or_truncated_file() { assert!(parse(b"not a font at all").is_none()); diff --git a/src/components/Fonts/AddFontDialog.tsx b/src/components/Fonts/AddFontDialog.tsx index 98f8a2a7..240d5834 100644 --- a/src/components/Fonts/AddFontDialog.tsx +++ b/src/components/Fonts/AddFontDialog.tsx @@ -6,6 +6,7 @@ import { useT } from '../../hooks/useT'; import { useUpload } from '../../hooks/useUpload'; import { isDesktopShell } from '../../lib/platform'; import { systemFontFaceStyle } from '../../lib/fontFaceStyle'; +import { fontNameIssueText } from '../../lib/fontNameIssueText'; import { listSystemFonts, readSystemFont, type SystemFont } from '../../lib/systemFonts'; import { ariaDisabledCls, inputCls, labelCls } from '../ui/formStyles'; import { DialogShell } from '../ui/DialogShell'; @@ -152,7 +153,7 @@ export function AddFontDialog({ onDone }: AddFontDialogProps) { /> {issue && ( )} @@ -172,7 +173,7 @@ export function AddFontDialog({ onDone }: AddFontDialogProps) { aria-disabled={!canAdd} aria-busy={busy || undefined} > - {t.fonts.addFont} + {t.fonts.add} @@ -241,7 +242,7 @@ function SystemFontList({ autoFocus /> {fonts === null && !failed &&

…

} - {fonts !== null && fonts.length === 0 &&

{t.fonts.noSystemFonts}

} + {fonts !== null && fonts.length === 0 &&

{t.fonts.noInstalledFonts}

} {fonts !== null && fonts.length > 0 && shown.length === 0 &&

{t.fonts.noFilterMatch}

} {failed &&

{t.fonts.systemFontsFailed}

}
{ const open = (r: ReturnType) => fireEvent.click(r.getByText(en.fonts.addFont)); const add = (r: ReturnType) => - within(r.getByRole("dialog")).getByRole("button", { name: en.fonts.addFont }) as HTMLButtonElement; + within(r.getByRole("dialog")).getByRole("button", { name: en.fonts.add }) as HTMLButtonElement; const nameField = (r: ReturnType) => r.getByPlaceholderText(en.fonts.printerFilenamePlaceholder) as HTMLInputElement; describe("FontManager installed fonts", () => { diff --git a/src/components/Fonts/FontManager.test.tsx b/src/components/Fonts/FontManager.test.tsx index 93af1928..43a89a20 100644 --- a/src/components/Fonts/FontManager.test.tsx +++ b/src/components/Fonts/FontManager.test.tsx @@ -30,7 +30,7 @@ const addFile = async (r: ReturnType, file: File) => { fireEvent.change(input, { target: { files: [file] } }); }); await act(async () => { - fireEvent.click(within(r.getByRole("dialog")).getByRole("button", { name: "Add font" })); + fireEvent.click(within(r.getByRole("dialog")).getByRole("button", { name: "Add" })); }); }; diff --git a/src/components/PrinterSettings/StoredFontsTab.tsx b/src/components/PrinterSettings/StoredFontsTab.tsx index 14d7cb05..06bf855d 100644 --- a/src/components/PrinterSettings/StoredFontsTab.tsx +++ b/src/components/PrinterSettings/StoredFontsTab.tsx @@ -9,6 +9,7 @@ import { storageKey, storageRefMatchesPath } from "@zplab/core/lib/storagePath"; import { useCachedFonts } from "../../hooks/useCachedFonts"; import { useUpload } from "../../hooks/useUpload"; import { useLabelStore, selectEditorFrozen } from "../../store/labelStore"; +import { fontNameIssueText } from "../../lib/fontNameIssueText"; import { buttonCls, disabledCls } from "../ui/formStyles"; import { ConfirmDialog } from "../ui/ConfirmDialog"; @@ -91,7 +92,7 @@ export function StoredFontsTab() { {loc.uploadFont} - {uploadIssue && {{ error: loc.uploadError, notAFont: loc.uploadError, nameTaken: t.fonts.nameTaken, nameUnusable: t.fonts.nameUnusable, refused: t.printerSettings.frozenHint }[uploadIssue]}} + {uploadIssue && {{ error: loc.uploadError, notAFont: loc.uploadError, ...fontNameIssueText(t), refused: t.printerSettings.frozenHint }[uploadIssue]}}
{rows.length === 0 ? (

{loc.noFonts}

diff --git a/src/lib/fontNameIssueText.ts b/src/lib/fontNameIssueText.ts new file mode 100644 index 00000000..d0e3a0d6 --- /dev/null +++ b/src/lib/fontNameIssueText.ts @@ -0,0 +1,7 @@ +import type { FontNameIssue } from '@zplab/core/lib/customFonts'; +import type { Translations } from '../locales'; + +/** Both font pickers answer a name issue with the same wording. */ +export function fontNameIssueText(t: Translations): Record { + return { nameTaken: t.fonts.nameTaken, nameUnusable: t.fonts.nameUnusable }; +} diff --git a/src/locales/ar.ts b/src/locales/ar.ts index cebdf08b..2177a94a 100644 --- a/src/locales/ar.ts +++ b/src/locales/ar.ts @@ -1706,12 +1706,13 @@ const ar = { heading: 'الخطوط', noFonts: 'لا توجد خطوط محملة', addFont: 'إضافة خط', + add: 'إضافة', printerFilename: 'اسم ملف الطابعة', printerFilenamePlaceholder: 'مثال: ARIAL.TTF', upload: 'رفع', fromComputer: 'من هذا الكمبيوتر', filterFonts: 'تصفية الخطوط', - noSystemFonts: 'لا يوجد خط مثبت مناسب. يتم استثناء الخطوط التي يزيد حجمها عن 4 MiB ومجموعات الخطوط.', + noInstalledFonts: 'لا يوجد خط مثبت مناسب. يتم استثناء الخطوط التي يزيد حجمها عن 4 MiB ومجموعات الخطوط.', noFilterMatch: 'لا يوجد خط مثبت يطابق التصفية.', systemFontsFailed: 'تعذّر قراءة الخطوط المثبتة.', restrictedLicense: 'ترخيص الخط يمنع التضمين.', diff --git a/src/locales/bg.ts b/src/locales/bg.ts index 393ebf7e..154f7904 100644 --- a/src/locales/bg.ts +++ b/src/locales/bg.ts @@ -1706,12 +1706,13 @@ const bg = { heading: 'Шрифтове', noFonts: 'Няма заредени шрифтове', addFont: 'Добави шрифт', + add: 'Добавяне', printerFilename: 'Файлово наименование на принтера', printerFilenamePlaceholder: 'напр. ARIAL.TTF', upload: 'Качване', fromComputer: 'От този компютър', filterFonts: 'Филтриране на шрифтове', - noSystemFonts: 'Няма инсталиран шрифт, който да отговаря. Шрифтове над 4 MiB и шрифтови колекции се пропускат.', + noInstalledFonts: 'Няма инсталиран шрифт, който да отговаря. Шрифтове над 4 MiB и шрифтови колекции се пропускат.', noFilterMatch: 'Няма инсталиран шрифт, който да отговаря на филтъра.', systemFontsFailed: 'Неуспешно прочитане на инсталираните шрифтове.', restrictedLicense: 'Лицензът на шрифта не позволява вграждане.', diff --git a/src/locales/cs.ts b/src/locales/cs.ts index 1b363f4a..70512f25 100644 --- a/src/locales/cs.ts +++ b/src/locales/cs.ts @@ -1706,12 +1706,13 @@ const cs = { heading: 'Písma', noFonts: 'Žádná písma nenačtena', addFont: 'Přidat písmo', + add: 'Přidat', printerFilename: 'Název souboru tiskárny', printerFilenamePlaceholder: 'např. ARIAL.TTF', upload: 'Nahrát', fromComputer: 'Z tohoto počítače', filterFonts: 'Filtrovat písma', - noSystemFonts: 'Žádné nainstalované písmo nevyhovuje. Písma nad 4 MiB a kolekce písem se vynechávají.', + noInstalledFonts: 'Žádné nainstalované písmo nevyhovuje. Písma nad 4 MiB a kolekce písem se vynechávají.', noFilterMatch: 'Žádné nainstalované písmo neodpovídá filtru.', systemFontsFailed: 'Nainstalované fonty se nepodařilo načíst.', restrictedLicense: 'Licence písma zakazuje vložení.', diff --git a/src/locales/da.ts b/src/locales/da.ts index 18dacc97..b2289450 100644 --- a/src/locales/da.ts +++ b/src/locales/da.ts @@ -1706,12 +1706,13 @@ const da = { heading: 'Skrifttyper', noFonts: 'Ingen skrifttyper indlæst', addFont: 'Tilføj skrifttype', + add: 'Tilføj', printerFilename: 'Printerfilnavn', printerFilenamePlaceholder: 'f.eks. ARIAL.TTF', upload: 'Upload', fromComputer: 'Fra denne computer', filterFonts: 'Filtrer skrifttyper', - noSystemFonts: 'Ingen installeret skrifttype passer. Skrifttyper over 4 MiB og skrifttypesamlinger udelades.', + noInstalledFonts: 'Ingen installeret skrifttype passer. Skrifttyper over 4 MiB og skrifttypesamlinger udelades.', noFilterMatch: 'Ingen installeret skrifttype matcher filteret.', systemFontsFailed: 'De installerede skrifttyper kunne ikke læses.', restrictedLicense: 'Skrifttypens licens forbyder indlejring.', diff --git a/src/locales/de.ts b/src/locales/de.ts index 160c21d0..64ebc458 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -1744,12 +1744,13 @@ const de = { heading: 'Schriften', noFonts: 'Keine Schriften geladen', addFont: 'Schrift hinzufügen', + add: 'Hinzufügen', printerFilename: 'Druckerdateiname', printerFilenamePlaceholder: 'z. B. ARIAL.TTF', upload: 'Hochladen', fromComputer: 'Von diesem Computer', filterFonts: 'Schriften filtern', - noSystemFonts: 'Keine installierte Schrift passt. Schriften über 4 MiB und Schriftsammlungen werden ausgelassen.', + noInstalledFonts: 'Keine installierte Schrift passt. Schriften über 4 MiB und Schriftsammlungen werden ausgelassen.', noFilterMatch: 'Keine installierte Schrift passt zum Filter.', systemFontsFailed: 'Die installierten Schriftarten konnten nicht gelesen werden.', restrictedLicense: 'Die Lizenz dieser Schrift verbietet das Einbetten.', diff --git a/src/locales/el.ts b/src/locales/el.ts index 033ad309..33849d24 100644 --- a/src/locales/el.ts +++ b/src/locales/el.ts @@ -1706,12 +1706,13 @@ const el = { heading: 'Γραμματοσειρές', noFonts: 'Δεν φορτώθηκαν γραμματοσειρές', addFont: 'Προσθήκη γραμματοσειράς', + add: 'Προσθήκη', printerFilename: 'Όνομα αρχείου εκτυπωτή', printerFilenamePlaceholder: 'π.χ. ARIAL.TTF', upload: 'Μεταφόρτωση', fromComputer: 'Από αυτόν τον υπολογιστή', filterFonts: 'Φιλτράρισμα γραμματοσειρών', - noSystemFonts: 'Καμία εγκατεστημένη γραμματοσειρά δεν ταιριάζει. Γραμματοσειρές πάνω από 4 MiB και συλλογές γραμματοσειρών παραλείπονται.', + noInstalledFonts: 'Καμία εγκατεστημένη γραμματοσειρά δεν ταιριάζει. Γραμματοσειρές πάνω από 4 MiB και συλλογές γραμματοσειρών παραλείπονται.', noFilterMatch: 'Καμία εγκατεστημένη γραμματοσειρά δεν ταιριάζει με το φίλτρο.', systemFontsFailed: 'Δεν ήταν δυνατή η ανάγνωση των εγκατεστημένων γραμματοσειρών.', restrictedLicense: 'Η άδεια χρήσης της γραμματοσειράς δεν επιτρέπει την ενσωμάτωση.', diff --git a/src/locales/en.ts b/src/locales/en.ts index 24dde5b9..8650d3c1 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1744,12 +1744,13 @@ const en = { heading: 'Fonts', noFonts: 'No fonts loaded', addFont: 'Add font', + add: 'Add', printerFilename: 'Printer filename', printerFilenamePlaceholder: 'e.g. ARIAL.TTF', upload: 'Upload', fromComputer: 'From this computer', filterFonts: 'Filter fonts', - noSystemFonts: 'No installed font fits. Fonts above 4 MiB and font collections are left out.', + noInstalledFonts: 'No installed font fits. Fonts above 4 MiB and font collections are left out.', noFilterMatch: 'No installed font matches the filter.', systemFontsFailed: 'Could not read the installed fonts.', restrictedLicense: "The font's license forbids embedding.", diff --git a/src/locales/es.ts b/src/locales/es.ts index 1906441c..7d1c33e0 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -1706,12 +1706,13 @@ const es = { heading: 'Fuentes', noFonts: 'No hay fuentes cargadas', addFont: 'Agregar fuente', + add: 'Agregar', printerFilename: 'Nombre de archivo de impresora', printerFilenamePlaceholder: 'p. ej. ARIAL.TTF', upload: 'Subir', fromComputer: 'Desde este equipo', filterFonts: 'Filtrar fuentes', - noSystemFonts: 'Ninguna fuente instalada coincide. Las fuentes de más de 4 MiB y las colecciones de fuentes se excluyen.', + noInstalledFonts: 'Ninguna fuente instalada coincide. Las fuentes de más de 4 MiB y las colecciones de fuentes se excluyen.', noFilterMatch: 'Ninguna fuente instalada coincide con el filtro.', systemFontsFailed: 'No se pudieron leer las fuentes instaladas.', restrictedLicense: 'La licencia de la fuente prohíbe incrustarla.', diff --git a/src/locales/et.ts b/src/locales/et.ts index 3fb9df72..0e818d32 100644 --- a/src/locales/et.ts +++ b/src/locales/et.ts @@ -1706,12 +1706,13 @@ const et = { heading: 'Fondid', noFonts: 'Fonte pole laaditud', addFont: 'Lisa font', + add: 'Lisa', printerFilename: 'Printeri failinimi', printerFilenamePlaceholder: 'nt. ARIAL.TTF', upload: 'Laadi üles', fromComputer: 'Sellest arvutist', filterFonts: 'Filtreeri fonte', - noSystemFonts: 'Ükski installitud font ei sobi. Fondid üle 4 MiB ja fondikollektsioonid jäetakse välja.', + noInstalledFonts: 'Ükski installitud font ei sobi. Fondid üle 4 MiB ja fondikollektsioonid jäetakse välja.', noFilterMatch: 'Ükski installitud font ei vasta filtrile.', systemFontsFailed: 'Installitud fonte ei saanud lugeda.', restrictedLicense: 'Fondi litsents keelab manustamise.', diff --git a/src/locales/fa.ts b/src/locales/fa.ts index ddb6b54a..d9d8aaa3 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -1706,12 +1706,13 @@ const fa = { heading: 'فونت‌ها', noFonts: 'هیچ فونتی بارگذاری نشده', addFont: 'افزودن فونت', + add: 'افزودن', printerFilename: 'نام فایل چاپگر', printerFilenamePlaceholder: 'مثلاً ARIAL.TTF', upload: 'بارگذاری', fromComputer: 'از این کامپیوتر', filterFonts: 'فیلتر فونت‌ها', - noSystemFonts: 'هیچ فونت نصب‌شده‌ای مطابقت ندارد. فونت‌های بالای 4 MiB و مجموعه‌فونت‌ها کنار گذاشته می‌شوند.', + noInstalledFonts: 'هیچ فونت نصب‌شده‌ای مطابقت ندارد. فونت‌های بالای 4 MiB و مجموعه‌فونت‌ها کنار گذاشته می‌شوند.', noFilterMatch: 'هیچ فونت نصب‌شده‌ای با فیلتر مطابقت ندارد.', systemFontsFailed: 'خواندن فونت‌های نصب‌شده ممکن نبود.', restrictedLicense: 'مجوز فونت تعبیه را ممنوع می‌کند.', diff --git a/src/locales/fi.ts b/src/locales/fi.ts index 736d2f4f..ac129d1b 100644 --- a/src/locales/fi.ts +++ b/src/locales/fi.ts @@ -1706,12 +1706,13 @@ const fi = { heading: 'Fontit', noFonts: 'Ei ladattuja fontteja', addFont: 'Lisää fontti', + add: 'Lisää', printerFilename: 'Tulostimen tiedostonimi', printerFilenamePlaceholder: 'esim. ARIAL.TTF', upload: 'Lataa', fromComputer: 'Tästä tietokoneesta', filterFonts: 'Suodata fontteja', - noSystemFonts: 'Mikään asennettu fontti ei sovi. Fontit, joiden koko on yli 4 MiB, ja fonttikokoelmat jätetään pois.', + noInstalledFonts: 'Mikään asennettu fontti ei sovi. Fontit, joiden koko on yli 4 MiB, ja fonttikokoelmat jätetään pois.', noFilterMatch: 'Mikään asennettu fontti ei vastaa suodatinta.', systemFontsFailed: 'Asennettuja fontteja ei voitu lukea.', restrictedLicense: 'Fontin lisenssi kieltää upottamisen.', diff --git a/src/locales/fr.ts b/src/locales/fr.ts index cdb50c61..f5cc4819 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -1706,12 +1706,13 @@ const fr = { heading: 'Polices', noFonts: 'Aucune police chargée', addFont: 'Ajouter une police', + add: 'Ajouter', printerFilename: 'Nom de fichier imprimante', printerFilenamePlaceholder: 'ex. ARIAL.TTF', upload: 'Téléverser', fromComputer: 'Depuis cet ordinateur', filterFonts: 'Filtrer les polices', - noSystemFonts: 'Aucune police installée ne correspond. Les polices de plus de 4 MiB et les collections de polices sont exclues.', + noInstalledFonts: 'Aucune police installée ne correspond. Les polices de plus de 4 MiB et les collections de polices sont exclues.', noFilterMatch: 'Aucune police installée ne correspond au filtre.', systemFontsFailed: 'Impossible de lire les polices installées.', restrictedLicense: "La licence de la police interdit l'intégration.", diff --git a/src/locales/he.ts b/src/locales/he.ts index 7000874b..a8547c62 100644 --- a/src/locales/he.ts +++ b/src/locales/he.ts @@ -1706,12 +1706,13 @@ const he = { heading: 'גופנים', noFonts: 'לא נטענו גופנים', addFont: 'הוסף גופן', + add: 'הוסף', printerFilename: 'שם קובץ המדפסת', printerFilenamePlaceholder: 'לדוגמה: ARIAL.TTF', upload: 'העלה', fromComputer: 'מהמחשב הזה', filterFonts: 'סינון גופנים', - noSystemFonts: 'אין גופן מותקן שמתאים. גופנים מעל 4 MiB ואוספי גופנים אינם נכללים.', + noInstalledFonts: 'אין גופן מותקן שמתאים. גופנים מעל 4 MiB ואוספי גופנים אינם נכללים.', noFilterMatch: 'אין גופן מותקן שמתאים למסנן.', systemFontsFailed: 'לא ניתן לקרוא את הגופנים המותקנים.', restrictedLicense: 'הרישיון של הגופן אוסר על הטבעה.', diff --git a/src/locales/hr.ts b/src/locales/hr.ts index cd184bbe..3c22af18 100644 --- a/src/locales/hr.ts +++ b/src/locales/hr.ts @@ -1706,12 +1706,13 @@ const hr = { heading: 'Fontovi', noFonts: 'Nema učitanih fontova', addFont: 'Dodaj font', + add: 'Dodaj', printerFilename: 'Naziv datoteke pisača', printerFilenamePlaceholder: 'npr. ARIAL.TTF', upload: 'Prenesi', fromComputer: 'S ovog računala', filterFonts: 'Filtriraj fontove', - noSystemFonts: 'Nijedan instalirani font ne odgovara. Fontovi veći od 4 MiB i zbirke fontova su izostavljeni.', + noInstalledFonts: 'Nijedan instalirani font ne odgovara. Fontovi veći od 4 MiB i zbirke fontova su izostavljeni.', noFilterMatch: 'Nijedan instalirani font ne odgovara filtru.', systemFontsFailed: 'Instalirani fontovi nisu mogli biti pročitani.', restrictedLicense: 'Licenca fonta ne dopušta ugrađivanje.', diff --git a/src/locales/hu.ts b/src/locales/hu.ts index c2e3c922..9e877986 100644 --- a/src/locales/hu.ts +++ b/src/locales/hu.ts @@ -1706,12 +1706,13 @@ const hu = { heading: 'Betűtípusok', noFonts: 'Nincs betöltött betűtípus', addFont: 'Betűtípus hozzáadása', + add: 'Hozzáadás', printerFilename: 'Nyomtató fájlnév', printerFilenamePlaceholder: 'pl. ARIAL.TTF', upload: 'Feltöltés', fromComputer: 'Erről a számítógépről', filterFonts: 'Betűtípusok szűrése', - noSystemFonts: 'Nincs megfelelő telepített betűtípus. A 4 MiB-nál nagyobb betűtípusok és a betűtípus-gyűjtemények ki vannak hagyva.', + noInstalledFonts: 'Nincs megfelelő telepített betűtípus. A 4 MiB-nál nagyobb betűtípusok és a betűtípus-gyűjtemények ki vannak hagyva.', noFilterMatch: 'Nincs a szűrőnek megfelelő telepített betűtípus.', systemFontsFailed: 'A telepített betűtípusok nem olvashatók be.', restrictedLicense: 'A betűtípus licence tiltja a beágyazást.', diff --git a/src/locales/it.ts b/src/locales/it.ts index 9620d060..0a482469 100644 --- a/src/locales/it.ts +++ b/src/locales/it.ts @@ -1706,12 +1706,13 @@ const it = { heading: 'Caratteri', noFonts: 'Nessun carattere caricato', addFont: 'Aggiungi carattere', + add: 'Aggiungi', printerFilename: 'Nome file stampante', printerFilenamePlaceholder: 'es. ARIAL.TTF', upload: 'Carica', fromComputer: 'Da questo computer', filterFonts: 'Filtra i caratteri', - noSystemFonts: 'Nessun carattere installato corrisponde. I caratteri superiori a 4 MiB e le raccolte di caratteri vengono esclusi.', + noInstalledFonts: 'Nessun carattere installato corrisponde. I caratteri superiori a 4 MiB e le raccolte di caratteri vengono esclusi.', noFilterMatch: 'Nessun carattere installato corrisponde al filtro.', systemFontsFailed: 'Impossibile leggere i caratteri installati.', restrictedLicense: "La licenza del carattere non consente l'incorporamento.", diff --git a/src/locales/ja.ts b/src/locales/ja.ts index d4c95b59..10ff7a93 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -1706,12 +1706,13 @@ const ja = { heading: 'フォント', noFonts: 'フォントが読み込まれていません', addFont: 'フォントを追加', + add: '追加', printerFilename: 'プリンターファイル名', printerFilenamePlaceholder: '例: ARIAL.TTF', upload: 'アップロード', fromComputer: 'このコンピューターから', filterFonts: 'フォントを絞り込み', - noSystemFonts: 'インストールされたフォントで一致するものがありません。4 MiBを超えるフォントとフォントコレクションは対象外です。', + noInstalledFonts: 'インストールされたフォントで一致するものがありません。4 MiBを超えるフォントとフォントコレクションは対象外です。', noFilterMatch: '絞り込み条件に一致するインストール済みのフォントがありません。', systemFontsFailed: 'インストールされたフォントを読み込めませんでした。', restrictedLicense: 'このフォントのライセンスは埋め込みを禁止しています。', diff --git a/src/locales/ko.ts b/src/locales/ko.ts index e79c27fb..5994d074 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -1706,12 +1706,13 @@ const ko = { heading: '글꼴', noFonts: '로드된 글꼴 없음', addFont: '글꼴 추가', + add: '추가', printerFilename: '프린터 파일명', printerFilenamePlaceholder: '예: ARIAL.TTF', upload: '업로드', fromComputer: '이 컴퓨터에서', filterFonts: '글꼴 필터링', - noSystemFonts: '일치하는 설치된 글꼴이 없습니다. 4 MiB를 초과하는 글꼴과 글꼴 모음은 제외됩니다.', + noInstalledFonts: '일치하는 설치된 글꼴이 없습니다. 4 MiB를 초과하는 글꼴과 글꼴 모음은 제외됩니다.', noFilterMatch: '필터와 일치하는 설치된 글꼴이 없습니다.', systemFontsFailed: '설치된 글꼴을 불러올 수 없습니다.', restrictedLicense: '이 글꼴의 라이선스는 포함을 금지합니다.', diff --git a/src/locales/lt.ts b/src/locales/lt.ts index 5bbcef51..50918038 100644 --- a/src/locales/lt.ts +++ b/src/locales/lt.ts @@ -1706,12 +1706,13 @@ const lt = { heading: 'Šriftai', noFonts: 'Nėra įkeltų šriftų', addFont: 'Pridėti šriftą', + add: 'Pridėti', printerFilename: 'Spausdintuvo failo pavadinimas', printerFilenamePlaceholder: 'pvz. ARIAL.TTF', upload: 'Įkelti', fromComputer: 'Iš šio kompiuterio', filterFonts: 'Filtruoti šriftus', - noSystemFonts: 'Nėra tinkamo įdiegto šrifto. Šriftai didesni nei 4 MiB ir šriftų rinkiniai yra praleidžiami.', + noInstalledFonts: 'Nėra tinkamo įdiegto šrifto. Šriftai didesni nei 4 MiB ir šriftų rinkiniai yra praleidžiami.', noFilterMatch: 'Nėra įdiegto šrifto, atitinkančio filtrą.', systemFontsFailed: 'Nepavyko nuskaityti įdiegtų šriftų.', restrictedLicense: 'Šrifto licencija draudžia įterpimą.', diff --git a/src/locales/lv.ts b/src/locales/lv.ts index 9db19155..c5c637e5 100644 --- a/src/locales/lv.ts +++ b/src/locales/lv.ts @@ -1706,12 +1706,13 @@ const lv = { heading: 'Fonti', noFonts: 'Nav ielādētu fontu', addFont: 'Pievienot fontu', + add: 'Pievienot', printerFilename: 'Printera faila nosaukums', printerFilenamePlaceholder: 'piem. ARIAL.TTF', upload: 'Augšupielādēt', fromComputer: 'No šī datora', filterFonts: 'Filtrēt fontus', - noSystemFonts: 'Nav piemērota instalēta fonta. Fonti, lielāki par 4 MiB, un fontu kolekcijas tiek izlaisti.', + noInstalledFonts: 'Nav piemērota instalēta fonta. Fonti, lielāki par 4 MiB, un fontu kolekcijas tiek izlaisti.', noFilterMatch: 'Nav instalēta fonta, kas atbilst filtram.', systemFontsFailed: 'Neizdevās nolasīt instalētos fontus.', restrictedLicense: 'Fonta licence aizliedz iegulšanu.', diff --git a/src/locales/nl.ts b/src/locales/nl.ts index 80ca806d..b0efe567 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -1706,12 +1706,13 @@ const nl = { heading: 'Lettertypen', noFonts: 'Geen lettertypen geladen', addFont: 'Lettertype toevoegen', + add: 'Toevoegen', printerFilename: 'Printerbestandsnaam', printerFilenamePlaceholder: 'bijv. ARIAL.TTF', upload: 'Uploaden', fromComputer: 'Vanaf deze computer', filterFonts: 'Lettertypen filteren', - noSystemFonts: 'Geen geïnstalleerd lettertype past. Lettertypen boven 4 MiB en lettertypeverzamelingen worden weggelaten.', + noInstalledFonts: 'Geen geïnstalleerd lettertype past. Lettertypen boven 4 MiB en lettertypeverzamelingen worden weggelaten.', noFilterMatch: 'Geen geïnstalleerd lettertype komt overeen met het filter.', systemFontsFailed: 'De geïnstalleerde lettertypen konden niet worden gelezen.', restrictedLicense: 'De licentie van het lettertype verbiedt insluiten.', diff --git a/src/locales/no.ts b/src/locales/no.ts index a9a92d5f..177bb111 100644 --- a/src/locales/no.ts +++ b/src/locales/no.ts @@ -1706,12 +1706,13 @@ const no = { heading: 'Skrifter', noFonts: 'Ingen skrifter lastet', addFont: 'Legg til skrift', + add: 'Legg til', printerFilename: 'Skriverfilnavn', printerFilenamePlaceholder: 'f.eks. ARIAL.TTF', upload: 'Last opp', fromComputer: 'Fra denne datamaskinen', filterFonts: 'Filtrer skrifter', - noSystemFonts: 'Ingen installert skrift passer. Skrifter over 4 MiB og skriftsamlinger utelates.', + noInstalledFonts: 'Ingen installert skrift passer. Skrifter over 4 MiB og skriftsamlinger utelates.', noFilterMatch: 'Ingen installert skrift samsvarer med filteret.', systemFontsFailed: 'Klarte ikke lese de installerte skriftene.', restrictedLicense: 'Skriftens lisens forbyr innbygging.', diff --git a/src/locales/pl.ts b/src/locales/pl.ts index 3ccdea9f..28f75b04 100644 --- a/src/locales/pl.ts +++ b/src/locales/pl.ts @@ -1706,12 +1706,13 @@ const pl = { heading: 'Czcionki', noFonts: 'Brak załadowanych czcionek', addFont: 'Dodaj czcionkę', + add: 'Dodaj', printerFilename: 'Nazwa pliku drukarki', printerFilenamePlaceholder: 'np. ARIAL.TTF', upload: 'Prześlij', fromComputer: 'Z tego komputera', filterFonts: 'Filtruj czcionki', - noSystemFonts: 'Żadna zainstalowana czcionka nie odpowiada. Czcionki powyżej 4 MiB i kolekcje czcionek są pomijane.', + noInstalledFonts: 'Żadna zainstalowana czcionka nie odpowiada. Czcionki powyżej 4 MiB i kolekcje czcionek są pomijane.', noFilterMatch: 'Żadna zainstalowana czcionka nie odpowiada filtrowi.', systemFontsFailed: 'Nie można odczytać zainstalowanych czcionek.', restrictedLicense: 'Licencja czcionki zabrania osadzania.', diff --git a/src/locales/pt.ts b/src/locales/pt.ts index f97d5889..8e65b1e5 100644 --- a/src/locales/pt.ts +++ b/src/locales/pt.ts @@ -1706,12 +1706,13 @@ const pt = { heading: 'Fontes', noFonts: 'Nenhuma fonte carregada', addFont: 'Adicionar fonte', + add: 'Adicionar', printerFilename: 'Nome do arquivo da impressora', printerFilenamePlaceholder: 'ex. ARIAL.TTF', upload: 'Carregar', fromComputer: 'Deste computador', filterFonts: 'Filtrar fontes', - noSystemFonts: 'Nenhuma fonte instalada corresponde. Fontes acima de 4 MiB e coleções de fontes são deixadas de fora.', + noInstalledFonts: 'Nenhuma fonte instalada corresponde. Fontes acima de 4 MiB e coleções de fontes são deixadas de fora.', noFilterMatch: 'Nenhuma fonte instalada corresponde ao filtro.', systemFontsFailed: 'Não foi possível ler as fontes instaladas.', restrictedLicense: 'A licença da fonte proíbe a incorporação.', diff --git a/src/locales/ro.ts b/src/locales/ro.ts index 528cc98d..295c89bc 100644 --- a/src/locales/ro.ts +++ b/src/locales/ro.ts @@ -1706,12 +1706,13 @@ const ro = { heading: 'Fonturi', noFonts: 'Niciun font încărcat', addFont: 'Adaugă font', + add: 'Adaugă', printerFilename: 'Nume fișier imprimantă', printerFilenamePlaceholder: 'ex. ARIAL.TTF', upload: 'Încarcă', fromComputer: 'De pe acest computer', filterFonts: 'Filtrează fonturile', - noSystemFonts: 'Niciun font instalat nu se potrivește. Fonturile peste 4 MiB și colecțiile de fonturi sunt excluse.', + noInstalledFonts: 'Niciun font instalat nu se potrivește. Fonturile peste 4 MiB și colecțiile de fonturi sunt excluse.', noFilterMatch: 'Niciun font instalat nu corespunde filtrului.', systemFontsFailed: 'Fonturile instalate nu au putut fi citite.', restrictedLicense: 'Licența fontului interzice încorporarea.', diff --git a/src/locales/sk.ts b/src/locales/sk.ts index daf32d9e..34dfddc3 100644 --- a/src/locales/sk.ts +++ b/src/locales/sk.ts @@ -1706,12 +1706,13 @@ const sk = { heading: 'Písma', noFonts: 'Žiadne písma nenačítané', addFont: 'Pridať písmo', + add: 'Pridať', printerFilename: 'Názov súboru tlačiarne', printerFilenamePlaceholder: 'napr. ARIAL.TTF', upload: 'Nahrať', fromComputer: 'Z tohto počítača', filterFonts: 'Filtrovať písma', - noSystemFonts: 'Žiadne nainštalované písmo nevyhovuje. Písma nad 4 MiB a kolekcie písem sú vynechané.', + noInstalledFonts: 'Žiadne nainštalované písmo nevyhovuje. Písma nad 4 MiB a kolekcie písem sú vynechané.', noFilterMatch: 'Žiadne nainštalované písmo nezodpovedá filtru.', systemFontsFailed: 'Nainštalované písma sa nepodarilo načítať.', restrictedLicense: 'Licencia písma zakazuje vkladanie.', diff --git a/src/locales/sl.ts b/src/locales/sl.ts index 39df0c70..f266ec01 100644 --- a/src/locales/sl.ts +++ b/src/locales/sl.ts @@ -1706,12 +1706,13 @@ const sl = { heading: 'Pisave', noFonts: 'Ni naloženih pisav', addFont: 'Dodaj pisavo', + add: 'Dodaj', printerFilename: 'Ime datoteke tiskalnika', printerFilenamePlaceholder: 'npr. ARIAL.TTF', upload: 'Naloži', fromComputer: 'S tega računalnika', filterFonts: 'Filtriraj pisave', - noSystemFonts: 'Nobena nameščena pisava ne ustreza. Pisave nad 4 MiB in zbirke pisav so izpuščene.', + noInstalledFonts: 'Nobena nameščena pisava ne ustreza. Pisave nad 4 MiB in zbirke pisav so izpuščene.', noFilterMatch: 'Nobena nameščena pisava ne ustreza filtru.', systemFontsFailed: 'Nameščenih pisav ni bilo mogoče prebrati.', restrictedLicense: 'Licenca pisave prepoveduje vdelavo.', diff --git a/src/locales/sr.ts b/src/locales/sr.ts index 544a0697..f4761d4d 100644 --- a/src/locales/sr.ts +++ b/src/locales/sr.ts @@ -1706,12 +1706,13 @@ const sr = { heading: 'Фонтови', noFonts: 'Нема учитаних фонтова', addFont: 'Додај фонт', + add: 'Додај', printerFilename: 'Назив датотеке штампача', printerFilenamePlaceholder: 'нпр. ARIAL.TTF', upload: 'Отпреми', fromComputer: 'Са овог рачунара', filterFonts: 'Филтрирај фонтове', - noSystemFonts: 'Ниједан инсталирани фонт не одговара. Фонтови већи од 4 MiB и колекције фонтова су изостављени.', + noInstalledFonts: 'Ниједан инсталирани фонт не одговара. Фонтови већи од 4 MiB и колекције фонтова су изостављени.', noFilterMatch: 'Ниједан инсталирани фонт не одговара филтеру.', systemFontsFailed: 'Инсталирани фонтови нису могли бити прочитани.', restrictedLicense: 'Лиценца фонта не дозвољава уграђивање.', diff --git a/src/locales/sv.ts b/src/locales/sv.ts index 6373758a..3fd82ca8 100644 --- a/src/locales/sv.ts +++ b/src/locales/sv.ts @@ -1706,12 +1706,13 @@ const sv = { heading: 'Typsnitt', noFonts: 'Inga typsnitt laddade', addFont: 'Lägg till typsnitt', + add: 'Lägg till', printerFilename: 'Skrivarfilnamn', printerFilenamePlaceholder: 't.ex. ARIAL.TTF', upload: 'Ladda upp', fromComputer: 'Från den här datorn', filterFonts: 'Filtrera typsnitt', - noSystemFonts: 'Inget installerat typsnitt passar. Typsnitt över 4 MiB och typsnittssamlingar utelämnas.', + noInstalledFonts: 'Inget installerat typsnitt passar. Typsnitt över 4 MiB och typsnittssamlingar utelämnas.', noFilterMatch: 'Inget installerat typsnitt matchar filtret.', systemFontsFailed: 'Det gick inte att läsa de installerade typsnitten.', restrictedLicense: 'Typsnittets licens förbjuder inbäddning.', diff --git a/src/locales/tr.ts b/src/locales/tr.ts index 0c710fd8..9064d272 100644 --- a/src/locales/tr.ts +++ b/src/locales/tr.ts @@ -1706,12 +1706,13 @@ const tr = { heading: 'Yazı Tipleri', noFonts: 'Yüklü yazı tipi yok', addFont: 'Yazı tipi ekle', + add: 'Ekle', printerFilename: 'Yazıcı dosya adı', printerFilenamePlaceholder: 'örn. ARIAL.TTF', upload: 'Yükle', fromComputer: 'Bu bilgisayardan', filterFonts: 'Yazı tiplerini filtrele', - noSystemFonts: 'Uygun yüklü yazı tipi yok. 4 MiB üzerindeki yazı tipleri ve yazı tipi koleksiyonları hariç tutulur.', + noInstalledFonts: 'Uygun yüklü yazı tipi yok. 4 MiB üzerindeki yazı tipleri ve yazı tipi koleksiyonları hariç tutulur.', noFilterMatch: 'Filtreyle eşleşen yüklü yazı tipi yok.', systemFontsFailed: 'Yüklü yazı tipleri okunamadı.', restrictedLicense: 'Yazı tipinin lisansı gömmeyi yasaklıyor.', diff --git a/src/locales/zh-hans.ts b/src/locales/zh-hans.ts index 1022c34a..f7daaccf 100644 --- a/src/locales/zh-hans.ts +++ b/src/locales/zh-hans.ts @@ -1706,12 +1706,13 @@ const zhHans = { heading: '字体', noFonts: '未加载字体', addFont: '添加字体', + add: '添加', printerFilename: '打印机文件名', printerFilenamePlaceholder: '例如 ARIAL.TTF', upload: '上传', fromComputer: '从此计算机', filterFonts: '筛选字体', - noSystemFonts: '没有匹配的已安装字体。大于 4 MiB 的字体和字体集合将被排除。', + noInstalledFonts: '没有匹配的已安装字体。大于 4 MiB 的字体和字体集合将被排除。', noFilterMatch: '没有与筛选条件匹配的已安装字体。', systemFontsFailed: '无法读取已安装的字体。', restrictedLicense: '该字体的许可证禁止嵌入。', diff --git a/src/locales/zh-hant.ts b/src/locales/zh-hant.ts index 971384ab..759efb65 100644 --- a/src/locales/zh-hant.ts +++ b/src/locales/zh-hant.ts @@ -1706,12 +1706,13 @@ const zhHant = { heading: '字體', noFonts: '未載入字體', addFont: '新增字體', + add: '新增', printerFilename: '印表機檔名', printerFilenamePlaceholder: '例如 ARIAL.TTF', upload: '上傳', fromComputer: '從此電腦', filterFonts: '篩選字體', - noSystemFonts: '沒有符合的已安裝字體。大於 4 MiB 的字體和字體集合將被排除。', + noInstalledFonts: '沒有符合的已安裝字體。大於 4 MiB 的字體和字體集合將被排除。', noFilterMatch: '沒有符合篩選條件的已安裝字體。', systemFontsFailed: '無法讀取已安裝的字型。', restrictedLicense: '該字體的授權禁止嵌入。', diff --git a/src/test/systemFontCap.test.ts b/src/test/systemFontCap.test.ts index 6c913443..c90efa2b 100644 --- a/src/test/systemFontCap.test.ts +++ b/src/test/systemFontCap.test.ts @@ -9,7 +9,7 @@ describe("the system font cap", () => { const product = rust.split("*").map((factor) => Number(factor.trim())).reduce((a, b) => a * b, 1); expect(product).toBe(MAX_FONT_BYTES); for (const code of LOCALE_CODES) { - expect((await loadLocale(code)).fonts.noSystemFonts, code).toContain(`${MAX_FONT_BYTES / 1024 / 1024} MiB`); + expect((await loadLocale(code)).fonts.noInstalledFonts, code).toContain(`${MAX_FONT_BYTES / 1024 / 1024} MiB`); } }); });