From 3a929d7dc2963f06d8562edee69056e809c35e64 Mon Sep 17 00:00:00 2001 From: u8array Date: Tue, 19 May 2026 19:20:02 +0200 Subject: [PATCH 1/5] feat(zpl): add header commands ^PM ~SD ^PR/^PQ extended; refactor properties panel UX Schema, generator, parser, and UI support for: - ^PM mirror image - ~SD instant darkness (emitted before ^XA) - ^PR extended with slew + backfeed speeds - ^PQ extended with pause-count, replicates, override-pause-count Properties panel reorganised: collapsible sections (Output, Quantity advanced, Printer optional, all closed by default), 3-col grid for the speed group, 2-col grid for darkness (permanent / instant), mirror checkbox visually paired with print orientation. Quantity advanced moved into its own collapsible. Locale keys added for the new fields and section headings. --- src/components/Properties/PropertiesPanel.tsx | 168 +++++++++++++++--- src/lib/zplGenerator.test.ts | 72 ++++++++ src/lib/zplGenerator.ts | 42 ++++- src/lib/zplParser.test.ts | 25 +++ src/lib/zplParser.ts | 34 +++- src/locales/ar.ts | 15 ++ src/locales/bg.ts | 15 ++ src/locales/cs.ts | 15 ++ src/locales/da.ts | 15 ++ src/locales/de.ts | 15 ++ src/locales/el.ts | 15 ++ src/locales/en.ts | 15 ++ src/locales/es.ts | 15 ++ src/locales/et.ts | 15 ++ src/locales/fa.ts | 15 ++ src/locales/fi.ts | 15 ++ src/locales/fr.ts | 15 ++ src/locales/he.ts | 15 ++ src/locales/hr.ts | 15 ++ src/locales/hu.ts | 15 ++ src/locales/it.ts | 15 ++ src/locales/ja.ts | 15 ++ src/locales/ko.ts | 15 ++ src/locales/lt.ts | 15 ++ src/locales/lv.ts | 15 ++ src/locales/nl.ts | 15 ++ src/locales/no.ts | 15 ++ src/locales/pl.ts | 15 ++ src/locales/pt.ts | 15 ++ src/locales/ro.ts | 15 ++ src/locales/sk.ts | 15 ++ src/locales/sl.ts | 15 ++ src/locales/sr.ts | 15 ++ src/locales/sv.ts | 15 ++ src/locales/tr.ts | 15 ++ src/locales/zh-hans.ts | 15 ++ src/locales/zh-hant.ts | 15 ++ src/types/ObjectType.ts | 14 ++ 38 files changed, 807 insertions(+), 28 deletions(-) diff --git a/src/components/Properties/PropertiesPanel.tsx b/src/components/Properties/PropertiesPanel.tsx index 993e08d0..31747328 100644 --- a/src/components/Properties/PropertiesPanel.tsx +++ b/src/components/Properties/PropertiesPanel.tsx @@ -430,7 +430,9 @@ function LabelConfigPanel({ +
+ onUpdate({ pauseCount: parseIntOrUndef(e.target.value) }) + } + /> +
+ +
+ + + onUpdate({ replicates: parseIntOrUndef(e.target.value) }) + } + /> +
+ + +
+
- - onUpdate({ printSpeed: parseIntOrUndef(e.target.value) }) - } - /> +
+
+ + + onUpdate({ printSpeed: parseIntOrUndef(e.target.value) }) + } + /> +
+
+ + + onUpdate({ slewSpeed: parseIntOrUndef(e.target.value) }) + } + /> +
+
+ + + onUpdate({ backfeedSpeed: parseIntOrUndef(e.target.value) }) + } + /> +
+
- - onUpdate({ darkness: parseIntOrUndef(e.target.value) }) - } - /> +
+
+ + + onUpdate({ darkness: parseIntOrUndef(e.target.value) }) + } + /> +
+
+ + + onUpdate({ instantDarkness: parseIntOrUndef(e.target.value) }) + } + /> +
+
@@ -562,6 +675,16 @@ function LabelConfigPanel({ +
@@ -599,6 +722,7 @@ function LabelConfigPanel({
+
diff --git a/src/lib/zplGenerator.test.ts b/src/lib/zplGenerator.test.ts index 8b664ad6..4986be8b 100644 --- a/src/lib/zplGenerator.test.ts +++ b/src/lib/zplGenerator.test.ts @@ -103,6 +103,78 @@ describe('generateZPL — printer params', () => { expect(generateZPL(BASE_LABEL, [])).not.toContain('^PO'); }); + it('emits ^PM when mirror is set', () => { + expect(generateZPL({ ...BASE_LABEL, mirror: 'Y' }, [])).toContain('^PMY'); + expect(generateZPL({ ...BASE_LABEL, mirror: 'N' }, [])).toContain('^PMN'); + expect(generateZPL(BASE_LABEL, [])).not.toContain('^PM'); + }); + + it('emits ~SD before ^XA with zero-padded value', () => { + const zpl = generateZPL({ ...BASE_LABEL, instantDarkness: 7 }, []); + expect(zpl.startsWith('~SD07\n^XA')).toBe(true); + expect(generateZPL({ ...BASE_LABEL, instantDarkness: 30 }, [])) + .toContain('~SD30'); + }); + + it('emits ^PR when only slew or backfeed is set (printSpeed undefined)', () => { + expect(generateZPL({ ...BASE_LABEL, slewSpeed: 8 }, [])).toContain('^PR8'); + // backfeed-only: ZPL has no positional skip, so slew slot repeats the + // (defaulted) print speed. Documented asymmetry — see roundtrip test. + expect( + generateZPL({ ...BASE_LABEL, backfeedSpeed: 4 }, []), + ).toContain('^PR4,4,4'); + }); + + it('emits ^PR with slew and backfeed when set', () => { + expect( + generateZPL({ ...BASE_LABEL, printSpeed: 6, slewSpeed: 8 }, []), + ).toContain('^PR6,8'); + // backfeed without slew → slew defaults to printSpeed so position is + // preserved. + expect( + generateZPL({ ...BASE_LABEL, printSpeed: 6, backfeedSpeed: 4 }, []), + ).toContain('^PR6,6,4'); + expect( + generateZPL( + { ...BASE_LABEL, printSpeed: 6, slewSpeed: 8, backfeedSpeed: 4 }, + [], + ), + ).toContain('^PR6,8,4'); + }); + + it('^PR backfeed-only does not roundtrip cleanly (slew gets populated)', () => { + // Documented asymmetry: ZPL has no positional skip, so on emit the slew + // slot is filled with the print speed. On reparse, slewSpeed becomes + // defined even though it was undefined in the source. If this is ever + // changed to a normaliser-on-input approach, update both the generator + // and this test. + const original: LabelConfig = { + ...BASE_LABEL, + printSpeed: 6, + backfeedSpeed: 4, + }; + const zpl = generateZPL(original, []); + const { labelConfig } = parseZPL(zpl, 8); + expect(labelConfig.printSpeed).toBe(6); + expect(labelConfig.slewSpeed).toBe(6); + expect(labelConfig.backfeedSpeed).toBe(4); + }); + + it('emits ^PQ with extended params when any are set', () => { + expect( + generateZPL({ ...BASE_LABEL, printQuantity: 5, pauseCount: 2 }, []), + ).toContain('^PQ5,2,0,N'); + expect( + generateZPL( + { ...BASE_LABEL, printQuantity: 1, replicates: 3 }, + [], + ), + ).toContain('^PQ1,0,3,N'); + expect( + generateZPL({ ...BASE_LABEL, overridePauseCount: 'Y' }, []), + ).toContain('^PQ1,0,0,Y'); + }); + it('emits ^CF when both defaultFontId and defaultFontHeight are set', () => { const zpl = generateZPL( { ...BASE_LABEL, defaultFontId: '0', defaultFontHeight: 30 }, diff --git a/src/lib/zplGenerator.ts b/src/lib/zplGenerator.ts index cb3c19c1..4fd0321e 100644 --- a/src/lib/zplGenerator.ts +++ b/src/lib/zplGenerator.ts @@ -17,19 +17,42 @@ export function generateZPL(label: LabelConfig, objects: LabelObject[]): string const widthDots = mmToDots(label.widthMm, label.dpmm); const heightDots = mmToDots(label.heightMm, label.dpmm); - const lines: string[] = [ + const lines: string[] = []; + + // ~SD is a tilde-prefix command that takes effect immediately on receipt, + // independently of the label block. Emit it before ^XA so the darkness + // change applies to the label that follows. + if (label.instantDarkness !== undefined) { + const v = String(label.instantDarkness).padStart(2, '0'); + lines.push(`~SD${v}`); + } + + lines.push( '^XA', `^PW${widthDots}`, `^LL${heightDots}`, '^CI28', - ]; + ); if (label.mediaMode) lines.push(`^MM${label.mediaMode}`); if (label.mediaType) lines.push(`^MT${label.mediaType}`); - if (label.printSpeed !== undefined) lines.push(`^PR${label.printSpeed}`); + // ^PR print,slew,backfeed — any of the three triggers emission. Slew and + // backfeed default to the print speed per Zebra spec; ZPL has no way to + // skip a positional param, so backfeed-only still has to repeat the print + // speed in the slew slot. + const fallback = label.printSpeed ?? label.slewSpeed ?? label.backfeedSpeed; + if (fallback !== undefined) { + const parts = [fallback]; + if (label.slewSpeed !== undefined || label.backfeedSpeed !== undefined) { + parts.push(label.slewSpeed ?? fallback); + } + if (label.backfeedSpeed !== undefined) parts.push(label.backfeedSpeed); + lines.push(`^PR${parts.join(',')}`); + } // darkness=0 is a valid value (printer baseline), so check undefined explicitly. if (label.darkness !== undefined) lines.push(`^MD${label.darkness}`); if (label.printOrientation) lines.push(`^PO${label.printOrientation}`); + if (label.mirror) lines.push(`^PM${label.mirror}`); // ^CF parameters are individually optional per Zebra spec: ^CF0 sets the // font only, ^CF,30 sets the height only. Preserves round-trip fidelity // when an imported label used a partial command. @@ -54,8 +77,17 @@ export function generateZPL(label: LabelConfig, objects: LabelObject[]): string }; lines.push(...objects.flatMap(emitLeaf)); - if (label.printQuantity && label.printQuantity > 1) { - lines.push(`^PQ${label.printQuantity}`); + // ^PQ q,p,r,o — emit if quantity > 1 OR any extended param is set. + // Defaults follow the Zebra spec: q=1, p=0, r=0, o=N. + const pq = label.printQuantity ?? 1; + const pause = label.pauseCount ?? 0; + const reps = label.replicates ?? 0; + const override = label.overridePauseCount ?? 'N'; + const pqExtended = pause !== 0 || reps !== 0 || override !== 'N'; + if (pqExtended) { + lines.push(`^PQ${pq},${pause},${reps},${override}`); + } else if (pq > 1) { + lines.push(`^PQ${pq}`); } lines.push('^XZ'); diff --git a/src/lib/zplParser.test.ts b/src/lib/zplParser.test.ts index 8642cd9c..61e8fcf9 100644 --- a/src/lib/zplParser.test.ts +++ b/src/lib/zplParser.test.ts @@ -604,6 +604,31 @@ describe('parseZPL — printer params', () => { expect(labelConfig.printSpeed).toBeUndefined(); }); + it('parses ^PR with slew and backfeed', () => { + const { labelConfig } = parseZPL('^XA^PR6,8,4^XZ', 8); + expect(labelConfig.printSpeed).toBe(6); + expect(labelConfig.slewSpeed).toBe(8); + expect(labelConfig.backfeedSpeed).toBe(4); + }); + + it('parses extended ^PQ params', () => { + const { labelConfig } = parseZPL('^XA^PQ5,2,3,Y^XZ', 8); + expect(labelConfig.printQuantity).toBe(5); + expect(labelConfig.pauseCount).toBe(2); + expect(labelConfig.replicates).toBe(3); + expect(labelConfig.overridePauseCount).toBe('Y'); + }); + + it('parses ^PM mirror', () => { + expect(parseZPL('^XA^PMY^XZ', 8).labelConfig.mirror).toBe('Y'); + expect(parseZPL('^XA^PMN^XZ', 8).labelConfig.mirror).toBe('N'); + }); + + it('parses ~SD instant darkness', () => { + expect(parseZPL('~SD07^XA^XZ', 8).labelConfig.instantDarkness).toBe(7); + expect(parseZPL('~SD30^XA^XZ', 8).labelConfig.instantDarkness).toBe(30); + }); + it('parses ^MD darkness including 0', () => { expect(parseZPL('^XA^MD0^XZ', 8).labelConfig.darkness).toBe(0); expect(parseZPL('^XA^MD15^XZ', 8).labelConfig.darkness).toBe(15); diff --git a/src/lib/zplParser.ts b/src/lib/zplParser.ts index 653bb180..415f944e 100644 --- a/src/lib/zplParser.ts +++ b/src/lib/zplParser.ts @@ -1219,6 +1219,19 @@ export function parseZPL(zpl: string, dpmm = 8): ParsedZPL { PQ(p) { const qty = int(p[0], 0); if (qty > 0) labelConfig.printQuantity = qty; + // ^PQ q,p,r,o — preserve extended params when present. + if (p.length > 1) { + const pause = int(p[1], 0); + if (pause >= 0 && pause <= 99999999) labelConfig.pauseCount = pause; + } + if (p.length > 2) { + const reps = int(p[2], 0); + if (reps >= 0 && reps <= 99999999) labelConfig.replicates = reps; + } + if (p.length > 3) { + const o = (p[3] ?? "").toUpperCase(); + if (o === "Y" || o === "N") labelConfig.overridePauseCount = o; + } }, MM(_, rest) { const mode = (rest[0] ?? "").toUpperCase() as LabelConfig["mediaMode"]; @@ -1231,6 +1244,14 @@ export function parseZPL(zpl: string, dpmm = 8): ParsedZPL { PR(p) { const speed = int(p[0], 0); if (speed >= 2 && speed <= 14) labelConfig.printSpeed = speed; + if (p.length > 1) { + const slew = int(p[1], 0); + if (slew >= 2 && slew <= 14) labelConfig.slewSpeed = slew; + } + if (p.length > 2) { + const bf = int(p[2], 0); + if (bf >= 2 && bf <= 14) labelConfig.backfeedSpeed = bf; + } }, MD(_, rest) { // Direct parse: int() falls back to 0 on NaN, which would conflate @@ -1248,6 +1269,18 @@ export function parseZPL(zpl: string, dpmm = 8): ParsedZPL { const po = (rest[0] ?? "").toUpperCase(); if (po === "N" || po === "I") labelConfig.printOrientation = po; }, + PM(_, rest) { + const m = (rest[0] ?? "").toUpperCase(); + if (m === "Y" || m === "N") labelConfig.mirror = m; + }, + // ~SD — instant darkness set (00..30). Tilde-prefix; the tokenizer + // drops the delimiter, so we accept this as the canonical SD handler. + SD(_, rest) { + const parsed = parseInt(rest, 10); + if (!isNaN(parsed) && parsed >= 0 && parsed <= 30) { + labelConfig.instantDarkness = parsed; + } + }, // ── Browser-limit: printer-specific features ──────────────────────────── CW: mkBrowserLimit("CW"), // font identifier — assigns alias to printer-resident font @@ -1322,7 +1355,6 @@ export function parseZPL(zpl: string, dpmm = 8): ParsedZPL { JR: noop, // restore factory defaults JS: noop, // change darkness JU: noop, // update firmware - PM: noop, // part of message PP: noop, // presentation position }; diff --git a/src/locales/ar.ts b/src/locales/ar.ts index 98fa8b8b..5c154baa 100644 --- a/src/locales/ar.ts +++ b/src/locales/ar.ts @@ -76,6 +76,10 @@ const ar = { dpmm12: '12 نقطة/مم — 300 dpi', dpmm24: '24 نقطة/مم — 600 dpi', printQuantity: 'كمية الطباعة', + quantityAdvancedHeading: 'الكمية (متقدم)', + pauseCount: 'إيقاف مؤقت كل N ملصق', + replicates: 'نسخ لكل ملصق', + overridePauseCount: 'تجاوز عدد التوقف (قص الأخير فقط)', mediaMode: 'وضع الوسائط', outputHeading: 'الإخراج', mediaModeT: 'T — تمزيق', @@ -87,8 +91,18 @@ const ar = { printerSettingsHeading: 'الطابعة (اختياري)', printSpeed: 'سرعة الطباعة (ips، 2-14)', printSpeedHint: 'خاص بالطابعة. اتركه فارغًا لاستخدام القيمة الافتراضية.', + speedHeading: 'السرعة (ips، 2-14)', + speedPrint: 'طباعة', + speedSlew: 'تحريك', + speedBackfeed: 'إرجاع', + slewSpeed: 'سرعة التحريك (ips، 2-14)', + backfeedSpeed: 'سرعة الإرجاع (ips، 2-14)', darkness: 'الكثافة (-30 إلى +30)', darknessHint: 'خاص بالطابعة. اتركه فارغًا لاستخدام القيمة الافتراضية.', + instantDarkness: 'إعتام فوري (0-30)', + darknessHeading: 'الإعتام', + darknessPermanent: 'دائم (-30..30)', + darknessInstant: 'فوري (0..30)', mediaType: 'نوع الوسائط', mediaTypeT: 'نقل حراري', mediaTypeD: 'حراري مباشر', @@ -96,6 +110,7 @@ const ar = { printOrientationN: 'عادي', printOrientationI: 'مقلوب (180°)', printOrientationIndicator: 'مقلوب', + mirror: 'صورة معكوسة', defaultFont: 'نمط النص الافتراضي', defaultFontId: 'الخط', defaultFontHeight: 'الارتفاع (نقاط)', diff --git a/src/locales/bg.ts b/src/locales/bg.ts index c885f736..6457d956 100644 --- a/src/locales/bg.ts +++ b/src/locales/bg.ts @@ -76,6 +76,10 @@ const bg = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Количество за печат', + quantityAdvancedHeading: 'Количество (разширени)', + pauseCount: 'Пауза на всеки N етикета', + replicates: 'Реплики на етикет', + overridePauseCount: 'Замени брояча на пауза (отрязване само на последния)', mediaMode: 'Режим на носителя', outputHeading: 'Изход', mediaModeT: 'T — Откъсване', @@ -87,8 +91,18 @@ const bg = { printerSettingsHeading: 'Принтер (по избор)', printSpeed: 'Скорост на печат (ips, 2-14)', printSpeedHint: 'Специфично за принтера. Оставете празно за стойност по подразбиране.', + speedHeading: 'Скорост (ips, 2-14)', + speedPrint: 'Печат', + speedSlew: 'Придвижване', + speedBackfeed: 'Връщане', + slewSpeed: 'Скорост на придвижване (ips, 2-14)', + backfeedSpeed: 'Скорост на връщане (ips, 2-14)', darkness: 'Плътност (-30 до +30)', darknessHint: 'Специфично за принтера. Оставете празно за стойност по подразбиране.', + darknessHeading: 'Тъмнина', + darknessPermanent: 'Постоянно (-30..30)', + darknessInstant: 'Незабавно (0..30)', + instantDarkness: 'Незабавна тъмнина (0-30)', mediaType: 'Тип носител', mediaTypeT: 'Термотрансферен', mediaTypeD: 'Директен термичен', @@ -96,6 +110,7 @@ const bg = { printOrientationN: 'Нормален', printOrientationI: 'Обърнато (180°)', printOrientationIndicator: 'Обърнато', + mirror: 'Огледален образ', defaultFont: 'Стил на текст по подразбиране', defaultFontId: 'Шрифт', defaultFontHeight: 'Височина (точки)', diff --git a/src/locales/cs.ts b/src/locales/cs.ts index 811ff1c9..f2c8473f 100644 --- a/src/locales/cs.ts +++ b/src/locales/cs.ts @@ -76,6 +76,10 @@ const cs = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Počet výtisků', + quantityAdvancedHeading: 'Množství (pokročilé)', + pauseCount: 'Pauza každých N štítků', + replicates: 'Replikace na štítek', + overridePauseCount: 'Přepsat počet pauz (řezat jen poslední)', mediaMode: 'Režim média', outputHeading: 'Výstup', mediaModeT: 'T — Odtržení', @@ -87,8 +91,18 @@ const cs = { printerSettingsHeading: 'Tiskárna (volitelné)', printSpeed: 'Rychlost tisku (ips, 2-14)', printSpeedHint: 'Specifické pro tiskárnu. Ponechte prázdné pro výchozí hodnotu tiskárny.', + speedHeading: 'Rychlost (ips, 2-14)', + speedPrint: 'Tisk', + speedSlew: 'Posuv', + speedBackfeed: 'Zpětný posuv', + slewSpeed: 'Rychlost posuvu (ips, 2-14)', + backfeedSpeed: 'Rychlost zpětného posuvu (ips, 2-14)', darkness: 'Sytost tisku (-30 až +30)', darknessHint: 'Specifické pro tiskárnu. Ponechte prázdné pro výchozí hodnotu tiskárny.', + darknessHeading: 'Sytost', + darknessPermanent: 'Trvalé (-30..30)', + darknessInstant: 'Okamžitě (0..30)', + instantDarkness: 'Okamžitá sytost (0-30)', mediaType: 'Typ média', mediaTypeT: 'Termotransferový', mediaTypeD: 'Přímý termotisk', @@ -96,6 +110,7 @@ const cs = { printOrientationN: 'Normální', printOrientationI: 'Vzhůru nohama (180°)', printOrientationIndicator: 'Vzhůru nohama', + mirror: 'Zrcadlový obraz', defaultFont: 'Výchozí styl textu', defaultFontId: 'Písmo', defaultFontHeight: 'Výška (body)', diff --git a/src/locales/da.ts b/src/locales/da.ts index 447ecba2..e90a410a 100644 --- a/src/locales/da.ts +++ b/src/locales/da.ts @@ -76,6 +76,10 @@ const da = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Udskriftsmængde', + quantityAdvancedHeading: 'Antal (avanceret)', + pauseCount: 'Pause hver N etiket', + replicates: 'Replikeringer pr. etiket', + overridePauseCount: 'Tilsidesæt pausetæller (skær kun sidste)', mediaMode: 'Medietilstand', outputHeading: 'Output', mediaModeT: 'T — Afriv', @@ -87,8 +91,18 @@ const da = { printerSettingsHeading: 'Printer (valgfrit)', printSpeed: 'Udskrivningshastighed (ips, 2-14)', printSpeedHint: 'Printerspecifik. Lad stå tom for printerens standardværdi.', + speedHeading: 'Hastighed (ips, 2-14)', + speedPrint: 'Udskrift', + speedSlew: 'Fremføring', + speedBackfeed: 'Tilbageføring', + slewSpeed: 'Fremføringshastighed (ips, 2-14)', + backfeedSpeed: 'Tilbageføringshastighed (ips, 2-14)', darkness: 'Svarthed (-30 til +30)', darknessHint: 'Printerspecifik. Lad stå tom for printerens standardværdi.', + darknessHeading: 'Sværte', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Øjeblikkelig (0..30)', + instantDarkness: 'Øjeblikkelig sværte (0-30)', mediaType: 'Materialetype', mediaTypeT: 'Termotransfer', mediaTypeD: 'Direkte termisk', @@ -96,6 +110,7 @@ const da = { printOrientationN: 'Normal', printOrientationI: 'På hovedet (180°)', printOrientationIndicator: 'På hovedet', + mirror: 'Spejlbillede', defaultFont: 'Standardtekststil', defaultFontId: 'Skrifttype', defaultFontHeight: 'Højde (punkter)', diff --git a/src/locales/de.ts b/src/locales/de.ts index aa241d5b..408fd1dd 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -76,6 +76,10 @@ const de = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Druckanzahl', + quantityAdvancedHeading: 'Menge (erweitert)', + pauseCount: 'Pause nach N Etiketten', + replicates: 'Wiederholungen pro Etikett', + overridePauseCount: 'Pausenanzahl überschreiben (nur am Ende schneiden)', mediaMode: 'Medien-Modus', outputHeading: 'Ausgabe', mediaModeT: 'T — Abriss', @@ -87,8 +91,18 @@ const de = { printerSettingsHeading: 'Drucker (optional)', printSpeed: 'Druckgeschwindigkeit (ips, 2-14)', printSpeedHint: 'Druckerspezifisch. Leer lassen für Drucker-Standard.', + speedHeading: 'Geschwindigkeit (ips, 2-14)', + speedPrint: 'Druck', + speedSlew: 'Vorschub', + speedBackfeed: 'Rücklauf', + slewSpeed: 'Vorschubgeschwindigkeit (ips, 2-14)', + backfeedSpeed: 'Rücklaufgeschwindigkeit (ips, 2-14)', darkness: 'Druckdichte (-30 bis +30)', darknessHint: 'Druckerspezifisch. Leer lassen für Drucker-Standard.', + darknessHeading: 'Schwärzung', + darknessPermanent: 'Dauerhaft (-30..30)', + darknessInstant: 'Sofort (0..30)', + instantDarkness: 'Sofortige Schwärzung (0-30)', mediaType: 'Medientyp', mediaTypeT: 'Thermotransfer', mediaTypeD: 'Direkter Thermodruck', @@ -96,6 +110,7 @@ const de = { printOrientationN: 'Normal', printOrientationI: 'Kopfüber (180°)', printOrientationIndicator: 'Kopfüber', + mirror: 'Spiegelbild', defaultFont: 'Standard-Textstil', defaultFontId: 'Schriftart', defaultFontHeight: 'Höhe (Punkte)', diff --git a/src/locales/el.ts b/src/locales/el.ts index e187f44c..34ec066f 100644 --- a/src/locales/el.ts +++ b/src/locales/el.ts @@ -76,6 +76,10 @@ const el = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Ποσότητα εκτύπωσης', + quantityAdvancedHeading: 'Ποσότητα (για προχωρημένους)', + pauseCount: 'Παύση κάθε Ν ετικέτες', + replicates: 'Αντίγραφα ανά ετικέτα', + overridePauseCount: 'Παράκαμψη μετρητή παύσης (κοπή μόνο τελευταίας)', mediaMode: 'Λειτουργία μέσου', outputHeading: 'Έξοδος', mediaModeT: 'T — Σκίσιμο', @@ -87,8 +91,18 @@ const el = { printerSettingsHeading: 'Εκτυπωτής (προαιρετικό)', printSpeed: 'Ταχύτητα εκτύπωσης (ips, 2-14)', printSpeedHint: 'Ειδικό για τον εκτυπωτή. Αφήστε κενό για την προεπιλογή.', + speedHeading: 'Ταχύτητα (ips, 2-14)', + speedPrint: 'Εκτύπωση', + speedSlew: 'Μετάβαση', + speedBackfeed: 'Επιστροφή', + slewSpeed: 'Ταχύτητα μετάβασης (ips, 2-14)', + backfeedSpeed: 'Ταχύτητα επιστροφής (ips, 2-14)', darkness: 'Πυκνότητα (-30 έως +30)', darknessHint: 'Ειδικό για τον εκτυπωτή. Αφήστε κενό για την προεπιλογή.', + darknessHeading: 'Σκουρότητα', + darknessPermanent: 'Μόνιμο (-30..30)', + darknessInstant: 'Άμεσο (0..30)', + instantDarkness: 'Άμεση σκουρότητα (0-30)', mediaType: 'Τύπος μέσου', mediaTypeT: 'Θερμικής μεταφοράς', mediaTypeD: 'Άμεση θερμική', @@ -96,6 +110,7 @@ const el = { printOrientationN: 'Κανονικός', printOrientationI: 'Ανάποδα (180°)', printOrientationIndicator: 'Ανάποδα', + mirror: 'Καθρεπτική εικόνα', defaultFont: 'Προεπιλεγμένο στυλ κειμένου', defaultFontId: 'Γραμματοσειρά', defaultFontHeight: 'Ύψος (κουκκίδες)', diff --git a/src/locales/en.ts b/src/locales/en.ts index 04e1230a..7a4f02f9 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -76,6 +76,10 @@ const en = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Print quantity', + quantityAdvancedHeading: 'Quantity (advanced)', + pauseCount: 'Pause every N labels', + replicates: 'Replicates per label', + overridePauseCount: 'Override pause count (cut last only)', mediaMode: 'Media mode', outputHeading: 'Output', mediaModeT: 'T — Tear-off', @@ -87,8 +91,18 @@ const en = { printerSettingsHeading: 'Printer (optional)', printSpeed: 'Print speed (ips, 2-14)', printSpeedHint: 'Printer-specific. Leave empty to use the printer default.', + speedHeading: 'Speed (ips, 2-14)', + speedPrint: 'Print', + speedSlew: 'Slew', + speedBackfeed: 'Backfeed', + slewSpeed: 'Slew speed (ips, 2-14)', + backfeedSpeed: 'Backfeed speed (ips, 2-14)', darkness: 'Darkness (-30 to +30)', darknessHint: 'Printer-specific. Leave empty to use the printer default.', + darknessHeading: 'Darkness', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Instant (0..30)', + instantDarkness: 'Instant darkness (0-30)', mediaType: 'Media type', mediaTypeT: 'Thermal transfer', mediaTypeD: 'Direct thermal', @@ -96,6 +110,7 @@ const en = { printOrientationN: 'Normal', printOrientationI: 'Upside down (180°)', printOrientationIndicator: 'Upside down', + mirror: 'Mirror image', defaultFont: 'Default text style', defaultFontId: 'Font', defaultFontHeight: 'Height (dots)', diff --git a/src/locales/es.ts b/src/locales/es.ts index 5c9c6657..1cb566ee 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -76,6 +76,10 @@ const es = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Cantidad de impresión', + quantityAdvancedHeading: 'Cantidad (avanzado)', + pauseCount: 'Pausa cada N etiquetas', + replicates: 'Repeticiones por etiqueta', + overridePauseCount: 'Anular conteo de pausa (cortar solo al final)', mediaMode: 'Modo de medio', outputHeading: 'Salida', mediaModeT: 'T — Desgarro', @@ -87,8 +91,18 @@ const es = { printerSettingsHeading: 'Impresora (opcional)', printSpeed: 'Velocidad de impresión (ips, 2-14)', printSpeedHint: 'Específico de la impresora. Dejar vacío para usar el valor predeterminado.', + speedHeading: 'Velocidad (ips, 2-14)', + speedPrint: 'Impresión', + speedSlew: 'Avance', + speedBackfeed: 'Retroceso', + slewSpeed: 'Velocidad de avance (ips, 2-14)', + backfeedSpeed: 'Velocidad de retroceso (ips, 2-14)', darkness: 'Densidad de impresión (-30 a +30)', darknessHint: 'Específico de la impresora. Dejar vacío para usar el valor predeterminado.', + darknessHeading: 'Oscuridad', + darknessPermanent: 'Permanente (-30..30)', + darknessInstant: 'Inmediato (0..30)', + instantDarkness: 'Oscuridad inmediata (0-30)', mediaType: 'Tipo de medio', mediaTypeT: 'Transferencia térmica', mediaTypeD: 'Térmica directa', @@ -96,6 +110,7 @@ const es = { printOrientationN: 'Normal', printOrientationI: 'Boca abajo (180°)', printOrientationIndicator: 'Boca abajo', + mirror: 'Imagen reflejada', defaultFont: 'Estilo de texto predeterminado', defaultFontId: 'Fuente', defaultFontHeight: 'Altura (puntos)', diff --git a/src/locales/et.ts b/src/locales/et.ts index e58469e0..beff8fcc 100644 --- a/src/locales/et.ts +++ b/src/locales/et.ts @@ -76,6 +76,10 @@ const et = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Trükikogus', + quantityAdvancedHeading: 'Kogus (täpsem)', + pauseCount: 'Paus iga N sildi järel', + replicates: 'Korduvad sildi kohta', + overridePauseCount: 'Tühista pausi loendur (lõika ainult viimane)', mediaMode: 'Kandja režiim', outputHeading: 'Väljund', mediaModeT: 'T — Rebimine', @@ -87,8 +91,18 @@ const et = { printerSettingsHeading: 'Printer (valikuline)', printSpeed: 'Trükikiirus (ips, 2-14)', printSpeedHint: 'Printerispetsiifiline. Vaikeväärtuse kasutamiseks jäta tühjaks.', + speedHeading: 'Kiirus (ips, 2-14)', + speedPrint: 'Trükk', + speedSlew: 'Edasiliikumine', + speedBackfeed: 'Tagasiliikumine', + slewSpeed: 'Edasiliikumiskiirus (ips, 2-14)', + backfeedSpeed: 'Tagasiliikumiskiirus (ips, 2-14)', darkness: 'Tumedus (-30 kuni +30)', darknessHint: 'Printerispetsiifiline. Vaikeväärtuse kasutamiseks jäta tühjaks.', + instantDarkness: 'Kohene tumedus (0-30)', + darknessHeading: 'Tumedus', + darknessPermanent: 'Püsiv (-30..30)', + darknessInstant: 'Kohene (0..30)', mediaType: 'Meedialiik', mediaTypeT: 'Termoülekanne', mediaTypeD: 'Otsetermaal', @@ -96,6 +110,7 @@ const et = { printOrientationN: 'Tavaline', printOrientationI: 'Tagurpidi (180°)', printOrientationIndicator: 'Tagurpidi', + mirror: 'Peegelpilt', defaultFont: 'Vaikimisi teksti stiil', defaultFontId: 'Font', defaultFontHeight: 'Kõrgus (punktid)', diff --git a/src/locales/fa.ts b/src/locales/fa.ts index 703e7946..15c50530 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -76,6 +76,10 @@ const fa = { dpmm12: '12 نقطه/میلی‌متر — 300 dpi', dpmm24: '24 نقطه/میلی‌متر — 600 dpi', printQuantity: 'تعداد چاپ', + quantityAdvancedHeading: 'مقدار (پیشرفته)', + pauseCount: 'توقف هر N برچسب', + replicates: 'تکرار در هر برچسب', + overridePauseCount: 'نادیده گرفتن شمارش توقف (فقط برش آخرین)', mediaMode: 'حالت رسانه', outputHeading: 'خروجی', mediaModeT: 'T — پاره کردن', @@ -87,8 +91,18 @@ const fa = { printerSettingsHeading: 'چاپگر (اختیاری)', printSpeed: 'سرعت چاپ (ips, 2-14)', printSpeedHint: 'مختص چاپگر. برای استفاده از پیش‌فرض خالی بگذارید.', + speedHeading: 'سرعت (ips، ۲-۱۴)', + speedPrint: 'چاپ', + speedSlew: 'حرکت', + speedBackfeed: 'بازگشت', + slewSpeed: 'سرعت حرکت (ips، ۲-۱۴)', + backfeedSpeed: 'سرعت بازگشت (ips، ۲-۱۴)', darkness: 'تیرگی (-30 تا +30)', darknessHint: 'مختص چاپگر. برای استفاده از پیش‌فرض خالی بگذارید.', + instantDarkness: 'تیرگی فوری (۰-۳۰)', + darknessHeading: 'تیرگی', + darknessPermanent: 'دائمی (-۳۰..۳۰)', + darknessInstant: 'فوری (۰..۳۰)', mediaType: 'نوع رسانه', mediaTypeT: 'انتقال حرارتی', mediaTypeD: 'حرارتی مستقیم', @@ -96,6 +110,7 @@ const fa = { printOrientationN: 'عادی', printOrientationI: 'وارونه (180°)', printOrientationIndicator: 'وارونه', + mirror: 'تصویر آینه‌ای', defaultFont: 'سبک متن پیش‌فرض', defaultFontId: 'قلم', defaultFontHeight: 'ارتفاع (نقطه)', diff --git a/src/locales/fi.ts b/src/locales/fi.ts index c3137871..9dc5ec26 100644 --- a/src/locales/fi.ts +++ b/src/locales/fi.ts @@ -76,6 +76,10 @@ const fi = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Tulostusmäärä', + quantityAdvancedHeading: 'Määrä (lisäasetukset)', + pauseCount: 'Tauko joka N. etiketti', + replicates: 'Replikoinnit per etiketti', + overridePauseCount: 'Ohita taukolaskuri (leikkaa vain viimeinen)', mediaMode: 'Mediatila', outputHeading: 'Tuloste', mediaModeT: 'T — Repäisy', @@ -87,8 +91,18 @@ const fi = { printerSettingsHeading: 'Tulostin (valinnainen)', printSpeed: 'Tulostusnopeus (ips, 2-14)', printSpeedHint: 'Tulostinkohtainen. Jätä tyhjäksi käyttääksesi oletusarvoa.', + speedHeading: 'Nopeus (ips, 2-14)', + speedPrint: 'Tulostus', + speedSlew: 'Syöttö', + speedBackfeed: 'Takaisinsyöttö', + slewSpeed: 'Syöttönopeus (ips, 2-14)', + backfeedSpeed: 'Takaisinsyöttönopeus (ips, 2-14)', darkness: 'Tummuus (-30 - +30)', darknessHint: 'Tulostinkohtainen. Jätä tyhjäksi käyttääksesi oletusarvoa.', + darknessHeading: 'Tummuus', + darknessPermanent: 'Pysyvä (-30..30)', + darknessInstant: 'Välitön (0..30)', + instantDarkness: 'Välitön tummuus (0-30)', mediaType: 'Materiaalityyppi', mediaTypeT: 'Lämpösiirto', mediaTypeD: 'Suora lämpö', @@ -96,6 +110,7 @@ const fi = { printOrientationN: 'Normaali', printOrientationI: 'Ylösalaisin (180°)', printOrientationIndicator: 'Ylösalaisin', + mirror: 'Peilikuva', defaultFont: 'Oletustekstityyli', defaultFontId: 'Fontti', defaultFontHeight: 'Korkeus (pisteet)', diff --git a/src/locales/fr.ts b/src/locales/fr.ts index ddb238a1..8764cc79 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -76,6 +76,10 @@ const fr = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Quantité d\'impression', + quantityAdvancedHeading: 'Quantité (avancé)', + pauseCount: 'Pause toutes les N étiquettes', + replicates: 'Réplications par étiquette', + overridePauseCount: 'Remplacer le nombre de pauses (couper à la fin)', mediaMode: 'Mode média', outputHeading: 'Sortie', mediaModeT: 'T — Déchirement', @@ -87,8 +91,18 @@ const fr = { printerSettingsHeading: 'Imprimante (facultatif)', printSpeed: 'Vitesse d\'impression (ips, 2-14)', printSpeedHint: 'Spécifique à l\'imprimante. Laisser vide pour la valeur par défaut.', + speedHeading: 'Vitesse (ips, 2-14)', + speedPrint: 'Impression', + speedSlew: 'Avance', + speedBackfeed: 'Retour', + slewSpeed: 'Vitesse de défilement (ips, 2-14)', + backfeedSpeed: 'Vitesse de retour (ips, 2-14)', darkness: 'Densité d\'impression (-30 à +30)', darknessHint: 'Spécifique à l\'imprimante. Laisser vide pour la valeur par défaut.', + darknessHeading: 'Noirceur', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Instantané (0..30)', + instantDarkness: 'Noirceur immédiate (0-30)', mediaType: 'Type de support', mediaTypeT: 'Transfert thermique', mediaTypeD: 'Thermique direct', @@ -96,6 +110,7 @@ const fr = { printOrientationN: 'Normal', printOrientationI: 'Tête en bas (180°)', printOrientationIndicator: 'Tête en bas', + mirror: 'Image miroir', defaultFont: 'Style de texte par défaut', defaultFontId: 'Police', defaultFontHeight: 'Hauteur (points)', diff --git a/src/locales/he.ts b/src/locales/he.ts index 16c9b6e9..321b3a57 100644 --- a/src/locales/he.ts +++ b/src/locales/he.ts @@ -76,6 +76,10 @@ const he = { dpmm12: '12 נקודות/מ"מ — 300 dpi', dpmm24: '24 נקודות/מ"מ — 600 dpi', printQuantity: 'כמות הדפסה', + quantityAdvancedHeading: 'כמות (מתקדם)', + pauseCount: 'השהיה כל N תוויות', + replicates: 'שכפולים לכל תווית', + overridePauseCount: 'עקוף ספירת השהיה (חתוך רק את האחרונה)', mediaMode: 'מצב מדיה', outputHeading: 'פלט', mediaModeT: 'T — קריעה', @@ -87,8 +91,18 @@ const he = { printerSettingsHeading: 'מדפסת (אופציונלי)', printSpeed: 'מהירות הדפסה (ips, 2-14)', printSpeedHint: 'ספציפי למדפסת. השאר ריק לערך ברירת המחדל.', + speedHeading: 'מהירות (ips, 2-14)', + speedPrint: 'הדפסה', + speedSlew: 'הזנה', + speedBackfeed: 'הזנה לאחור', + slewSpeed: 'מהירות הזנה (ips, 2-14)', + backfeedSpeed: 'מהירות הזנה לאחור (ips, 2-14)', darkness: 'כהות (-30 עד +30)', darknessHint: 'ספציפי למדפסת. השאר ריק לערך ברירת המחדל.', + instantDarkness: 'כהות מיידית (0-30)', + darknessHeading: 'כהות', + darknessPermanent: 'קבוע (-30..30)', + darknessInstant: 'מיידי (0..30)', mediaType: 'סוג המדיה', mediaTypeT: 'העברה תרמית', mediaTypeD: 'תרמי ישיר', @@ -96,6 +110,7 @@ const he = { printOrientationN: 'רגיל', printOrientationI: 'הפוך (180°)', printOrientationIndicator: 'הפוך', + mirror: 'תמונת ראי', defaultFont: 'סגנון טקסט ברירת מחדל', defaultFontId: 'גופן', defaultFontHeight: 'גובה (נקודות)', diff --git a/src/locales/hr.ts b/src/locales/hr.ts index a9c82cfd..ffa32b4f 100644 --- a/src/locales/hr.ts +++ b/src/locales/hr.ts @@ -76,6 +76,10 @@ const hr = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Količina ispisa', + quantityAdvancedHeading: 'Količina (napredno)', + pauseCount: 'Pauza svakih N etiketa', + replicates: 'Replike po etiketi', + overridePauseCount: 'Premosti brojač pauze (reži samo zadnju)', mediaMode: 'Način medija', outputHeading: 'Izlaz', mediaModeT: 'T — Otkidanje', @@ -87,8 +91,18 @@ const hr = { printerSettingsHeading: 'Pisač (neobavezno)', printSpeed: 'Brzina ispisa (ips, 2-14)', printSpeedHint: 'Specifično za pisač. Ostavite prazno za zadanu vrijednost.', + speedHeading: 'Brzina (ips, 2-14)', + speedPrint: 'Ispis', + speedSlew: 'Pomak', + speedBackfeed: 'Povratni pomak', + slewSpeed: 'Brzina pomaka (ips, 2-14)', + backfeedSpeed: 'Brzina povratnog pomaka (ips, 2-14)', darkness: 'Zacrnjenje (-30 do +30)', darknessHint: 'Specifično za pisač. Ostavite prazno za zadanu vrijednost.', + darknessHeading: 'Tamnoća', + darknessPermanent: 'Trajno (-30..30)', + darknessInstant: 'Trenutno (0..30)', + instantDarkness: 'Trenutna tamnoća (0-30)', mediaType: 'Vrsta medija', mediaTypeT: 'Toplinski prijenos', mediaTypeD: 'Izravni termalni', @@ -96,6 +110,7 @@ const hr = { printOrientationN: 'Normalno', printOrientationI: 'Naopako (180°)', printOrientationIndicator: 'Naopako', + mirror: 'Zrcalna slika', defaultFont: 'Zadani stil teksta', defaultFontId: 'Font', defaultFontHeight: 'Visina (točke)', diff --git a/src/locales/hu.ts b/src/locales/hu.ts index d3a3ac11..9cde0e46 100644 --- a/src/locales/hu.ts +++ b/src/locales/hu.ts @@ -76,6 +76,10 @@ const hu = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Nyomtatási mennyiség', + quantityAdvancedHeading: 'Mennyiség (haladó)', + pauseCount: 'Szünet N címkénként', + replicates: 'Ismétlés címkénként', + overridePauseCount: 'Szünetszám felülbírálása (csak utolsónál vágás)', mediaMode: 'Média mód', outputHeading: 'Kimenet', mediaModeT: 'T — Letépés', @@ -87,8 +91,18 @@ const hu = { printerSettingsHeading: 'Nyomtató (opcionális)', printSpeed: 'Nyomtatási sebesség (ips, 2-14)', printSpeedHint: 'Nyomtatófüggő. Hagyja üresen a nyomtató alapértelmezett értékéhez.', + speedHeading: 'Sebesség (ips, 2-14)', + speedPrint: 'Nyomtatás', + speedSlew: 'Továbbítás', + speedBackfeed: 'Visszacsévélés', + slewSpeed: 'Továbbítási sebesség (ips, 2-14)', + backfeedSpeed: 'Visszacsévélési sebesség (ips, 2-14)', darkness: 'Nyomtatási sűrűség (-30 - +30)', darknessHint: 'Nyomtatófüggő. Hagyja üresen a nyomtató alapértelmezett értékéhez.', + darknessHeading: 'Sötétség', + darknessPermanent: 'Állandó (-30..30)', + darknessInstant: 'Azonnali (0..30)', + instantDarkness: 'Azonnali sötétség (0-30)', mediaType: 'Hordozó típusa', mediaTypeT: 'Hőtranszfer', mediaTypeD: 'Direkt termál', @@ -96,6 +110,7 @@ const hu = { printOrientationN: 'Normál', printOrientationI: 'Fejjel lefelé (180°)', printOrientationIndicator: 'Fejjel lefelé', + mirror: 'Tükörkép', defaultFont: 'Alapértelmezett szövegstílus', defaultFontId: 'Betűtípus', defaultFontHeight: 'Magasság (pontok)', diff --git a/src/locales/it.ts b/src/locales/it.ts index 98ec3c53..6470bc6c 100644 --- a/src/locales/it.ts +++ b/src/locales/it.ts @@ -76,6 +76,10 @@ const it = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Quantità di stampa', + quantityAdvancedHeading: 'Quantità (avanzato)', + pauseCount: 'Pausa ogni N etichette', + replicates: 'Repliche per etichetta', + overridePauseCount: 'Sostituisci conteggio pause (taglia solo l\'ultimo)', mediaMode: 'Modalità supporto', outputHeading: 'Output', mediaModeT: 'T — Strappo', @@ -87,8 +91,18 @@ const it = { printerSettingsHeading: 'Stampante (opzionale)', printSpeed: 'Velocità di stampa (ips, 2-14)', printSpeedHint: 'Specifico per stampante. Lascia vuoto per usare il valore predefinito.', + speedHeading: 'Velocità (ips, 2-14)', + speedPrint: 'Stampa', + speedSlew: 'Avanzamento', + speedBackfeed: 'Ritorno', + slewSpeed: 'Velocità di avanzamento (ips, 2-14)', + backfeedSpeed: 'Velocità di ritorno (ips, 2-14)', darkness: 'Densità di stampa (-30 a +30)', darknessHint: 'Specifico per stampante. Lascia vuoto per usare il valore predefinito.', + darknessHeading: 'Scurezza', + darknessPermanent: 'Permanente (-30..30)', + darknessInstant: 'Immediato (0..30)', + instantDarkness: 'Scurezza immediata (0-30)', mediaType: 'Tipo di supporto', mediaTypeT: 'Trasferimento termico', mediaTypeD: 'Termica diretta', @@ -96,6 +110,7 @@ const it = { printOrientationN: 'Normale', printOrientationI: 'Capovolto (180°)', printOrientationIndicator: 'Capovolto', + mirror: 'Immagine speculare', defaultFont: 'Stile di testo predefinito', defaultFontId: 'Carattere', defaultFontHeight: 'Altezza (punti)', diff --git a/src/locales/ja.ts b/src/locales/ja.ts index 9b42046a..af0e38bd 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -76,6 +76,10 @@ const ja = { dpmm12: '12 ドット/mm — 300 dpi', dpmm24: '24 ドット/mm — 600 dpi', printQuantity: '印刷枚数', + quantityAdvancedHeading: '数量(詳細)', + pauseCount: 'N枚ごとに一時停止', + replicates: 'ラベルごとの複製数', + overridePauseCount: '一時停止カウントを上書き(最後のみカット)', mediaMode: 'メディアモード', outputHeading: '出力', mediaModeT: 'T — ティアオフ', @@ -87,8 +91,18 @@ const ja = { printerSettingsHeading: 'プリンター(オプション)', printSpeed: '印刷速度 (ips, 2-14)', printSpeedHint: 'プリンター固有。デフォルト値を使用するには空のままにします。', + speedHeading: '速度 (ips, 2-14)', + speedPrint: '印刷', + speedSlew: 'スリュー', + speedBackfeed: 'バックフィード', + slewSpeed: 'スリュー速度 (ips, 2-14)', + backfeedSpeed: 'バックフィード速度 (ips, 2-14)', darkness: '濃度 (-30 ~ +30)', darknessHint: 'プリンター固有。デフォルト値を使用するには空のままにします。', + instantDarkness: '即時濃度 (0-30)', + darknessHeading: '濃度', + darknessPermanent: '永続 (-30..30)', + darknessInstant: '即時 (0..30)', mediaType: 'メディアタイプ', mediaTypeT: '熱転写', mediaTypeD: 'ダイレクトサーマル', @@ -96,6 +110,7 @@ const ja = { printOrientationN: '通常', printOrientationI: '上下逆 (180°)', printOrientationIndicator: '上下逆', + mirror: '鏡像', defaultFont: '既定のテキストスタイル', defaultFontId: 'フォント', defaultFontHeight: '高さ (ドット)', diff --git a/src/locales/ko.ts b/src/locales/ko.ts index bcb2a5bb..280f56c7 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -76,6 +76,10 @@ const ko = { dpmm12: '12 점/mm — 300 dpi', dpmm24: '24 점/mm — 600 dpi', printQuantity: '인쇄 수량', + quantityAdvancedHeading: '수량 (고급)', + pauseCount: 'N개 라벨마다 일시정지', + replicates: '라벨당 복제 수', + overridePauseCount: '일시정지 카운트 재정의 (마지막만 절단)', mediaMode: '미디어 모드', outputHeading: '출력', mediaModeT: 'T — 찢어 분리', @@ -87,8 +91,18 @@ const ko = { printerSettingsHeading: '프린터 (선택 사항)', printSpeed: '인쇄 속도 (ips, 2-14)', printSpeedHint: '프린터별로 다릅니다. 기본값을 사용하려면 비워 두세요.', + speedHeading: '속도 (ips, 2-14)', + speedPrint: '인쇄', + speedSlew: '이송', + speedBackfeed: '역이송', + slewSpeed: '이송 속도 (ips, 2-14)', + backfeedSpeed: '역이송 속도 (ips, 2-14)', darkness: '농도 (-30 ~ +30)', darknessHint: '프린터별로 다릅니다. 기본값을 사용하려면 비워 두세요.', + instantDarkness: '즉시 농도 (0-30)', + darknessHeading: '농도', + darknessPermanent: '영구 (-30..30)', + darknessInstant: '즉시 (0..30)', mediaType: '미디어 유형', mediaTypeT: '열전사', mediaTypeD: '감열식', @@ -96,6 +110,7 @@ const ko = { printOrientationN: '일반', printOrientationI: '거꾸로 (180°)', printOrientationIndicator: '거꾸로', + mirror: '거울 이미지', defaultFont: '기본 텍스트 스타일', defaultFontId: '글꼴', defaultFontHeight: '높이 (도트)', diff --git a/src/locales/lt.ts b/src/locales/lt.ts index 78c1e021..216ff7f4 100644 --- a/src/locales/lt.ts +++ b/src/locales/lt.ts @@ -76,6 +76,10 @@ const lt = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Spausdinimo kiekis', + quantityAdvancedHeading: 'Kiekis (išplėstinis)', + pauseCount: 'Pauzė kas N etikečių', + replicates: 'Pakartojimai etiketei', + overridePauseCount: 'Nepaisyti pauzės skaitiklio (kirpti tik paskutinę)', mediaMode: 'Laikmenos režimas', outputHeading: 'Išvestis', mediaModeT: 'T — Nuplėšimas', @@ -87,8 +91,18 @@ const lt = { printerSettingsHeading: 'Spausdintuvas (neprivaloma)', printSpeed: 'Spausdinimo greitis (ips, 2-14)', printSpeedHint: 'Priklauso nuo spausdintuvo. Palikite tuščią numatytąjai reikšmei.', + speedHeading: 'Greitis (ips, 2-14)', + speedPrint: 'Spausdinimas', + speedSlew: 'Postūmis', + speedBackfeed: 'Atgalinis postūmis', + slewSpeed: 'Postūmio greitis (ips, 2-14)', + backfeedSpeed: 'Atgalinio postūmio greitis (ips, 2-14)', darkness: 'Tamsumas (-30 iki +30)', darknessHint: 'Priklauso nuo spausdintuvo. Palikite tuščią numatytąjai reikšmei.', + instantDarkness: 'Momentinis tamsumas (0-30)', + darknessHeading: 'Tamsumas', + darknessPermanent: 'Nuolatinis (-30..30)', + darknessInstant: 'Momentinis (0..30)', mediaType: 'Laikmenos tipas', mediaTypeT: 'Šiluminis perdavimas', mediaTypeD: 'Tiesioginis terminis', @@ -96,6 +110,7 @@ const lt = { printOrientationN: 'Įprasta', printOrientationI: 'Apsuktai (180°)', printOrientationIndicator: 'Apsuktai', + mirror: 'Veidrodinis vaizdas', defaultFont: 'Numatytasis teksto stilius', defaultFontId: 'Šriftas', defaultFontHeight: 'Aukštis (taškai)', diff --git a/src/locales/lv.ts b/src/locales/lv.ts index 2f63af7e..ba6f34a7 100644 --- a/src/locales/lv.ts +++ b/src/locales/lv.ts @@ -76,6 +76,10 @@ const lv = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Drukāšanas daudzums', + quantityAdvancedHeading: 'Daudzums (paplašināti)', + pauseCount: 'Pauze ik pēc N etiķetēm', + replicates: 'Atkārtojumi uz etiķeti', + overridePauseCount: 'Pārrakstīt pauzes skaitītāju (griezt tikai pēdējo)', mediaMode: 'Nesēja režīms', outputHeading: 'Izvade', mediaModeT: 'T — Noplēšana', @@ -87,8 +91,18 @@ const lv = { printerSettingsHeading: 'Printeris (neobligāti)', printSpeed: 'Drukāšanas ātrums (ips, 2-14)', printSpeedHint: 'Atkarīgs no printera. Atstājiet tukšu, lai izmantotu noklusējumu.', + speedHeading: 'Ātrums (ips, 2-14)', + speedPrint: 'Druka', + speedSlew: 'Pārvietošana', + speedBackfeed: 'Atgaita', + slewSpeed: 'Pārvietošanās ātrums (ips, 2-14)', + backfeedSpeed: 'Atgaitas ātrums (ips, 2-14)', darkness: 'Tumšums (-30 līdz +30)', darknessHint: 'Atkarīgs no printera. Atstājiet tukšu, lai izmantotu noklusējumu.', + instantDarkness: 'Tūlītēja tumšums (0-30)', + darknessHeading: 'Tumšums', + darknessPermanent: 'Pastāvīgi (-30..30)', + darknessInstant: 'Tūlītēji (0..30)', mediaType: 'Materiāla veids', mediaTypeT: 'Termopārnese', mediaTypeD: 'Tiešais termālais', @@ -96,6 +110,7 @@ const lv = { printOrientationN: 'Parasta', printOrientationI: 'Otrādi (180°)', printOrientationIndicator: 'Otrādi', + mirror: 'Spoguļattēls', defaultFont: 'Noklusējuma teksta stils', defaultFontId: 'Fonts', defaultFontHeight: 'Augstums (punkti)', diff --git a/src/locales/nl.ts b/src/locales/nl.ts index 5abbef27..d1603977 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -76,6 +76,10 @@ const nl = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Afdrukoplage', + quantityAdvancedHeading: 'Aantal (geavanceerd)', + pauseCount: 'Pauze elke N labels', + replicates: 'Replicaties per label', + overridePauseCount: 'Pauzeteller overschrijven (alleen laatste snijden)', mediaMode: 'Mediamodus', outputHeading: 'Uitvoer', mediaModeT: 'T — Afscheuren', @@ -87,8 +91,18 @@ const nl = { printerSettingsHeading: 'Printer (optioneel)', printSpeed: 'Afdruksnelheid (ips, 2-14)', printSpeedHint: 'Printerspecifiek. Laat leeg om de standaardwaarde te gebruiken.', + speedHeading: 'Snelheid (ips, 2-14)', + speedPrint: 'Afdruk', + speedSlew: 'Doorvoer', + speedBackfeed: 'Terugvoer', + slewSpeed: 'Doorvoersnelheid (ips, 2-14)', + backfeedSpeed: 'Terugvoersnelheid (ips, 2-14)', darkness: 'Drukdichtheid (-30 tot +30)', darknessHint: 'Printerspecifiek. Laat leeg om de standaardwaarde te gebruiken.', + darknessHeading: 'Zwartheid', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Direct (0..30)', + instantDarkness: 'Directe zwartheid (0-30)', mediaType: 'Mediumtype', mediaTypeT: 'Thermische transfer', mediaTypeD: 'Direct thermisch', @@ -96,6 +110,7 @@ const nl = { printOrientationN: 'Normaal', printOrientationI: 'Ondersteboven (180°)', printOrientationIndicator: 'Ondersteboven', + mirror: 'Spiegelbeeld', defaultFont: 'Standaard tekststijl', defaultFontId: 'Lettertype', defaultFontHeight: 'Hoogte (dots)', diff --git a/src/locales/no.ts b/src/locales/no.ts index 291dec3f..a1d53a0b 100644 --- a/src/locales/no.ts +++ b/src/locales/no.ts @@ -76,6 +76,10 @@ const no = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Utskriftsmengde', + quantityAdvancedHeading: 'Antall (avansert)', + pauseCount: 'Pause hver N etikett', + replicates: 'Replikeringer per etikett', + overridePauseCount: 'Overstyr pauseteller (kutt kun siste)', mediaMode: 'Mediemodus', outputHeading: 'Utdata', mediaModeT: 'T — Avrivning', @@ -87,8 +91,18 @@ const no = { printerSettingsHeading: 'Skriver (valgfritt)', printSpeed: 'Utskriftshastighet (ips, 2-14)', printSpeedHint: 'Skriverspesifikk. La stå tom for skriverens standardverdi.', + speedHeading: 'Hastighet (ips, 2-14)', + speedPrint: 'Utskrift', + speedSlew: 'Matefart', + speedBackfeed: 'Tilbakemating', + slewSpeed: 'Matehastighet (ips, 2-14)', + backfeedSpeed: 'Tilbakematingshastighet (ips, 2-14)', darkness: 'Svarthet (-30 til +30)', darknessHint: 'Skriverspesifikk. La stå tom for skriverens standardverdi.', + darknessHeading: 'Svarthet', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Umiddelbar (0..30)', + instantDarkness: 'Umiddelbar svarthet (0-30)', mediaType: 'Materialtype', mediaTypeT: 'Termotransfer', mediaTypeD: 'Direkte termisk', @@ -96,6 +110,7 @@ const no = { printOrientationN: 'Normal', printOrientationI: 'Opp ned (180°)', printOrientationIndicator: 'Opp ned', + mirror: 'Speilbilde', defaultFont: 'Standardtekststil', defaultFontId: 'Skrift', defaultFontHeight: 'Høyde (punkter)', diff --git a/src/locales/pl.ts b/src/locales/pl.ts index 9db166ee..85e4e731 100644 --- a/src/locales/pl.ts +++ b/src/locales/pl.ts @@ -76,6 +76,10 @@ const pl = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Ilość wydruków', + quantityAdvancedHeading: 'Ilość (zaawansowane)', + pauseCount: 'Pauza co N etykiet', + replicates: 'Replikacje na etykietę', + overridePauseCount: 'Zastąp licznik pauzy (przytnij tylko ostatnią)', mediaMode: 'Tryb nośnika', outputHeading: 'Wyjście', mediaModeT: 'T — Odrywanie', @@ -87,8 +91,18 @@ const pl = { printerSettingsHeading: 'Drukarka (opcjonalne)', printSpeed: 'Prędkość drukowania (ips, 2-14)', printSpeedHint: 'Specyficzne dla drukarki. Pozostaw puste, aby użyć wartości domyślnej.', + speedHeading: 'Prędkość (ips, 2-14)', + speedPrint: 'Druk', + speedSlew: 'Przesuw', + speedBackfeed: 'Cofanie', + slewSpeed: 'Prędkość przesuwu (ips, 2-14)', + backfeedSpeed: 'Prędkość cofania (ips, 2-14)', darkness: 'Gęstość druku (-30 do +30)', darknessHint: 'Specyficzne dla drukarki. Pozostaw puste, aby użyć wartości domyślnej.', + darknessHeading: 'Zaczernienie', + darknessPermanent: 'Stałe (-30..30)', + darknessInstant: 'Natychmiast (0..30)', + instantDarkness: 'Natychmiastowe zaczernienie (0-30)', mediaType: 'Typ nośnika', mediaTypeT: 'Termotransferowy', mediaTypeD: 'Termiczny bezpośredni', @@ -96,6 +110,7 @@ const pl = { printOrientationN: 'Normalna', printOrientationI: 'Do góry nogami (180°)', printOrientationIndicator: 'Do góry nogami', + mirror: 'Lustrzane odbicie', defaultFont: 'Domyślny styl tekstu', defaultFontId: 'Czcionka', defaultFontHeight: 'Wysokość (punkty)', diff --git a/src/locales/pt.ts b/src/locales/pt.ts index 592562e2..3e632b16 100644 --- a/src/locales/pt.ts +++ b/src/locales/pt.ts @@ -76,6 +76,10 @@ const pt = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Quantidade de impressão', + quantityAdvancedHeading: 'Quantidade (avançado)', + pauseCount: 'Pausa a cada N etiquetas', + replicates: 'Réplicas por etiqueta', + overridePauseCount: 'Substituir contagem de pausa (cortar só no fim)', mediaMode: 'Modo de mídia', outputHeading: 'Saída', mediaModeT: 'T — Destacar', @@ -87,8 +91,18 @@ const pt = { printerSettingsHeading: 'Impressora (opcional)', printSpeed: 'Velocidade de impressão (ips, 2-14)', printSpeedHint: 'Específico da impressora. Deixe vazio para usar o padrão da impressora.', + speedHeading: 'Velocidade (ips, 2-14)', + speedPrint: 'Impressão', + speedSlew: 'Avanço', + speedBackfeed: 'Retorno', + slewSpeed: 'Velocidade de avanço (ips, 2-14)', + backfeedSpeed: 'Velocidade de retorno (ips, 2-14)', darkness: 'Densidade de impressão (-30 a +30)', darknessHint: 'Específico da impressora. Deixe vazio para usar o padrão da impressora.', + darknessHeading: 'Escurecimento', + darknessPermanent: 'Permanente (-30..30)', + darknessInstant: 'Imediato (0..30)', + instantDarkness: 'Escurecimento imediato (0-30)', mediaType: 'Tipo de suporte', mediaTypeT: 'Transferência térmica', mediaTypeD: 'Térmica direta', @@ -96,6 +110,7 @@ const pt = { printOrientationN: 'Normal', printOrientationI: 'De cabeça para baixo (180°)', printOrientationIndicator: 'De cabeça para baixo', + mirror: 'Imagem espelhada', defaultFont: 'Estilo de texto predefinido', defaultFontId: 'Fonte', defaultFontHeight: 'Altura (pontos)', diff --git a/src/locales/ro.ts b/src/locales/ro.ts index c8c0fa4b..220361fa 100644 --- a/src/locales/ro.ts +++ b/src/locales/ro.ts @@ -76,6 +76,10 @@ const ro = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Cantitate imprimare', + quantityAdvancedHeading: 'Cantitate (avansat)', + pauseCount: 'Pauză la fiecare N etichete', + replicates: 'Replicări pe etichetă', + overridePauseCount: 'Suprascrie nr. pauze (taie doar ultima)', mediaMode: 'Mod media', outputHeading: 'Ieșire', mediaModeT: 'T — Rupere', @@ -87,8 +91,18 @@ const ro = { printerSettingsHeading: 'Imprimantă (opțional)', printSpeed: 'Viteza de imprimare (ips, 2-14)', printSpeedHint: 'Specific imprimantei. Lăsați gol pentru valoarea implicită.', + speedHeading: 'Viteză (ips, 2-14)', + speedPrint: 'Tipărire', + speedSlew: 'Avansare', + speedBackfeed: 'Retragere', + slewSpeed: 'Viteză de avansare (ips, 2-14)', + backfeedSpeed: 'Viteză de retragere (ips, 2-14)', darkness: 'Densitate imprimare (-30 până la +30)', darknessHint: 'Specific imprimantei. Lăsați gol pentru valoarea implicită.', + darknessHeading: 'Întunecare', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Imediat (0..30)', + instantDarkness: 'Întunecare imediată (0-30)', mediaType: 'Tip mediu', mediaTypeT: 'Transfer termic', mediaTypeD: 'Termic direct', @@ -96,6 +110,7 @@ const ro = { printOrientationN: 'Normal', printOrientationI: 'Cu susul în jos (180°)', printOrientationIndicator: 'Cu susul în jos', + mirror: 'Imagine în oglindă', defaultFont: 'Stil text implicit', defaultFontId: 'Font', defaultFontHeight: 'Înălțime (puncte)', diff --git a/src/locales/sk.ts b/src/locales/sk.ts index 2947df81..46048bfe 100644 --- a/src/locales/sk.ts +++ b/src/locales/sk.ts @@ -76,6 +76,10 @@ const sk = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Počet výtlačkov', + quantityAdvancedHeading: 'Množstvo (pokročilé)', + pauseCount: 'Pauza každých N štítkov', + replicates: 'Replikácie na štítok', + overridePauseCount: 'Prepísať počet páuz (rezať len poslednú)', mediaMode: 'Režim média', outputHeading: 'Výstup', mediaModeT: 'T — Odtrhávanie', @@ -87,8 +91,18 @@ const sk = { printerSettingsHeading: 'Tlačiareň (voliteľné)', printSpeed: 'Rýchlosť tlače (ips, 2-14)', printSpeedHint: 'Špecifické pre tlačiareň. Ponechajte prázdne pre predvolenú hodnotu.', + speedHeading: 'Rýchlosť (ips, 2-14)', + speedPrint: 'Tlač', + speedSlew: 'Posuv', + speedBackfeed: 'Spätný posuv', + slewSpeed: 'Rýchlosť posuvu (ips, 2-14)', + backfeedSpeed: 'Rýchlosť spätného posuvu (ips, 2-14)', darkness: 'Sýtosť tlače (-30 až +30)', darknessHint: 'Špecifické pre tlačiareň. Ponechajte prázdne pre predvolenú hodnotu.', + darknessHeading: 'Sýtosť', + darknessPermanent: 'Trvalé (-30..30)', + darknessInstant: 'Okamžite (0..30)', + instantDarkness: 'Okamžitá sýtosť (0-30)', mediaType: 'Typ média', mediaTypeT: 'Termotransferový', mediaTypeD: 'Priamy termotisk', @@ -96,6 +110,7 @@ const sk = { printOrientationN: 'Normálne', printOrientationI: 'Hore nohami (180°)', printOrientationIndicator: 'Hore nohami', + mirror: 'Zrkadlový obraz', defaultFont: 'Predvolený štýl textu', defaultFontId: 'Písmo', defaultFontHeight: 'Výška (body)', diff --git a/src/locales/sl.ts b/src/locales/sl.ts index 6607836b..0d6e90a0 100644 --- a/src/locales/sl.ts +++ b/src/locales/sl.ts @@ -76,6 +76,10 @@ const sl = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Količina tiskanja', + quantityAdvancedHeading: 'Količina (napredno)', + pauseCount: 'Premor vsakih N etiket', + replicates: 'Replike na etiketo', + overridePauseCount: 'Razveljavi števec premorov (reži le zadnjo)', mediaMode: 'Način medija', outputHeading: 'Izhod', mediaModeT: 'T — Odtrganje', @@ -87,8 +91,18 @@ const sl = { printerSettingsHeading: 'Tiskalnik (izbirno)', printSpeed: 'Hitrost tiskanja (ips, 2-14)', printSpeedHint: 'Specifično za tiskalnik. Pustite prazno za privzeto vrednost.', + speedHeading: 'Hitrost (ips, 2-14)', + speedPrint: 'Tisk', + speedSlew: 'Pomik', + speedBackfeed: 'Povratni pomik', + slewSpeed: 'Hitrost pomika (ips, 2-14)', + backfeedSpeed: 'Hitrost povratnega pomika (ips, 2-14)', darkness: 'Temnost (-30 do +30)', darknessHint: 'Specifično za tiskalnik. Pustite prazno za privzeto vrednost.', + instantDarkness: 'Takojšnja temnost (0-30)', + darknessHeading: 'Temnost', + darknessPermanent: 'Trajno (-30..30)', + darknessInstant: 'Takojšnje (0..30)', mediaType: 'Vrsta medija', mediaTypeT: 'Termalni prenos', mediaTypeD: 'Neposredno termalno', @@ -96,6 +110,7 @@ const sl = { printOrientationN: 'Normalno', printOrientationI: 'Obrnjeno (180°)', printOrientationIndicator: 'Obrnjeno', + mirror: 'Zrcalna slika', defaultFont: 'Privzeti slog besedila', defaultFontId: 'Pisava', defaultFontHeight: 'Višina (točke)', diff --git a/src/locales/sr.ts b/src/locales/sr.ts index c382fd19..ffa17f8b 100644 --- a/src/locales/sr.ts +++ b/src/locales/sr.ts @@ -76,6 +76,10 @@ const sr = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Количина штампе', + quantityAdvancedHeading: 'Количина (напредно)', + pauseCount: 'Пауза сваких N етикета', + replicates: 'Реплике по етикети', + overridePauseCount: 'Премости бројач паузе (сеци само последњу)', mediaMode: 'Режим медија', outputHeading: 'Излаз', mediaModeT: 'T — Откидање', @@ -87,8 +91,18 @@ const sr = { printerSettingsHeading: 'Штампач (опционално)', printSpeed: 'Брзина штампе (ips, 2-14)', printSpeedHint: 'Специфично за штампач. Оставите празно за подразумевану вредност.', + speedHeading: 'Брзина (ips, 2-14)', + speedPrint: 'Штампа', + speedSlew: 'Помак', + speedBackfeed: 'Повратни помак', + slewSpeed: 'Брзина помераја (ips, 2-14)', + backfeedSpeed: 'Брзина повратног помераја (ips, 2-14)', darkness: 'Затамњење (-30 до +30)', darknessHint: 'Специфично за штампач. Оставите празно за подразумевану вредност.', + instantDarkness: 'Тренутна тамноћа (0-30)', + darknessHeading: 'Тамноћа', + darknessPermanent: 'Трајно (-30..30)', + darknessInstant: 'Тренутно (0..30)', mediaType: 'Тип медија', mediaTypeT: 'Топлотни пренос', mediaTypeD: 'Директни термални', @@ -96,6 +110,7 @@ const sr = { printOrientationN: 'Нормално', printOrientationI: 'Наопако (180°)', printOrientationIndicator: 'Наопако', + mirror: 'Огледална слика', defaultFont: 'Подразумевани стил текста', defaultFontId: 'Фонт', defaultFontHeight: 'Висина (тачке)', diff --git a/src/locales/sv.ts b/src/locales/sv.ts index d9ddcb73..f6a99f41 100644 --- a/src/locales/sv.ts +++ b/src/locales/sv.ts @@ -76,6 +76,10 @@ const sv = { dpmm12: '12 dpmm — 300 dpi', dpmm24: '24 dpmm — 600 dpi', printQuantity: 'Utskriftsmängd', + quantityAdvancedHeading: 'Antal (avancerat)', + pauseCount: 'Paus var N:e etikett', + replicates: 'Repliker per etikett', + overridePauseCount: 'Åsidosätt pausräknare (klipp endast sista)', mediaMode: 'Medieläge', outputHeading: 'Utmatning', mediaModeT: 'T — Avrivning', @@ -87,8 +91,18 @@ const sv = { printerSettingsHeading: 'Skrivare (valfritt)', printSpeed: 'Utskriftshastighet (ips, 2-14)', printSpeedHint: 'Skrivarspecifik. Lämna tom för skrivarens standardvärde.', + speedHeading: 'Hastighet (ips, 2-14)', + speedPrint: 'Utskrift', + speedSlew: 'Frammatning', + speedBackfeed: 'Återmatning', + slewSpeed: 'Frammatningshastighet (ips, 2-14)', + backfeedSpeed: 'Återmatningshastighet (ips, 2-14)', darkness: 'Svärta (-30 till +30)', darknessHint: 'Skrivarspecifik. Lämna tom för skrivarens standardvärde.', + darknessHeading: 'Svärta', + darknessPermanent: 'Permanent (-30..30)', + darknessInstant: 'Direkt (0..30)', + instantDarkness: 'Omedelbar svärta (0-30)', mediaType: 'Materialtyp', mediaTypeT: 'Termotransfer', mediaTypeD: 'Direkttermisk', @@ -96,6 +110,7 @@ const sv = { printOrientationN: 'Normal', printOrientationI: 'Upp och ner (180°)', printOrientationIndicator: 'Upp och ner', + mirror: 'Spegelbild', defaultFont: 'Standardtextstil', defaultFontId: 'Typsnitt', defaultFontHeight: 'Höjd (punkter)', diff --git a/src/locales/tr.ts b/src/locales/tr.ts index 2a20accd..b2813247 100644 --- a/src/locales/tr.ts +++ b/src/locales/tr.ts @@ -76,6 +76,10 @@ const tr = { dpmm12: '12 nokta/mm — 300 dpi', dpmm24: '24 nokta/mm — 600 dpi', printQuantity: 'Baskı miktarı', + quantityAdvancedHeading: 'Miktar (gelişmiş)', + pauseCount: 'Her N etikette duraklat', + replicates: 'Etiket başına kopya', + overridePauseCount: 'Duraklatma sayısını geçersiz kıl (yalnızca sonu kes)', mediaMode: 'Ortam modu', outputHeading: 'Çıktı', mediaModeT: 'T — Koparma', @@ -87,8 +91,18 @@ const tr = { printerSettingsHeading: 'Yazıcı (isteğe bağlı)', printSpeed: 'Yazdırma hızı (ips, 2-14)', printSpeedHint: 'Yazıcıya özel. Varsayılan için boş bırakın.', + speedHeading: 'Hız (ips, 2-14)', + speedPrint: 'Baskı', + speedSlew: 'İlerletme', + speedBackfeed: 'Geri besleme', + slewSpeed: 'İlerletme hızı (ips, 2-14)', + backfeedSpeed: 'Geri besleme hızı (ips, 2-14)', darkness: 'Koyuluk (-30 ile +30 arası)', darknessHint: 'Yazıcıya özel. Varsayılan için boş bırakın.', + instantDarkness: 'Anlık koyuluk (0-30)', + darknessHeading: 'Koyuluk', + darknessPermanent: 'Kalıcı (-30..30)', + darknessInstant: 'Anlık (0..30)', mediaType: 'Medya türü', mediaTypeT: 'Termal transfer', mediaTypeD: 'Doğrudan termal', @@ -96,6 +110,7 @@ const tr = { printOrientationN: 'Normal', printOrientationI: 'Baş aşağı (180°)', printOrientationIndicator: 'Baş aşağı', + mirror: 'Ayna görüntüsü', defaultFont: 'Varsayılan metin stili', defaultFontId: 'Yazı tipi', defaultFontHeight: 'Yükseklik (nokta)', diff --git a/src/locales/zh-hans.ts b/src/locales/zh-hans.ts index e6237271..b36ebe59 100644 --- a/src/locales/zh-hans.ts +++ b/src/locales/zh-hans.ts @@ -76,6 +76,10 @@ const zhHans = { dpmm12: '12 点/毫米 — 300 dpi', dpmm24: '24 点/毫米 — 600 dpi', printQuantity: '打印数量', + quantityAdvancedHeading: '数量(高级)', + pauseCount: '每 N 个标签暂停', + replicates: '每个标签的副本数', + overridePauseCount: '覆盖暂停计数(仅切最后一个)', mediaMode: '介质模式', outputHeading: '输出', mediaModeT: 'T — 撕离', @@ -87,8 +91,18 @@ const zhHans = { printerSettingsHeading: '打印机(可选)', printSpeed: '打印速度 (ips, 2-14)', printSpeedHint: '与打印机相关。留空使用打印机默认值。', + speedHeading: '速度 (ips, 2-14)', + speedPrint: '打印', + speedSlew: '走纸', + speedBackfeed: '回退', + slewSpeed: '走纸速度 (ips, 2-14)', + backfeedSpeed: '回退速度 (ips, 2-14)', darkness: '打印浓度 (-30 至 +30)', darknessHint: '与打印机相关。留空使用打印机默认值。', + instantDarkness: '即时浓度 (0-30)', + darknessHeading: '浓度', + darknessPermanent: '持久 (-30..30)', + darknessInstant: '即时 (0..30)', mediaType: '介质类型', mediaTypeT: '热转印', mediaTypeD: '直接热敏', @@ -96,6 +110,7 @@ const zhHans = { printOrientationN: '正常', printOrientationI: '倒置 (180°)', printOrientationIndicator: '倒置', + mirror: '镜像', defaultFont: '默认文本样式', defaultFontId: '字体', defaultFontHeight: '高度 (点)', diff --git a/src/locales/zh-hant.ts b/src/locales/zh-hant.ts index 6532528f..830c9c15 100644 --- a/src/locales/zh-hant.ts +++ b/src/locales/zh-hant.ts @@ -76,6 +76,10 @@ const zhHant = { dpmm12: '12 點/公釐 — 300 dpi', dpmm24: '24 點/公釐 — 600 dpi', printQuantity: '列印數量', + quantityAdvancedHeading: '數量(進階)', + pauseCount: '每 N 個標籤暫停', + replicates: '每個標籤的副本數', + overridePauseCount: '覆寫暫停計數(僅切最後一個)', mediaMode: '介質模式', outputHeading: '輸出', mediaModeT: 'T — 撕離', @@ -87,8 +91,18 @@ const zhHant = { printerSettingsHeading: '印表機(可選)', printSpeed: '列印速度 (ips, 2-14)', printSpeedHint: '與印表機相關。留空使用印表機預設值。', + speedHeading: '速度 (ips, 2-14)', + speedPrint: '列印', + speedSlew: '走紙', + speedBackfeed: '回退', + slewSpeed: '走紙速度 (ips, 2-14)', + backfeedSpeed: '回退速度 (ips, 2-14)', darkness: '列印濃度 (-30 至 +30)', darknessHint: '與印表機相關。留空使用印表機預設值。', + instantDarkness: '即時濃度 (0-30)', + darknessHeading: '濃度', + darknessPermanent: '持久 (-30..30)', + darknessInstant: '即時 (0..30)', mediaType: '介質類型', mediaTypeT: '熱轉印', mediaTypeD: '直接熱感', @@ -96,6 +110,7 @@ const zhHant = { printOrientationN: '正常', printOrientationI: '倒置 (180°)', printOrientationIndicator: '倒置', + mirror: '鏡像', defaultFont: '預設文字樣式', defaultFontId: '字型', defaultFontHeight: '高度 (點)', diff --git a/src/types/ObjectType.ts b/src/types/ObjectType.ts index 3c0cc216..db29e318 100644 --- a/src/types/ObjectType.ts +++ b/src/types/ObjectType.ts @@ -6,12 +6,26 @@ export const labelConfigSchema = z.object({ heightMm: z.number(), dpmm: z.number(), printQuantity: z.number().optional(), + /** ^PQ p2: pause every N labels (0 = none). */ + pauseCount: z.number().int().min(0).max(99999999).optional(), + /** ^PQ p3: replicates of each serialised label. */ + replicates: z.number().int().min(0).max(99999999).optional(), + /** ^PQ p4: override pause count (cutter behaviour). */ + overridePauseCount: z.enum(['Y', 'N']).optional(), mediaMode: z.enum(['T', 'V', 'D', 'K']).optional(), labelShift: z.number().optional(), printSpeed: z.number().int().min(2).max(14).optional(), + /** ^PR p2: slew (inter-label) speed. */ + slewSpeed: z.number().int().min(2).max(14).optional(), + /** ^PR p3: backfeed speed. */ + backfeedSpeed: z.number().int().min(2).max(14).optional(), darkness: z.number().int().min(-30).max(30).optional(), + /** ~SD: instant darkness set, emitted before ^XA. 0-30. */ + instantDarkness: z.number().int().min(0).max(30).optional(), mediaType: z.enum(['T', 'D']).optional(), printOrientation: z.enum(['N', 'I']).optional(), + /** ^PM: mirror image (left/right flip). */ + mirror: z.enum(['Y', 'N']).optional(), defaultFontId: z.string().min(1).optional(), defaultFontHeight: z.number().int().positive().optional(), }); From 3fe101f18cdd5aad31581ffcee5312924feb07ac Mon Sep 17 00:00:00 2001 From: u8array Date: Tue, 19 May 2026 19:23:31 +0200 Subject: [PATCH 2/5] feat(zpl): add label offsets ^LH/^LT and ^CF width param Adds label-origin offsets (^LH x,y) and label-top shift (^LT y) as output-only settings. Field coordinates remain absolute in the model; the generator subtracts the configured offsets from each leaf's FO at emit time (clamping at 0). Import keeps the existing normalisation (field positions absorb the offset, ^LH/^LT are discarded). ^CF gains a width parameter (third positional slot). Parser persists it, generator emits it. Generator emit order is reorganised so the geometry block (^LH/^LT/^LS) groups together before the default font (^CF). Properties panel: offsets grid in the Output section (Home X / Home Y / Top shift), default-text-style grid expanded to 3 columns (Font/Height/Width), suggestions list of Zebra built-in font IDs as extracted module constant, datalist rendered once per panel. Override pause count split into short label + tooltip via overridePauseCountHint locale key; existing translations shortened. --- src/components/Properties/PropertiesPanel.tsx | 89 ++++++++++++++++++- src/lib/zplGenerator.test.ts | 47 +++++++++- src/lib/zplGenerator.ts | 47 ++++++++-- src/lib/zplParser.test.ts | 7 ++ src/lib/zplParser.ts | 6 +- src/locales/ar.ts | 9 +- src/locales/bg.ts | 9 +- src/locales/cs.ts | 9 +- src/locales/da.ts | 9 +- src/locales/de.ts | 9 +- src/locales/el.ts | 9 +- src/locales/en.ts | 9 +- src/locales/es.ts | 9 +- src/locales/et.ts | 9 +- src/locales/fa.ts | 9 +- src/locales/fi.ts | 9 +- src/locales/fr.ts | 9 +- src/locales/he.ts | 9 +- src/locales/hr.ts | 9 +- src/locales/hu.ts | 9 +- src/locales/it.ts | 9 +- src/locales/ja.ts | 9 +- src/locales/ko.ts | 9 +- src/locales/lt.ts | 9 +- src/locales/lv.ts | 9 +- src/locales/nl.ts | 9 +- src/locales/no.ts | 9 +- src/locales/pl.ts | 9 +- src/locales/pt.ts | 9 +- src/locales/ro.ts | 9 +- src/locales/sk.ts | 9 +- src/locales/sl.ts | 9 +- src/locales/sr.ts | 9 +- src/locales/sv.ts | 9 +- src/locales/tr.ts | 9 +- src/locales/zh-hans.ts | 9 +- src/locales/zh-hant.ts | 9 +- src/types/ObjectType.ts | 10 +++ 38 files changed, 450 insertions(+), 44 deletions(-) diff --git a/src/components/Properties/PropertiesPanel.tsx b/src/components/Properties/PropertiesPanel.tsx index 31747328..8321244d 100644 --- a/src/components/Properties/PropertiesPanel.tsx +++ b/src/components/Properties/PropertiesPanel.tsx @@ -23,6 +23,11 @@ import { AlignButtons } from "./AlignButtons"; import { inputCls, labelCls } from "./styles"; import type { LabelConfig } from "../../types/ObjectType"; +/** Built-in alphanumeric font IDs the Zebra firmware ships with. Used as + * suggestions for ^CF — the input stays free-text so user-defined ^CW + * aliases (single letters) can still be entered. */ +const ZPL_BUILTIN_FONT_IDS = ['0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] as const; + interface PropertiesPanelProps { /** Imperative handle on the canvas — used for actions that need live render * bboxes (alignment, future zoom-to-selection, etc.). Required so the @@ -453,6 +458,61 @@ function LabelConfigPanel({ +
+ +
+
+ + + onUpdate({ labelHomeX: parseIntOrUndef(e.target.value) }) + } + /> +
+
+ + + onUpdate({ labelHomeY: parseIntOrUndef(e.target.value) }) + } + /> +
+
+ + + onUpdate({ labelTop: parseIntOrUndef(e.target.value) }) + } + /> +
+
+
+
-