Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/components/AppShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
SunIcon,
MoonIcon,
} from "@heroicons/react/16/solid";
import { useLabelStore, useHistory } from "../store/labelStore";
import { useLabelStore, useHistory, selectLabelaryNoticeRequired } from "../store/labelStore";
import { LabelaryNoticeModal } from "./Output/LabelaryNoticeModal";
import { localeNames } from "../locales";
import type { LocaleCode } from "../locales";
Expand All @@ -54,7 +54,7 @@ export function AppShell() {
const theme = useLabelStore((s) => s.theme);
const setTheme = useLabelStore((s) => s.setTheme);
const labelaryEnabled = useLabelStore((s) => s.thirdParty.labelary);
const noticeAcknowledged = useLabelStore((s) => s.labelaryNoticeAcknowledged);
const noticeRequired = useLabelStore(selectLabelaryNoticeRequired);
const [showPrintNotice, setShowPrintNotice] = useState(false);

// Bridge the theme preference to <html data-theme> so the CSS variables in
Expand Down Expand Up @@ -218,7 +218,7 @@ export function AppShell() {
{labelaryEnabled && (
<DropdownItem
icon={PrinterIcon}
onClick={() => (noticeAcknowledged ? handlePrint() : setShowPrintNotice(true))}
onClick={() => (noticeRequired ? setShowPrintNotice(true) : handlePrint())}
disabled={!hasObjects}
>
{t.app.print}
Expand Down
24 changes: 13 additions & 11 deletions src/components/Output/LabelPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react';
import { XMarkIcon, ArrowDownTrayIcon } from '@heroicons/react/16/solid';
import { useLabelStore, useCurrentObjects } from '../../store/labelStore';
import { generateZPL } from '../../lib/zplGenerator';
import { fetchPreview, labelaryErrorMessage } from '../../lib/labelary';
import { fetchPreview, labelaryErrorMessage, isDefaultLabelaryHost } from '../../lib/labelary';
import { triggerDownload } from '../../lib/triggerDownload';
import { useT } from '../../lib/useT';
import { DialogShell } from '../ui/DialogShell';
Expand Down Expand Up @@ -101,16 +101,18 @@ export function LabelPreviewModal({ onClose }: Props) {
</div>
</div>

<div className="px-3 py-1 border-t border-border-2 shrink-0 text-center">
<a
href="https://labelary.com/"
target="_blank"
rel="noreferrer"
className="font-mono text-[9px] text-muted hover:text-accent transition-colors"
>
{t.output.previewProvider}
</a>
</div>
{isDefaultLabelaryHost() && (
<div className="px-3 py-1 border-t border-border-2 shrink-0 text-center">
<a
href="https://labelary.com/"
target="_blank"
rel="noreferrer"
className="font-mono text-[9px] text-muted hover:text-accent transition-colors"
>
{t.output.previewProvider}
</a>
</div>
)}
</DialogShell>
);
}
2 changes: 1 addition & 1 deletion src/components/Output/LabelaryNoticeModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export function LabelaryNoticeModal({ onContinue, onClose }: Props) {
<div className="flex flex-col gap-3 p-6 max-w-80 text-center font-mono text-[10px] text-muted leading-relaxed">
<span>{t.output.previewNoticeBody}</span>
<a
href="https://labelary.com/privacy.html"
href="https://labelary.com/service.html#pricing"
target="_blank"
rel="noreferrer"
className="text-accent hover:underline"
Expand Down
6 changes: 3 additions & 3 deletions src/components/Output/ZPLOutput.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react';
import { CheckIcon, ClipboardDocumentIcon, ChevronDownIcon, ChevronUpIcon, EyeIcon } from '@heroicons/react/16/solid';
import { useLabelStore } from '../../store/labelStore';
import { useLabelStore, selectLabelaryNoticeRequired } from '../../store/labelStore';
import { generateMultiPageZPL } from '../../lib/zplGenerator';
import { useT } from '../../lib/useT';
import { LabelPreviewModal } from './LabelPreview';
Expand All @@ -17,7 +17,7 @@ export function ZPLOutput({ collapsed, onCollapse, onExpand }: Props) {
const label = useLabelStore((s) => s.label);
const pages = useLabelStore((s) => s.pages);
const labelaryEnabled = useLabelStore((s) => s.thirdParty.labelary);
const noticeAcknowledged = useLabelStore((s) => s.labelaryNoticeAcknowledged);
const noticeRequired = useLabelStore(selectLabelaryNoticeRequired);
const [copied, setCopied] = useState(false);
const [showPreview, setShowPreview] = useState(false);
const [showNotice, setShowNotice] = useState(false);
Expand Down Expand Up @@ -50,7 +50,7 @@ export function ZPLOutput({ collapsed, onCollapse, onExpand }: Props) {
<div className="flex items-center gap-3">
{labelaryEnabled && (
<button
onClick={() => (noticeAcknowledged ? setShowPreview(true) : setShowNotice(true))}
onClick={() => (noticeRequired ? setShowNotice(true) : setShowPreview(true))}
disabled={!zpl}
title={t.output.previewHeading}
className="flex items-center gap-1 font-mono text-[10px] text-muted hover:text-accent disabled:opacity-25 disabled:cursor-not-allowed transition-colors"
Expand Down
41 changes: 39 additions & 2 deletions src/lib/labelary.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,39 @@
import type { LabelConfig } from '../types/ObjectType';

const TIMEOUT_MS = 10_000;
const DEFAULT_HOST = 'https://api.labelary.com';

// Build-time Labelary endpoint configuration. Labelary's premium plans
// (Plus, Business, On-Premise) hand out a private hostname — and for the
// metered plans also an API key — via email upon sign-up. Operators set:
// - VITE_LABELARY_API_URL – e.g. https://acme.labelary.com
// - VITE_LABELARY_API_KEY – the key value, if the plan requires one
// The key is sent as X-API-Key, matching Labelary's own viewer
// (https://labelary.com/viewer.html source).

function trimmed(raw: unknown): string | undefined {
if (typeof raw !== 'string') return undefined;
const t = raw.trim();
return t || undefined;
}

function host(): string {
const configured = trimmed(import.meta.env.VITE_LABELARY_API_URL);
if (!configured) return DEFAULT_HOST;
return configured.replace(/\/+$/, '');
}

function apiKey(): string | undefined {
return trimmed(import.meta.env.VITE_LABELARY_API_KEY);
}
Comment on lines +20 to +28
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The host() and apiKey() functions perform string operations and environment variable lookups on every call. Since these values are derived from build-time environment variables and are constant during the application's lifecycle, it is more efficient to compute them once at the module level. This is particularly relevant as host() is called via the selectLabelaryNoticeRequired Zustand selector, which may execute frequently during UI interactions (e.g., when dragging objects on the canvas).

Suggested change
function host(): string {
const configured = trimmed(import.meta.env.VITE_LABELARY_API_URL);
if (!configured) return DEFAULT_HOST;
return configured.replace(/\/+$/, '');
}
function apiKey(): string | undefined {
return trimmed(import.meta.env.VITE_LABELARY_API_KEY);
}
const API_HOST = trimmed(import.meta.env.VITE_LABELARY_API_URL)?.replace(/\/+$/, '') ?? DEFAULT_HOST;
const API_KEY = trimmed(import.meta.env.VITE_LABELARY_API_KEY);
function host(): string { return API_HOST; }
function apiKey(): string | undefined { return API_KEY; }


/** True when the build targets the public api.labelary.com service. UI uses
* this to decide whether to surface the third-party-data-leaves-this-app
* privacy notice; a custom host implies the operator already controls the
* endpoint. */
export function isDefaultLabelaryHost(): boolean {
return host() === DEFAULT_HOST;
}

export class LabelaryError extends Error {
readonly kind: 'api' | 'timeout' | 'network';
Expand All @@ -15,13 +48,17 @@ export async function fetchPreview(zpl: string, label: LabelConfig): Promise<str
const { dpmm, widthMm, heightMm } = label;
const widthIn = (widthMm / 25.4).toFixed(3);
const heightIn = (heightMm / 25.4).toFixed(3);
const url = `https://api.labelary.com/v1/printers/${dpmm}dpmm/labels/${widthIn}x${heightIn}/0/`;
const url = `${host()}/v1/printers/${dpmm}dpmm/labels/${widthIn}x${heightIn}/0/`;

const headers: Record<string, string> = { 'Content-Type': 'application/x-www-form-urlencoded' };
const key = apiKey();
if (key) headers['X-API-Key'] = key;

let res: Response;
try {
res = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
headers,
body: zpl,
signal: AbortSignal.timeout(TIMEOUT_MS),
});
Expand Down
2 changes: 1 addition & 1 deletion src/locales/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const ar = {
previewProvider: 'معاينة عبر api.labelary.com',
previewNoticeTitle: 'إشعار الخصوصية',
previewNoticeBody: 'يتم إنشاء المعاينة والطباعة بواسطة الخدمة الخارجية api.labelary.com. يتم إرسال ZPL الكامل للملصق، بما في ذلك أي بيانات حساسة، عبر الشبكة.',
previewNoticePrivacyLink: 'معلومات خصوصية Labelary',
previewNoticePrivacyLink: 'خطط Labelary والاحتفاظ بالبيانات',
previewNoticeAcknowledge: 'فهمت، تابع',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/bg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const bg = {
previewProvider: 'Преглед чрез api.labelary.com',
previewNoticeTitle: 'Известие за поверителност',
previewNoticeBody: 'Прегледът и отпечатването се изобразяват от външната услуга api.labelary.com. Целият ZPL на етикета, включително чувствителните данни, се изпраща през мрежата.',
previewNoticePrivacyLink: 'Информация за поверителност на Labelary',
previewNoticePrivacyLink: 'Планове и съхранение на данни на Labelary',
previewNoticeAcknowledge: 'Разбрах, продължи',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const cs = {
previewProvider: 'Náhled přes api.labelary.com',
previewNoticeTitle: 'Upozornění na ochranu údajů',
previewNoticeBody: 'Náhled a tisk se generují pomocí externí služby api.labelary.com. Celý ZPL štítku, včetně citlivých údajů, je odesílán přes síť.',
previewNoticePrivacyLink: 'Informace o ochraně údajů Labelary',
previewNoticePrivacyLink: 'Tarify a uchovávání dat Labelary',
previewNoticeAcknowledge: 'Rozumím, pokračovat',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/da.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const da = {
previewProvider: 'Forhåndsvisning via api.labelary.com',
previewNoticeTitle: 'Privatlivsmeddelelse',
previewNoticeBody: 'Forhåndsvisning og udskrivning genereres af den eksterne tjeneste api.labelary.com. Hele etikettens ZPL, inklusive følsomme data, sendes over netværket.',
previewNoticePrivacyLink: 'Labelary-privatlivsoplysninger',
previewNoticePrivacyLink: 'Labelary-abonnementer og dataopbevaring',
previewNoticeAcknowledge: 'Forstået, fortsæt',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ const de = {
previewProvider: 'Vorschau über api.labelary.com',
previewNoticeTitle: 'Datenschutzhinweis',
previewNoticeBody: 'Vorschau und Druck werden vom externen Dienst api.labelary.com erstellt. Dabei wird das vollständige Label-ZPL inklusive sensibler Daten übertragen.',
previewNoticePrivacyLink: 'Labelary-Datenschutzhinweise',
previewNoticePrivacyLink: 'Labelary-Tarife & Datenaufbewahrung',
previewNoticeAcknowledge: 'Verstanden, fortfahren',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/el.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const el = {
previewProvider: 'Προεπισκόπηση μέσω api.labelary.com',
previewNoticeTitle: 'Ειδοποίηση απορρήτου',
previewNoticeBody: 'Η προεπισκόπηση και η εκτύπωση δημιουργούνται από την εξωτερική υπηρεσία api.labelary.com. Ολόκληρο το ZPL της ετικέτας, συμπεριλαμβανομένων ευαίσθητων δεδομένων, αποστέλλεται μέσω δικτύου.',
previewNoticePrivacyLink: 'Πληροφορίες απορρήτου Labelary',
previewNoticePrivacyLink: 'Πλάνα και διατήρηση δεδομένων Labelary',
previewNoticeAcknowledge: 'Κατάλαβα, συνέχεια',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ const en = {
previewProvider: 'Preview via api.labelary.com',
previewNoticeTitle: 'Privacy notice',
previewNoticeBody: 'Preview and print rendering is performed by the external service api.labelary.com. The full label ZPL, including any sensitive data, is sent over the network.',
previewNoticePrivacyLink: 'Labelary privacy information',
previewNoticePrivacyLink: 'Labelary plans & data retention',
previewNoticeAcknowledge: 'Got it, continue',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const es = {
previewProvider: 'Vista previa vía api.labelary.com',
previewNoticeTitle: 'Aviso de privacidad',
previewNoticeBody: 'La previsualización y la impresión se generan mediante el servicio externo api.labelary.com. Se envía el ZPL completo de la etiqueta, incluidos los datos sensibles.',
previewNoticePrivacyLink: 'Información de privacidad de Labelary',
previewNoticePrivacyLink: 'Planes y retención de datos de Labelary',
previewNoticeAcknowledge: 'Entendido, continuar',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/et.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const et = {
previewProvider: 'Eelvaade api.labelary.com kaudu',
previewNoticeTitle: 'Privaatsusteatis',
previewNoticeBody: 'Eelvaate ja printimise genereerib väline teenus api.labelary.com. Sildi terve ZPL, sealhulgas tundlikud andmed, saadetakse võrgu kaudu.',
previewNoticePrivacyLink: 'Labelary privaatsusteave',
previewNoticePrivacyLink: 'Labelary plaanid ja andmete säilitamine',
previewNoticeAcknowledge: 'Selge, jätka',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/fa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const fa = {
previewProvider: 'پیش‌نمایش از طریق api.labelary.com',
previewNoticeTitle: 'اطلاعیه حریم خصوصی',
previewNoticeBody: 'پیش‌نمایش و چاپ توسط سرویس خارجی api.labelary.com تولید می‌شود. ZPL کامل برچسب، شامل داده‌های حساس، از طریق شبکه ارسال می‌شود.',
previewNoticePrivacyLink: 'اطلاعات حریم خصوصی Labelary',
previewNoticePrivacyLink: 'طرح‌های Labelary و نگه‌داری داده‌ها',
previewNoticeAcknowledge: 'متوجه شدم، ادامه',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/fi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const fi = {
previewProvider: 'Esikatselu palvelusta api.labelary.com',
previewNoticeTitle: 'Tietosuojailmoitus',
previewNoticeBody: 'Esikatselun ja tulostuksen tuottaa ulkoinen palvelu api.labelary.com. Etiketin koko ZPL, mukaan lukien arkaluonteiset tiedot, lähetetään verkon yli.',
previewNoticePrivacyLink: 'Labelary-tietosuojatiedot',
previewNoticePrivacyLink: 'Labelary-tilaukset ja tietojen säilytys',
previewNoticeAcknowledge: 'Selvä, jatka',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const fr = {
previewProvider: 'Aperçu via api.labelary.com',
previewNoticeTitle: 'Avis de confidentialité',
previewNoticeBody: "Le rendu de l'aperçu et de l'impression est effectué par le service externe api.labelary.com. Le ZPL complet de l'étiquette, y compris toute donnée sensible, est envoyé sur le réseau.",
previewNoticePrivacyLink: 'Informations sur la confidentialité de Labelary',
previewNoticePrivacyLink: 'Forfaits et conservation des données Labelary',
previewNoticeAcknowledge: 'Compris, continuer',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/he.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const he = {
previewProvider: 'תצוגה מקדימה דרך api.labelary.com',
previewNoticeTitle: 'הודעת פרטיות',
previewNoticeBody: 'התצוגה המקדימה וההדפסה מופקות על ידי השירות החיצוני api.labelary.com. ה-ZPL המלא של התווית, כולל נתונים רגישים, נשלח ברשת.',
previewNoticePrivacyLink: 'מידע פרטיות של Labelary',
previewNoticePrivacyLink: 'תוכניות Labelary ושימור נתונים',
previewNoticeAcknowledge: 'הבנתי, המשך',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/hr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const hr = {
previewProvider: 'Pregled putem api.labelary.com',
previewNoticeTitle: 'Obavijest o privatnosti',
previewNoticeBody: 'Pregled i ispis generira vanjska usluga api.labelary.com. Cijeli ZPL naljepnice, uključujući osjetljive podatke, šalje se putem mreže.',
previewNoticePrivacyLink: 'Informacije o privatnosti Labelary',
previewNoticePrivacyLink: 'Labelary planovi i čuvanje podataka',
previewNoticeAcknowledge: 'Razumijem, nastavi',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/hu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const hu = {
previewProvider: 'Előnézet az api.labelary.com útján',
previewNoticeTitle: 'Adatvédelmi tájékoztató',
previewNoticeBody: 'Az előnézetet és a nyomtatást a külső api.labelary.com szolgáltatás készíti. A címke teljes ZPL-je, beleértve a bizalmas adatokat is, hálózaton keresztül kerül elküldésre.',
previewNoticePrivacyLink: 'Labelary adatvédelmi tájékoztató',
previewNoticePrivacyLink: 'Labelary csomagok és adatmegőrzés',
previewNoticeAcknowledge: 'Értem, folytatás',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const it = {
previewProvider: 'Anteprima tramite api.labelary.com',
previewNoticeTitle: 'Informativa sulla privacy',
previewNoticeBody: "L'anteprima e la stampa sono generate dal servizio esterno api.labelary.com. L'intero ZPL dell'etichetta, inclusi eventuali dati sensibili, viene trasmesso in rete.",
previewNoticePrivacyLink: 'Informativa sulla privacy di Labelary',
previewNoticePrivacyLink: 'Piani e conservazione dei dati di Labelary',
previewNoticeAcknowledge: 'Ho capito, continua',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const ja = {
previewProvider: 'api.labelary.com 経由のプレビュー',
previewNoticeTitle: 'プライバシーに関する通知',
previewNoticeBody: 'プレビューと印刷は外部サービス api.labelary.com で生成されます。機密データを含むラベル全体の ZPL がネットワーク経由で送信されます。',
previewNoticePrivacyLink: 'Labelary のプライバシー情報',
previewNoticePrivacyLink: 'Labelary プランとデータ保持',
previewNoticeAcknowledge: '了解しました、続行',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const ko = {
previewProvider: 'api.labelary.com을(를) 통한 미리 보기',
previewNoticeTitle: '개인정보 보호 고지',
previewNoticeBody: '미리 보기와 인쇄는 외부 서비스 api.labelary.com에서 생성됩니다. 민감한 데이터를 포함한 전체 라벨 ZPL이 네트워크를 통해 전송됩니다.',
previewNoticePrivacyLink: 'Labelary 개인정보 보호 정보',
previewNoticePrivacyLink: 'Labelary 요금제 및 데이터 보관',
previewNoticeAcknowledge: '이해했습니다, 계속',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/lt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const lt = {
previewProvider: 'Peržiūra per api.labelary.com',
previewNoticeTitle: 'Privatumo pranešimas',
previewNoticeBody: 'Peržiūrą ir spausdinimą generuoja išorinė paslauga api.labelary.com. Visa etiketės ZPL, įskaitant jautrius duomenis, siunčiama tinklu.',
previewNoticePrivacyLink: 'Labelary privatumo informacija',
previewNoticePrivacyLink: 'Labelary planai ir duomenų saugojimas',
previewNoticeAcknowledge: 'Supratau, tęsti',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/lv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const lv = {
previewProvider: 'Priekšskatījums caur api.labelary.com',
previewNoticeTitle: 'Paziņojums par privātumu',
previewNoticeBody: 'Priekšskatījumu un drukāšanu ģenerē ārējais pakalpojums api.labelary.com. Visa etiķetes ZPL, tostarp sensitīvi dati, tiek sūtīta tīklā.',
previewNoticePrivacyLink: 'Labelary privātuma informācija',
previewNoticePrivacyLink: 'Labelary plāni un datu glabāšana',
previewNoticeAcknowledge: 'Saprotu, turpināt',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const nl = {
previewProvider: 'Voorbeeld via api.labelary.com',
previewNoticeTitle: 'Privacymelding',
previewNoticeBody: 'De voorbeeldweergave en het afdrukken worden gegenereerd door de externe dienst api.labelary.com. De volledige ZPL van het label, inclusief gevoelige gegevens, wordt verzonden.',
previewNoticePrivacyLink: 'Privacy-informatie van Labelary',
previewNoticePrivacyLink: 'Labelary-abonnementen en gegevensbewaring',
previewNoticeAcknowledge: 'Begrepen, doorgaan',
},

Expand Down
2 changes: 1 addition & 1 deletion src/locales/no.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ const no = {
previewProvider: 'Forhåndsvisning via api.labelary.com',
previewNoticeTitle: 'Personvernmelding',
previewNoticeBody: 'Forhåndsvisning og utskrift genereres av den eksterne tjenesten api.labelary.com. Hele etikettens ZPL, inkludert sensitive data, sendes over nettverket.',
previewNoticePrivacyLink: 'Labelary personverninformasjon',
previewNoticePrivacyLink: 'Labelary-planer og datalagring',
previewNoticeAcknowledge: 'Forstått, fortsett',
},

Expand Down
Loading