diff --git a/packages/core/src/lib/documentReplies.test.ts b/packages/core/src/lib/documentReplies.test.ts index df45c98e..af81a4d6 100644 --- a/packages/core/src/lib/documentReplies.test.ts +++ b/packages/core/src/lib/documentReplies.test.ts @@ -4,7 +4,7 @@ import { outsideFrames } from "./hostStatus"; import { ETX, STX } from "./hostStatus.fixture"; const commandsOf = (zpl: string): string[] => documentReplies(zpl).commands; -const NOTHING = { commands: [], awaited: [], unmarked: [], ambiguous: [], uncounted: [] }; +const NOTHING = { commands: [], awaited: [], unmarked: [], ambiguous: [], uncounted: [], held: true, labels: 0 }; describe("documentReplies commands", () => { it("accepts only the prefix the catalog spells", () => { @@ -99,16 +99,16 @@ describe("documentReplies", () => { }); it("names a bare ^HV as unmarked and leaves the other host commands out of the awaited replies", () => { - expect(documentReplies("^XA~HS^HWR:*.*^HV1,20^XZ")).toEqual({ commands: ["~HS", "^HWR:*.*", "^HV1,20"], awaited: [], unmarked: ["^HV1,20"], ambiguous: [], uncounted: [] }); + expect(documentReplies("^XA~HS^HWR:*.*^FDx^FS^HV1,20^XZ")).toEqual({ commands: ["~HS", "^HWR:*.*", "^HV1,20"], awaited: [], unmarked: ["^HV1,20"], ambiguous: [], uncounted: [], held: true, labels: 1 }); }); it("asks nothing for a ^HV outside a format", () => { - expect(documentReplies("^HV1,20,H,E^XA^FDx^FS^XZ")).toEqual(NOTHING); + expect(documentReplies("^HV1,20,H,E^XA^FDx^FS^XZ")).toEqual({ ...NOTHING, labels: 1 }); }); it("counts a ^HV under a ^CC remap", () => { - expect(awaited("^XA^CC#^FN1^FDx^FS#HV1,20,H,E,F#PQ2#XZ")).toEqual(one("^HV1,20,H,E,F", "H", "E")); - expect(awaited("^XA^CC#^FN1^FDx^FS#HV1,20,H,E,L#PQ2#XZ")).toEqual(one("^HV1,20,H,E,L", "H", "E", 2)); + expect(awaited("^XA^CC#FN1#FDx#FS#HV1,20,H,E,F#PQ2#XZ")).toEqual(one("^HV1,20,H,E,F", "H", "E")); + expect(awaited("^XA^CC#FN1#FDx#FS#HV1,20,H,E,L#PQ2#XZ")).toEqual(one("^HV1,20,H,E,L", "H", "E", 2)); }); it("tells no groups apart past the cap, where the seam check would hold the dialog", () => { @@ -125,9 +125,9 @@ describe("documentReplies", () => { expect(ambiguous("^XA^FN1^FDa^FS^HV1,5,X,,F^HV2,5,XY,,F^HV3,5,K,U,F^XZ")).toEqual(["^HV1,5,X,,F"]); expect(ambiguous("^XA^FN1^FDa^FS^HV1,5,H,E,F^HV2,5,K,U,F^HV2,5,H,E,F^XZ")).toEqual([]); // The guide's own pair shares a terminator behind distinct headers, which a reader counts right. - expect(ambiguous("^XA^FH_^HV1,24,EPC[,]_0D_0A,F^FH_^HV2,24,TID[,]_0D_0A,F^XZ")).toEqual([]); - expect(ambiguous("^XA^HV1,20,AB,CD,F^HV2,20,DA,,F^XZ")).toEqual(["^HV2,20,DA,,F"]); - expect(ambiguous("^XA^HV1,20,QY,ZX,F^HV2,20,YZ,,F^XZ")).toEqual(["^HV2,20,YZ,,F"]); + expect(ambiguous("^XA^FDx^FS^FH_^HV1,24,EPC[,]_0D_0A,F^FH_^HV2,24,TID[,]_0D_0A,F^XZ")).toEqual([]); + expect(ambiguous("^XA^FDx^FS^HV1,20,AB,CD,F^HV2,20,DA,,F^XZ")).toEqual(["^HV2,20,DA,,F"]); + expect(ambiguous("^XA^FDx^FS^HV1,20,QY,ZX,F^HV2,20,YZ,,F^XZ")).toEqual(["^HV2,20,YZ,,F"]); // The field data the document holds can read as a mark too, in the reply itself or in another group's. expect(ambiguous("^XA^FN1^FDEH^FS^HV1,20,H,E,F^XZ")).toEqual(["^HV1,20,H,E,F"]); expect(ambiguous("^XA^FN1^FDWHEEL^FS^HV1,20,H,E,F^XZ")).toEqual([]); @@ -192,7 +192,7 @@ describe("documentReplies", () => { it("vouches for no ^HV where the document recalls a frame it does not hold, which may count, fill or ask on its own", () => { const recall = "^XA^XFR:A.ZPL^FS^FN1^FDx^FS^HV1,20,H,E,L^XZ"; expect(documentReplies(recall)).toMatchObject({ awaited: [], uncounted: ["^HV1,20,H,E,L"] }); - expect(documentReplies("^XA^XFR:A.ZPL^FS^HV1,20,H,,F^XZ")).toMatchObject({ awaited: [], uncounted: ["^HV1,20,H,,F"] }); + expect(documentReplies("^XA^XFR:A.ZPL^FS^HV1,20,H,,F^XZ")).toMatchObject({ awaited: [], uncounted: ["^HV1,20,H,,F"], held: false }); // The frame may answer with marks of its own, so a format that recalls nothing is not vouched for either. expect(documentReplies("^XA^XFR:A.ZPL^FS^XZ^XA^FN1^FDx^FS^HV1,20,Z,,F^XZ")).toMatchObject({ awaited: [], uncounted: ["^HV1,20,Z,,F"] }); expect(documentReplies("^XA^DFR:K.ZPL^FS^XFR:U.ZPL^FS^PQ3^XZ^XA^XFR:K.ZPL^FS^FN1^FDx^FS^HV1,20,H,E,L^XZ")).toMatchObject({ awaited: [], uncounted: ["^HV1,20,H,E,L"] }); @@ -318,11 +318,11 @@ describe("documentReplies", () => { }); it("decodes a header or terminator spelled in hex under ^FH the way the transport decodes the reply, as the guide's RFID example does", () => { - expect(awaited("^XA^FH_^HV0,8,EPC[,]_0D_0A,L^XZ")).toEqual(one("^HV0,8,EPC[,]_0D_0A,L", "EPC[", "]\r\n")); - expect(awaited("^XA^CI27^FH_^HV1,8,_E4,END^XZ")).toEqual(one("^HV1,8,_E4,END", "", "END")); - expect(awaited("^XA^FH_^HV1,8,H,_E4^XZ^XA^FH_^HV1,8,_A4_B8,E^XZ")).toEqual([...one("^HV1,8,H,_E4", "H", ""), ...one("^HV1,8,_A4_B8,E", "", "E")]); - expect(documentReplies("^XA^FH_^HV1,8,_E4,_A4^XZ").unmarked).toEqual(["^HV1,8,_E4,_A4"]); - expect(awaited("^XA^CI28^FH_^HV1,8,_C3_A4,END^XZ")).toEqual(one("^HV1,8,_C3_A4,END", "\u00e4", "END")); + expect(awaited("^XA^FDx^FS^FH_^HV0,8,EPC[,]_0D_0A,L^XZ")).toEqual(one("^HV0,8,EPC[,]_0D_0A,L", "EPC[", "]\r\n")); + expect(awaited("^XA^CI27^FDx^FS^FH_^HV1,8,_E4,END^XZ")).toEqual(one("^HV1,8,_E4,END", "", "END")); + expect(awaited("^XA^FDx^FS^FH_^HV1,8,H,_E4^XZ^XA^FDx^FS^FH_^HV1,8,_A4_B8,E^XZ")).toEqual([...one("^HV1,8,H,_E4", "H", ""), ...one("^HV1,8,_A4_B8,E", "", "E")]); + expect(documentReplies("^XA^FDx^FS^FH_^HV1,8,_E4,_A4^XZ").unmarked).toEqual(["^HV1,8,_E4,_A4"]); + expect(awaited("^XA^CI28^FDx^FS^FH_^HV1,8,_C3_A4,END^XZ")).toEqual(one("^HV1,8,_C3_A4,END", "\u00e4", "END")); expect(awaited("^XA^FH_^HV1,8,_5B,END^FS^HV1,8,_5B,END^XZ")).toEqual([...one("^HV1,8,_5B,END", "[", "END"), ...one("^HV1,8,_5B,END", "_5B", "END")]); expect(awaited("^XA^FH#^FDx^FS^HV0,8,EPC[,]#0D#0A^XZ")).toEqual(one("^HV0,8,EPC[,]#0D#0A", "EPC[", "]#0D#0A")); const frame = "^XA^DFR:A.ZPL^FS^FN1^FS^FH_^HV1,20,_5BH,_5D^XZ^XA^XFR:A.ZPL^FS^FN1^FDa^FS^XZ"; @@ -334,16 +334,17 @@ describe("documentReplies", () => { expect(commandsOf("^XA^CD;^HWR:*.*^HV1;20;H;E;F^XZ")).toEqual(["^HWR:*.*", "^HV1,20,H,E,F"]); }); - it("reads a ^HV no comma spelling exists for under the delimiter in force, and leaves out one asked in a format that only stores", () => { - expect(documentReplies("^XA^CD;^FN1^FDx^FS^PQ4^HV1;20;H,X;E;L^XZ")).toEqual({ commands: ["^HV1;20;H,X;E;L"], awaited: one("^HV1;20;H,X;E;L", "H,X", "E", 4), unmarked: [], ambiguous: [], uncounted: [] }); - expect(documentReplies("^XA^HV1,20,H,E,F^DFR:A.ZPL^FS^FN1^FS^XZ")).toEqual({ commands: ["^HV1,20,H,E,F"], awaited: [], unmarked: [], ambiguous: [], uncounted: [] }); + it("reads a ^HV that cannot be written with commas under the delimiter in force, and leaves out one whose format holds no field or only stores", () => { + expect(documentReplies("^XA^HV1,20,H,E,F^XZ")).toEqual({ ...NOTHING, commands: ["^HV1,20,H,E,F"] }); + expect(documentReplies("^XA^CD;^FN1^FDx^FS^PQ4^HV1;20;H,X;E;L^XZ")).toEqual({ commands: ["^HV1;20;H,X;E;L"], awaited: one("^HV1;20;H,X;E;L", "H,X", "E", 4), unmarked: [], ambiguous: [], uncounted: [], held: true, labels: 4 }); + expect(documentReplies("^XA^HV1,20,H,E,F^DFR:A.ZPL^FS^FN1^FS^XZ")).toEqual({ commands: ["^HV1,20,H,E,F"], awaited: [], unmarked: [], ambiguous: [], uncounted: [], held: true, labels: 0 }); }); it("names a reply a reader could not find: no header, no terminator, only whitespace, or a frame byte in the mark", () => { expect(documentReplies("^XA^HV1,20,H^FS^HV2,20,,E,L^XZ").unmarked).toEqual([]); - expect(documentReplies("^XA^HV1,,a, ^HV2,, ,b^HV3,,a,b^XZ").unmarked).toEqual(["^HV1,,a, ", "^HV2,, ,b"]); + expect(documentReplies("^XA^FDx^FS^HV1,,a, ^HV2,, ,b^HV3,,a,b^XZ").unmarked).toEqual(["^HV1,,a, ", "^HV2,, ,b"]); expect(documentReplies("^XA^HV1,20^FS^HV2,20, , ^FS^FH_^HV3,20,_02H,_03^XZ").unmarked).toEqual(["^HV1,20", "^HV2,20, , ", "^HV3,20,_02H,_03"]); - expect(documentReplies("^XA^FH_^HV1,20,_02H,END^XZ").unmarked).toEqual(["^HV1,20,_02H,END"]); + expect(documentReplies("^XA^FDx^FS^FH_^HV1,20,_02H,END^XZ").unmarked).toEqual(["^HV1,20,_02H,END"]); expect(documentReplies("^XA^FH_^HV1,20,_02#02,E^FS^FH#^HV1,20,_02#02,E^XZ").unmarked).toEqual(["^HV1,20,_02#02,E"]); }); @@ -354,7 +355,7 @@ describe("documentReplies", () => { // One that is ignored or only stored sends nothing, and an unmarked ^HV stays unmarked. expect(documentReplies("^XA^FN1^FDx^FS^HV1,20,H,E,F^XZ^HFR:A.ZPL").ambiguous).toEqual([]); expect(documentReplies("^XA^DFR:A.ZPL^FS^HFR:A.ZPL^XZ^XA^FN1^FDx^FS^HV1,20,H,E,F^XZ").ambiguous).toEqual([]); - expect(documentReplies("^XA^HFR:A.ZPL^HV1,20^XZ")).toMatchObject({ unmarked: ["^HV1,20"], ambiguous: [] }); + expect(documentReplies("^XA^HFR:A.ZPL^FDx^FS^HV1,20^XZ")).toMatchObject({ unmarked: ["^HV1,20"], ambiguous: [] }); }); it("groups the replies by their exact marks and adds their counts, and names groups whose marks lie inside each other's ambiguous", () => { @@ -370,9 +371,9 @@ describe("documentReplies", () => { { header: "K", terminator: "U", count: 1, commands: ["^HV2,5,K,U,F"] }, ]); expect(documentReplies("^XA^FN1^FDx^FS^HV1,20,H1,E,L^HV2,20,H,E^PQ3^XZ").ambiguous).toEqual(["^HV2,20,H,E"]); - expect(documentReplies("^XA^HV1,20,H^HV2,20,HEAD^XZ").ambiguous).toEqual(["^HV1,20,H"]); - expect(documentReplies("^XA^HV1,20,A,X^HV2,20,B,Y^XZ")).toMatchObject({ ambiguous: [], uncounted: [] }); - expect(awaited("^XA^HV1,20,A,X^HV2,20,B,Y^XZ")).toHaveLength(2); + expect(documentReplies("^XA^FDx^FS^HV1,20,H^HV2,20,HEAD^XZ").ambiguous).toEqual(["^HV1,20,H"]); + expect(documentReplies("^XA^FDx^FS^HV1,20,A,X^HV2,20,B,Y^XZ")).toMatchObject({ ambiguous: [], uncounted: [] }); + expect(awaited("^XA^FDx^FS^HV1,20,A,X^HV2,20,B,Y^XZ")).toHaveLength(2); }); }); diff --git a/packages/core/src/lib/documentReplies.ts b/packages/core/src/lib/documentReplies.ts index 4e7e3a7d..e3ebeb22 100644 --- a/packages/core/src/lib/documentReplies.ts +++ b/packages/core/src/lib/documentReplies.ts @@ -75,6 +75,10 @@ export interface DocumentReplies { ambiguous: string[]; /** The ^HV spellings the walk cannot vouch for, and all of them once the document recalls a frame it does not hold. */ uncounted: string[]; + /** False where the document recalls a frame it does not hold, see HostCommandWalk. */ + held: boolean; + /** The labels the document prints, see HostCommandWalk. */ + labels: number; } interface ReplyGroup extends AwaitedReply { @@ -181,7 +185,7 @@ function receivedMark(mark: string, fhIndicator: string | undefined): string { } export function documentReplies(zpl: string): DocumentReplies { - const { asks, held } = walkHostCommands(zpl); + const { asks, held, labels } = walkHostCommands(zpl); const commands = new Set(); const uncounted = new Set(); const replies = new Map(); @@ -211,5 +215,5 @@ export function documentReplies(zpl: string): DocumentReplies { const unmarked = [...replies.values()].filter((reply) => fieldReplyMarks(reply) === undefined).map((reply) => reply.command); const groups = replyGroups(replies.values()); const ambiguous = framed ? ambiguousReplies(groups) : groups.flatMap((group) => group.commands); - return { commands: [...commands], awaited: groups.map(readerShape), unmarked: [...new Set(unmarked)], ambiguous: [...new Set(ambiguous)], uncounted: [...uncounted] }; + return { commands: [...commands], awaited: groups.map(readerShape), unmarked: [...new Set(unmarked)], ambiguous: [...new Set(ambiguous)], uncounted: [...uncounted], held, labels }; } diff --git a/packages/core/src/lib/hostCommands.test.ts b/packages/core/src/lib/hostCommands.test.ts index 8ee8e918..798bf1fe 100644 --- a/packages/core/src/lib/hostCommands.test.ts +++ b/packages/core/src/lib/hostCommands.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { fieldHostParams, hostCommandAsks } from "./hostCommands"; +import { fieldHostParams, hostCommandAsks, walkHostCommands } from "./hostCommands"; describe("fieldHostParams", () => { it("reads the slot, the header, the terminator and the per-label flag, each with a default", () => { @@ -16,14 +16,30 @@ describe("hostCommandAsks", () => { const labelsOf = (zpl: string) => hostCommandAsks(zpl).map((a) => `${a.id}:${a.ask}:${a.labels}`); const dataOf = (zpl: string) => hostCommandAsks(zpl).filter((a) => a.ask === "asked").map((a) => a.data); - it("gives every answered command the labels of its format, from a ^PQ before or behind it", () => { - expect(labelsOf("^XA^PQ3^HV1,20,H,E,L~HS^XZ")).toEqual(["^HV:asked:3", "~HS:asked:3"]); - expect(labelsOf("^XA^PQ100000000^HV1,20^XZ^HV2,20")).toEqual(["^HV:asked:100000000", "^HV:ignored:0"]); - expect(labelsOf("^XA^PQ3^PQ0^HV1,20^XZ^XA^CD;^PQ4;1^HV1,20^XZ")).toEqual(["^HV:asked:3", "^HV:asked:4"]); - expect(labelsOf("^XA^PQ3^HV1,20,H,E,L")).toEqual(["^HV:asked:3"]); - expect(labelsOf("^XA^HV1,20,H,E,L^PQ3^XZ^XA^HV1,20,H,E,L^XZ")).toEqual(["^HV:asked:3", "^HV:asked:1"]); - expect(labelsOf("^XA^PQ0^HV1,20^XZ^XA^PQ 2,1^HV1,20^XZ")).toEqual(["^HV:asked:1", "^HV:asked:2"]); - expect(labelsOf("^XA^PQ3^PQ^HV1,20,H,E,L^XZ^XA^PQ,2^HV1,20,H,E,L^XZ")).toEqual(["^HV:asked:1", "^HV:asked:1"]); + it("counts the labels the document prints, and none for a format without a field", () => { + const printed = (zpl: string) => walkHostCommands(zpl).labels; + expect(printed("^XA^FN1^FDx^FS^HV1,20,H,E,L^PQ2^XZ")).toBe(2); + expect(printed("^XA^FO10,10^GB10,10,1^FS^XZ^XA^FDx^PQ4^XZ")).toBe(5); + expect(printed("^XA~HS^XZ^XA^PQ3^XZ^XA^HV1,20,H,E,F^XZ")).toBe(0); + const frame = "^XA^DFR:A.ZPL^FS^FN1^FS^HV1,20,H,E,L^XZ"; + expect(printed(`${frame}^XA^XFR:A.ZPL^FS^PQ2^XZ^XA^XFR:B.ZPL^FS^XZ`)).toBe(3); + expect(printed("^XA^DFR:A.ZPL^XZ^XA^XFR:A.ZPL^PQ2^XZ^XA^XFR:B.ZPL^PQ3^XZ")).toBe(3); + expect(printed("^XA^RT1^PQ2^XZ^XA^FN1^PQ4^XZ")).toBe(6); + expect(printed("^FN1^FDx^FS^PQ2")).toBe(0); + expect(printed("^XA^FO10,10^A0N,30,30^SN001,1,Y^PQ2^XZ")).toBe(2); + expect(printed("^XA^FO10,10^RFR,H^PQ2^XZ")).toBe(2); + expect(printed("^XA^FO10,10^A0N,30,30^SFddd^PQ2^XZ")).toBe(0); + }); + + it("gives every answered command the labels of its format, from a ^PQ before or behind it, and none without a field", () => { + expect(labelsOf("^XA^PQ3^FDx^FS^HV1,20,H,E,L~HS^XZ")).toEqual(["^HV:asked:3", "~HS:asked:3"]); + expect(labelsOf("^XA^PQ100000000^FDx^FS^HV1,20^XZ^HV2,20")).toEqual(["^HV:asked:100000000", "^HV:ignored:0"]); + expect(labelsOf("^XA^PQ3^PQ0^FDx^FS^HV1,20^XZ^XA^CD;^PQ4;1^FDx^FS^HV1,20^XZ")).toEqual(["^HV:asked:3", "^HV:asked:4"]); + expect(labelsOf("^XA^PQ3^FDx^FS^HV1,20,H,E,L")).toEqual(["^HV:asked:3"]); + expect(labelsOf("^XA^FDx^FS^HV1,20,H,E,L^PQ3^XZ^XA^FDx^FS^HV1,20,H,E,L^XZ")).toEqual(["^HV:asked:3", "^HV:asked:1"]); + expect(labelsOf("^XA^PQ0^FDx^FS^HV1,20^XZ^XA^PQ 2,1^FDx^FS^HV1,20^XZ")).toEqual(["^HV:asked:1", "^HV:asked:2"]); + expect(labelsOf("^XA^PQ3^PQ^FDx^FS^HV1,20,H,E,L^XZ^XA^PQ,2^FDx^FS^HV1,20,H,E,L^XZ")).toEqual(["^HV:asked:1", "^HV:asked:1"]); + expect(labelsOf("^XA^PQ3^HV1,20,H,E,L~HS^XZ")).toEqual(["^HV:asked:0", "~HS:asked:0"]); }); it("replays a stored ^PQ at the recall, where a later ^PQ in the recalling format wins", () => { diff --git a/packages/core/src/lib/hostCommands.ts b/packages/core/src/lib/hostCommands.ts index 3e2a6012..98689fea 100644 --- a/packages/core/src/lib/hostCommands.ts +++ b/packages/core/src/lib/hostCommands.ts @@ -148,7 +148,7 @@ export interface HostCommandAsk extends HostCommandToken { /** The ^FH indicator in force, under which the printer decodes a hex-spelled header or terminator, spec p.239. */ fhIndicator?: string; /** How many labels the format that answers it prints, from the last ^PQ the printer meets in that format. Zero where - * no format answers it, or where that format only stores. */ + * no format answers it, or where that format only stores or holds no field. */ labels: number; /** False where the document cannot vouch for the replies, see FILLS_FIELD and TOUCHES_TAG. */ vouched: boolean; @@ -161,7 +161,7 @@ export const received = (bytes: Uint8Array): string => getDecoder("utf-8").decod interface FieldClose { kind: "field"; - slot: number; + slot: number | undefined; data: Uint8Array | undefined; filled: boolean; } @@ -170,6 +170,8 @@ interface OpenField { slot?: number; data?: Uint8Array; filled: boolean; + /** The command brings the field's data itself, so the field holds content without ^FD. */ + sourced: boolean; fhIndicator?: string; } @@ -183,9 +185,11 @@ interface OpenFormat { stored: Map; filledSlots: Set; touchesTag: boolean; + /** An empty format prints no label. A recall the document does not hold may fill it. */ + blank: boolean; } -const freshFormat = (): OpenFormat => ({ answered: [], labels: 1, fields: new Map(), stored: new Map(), filledSlots: new Set(), touchesTag: false }); +const freshFormat = (): OpenFormat => ({ answered: [], labels: 1, fields: new Map(), stored: new Map(), filledSlots: new Set(), touchesTag: false, blank: true }); /** What a format does in printer order. A storing format keeps it as its frame, replayed at every recall. */ type FrameEntry = @@ -207,8 +211,10 @@ const TOUCHES_TAG = new Set(["^RF", "^RL", "^RU", "^RI", "^RT", "^WT"]); export interface HostCommandWalk { asks: HostCommandAsk[]; - /** False where the document recalls a frame it does not hold, which may count, fill or ask on its own unseen. */ + /** False where the document recalls a frame it does not hold, which may print, count, fill or ask unseen. */ held: boolean; + /** The labels the document prints, summed over the formats that print. */ + labels: number; } /** The host commands in `zpl` in printer order with their {@link HostAsk}. A stored command is listed again as asked at @@ -219,18 +225,22 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN const frames = new Map(); const asks: HostCommandAsk[] = []; let held = true; + let labels = 0; let format = freshFormat(); // ^RU puts the tag's serial into any ^FD from there on, spec p.439. Whether that ends with the format is unmeasured, so it is taken to last. let serialised = false; const recordField = ({ slot, data, filled }: FieldClose, into: Map) => { + if (slot === undefined) return; if (data !== undefined) into.set(slot, data); if (filled || serialised) format.filledSlots.add(slot); }; const slotData = ({ slot, bytes }: FieldHostParams): string[] => [...new Set([format.stored.get(slot), format.fields.get(slot)].filter((data) => data !== undefined).map((data) => received(data.subarray(0, bytes))))]; const closeFormat = (prints: boolean) => { + const printed = prints && !format.blank ? format.labels : 0; + labels += printed; for (const ask of format.answered) { - ask.labels = prints ? format.labels : 0; + ask.labels = printed; if (!isFieldHostCommand(ask.id)) continue; const params = fieldHostParams(ask.params, ask.delimiter); ask.data = slotData(params); @@ -255,6 +265,7 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN format.labels = entry.labels; break; case "field": + format.blank = false; recordField(entry, into); break; case "touchesTag": @@ -276,6 +287,7 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN return; } held = false; + format.blank = false; }; let open = formatOpen; let frame: FrameEntry[] | undefined; @@ -284,15 +296,15 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN else apply(entry, format.fields, new Set()); }; let named = false; - let field: OpenField = { filled: false }; - const closeField = () => { - if (field.slot !== undefined) act({ kind: "field", slot: field.slot, data: field.data, filled: field.filled }); - field = { filled: false }; + let field: OpenField = { filled: false, sourced: false }; + const closeField = (sealed: boolean) => { + if (open && (sealed || field.slot !== undefined || field.data !== undefined || field.sourced)) act({ kind: "field", slot: field.slot, data: field.data, filled: field.filled }); + field = { filled: false, sourced: false }; }; for (const t of commandTokens(zpl, chars)) { if (open && TOUCHES_TAG.has(t.id)) act({ kind: "touchesTag" }); if (t.id === "^XA" || t.id === "^XZ") { - closeField(); + closeField(false); closeFormat(frame === undefined); open = t.id === "^XA"; frame = undefined; @@ -300,9 +312,11 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN } else if (t.id === "^FH") { field.fhIndicator = fhIndicator(t.rest); } else if (t.id === "^FS") { - closeField(); + closeField(true); } else if (FILLS_FIELD.has(t.id) || readsTag(t.id, t.rest)) { field.filled = true; + // ^SF serialises the ^FD it follows, p.335, and brings no data of its own. + if (t.id !== "^SF") field.sourced = true; } else if ((t.id === "^RT" || t.id === "^RI") && open) { // Both read the tag into the field their first parameter numbers, RFID Programming Guide p.115 and Guide 2 p.76. act({ kind: "field", slot: int(t.rest), data: undefined, filled: true }); @@ -348,5 +362,5 @@ export function walkHostCommands(zpl: string, chars: TokenizerChars = { ...PLAIN } } closeFormat(frame === undefined); - return { asks, held }; + return { asks, held, labels }; } diff --git a/src/components/Output/DocumentQueryAction.tsx b/src/components/Output/DocumentQueryAction.tsx index 1669d0c3..b7b0db88 100644 --- a/src/components/Output/DocumentQueryAction.tsx +++ b/src/components/Output/DocumentQueryAction.tsx @@ -1,5 +1,4 @@ import { useReplyRead } from "../../hooks/useReplyRead"; -import { useT } from "../../hooks/useT"; import type { DocumentReply } from "../../lib/printerDocumentQuery"; import type { PrinterQueryFailure } from "../../lib/printerQuery"; import type { PrintTransport } from "../../lib/printTarget"; @@ -9,13 +8,13 @@ import { DocumentReplyDialog } from "./DocumentReplyDialog"; interface Props { zpl: () => string; + label: string; transport: PrintTransport; disabled: boolean; onFailure: (failure: PrinterQueryFailure) => void; } -export function DocumentQueryAction({ zpl, transport, disabled, onFailure }: Props) { - const t = useT(); +export function DocumentQueryAction({ zpl, label, transport, disabled, onFailure }: Props) { const query = useLabelStore((s) => s.queryDocument); const reply = useReplyRead(); const run = () => @@ -27,7 +26,7 @@ export function DocumentQueryAction({ zpl, transport, disabled, onFailure }: Pro return ( <> {reply.read !== undefined && } diff --git a/src/components/Output/OutputDialog.tsx b/src/components/Output/OutputDialog.tsx index d8267d29..0f8221a4 100644 --- a/src/components/Output/OutputDialog.tsx +++ b/src/components/Output/OutputDialog.tsx @@ -84,7 +84,7 @@ export function OutputDialog({ zpl, source, facts, onClose, onPrintImage, onExpo }; const ways = usePrintWays(source, facts); - const { sample, query } = useDocumentQuery(source, facts, zpl); + const { sample, query } = useDocumentQuery(source, zpl); const waySegments: Segment[] = ways.offered.map((key) => ({ key, label: wayLabel(loc, key), diff --git a/src/components/Output/ZebraWayPanel.query.test.tsx b/src/components/Output/ZebraWayPanel.query.test.tsx index 022f8efb..93c074d9 100644 --- a/src/components/Output/ZebraWayPanel.query.test.tsx +++ b/src/components/Output/ZebraWayPanel.query.test.tsx @@ -23,7 +23,7 @@ vi.mock("../../lib/printerDocumentQuery", () => ({ queryDocument: (...args: unkn vi.mock("../../lib/printerStatus", () => ({ readPrinterStatus: vi.fn(), readPrinterConfiguration: vi.fn() })); const loc = en.zebraPrint; -const ASKS = queryFacts({ commands: ["~HS"], prints: false }); +const ASKS = queryFacts({ commands: ["~HS"], labels: 0 }); const DOCUMENT = "^XA~HS^XZ"; const resolvesOnAbort = (outcome: unknown) => { @@ -61,7 +61,6 @@ describe("ZebraWayPanel on a document that asks the printer something", () => { const r = render( DOCUMENT} query={ASKS} />); expect(r.queryByText(loc.send)).toBeNull(); expect(r.getByText(loc.queryHint)).toBeTruthy(); - expect(r.queryByText(loc.queryMixedHint)).toBeNull(); await act(async () => { fireEvent.click(r.getByText(loc.queryButton)); @@ -72,8 +71,20 @@ describe("ZebraWayPanel on a document that asks the printer something", () => { expect(r.queryByText(en.printerSettings.printerStatus.stopWaiting)).toBeNull(); }); + it("switches the query button to its print label where the document prints labels", async () => { + queryDocument.mockResolvedValue({ kind: "ok", value: documentReply({ raw: "x" }) }); + const prints = queryFacts({ commands: ["^HV1,20,H,E,F"], labels: 2 }); + const r = render( "^XA^FN1^FDx^FS^HV1,20,H,E,F^PQ2^XZ"} query={prints} />); + expect(r.queryByText(loc.queryButton)).toBeNull(); + expect(r.getByText(formatTemplate(loc.queryPrintsManyFmt, { n: "2" }))).toBeTruthy(); + await act(async () => { + fireEvent.click(r.getByText(loc.queryPrintButton)); + }); + expect(queryDocument).toHaveBeenCalledWith({ kind: "network", host: "172.17.17.175", port: 9100 }, "^XA^FN1^FDx^FS^HV1,20,H,E,F^PQ2^XZ", expect.any(AbortSignal)); + }); + it("stops the wait from the dialog, and the reply names what never came", async () => { - const marked = queryFacts({ commands: ["~HS", "^HV1,20,H,E,F"], prints: false }); + const marked = queryFacts({ commands: ["~HS", "^HV1,20,H,E,F"], labels: 0 }); const signal = resolvesOnAbort({ kind: "ok", value: documentReply({ raw: "030,0,0,0892", unanswered: [{ commands: ["^HV1,20,H,E,F"], missing: 1, of: 1 }] }) }); const r = render( "^XA~HS^FN1^FDx^FS^HV1,20,H,E,F^XZ"} query={marked} />); await act(async () => { diff --git a/src/components/Output/ZebraWayPanel.tsx b/src/components/Output/ZebraWayPanel.tsx index 6abbbc0b..584603af 100644 --- a/src/components/Output/ZebraWayPanel.tsx +++ b/src/components/Output/ZebraWayPanel.tsx @@ -6,7 +6,7 @@ import { primaryButtonCls } from "../ui/formStyles"; import { sendViaBrowserPrint, sendViaNetwork } from "../../lib/zebraPrint"; import { isDesktopShell } from "../../lib/platform"; import { needsRawChannel, resolveQueryTarget, type PrintTransport } from "../../lib/printTarget"; -import { queryOffer } from "../../lib/printWayText"; +import { queryButtonText, queryOffer } from "../../lib/printWayText"; import { QueryHints } from "./QueryHints"; import type { DocumentQueryFacts } from "../../lib/outputChoice"; import { useLabelStore, selectEffectivePreviewProvider, selectPrinterReading } from "../../store/labelStore"; @@ -282,7 +282,7 @@ export function ZebraWayPanel({ zpl, way, devices, query }: { zpl: () => string; const offer = queryOffer(t.zebraPrint, query, way, isDesktopShell); const netSendDisabled = !host || netStatus.type === "sending" || locked; const action = (send: ReactNode, sendDisabled: boolean): ReactNode => - offer.queries ? : send; + offer.queries ? : send; if (way === "network") { return ( diff --git a/src/components/Output/ZebraWayPanel.usb.test.tsx b/src/components/Output/ZebraWayPanel.usb.test.tsx index 6f5b0b55..d91a98fe 100644 --- a/src/components/Output/ZebraWayPanel.usb.test.tsx +++ b/src/components/Output/ZebraWayPanel.usb.test.tsx @@ -42,7 +42,7 @@ describe("ZebraWayPanel USB access", () => { it("offers the setup route after a denied query, as after a denied check", async () => { queryDocument.mockResolvedValue({ kind: "permission_denied" }); act(() => useLabelStore.setState({ printerState: { phase: "idle" }, printTarget: { ...DEFAULT_PRINT_TARGET, transport: "usb", usbId: "usb1" } })); - const r = render( "^XA~HS^XZ"} query={queryFacts({ commands: ["~HS"], prints: false })} />); + const r = render( "^XA~HS^XZ"} query={queryFacts({ commands: ["~HS"], labels: 0 })} />); await waitFor(() => expect((r.getByText(en.zebraPrint.queryButton) as HTMLButtonElement).disabled).toBe(false)); await act(async () => { fireEvent.click(r.getByText(en.zebraPrint.queryButton)); diff --git a/src/hooks/useDocumentQuery.ts b/src/hooks/useDocumentQuery.ts index 5af0eaf0..8020f7c4 100644 --- a/src/hooks/useDocumentQuery.ts +++ b/src/hooks/useDocumentQuery.ts @@ -1,11 +1,12 @@ -import { asksPrinter, documentQueryFacts, type DocumentQueryFacts, type OutputFacts, type OutputSource } from "../lib/outputChoice"; +import { documentReplies } from "@zplab/core/lib/documentReplies"; +import { asksPrinter, type DocumentQueryFacts, type OutputSource } from "../lib/outputChoice"; import { sendZpl } from "../lib/sendZpl"; import { useLabelStore } from "../store/labelStore"; /** The notices need one row, since it carries every command. A query reads every row, since any row can spoil a reply. */ -export function useDocumentQuery(source: OutputSource, facts: OutputFacts, zpl: () => string): { sample: string; query: DocumentQueryFacts } { +export function useDocumentQuery(source: OutputSource, zpl: () => string): { sample: string; query: DocumentQueryFacts } { const sample = useLabelStore((s) => (source === "label" ? sendZpl(s, 1) : "")); - const sampleQuery = documentQueryFacts(source === "label" ? sample : zpl(), source, facts); + const sampleQuery = documentReplies(source === "label" ? sample : zpl()); const outgoing = useLabelStore((s) => (source === "label" && asksPrinter(sampleQuery) ? sendZpl(s) : "")); - return { sample, query: outgoing === "" ? sampleQuery : documentQueryFacts(outgoing, source, facts) }; + return { sample, query: outgoing === "" ? sampleQuery : documentReplies(outgoing) }; } diff --git a/src/lib/outputChoice.test.ts b/src/lib/outputChoice.test.ts index 59ba371d..1a4f6f01 100644 --- a/src/lib/outputChoice.test.ts +++ b/src/lib/outputChoice.test.ts @@ -7,7 +7,6 @@ import { effectiveScope, offeredKinds, offeredScopes, - documentQueryFacts, renderableOutput, type OutputFacts, } from "./outputChoice"; @@ -23,16 +22,6 @@ const everything: OutputFacts = { batchRowCount: 3, }; -describe("documentQueryFacts", () => { - it("reads the asked commands and the unmarked ^HV from the bytes, and prints the fields only for a label with objects", () => { - const bytes = "^XA~HS^FN1^FDx^FS^HV1,20^XZ"; - expect(documentQueryFacts(bytes, "label", everything)).toEqual({ commands: ["~HS", "^HV1,20"], prints: true, unmarked: ["^HV1,20"], ambiguous: [], uncounted: [] }); - expect(documentQueryFacts(bytes, "setupScript", everything).prints).toBe(false); - expect(documentQueryFacts(bytes, "label", { ...everything, hasObjects: false }).prints).toBe(false); - expect(documentQueryFacts("^XA^FN1^FDx^FS^HV1,20,H,E^XZ", "label", everything)).toEqual({ commands: ["^HV1,20,H,E"], prints: true, unmarked: [], ambiguous: [], uncounted: [] }); - }); -}); - describe("anyProducible", () => { it("opens the dialog for a config-only document", () => { // An imported overlay with no objects is a legitimate setup job, but there is nothing to draw. diff --git a/src/lib/outputChoice.testkit.ts b/src/lib/outputChoice.testkit.ts index cf7d4942..ff19df38 100644 --- a/src/lib/outputChoice.testkit.ts +++ b/src/lib/outputChoice.testkit.ts @@ -1,3 +1,3 @@ import type { DocumentQueryFacts } from "./outputChoice"; -export const queryFacts = (facts: Partial = {}): DocumentQueryFacts => ({ commands: [], prints: true, unmarked: [], ambiguous: [], uncounted: [], ...facts }); +export const queryFacts = (facts: Partial = {}): DocumentQueryFacts => ({ commands: [], labels: 1, held: true, unmarked: [], ambiguous: [], uncounted: [], ...facts }); diff --git a/src/lib/outputChoice.ts b/src/lib/outputChoice.ts index 4dd33432..48f35065 100644 --- a/src/lib/outputChoice.ts +++ b/src/lib/outputChoice.ts @@ -1,5 +1,5 @@ // The two levels of the output dialog: where the label goes, and how, where there is a choice. -import { documentReplies, type DocumentReplies } from "@zplab/core/lib/documentReplies"; +import type { DocumentReplies } from "@zplab/core/lib/documentReplies"; import { effectiveTransport, type PrintTransport, type PrintWay } from "./printTarget"; /** The bytes the dialog is about: the label itself, or a script that only configures the printer. */ @@ -66,18 +66,10 @@ export function offeredKinds(source: OutputSource, f: OutputFacts): OutputKind[] return (["print", "file"] as const).filter((kind) => can[kind]); } -export interface DocumentQueryFacts extends Pick { - prints: boolean; -} +export type DocumentQueryFacts = Pick; export const asksPrinter = (query: DocumentQueryFacts): boolean => query.commands.length > 0; -export function documentQueryFacts(bytes: string, source: OutputSource, f: OutputFacts): DocumentQueryFacts { - const { commands, unmarked, ambiguous, uncounted } = documentReplies(bytes); - // The fields ride along with a query only when the label itself goes out. - return { commands, unmarked, ambiguous, uncounted, prints: source === "label" && f.hasObjects }; -} - /** A rendered label is what the system dialog and a PNG carry, and a setup script draws nothing. */ export const renderableOutput = (source: OutputSource, f: OutputFacts): boolean => source === "label" && f.hasObjects && !f.sourceEditing; diff --git a/src/lib/printWayText.test.ts b/src/lib/printWayText.test.ts index 3129ec45..d245063a 100644 --- a/src/lib/printWayText.test.ts +++ b/src/lib/printWayText.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from "vitest"; import { formatTemplate } from "./formatTemplate"; import en from "../locales/en"; -import { queryOffer, wayHint } from "./printWayText"; +import { queryButtonText, queryOffer, wayHint } from "./printWayText"; import { queryFacts } from "./outputChoice.testkit"; import { asksPrinter } from "./outputChoice"; @@ -20,7 +20,7 @@ describe("wayHint", () => { describe("queryOffer", () => { const loc = en.zebraPrint; const prints = queryFacts({ commands: ["~HS"] }); - const asks = queryFacts({ commands: ["~HS"], prints: false }); + const asks = queryFacts({ commands: ["~HS"], labels: 0 }); const none = queryFacts(); it("offers nothing for a document that only prints", () => { @@ -29,21 +29,28 @@ describe("queryOffer", () => { expect(queryOffer(loc, none, "system", false)).toEqual({ queries: false, hints: [] }); }); - it("replaces the send where the reply can come back and names the printed fields that ride along", () => { + it("replaces the send where a reply can come back, and names the printed labels on the button and in the hints", () => { expect(queryOffer(loc, asks, "network", true)).toEqual({ queries: true, hints: [loc.queryHint] }); - expect(queryOffer(loc, prints, "usb", true)).toEqual({ queries: true, hints: [loc.queryHint, loc.queryMixedHint] }); + expect(queryOffer(loc, prints, "usb", true)).toEqual({ queries: true, hints: [loc.queryHint, loc.queryPrintsOne] }); + expect(queryButtonText(loc, asks)).toBe(loc.queryButton); + expect(queryButtonText(loc, prints)).toBe(loc.queryPrintButton); + const two = queryFacts({ commands: ["^HV1,20,H,E,L"], labels: 2 }); + expect(queryOffer(loc, two, "network", true)).toEqual({ queries: true, hints: [loc.queryHint, formatTemplate(loc.queryPrintsManyFmt, { n: "2" })] }); + const recalled = queryFacts({ commands: ["~HS"], labels: 2, held: false }); + expect(queryOffer(loc, recalled, "network", true)).toEqual({ queries: true, hints: [loc.queryHint, loc.queryPrintsRecalled] }); + expect(queryButtonText(loc, recalled)).toBe(loc.queryPrintButton); }); it("queries for a marked ^HV, and sends where a reply would carry no mark", () => { const marked = queryFacts({ commands: ["~HS", "^HV1,20,H,E,F"] }); - expect(queryOffer(loc, marked, "network", true)).toEqual({ queries: true, hints: [loc.queryHint, loc.queryMixedHint] }); + expect(queryOffer(loc, marked, "network", true)).toEqual({ queries: true, hints: [loc.queryHint, loc.queryPrintsOne] }); const bare = queryFacts({ commands: ["~HS", "^HV1,20"], unmarked: ["^HV1,20"] }); const bareHint = formatTemplate(loc.queryUnmarkedFmt, { commands: "^HV1,20" }); expect(queryOffer(loc, bare, "network", true)).toEqual({ queries: false, hints: [bareHint] }); expect(queryOffer(loc, bare, "local", false)).toEqual({ queries: false, hints: [bareHint] }); - const overlapping = queryFacts({ commands: ["^HV1,20,H,E", "^HV2,20,E,H"], prints: false, ambiguous: ["^HV1,20,H,E", "^HV2,20,E,H"] }); + const overlapping = queryFacts({ commands: ["^HV1,20,H,E", "^HV2,20,E,H"], labels: 0, ambiguous: ["^HV1,20,H,E", "^HV2,20,E,H"] }); expect(queryOffer(loc, overlapping, "network", true)).toEqual({ queries: false, hints: [formatTemplate(loc.queryAmbiguousFmt, { commands: "^HV1,20,H,E ^HV2,20,E,H" })] }); - const recalled = queryFacts({ commands: ["^HV1,20,H,E,L"], prints: false, uncounted: ["^HV1,20,H,E,L"] }); + const recalled = queryFacts({ commands: ["^HV1,20,H,E,L"], labels: 0, uncounted: ["^HV1,20,H,E,L"] }); expect(queryOffer(loc, recalled, "usb", true)).toEqual({ queries: false, hints: [formatTemplate(loc.queryUncountedFmt, { commands: "^HV1,20,H,E,L" })] }); expect(queryOffer(loc, bare, "system", true)).toEqual({ queries: false, hints: [loc.queryNoRender] }); }); diff --git a/src/lib/printWayText.ts b/src/lib/printWayText.ts index 8a8a9800..b2762156 100644 --- a/src/lib/printWayText.ts +++ b/src/lib/printWayText.ts @@ -35,6 +35,15 @@ interface QueryOffer { hints: string[]; } +const printsLabels = (query: DocumentQueryFacts): boolean => query.labels > 0; + +const printsHint = (loc: Loc, query: DocumentQueryFacts): string => { + if (!query.held) return loc.queryPrintsRecalled; + return query.labels === 1 ? loc.queryPrintsOne : formatTemplate(loc.queryPrintsManyFmt, { n: String(query.labels) }); +}; + +export const queryButtonText = (loc: Loc, query: DocumentQueryFacts): string => (printsLabels(query) ? loc.queryPrintButton : loc.queryButton); + /** What the dialog offers a document that asks the printer something, for the way at hand. */ export function queryOffer(loc: Loc, query: DocumentQueryFacts, way: PrintWay, desktop: boolean): QueryOffer { if (!asksPrinter(query)) return { queries: false, hints: [] }; @@ -46,5 +55,6 @@ export function queryOffer(loc: Loc, query: DocumentQueryFacts, way: PrintWay, d ]; if (blockers.length > 0) return { queries: false, hints: blockers }; if (!carriesReply(way, desktop)) return { queries: false, hints: [loc.queryNoChannel] }; - return { queries: true, hints: query.prints ? [loc.queryHint, loc.queryMixedHint] : [loc.queryHint] }; + if (!printsLabels(query)) return { queries: true, hints: [loc.queryHint] }; + return { queries: true, hints: [loc.queryHint, printsHint(loc, query)] }; } diff --git a/src/locales/ar.ts b/src/locales/ar.ts index 39a20b7d..ae27404a 100644 --- a/src/locales/ar.ts +++ b/src/locales/ar.ts @@ -2020,10 +2020,13 @@ const ar = { usbSetupFlatpak: 'داخل Flatpak، لا يمكن للتطبيق تثبيت قاعدة udev بنفسه. ثبّت الملف 70-zplab.rules من مستودع ZPLab على النظام المضيف، ثم أعد توصيل الطابعة.', usbNotFound: 'لم يتم العثور على طابعة USB، أعد توصيلها وقم بالتحديث.', queryButton: 'استعلام الطابعة', + queryPrintButton: 'استعلام الطابعة والطباعة', queryHint: 'يسأل هذا المستند الطابعة شيئًا. يفتح الرد هنا.', + queryPrintsOne: 'تطبع الطابعة ملصقًا واحدًا أثناء الرد على الاستعلام.', + queryPrintsManyFmt: 'تطبع الطابعة {n} ملصقات أثناء الرد على الاستعلام.', + queryPrintsRecalled: 'يستدعي المستند تنسيقًا مخزّنًا في الطابعة. يحدد هذا التنسيق ما إذا كانت الملصقات تُطبع وكم عددها.', queryNoChannel: 'لا يحمل هذا المسار أي رد، ولذلك يضيع الرد.', queryNoRender: 'هذه الطريقة تطبع صورة، فلا مكان للرد.', - queryMixedHint: 'تُطبع الحقول الأخرى أيضًا.', queryUnmarkedFmt: 'لا يحتوي الرد على {commands} على ترويسة أو محدد نهاية يستطيع ZPLab العثور عليه. من دون أحدهما لا يمكن تمييزه عن بقية المخرجات. يرسل ZPLab المستند دون استعلام.', queryAmbiguousFmt: 'لا يمكن التمييز بين ردود {commands} وبقية الردود من خلال ترويساتها ومنهياتها. يرسل ZPLab المستند دون استعلام.', queryUncountedFmt: 'لا يستطيع ZPLab التنبؤ بالردود على {commands}. قد تملأها الطابعة وقت الطباعة من حقل مضمّن أو تسلسلي أو ساعة أو RFID. وقد يملؤها أيضًا تنسيق مخزّن لا يحتويه هذا المستند. تُطبع ملصقة RFID المبطلة مرة أخرى وتردّ مرة أخرى. يرسل ZPLab المستند دون استعلام.', diff --git a/src/locales/bg.ts b/src/locales/bg.ts index 06fb0fd4..764099eb 100644 --- a/src/locales/bg.ts +++ b/src/locales/bg.ts @@ -2020,10 +2020,13 @@ const bg = { usbSetupFlatpak: 'В Flatpak приложението не може само да инсталира правилото за udev. Инсталирайте 70-zplab.rules от хранилището на ZPLab на хост системата, след което включете принтера отново.', usbNotFound: 'USB принтерът не е намерен, включете го отново и обновете.', queryButton: 'Запитване към принтера', + queryPrintButton: 'Запитване и печат', queryHint: 'Този документ пита принтера нещо. Отговорът се отваря тук.', + queryPrintsOne: 'Принтерът отпечатва един етикет, докато отговаря.', + queryPrintsManyFmt: 'Принтерът отпечатва {n} етикета, докато отговаря.', + queryPrintsRecalled: 'Документът извиква формат, съхранен в принтера. Дали ще се отпечатат етикети и колко, определя този формат.', queryNoChannel: 'По този път не се връща отговор, затова отговорът се губи.', queryNoRender: 'Този начин отпечатва изображение, така че отговорът няма къде да отиде.', - queryMixedHint: 'Останалите полета също се отпечатват.', queryUnmarkedFmt: 'Отговорът на {commands} няма заглавна част или терминатор, които ZPLab може да намери. Без тях не може да се отличи от останалото. ZPLab изпраща документа без заявка.', queryAmbiguousFmt: 'Отговорите на {commands} не могат да се различат от останалите по заглавките и терминаторите си. ZPLab изпраща документа без заявка.', queryUncountedFmt: 'ZPLab не може да предвиди отговорите на {commands}. Принтерът може да ги попълни при печат от вградено, сериен, часовников или RFID поле. Може да ги попълни и съхранен формат, който този документ не съдържа. Анулиран RFID етикет се отпечатва отново и отговаря отново. ZPLab изпраща документа без заявка.', diff --git a/src/locales/ca.ts b/src/locales/ca.ts index ca7cc94e..20290a1b 100644 --- a/src/locales/ca.ts +++ b/src/locales/ca.ts @@ -1261,10 +1261,13 @@ const ca = { usbSetupFlatpak: 'Dins de Flatpak, l’aplicació no pot instal·lar la regla udev. Instal·la 70-zplab.rules del repositori ZPLab al sistema amfitrió i torna a connectar la impressora.', usbNotFound: 'No s’ha trobat la impressora USB; torna-la a connectar i actualitza.', queryButton: 'Consulta la impressora', + queryPrintButton: 'Consulta i imprimeix', queryHint: 'Aquest document fa una consulta a la impressora. La resposta s’obre aquí.', + queryPrintsOne: 'La impressora imprimeix una etiqueta mentre respon.', + queryPrintsManyFmt: 'La impressora imprimeix {n} etiquetes mentre respon.', + queryPrintsRecalled: "El document crida un format emmagatzemat a la impressora. Aquest format decideix si s'imprimeixen etiquetes i quantes.", queryNoChannel: 'Aquesta via no porta cap resposta, la resposta de la impressora es perd.', queryNoRender: 'Aquesta via imprimeix una imatge, així que la resposta no té on anar.', - queryMixedHint: 'Els altres camps també s’imprimeixen.', queryUnmarkedFmt: 'La resposta a {commands} no té capçalera ni terminador que ZPLab pugui trobar. Sense un dels dos, no es pot distingir de la resta. ZPLab envia el document sense consulta.', queryAmbiguousFmt: 'Les respostes a {commands} no es poden distingir de la resta per les capçaleres i els terminadors. ZPLab envia el document sense consulta.', queryUncountedFmt: "ZPLab no pot predir les respostes a {commands}. La impressora pot omplir-les en imprimir a partir d'un camp incrustat, de sèrie, de rellotge o RFID. També les pot omplir un format emmagatzemat que aquest document no conté. Una etiqueta RFID anul·lada s'imprimeix de nou i respon de nou. ZPLab envia el document sense consulta.", diff --git a/src/locales/cs.ts b/src/locales/cs.ts index a7bc7396..08e8cb47 100644 --- a/src/locales/cs.ts +++ b/src/locales/cs.ts @@ -2020,10 +2020,13 @@ const cs = { usbSetupFlatpak: 'Uvnitř Flatpaku si aplikace nemůže pravidlo udev nainstalovat sama. Nainstalujte 70-zplab.rules z repozitáře ZPLab na hostitelský systém a tiskárnu znovu připojte.', usbNotFound: 'Tiskárna USB nebyla nalezena, znovu ji zapojte a obnovte.', queryButton: 'Dotázat se tiskárny', + queryPrintButton: 'Dotázat se a tisknout', queryHint: 'Tento dokument se tiskárny na něco ptá. Odpověď se otevře zde.', + queryPrintsOne: 'Tiskárna při odpovědi vytiskne jeden štítek.', + queryPrintsManyFmt: 'Tiskárna při odpovědi vytiskne {n} štítků.', + queryPrintsRecalled: 'Dokument volá uložený formát, který je v tiskárně. Zda se štítky vytisknou a kolik jich bude, určuje tento formát.', queryNoChannel: 'Touto cestou se žádná odpověď nevrací, proto se ztrácí.', queryNoRender: 'Tato cesta tiskne obrázek, takže odpověď nemá kam dorazit.', - queryMixedHint: 'Ostatní pole se vytisknou také.', queryUnmarkedFmt: 'Odpověď na {commands} nemá hlavičku ani ukončení, které by ZPLab dokázal najít. Bez nich ji nelze odlišit od zbytku. ZPLab odešle dokument bez dotazu.', queryAmbiguousFmt: 'Odpovědi na {commands} nelze rozlišit od ostatních podle hlaviček a ukončovačů. ZPLab odešle dokument bez dotazu.', queryUncountedFmt: 'ZPLab nedokáže předvídat odpovědi na {commands}. Tiskárna je může doplnit až při tisku z vloženého, sériového, hodinového nebo RFID pole. Může je doplnit také uložený formát, který tento dokument neobsahuje. Neplatný RFID štítek se vytiskne znovu a odpoví znovu. ZPLab odešle dokument bez dotazu.', diff --git a/src/locales/da.ts b/src/locales/da.ts index fa04ccbc..e06e9d0b 100644 --- a/src/locales/da.ts +++ b/src/locales/da.ts @@ -2020,10 +2020,13 @@ const da = { usbSetupFlatpak: 'Inde i Flatpak kan appen ikke selv installere udev-reglen. Installer 70-zplab.rules fra ZPLab-repositoriet på værtssystemet, og tilslut derefter printeren igen.', usbNotFound: 'USB-printer ikke fundet. Tilslut den igen, og opdater.', queryButton: 'Forespørg printeren', + queryPrintButton: 'Forespørg og udskriv', queryHint: 'Dette dokument spørger printeren om noget. Svaret åbnes her.', + queryPrintsOne: 'Printeren udskriver én etiket, mens den svarer.', + queryPrintsManyFmt: 'Printeren udskriver {n} etiketter, mens den svarer.', + queryPrintsRecalled: 'Dokumentet kalder et gemt format frem, som ligger i printeren. Om der udskrives etiketter, og hvor mange, afgør dette format.', queryNoChannel: 'Ad den vej kommer der intet svar, så svaret går tabt.', queryNoRender: 'Denne vej udskriver et billede, så svaret har ingen steder at lande.', - queryMixedHint: 'De øvrige felter bliver også printet.', queryUnmarkedFmt: 'Svaret på {commands} har ingen header eller afslutning, som ZPLab kan finde. Uden en af delene kan det ikke skelnes fra resten. ZPLab sender dokumentet uden forespørgsel.', queryAmbiguousFmt: 'Svarene på {commands} kan ikke skelnes fra de øvrige på deres headere og afslutninger. ZPLab sender dokumentet uden forespørgsel.', queryUncountedFmt: 'ZPLab kan ikke forudsige svarene på {commands}. Printeren udfylder dem muligvis først ved udskrivning ud fra et indlejret, serie-, ur- eller RFID-felt. Et gemt format, som dette dokument ikke indeholder, kan også udfylde dem. En ugyldig RFID-etiket udskrives igen og svarer igen. ZPLab sender dokumentet uden forespørgsel.', diff --git a/src/locales/de.ts b/src/locales/de.ts index 5d588dcc..5e28325c 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -1268,10 +1268,13 @@ const de = { usbSetupFlatpak: 'Innerhalb von Flatpak kann die App die udev-Regel nicht selbst installieren. Installiere 70-zplab.rules aus dem ZPLab-Repository auf dem Host und schließe den Drucker danach erneut an.', usbNotFound: 'USB-Drucker nicht gefunden, neu einstecken und aktualisieren.', queryButton: 'Drucker abfragen', + queryPrintButton: 'Abfragen und drucken', queryHint: 'Dieses Dokument fragt etwas beim Drucker ab. Die Antwort öffnet sich hier.', + queryPrintsOne: 'Der Drucker druckt dabei ein Etikett.', + queryPrintsManyFmt: 'Der Drucker druckt dabei {n} Etiketten.', + queryPrintsRecalled: 'Das Dokument ruft ein im Drucker gespeichertes Format ab. Ob und wie viele Etiketten dabei drucken, legt dieses Format fest.', queryNoChannel: 'Über diesen Weg kommt keine Antwort zurück, deshalb geht die Rückmeldung des Druckers verloren.', queryNoRender: 'Dieser Weg druckt ein Bild, deshalb hat die Antwort hier keinen Platz.', - queryMixedHint: 'Die übrigen Felder werden ebenfalls gedruckt.', queryUnmarkedFmt: 'Die Antwort auf {commands} hat keinen Header und kein Abschlusszeichen, das ZPLab finden kann. Ohne eines lässt sie sich nicht vom Rest unterscheiden. ZPLab sendet das Dokument ohne Abfrage.', queryAmbiguousFmt: 'Die Antworten auf {commands} lassen sich an ihren Headern und Abschlusszeichen nicht vom Rest unterscheiden. ZPLab sendet das Dokument ohne Abfrage.', queryUncountedFmt: 'ZPLab kann die Antworten auf {commands} nicht vorhersagen. Der Drucker füllt sie womöglich erst beim Druck aus einem eingebetteten, Serien-, Uhr- oder RFID-Feld. Auch ein gespeichertes Format, das dieses Dokument nicht enthält, kann sie füllen. Ein ungültiges RFID-Etikett druckt und antwortet noch einmal. ZPLab sendet das Dokument ohne Abfrage.', diff --git a/src/locales/el.ts b/src/locales/el.ts index bc7d84be..28ff92b8 100644 --- a/src/locales/el.ts +++ b/src/locales/el.ts @@ -2020,10 +2020,13 @@ const el = { usbSetupFlatpak: 'Μέσα στο Flatpak η εφαρμογή δεν μπορεί να εγκαταστήσει μόνη της τον κανόνα udev. Εγκαταστήστε το 70-zplab.rules από το αποθετήριο ZPLab στο σύστημα υποδοχής και συνδέστε ξανά τον εκτυπωτή.', usbNotFound: 'Ο εκτυπωτής USB δεν βρέθηκε. Συνδέστε τον ξανά και ανανεώστε.', queryButton: 'Ερώτημα στον εκτυπωτή', + queryPrintButton: 'Ερώτημα και εκτύπωση', queryHint: 'Αυτό το έγγραφο ρωτά κάτι τον εκτυπωτή. Η απάντηση ανοίγει εδώ.', + queryPrintsOne: 'Ο εκτυπωτής εκτυπώνει μία ετικέτα ενώ απαντά.', + queryPrintsManyFmt: 'Ο εκτυπωτής εκτυπώνει {n} ετικέτες ενώ απαντά.', + queryPrintsRecalled: 'Το έγγραφο καλεί μια αποθηκευμένη μορφή που βρίσκεται στον εκτυπωτή. Αν θα εκτυπωθούν ετικέτες και πόσες, το καθορίζει αυτή η μορφή.', queryNoChannel: 'Με αυτόν τον τρόπο δεν επιστρέφει απάντηση, οπότε η απάντηση χάνεται.', queryNoRender: 'Αυτός ο τρόπος εκτυπώνει εικόνα, οπότε η απάντηση δεν έχει πού να πάει.', - queryMixedHint: 'Τα υπόλοιπα πεδία εκτυπώνονται επίσης.', queryUnmarkedFmt: 'Η απάντηση στα {commands} δεν έχει κεφαλίδα ή τερματιστή που να μπορεί να βρει το ZPLab. Χωρίς κάποιο από τα δύο, δεν ξεχωρίζει από τα υπόλοιπα. Το ZPLab στέλνει το έγγραφο χωρίς ερώτημα.', queryAmbiguousFmt: 'Οι απαντήσεις στο {commands} δεν ξεχωρίζουν από τις υπόλοιπες με βάση τις κεφαλίδες και τους τερματιστές τους. Το ZPLab στέλνει το έγγραφο χωρίς ερώτημα.', queryUncountedFmt: 'Το ZPLab δεν μπορεί να προβλέψει τις απαντήσεις στα {commands}. Ο εκτυπωτής μπορεί να τις συμπληρώσει κατά την εκτύπωση από ενσωματωμένο πεδίο, πεδίο σειράς, ρολογιού ή RFID. Μπορεί επίσης να τις συμπληρώσει μια αποθηκευμένη μορφή που αυτό το έγγραφο δεν περιέχει. Μια ακυρωμένη ετικέτα RFID εκτυπώνεται ξανά και απαντά ξανά. Το ZPLab στέλνει το έγγραφο χωρίς ερώτημα.', diff --git a/src/locales/en.ts b/src/locales/en.ts index 79944920..dee3235d 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1268,10 +1268,13 @@ const en = { usbSetupFlatpak: 'Inside Flatpak the app cannot install the udev rule itself. Install 70-zplab.rules from the ZPLab repository on the host, then re-plug the printer.', usbNotFound: 'USB printer not found, re-plug it and refresh.', queryButton: 'Query printer', + queryPrintButton: 'Query and print', queryHint: 'This document asks the printer something. The reply opens here.', + queryPrintsOne: 'The printer prints one label while it answers.', + queryPrintsManyFmt: 'The printer prints {n} labels while it answers.', + queryPrintsRecalled: 'The document recalls a format stored in the printer. Whether labels print, and how many, depends on that format.', queryNoChannel: 'This way carries no answer, so the reply is lost.', queryNoRender: 'This way prints an image, so the reply has nowhere to land.', - queryMixedHint: 'The other fields print as well.', queryUnmarkedFmt: 'The reply to {commands} has no header or terminator that ZPLab can find. Without one, it cannot be told from the rest. ZPLab sends the document without a query.', queryAmbiguousFmt: 'The replies to {commands} cannot be told apart from the rest by their headers and terminators. ZPLab sends the document without a query.', queryUncountedFmt: 'ZPLab cannot predict the replies to {commands}. The printer may fill them at print time from an embedded, serial, clock or RFID field. A stored format this document does not hold may also fill them. A voided RFID label prints again and answers again. ZPLab sends the document without a query.', diff --git a/src/locales/es.ts b/src/locales/es.ts index 7263a202..9ea6e4f7 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -2020,10 +2020,13 @@ const es = { usbSetupFlatpak: 'Dentro de Flatpak, la aplicación no puede instalar la regla udev por sí misma. Instala 70-zplab.rules desde el repositorio de ZPLab en el host y luego vuelve a conectar la impresora.', usbNotFound: 'Impresora USB no encontrada, vuelve a conectarla y actualiza.', queryButton: 'Consultar impresora', + queryPrintButton: 'Consultar e imprimir', queryHint: 'Este documento pregunta algo a la impresora. La respuesta se abre aquí.', + queryPrintsOne: 'La impresora imprime una etiqueta mientras responde.', + queryPrintsManyFmt: 'La impresora imprime {n} etiquetas mientras responde.', + queryPrintsRecalled: 'El documento llama a un formato almacenado en la impresora. Ese formato decide si se imprimen etiquetas y cuántas.', queryNoChannel: 'Esta vía no transporta ninguna respuesta, así que la respuesta se pierde.', queryNoRender: 'Esta vía imprime una imagen, así que la respuesta no tiene adónde ir.', - queryMixedHint: 'Los demás campos también se imprimen.', queryUnmarkedFmt: 'La respuesta a {commands} no tiene encabezado ni terminador que ZPLab pueda encontrar. Sin uno, no se puede distinguir del resto. ZPLab envía el documento sin consulta.', queryAmbiguousFmt: 'Las respuestas a {commands} no se pueden distinguir del resto por sus encabezados y terminadores. ZPLab envía el documento sin consulta.', queryUncountedFmt: 'ZPLab no puede predecir las respuestas a {commands}. La impresora puede rellenarlas al imprimir a partir de un campo incrustado, de serie, de reloj o RFID. También puede rellenarlas un formato almacenado que este documento no contiene. Una etiqueta RFID anulada se imprime de nuevo y responde de nuevo. ZPLab envía el documento sin consulta.', diff --git a/src/locales/et.ts b/src/locales/et.ts index 27511af3..8f87c2f9 100644 --- a/src/locales/et.ts +++ b/src/locales/et.ts @@ -2020,10 +2020,13 @@ const et = { usbSetupFlatpak: 'Flatpaki sees ei saa rakendus ise udev-reeglit paigaldada. Paigalda 70-zplab.rules ZPLab-i hoidlast hostsüsteemi ja ühenda printer uuesti.', usbNotFound: 'USB-printerit ei leitud. Ühenda see uuesti ja värskenda.', queryButton: 'Küsi printerilt', + queryPrintButton: 'Küsi ja prindi', queryHint: 'See dokument küsib printerilt midagi. Vastus avaneb siin.', + queryPrintsOne: 'Printer prindib vastamise ajal ühe sildi.', + queryPrintsManyFmt: 'Printer prindib vastamise ajal {n} silti.', + queryPrintsRecalled: 'Dokument kutsub välja printerisse salvestatud vormingu. Kas silte prinditakse ja mitu, otsustab see vorming.', queryNoChannel: 'Sel teel vastus tagasi ei tule, nii et see läheb kaotsi.', queryNoRender: 'See viis prindib pildi, nii et vastusel pole kuhugi minna.', - queryMixedHint: 'Ülejäänud väljad trükitakse samuti.', queryUnmarkedFmt: 'Vastusel käskudele {commands} pole päist ega lõpumärki, mida ZPLab leiaks. Ilma nendeta ei saa seda ülejäänust eristada. ZPLab saadab dokumendi ilma päringuta.', queryAmbiguousFmt: 'Käsu {commands} vastuseid ei saa päiste ja lõpetajate järgi ülejäänutest eristada. ZPLab saadab dokumendi ilma päringuta.', queryUncountedFmt: 'ZPLab ei oska ennustada vastuseid käskudele {commands}. Printer võib need printimisel täita manustatud, seeria-, kella- või RFID-väljalt. Neid võib täita ka salvestatud vorming, mida see dokument ei sisalda. Tühistatud RFID-silt prinditakse uuesti ja vastab uuesti. ZPLab saadab dokumendi ilma päringuta.', diff --git a/src/locales/fa.ts b/src/locales/fa.ts index 6f21da13..c38d9526 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -2020,10 +2020,13 @@ const fa = { usbSetupFlatpak: 'داخل Flatpak، برنامه نمی‌تواند قانون udev را خودش نصب کند. فایل 70-zplab.rules را از مخزن ZPLab روی میزبان نصب کنید، سپس چاپگر را دوباره وصل کنید.', usbNotFound: 'چاپگر USB یافت نشد، آن را دوباره وصل کنید و به‌روزرسانی کنید.', queryButton: 'پرس‌وجو از چاپگر', + queryPrintButton: 'پرس‌وجو و چاپ', queryHint: 'این سند چیزی از چاپگر می‌پرسد. پاسخ اینجا باز می‌شود.', + queryPrintsOne: 'چاپگر هنگام پاسخ دادن یک برچسب چاپ می‌کند.', + queryPrintsManyFmt: 'چاپگر هنگام پاسخ دادن {n} برچسب چاپ می‌کند.', + queryPrintsRecalled: 'سند یک قالب ذخیره‌شده در چاپگر را فراخوانی می‌کند. اینکه برچسبی چاپ شود یا نه و چند عدد، را همین قالب تعیین می‌کند.', queryNoChannel: 'در این مسیر پاسخی برنمی‌گردد، بنابراین پاسخ از دست می‌رود.', queryNoRender: 'این روش یک تصویر چاپ می‌کند، پس پاسخ جایی برای رسیدن ندارد.', - queryMixedHint: 'بقیه فیلدها هم چاپ می‌شوند.', queryUnmarkedFmt: 'پاسخ {commands} سرآیند یا نشانه پایانی ندارد که ZPLab بتواند پیدا کند. بدون یکی از آن‌ها نمی‌توان آن را از بقیه جدا کرد. ZPLab سند را بدون پرس‌وجو ارسال می‌کند.', queryAmbiguousFmt: 'پاسخ‌های {commands} را نمی‌توان از روی سرایندها و پایان‌دهنده‌هایشان از بقیه تفکیک کرد. ZPLab سند را بدون پرس‌وجو می‌فرستد.', queryUncountedFmt: 'ZPLab نمی‌تواند پاسخ‌های {commands} را پیش‌بینی کند. چاپگر ممکن است آن‌ها را هنگام چاپ از یک فیلد جاسازی‌شده، سریال، ساعت یا RFID پر کند. یک قالب ذخیره‌شده که این سند ندارد هم ممکن است آن‌ها را پر کند. برچسب RFID باطل‌شده دوباره چاپ می‌شود و دوباره پاسخ می‌دهد. ZPLab سند را بدون پرس‌وجو ارسال می‌کند.', diff --git a/src/locales/fi.ts b/src/locales/fi.ts index 834b4f28..7434dbd8 100644 --- a/src/locales/fi.ts +++ b/src/locales/fi.ts @@ -2020,10 +2020,13 @@ const fi = { usbSetupFlatpak: 'Flatpakin sisällä sovellus ei voi asentaa udev-sääntöä itse. Asenna 70-zplab.rules ZPLab-tietovarastosta isäntäjärjestelmään ja kytke tulostin uudelleen.', usbNotFound: 'USB-tulostinta ei löytynyt. Kytke se uudelleen ja päivitä.', queryButton: 'Kysy tulostimelta', + queryPrintButton: 'Kysy ja tulosta', queryHint: 'Tämä asiakirja kysyy tulostimelta jotain. Vastaus avautuu tähän.', + queryPrintsOne: 'Tulostin tulostaa vastatessaan yhden tarran.', + queryPrintsManyFmt: 'Tulostin tulostaa {n} tarraa vastatessaan.', + queryPrintsRecalled: 'Asiakirja kutsuu tulostimeen tallennetun muodon. Tulostuuko tarroja ja kuinka monta, sen ratkaisee tämä muoto.', queryNoChannel: 'Tätä tietä ei kulje vastausta, joten vastaus katoaa.', queryNoRender: 'Tämä tapa tulostaa kuvan, joten vastauksella ei ole paikkaa.', - queryMixedHint: 'Muut kentät tulostuvat myös.', queryUnmarkedFmt: 'Vastauksessa kohteelle {commands} ei ole otsikkoa eikä päätemerkkiä, jonka ZPLab löytäisi. Ilman toista niistä sitä ei voi erottaa muusta. ZPLab lähettää asiakirjan ilman kyselyä.', queryAmbiguousFmt: 'Komennon {commands} vastauksia ei voi erottaa muista otsikoiden ja päätteiden perusteella. ZPLab lähettää asiakirjan ilman kyselyä.', queryUncountedFmt: 'ZPLab ei voi ennustaa vastauksia kohteille {commands}. Tulostin saattaa täyttää ne vasta tulostettaessa upotetusta, sarja-, kello- tai RFID-kentästä. Myös tallennettu muoto, jota tämä asiakirja ei sisällä, voi täyttää ne. Mitätöity RFID-tarra tulostuu uudelleen ja vastaa uudelleen. ZPLab lähettää asiakirjan ilman kyselyä.', diff --git a/src/locales/fr.ts b/src/locales/fr.ts index 31773850..25457753 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -2020,10 +2020,13 @@ const fr = { usbSetupFlatpak: "À l'intérieur de Flatpak, l'application ne peut pas installer la règle udev elle-même. Installe 70-zplab.rules depuis le dépôt ZPLab sur l'hôte, puis rebranche l'imprimante.", usbNotFound: 'Imprimante USB introuvable, rebranche-la et actualise.', queryButton: "Interroger l'imprimante", + queryPrintButton: 'Interroger et imprimer', queryHint: "Ce document pose une question à l'imprimante. La réponse s'ouvre ici.", + queryPrintsOne: "L'imprimante imprime une étiquette pendant sa réponse.", + queryPrintsManyFmt: "L'imprimante imprime {n} étiquettes pendant sa réponse.", + queryPrintsRecalled: "Le document rappelle un format stocké dans l'imprimante. Ce format décide si des étiquettes s'impriment et combien.", queryNoChannel: 'Ce chemin ne transporte aucune réponse, donc la réponse est perdue.', queryNoRender: 'Cette voie imprime une image, la réponse n’a donc nulle part où aller.', - queryMixedHint: "Les autres champs s'impriment aussi.", queryUnmarkedFmt: "La réponse à {commands} n'a ni en-tête ni terminateur que ZPLab puisse trouver. Sans l'un des deux, on ne peut pas la distinguer du reste. ZPLab envoie le document sans requête.", queryAmbiguousFmt: 'Les réponses à {commands} ne se distinguent pas des autres par leurs en-têtes et terminateurs. ZPLab envoie le document sans requête.', queryUncountedFmt: "ZPLab ne peut pas prédire les réponses à {commands}. L'imprimante peut les remplir à l'impression à partir d'un champ intégré, de série, d'horloge ou RFID. Un format stocké que ce document ne contient pas peut aussi les remplir. Une étiquette RFID annulée s'imprime de nouveau et répond de nouveau. ZPLab envoie le document sans requête.", diff --git a/src/locales/he.ts b/src/locales/he.ts index 6403bbfe..efc43ed8 100644 --- a/src/locales/he.ts +++ b/src/locales/he.ts @@ -2020,10 +2020,13 @@ const he = { usbSetupFlatpak: 'בתוך Flatpak האפליקציה לא יכולה להתקין את כלל ה-udev בעצמה. התקן את 70-zplab.rules ממאגר ZPLab על המארח, ואז חבר את המדפסת מחדש.', usbNotFound: 'מדפסת ה-USB לא נמצאה, חבר אותה מחדש ורענן.', queryButton: 'תשאול המדפסת', + queryPrintButton: 'תשאול והדפסה', queryHint: 'המסמך הזה שואל את המדפסת משהו. התשובה נפתחת כאן.', + queryPrintsOne: 'המדפסת מדפיסה מדבקה אחת בזמן שהיא עונה.', + queryPrintsManyFmt: 'המדפסת מדפיסה {n} מדבקות בזמן שהיא עונה.', + queryPrintsRecalled: 'המסמך קורא לפורמט שמור שנמצא במדפסת. הפורמט הזה קובע אם יודפסו מדבקות וכמה.', queryNoChannel: 'בדרך הזו לא חוזרת תשובה, ולכן התשובה אובדת.', queryNoRender: 'דרך זו מדפיסה תמונה, ולכן לתשובה אין לאן להגיע.', - queryMixedHint: 'שאר השדות מודפסים גם כן.', queryUnmarkedFmt: 'לתשובה ל-{commands} אין כותרת או תו סיום ש-ZPLab יכול למצוא. בלי אחד מהם אי אפשר להבדיל אותה משאר הפלט. ZPLab שולח את המסמך ללא שאילתה.', queryAmbiguousFmt: 'אי אפשר להבדיל בין התשובות ל-{commands} לבין שאר התשובות לפי הכותרות והמסיימים שלהן. ZPLab שולח את המסמך ללא שאילתה.', queryUncountedFmt: 'ZPLab אינו יכול לחזות את התשובות ל-{commands}. המדפסת עשויה למלא אותן בזמן ההדפסה משדה מוטמע, סידורי, שעון או RFID. גם פורמט שמור שהמסמך הזה אינו מכיל עשוי למלא אותן. תווית RFID שבוטלה מודפסת שוב ועונה שוב. ZPLab שולח את המסמך ללא שאילתה.', diff --git a/src/locales/hr.ts b/src/locales/hr.ts index c80bc70d..34f28a64 100644 --- a/src/locales/hr.ts +++ b/src/locales/hr.ts @@ -2020,10 +2020,13 @@ const hr = { usbSetupFlatpak: 'Unutar Flatpaka aplikacija ne može sama instalirati udev pravilo. Instalirajte 70-zplab.rules iz ZPLab repozitorija na glavnom sustavu, zatim ponovno priključite pisač.', usbNotFound: 'USB pisač nije pronađen. Ponovno ga priključite i osvježite.', queryButton: 'Ispitaj pisač', + queryPrintButton: 'Ispitaj i ispiši', queryHint: 'Ovaj dokument nešto pita pisač. Odgovor se otvara ovdje.', + queryPrintsOne: 'Pisač ispisuje jednu naljepnicu dok odgovara.', + queryPrintsManyFmt: 'Pisač ispisuje {n} naljepnica dok odgovara.', + queryPrintsRecalled: 'Dokument poziva format pohranjen u pisaču. Hoće li se ispisati naljepnice i koliko, određuje taj format.', queryNoChannel: 'Tim putem odgovor ne dolazi, pa se gubi.', queryNoRender: 'Ovaj put ispisuje sliku, pa odgovor nema kamo stići.', - queryMixedHint: 'Ostala polja se također ispisuju.', queryUnmarkedFmt: 'Odgovor na {commands} nema zaglavlje ni završni znak koje ZPLab može pronaći. Bez njih se ne može razlikovati od ostatka. ZPLab šalje dokument bez upita.', queryAmbiguousFmt: 'Odgovori na {commands} ne mogu se razlikovati od ostalih prema zaglavljima i završnim znakovima. ZPLab šalje dokument bez upita.', queryUncountedFmt: 'ZPLab ne može predvidjeti odgovore na {commands}. Pisač ih može popuniti tek pri ispisu iz ugrađenog, serijskog, satnog ili RFID polja. Može ih popuniti i pohranjeni format koji ovaj dokument ne sadrži. Poništena RFID naljepnica ispisuje se ponovno i ponovno odgovara. ZPLab šalje dokument bez upita.', diff --git a/src/locales/hu.ts b/src/locales/hu.ts index 8194242f..dc98bf5d 100644 --- a/src/locales/hu.ts +++ b/src/locales/hu.ts @@ -2020,10 +2020,13 @@ const hu = { usbSetupFlatpak: 'A Flatpakon belül az alkalmazás nem tudja magától telepíteni az udev szabályt. Telepítse a 70-zplab.rules fájlt a ZPLab tárolóból a gazdagépre, majd csatlakoztassa újra a nyomtatót.', usbNotFound: 'Az USB-nyomtató nem található. Csatlakoztassa újra, és frissítsen.', queryButton: 'Nyomtató lekérdezése', + queryPrintButton: 'Lekérdezés és nyomtatás', queryHint: 'Ez a dokumentum kérdez valamit a nyomtatótól. A válasz itt nyílik meg.', + queryPrintsOne: 'A nyomtató válasz közben egy címkét nyomtat.', + queryPrintsManyFmt: 'A nyomtató válasz közben {n} címkét nyomtat.', + queryPrintsRecalled: 'A dokumentum egy, a nyomtatóban tárolt formátumot hív elő. Azt, hogy nyomtatódik-e címke, és hány, ez a formátum dönti el.', queryNoChannel: 'Ezen az úton nem jön vissza válasz, ezért a válasz elveszik.', queryNoRender: 'Ez az út képet nyomtat, így a válasznak nincs hová érkeznie.', - queryMixedHint: 'A többi mező is kinyomtatódik.', queryUnmarkedFmt: 'A(z) {commands} válaszának nincs olyan fejléce vagy lezárója, amelyet a ZPLab megtalálna. Ezek nélkül nem különböztethető meg a többitől. A ZPLab a dokumentumot lekérdezés nélkül küldi el.', queryAmbiguousFmt: 'A(z) {commands} válaszai a fejlécük és a lezáróik alapján nem különböztethetők meg a többitől. A ZPLab a dokumentumot lekérdezés nélkül küldi el.', queryUncountedFmt: 'A ZPLab nem tudja előre megmondani a(z) {commands} válaszait. A nyomtató nyomtatáskor töltheti ki őket beágyazott, sorszám-, óra- vagy RFID-mezőből. Egy olyan tárolt formátum is kitöltheti őket, amelyet ez a dokumentum nem tartalmaz. Az érvénytelenített RFID-címke újra kinyomtatódik, és újra válaszol. A ZPLab a dokumentumot lekérdezés nélkül küldi el.', diff --git a/src/locales/it.ts b/src/locales/it.ts index a02dcdd9..08c8afc6 100644 --- a/src/locales/it.ts +++ b/src/locales/it.ts @@ -2020,10 +2020,13 @@ const it = { usbSetupFlatpak: "All'interno di Flatpak l'app non può installare la regola udev da sola. Installa 70-zplab.rules dal repository ZPLab sull'host, poi ricollega la stampante.", usbNotFound: 'Stampante USB non trovata, ricollegala e aggiorna.', queryButton: 'Interroga stampante', + queryPrintButton: 'Interroga e stampa', queryHint: 'Questo documento chiede qualcosa alla stampante. La risposta si apre qui.', + queryPrintsOne: "La stampante stampa un'etichetta mentre risponde.", + queryPrintsManyFmt: 'La stampante stampa {n} etichette mentre risponde.', + queryPrintsRecalled: 'Il documento richiama un formato memorizzato nella stampante. Questo formato decide se vengono stampate etichette e quante.', queryNoChannel: 'Questa via non porta nessuna risposta, quindi la risposta va perduta.', queryNoRender: 'Questa via stampa un’immagine, quindi la risposta non ha dove arrivare.', - queryMixedHint: 'Anche gli altri campi vengono stampati.', queryUnmarkedFmt: "La risposta a {commands} non ha un'intestazione né un terminatore che ZPLab possa trovare. Senza uno dei due, non è distinguibile dal resto. ZPLab invia il documento senza interrogazione.", queryAmbiguousFmt: 'Le risposte a {commands} non si distinguono dalle altre per le loro intestazioni e i loro terminatori. ZPLab invia il documento senza interrogazione.', queryUncountedFmt: "ZPLab non può prevedere le risposte a {commands}. La stampante può compilarle al momento della stampa da un campo incorporato, seriale, di orologio o RFID. Può compilarle anche un formato memorizzato che questo documento non contiene. Un'etichetta RFID annullata viene stampata di nuovo e risponde di nuovo. ZPLab invia il documento senza interrogazione.", diff --git a/src/locales/ja.ts b/src/locales/ja.ts index cfec9e1a..165876f8 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -2020,10 +2020,13 @@ const ja = { usbSetupFlatpak: 'Flatpak内ではアプリが自分でudevルールをインストールできません。ホスト側でZPLabリポジトリから70-zplab.rulesをインストールし、プリンターを再接続してください。', usbNotFound: 'USBプリンターが見つかりません。再接続して更新してください。', queryButton: 'プリンターに問い合わせ', + queryPrintButton: '問い合わせて印刷', queryHint: 'このドキュメントはプリンターに問い合わせます。応答はここに開きます。', + queryPrintsOne: 'プリンターは応答中に一枚のラベルを印刷します。', + queryPrintsManyFmt: 'プリンターは応答中に {n} 枚のラベルを印刷します。', + queryPrintsRecalled: 'このドキュメントは、プリンターに保存済みのフォーマットを呼び出します。ラベルが印刷されるかどうか、また何枚印刷されるかは、そのフォーマットで決まります。', queryNoChannel: 'この経路では応答が返らないため、応答は失われます。', queryNoRender: 'この方法は画像を印刷するため、応答の行き先がありません。', - queryMixedHint: 'ほかのフィールドも印刷されます。', queryUnmarkedFmt: '{commands} への応答には、ZPLab が見つけられるヘッダーも終端文字もありません。どちらもないと、残りの出力と区別できません。ZPLab はクエリなしでドキュメントを送信します。', queryAmbiguousFmt: '{commands} への応答は、ヘッダーと終端では他の応答と区別できません。ZPLab は問い合わせなしでドキュメントを送信します。', queryUncountedFmt: 'ZPLab は {commands} への応答を予測できません。プリンターは印刷時に、埋め込み、シリアル、時計、RFID のいずれかのフィールドから値を埋める場合があります。このドキュメントに含まれない保存済みフォーマットが値を埋める場合もあります。無効化された RFID ラベルは再度印刷され、再度応答します。ZPLab はクエリなしでドキュメントを送信します。', diff --git a/src/locales/ko.ts b/src/locales/ko.ts index 44a0cf96..955845dc 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -2020,10 +2020,13 @@ const ko = { usbSetupFlatpak: 'Flatpak 내부에서는 앱이 직접 udev 규칙을 설치할 수 없습니다. 호스트에서 ZPLab 저장소의 70-zplab.rules를 설치한 뒤 프린터를 다시 연결하세요.', usbNotFound: 'USB 프린터를 찾을 수 없습니다. 다시 연결한 후 새로 고침하세요.', queryButton: '프린터에 조회', + queryPrintButton: '조회 후 인쇄', queryHint: '이 문서는 프린터에 무언가를 묻습니다. 응답은 여기에 열립니다.', + queryPrintsOne: '프린터가 응답하는 동안 라벨 한 장을 인쇄합니다.', + queryPrintsManyFmt: '프린터가 응답하는 동안 라벨 {n}장을 인쇄합니다.', + queryPrintsRecalled: '이 문서는 프린터에 저장된 포맷을 불러옵니다. 라벨이 인쇄되는지와 몇 장인지는 그 포맷이 정합니다.', queryNoChannel: '이 경로로는 응답이 돌아오지 않으므로 응답이 사라집니다.', queryNoRender: '이 방법은 이미지를 인쇄하므로 응답이 도착할 곳이 없습니다.', - queryMixedHint: '다른 필드도 함께 인쇄됩니다.', queryUnmarkedFmt: '{commands}에 대한 응답에는 ZPLab이 찾을 수 있는 헤더나 종결 문자가 없습니다. 둘 다 없으면 나머지 출력과 구분할 수 없습니다. ZPLab은 쿼리 없이 문서를 보냅니다.', queryAmbiguousFmt: '{commands}에 대한 응답은 헤더와 종결자로 다른 응답과 구분할 수 없습니다. ZPLab은 쿼리 없이 문서를 보냅니다.', queryUncountedFmt: 'ZPLab은 {commands}에 대한 응답을 예측할 수 없습니다. 프린터는 인쇄 시점에 내장, 일련번호, 시계 또는 RFID 필드에서 값을 채울 수 있습니다. 이 문서에 없는 저장된 포맷이 값을 채울 수도 있습니다. 무효 처리된 RFID 라벨은 다시 인쇄되고 다시 응답합니다. ZPLab은 쿼리 없이 문서를 보냅니다.', diff --git a/src/locales/lt.ts b/src/locales/lt.ts index e9508d0e..48294499 100644 --- a/src/locales/lt.ts +++ b/src/locales/lt.ts @@ -2020,10 +2020,13 @@ const lt = { usbSetupFlatpak: 'Flatpak aplinkoje programa negali pati įdiegti udev taisyklės. Įdiekite 70-zplab.rules iš ZPLab saugyklos pagrindinėje sistemoje, tada iš naujo prijunkite spausdintuvą.', usbNotFound: 'USB spausdintuvas nerastas. Prijunkite jį iš naujo ir atnaujinkite.', queryButton: 'Užklausti spausdintuvą', + queryPrintButton: 'Užklausti ir spausdinti', queryHint: 'Šis dokumentas kai ko klausia spausdintuvo. Atsakymas atsiveria čia.', + queryPrintsOne: 'Spausdintuvas atsakydamas išspausdina vieną etiketę.', + queryPrintsManyFmt: 'Spausdintuvas atsakydamas išspausdina {n} etikečių.', + queryPrintsRecalled: 'Dokumentas iškviečia spausdintuve išsaugotą formatą. Ar etiketės bus spausdinamos ir kiek jų, nusprendžia tas formatas.', queryNoChannel: 'Šiuo keliu atsakymas negrįžta, todėl jis pranyksta.', queryNoRender: 'Šis būdas spausdina vaizdą, todėl atsakymui nėra kur nukeliauti.', - queryMixedHint: 'Kiti laukai taip pat bus išspausdinti.', queryUnmarkedFmt: 'Atsakymas į {commands} neturi antraštės ar pabaigos ženklo, kurį ZPLab galėtų rasti. Be jų jo neįmanoma atskirti nuo likusio srauto. ZPLab siunčia dokumentą be užklausos.', queryAmbiguousFmt: '{commands} atsakymų neįmanoma atskirti nuo kitų pagal jų antraštes ir pabaigos ženklus. ZPLab siunčia dokumentą be užklausos.', queryUncountedFmt: 'ZPLab negali numatyti atsakymų į {commands}. Spausdintuvas gali juos užpildyti spausdindamas iš įterpto, serijos, laikrodžio arba RFID lauko. Juos taip pat gali užpildyti išsaugotas formatas, kurio šiame dokumente nėra. Anuliuota RFID etiketė spausdinama iš naujo ir atsako iš naujo. ZPLab siunčia dokumentą be užklausos.', diff --git a/src/locales/lv.ts b/src/locales/lv.ts index d2da19b1..9d9577ce 100644 --- a/src/locales/lv.ts +++ b/src/locales/lv.ts @@ -2020,10 +2020,13 @@ const lv = { usbSetupFlatpak: 'Flatpak iekšienē lietotne nevar pati instalēt udev kārtulu. Instalējiet 70-zplab.rules no ZPLab repozitorija resursdatorā un pēc tam atkārtoti pievienojiet printeri.', usbNotFound: 'USB printeris nav atrasts. Pievienojiet to atkārtoti un atsvaidziniet.', queryButton: 'Vaicāt printerim', + queryPrintButton: 'Vaicāt un drukāt', queryHint: 'Šis dokuments printerim ko jautā. Atbilde atveras šeit.', + queryPrintsOne: 'Atbildot printeris izdrukā vienu etiķeti.', + queryPrintsManyFmt: 'Atbildot printeris izdrukā {n} etiķetes.', + queryPrintsRecalled: 'Dokuments izsauc printerī saglabātu formātu. Vai etiķetes tiks drukātas un cik daudz, nosaka šis formāts.', queryNoChannel: 'Šajā ceļā atbilde neatgriežas, tāpēc tā tiek zaudēta.', queryNoRender: 'Šis veids drukā attēlu, tāpēc atbildei nav kur nonākt.', - queryMixedHint: 'Pārējie lauki arī tiek izdrukāti.', queryUnmarkedFmt: 'Atbildei uz {commands} nav galvenes vai beigu zīmes, ko ZPLab varētu atrast. Bez tām to nevar atšķirt no pārējā. ZPLab nosūta dokumentu bez vaicājuma.', queryAmbiguousFmt: '{commands} atbildes nevar atšķirt no pārējām pēc to galvenēm un beigu zīmēm. ZPLab sūta dokumentu bez vaicājuma.', queryUncountedFmt: 'ZPLab nevar paredzēt atbildes uz {commands}. Printeris tās var aizpildīt drukas brīdī no iegultā, sērijas, pulksteņa vai RFID lauka. Tās var aizpildīt arī saglabāts formāts, kura šajā dokumentā nav. Anulēta RFID etiķete tiek drukāta vēlreiz un atbild vēlreiz. ZPLab nosūta dokumentu bez vaicājuma.', diff --git a/src/locales/nl.ts b/src/locales/nl.ts index 0c55938b..072857ee 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -2020,10 +2020,13 @@ const nl = { usbSetupFlatpak: 'Binnen Flatpak kan de app de udev-regel niet zelf installeren. Installeer 70-zplab.rules uit de ZPLab-repository op de host en sluit de printer vervolgens opnieuw aan.', usbNotFound: 'USB-printer niet gevonden. Sluit deze opnieuw aan en vernieuw.', queryButton: 'Printer opvragen', + queryPrintButton: 'Opvragen en afdrukken', queryHint: 'Dit document vraagt de printer iets. Het antwoord opent hier.', + queryPrintsOne: 'De printer print één label terwijl hij antwoordt.', + queryPrintsManyFmt: 'De printer print {n} labels terwijl hij antwoordt.', + queryPrintsRecalled: 'Het document roept een opgeslagen formaat in de printer op. Of er labels worden afgedrukt en hoeveel, bepaalt dat formaat.', queryNoChannel: 'Langs deze weg komt geen antwoord terug, dus het antwoord gaat verloren.', queryNoRender: 'Deze weg drukt een afbeelding af, dus het antwoord kan nergens terecht.', - queryMixedHint: 'De overige velden worden ook afgedrukt.', queryUnmarkedFmt: 'Het antwoord op {commands} heeft geen header of afsluiter die ZPLab kan vinden. Zonder een van beide is het niet van de rest te onderscheiden. ZPLab verstuurt het document zonder query.', queryAmbiguousFmt: 'De antwoorden op {commands} zijn niet van de rest te onderscheiden aan de hand van hun headers en afsluiters. ZPLab verstuurt het document zonder opvraging.', queryUncountedFmt: 'ZPLab kan de antwoorden op {commands} niet voorspellen. De printer vult ze mogelijk pas bij het afdrukken in vanuit een ingebed, serie-, klok- of RFID-veld. Ook een opgeslagen formaat dat dit document niet bevat, kan ze invullen. Een ongeldig RFID-label wordt opnieuw afgedrukt en antwoordt opnieuw. ZPLab verstuurt het document zonder query.', diff --git a/src/locales/no.ts b/src/locales/no.ts index d4ed7ad1..2d5cd3ba 100644 --- a/src/locales/no.ts +++ b/src/locales/no.ts @@ -2020,10 +2020,13 @@ const no = { usbSetupFlatpak: 'Inne i Flatpak kan appen ikke installere udev-regelen selv. Installer 70-zplab.rules fra ZPLab-repositoriet på verten, og koble deretter skriveren til på nytt.', usbNotFound: 'Fant ikke USB-skriveren. Koble den til på nytt, og oppdater.', queryButton: 'Spør skriveren', + queryPrintButton: 'Spør og skriv ut', queryHint: 'Dette dokumentet spør skriveren om noe. Svaret åpnes her.', + queryPrintsOne: 'Skriveren skriver ut én etikett mens den svarer.', + queryPrintsManyFmt: 'Skriveren skriver ut {n} etiketter mens den svarer.', + queryPrintsRecalled: 'Dokumentet kaller opp et lagret format i skriveren. Om det skrives ut etiketter, og hvor mange, avgjør dette formatet.', queryNoChannel: 'Den veien bærer ingen svar, så svaret går tapt.', queryNoRender: 'Denne veien skriver ut et bilde, så svaret har ingen steder å lande.', - queryMixedHint: 'De andre feltene skrives ut også.', queryUnmarkedFmt: 'Svaret på {commands} har ingen header eller avslutning som ZPLab kan finne. Uten en av delene kan det ikke skilles fra resten. ZPLab sender dokumentet uten spørring.', queryAmbiguousFmt: 'Svarene på {commands} kan ikke skilles fra de øvrige på headerne og avslutningene sine. ZPLab sender dokumentet uten forespørsel.', queryUncountedFmt: 'ZPLab kan ikke forutsi svarene på {commands}. Skriveren fyller dem muligens først ved utskrift fra et innebygd, serie-, klokke- eller RFID-felt. Et lagret format som dette dokumentet ikke inneholder, kan også fylle dem. En ugyldig RFID-etikett skrives ut igjen og svarer igjen. ZPLab sender dokumentet uten spørring.', diff --git a/src/locales/pl.ts b/src/locales/pl.ts index 75fa9556..e3a96eb5 100644 --- a/src/locales/pl.ts +++ b/src/locales/pl.ts @@ -2020,10 +2020,13 @@ const pl = { usbSetupFlatpak: 'Wewnątrz Flatpaka aplikacja nie może sama zainstalować reguły udev. Zainstaluj 70-zplab.rules z repozytorium ZPLab na hoście, a następnie podłącz drukarkę ponownie.', usbNotFound: 'Nie znaleziono drukarki USB, podłącz ją ponownie i odśwież.', queryButton: 'Zapytaj drukarkę', + queryPrintButton: 'Zapytaj i drukuj', queryHint: 'Ten dokument o coś pyta drukarkę. Odpowiedź otwiera się tutaj.', + queryPrintsOne: 'Drukarka drukuje jedną etykietę podczas odpowiedzi.', + queryPrintsManyFmt: 'Drukarka drukuje {n} etykiet podczas odpowiedzi.', + queryPrintsRecalled: 'Dokument wywołuje zapisany format, który znajduje się w drukarce. Czy etykiety zostaną wydrukowane i ile, rozstrzyga ten format.', queryNoChannel: 'Tą drogą nie wraca żadna odpowiedź, więc odpowiedź przepada.', queryNoRender: 'Ta droga drukuje obraz, więc odpowiedź nie ma dokąd trafić.', - queryMixedHint: 'Pozostałe pola też zostaną wydrukowane.', queryUnmarkedFmt: 'Odpowiedź na {commands} nie ma nagłówka ani znaku końca, które ZPLab potrafiłby znaleźć. Bez nich nie da się jej odróżnić od reszty. ZPLab wysyła dokument bez zapytania.', queryAmbiguousFmt: 'Odpowiedzi na {commands} nie da się odróżnić od pozostałych po nagłówkach i terminatorach. ZPLab wysyła dokument bez zapytania.', queryUncountedFmt: 'ZPLab nie potrafi przewidzieć odpowiedzi na {commands}. Drukarka może wypełnić je dopiero podczas druku z pola osadzonego, seryjnego, zegarowego lub RFID. Może je wypełnić także zapisany format, którego ten dokument nie zawiera. Unieważniona etykieta RFID jest drukowana ponownie i odpowiada ponownie. ZPLab wysyła dokument bez zapytania.', diff --git a/src/locales/pt.ts b/src/locales/pt.ts index 8413895b..11ba8cfd 100644 --- a/src/locales/pt.ts +++ b/src/locales/pt.ts @@ -2020,10 +2020,13 @@ const pt = { usbSetupFlatpak: 'Dentro do Flatpak, a aplicação não pode instalar a regra udev por si própria. Instale o 70-zplab.rules a partir do repositório ZPLab no anfitrião e depois volte a ligar a impressora.', usbNotFound: 'Impressora USB não encontrada, reconecte-a e atualize.', queryButton: 'Consultar impressora', + queryPrintButton: 'Consultar e imprimir', queryHint: 'Este documento pergunta algo à impressora. A resposta abre aqui.', + queryPrintsOne: 'A impressora imprime uma etiqueta enquanto responde.', + queryPrintsManyFmt: 'A impressora imprime {n} etiquetas enquanto responde.', + queryPrintsRecalled: 'O documento chama um formato armazenado na impressora. Esse formato decide se são impressas etiquetas e quantas.', queryNoChannel: 'Este caminho não traz nenhuma resposta, por isso a resposta é perdida.', queryNoRender: 'Esta via imprime uma imagem, por isso a resposta não tem para onde ir.', - queryMixedHint: 'Os outros campos também são impressos.', queryUnmarkedFmt: 'A resposta a {commands} não tem cabeçalho nem terminador que o ZPLab consiga encontrar. Sem um deles, não dá para distingui-la do resto. O ZPLab envia o documento sem consulta.', queryAmbiguousFmt: 'As respostas a {commands} não se distinguem das restantes pelos cabeçalhos e terminadores. O ZPLab envia o documento sem consulta.', queryUncountedFmt: 'O ZPLab não consegue prever as respostas a {commands}. A impressora pode preenchê-las na hora da impressão a partir de um campo incorporado, de série, de relógio ou RFID. Um formato armazenado que este documento não contém também pode preenchê-las. Uma etiqueta RFID anulada é impressa de novo e responde de novo. O ZPLab envia o documento sem consulta.', diff --git a/src/locales/ro.ts b/src/locales/ro.ts index f5c2dc7d..0f5b8c3b 100644 --- a/src/locales/ro.ts +++ b/src/locales/ro.ts @@ -2020,10 +2020,13 @@ const ro = { usbSetupFlatpak: 'În interiorul Flatpak, aplicația nu poate instala regula udev singură. Instalează 70-zplab.rules din depozitul ZPLab pe sistemul-host, apoi reconectează imprimanta.', usbNotFound: 'Imprimanta USB nu a fost găsită, reconecteaz-o și reîmprospătează.', queryButton: 'Interoghează imprimanta', + queryPrintButton: 'Interoghează și imprimă', queryHint: 'Acest document întreabă ceva imprimanta. Răspunsul se deschide aici.', + queryPrintsOne: 'Imprimanta tipărește o etichetă în timp ce răspunde.', + queryPrintsManyFmt: 'Imprimanta tipărește {n} etichete în timp ce răspunde.', + queryPrintsRecalled: 'Documentul apelează un format stocat în imprimantă. Acest format decide dacă se tipăresc etichete și câte.', queryNoChannel: 'Pe această cale nu vine niciun răspuns, așa că răspunsul se pierde.', queryNoRender: 'Această cale tipărește o imagine, așa că răspunsul nu are unde să ajungă.', - queryMixedHint: 'Celelalte câmpuri se tipăresc și ele.', queryUnmarkedFmt: 'Răspunsul la {commands} nu are antet sau terminator pe care ZPLab să le poată găsi. Fără unul dintre ele, nu poate fi deosebit de restul. ZPLab trimite documentul fără interogare.', queryAmbiguousFmt: 'Răspunsurile la {commands} nu pot fi deosebite de celelalte după antete și terminatoare. ZPLab trimite documentul fără interogare.', queryUncountedFmt: 'ZPLab nu poate prevedea răspunsurile la {commands}. Imprimanta le poate completa la imprimare dintr-un câmp încorporat, serial, de ceas sau RFID. Le poate completa și un format stocat pe care acest document nu îl conține. O etichetă RFID anulată se imprimă din nou și răspunde din nou. ZPLab trimite documentul fără interogare.', diff --git a/src/locales/sk.ts b/src/locales/sk.ts index 7ddf3a44..7f2dc591 100644 --- a/src/locales/sk.ts +++ b/src/locales/sk.ts @@ -2020,10 +2020,13 @@ const sk = { usbSetupFlatpak: 'Vo Flatpaku si aplikácia nemôže pravidlo udev nainštalovať sama. Nainštalujte 70-zplab.rules z repozitára ZPLab na hostiteľský systém a potom znova pripojte tlačiareň.', usbNotFound: 'Tlačiareň USB sa nenašla, znova ju zapojte a obnovte.', queryButton: 'Dopytovať tlačiareň', + queryPrintButton: 'Dopytovať a tlačiť', queryHint: 'Tento dokument sa tlačiarne na niečo pýta. Odpoveď sa otvorí tu.', + queryPrintsOne: 'Tlačiareň pri odpovedi vytlačí jeden štítok.', + queryPrintsManyFmt: 'Tlačiareň pri odpovedi vytlačí {n} štítkov.', + queryPrintsRecalled: 'Dokument volá uložený formát, ktorý je v tlačiarni. Či sa štítky vytlačia a koľko ich bude, určuje tento formát.', queryNoChannel: 'Touto cestou sa žiadna odpoveď nevracia, preto sa stratí.', queryNoRender: 'Táto cesta tlačí obrázok, takže odpoveď nemá kam prísť.', - queryMixedHint: 'Ostatné polia sa vytlačia tiež.', queryUnmarkedFmt: 'Odpoveď na {commands} nemá hlavičku ani ukončenie, ktoré by ZPLab dokázal nájsť. Bez nich ju nemožno odlíšiť od zvyšku. ZPLab odošle dokument bez dotazu.', queryAmbiguousFmt: 'Odpovede na {commands} nemožno rozlíšiť od ostatných podľa hlavičiek a ukončovačov. ZPLab odošle dokument bez dotazu.', queryUncountedFmt: 'ZPLab nedokáže predvídať odpovede na {commands}. Tlačiareň ich môže doplniť až pri tlači z vloženého, sériového, hodinového alebo RFID poľa. Môže ich doplniť aj uložený formát, ktorý tento dokument neobsahuje. Neplatná RFID etiketa sa vytlačí znova a odpovie znova. ZPLab odošle dokument bez dotazu.', diff --git a/src/locales/sl.ts b/src/locales/sl.ts index 049a9e85..aa0c462c 100644 --- a/src/locales/sl.ts +++ b/src/locales/sl.ts @@ -2020,10 +2020,13 @@ const sl = { usbSetupFlatpak: 'Znotraj Flatpaka aplikacija ne more sama namestiti pravila udev. Namestite 70-zplab.rules iz repozitorija ZPLab na gostitelja in nato tiskalnik znova priključite.', usbNotFound: 'Tiskalnika USB ni mogoče najti, znova ga priključite in osvežite.', queryButton: 'Povprašaj tiskalnik', + queryPrintButton: 'Povprašaj in natisni', queryHint: 'Ta dokument tiskalnik nekaj vpraša. Odgovor se odpre tukaj.', + queryPrintsOne: 'Tiskalnik med odgovarjanjem natisne eno nalepko.', + queryPrintsManyFmt: 'Tiskalnik med odgovarjanjem natisne {n} nalepk.', + queryPrintsRecalled: 'Dokument pokliče shranjeno obliko, ki je v tiskalniku. Ali se nalepke natisnejo in koliko, določa ta oblika.', queryNoChannel: 'Po tej poti odgovor ne pride nazaj, zato se izgubi.', queryNoRender: 'Ta pot natisne sliko, zato odgovor nima kam priti.', - queryMixedHint: 'Ostala polja se prav tako natisnejo.', queryUnmarkedFmt: 'Odgovor na {commands} nima glave ali zaključka, ki bi ju ZPLab lahko našel. Brez njiju ga ni mogoče ločiti od ostalega. ZPLab pošlje dokument brez poizvedbe.', queryAmbiguousFmt: 'Odgovorov na {commands} ni mogoče ločiti od ostalih po glavah in zaključkih. ZPLab pošlje dokument brez poizvedbe.', queryUncountedFmt: 'ZPLab ne more predvideti odgovorov na {commands}. Tiskalnik jih lahko izpolni šele pri tiskanju iz vdelanega, serijskega, urnega ali RFID polja. Izpolni jih lahko tudi shranjena oblika, ki je ta dokument ne vsebuje. Razveljavljena RFID nalepka se natisne znova in znova odgovori. ZPLab pošlje dokument brez poizvedbe.', diff --git a/src/locales/sr.ts b/src/locales/sr.ts index 16fd817d..550d00a8 100644 --- a/src/locales/sr.ts +++ b/src/locales/sr.ts @@ -2020,10 +2020,13 @@ const sr = { usbSetupFlatpak: 'Унутар Flatpak-а апликација не може сама да инсталира udev правило. Инсталирајте 70-zplab.rules из ZPLab репозиторијума на хост систем, затим поново прикључите штампач.', usbNotFound: 'USB штампач није пронађен, поново га прикључите и освежите.', queryButton: 'Испитај штампач', + queryPrintButton: 'Испитај и штампај', queryHint: 'Овај документ нешто пита штампач. Одговор се отвара овде.', + queryPrintsOne: 'Штампач штампа једну налепницу док одговара.', + queryPrintsManyFmt: 'Штампач штампа {n} налепница док одговара.', + queryPrintsRecalled: 'Документ позива сачувани формат који се налази у штампачу. Да ли ће се налепнице штампати и колико, одређује тај формат.', queryNoChannel: 'Овим путем одговор не долази, зато се губи.', queryNoRender: 'Овим путем се штампа слика, па одговор нема где да стигне.', - queryMixedHint: 'Остала поља се такође штампају.', queryUnmarkedFmt: 'Odgovor na {commands} nema zaglavlje ni završni znak koje ZPLab može da pronađe. Bez njih se ne može razlikovati od ostatka. ZPLab šalje dokument bez upita.', queryAmbiguousFmt: 'Odgovori na {commands} ne mogu se razlikovati od ostalih prema zaglavljima i završnim znacima. ZPLab šalje dokument bez upita.', queryUncountedFmt: 'ZPLab ne može da predvidi odgovore na {commands}. Štampač ih može popuniti tek pri štampi iz ugrađenog, serijskog, časovničkog ili RFID polja. Može ih popuniti i sačuvani format koji ovaj dokument ne sadrži. Poništena RFID nalepnica se štampa ponovo i ponovo odgovara. ZPLab šalje dokument bez upita.', diff --git a/src/locales/sv.ts b/src/locales/sv.ts index 17d54d7a..2ecd93e1 100644 --- a/src/locales/sv.ts +++ b/src/locales/sv.ts @@ -2020,10 +2020,13 @@ const sv = { usbSetupFlatpak: 'Inuti Flatpak kan appen inte installera udev-regeln själv. Installera 70-zplab.rules från ZPLab-förrådet på värden och anslut sedan skrivaren igen.', usbNotFound: 'USB-skrivaren hittades inte. Anslut den igen och uppdatera.', queryButton: 'Fråga skrivaren', + queryPrintButton: 'Fråga och skriv ut', queryHint: 'Det här dokumentet frågar skrivaren något. Svaret öppnas här.', + queryPrintsOne: 'Skrivaren skriver ut en etikett medan den svarar.', + queryPrintsManyFmt: 'Skrivaren skriver ut {n} etiketter medan den svarar.', + queryPrintsRecalled: 'Dokumentet anropar ett sparat format i skrivaren. Om etiketter skrivs ut, och hur många, avgör det formatet.', queryNoChannel: 'Den vägen bär inget svar, så svaret går förlorat.', queryNoRender: 'Den här vägen skriver ut en bild, så svaret har ingenstans att ta vägen.', - queryMixedHint: 'De övriga fälten skrivs ut också.', queryUnmarkedFmt: 'Svaret på {commands} har ingen header eller avslutning som ZPLab kan hitta. Utan någon av dem går det inte att skilja från resten. ZPLab skickar dokumentet utan fråga.', queryAmbiguousFmt: 'Svaren på {commands} kan inte skiljas från de övriga på sina headrar och avslutningar. ZPLab skickar dokumentet utan fråga.', queryUncountedFmt: 'ZPLab kan inte förutsäga svaren på {commands}. Skrivaren fyller kanske i dem först vid utskrift från ett inbäddat fält, ett serie-, klock- eller RFID-fält. Ett sparat format som det här dokumentet inte innehåller kan också fylla i dem. En ogiltig RFID-etikett skrivs ut igen och svarar igen. ZPLab skickar dokumentet utan fråga.', diff --git a/src/locales/tr.ts b/src/locales/tr.ts index 5d40bc72..59f094e2 100644 --- a/src/locales/tr.ts +++ b/src/locales/tr.ts @@ -2020,10 +2020,13 @@ const tr = { usbSetupFlatpak: 'Flatpak içinde uygulama udev kuralını kendi başına yükleyemez. ZPLab deposundan 70-zplab.rules dosyasını ana makineye yükleyin, ardından yazıcıyı yeniden takın.', usbNotFound: 'USB yazıcı bulunamadı, yeniden takıp yenileyin.', queryButton: 'Yazıcıyı sorgula', + queryPrintButton: 'Sorgula ve yazdır', queryHint: 'Bu belge yazıcıya bir şey sorar. Yanıt burada açılır.', + queryPrintsOne: 'Yazıcı yanıt verirken bir etiket yazdırır.', + queryPrintsManyFmt: 'Yazıcı yanıt verirken {n} etiket yazdırır.', + queryPrintsRecalled: 'Belge, yazıcıda kayıtlı bir biçimi çağırır. Etiket yazdırılıp yazdırılmayacağını ve kaç tane olacağını bu biçim belirler.', queryNoChannel: 'Bu yoldan yanıt gelmez, bu yüzden yanıt kaybolur.', queryNoRender: 'Bu yol bir görüntü yazdırır, bu yüzden yanıtın gidecek yeri yoktur.', - queryMixedHint: 'Diğer alanlar da yazdırılır.', queryUnmarkedFmt: "{commands} yanıtında ZPLab'ın bulabileceği bir başlık veya sonlandırıcı yoktur. Bunlar olmadan yanıt geri kalandan ayırt edilemez. ZPLab belgeyi sorgu olmadan gönderir.", queryAmbiguousFmt: '{commands} yanıtları başlıklarına ve bitiricilerine bakılarak diğerlerinden ayırt edilemez. ZPLab belgeyi sorgu olmadan gönderir.', queryUncountedFmt: 'ZPLab, {commands} yanıtlarını önceden tahmin edemez. Yazıcı bunları yazdırma sırasında gömülü, seri, saat veya RFID alanından doldurabilir. Bu belgenin içermediği kayıtlı bir biçim de bunları doldurabilir. Geçersiz kılınmış bir RFID etiketi yeniden yazdırılır ve yeniden yanıt verir. ZPLab belgeyi sorgu olmadan gönderir.', diff --git a/src/locales/zh-hans.ts b/src/locales/zh-hans.ts index 6549f641..be0e5166 100644 --- a/src/locales/zh-hans.ts +++ b/src/locales/zh-hans.ts @@ -2020,10 +2020,13 @@ const zhHans = { usbSetupFlatpak: '在 Flatpak 中,应用无法自行安装 udev 规则。请在主机上从 ZPLab 仓库安装 70-zplab.rules,然后重新插拔打印机。', usbNotFound: '未找到 USB 打印机,请重新插入并刷新。', queryButton: '查询打印机', + queryPrintButton: '查询并打印', queryHint: '本文档向打印机提问。应答在此处打开。', + queryPrintsOne: '打印机在应答时会打印一张标签。', + queryPrintsManyFmt: '打印机在应答时会打印 {n} 张标签。', + queryPrintsRecalled: '文档调用打印机中已存储的格式。是否打印标签以及打印多少张,由该格式决定。', queryNoChannel: '这条路不带回应答,因此应答会丢失。', queryNoRender: '此方式打印的是图像,应答无处可去。', - queryMixedHint: '其余字段也会打印。', queryUnmarkedFmt: '{commands} 的回复没有 ZPLab 能找到的头部或结束符。没有它们,就无法把回复与其余输出区分开。ZPLab 发送文档时不附带查询。', queryAmbiguousFmt: '无法通过标头和结束符将 {commands} 的回复与其他回复区分开来。ZPLab 将不带查询发送文档。', queryUncountedFmt: 'ZPLab 无法预测 {commands} 的回复。打印机可能在打印时从嵌入、序列号、时钟或 RFID 字段填充这些回复。本文档不包含的已存储格式也可能填充这些回复。作废的 RFID 标签会再次打印并再次回复。ZPLab 发送文档时不附带查询。', diff --git a/src/locales/zh-hant.ts b/src/locales/zh-hant.ts index 5c432d04..42991226 100644 --- a/src/locales/zh-hant.ts +++ b/src/locales/zh-hant.ts @@ -2020,10 +2020,13 @@ const zhHant = { usbSetupFlatpak: '在 Flatpak 中,應用程式無法自行安裝 udev 規則。請在主機上從 ZPLab 儲存庫安裝 70-zplab.rules,然後重新插拔印表機。', usbNotFound: '找不到 USB 印表機,請重新插入並重新整理。', queryButton: '查詢印表機', + queryPrintButton: '查詢並列印', queryHint: '本文件向印表機提問。回應在此處開啟。', + queryPrintsOne: '印表機在回應時會列印一張標籤。', + queryPrintsManyFmt: '印表機在回應時會列印 {n} 張標籤。', + queryPrintsRecalled: '文件呼叫印表機中已儲存的格式。是否列印標籤以及列印多少張,由該格式決定。', queryNoChannel: '這條路不會帶回回應,因此回應會遺失。', queryNoRender: '此方式列印的是影像,回應無處可去。', - queryMixedHint: '其餘欄位也會列印。', queryUnmarkedFmt: '{commands} 的回覆沒有 ZPLab 能找到的標頭或結束字元。沒有它們,就無法把回覆與其餘輸出區分開。ZPLab 傳送文件時不附帶查詢。', queryAmbiguousFmt: '無法透過標頭和結束符將 {commands} 的回覆與其他回覆區分開來。ZPLab 將不帶查詢傳送文件。', queryUncountedFmt: 'ZPLab 無法預測 {commands} 的回覆。印表機可能在列印時從內嵌、序號、時鐘或 RFID 欄位填入這些回覆。本文件不包含的已儲存格式也可能填入這些回覆。作廢的 RFID 標籤會再次列印並再次回覆。ZPLab 傳送文件時不附帶查詢。',