{
  "dz.offline": "Works offline",
  "dz.fav.add": "Add to favorites",
  "dz.fav.remove": "Remove from favorites",
  "dz.fav.added": "Added to favorites",
  "dz.fav.removed": "Removed from favorites",
  "dz.fav.yours": "YOUR FAVORITES",
  "dz.fav.edit": "Edit",
  "dz.fav.done": "Done",
  "dz.fav.seeAll": "See all favorites",
  "dz.fav.editing": "Editing favorites",
  "dz.fav.lifted": "Lifted",
  "dz.fav.moved": "Moved {name} to position {n} of {m}",
  "dz.tools.title": "Tools",
  "dz.tools.sub": "Convert and edit — right on your device.",
  "dz.tools.mp3.name": "Video → MP3",
  "dz.tools.mp3.benefit": "Rip the audio from any video.",
  "dz.tools.trim.name": "Trim Video",
  "dz.tools.trim.benefit": "Cut to just the part you need.",
  "dz.tools.gif.name": "Video → GIF",
  "dz.tools.gif.benefit": "Make a looping GIF from a clip.",
  "dz.tools.audio.name": "Audio Converter",
  "dz.tools.audio.benefit": "MP3 or M4A, your choice.",
  "dz.tools.mute.name": "Mute / Extract Audio",
  "dz.tools.mute.benefit": "Silence a video or rip its sound.",
  "dz.hub.all": "All",
  "dz.hub.media": "Media",
  "dz.hub.docs": "Documents",
  "dz.hub.gen": "Generators",
  "dz.hub.calc": "Calculators",
  "dz.hub.saudi": "Saudi & Islamic",
  "dz.hub.daily": "Everyday",
  "dz.hub.videoAudio": "Video & Audio",
  "dz.hub.images": "Images",
  "dz.hub.pdf": "PDF",
  "dz.hub.generators": "Generators",
  "dz.hub.saudiBusiness": "Saudi & Business",
  "dz.hub.health": "Health",
  "dz.hub.finance": "Finance",
  "dz.hub.data": "Data & Files",
  "dz.hub.ai": "AI & Speech",
  "dz.hub.videoEditing": "Video editing",
  "dz.hub.emptyCat": "More tools coming to this category.",
  "dz.shell.drop": "Drop a file or tap to choose",
  "dz.shell.accepts": "Accepts {list}",
  "dz.shell.remove": "Remove file",
  "dz.shell.preparing": "Preparing engine… (first time only)",
  "dz.shell.another": "Convert another",
  "dz.shell.savedTo": "Saved to Downloads as {name}",
  "dz.shell.saveNoSpace": "Not enough free space to save this file.",
  "dz.shell.saveFailed": "The file could not be saved. Try again.",
  "dz.shell.sizeNote": "{from} → {to}",
  "dz.shell.failed": "That didn't work — the file may be unsupported.",
  "dz.shell.eta": "~{min} min left",
  "dz.mp3.verb": "Convert",
  "dz.mp3.quality": "Quality",
  "dz.mp3.high": "High",
  "dz.mp3.medium": "Medium",
  "dz.mp3.small": "Small",
  "dz.mp3.pageTitle": "Video → MP3 — Dzzz Tools",
  "dz.trim.verb": "Trim",
  "dz.trim.in": "Start",
  "dz.trim.out": "End",
  "dz.trim.keyframe": "Cuts snap to the nearest keyframe (fast, no re-encode).",
  "dz.trim.pageTitle": "Trim Video — Dzzz Tools",
  "dz.gif.verb": "Create GIF",
  "dz.gif.size": "Size",
  "dz.gif.fps": "FPS",
  "dz.gif.estimate": "~{size}",
  "dz.gif.tooBig": "~{size} — large",
  "dz.gif.cap": "GIFs are capped at 30 seconds.",
  "dz.gif.pageTitle": "Video → GIF — Dzzz Tools",
  "dz.audio.verb": "Convert",
  "dz.audio.format": "Format",
  "dz.audio.addMore": "Add more files",
  "dz.audio.pageTitle": "Audio Converter — Dzzz Tools",
  "dz.mute.verb": "Process",
  "dz.mute.mute": "Mute video",
  "dz.mute.extract": "Extract audio",
  "dz.mute.pageTitle": "Mute / Extract Audio — Dzzz Tools",
  "dz.consent.download": "Download engine (~{mb} MB · one time)",
  "dz.consent.helper": "Runs entirely on your device — nothing is uploaded.",
  "dz.consent.cellular": "You're on cellular data — this is a one-time {mb} MB download.",
  "dz.consent.progress": "{loaded} / {total} MB",
  "dz.consent.ready": "Engine ready",
  "dz.consent.error": "Download failed or timed out — check your connection and try again.",
  "dz.consent.progressLabel": "Downloading engine",
  "dz.consent.prepare": "Prepare engine (one time)",
  "dz.eng.needsNetwork": "Needs a one-time {size} MB download — connect to the internet to use this tool.",
  "dz.gen.exporting": "Exporting…",
  "dz.qr.name": "QR Code Generator",
  "dz.qr.benefit": "Make a QR for a link, WiFi, or contact.",
  "dz.qr.link": "Link",
  "dz.qr.text": "Text",
  "dz.qr.wifi": "WiFi",
  "dz.qr.vcard": "Contact",
  "dz.qr.ssid": "Network name",
  "dz.qr.password": "Password",
  "dz.qr.security": "Security",
  "dz.qr.name.f": "Name",
  "dz.qr.phone": "Phone",
  "dz.qr.email": "Email",
  "dz.qr.fg": "Foreground",
  "dz.qr.bg": "Background",
  "dz.qr.contrast": "Low contrast may not scan reliably.",
  "dz.qr.dots": "Dot style",
  "dz.qr.corners": "Corner style",
  "dz.qr.ec": "Error correction",
  "dz.qr.logo": "Center logo",
  "dz.qr.logoHint": "A logo raises error correction so it still scans.",
  "dz.qr.size": "Size",
  "dz.qr.advanced": "Advanced",
  "dz.qr.seo": "A QR code turns a link, WiFi login, or contact card into a square barcode any phone camera can read. Generate yours here — it never leaves your device.",
  "dz.gen.png": "PNG",
  "dz.gen.svg": "SVG",
  "dz.barcode.name": "Barcode Generator",
  "dz.barcode.benefit": "Retail-ready barcodes that scan.",
  "dz.barcode.format": "Format",
  "dz.barcode.value": "Value",
  "dz.barcode.checkDigit": "Check digit {d} added",
  "dz.barcode.encodedLabel": "Encoded:",
  "dz.barcode.text": "Show text",
  "dz.barcode.batch": "Batch mode",
  "dz.barcode.batchHint": "Generate for a product list — one value per line.",
  "dz.barcode.batchPlaceholder": "One value per line",
  "dz.barcode.zip": "Download all (ZIP)",
  "dz.barcode.invalid": "{n} invalid line(s) skipped",
  "dz.barcode.seo": "Create scannable retail barcodes — EAN-13, UPC-A, CODE128 and more — with automatic check digits. Batch a whole product list into a ZIP, all on your device.",
  "dz.barcode.err.empty": "Enter a value.",
  "dz.barcode.err.nondigit": "{label} accepts digits only.",
  "dz.barcode.err.length": "{label} needs {n} digits — the last is calculated.",
  "dz.barcode.err.code39": "CODE39 allows A–Z, 0–9 and - . $ / + % space.",
  "dz.barcode.err.code128": "CODE128 allows printable ASCII.",
  "dz.barcode.barWidth": "Bar width",
  "dz.barcode.height": "Height",
  "dz.barcode.pageTitle": "Barcode Generator — Dzzz Tools",
  "dz.qr.secNone": "None",
  "dz.qr.style.square": "Square",
  "dz.qr.style.rounded": "Rounded",
  "dz.qr.style.dots": "Dots",
  "dz.qr.corner.square": "Square",
  "dz.qr.corner.dot": "Dot",
  "dz.qr.corner.extraRounded": "Extra round",
  "dz.qr.removeLogo": "Remove logo",
  "dz.qr.pageTitle": "QR Code Generator — Dzzz Tools",
  "dz.qr.tel": "Phone number",
  "dz.qr.mail": "Email address",
  "dz.qr.geo": "Location pin",
  "dz.qr.ready": "Generated",
  "dz.qr.copyImg": "Copy image",
  "dz.qr.copiedImg": "Image copied.",
  "dz.qr.copyImgFail": "Copy failed — use Download PNG instead.",
  "dz.qr.alsoVideo": "Or download this video",
  "dz.qr.alsoVideoApp": "Open on dzzz.ai",
  "dz.qr.tooLong": "Too long to encode at this error correction level. Lower the level or shorten the value.",
  "dz.qr.arrivalTooLong": "That value is too long for a QR code, so nothing was filled in. Shorten it and try again.",
  "dz.qr.encodedLabel": "Encoded:",
  "dz.qr.descContact": "Contact card",
  "dz.qr.nothingYet": "Nothing to encode yet",
  "dz.merge.name": "Merge PDF",
  "dz.merge.benefit": "Combine PDFs into one, in your order.",
  "dz.merge.verb": "Merge PDFs",
  "dz.merge.drop": "Drop PDFs or tap to choose",
  "dz.merge.pages": "{n} pages",
  "dz.merge.range": "Pages",
  "dz.merge.rangePlaceholder": "all (e.g. 1-3, 7)",
  "dz.merge.rangeBad": "Check the page range.",
  "dz.merge.reorderHint": "Drag, or focus a row and press Space then arrows.",
  "dz.merge.tooBig": "That's over the 200 MB limit — try fewer or smaller files.",
  "dz.merge.addMore": "Add more PDFs",
  "dz.merge.remove": "Remove",
  "dz.merge.lifted": "{name} lifted. Use arrows to move, Space to drop.",
  "dz.merge.moved": "Moved to position {i} of {total}.",
  "dz.merge.seo": "Combine several PDFs into a single file — drag to set the order, pick page ranges, and merge. Everything runs on your device; your files never leave your device.",
  "dz.heic.name": "HEIC to JPG",
  "dz.heic.benefit": "Convert iPhone photos to JPG or PNG.",
  "dz.heic.verb": "Convert",
  "dz.heic.format": "Output",
  "dz.heic.jpg": "JPG",
  "dz.heic.png": "PNG",
  "dz.heic.quality": "Quality",
  "dz.heic.saveAll": "Save all (ZIP)",
  "dz.heic.seo": "HEIC is the high-efficiency photo format iPhones use since iOS 11 — smaller files, but many Android phones and websites can't open them. Convert your HEIC photos to JPG or PNG here, right on your device.",
  "dz.heic.pageTitle": "HEIC to JPG — Dzzz Tools",
  "dz.cimg.name": "Compress Images",
  "dz.cimg.benefit": "Shrink photos for web, email, or storage — right on your device.",
  "dz.cimg.drop": "Drop images or tap to choose",
  "dz.cimg.accept": "JPEG, PNG, WebP, AVIF, HEIC",
  "dz.cimg.addMore": "Add more images",
  "dz.cimg.quality": "Quality",
  "dz.cimg.format": "Output format",
  "dz.cimg.keep": "Keep",
  "dz.cimg.jpeg": "JPEG",
  "dz.cimg.webp": "WebP",
  "dz.cimg.avif": "AVIF",
  "dz.cimg.png": "PNG",
  "dz.cimg.maxDim": "Max dimension in px (optional)",
  "dz.cimg.verb": "Compress",
  "dz.cimg.optimal": "Already optimal",
  "dz.cimg.total": "Total",
  "dz.cimg.capCount": "Too many images — the limit is 100 per batch.",
  "dz.cimg.capHard": "Total size is too large — the limit is 200 MB per batch (this runs in your device's memory).",
  "dz.cimg.capSoft": "Large batch — this may take a moment and use significant memory.",
  "dz.cimg.avifSlow": "AVIF encoding is slow on phones — this may take a while.",
  "dz.cimg.seo": "Compress JPEG, PNG, WebP, AVIF and HEIC photos in bulk, right on your device. Pick a quality and output format, optionally resize to a max dimension, and download one file or all as a ZIP. Nothing is uploaded.",
  "dz.cimg.pageTitle": "Compress Images — Dzzz Tools",
  "dz.imgconv.name": "Image Converter",
  "dz.imgconv.benefit": "Convert photos between JPEG, PNG, WebP and AVIF — right on your device.",
  "dz.imgconv.verb": "Convert",
  "dz.imgconv.seo": "Convert JPEG, PNG, WebP, AVIF and HEIC photos to any of those formats, right on your device. Pick the output format first, then adjust quality or resize if you want, and download one file or all as a ZIP. Nothing is uploaded.",
  "dz.imgconv.pageTitle": "Image Converter — Dzzz Tools",
  "dz.merge.moveUp": "Move up",
  "dz.merge.moveDown": "Move down",
  "dz.merge.skipped": "{n} file(s) couldn't be read (maybe password-protected).",
  "dz.merge.pageTitle": "Merge PDF — Dzzz Tools",
  "dz.shell.zipAll": "Save all (ZIP)",
  "dz.compress.name": "Compress PDF",
  "dz.compress.benefit": "Shrink a PDF for email.",
  "dz.compress.verb": "Compress",
  "dz.compress.preset": "Quality",
  "dz.compress.screen": "Smallest",
  "dz.compress.screenSub": "Screen",
  "dz.compress.ebook": "Balanced",
  "dz.compress.ebookSub": "Ebook",
  "dz.compress.print": "High quality",
  "dz.compress.printSub": "Print",
  "dz.compress.already": "This PDF is already compressed.",
  "dz.compress.keep": "Keep original",
  "dz.compress.encrypted": "This PDF is password-protected — remove the password first.",
  "dz.compress.delta": "{from} → {to}",
  "dz.compress.drop": "Drop PDFs or tap to choose",
  "dz.compress.seo": "Shrink PDF file size for email and uploads using Ghostscript, right on your device. Pick a quality preset — nothing is uploaded to a server.",
  "dz.curves.name": "PDF to Curves",
  "dz.curves.benefit": "Outline fonts so PDFs print anywhere.",
  "dz.curves.verb": "Convert to curves",
  "dz.curves.drop": "Drop PDFs or tap to choose",
  "dz.curves.encrypted": "This PDF is password-protected — remove the password first.",
  "dz.curves.tooBig": "That's over the 100 MB limit.",
  "dz.curves.already": "No fonts in this PDF — it's already print-ready.",
  "dz.curves.keep": "Keep original",
  "dz.curves.verifyFail": "Verification failed — the converted file didn't match the original, so it wasn't delivered.",
  "dz.curves.proof": "{fonts} fonts → 0 · {pages} pages verified · {iou}% ink match",
  "dz.curves.warnForms": "Form fields were flattened — their appearance may change.",
  "dz.curves.warnAnnots": "Annotations were flattened — their appearance may change.",
  "dz.curves.engineHint": "~12 MB engine",
  "dz.curves.seo": "Convert every font in a PDF to vector outlines (curves / 转曲) for print shops, right on your device. The tool verifies the result pixel-by-pixel — nothing is uploaded to a server.",
  "dz.curves.pageTitle": "PDF to Curves — Dzzz Tools",
  "dz.bg.name": "Remove Background",
  "dz.bg.benefit": "Erase photo backgrounds, on your device.",
  "dz.bg.verb": "Remove background",
  "dz.bg.working": "Working… ~{s}s on this device",
  "dz.bg.bgLabel": "Background",
  "dz.bg.transparent": "Transparent",
  "dz.bg.color": "Color",
  "dz.bg.blur": "Blur original",
  "dz.bg.before": "Before",
  "dz.bg.after": "After",
  "dz.bg.afterPct": "{n}% after",
  "dz.bg.downscaled": "Large image downscaled to 4096px.",
  "dz.bg.capImages": "Only the first {n} images were added — remove one to add another.",
  "dz.bg.drop": "Drop an image or tap to choose",
  "dz.bg.seo": "Remove image backgrounds free and unlimited — an AI model runs entirely on your device, so your photos never leave it. No uploads, no credits, no account.",
  "dz.hub.tagAi": "AI",
  "dz.hub.tagNew": "New",
  "dz.hub.pageTitle": "Tools — Dzzz",
  "dz.hub.filterAria": "Filter by category",
  "dz.hub.viewAll": "View all {cat} tools",
  "dz.search.regionLabel": "Search tools",
  "dz.search.hubHint": "Search {n} tools in Arabic or English — by name, or by what they do.",
  "dz.bg.failed": "That didn't work — try another image.",
  "dz.compress.engineHint": "~12 MB engine",
  "dz.bg.engineHint": "~40 MB engine",
  "dz.bg.pageTitle": "Remove Background — Dzzz Tools",
  "dz.compress.tooBig": "That's over the 100 MB limit.",
  "dz.compress.pageTitle": "Compress PDF — Dzzz Tools",
  "dz.iban.name": "IBAN tools",
  "dz.iban.benefit": "Validate, build, and decode GCC IBANs — instantly",
  "dz.iban.tagNew": "New",
  "dz.iban.tabValidate": "Validate",
  "dz.iban.tabGenerate": "Generate",
  "dz.iban.tabDecode": "Decode",
  "dz.iban.paste": "Paste",
  "dz.iban.lockLine": "Checked on your device — the IBAN is never sent anywhere.",
  "dz.iban.idleHelper": "Paste an IBAN — we'll check it instantly. Spaces, «IBAN:» prefixes, and Arabic digits are handled.",
  "dz.iban.whatIs": "What is an IBAN?",
  "dz.iban.validTitle": "Valid IBAN format",
  "dz.iban.nonGuarantee": "Format is valid — this doesn't confirm the account exists. Only the bank can.",
  "dz.iban.copyGrouped": "Copy (grouped)",
  "dz.iban.copyCompact": "Copy compact",
  "dz.iban.qr": "QR",
  "dz.iban.copied": "Copied",
  "dz.iban.errLength": "Wrong length for this country",
  "dz.iban.errCountry": "Country code not recognized",
  "dz.iban.errChars": "Contains invalid characters",
  "dz.iban.errStructure": "Right length, but the structure is off",
  "dz.iban.errChecksum": "Checksum failed",
  "dz.iban.errChecksumD": "Likely a typo — double-check the digits.",
  "dz.iban.warnBank": "Valid math, unknown bank code",
  "dz.iban.warnBankD": "The checksum passes but this bank code isn't in our table — possibly a new or foreign-branch code.",
  "dz.iban.softNote": "Format not deeply checked for this country.",
  "dz.iban.segCountry": "Country",
  "dz.iban.segCheck": "Check digits",
  "dz.iban.segBank": "Bank",
  "dz.iban.segAccount": "Account number",
  "dz.iban.notInIban": "What's not in an IBAN",
  "dz.iban.notInIbanD": "Owner name, branch, and account status are not stored in an IBAN.",
  "dz.iban.ghostCountry": "Country — 2 letters",
  "dz.iban.ghostCheck": "Check digits — 2 digits",
  "dz.iban.ghostBank": "Bank code — 2 digits (SA)",
  "dz.iban.ghostAccount": "Account — 18 digits, zero-padded",
  "dz.iban.genBank": "Bank",
  "dz.iban.genBankSearch": "Search banks…",
  "dz.iban.genAccount": "Account number",
  "dz.iban.genCounter": "{n} / 18 digits",
  "dz.iban.legacyTag": "legacy — now {name}",
  "dz.iban.genDisclaimer": "Generated from your inputs — confirm with your bank before sharing.",
  "dz.iban.gccSoon": "Other GCC countries — coming soon",
  "dz.iban.kbdHint": "Ctrl/Cmd+V validates the next one — no refocus needed",
  "dz.iban.seo": "Validate, generate, and decode Saudi and GCC IBANs entirely on your device — MOD-97 checksum, bank identification, and QR export, with nothing sent to a server.",
  "dz.iban.pageTitle": "IBAN Validator & Generator — Dzzz Tools",
  "dz.iban.pageDesc": "Validate, generate and decode Saudi and Gulf IBANs on your device — MOD-97 checksum, bank identification and QR export, with nothing sent anywhere.",
  "dz.zatca.name": "ZATCA invoice QR",
  "dz.zatca.benefit": "Decode or build a Saudi e-invoice QR",
  "dz.zatca.tagNew": "New",
  "dz.zatca.decode": "Decode",
  "dz.zatca.generate": "Generate",
  "dz.zatca.paste": "Paste text",
  "dz.zatca.upload": "Upload",
  "dz.zatca.scan": "Scan",
  "dz.zatca.total": "Total (incl. VAT)",
  "dz.zatca.vatAmount": "VAT amount",
  "dz.zatca.seller": "Seller",
  "dz.zatca.vatNo": "VAT number",
  "dz.zatca.time": "Timestamp",
  "dz.zatca.crypto": "Cryptographic fields present ({n})",
  "dz.zatca.cryptoItem": "Tag {tag} · {size} bytes",
  "dz.zatca.vatSanity": "This isn't a 15-digit VAT number.",
  "dz.zatca.disclaimer": "Fields decoded — this doesn't verify the ZATCA stamp or registration.",
  "dz.zatca.copied": "Copied",
  "dz.zatca.pastePlaceholder": "Paste the Base64 QR text…",
  "dz.zatca.err1": "Not a QR code",
  "dz.zatca.err1d": "Try a sharper photo with the full code in frame.",
  "dz.zatca.err2": "QR is not a ZATCA e-invoice",
  "dz.zatca.err2d": "This looks like a regular QR, not a ZATCA invoice.",
  "dz.zatca.err3": "Truncated data",
  "dz.zatca.err3d": "Part of the code is unreadable — rescan or upload a clearer image.",
  "dz.zatca.hijriLabel": "Hijri",
  "dz.zatca.another": "Decode another",
  "dz.zatca.seo": "Decode and generate the Saudi ZATCA Phase-1 e-invoice QR (TLV/Base64) entirely on your device — read the seller, VAT number, timestamp, and totals, or build a QR from your invoice. Nothing is uploaded, and cryptographic stamps are never verified.",
  "dz.zatca.genSeller": "Seller name",
  "dz.zatca.genVat": "VAT number (15 digits)",
  "dz.zatca.genVatWarn": "VAT numbers are 15 digits and usually start & end with 3.",
  "dz.zatca.genTime": "Timestamp",
  "dz.zatca.genTotal": "Invoice total (incl. VAT)",
  "dz.zatca.genVatAmount": "VAT amount",
  "dz.zatca.auto15": "auto 15%",
  "dz.zatca.live": "Live preview",
  "dz.zatca.copyB64": "Copy Base64",
  "dz.zatca.genDisclaimer": "Generates the simplified-invoice QR (Phase-1 fields only). Full ZATCA compliance involves more than the QR — confirm your invoicing obligations.",
  "dz.zatca.cameraAim": "Point the camera at the invoice QR",
  "dz.zatca.cameraAuto": "Detects automatically — no button needed",
  "dz.zatca.torch": "Torch",
  "dz.zatca.uploadInstead": "Upload instead",
  "dz.zatca.cameraDenied": "Camera unavailable — upload a photo instead.",
  "dz.zatca.close": "Close",
  "dz.zatca.pageTitle": "ZATCA E-Invoice QR — Decode & Generate — Dzzz Tools",
  "dz.zatca.pageDesc": "Decode and generate Saudi e-invoice QR codes (Phase 1) on your device — read the seller, VAT number and amounts, or build a QR, with nothing uploaded.",
  "dz.hijri.name": "Hijri ↔ Gregorian",
  "dz.hijri.benefit": "Convert dates, ages, and differences",
  "dz.hijri.tagNew": "New",
  "dz.hijri.convert": "Convert",
  "dz.hijri.age": "Age",
  "dz.hijri.diff": "Difference",
  "dz.hijri.hijri": "Hijri — Umm al-Qura",
  "dz.hijri.greg": "Gregorian",
  "dz.hijri.day": "Day",
  "dz.hijri.month": "Month",
  "dz.hijri.year": "Year",
  "dz.hijri.swap": "Swap direction",
  "dz.hijri.disclaimer": "Uses the official Umm al-Qura calendar. Religious observances may differ based on moon sighting.",
  "dz.hijri.ageGreg": "Gregorian age",
  "dz.hijri.ageHijri": "Hijri age",
  "dz.hijri.years": "years",
  "dz.hijri.days": "days",
  "dz.hijri.nextGreg": "Next Gregorian birthday",
  "dz.hijri.nextHijri": "Next Hijri birthday",
  "dz.hijri.from": "From",
  "dz.hijri.to": "To",
  "dz.hijri.diffDays": "{n} days",
  "dz.hijri.outOfRange": "That date is outside the supported range (1900–2077).",
  "dz.hijri.copy": "Copy",
  "dz.hijri.copied": "Copied",
  "dz.hijri.seo": "Convert between Hijri (Umm al-Qura) and Gregorian dates, compute an age in both calendars, or the difference between two dates — instantly, on your device, using the official Saudi Umm al-Qura calendar.",
  "dz.hijri.pageTitle": "Hijri ↔ Gregorian Converter — Dzzz Tools",
  "dz.hijri.pageDesc": "Convert between Hijri and Gregorian dates, calculate age and the difference between two dates — entirely on your device, nothing is sent.",
  "dz.esb.name": "End-of-service award",
  "dz.esb.benefit": "See your award and the exact math",
  "dz.esb.tagNew": "New",
  "dz.esb.wage": "Monthly wage (SAR)",
  "dz.esb.wageHint": "Wage as defined by the law — typically basic + regular allowances; when unsure use gross.",
  "dz.esb.wageWord": "wage",
  "dz.esb.start": "Start date",
  "dz.esb.end": "End date",
  "dz.esb.reason": "Why is the job ending?",
  "dz.esb.rEmployer": "My employer ended my contract",
  "dz.esb.rExpired": "The fixed-term contract expired",
  "dz.esb.rResigned": "I resigned",
  "dz.esb.rForced": "I left for a reason the law recognizes / force majeure",
  "dz.esb.rMarriage": "Female worker leaving within 6 months of marriage or 3 of childbirth",
  "dz.esb.total": "Your award",
  "dz.esb.line1": "First 5 years — half a month per year",
  "dz.esb.line2": "After 5 years — a month per year",
  "dz.esb.line3": "Service length",
  "dz.esb.line4": "Entitlement multiplier",
  "dz.esb.full": "full entitlement",
  "dz.esb.yearsUnit": "{n} years",
  "dz.esb.hijriInput": "Enter dates as Hijri",
  "dz.esb.disclaimer": "An estimate under the Saudi Labor Law — your contract or a court may differ.",
  "dz.esb.notAdvice": "Informational — not legal advice.",
  "dz.esb.copySummary": "Copy summary (WhatsApp-ready)",
  "dz.esb.copied": "Copied",
  "dz.esb.seo": "Estimate your Saudi end-of-service award (mukafaʼat nihayat al-khidma) under Labor Law Articles 84 and 85 — with the exact breakdown: first-five-years portion, beyond-five portion, the partial year, and the resignation multiplier. Runs entirely on your device.",
  "dz.esb.pageTitle": "End-of-Service Gratuity Calculator — Dzzz Tools",
  "dz.esb.pageDesc": "Calculate end-of-service gratuity based on Saudi labor law — set the termination reason, salary and length of service.",
  "dz.zakat.name": "Zakat calculator",
  "dz.zakat.benefit": "Work out your zakat, with nisab",
  "dz.zakat.tagNew": "New",
  "dz.zakat.hint": "Most people only need Cash and Gold — empty sections count as zero.",
  "dz.zakat.cash": "Cash & bank accounts",
  "dz.zakat.gold": "Gold & silver",
  "dz.zakat.goldGrams": "Gold (grams)",
  "dz.zakat.goldPrice": "Gold price / gram",
  "dz.zakat.silverGrams": "Silver (grams)",
  "dz.zakat.silverPrice": "Silver price / gram",
  "dz.zakat.stocks": "Stocks & funds",
  "dz.zakat.inventory": "Business inventory",
  "dz.zakat.receivables": "Money owed to you",
  "dz.zakat.liabilities": "Debts due within the year (−)",
  "dz.zakat.fiqhJewelry": "Scholarly opinions differ — many include jewelry in use.",
  "dz.zakat.fiqhStocks": "Treatments vary; market value is a common default.",
  "dz.zakat.priceHint": "Check today's gold price",
  "dz.zakat.nisabBasis": "Nisab basis",
  "dz.zakat.goldBasis": "Gold (85g)",
  "dz.zakat.silverBasis": "Silver (595g)",
  "dz.zakat.nisab": "Nisab threshold",
  "dz.zakat.above": "Above nisab — zakat is due.",
  "dz.zakat.near": "Close to nisab — check again before the year completes.",
  "dz.zakat.below": "No zakat due this year.",
  "dz.zakat.running": "Total so far",
  "dz.zakat.net": "Base − liabilities",
  "dz.zakat.nisabCheck": "Nisab check",
  "dz.zakat.rate": "Year",
  "dz.zakat.lunar": "Lunar year (2.5%)",
  "dz.zakat.solar": "Solar year (2.577%)",
  "dz.zakat.due": "Zakat due",
  "dz.zakat.disclaimer": "Educational — consult a scholar for rulings.",
  "dz.zakat.notAdvice": "Informational — not a religious ruling.",
  "dz.zakat.seo": "Calculate your zakat on cash, gold, silver, stocks, and business assets, with the nisab threshold worked out live from today's gold or silver price. Choose a lunar (2.5%) or solar (2.577%) year. Educational, on-device, nothing uploaded.",
  "dz.zakat.pageTitle": "Zakat Calculator — Dzzz Tools",
  "dz.zakat.pageDesc": "Calculate the zakat due on your wealth — enter the amount and set the nisab criteria.",
  "dz.tafqit.name": "Tafqit — amount to words",
  "dz.tafqit.benefit": "Write any amount in Arabic words",
  "dz.tafqit.tagNew": "New",
  "dz.tafqit.amount": "Amount",
  "dz.tafqit.currency": "Currency",
  "dz.tafqit.wrapper": "«فقط … لا غير» wrapper",
  "dz.tafqit.ar": "عربي",
  "dz.tafqit.en": "English",
  "dz.tafqit.copy": "Copy",
  "dz.tafqit.copied": "Copied",
  "dz.tafqit.subunitNote": "3-decimal subunits handled (fils / baisa)",
  "dz.tafqit.persistNote": "Your currency is remembered — amounts never are.",
  "dz.tafqit.seo": "Convert any number to written-out Arabic words (tafqit) for cheques and invoices — correct grammar for gender, dual, and the «فقط … لا غير» wrapper — plus an English words tab. SAR, AED, KWD, BHD, QAR, OMR, USD, EUR with the right subunit names and decimals. On-device, instant.",
  "dz.tafqit.pageTitle": "Tafqit — Numbers to Arabic Words — Dzzz Tools",
  "dz.tafqit.pageDesc": "Convert numbers to Arabic words easily — currency, millions and billions supported, with no data sent.",
  "dz.atext.name": "Arabic text utilities",
  "dz.atext.benefit": "Numerals, diacritics, counter, normalize",
  "dz.atext.tagNew": "New",
  "dz.atext.numerals": "Numerals",
  "dz.atext.diacritics": "Diacritics",
  "dz.atext.counter": "Counter",
  "dz.atext.normalize": "Normalize",
  "dz.atext.input": "Text",
  "dz.atext.toWestern": "To Western (0-9)",
  "dz.atext.toArabic": "To Arabic-Indic (٠-٩)",
  "dz.atext.stripHarakat": "Strip diacritics",
  "dz.atext.stripTatweel": "Remove tatweel (ـ)",
  "dz.atext.chars": "characters",
  "dz.atext.words": "words",
  "dz.atext.segments": "SMS segments",
  "dz.atext.tweet": "X / 280",
  "dz.atext.encoding": "Arabic uses UCS-2 → 70 chars per SMS, 67 when linked.",
  "dz.atext.transforms": "Transforms — opt-in, live",
  "dz.atext.unifyAlef": "Unify alef forms (أ إ آ → ا)",
  "dz.atext.alefMaqsura": "ى → ي",
  "dz.atext.taMarbuta": "ة → ه",
  "dz.atext.normNote": "For search & matching — not for formal writing.",
  "dz.atext.copy": "Copy",
  "dz.atext.copied": "Copied",
  "dz.atext.seo": "Four Arabic text tools in one: convert between Arabic-Indic and Western numerals, strip tashkeel diacritics, count characters/words with an honest UCS-2 SMS segment counter and an X/280 weighted count, and normalize letter forms for search. All on your device.",
  "dz.atext.pageTitle": "Arabic Text Utilities — Dzzz Tools",
  "dz.atext.pageDesc": "Convert Arabic numerals and diacritics, count characters and tweets — Eastern Arabic-Indic numerals, tashkeel, message length and tweet counters.",
  "dz.shop.name": "Shopping helper",
  "dz.shop.benefit": "Discounts, price-per-unit, and best offer",
  "dz.shop.tagNew": "New",
  "dz.shop.discount": "Discount",
  "dz.shop.perUnit": "Price per unit",
  "dz.shop.offers": "Compare offers",
  "dz.shop.symbol": "Currency",
  "dz.shop.original": "Original price",
  "dz.shop.disc1": "Discount %",
  "dz.shop.disc2": "+ extra %",
  "dz.shop.youPay": "You pay",
  "dz.shop.youSave": "You save",
  "dz.shop.combined": "True combined discount",
  "dz.shop.whyNot": "Why not 70%?",
  "dz.shop.whyNotD": "The extra % applies to the already-discounted price, so stacked discounts multiply — they never add.",
  "dz.shop.reverse": "I know the final price — find my % off",
  "dz.shop.finalPrice": "Final price",
  "dz.shop.gotOff": "You got {n}% off",
  "dz.shop.vatToggle": "Prices include 15% VAT",
  "dz.shop.vatInfo": "VAT portion: {v}",
  "dz.shop.label": "Label",
  "dz.shop.price": "Price",
  "dz.shop.qty": "Quantity",
  "dz.shop.unit": "Unit",
  "dz.shop.g": "g",
  "dz.shop.kg": "kg",
  "dz.shop.ml": "ml",
  "dz.shop.l": "L",
  "dz.shop.pcs": "pieces",
  "dz.shop.per": "per {unit}",
  "dz.shop.addRow": "Add product (up to 6)",
  "dz.shop.unitMismatch": "Switch to matching units to compare",
  "dz.shop.unitVerdict": "{label} is {n}% cheaper per {unit}",
  "dz.shop.offerA": "Offer A",
  "dz.shop.offerB": "Offer B",
  "dz.shop.dealType": "Deal type",
  "dz.shop.dSimple": "Simple price",
  "dz.shop.dPct": "% off",
  "dz.shop.dBogo": "Buy X get Y free",
  "dz.shop.dBundle": "Bundle (\"3 for 25\")",
  "dz.shop.dSecond": "Second item % off",
  "dz.shop.perItem": "per item",
  "dz.shop.best": "Best value",
  "dz.shop.verdict": "{winner} is {n}% cheaper per item",
  "dz.shop.tie": "Same value — pick your preference",
  "dz.shop.buyX": "Buy",
  "dz.shop.getY": "Get free",
  "dz.shop.pctOff": "% off",
  "dz.shop.bundleQty": "Bundle quantity",
  "dz.shop.bundlePrice": "Bundle price",
  "dz.shop.seo": "A supermarket calculator for your phone: work out a real discount (including stacked \"50% + extra 20%\" offers — the true total is 60%, not 70%), compare price-per-kilogram or per-litre across products, and find which promo (buy-one-get-one, bundles, second-item-off) is actually cheaper per item. On your device, instant.",
  "dz.shop.relatedExtras": "Related: Shopping extras",
  "dz.shop.pageTitle": "Shopping Assistant — Discounts & Unit Price — Dzzz Tools",
  "dz.shop.pageDesc": "Calculate the best price across different offers — percentage discounts, combined offers, unit price and the cheaper buy, with no data sent.",
  "dz.shx.name": "Shopping Extras",
  "dz.shx.benefit": "Tip splitting, budgeting, VAT, and savings goals",
  "dz.shx.title": "Shopping extras",
  "dz.shx.currency": "Currency label",
  "dz.shx.tabTip": "Tip & split",
  "dz.shx.tabBudget": "Budget per item",
  "dz.shx.tabVat": "VAT add/remove",
  "dz.shx.tabSave": "Save-up goal",
  "dz.shx.bill": "Bill amount",
  "dz.shx.tipPct": "Tip %",
  "dz.shx.people": "Number of people",
  "dz.shx.total": "Total with tip",
  "dz.shx.perPerson": "Per person",
  "dz.shx.modeSplit": "Split budget",
  "dz.shx.modeHowMany": "How many can I buy",
  "dz.shx.totalBudget": "Total budget",
  "dz.shx.itemsCount": "Number of items",
  "dz.shx.perItem": "Budget per item",
  "dz.shx.unitPrice": "Price per item",
  "dz.shx.canBuy": "You can buy {n} items",
  "dz.shx.leftOver": "Left over",
  "dz.shx.dirAdd": "Add VAT",
  "dz.shx.dirRemove": "Remove VAT",
  "dz.shx.amount": "Amount",
  "dz.shx.vatPct": "VAT %",
  "dz.shx.net": "Net (before VAT)",
  "dz.shx.vatAmount": "VAT amount",
  "dz.shx.gross": "Gross (with VAT)",
  "dz.shx.target": "Target amount",
  "dz.shx.current": "Saved so far",
  "dz.shx.monthly": "Monthly saving",
  "dz.shx.monthsNeeded": "{n} months to your goal",
  "dz.shx.needMonthly": "Enter a monthly amount to see your timeline",
  "dz.shx.alreadyMet": "You've already reached your goal",
  "dz.shx.completionGreg": "Completion date (Gregorian)",
  "dz.shx.completionHijri": "Completion date (Hijri)",
  "dz.shx.relatedShopping": "Related: Shopping calculator",
  "dz.shx.disclaimer": "For planning purposes only — not financial advice.",
  "dz.shx.seo": "A shopping companion calculator: split a restaurant bill with tip across a group, work out a per-item budget or how many units you can afford, add or remove VAT, and see how many months it takes to reach a savings goal — with the completion date in Gregorian and Hijri. On your device, instant.",
  "dz.shx.pageTitle": "Shopping Extras — Tip Split, Budget, VAT & Savings Goal — Dzzz Tools",
  "dz.shx.pageDesc": "Split a bill with tip, plan a per-item budget, add or remove VAT, and see how many months to reach a savings goal — with the completion date in Gregorian and Hijri. Runs entirely on your device.",
  "dz.bmi.name": "BMI Calculator",
  "dz.bmi.benefit": "Body mass index with healthy-weight range",
  "dz.bmi.title": "BMI calculator",
  "dz.bmi.height": "Height",
  "dz.bmi.weight": "Weight",
  "dz.bmi.age": "Age (optional)",
  "dz.bmi.metric": "cm / kg",
  "dz.bmi.imperial": "ft-in / lb",
  "dz.bmi.ft": "ft",
  "dz.bmi.in": "in",
  "dz.bmi.result": "Your BMI",
  "dz.bmi.cat.under": "Underweight",
  "dz.bmi.cat.normal": "Normal range",
  "dz.bmi.cat.over": "Overweight",
  "dz.bmi.cat.obese": "Obese range",
  "dz.bmi.healthy": "Healthy weight for your height:",
  "dz.bmi.unitKg": "kg",
  "dz.bmi.unitLb": "lb",
  "dz.bmi.childNote": "Adult BMI categories don't apply to children and teens — growth is assessed with clinician-guided charts.",
  "dz.bmi.disclaimer": "BMI is a rough screening measure, not a diagnosis — talk to a clinician for personal advice.",
  "dz.bmi.seo": "Free BMI calculator with metric and imperial units, WHO categories and your healthy-weight range. Works entirely on your device.",
  "dz.bmi.relatedCal": "Related: Calorie calculator",
  "dz.bmi.pageTitle": "BMI Calculator — Dzzz Tools",
  "dz.cal.name": "Calorie Calculator",
  "dz.cal.tagNew": "New",
  "dz.cal.benefit": "BMR, TDEE, meal totals and a calm goal planner",
  "dz.cal.title": "Calorie calculator",
  "dz.cal.tabBmr": "BMR/TDEE",
  "dz.cal.tabMeal": "Meal totaler",
  "dz.cal.tabGoal": "Goal + macros",
  "dz.cal.metric": "cm / kg",
  "dz.cal.imperial": "ft-in / lb",
  "dz.cal.age": "Age",
  "dz.cal.sexLabel": "Sex",
  "dz.cal.sexMale": "Male",
  "dz.cal.sexFemale": "Female",
  "dz.cal.height": "Height",
  "dz.cal.weight": "Weight",
  "dz.cal.ft": "ft",
  "dz.cal.in": "in",
  "dz.cal.weightLb": "Weight (lb)",
  "dz.cal.activityLabel": "Activity level",
  "dz.cal.act.sedentary": "Sedentary (little or no exercise)",
  "dz.cal.act.light": "Light activity (1–3 days/week)",
  "dz.cal.act.moderate": "Moderate activity (3–5 days/week)",
  "dz.cal.act.active": "Active (6–7 days/week)",
  "dz.cal.act.veryActive": "Very active (physical job or training twice a day)",
  "dz.cal.bmrLabel": "BMR",
  "dz.cal.tdeeLabel": "TDEE",
  "dz.cal.kcalDay": "kcal/day",
  "dz.cal.kcalUnit": "kcal",
  "dz.cal.meaning": "BMR is the energy your body uses at rest; TDEE adds your activity level on top of that.",
  "dz.cal.childNote": "These calorie formulas are built for adults — energy needs for children and teens should be assessed with a pediatrician or dietitian.",
  "dz.cal.relatedBmi": "Related: BMI calculator",
  "dz.cal.ingName": "Ingredient",
  "dz.cal.ingAmount": "Amount",
  "dz.cal.ingKcal": "kcal",
  "dz.cal.removeRow": "Remove ingredient",
  "dz.cal.addIngredient": "Add ingredient",
  "dz.cal.mealTotal": "Meal total",
  "dz.cal.servings": "Servings",
  "dz.cal.perServing": "Per serving",
  "dz.cal.mealMacros": "Protein {p}g · Carbs {c}g · Fat {f}g",
  "dz.cal.ingP": "P (g)",
  "dz.cal.ingC": "C (g)",
  "dz.cal.ingF": "F (g)",
  "dz.cal.deficitLabel": "Daily calorie adjustment",
  "dz.cal.def.gentle": "Gentle",
  "dz.cal.def.moderate": "Moderate",
  "dz.cal.def.steep": "Steep",
  "dz.cal.deficit": "Deficit",
  "dz.cal.surplus": "Surplus",
  "dz.cal.cautionDeficit": "Below -750 kcal/day is steeper than most guidance. It still works here — just know sustained large deficits are best planned with a professional.",
  "dz.cal.dailyTarget": "Daily target",
  "dz.cal.minSafeNote": "This target is under 1,200 kcal/day, which is hard for most adults to meet with balanced nutrition. Consider a smaller deficit, or check with a professional.",
  "dz.cal.needBmr": "Fill in the BMR/TDEE tab to see your personalized daily target.",
  "dz.cal.presetBalanced": "Balanced 30/40/30",
  "dz.cal.presetCustom": "Custom",
  "dz.cal.macroProtein": "Protein",
  "dz.cal.macroCarbs": "Carbs",
  "dz.cal.macroFat": "Fat",
  "dz.cal.customTotal": "Total {n}%",
  "dz.cal.disclaimer": "Estimates, not prescriptions — for medical or dietary decisions, see a doctor or dietitian.",
  "dz.cal.seo": "Free calorie calculator — BMR, TDEE by activity level, a meal totaler, and a calm goal-and-macros planner. Works entirely on your device.",
  "dz.cal.pageTitle": "Calorie Calculator — Dzzz Tools",
  "dz.loan.name": "Loan & Interest Calculator",
  "dz.loan.benefit": "Payments, compound growth, and flat-rate truth",
  "dz.loan.title": "Loan & interest calculator",
  "dz.loan.tabLoan": "Loan",
  "dz.loan.tabSavings": "Savings",
  "dz.loan.tabFlat": "Flat → APR",
  "dz.loan.principal": "Principal",
  "dz.loan.rate": "Annual rate %",
  "dz.loan.flatRate": "Flat rate %",
  "dz.loan.termYears": "Term (years)",
  "dz.loan.contribution": "Monthly contribution",
  "dz.loan.compounding": "Compounding",
  "dz.loan.compMonthly": "Monthly",
  "dz.loan.compQuarterly": "Quarterly",
  "dz.loan.compYearly": "Yearly",
  "dz.loan.currency": "Currency label",
  "dz.loan.payment": "Monthly payment",
  "dz.loan.totalInterest": "Total interest",
  "dz.loan.totalPaid": "Total paid",
  "dz.loan.schedule": "Amortization schedule",
  "dz.loan.month": "Month",
  "dz.loan.colPayment": "Payment",
  "dz.loan.colPrincipal": "Principal",
  "dz.loan.colInterest": "Interest",
  "dz.loan.colBalance": "Balance",
  "dz.loan.futureValue": "Future value",
  "dz.loan.contributed": "Total contributed",
  "dz.loan.growth": "Growth",
  "dz.loan.aprResult": "Approximate reducing-balance APR",
  "dz.loan.flatNote": "Banks advertise flat rates; the true cost is higher.",
  "dz.loan.disclaimer": "For information only — not financial advice.",
  "dz.loan.seo": "Free loan, savings and flat-to-APR calculator with amortization schedule. Currency-agnostic, runs entirely on your device.",
  "dz.loan.pageTitle": "Loan & Interest Calculator — Dzzz Tools",
  "dz.fxc.name": "Currency Converter",
  "dz.fxc.benefit": "Live rates for major and GCC currencies",
  "dz.fxc.title": "Currency converter",
  "dz.fxc.amount": "Amount",
  "dz.fxc.from": "From",
  "dz.fxc.to": "To",
  "dz.fxc.swap": "Swap currencies",
  "dz.fxc.asOf": "Rates as of {time} · source: {source}",
  "dz.fxc.stale": "Rates may be outdated (as of {time}) — could not fetch fresh rates.",
  "dz.fxc.unavailable": "Rates unavailable — connect to the internet once to load them.",
  "dz.fxc.othersTitle": "1 {code} equals",
  "dz.fxc.note": "Indicative rates — banks and exchanges apply their own rates and fees.",
  "dz.fxc.seo": "Free currency converter for SAR, AED, KWD, USD, EUR and more with indicative live rates.",
  "dz.fxc.pageTitle": "Currency Converter — Dzzz Tools",
  "dz.myip.name": "What Is My IP",
  "dz.myip.benefit": "Your public IP, location and device info",
  "dz.myip.title": "What is my IP?",
  "dz.myip.ip4": "Public IP (IPv4)",
  "dz.myip.ip6": "Public IP (IPv6)",
  "dz.myip.city": "City",
  "dz.myip.country": "Country",
  "dz.myip.isp": "Provider (ISP)",
  "dz.myip.browser": "Browser",
  "dz.myip.os": "Operating system",
  "dz.myip.screen": "Screen",
  "dz.myip.timezone": "Timezone",
  "dz.myip.languages": "Languages",
  "dz.myip.copy": "Copy",
  "dz.myip.copied": "Copied",
  "dz.myip.fetchError": "Could not reach the lookup service — device info below is still available.",
  "dz.myip.localTitle": "Read locally on your device",
  "dz.myip.explainTitle": "What is this?",
  "dz.myip.explain": "Your public IP is the address websites see when you browse. It reveals your approximate location and internet provider — useful for debugging connections, VPN checks, and understanding your privacy. Looking it up means your address reaches our server and the geolocation provider that returns the city; our own code keeps no record of it, but our host's request logs retain it for 30 days.",
  "dz.myip.seo": "See your public IP address, approximate location, ISP, and browser details. The lookup sends your address to our server and a geolocation provider, and request logs retain it for 30 days.",
  "dz.myip.pageTitle": "What Is My IP — Dzzz Tools",
  "dz.i2p.name": "Images to PDF",
  "dz.i2p.benefit": "Combine photos into one PDF, in your order",
  "dz.i2p.title": "Images → PDF",
  "dz.i2p.pick": "Choose images",
  "dz.i2p.accept": "JPG, PNG, WebP, HEIC",
  "dz.i2p.pageSize": "Page size",
  "dz.i2p.fit": "Fit to image",
  "dz.i2p.orientation": "Orientation",
  "dz.i2p.auto": "Auto",
  "dz.i2p.portrait": "Portrait",
  "dz.i2p.landscape": "Landscape",
  "dz.i2p.margin": "Margin",
  "dz.i2p.marginNone": "None",
  "dz.i2p.marginNormal": "10 mm",
  "dz.i2p.make": "Make PDF",
  "dz.i2p.working": "Building PDF…",
  "dz.i2p.save": "Save PDF",
  "dz.i2p.capImages": "Maximum 50 images.",
  "dz.i2p.capSize": "Total size limit is 200 MB.",
  "dz.i2p.error": "Couldn't process one of the images.",
  "dz.i2p.seo": "Convert JPG, PNG, WebP and HEIC photos into a single PDF. Reorder pages, pick page size and margins. Runs entirely on your device.",
  "dz.i2p.pageTitle": "Images to PDF — Dzzz Tools",
  "dz.xlc.name": "Excel / CSV Converter",
  "dz.xlc.benefit": "CSV, XLSX, JSON and TSV — both directions",
  "dz.xlc.title": "Excel / CSV converter",
  "dz.xlc.pick": "Choose a file",
  "dz.xlc.accept": "CSV, TSV, XLSX, JSON",
  "dz.xlc.badFormat": "Unsupported file type — use CSV, TSV, XLSX or JSON.",
  "dz.xlc.capSize": "File is too large — the limit is 20 MB (conversion runs in your device's memory).",
  "dz.xlc.sheets": "Sheets to convert",
  "dz.xlc.target": "Convert to",
  "dz.xlc.preview": "Preview (first rows)",
  "dz.xlc.advanced": "Advanced",
  "dz.xlc.delimiter": "Delimiter",
  "dz.xlc.comma": "Comma",
  "dz.xlc.semicolon": "Semicolon",
  "dz.xlc.tabChar": "Tab",
  "dz.xlc.encoding": "Input encoding",
  "dz.xlc.export": "Convert & save",
  "dz.xlc.error": "Couldn't read this file.",
  "dz.xlc.seo": "Convert between CSV, Excel (XLSX), JSON and TSV on your device. Arabic-safe encoding with BOM. Nothing is uploaded.",
  "dz.focal.label": "Focal point",
  "dz.focal.pos": "{x}% across, {y}% down",
  "dz.vratio.name": "Aspect Ratio for Social",
  "dz.vratio.benefit": "9:16, 1:1, 4:5 — fit or fill",
  "dz.vratio.title": "Aspect Ratio for Social",
  "dz.vratio.seo": "Reframe your video to 9:16, 1:1 or 4:5 for social media — fit with a blurred or solid background, or fill with a draggable focal point. Works entirely on your device.",
  "dz.vratio.preset916": "9:16",
  "dz.vratio.preset11": "1:1",
  "dz.vratio.preset45": "4:5",
  "dz.vratio.preset169": "16:9",
  "dz.vratio.presetCustom": "Custom",
  "dz.vratio.customW": "Width",
  "dz.vratio.customH": "Height",
  "dz.vratio.modeFit": "Fit",
  "dz.vratio.modeFill": "Fill",
  "dz.vratio.bgBlur": "Blur",
  "dz.vratio.bgColor": "Color",
  "dz.vratio.focalHint": "Drag the dot to keep the important part in frame",
  "dz.vratio.slowNote": "This re-encodes your video — it can take several minutes, and is much faster on a computer.",
  "dz.vratio.capNote": "Video is longer than {min} minutes — trim it first, or process on a computer.",
  "dz.vratio.error": "Couldn't read this video.",
  "dz.vratio.pageTitle": "Aspect Ratio for Social — Dzzz Tools",
  "dz.wmark.name": "Video Watermark",
  "dz.wmark.benefit": "Brand your videos with your logo",
  "dz.wmark.title": "Video Watermark",
  "dz.wmark.seo": "Add your logo to your videos as a watermark — pick the position, size and opacity, or tile it across the frame to protect your own content. Works entirely on your device.",
  "dz.wmark.pickLogo": "Logo image",
  "dz.wmark.logoHint": "PNG with transparency works best",
  "dz.wmark.position": "Position",
  "dz.wmark.size": "Size",
  "dz.wmark.opacity": "Opacity",
  "dz.wmark.margin": "Margin (px)",
  "dz.wmark.tiled": "Tile across the frame",
  "dz.wmark.slowNote": "This re-encodes your video — it can take several minutes, and is much faster on a computer.",
  "dz.wmark.capNote": "Video is longer than {min} minutes — trim it first, or process on a computer.",
  "dz.wmark.error": "Add a logo image first.",
  "dz.wmark.pageTitle": "Video Watermark — Dzzz Tools",
  "dz.vframe.name": "Video & Photo Frame",
  "dz.vframe.benefit": "Borders and frames for videos and photos",
  "dz.vframe.title": "Video & Photo Frame",
  "dz.vframe.seo": "Add a border or frame to your videos and photos — solid color or a two-color gradient, rounded corners, and quick presets like polaroid and caption space. Photos are framed instantly; videos process on your device.",
  "dz.vframe.thickness": "Border thickness (px)",
  "dz.vframe.color": "Border color",
  "dz.vframe.gradient": "Two-color gradient",
  "dz.vframe.radius": "Corner radius (px)",
  "dz.vframe.presetNone": "None",
  "dz.vframe.presetPolaroid": "Polaroid",
  "dz.vframe.presetCaption": "Caption space",
  "dz.vframe.presetSimple": "Gradient and rounded corners use an even border — the preset shape applies to plain borders only.",
  "dz.vframe.slowNote": "This re-encodes your video — it can take several minutes, and is much faster on a computer.",
  "dz.vframe.capNote": "Video is longer than {min} minutes — trim it first, or process on a computer.",
  "dz.vframe.fastNote": "Photos are framed instantly on your device.",
  "dz.vframe.pageTitle": "Video & Photo Frame — Dzzz Tools",
  "dz.vaudio.name": "Add Music / Voiceover",
  "dz.vaudio.benefit": "Music, narration, or both — without re-encoding",
  "dz.vaudio.title": "Add Music / Voiceover",
  "dz.vaudio.seo": "Add background music, replace a video's audio, or record a voiceover right on your device — start offset, loop-to-fit, and volume mixing included. Your video is never re-encoded, so this stays fast.",
  "dz.vaudio.modeReplace": "Replace",
  "dz.vaudio.modeMix": "Mix",
  "dz.vaudio.modeVoice": "Voiceover",
  "dz.vaudio.pickAudio": "Audio file",
  "dz.vaudio.record": "Record",
  "dz.vaudio.stop": "Stop",
  "dz.vaudio.rerecord": "Re-record",
  "dz.vaudio.micDenied": "Microphone unavailable — upload an audio file instead.",
  "dz.vaudio.offset": "Start offset (seconds)",
  "dz.vaudio.loop": "Loop audio to fill the video",
  "dz.vaudio.videoVol": "Video volume",
  "dz.vaudio.musicVol": "Music volume",
  "dz.vaudio.fastNote": "Your video is not re-encoded — this is fast.",
  "dz.vaudio.error": "Add or record an audio track first.",
  "dz.vaudio.mixNoAudio": "Couldn't mix — this video may have no audio track. Try Replace mode instead.",
  "dz.vaudio.pageTitle": "Add Music / Voiceover — Dzzz Tools",
  "dz.vsize.name": "Compress Video",
  "dz.vsize.benefit": "Hit a target size — 25 MB email, 16 MB WhatsApp",
  "dz.vsize.title": "Compress Video",
  "dz.vsize.seo": "Shrink a video to hit a target size — 25 MB for email, 16 MB for WhatsApp, or a custom limit — or pick a quality preset. Two-pass encoding never ships a file larger than your original. Works entirely on your device.",
  "dz.vsize.presetEmail": "Email (25 MB)",
  "dz.vsize.presetWhatsapp": "WhatsApp (16 MB)",
  "dz.vsize.presetCustom": "Custom MB",
  "dz.vsize.presetQuality": "Quality",
  "dz.vsize.customMb": "Target size (MB)",
  "dz.vsize.qLow": "Low",
  "dz.vsize.qMed": "Medium",
  "dz.vsize.qHigh": "High",
  "dz.vsize.slowNote": "Video compression re-encodes your file — this can take several minutes, and is much faster on a computer.",
  "dz.vsize.capNote": "Video is longer than {min} minutes — trim it first, or process on a computer.",
  "dz.vsize.tooSmall": "That target is too small for this video's length.",
  "dz.vsize.already": "Already smaller than the target — keeping your original.",
  "dz.vsize.scaleNote": "Size presets also scale down to 720p.",
  "dz.vsize.fpsNote": "Compression caps the frame rate at 30 fps.",
  "dz.vsize.error": "Couldn't compress this video.",
  "dz.vsize.pageTitle": "Compress Video — Dzzz Tools",
  "dz.reel.name": "Reel Maker",
  "dz.reel.benefit": "Trim, crop to 9:16, add music and a caption — one export",
  "dz.reel.title": "Reel Maker",
  "dz.reel.seo": "Turn any clip into a ready-to-post reel — trim to the best part, crop to 9:16, add background music and a caption that shapes Arabic and English correctly, all in a single export. Built for creators and sellers making product reels, entirely on your device.",
  "dz.reel.stepTrim": "1. Trim",
  "dz.reel.stepCrop": "2. Crop to 9:16",
  "dz.reel.stepMusic": "3. Music",
  "dz.reel.stepCaption": "4. Caption",
  "dz.reel.cropHint": "The output is always cropped to 9:16 (1080×1920). Turn this on to choose the focal point on the preview — otherwise the center is used.",
  "dz.reel.captionText": "Caption text",
  "dz.reel.captionSize": "Size",
  "dz.reel.sizeS": "S",
  "dz.reel.sizeM": "M",
  "dz.reel.sizeL": "L",
  "dz.reel.captionColor": "Color",
  "dz.reel.posTop": "Top",
  "dz.reel.posMiddle": "Middle",
  "dz.reel.posBottom": "Bottom",
  "dz.reel.clipCap": "Clips are capped at 60 seconds.",
  "dz.reel.slowNote": "This re-encodes your video — it can take several minutes, and is much faster on a computer.",
  "dz.reel.error": "Video is longer than {min} minutes — trim it first, or process on a computer.",
  "dz.reel.pageTitle": "Reel Maker — Dzzz Tools",
  "dz.gold.name": "Gold Calculator",
  "dz.gold.tagNew": "New",
  "dz.gold.title": "Gold calculator",
  "dz.gold.benefit": "Live gold price with making charge & VAT",
  "dz.gold.priceLabel": "Gram price ({karat})",
  "dz.gold.updated": "updated {time}",
  "dz.gold.agoMins": "{n} min ago",
  "dz.gold.agoHours": "{n}h ago",
  "dz.gold.agoDays": "{n}d ago",
  "dz.gold.staleNote": "Price may be outdated (last update {time})",
  "dz.gold.refresh": "Refresh",
  "dz.gold.edit": "Edit",
  "dz.gold.manualLabel": "Dealer's gram price (manual)",
  "dz.gold.manualHint": "Overrides the live price until cleared.",
  "dz.gold.manualNote": "manual price",
  "dz.gold.apply": "Apply",
  "dz.gold.cancel": "Cancel",
  "dz.gold.clear": "Clear",
  "dz.gold.unavailable": "Live price unavailable — enter a price manually.",
  "dz.gold.loading": "Loading gold price…",
  "dz.gold.karatLabel": "Karat",
  "dz.gold.weight": "Weight (grams)",
  "dz.gold.mcModeLabel": "Making charge mode",
  "dz.gold.mcGram": "Per gram",
  "dz.gold.mcPercent": "Percentage",
  "dz.gold.mcPiece": "Per piece",
  "dz.gold.mcGramInputLabel": "Making charge / gram",
  "dz.gold.mcGramHint": "Typical jewelry making charge: 20–60 SAR/g",
  "dz.gold.mcPercentInputLabel": "Making charge %",
  "dz.gold.mcPercentHint": "Typical: 6–12% of the raw gold value",
  "dz.gold.mcPieceInputLabel": "Making charge (fixed amount)",
  "dz.gold.mcPieceHint": "One fixed charge for the whole piece",
  "dz.gold.profitLabel": "Dealer profit / gram (optional)",
  "dz.gold.vatToggle": "Add VAT (15%)",
  "dz.gold.bullionToggle": "Bar / investment gold (VAT-exempt)",
  "dz.gold.bullionInfo": "Investment-grade bullion (99%+ purity) is VAT-exempt in KSA; jewelry is taxed at 15%.",
  "dz.gold.rawLabel": "Raw gold value",
  "dz.gold.making": "Making charge",
  "dz.gold.makingFixed": "fixed",
  "dz.gold.profit": "Dealer profit",
  "dz.gold.subtotal": "Subtotal",
  "dz.gold.vat": "VAT 15%",
  "dz.gold.exempt": "Exempt",
  "dz.gold.total": "Final total",
  "dz.gold.currency": "SAR",
  "dz.gold.disclaimer": "Indicative price — dealers set their own making charges and margins. Not investment advice.",
  "dz.gold.copySummary": "Copy summary (ready for WhatsApp)",
  "dz.gold.copied": "Copied",
  "dz.gold.summaryKarat": "Karat",
  "dz.gold.summaryWeight": "Weight",
  "dz.gold.seo": "Gold price calculator with making charge & VAT — enter the gold weight, choose the karat (18/21/22/24), and set the making charge per gram, as a percentage, or as a fixed amount for the piece, with an optional 15% VAT. The price is fetched live and can also be entered manually from your dealer, and nothing is ever uploaded.",
  "dz.gold.pageTitle": "Gold Price Calculator — Dzzz Tools",
  "dz.gold.pageDesc": "Calculate gold price with making charges and VAT — live price per karat with a full breakdown.",
  "dz.tr.name": "Transcribe",
  "dz.tr.benefit": "Turn audio or video into text — on your device.",
  "dz.tr.tagNew": "New",
  "dz.tr.engineHint": "~80 MB engine",
  "dz.tr.seo": "Transcribe audio and video into text for free, entirely on your device. Arabic (تفريغ صوتي عربي) is the tool's focus and is fully supported, but clear, close-to-standard speech transcribes far better than dialect — expect to correct a dialectal or noisy recording. Upload a file or record from your microphone, get timestamped captions you can edit right on your device, then export as TXT, SRT, or VTT. No uploads, no account — and it keeps working offline once the model has downloaded once.",
  "dz.tr.uploadTab": "Upload file",
  "dz.tr.recordTab": "Record",
  "dz.tr.drop": "Drop an audio or video file, or tap to choose",
  "dz.tr.micDenied": "Microphone access was denied — upload a file instead.",
  "dz.tr.record": "Record",
  "dz.tr.stop": "Stop",
  "dz.tr.rerecord": "Re-record",
  "dz.tr.useRecording": "Use this recording",
  "dz.tr.model": "Model",
  "dz.tr.modelBase": "Base (balanced)",
  "dz.tr.modelTiny": "Tiny (faster, less accurate)",
  "dz.tr.modelSmall": "Small (best Arabic)",
  "dz.tr.modelSmallNote": "Noticeably better with Arabic, but a 249 MB download and much slower on phones. Best on a computer.",
  "dz.tr.language": "Language",
  "dz.tr.languageHint": "Pick the audio's language for the best accuracy.",
  "dz.tr.arabicNote": "Arabic accuracy depends a lot on the audio: clear, close-to-standard speech transcribes reasonably well, while dialect, background noise or phone-quality audio come out much rougher. Expect to correct the result.",
  "dz.tr.transliterated": "The result came back in Latin letters rather than Arabic script. That usually means the audio was hard to make out — try the Small model, or check that the language is set correctly.",
  "dz.tr.estimate": "A {d} recording takes roughly {t} to process on this device. It all runs here, so keep this tab open.",
  "dz.tr.estimateRate": "Roughly {s}s of processing for every minute of audio on this device. It all runs here, so keep this tab open.",
  "dz.tr.verb": "Transcribe",
  "dz.tr.working": "Working — roughly {s}s of processing per minute of audio",
  "dz.tr.elapsed": "Elapsed {t}",
  "dz.tr.elapsedSlow": "Elapsed {t} · slower here because this device runs the compatibility engine",
  "dz.tr.failed": "That didn't work — try another file.",
  "dz.tr.play": "Play",
  "dz.tr.pause": "Pause",
  "dz.tr.editLine": "Edit this line",
  "dz.tr.exportTxt": "TXT",
  "dz.tr.exportSrt": "SRT",
  "dz.tr.exportVtt": "VTT",
  "dz.tr.copy": "Copy transcript",
  "dz.tr.copied": "Copied",
  "dz.tr.another": "Transcribe another",
  "dz.tr.pageTitle": "Free Audio & Video Transcription — Dzzz Tools",
  "dz.sub.name": "Translate Subtitles",
  "dz.sub.benefit": "Translate video subtitles between English and Arabic — on your device.",
  "dz.sub.engineHint": "~120 MB engine",
  "dz.sub.seo": "Translate video subtitles between English and Arabic, entirely on your device. Transcribe a video or upload an existing SRT/VTT file, translate each caption while keeping the original timing, and export Arabic-only or bilingual subtitles you can edit right on your device. No uploads, no account.",
  "dz.sub.videoTab": "From video",
  "dz.sub.subtitleTab": "Upload SRT/VTT",
  "dz.sub.dropVideo": "Drop a video file, or tap to choose",
  "dz.sub.dropSubtitle": "Drop an SRT or VTT file, or tap to choose",
  "dz.sub.parseError": "Couldn't read that subtitle file — check it's a valid SRT or VTT.",
  "dz.sub.direction": "Direction",
  "dz.sub.dirEnAr": "English → Arabic",
  "dz.sub.dirArEn": "Arabic → English",
  "dz.sub.outputMode": "Output",
  "dz.sub.outTranslated": "Translation only",
  "dz.sub.outBilingual": "Bilingual (original + translation)",
  "dz.sub.mtNote": "Machine translation quality varies — review and edit before exporting.",
  "dz.sub.verb": "Translate",
  "dz.sub.working": "— ~{s}s on this device",
  "dz.sub.workingTranscribe": "Transcribing…",
  "dz.sub.workingTranslate": "Translating…",
  "dz.sub.elapsed": "Elapsed {t}",
  "dz.sub.elapsedSlow": "Elapsed {t} · slower here because this device runs the compatibility engine",
  "dz.sub.failed": "That didn't work — try another file.",
  "dz.sub.editLine": "Edit this cue",
  "dz.sub.exportSrt": "SRT",
  "dz.sub.exportVtt": "VTT",
  "dz.sub.another": "Translate another",
  "dz.sub.videoOutput": "Video with subtitles",
  "dz.sub.attachSub": "Attach as subtitle track (.mkv)",
  "dz.sub.attaching": "Attaching…",
  "dz.sub.burnIn": "Burn into video (experimental)",
  "dz.sub.burning": "Burning in…",
  "dz.sub.burnNote": "Experimental: renders Arabic captions directly into the picture using a bundled font. Verify the shaping looks right before relying on it.",
  "dz.sub.postFailed": "Couldn't produce the subtitled file — try the soft-subtitle option, or a different video.",
  "dz.sub.pageTitle": "EN↔AR Subtitle Translation — Dzzz Tools",
  "dz.ms.name": "Meeting Summary",
  "dz.ms.engineHint": "~80 MB engine",
  "dz.ms.drop": "Drop a meeting recording (audio or video), or tap to choose",
  "dz.ms.language": "Language",
  "dz.ms.languageHint": "Pick the recording's language for the best transcription accuracy.",
  "dz.ms.verb": "Transcribe",
  "dz.ms.transcriptLock": "Transcription: on-device",
  "dz.ms.transcriptLabel": "Transcript",
  "dz.ms.editTranscriptHint": "Review or edit the transcript — this is also your chance to remove anything sensitive before sending it anywhere.",
  "dz.ms.workingTranscribe": "Transcribing…",
  "dz.ms.working": "— ~{s}s on this device",
  "dz.ms.elapsed": "Elapsed {t}",
  "dz.ms.elapsedSlow": "Elapsed {t} · slower here because this device runs the compatibility engine",
  "dz.ms.basicLocal": "Basic on-device summary instead",
  "dz.ms.resultHeading": "Summary & action items",
  "dz.ms.sourceLocal": "Basic on-device summary",
  "dz.ms.copy": "Copy summary",
  "dz.ms.copied": "Copied",
  "dz.ms.exportTxt": "TXT",
  "dz.ms.exportMd": "MD",
  "dz.ms.another": "Summarize another meeting",
  "dz.ms.failedTranscribe": "Transcription didn't work — try another file.",
  "dz.ms.failedSummarize": "Summarizing didn't work — try again.",
  "dz.ms.retry": "Try again",
  "dz.ms.pageTitle": "Free Meeting Summary — Dzzz Tools",
  "dz.enh.name": "Enhance Old Photo",
  "dz.enh.benefit": "Restore old photos privately, on your device.",
  "dz.enh.drop": "Drop an old photo, or tap to choose",
  "dz.enh.scaleLabel": "Upscale",
  "dz.enh.scale2x": "2× (faster)",
  "dz.enh.scale4x": "4× (higher detail)",
  "dz.enh.verb": "Enhance photo",
  "dz.enh.working": "Enhancing… ~{s}s on this device",
  "dz.enh.wasmWarn": "Your device doesn't support WebGPU, so this runs in a slower compatibility mode — large photos are automatically resized to keep it running smoothly.",
  "dz.enh.downscaled": "Photo resized to keep processing smooth on this device.",
  "dz.enh.failed": "That didn't work — try another photo.",
  "dz.enh.another": "Enhance another photo",
  "dz.enh.engineHint": "~22 MB engine",
  "dz.enh.seo": "Restore and upscale old or low-resolution photos for free — an AI super-resolution model runs entirely on your device, so your photos never leave it. Choose 2× or 4× upscaling, compare before and after, and save the result. No uploads, no account.",
  "dz.enh.pageTitle": "Enhance Old Photo — Dzzz Tools",
  "dz.dn.name": "Voice Denoise",
  "dz.dn.benefit": "Clean up background noise from voice recordings — right on your device.",
  "dz.dn.drop": "Drop an audio or video file, or tap to choose",
  "dz.dn.verb": "Clean up audio",
  "dz.dn.working": "Cleaning the audio…",
  "dz.dn.workingElapsed": "Elapsed {s}s",
  "dz.dn.failed": "That didn't work — try another file.",
  "dz.dn.another": "Denoise another file",
  "dz.dn.abOriginal": "A · Original",
  "dz.dn.abDenoised": "B · Denoised",
  "dz.dn.tagOriginal": "Original",
  "dz.dn.tagDenoised": "Denoised",
  "dz.dn.play": "Play",
  "dz.dn.pause": "Pause",
  "dz.dn.videoNote": "Saving exports your full video with the cleaned audio track.",
  "dz.dn.engineHint": "~1 MB",
  "dz.dn.seo": "Remove background noise and hiss from voice recordings and video audio for free — RNNoise runs entirely on your device, so nothing is uploaded. Compare the original and cleaned audio side by side, then save the cleaned audio or the full video with its audio track replaced. No uploads, no account.",
  "dz.dn.pageTitle": "Voice Denoise — Dzzz Tools",
  "dz.vr.name": "Vocal Remover",
  "dz.vr.drop": "Drop a song, or tap to choose",
  "dz.vr.deviceNote": "Separation runs on your device. The one-time model download comes from huggingface.co; nothing else leaves your device.",
  "dz.vr.qualityNote": "Both results lose sound above about 11 kHz, so cymbals and \"air\" come out dull — that's a limit of the separation model, not a bug. This is a good separation with audible artefacts, not a studio-quality stem.",
  "dz.vr.estimateRange": "A {d} track takes about {lo}–{hi} on this device, based on runs measured here. It keeps updating while working.",
  "dz.vr.estimateBenchmarking": "Measuring how fast this device processes audio — this only happens once.",
  "dz.vr.estimatePending": "The exact time depends on your device. It's measured the first time you run this, then remembered.",
  "dz.vr.overCap": "This track is longer than the {m}-minute limit on this device — the longer the track, the more memory the two output tracks need, so trim it first.",
  "dz.vr.verb": "Separate vocals",
  "dz.vr.working": "Separating…",
  "dz.vr.workingSplit": "Processing part {split} of {splits}",
  "dz.vr.remainingRange": "≈ {lo}–{hi} left",
  "dz.vr.stageAnalyse": "Analysing the track",
  "dz.vr.stageLoad": "Loading the model",
  "dz.vr.stageSeparate": "Separating stems",
  "dz.vr.stageFinal": "Finalising",
  "dz.vr.leaveNote": "You can leave this tab — the separation keeps running and the result will be here when you come back.",
  "dz.vr.elapsed": "Elapsed {t}",
  "dz.vr.cancel": "Cancel",
  "dz.vr.failed": "That didn't work — try another file.",
  "dz.vr.another": "Try another track",
  "dz.vr.seo": "Split a song into an instrumental track and an isolated vocal track for free — the Spleeter separation model runs entirely on your device after a one-time download from huggingface.co, so the audio itself never leaves it. Both results lose sound above about 11 kHz, so cymbals and \"air\" sound dull, and this is a good separation with audible artefacts rather than a studio-quality stem. No uploads, no account.",
  "dz.vr.pageTitle": "Vocal Remover — split a song into vocals and instrumental",
  "dz.mix.title": "Stems",
  "dz.mix.stem.vocals": "Vocals",
  "dz.mix.stem.instrumental": "Instrumental",
  "dz.mix.play": "Play",
  "dz.mix.pause": "Pause",
  "dz.mix.loop": "Loop A–B",
  "dz.mix.karaoke": "Karaoke preset",
  "dz.mix.speed": "Practice speed",
  "dz.mix.speedPitchNote": "Slower also lowers the pitch — this speed control isn't pitch-corrected.",
  "dz.mix.loopStart": "Loop start",
  "dz.mix.loopEnd": "Loop end",
  "dz.mix.levelLabel": "{stem} level",
  "dz.mix.muteLabel": "Mute {stem}",
  "dz.mix.soloLabel": "Solo {stem}",
  "dz.mix.off": "OFF",
  "dz.mix.exportTitle": "Export",
  "dz.mix.export.instrumental.name": "Instrumental only",
  "dz.mix.export.instrumental.sub": "Vocals removed, everything else kept",
  "dz.mix.export.vocals.name": "Vocals only",
  "dz.mix.export.vocals.sub": "The isolated vocal track",
  "dz.mix.export.mix.name": "This mix",
  "dz.mix.export.mix.sub": "Exactly the faders as they sit now",
  "dz.mix.export.all.name": "Both stems · ZIP",
  "dz.mix.export.all.sub": "Vocals and instrumental, one archive",
  "dz.mix.format": "FORMAT",
  "dz.mix.exportCta": "Export {what} · {fmt}",
  "dz.mix.exporting": "Exporting…",
  "dz.mix.exportNote": "Files are written on your device. Nothing is uploaded.",
  "dz.mix.exportFailed": "Export failed — try again.",
  "dz.ab.name": "Auto-Blur",
  "dz.ab.benefit": "Blur faces, people, or anything sensitive in a photo before you share it — on your device.",
  "dz.ab.engineHint": "~43 MB engine",
  "dz.ab.drop": "Drop a photo, or tap to choose",
  "dz.ab.drawHint": "Drag on the photo to draw a box over anything to hide. Drag a box to move it, its corner to resize, or tap × to remove it.",
  "dz.ab.detectVerb": "Detect people (beta)",
  "dz.ab.detecting": "Detecting people…",
  "dz.ab.detectNote": "Detects people using a general-purpose model — boxes cover the whole person, not just the face. Draw your own boxes for precise, face-only redaction.",
  "dz.ab.detectNone": "No people detected — add boxes manually.",
  "dz.ab.detectFailed": "Detection didn't work — you can still add boxes manually.",
  "dz.ab.wasmWarn": "Your device doesn't support WebGPU, so detection runs in a slower compatibility mode.",
  "dz.ab.styleLabel": "Redaction style",
  "dz.ab.blur": "Blur",
  "dz.ab.pixelate": "Pixelate",
  "dz.ab.boxCount": "{n} box(es) marked",
  "dz.ab.clearAll": "Clear all",
  "dz.ab.removeBox": "Remove box",
  "dz.ab.redactVerb": "Apply redaction",
  "dz.ab.working": "Applying redaction…",
  "dz.ab.failed": "That didn't work — try another photo.",
  "dz.ab.another": "Redact another photo",
  "dz.ab.editAgain": "Edit boxes again",
  "dz.ab.resultNote": "Redacted image — the marked regions are permanently blurred and flattened.",
  "dz.ab.downscaled": "Large photo downscaled to 4096px.",
  "dz.ab.blurFallback": "Blur isn't supported here — used pixelation instead (your image is still fully redacted).",
  "dz.ab.seo": "Blur or pixelate faces, people, or anything sensitive in a photo before you share it — an on-device object-detection model can mark people automatically, and you can always draw, move, resize, or remove boxes by hand. Nothing is uploaded; the redacted image is flattened and saved straight from your device. No uploads, no account.",
  "dz.ab.pageTitle": "Auto-Blur — Dzzz Tools",
  "dz.csv.showingN": "Showing {n} of {total} rows",
  "dz.csv.capHard": "File is too large — this tool works inside your device's memory, and that stops at 25 MB per file. A CSV or TSV this large can still be opened with the big-file tools:",
  "dz.csv.capHardViewer": "Open a large CSV",
  "dz.csv.capHardSql": "Query it with SQL",
  "dz.csv.capSoft": "Large file — this may take a moment and use significant memory.",
  "dz.csv.desktopNote": "For best performance with large files, use a computer.",
  "dz.mergeCsv.name": "Merge CSV",
  "dz.mergeCsv.benefit": "Combine multiple CSV/Excel files into one",
  "dz.mergeCsv.title": "Merge CSV & Excel files",
  "dz.mergeCsv.pick": "Choose files to merge",
  "dz.mergeCsv.addMore": "Add more files",
  "dz.mergeCsv.align": "Align columns by",
  "dz.mergeCsv.alignName": "Column name",
  "dz.mergeCsv.alignPos": "Position",
  "dz.mergeCsv.addSource": "Add a \"source file\" column",
  "dz.mergeCsv.run": "Merge",
  "dz.mergeCsv.seo": "Combine multiple CSV, TSV, XLSX or JSON files into one table, right on your device. Align columns by name or position, optionally tag each row with its source file. Nothing is uploaded.",
  "dz.mergeCsv.widthWarn": "Some files have more columns than the first file — extra columns are ignored when aligning by position.",
  "dz.mergeCsv.pageTitle": "Merge CSV & Excel files — Dzzz Tools",
  "dz.splitCsv.name": "Split CSV",
  "dz.splitCsv.benefit": "Split a CSV/Excel file into multiple parts",
  "dz.splitCsv.title": "Split a CSV or Excel file",
  "dz.splitCsv.pick": "Choose a file to split",
  "dz.splitCsv.mode": "Split by",
  "dz.splitCsv.byRows": "Row count",
  "dz.splitCsv.byCol": "Column value",
  "dz.splitCsv.rowsPer": "Rows per file",
  "dz.splitCsv.pickCol": "Column",
  "dz.splitCsv.run": "Split",
  "dz.splitCsv.count": "{n} files will be created",
  "dz.splitCsv.seo": "Split a CSV, TSV, XLSX or JSON file into multiple parts, right on your device — by a fixed row count or by the value of a chosen column. Get every part back as a single ZIP download. Nothing is uploaded.",
  "dz.splitCsv.pageTitle": "Split a CSV or Excel file — Dzzz Tools",
  "dz.dedupeCsv.name": "Dedupe CSV",
  "dz.dedupeCsv.benefit": "Remove duplicate rows from a CSV/Excel file",
  "dz.dedupeCsv.title": "Remove duplicate rows",
  "dz.dedupeCsv.pick": "Choose a file to dedupe",
  "dz.dedupeCsv.keys": "Match duplicates by (leave all unchecked for whole row)",
  "dz.dedupeCsv.wholeRow": "No columns selected — matching the whole row.",
  "dz.dedupeCsv.keep": "Keep",
  "dz.dedupeCsv.keepFirst": "First occurrence",
  "dz.dedupeCsv.keepLast": "Last occurrence",
  "dz.dedupeCsv.run": "Remove duplicates",
  "dz.dedupeCsv.removed": "Removed {n} duplicate rows",
  "dz.dedupeCsv.seo": "Remove duplicate rows from a CSV, TSV, XLSX or JSON file, right on your device — dedupe by the whole row or by chosen key columns, keeping either the first or last occurrence. Nothing is uploaded.",
  "dz.dedupeCsv.pageTitle": "Remove duplicate rows from a CSV — Dzzz Tools",
  "dz.cleanCsv.name": "Clean CSV",
  "dz.cleanCsv.benefit": "Trim, fix case, normalize digits and dates in a CSV/Excel file",
  "dz.cleanCsv.title": "Clean up a CSV file",
  "dz.cleanCsv.pick": "Choose a file to clean",
  "dz.cleanCsv.transforms": "Transforms",
  "dz.cleanCsv.trim": "Trim whitespace",
  "dz.cleanCsv.caseLabel": "Text case",
  "dz.cleanCsv.caseNone": "No change",
  "dz.cleanCsv.caseUpper": "UPPERCASE",
  "dz.cleanCsv.caseLower": "lowercase",
  "dz.cleanCsv.caseTitle": "Title Case",
  "dz.cleanCsv.dropRows": "Drop empty rows",
  "dz.cleanCsv.dropCols": "Drop empty columns",
  "dz.cleanCsv.normDigits": "Normalize digits (Arabic-Indic → Western)",
  "dz.cleanCsv.stdDates": "Standardize dates to YYYY-MM-DD",
  "dz.cleanCsv.run": "Apply & download",
  "dz.cleanCsv.seo": "Clean up a CSV, TSV, XLSX or JSON file right on your device — trim whitespace, fix text case, normalize digits, standardize dates, and drop empty rows or columns, with a live preview before you download. Nothing is uploaded.",
  "dz.cleanCsv.pageTitle": "Clean up a CSV file — Dzzz Tools",
  "dz.compareCsv.name": "Compare CSV",
  "dz.compareCsv.benefit": "See what changed between two CSV/Excel files",
  "dz.compareCsv.title": "Compare two CSV or Excel files",
  "dz.compareCsv.pickA": "Choose file A",
  "dz.compareCsv.pickB": "Choose file B",
  "dz.compareCsv.key": "Key column",
  "dz.compareCsv.run": "Compare",
  "dz.compareCsv.added": "Added",
  "dz.compareCsv.removed": "Removed",
  "dz.compareCsv.changed": "Changed",
  "dz.compareCsv.exportDiff": "Export diff (CSV)",
  "dz.compareCsv.seo": "Compare two CSV, TSV, XLSX or JSON files by a shared key column, right on your device — see rows that were added, removed or changed, and export the diff as a CSV. Nothing is uploaded.",
  "dz.compareCsv.pageTitle": "Compare two CSV files — Dzzz Tools",
  "dz.convertCsv.name": "Convert CSV",
  "dz.convertCsv.benefit": "Convert between CSV, TSV, XLSX and JSON",
  "dz.convertCsv.title": "Convert a CSV or Excel file",
  "dz.convertCsv.pick": "Choose a file to convert",
  "dz.convertCsv.sheet": "Sheet",
  "dz.convertCsv.to": "Convert to",
  "dz.convertCsv.run": "Convert & download",
  "dz.convertCsv.seo": "Convert a CSV, TSV, XLSX or JSON file to any of the other formats, right on your device — pick a sheet from multi-sheet Excel files and preview it before converting. Nothing is uploaded.",
  "dz.convertCsv.pageTitle": "Convert CSV, Excel, TSV and JSON — Dzzz Tools",
  "dz.excelConverter.moved": "Moved to",
  "dz.csv.chooserTitle": "Which CSV tool do you need?",
  "dz.csv.chooserIntro": "Six small tools for working with CSV, TSV, XLSX and JSON files — pick the one that matches what you're trying to do. Nothing is uploaded.",
  "dz.csv.use.merge": "Combine several files into one table.",
  "dz.csv.use.split": "Break one file into smaller parts, by row count or column value.",
  "dz.csv.use.dedupe": "Remove duplicate rows from a file.",
  "dz.csv.use.clean": "Trim, fix case, and normalize digits/dates in a file.",
  "dz.csv.use.compare": "See what changed between two versions of a file.",
  "dz.csv.use.convert": "Change a file's format — CSV, TSV, XLSX or JSON.",
  "dz.csv.chooserLink": "Not sure which CSV tool you need? See all six →",
  "dz.csv.pageTitle": "Which CSV tool do you need? — Dzzz Tools",
  "dz.zipm.name": "ZIP Manager",
  "dz.zipm.benefit": "Create and extract ZIP archives, right on your device.",
  "dz.zipm.drop": "Drop files to zip, or a single .zip to extract",
  "dz.zipm.extracting": "Extracting…",
  "dz.zipm.accept": "Any files, or one .zip archive",
  "dz.zipm.addMore": "Add more files",
  "dz.zipm.archiveName": "Archive name",
  "dz.zipm.compression": "Compression",
  "dz.zipm.deflate": "Deflate (smaller)",
  "dz.zipm.store": "Store (faster)",
  "dz.zipm.storeNote": "All the selected files are already compressed, so Store mode was used instead.",
  "dz.zipm.createRun": "Create ZIP",
  "dz.zipm.tooManyEntries": "Too many files — the limit is 1000 per archive.",
  "dz.zipm.tooBig": "Total size is too large — the limit is 500 MB per archive (this runs in your device's memory).",
  "dz.zipm.encrypted": "This archive is password-protected, which isn't supported.",
  "dz.zipm.badArchive": "Could not read this archive — it may be corrupted.",
  "dz.zipm.extractSummary": "{count} files · {size}",
  "dz.zipm.colName": "Name",
  "dz.zipm.colSize": "Size",
  "dz.zipm.preview": "Preview",
  "dz.zipm.hidePreview": "Hide",
  "dz.zipm.noPreview": "No preview available",
  "dz.zipm.seo": "Create a ZIP archive from your files, or extract one — entirely on your device. Password-protected archives aren't supported. Nothing is uploaded.",
  "dz.zipm.pageTitle": "ZIP Manager — Create & Extract Archives — Dzzz Tools",
  "dz.pdfimg.name": "Extract Images from PDF",
  "dz.pdfimg.benefit": "Save PDF pages or embedded pictures as image files.",
  "dz.pdfimg.drop": "Drop a PDF or tap to choose",
  "dz.pdfimg.mode": "What do you need?",
  "dz.pdfimg.modePages": "Pages as images",
  "dz.pdfimg.modeEmbedded": "Embedded images",
  "dz.pdfimg.format": "Format",
  "dz.pdfimg.quality": "Quality",
  "dz.pdfimg.scale": "Size",
  "dz.pdfimg.run": "Extract images",
  "dz.pdfimg.embeddedHint": "Finds every picture in the PDF once, even if it repeats across pages. Transparency may be flattened on re-encoded images.",
  "dz.pdfimg.encrypted": "This PDF is password-protected — remove the password first.",
  "dz.pdfimg.capHard": "File is too large — the limit is 100 MB (this runs in your device's memory).",
  "dz.pdfimg.capSoft": "Large PDF — this may take a moment and use significant memory.",
  "dz.pdfimg.capPages": "This PDF has too many pages — the limit is 500.",
  "dz.pdfimg.resultCount": "{count} images · {size}",
  "dz.pdfimg.verbatim": "Original JPEG",
  "dz.pdfimg.reencoded": "Re-encoded PNG",
  "dz.pdfimg.colType": "Type",
  "dz.pdfimg.noImages": "No embedded images were found in this PDF.",
  "dz.pdfimg.seo": "Save PDF pages as PNG or JPEG images, or pull out every picture embedded in a PDF — right on your device. Original JPEGs are kept byte-for-byte where possible; everything else is safely re-encoded. Transparency may be flattened on extracted images. Nothing is uploaded.",
  "dz.pdfimg.pageTitle": "Extract Images from PDF — Dzzz Tools",
  "dz.pwgen.name": "Password Generator",
  "dz.pwgen.tagNew": "New",
  "dz.pwgen.benefit": "Random passwords and an honest strength check",
  "dz.pwgen.generateTab": "Generate",
  "dz.pwgen.checkTab": "Check",
  "dz.pwgen.mode": "Type",
  "dz.pwgen.modeRandom": "Random characters",
  "dz.pwgen.modePronounceable": "Pronounceable",
  "dz.pwgen.modePassphrase": "Passphrase (words)",
  "dz.pwgen.length": "Length",
  "dz.pwgen.upper": "Uppercase (A-Z)",
  "dz.pwgen.lower": "Lowercase (a-z)",
  "dz.pwgen.digits": "Digits (0-9)",
  "dz.pwgen.symbols": "Symbols (!@#$…)",
  "dz.pwgen.excludeAmbiguous": "Exclude ambiguous characters (I l 1 O 0 o)",
  "dz.pwgen.words": "Number of words",
  "dz.pwgen.separator": "Separator",
  "dz.pwgen.addDigit": "Add a trailing digit",
  "dz.pwgen.batch": "How many passwords (1-20)",
  "dz.pwgen.generateBtn": "Generate",
  "dz.pwgen.regenerate": "Regenerate",
  "dz.pwgen.copy": "Copy",
  "dz.pwgen.copied": "Copied",
  "dz.pwgen.errorNoClass": "Select at least one character type.",
  "dz.pwgen.checkLabel": "Type or paste a password to check",
  "dz.pwgen.crackTime": "Time to crack (offline attack)",
  "dz.pwgen.score0": "Very weak",
  "dz.pwgen.score1": "Weak",
  "dz.pwgen.score2": "Fair",
  "dz.pwgen.score3": "Good",
  "dz.pwgen.score4": "Strong",
  "dz.pwgen.privacyNote": "Nothing you type or generate here is stored, logged, transmitted or persisted. No history for this tool. Works fully offline.",
  "dz.pwgen.seo": "Generate strong passwords — random, pronounceable, or multi-word passphrases — using crypto.getRandomValues, never Math.random. Check any password's real-world strength with zxcvbn-based scoring, a crack-time estimate, and honest feedback. Nothing you type or generate is ever stored, logged, or transmitted — this tool works fully offline.",
  "dz.pwgen.pageTitle": "Password Generator & Strength Checker — Dzzz Tools",
  "dz.redact.name": "Redact Text",
  "dz.redact.tagNew": "New",
  "dz.redact.benefit": "Find and redact personal information — privately, on your device.",
  "dz.redact.scopeNote": "Finds structured identifiers only — emails, phone numbers, IBANs, card numbers, Saudi IDs/Iqamas, URLs, IP addresses, and API keys or secrets. It does not detect names or addresses in free text — use manual selection for those.",
  "dz.redact.inputLabel": "Paste or type text to scan",
  "dz.redact.uploadLabel": "Or upload a .txt file",
  "dz.redact.notYet": "Nothing is redacted until you press Redact below.",
  "dz.redact.tooLarge": "This text is too long to review here (500,000 character limit). Try a shorter excerpt.",
  "dz.redact.detectTruncated": "This text is very large — only the first {n} detections are shown, so detection is incomplete. Redact it in smaller chunks to make sure everything is caught.",
  "dz.redact.detectError": "Couldn't scan this text. Try again.",
  "dz.redact.exportError": "Couldn't build the redacted output. Try again.",
  "dz.redact.foundPrefix": "Found",
  "dz.redact.foundNone": "No structured identifiers found. You can still redact names or addresses manually below.",
  "dz.redact.kind.email": "Email",
  "dz.redact.kind.phone": "Phone",
  "dz.redact.kind.iban": "IBAN",
  "dz.redact.kind.card": "Card number",
  "dz.redact.kind.saudiId": "Saudi ID/Iqama",
  "dz.redact.kind.url": "URL",
  "dz.redact.kind.ip": "IP address",
  "dz.redact.kind.secret": "API key/secret",
  "dz.redact.kind.person": "Name",
  "dz.redact.kind.place": "Address/place",
  "dz.redact.kind.org": "Organization",
  "dz.redact.kind.date": "Date",
  "dz.redact.provenancePattern": "exact match",
  "dz.redact.provenanceManual": "your selection",
  "dz.redact.provenanceModel": "{pct}% confidence",
  "dz.redact.stateRedact": "Will redact",
  "dz.redact.stateKeep": "Kept",
  "dz.redact.manualTitle": "Manual selection",
  "dz.redact.manualHint": "Select any text above — a name, an address, anything the scan missed — then redact it. This is how names and free-text addresses get covered.",
  "dz.redact.manualAsName": "Name",
  "dz.redact.manualAsPlace": "Address",
  "dz.redact.manualBtn": "Redact selection",
  "dz.redact.manualNoSelection": "Select some text first.",
  "dz.redact.manualAdded": "Selection added to the review list",
  "dz.redact.aiTitle": "AI name/place detection",
  "dz.redact.aiBeta": "Beta",
  "dz.redact.aiCautionBold": "Experimental.",
  "dz.redact.aiCautionBody": "This optional on-device AI model tries to catch names, places, organizations and dates that the exact-match scan above can't. Detection quality is unverified — it may miss names (especially Arabic ones) or flag the wrong text. Review every highlight before trusting it. Nothing is downloaded or scanned until you tap the button below.",
  "dz.redact.aiCategoriesLabel": "Categories to detect",
  "dz.redact.aiScanBtn": "Scan with AI (beta)",
  "dz.redact.aiScanning": "Scanning with AI…",
  "dz.redact.aiScanError": "The AI scan didn't work — the exact-match results above are still valid.",
  "dz.redact.aiScanNone": "No additional names, places, organizations or dates found.",
  "dz.redact.styleLabel": "Redaction style",
  "dz.redact.styleBlock": "Block (████)",
  "dz.redact.styleLabelOpt": "Label ([EMAIL])",
  "dz.redact.styleChar": "Custom character",
  "dz.redact.styleCharLabel": "Character",
  "dz.redact.redactBtn": "Redact",
  "dz.redact.caveat": "Automated detection won't catch everything — especially Arabic names and unusual formats. Review every highlight before sharing.",
  "dz.redact.outputLabel": "Redacted output",
  "dz.redact.redactedStatus": "Redacted — {n} items",
  "dz.redact.copy": "Copy",
  "dz.redact.copied": "Copied",
  "dz.redact.download": "Download .txt",
  "dz.redact.privacyNote": "Nothing you paste, upload or produce here is stored, logged, transmitted or persisted. No history for this tool. Works fully offline.",
  "dz.redact.seo": "Find personal information in pasted text — emails, phone numbers, IBANs, card numbers, Saudi IDs, URLs, IP addresses, and API keys — using exact, checksum-verified pattern matching, right on your device. Review every match before anything changes: dismiss false positives, or select any other text (like a name or address) to redact it manually. Choose a block, label, or custom-character redaction style, then copy or download the result. Automated detection won't catch everything, especially Arabic names and unusual formats — always review before sharing. Nothing you paste or produce here is ever stored, logged, or transmitted.",
  "dz.redact.pageTitle": "Redact Personal Information from Text — Dzzz Tools",
  "dz.lorem.name": "Lorem Ipsum Generator",
  "dz.lorem.benefit": "Placeholder text in real Arabic or classic Latin — words, sentences, or paragraphs, generated on your device.",
  "dz.lorem.langLabel": "Text language",
  "dz.lorem.langAr": "Arabic",
  "dz.lorem.langEn": "English",
  "dz.lorem.unitLabel": "Unit",
  "dz.lorem.unitWords": "Words",
  "dz.lorem.unitSentences": "Sentences",
  "dz.lorem.unitParagraphs": "Paragraphs",
  "dz.lorem.countLabel": "Count",
  "dz.lorem.classicOpener": "Start with the classic “Lorem ipsum dolor sit amet…”",
  "dz.lorem.wrapParagraphs": "Wrap each paragraph in <p> tags",
  "dz.lorem.preview": "Preview",
  "dz.lorem.regenerate": "Regenerate",
  "dz.lorem.copy": "Copy",
  "dz.lorem.copied": "Copied",
  "dz.lorem.seo": "Generate placeholder text in real Arabic — natural vocabulary with proper Arabic punctuation, not a transliteration — or classic Latin lorem ipsum. Choose words, sentences, or paragraphs, set an exact count, optionally start with the classic “Lorem ipsum dolor sit amet…” opener, and wrap paragraphs in <p> tags for HTML mockups. Everything is generated on your device — nothing is stored or transmitted, and the tool works fully offline.",
  "dz.lorem.pageTitle": "Lorem Ipsum Generator — Real Arabic & Classic Latin — Dzzz Tools",
  "dz.picker.name": "Random Picker & Spin Wheel",
  "dz.picker.tagNew": "New",
  "dz.picker.benefit": "Fair random draws from your list — pick one, pick several, or spin the wheel. Everything stays on your device.",
  "dz.picker.itemsLabel": "Items (one per line)",
  "dz.picker.itemsPlaceholder": "Type each name or item on its own line",
  "dz.picker.rememberList": "Remember my list on this device",
  "dz.picker.modeList": "List picker",
  "dz.picker.modeWheel": "Spin wheel",
  "dz.picker.removeAfterPick": "Raffle mode: remove picked items from the list",
  "dz.picker.weightsToggle": "Per-item weights (higher = better odds — “Pick one” only)",
  "dz.picker.weightLabel": "Weight",
  "dz.picker.pickOneBtn": "Pick one",
  "dz.picker.pickCount": "How many to pick",
  "dz.picker.pickNBtn": "Pick multiple",
  "dz.picker.pickNUniformHint": "“Pick multiple” draws uniformly — weights don’t apply.",
  "dz.picker.resultsLabel": "Result",
  "dz.picker.spinBtn": "Spin",
  "dz.picker.needTwo": "Add at least two items to spin the wheel",
  "dz.picker.winnerLabel": "Winner",
  "dz.picker.seo": "Draw fair random picks from any list — pick one winner, pick several without repeats, run a raffle that removes winners as you go, or spin a colourful wheel. Every draw uses cryptographically fair randomness (crypto.getRandomValues, never Math.random), and the wheel only animates a result that was already fairly decided. Your list stays on your device and is never uploaded — the tool works fully offline.",
  "dz.picker.pageTitle": "Random Picker & Spin Wheel — Dzzz Tools",
  "dz.color.name": "Color Tools",
  "dz.color.benefit": "Palettes, gradients, format conversion, and contrast checking — all on your device.",
  "dz.color.paletteTab": "Palette",
  "dz.color.gradientTab": "Gradient",
  "dz.color.converterTab": "Convert & Contrast",
  "dz.color.baseColor": "Base color",
  "dz.color.harmonyMode": "Harmony",
  "dz.color.harmonyComplementary": "Complementary",
  "dz.color.harmonyAnalogous": "Analogous",
  "dz.color.harmonyTriadic": "Triadic",
  "dz.color.harmonyTetradic": "Tetradic",
  "dz.color.harmonySplitComplementary": "Split complementary",
  "dz.color.harmonyMonochromatic": "Monochromatic",
  "dz.color.lockSwatch": "Lock color",
  "dz.color.regenerate": "Regenerate",
  "dz.color.exportHex": "Copy HEX list",
  "dz.color.exportCss": "Copy CSS variables",
  "dz.color.gradientType": "Gradient type",
  "dz.color.gradientLinear": "Linear",
  "dz.color.gradientRadial": "Radial",
  "dz.color.gradientConic": "Conic",
  "dz.color.angle": "Angle (degrees)",
  "dz.color.addStop": "Add stop",
  "dz.color.removeStop": "Remove stop",
  "dz.color.copyCss": "Copy CSS",
  "dz.color.linkNote": "The link carries the gradient type and angle only — not the colour stops.",
  "dz.color.foreground": "Text color",
  "dz.color.background": "Background color",
  "dz.color.largeText": "Large text (18pt and up, or 14pt bold)",
  "dz.color.contrastRatioLabel": "Contrast ratio",
  "dz.color.passesAA": "AA — minimum contrast",
  "dz.color.passesAAA": "AAA — enhanced contrast",
  "dz.color.pass": "Pass",
  "dz.color.fail": "Fail",
  "dz.color.copied": "Copied",
  "dz.color.invalidHex": "Not a valid hex color (e.g. #1A2B3C)",
  "dz.color.invalidRgb": "Enter RGB as three numbers from 0 to 255 (e.g. 59, 130, 246)",
  "dz.color.invalidHsl": "Enter HSL as hue, saturation%, lightness% (e.g. 217, 91%, 60%)",
  "dz.color.hex": "HEX",
  "dz.color.rgb": "RGB",
  "dz.color.hsl": "HSL",
  "dz.color.stopColor": "Stop color",
  "dz.color.stopPosition": "Stop position (%)",
  "dz.color.seo": "Free colour tools that run entirely on your device: build a palette from any base colour using six harmony schemes, design linear, radial, or conic CSS gradients with a live preview, convert between HEX, RGB, and HSL, and check text contrast against the WCAG AA and AAA thresholds. Nothing is uploaded — everything works offline.",
  "dz.color.pageTitle": "Color Tools — Palette, Gradient & Contrast Checker — Dzzz Tools",
  "dz.duedate.name": "Due Date Calculator",
  "dz.duedate.title": "Due Date Calculator",
  "dz.duedate.benefit": "Estimate your due date from your last period, conception date, or IVF embryo transfer — shown in both Gregorian and Hijri calendars.",
  "dz.duedate.modeLmp": "From last period",
  "dz.duedate.modeConception": "From conception",
  "dz.duedate.modeIvf": "IVF transfer",
  "dz.duedate.embryoLabel": "Embryo age at transfer",
  "dz.duedate.embryoDay3": "Day-3 embryo",
  "dz.duedate.embryoDay5": "Day-5 embryo",
  "dz.duedate.dateLmp": "First day of your last period",
  "dz.duedate.dateConception": "Conception (ovulation) date",
  "dz.duedate.dateTransfer": "Embryo transfer date",
  "dz.duedate.result": "Estimated due date",
  "dz.duedate.gaLabel": "Gestational age today",
  "dz.duedate.gaWeeksDays": "Weeks: {w} · Days: {d}",
  "dz.duedate.tri1": "First trimester",
  "dz.duedate.tri2": "Second trimester",
  "dz.duedate.tri3": "Third trimester",
  "dz.duedate.noteCycle": "The last-period method assumes a 28-day cycle; only about 10–13% of cycles are exactly 28 days.",
  "dz.duedate.noteSpread": "Only about 4–5% of births happen on the estimated date itself.",
  "dz.duedate.disclaimer": "An estimate for general information — not medical advice. Your clinician confirms pregnancy dating, usually with an early ultrasound.",
  "dz.duedate.seo": "Free due date calculator: estimate your delivery date from your last period, conception date, or IVF embryo transfer, with the result in both Gregorian and Hijri calendars plus current gestational age and trimester. Works entirely on your device.",
  "dz.duedate.pageTitle": "Due Date Calculator — Dzzz Tools",
  "dz.water.name": "Daily Water Intake",
  "dz.water.title": "Daily Water Intake",
  "dz.water.benefit": "Published reference values for daily water intake — computed entirely on your device.",
  "dz.water.sex": "Sex",
  "dz.water.male": "Male",
  "dz.water.female": "Female",
  "dz.water.weight": "Weight",
  "dz.water.unitKg": "kg",
  "dz.water.unitLb": "lb",
  "dz.water.efsa": "EFSA (Europe)",
  "dz.water.efsaSub": "European Food Safety Authority, 2010",
  "dz.water.iom": "IOM (U.S.)",
  "dz.water.iomSub": "U.S. National Academies (IOM), 2004",
  "dz.water.rule": "Rule of thumb",
  "dz.water.ruleSub": "33 ml per kg of body weight — a common rule of thumb, not an official recommendation.",
  "dz.water.ruleNeedsWeight": "Enter your weight to see this figure.",
  "dz.water.litersDay": "L per day",
  "dz.water.inclFood": "Total water including food — about {food} L of this typically comes from food.",
  "dz.water.activity": "Exercise, hot weather, fever, and pregnancy or breastfeeding all increase water needs — treat these figures as baselines for temperate conditions.",
  "dz.water.glassesTitle": "Why not \"8 glasses a day\"?",
  "dz.water.glasses": "Eight 8-oz glasses come to about {liters} L — below the reference values above. The figure traces to a 1945 note read out of context, which already counted water from food (Valtin, 2002).",
  "dz.water.relatedBmi": "Also see: BMI calculator",
  "dz.water.disclaimer": "Reference values for healthy adults — not medical advice. Water needs vary with activity, climate, pregnancy, and health conditions; consult a clinician if you are unsure.",
  "dz.water.seo": "Free daily water intake calculator with EFSA and IOM reference values, a weight-based rule of thumb, and the story behind the \"8 glasses a day\" myth. Works entirely on your device.",
  "dz.water.pageTitle": "Daily Water Intake — Dzzz Tools",
  "dz.bodyfat.name": "Body Fat Calculator",
  "dz.bodyfat.title": "Body Fat Calculator",
  "dz.bodyfat.benefit": "US Navy circumference method — estimates body-fat percentage from tape measurements, entirely on your device.",
  "dz.bodyfat.metric": "Metric (cm)",
  "dz.bodyfat.imperial": "Imperial (in)",
  "dz.bodyfat.sex": "Sex",
  "dz.bodyfat.male": "Male",
  "dz.bodyfat.female": "Female",
  "dz.bodyfat.height": "Height",
  "dz.bodyfat.waist": "Waist",
  "dz.bodyfat.waistWhere": "Measure at navel level, with the tape horizontal.",
  "dz.bodyfat.neck": "Neck",
  "dz.bodyfat.neckWhere": "Measure just below the larynx (Adam's apple).",
  "dz.bodyfat.hip": "Hip",
  "dz.bodyfat.hipWhere": "Measure at the widest point of the hips.",
  "dz.bodyfat.age": "Age (optional)",
  "dz.bodyfat.result": "Estimated body fat",
  "dz.bodyfat.errorBand": "Typical error compared with a DXA scan is about ±3–4 percentage points.",
  "dz.bodyfat.childNote": "This formula is derived from adult data and does not apply under 18. A clinician can assess growth and body composition for children and teens.",
  "dz.bodyfat.idealTitle": "Ideal-weight formulas (same height)",
  "dz.bodyfat.idealNote": "These are mid-20th-century population regressions, not personal targets — the Devine formula is used clinically for drug dosing, not as a goal weight.",
  "dz.bodyfat.m.devine": "Devine",
  "dz.bodyfat.m.robinson": "Robinson",
  "dz.bodyfat.m.miller": "Miller",
  "dz.bodyfat.m.hamwi": "Hamwi",
  "dz.bodyfat.bmiRange": "BMI healthy range",
  "dz.bodyfat.unitKg": "kg",
  "dz.bodyfat.unitLb": "lb",
  "dz.bodyfat.cm": "cm",
  "dz.bodyfat.in": "in",
  "dz.bodyfat.relatedBmi": "Also see: BMI calculator",
  "dz.bodyfat.disclaimer": "Tape-measure estimate only — typical error versus DXA is ±3–4 percentage points; the formula tends to underestimate body fat in muscular or high-BMI people and overestimate it in very lean women. Informational only, not medical advice.",
  "dz.bodyfat.seo": "Free US Navy body-fat calculator using tape measurements of waist, neck and hip, with the typical error band disclosed and a four-formula ideal-weight comparison. Works entirely on your device.",
  "dz.bodyfat.pageTitle": "Body Fat Calculator — Dzzz Tools",
  "dz.hrz.name": "Heart Rate Zone Calculator",
  "dz.hrz.title": "Heart Rate Zone Calculator",
  "dz.hrz.benefit": "Estimate your maximum heart rate and see five training zones — all on your device.",
  "dz.hrz.age": "Age (years)",
  "dz.hrz.restingHr": "Resting heart rate (bpm, optional)",
  "dz.hrz.restingHint": "Add your resting heart rate to also see Karvonen (%HRR) zones in a separate table.",
  "dz.hrz.restTooHigh": "Reserve (Karvonen) zones appear when the resting heart rate is below the estimated maximum.",
  "dz.hrz.childNote": "These formulas are derived from adult data. For anyone under 18, ask a clinician.",
  "dz.hrz.maxLabel": "Estimated max heart rate (Tanaka, 208 − 0.7 × age)",
  "dz.hrz.classicLabel": "Commonly cited reference (220 − age)",
  "dz.hrz.bpm": "bpm",
  "dz.hrz.pctHead": "Zones by %HRmax (percentage of maximum heart rate)",
  "dz.hrz.karvHead": "Zones by Karvonen (%HRR — heart-rate reserve)",
  "dz.hrz.colZone": "Zone",
  "dz.hrz.colPct": "Intensity",
  "dz.hrz.colBpm": "bpm range",
  "dz.hrz.colEffort": "Effort",
  "dz.hrz.z1": "Very easy",
  "dz.hrz.z2": "Easy",
  "dz.hrz.z3": "Moderate",
  "dz.hrz.z4": "Hard",
  "dz.hrz.z5": "Very hard",
  "dz.hrz.disclaimer": "Estimates only — max heart rate formulas carry a standard deviation of roughly ±10 bpm between individuals. Not medical advice; consult a clinician before starting a new exercise program.",
  "dz.hrz.seo": "Free heart rate zone calculator: estimated max heart rate (Tanaka formula, with the commonly cited 220 − age as a reference) and five training zones by %HRmax, plus separately calculated Karvonen (%HRR) zones when you enter a resting heart rate. Works entirely on your device.",
  "dz.hrz.pageTitle": "Heart Rate Zone Calculator — Dzzz Tools",
  "dz.pace.name": "Running Pace Calculator",
  "dz.pace.title": "Running Pace Calculator",
  "dz.pace.benefit": "Solve pace, time or distance — with a split table and a race-time predictor.",
  "dz.pace.km": "km",
  "dz.pace.mi": "mi",
  "dz.pace.solveLabel": "Solve for",
  "dz.pace.pace": "Pace",
  "dz.pace.time": "Time",
  "dz.pace.distance": "Distance",
  "dz.pace.h": "h",
  "dz.pace.m": "min",
  "dz.pace.s": "sec",
  "dz.pace.speed": "Average speed",
  "dz.pace.kmh": "km/h",
  "dz.pace.mph": "mph",
  "dz.pace.splitsTitle": "Split times",
  "dz.pace.splitEvery": "Split every",
  "dz.pace.cumTime": "Cumulative time",
  "dz.pace.tooManySplits": "Choose a larger split interval to show the table.",
  "dz.pace.riegelTitle": "Race-time predictor (Riegel)",
  "dz.pace.knownDistance": "A recent race — distance",
  "dz.pace.knownTime": "A recent race — time",
  "dz.pace.targetDistance": "Target distance",
  "dz.pace.p5k": "5K",
  "dz.pace.p10k": "10K",
  "dz.pace.pHalf": "Half marathon",
  "dz.pace.pMarathon": "Marathon",
  "dz.pace.custom": "Custom",
  "dz.pace.customDistance": "Custom distance",
  "dz.pace.predicted": "Predicted time",
  "dz.pace.riegelNote": "Riegel's formula (T2 = T1 × (D2 ÷ D1)^1.06) was derived from race results lasting roughly {min}–{max} minutes; accuracy degrades as the gap between the two distances grows.",
  "dz.pace.disclaimer": "Estimates for training reference only — not medical or coaching advice.",
  "dz.pace.seo": "Free running pace calculator: solve pace, time or distance from the other two, see split times at any interval, and predict race times with Riegel's formula. Works entirely on your device.",
  "dz.pace.pageTitle": "Running Pace Calculator — Dzzz Tools",
  "dz.sleep.name": "Sleep Cycle Calculator",
  "dz.sleep.title": "Sleep Cycle Calculator",
  "dz.sleep.benefit": "Suggested bedtimes or wake-up times based on sleep cycles — runs entirely on your device.",
  "dz.sleep.modeWake": "I want to wake at…",
  "dz.sleep.modeBed": "I'm going to bed at…",
  "dz.sleep.wakeTime": "Wake-up time",
  "dz.sleep.bedTime": "Bedtime",
  "dz.sleep.bedtimes": "Suggested bedtimes",
  "dz.sleep.wakes": "Suggested wake-up times",
  "dz.sleep.optCycles": "{n} cycles",
  "dz.sleep.durH": "{h} h sleep",
  "dz.sleep.durHM": "{h} h {m} min sleep",
  "dz.sleep.buffer": "Times include a {n}-minute buffer to fall asleep.",
  "dz.sleep.honesty": "The {avg}-minute cycle is a population average. Measured individual averages range from {min} to {max} minutes (SD ≈ {sd} min), and cycle length shifts across the night — this tool cannot know your actual cycle boundaries.",
  "dz.sleep.disclaimer": "Estimates based on average sleep cycles — not medical advice. If you have ongoing sleep problems, consult a clinician.",
  "dz.sleep.seo": "Free sleep cycle calculator: suggested bedtimes or wake-up times based on 90-minute sleep cycles, with honest notes on individual variation. Works entirely on your device.",
  "dz.sleep.pageTitle": "Sleep Cycle Calculator — Dzzz Tools",
  "dz.hconv.name": "Health Unit Converters",
  "dz.hconv.title": "Health unit converters",
  "dz.hconv.benefit": "Convert weight, height, temperature and blood-test units",
  "dz.hconv.rowWeight": "Weight",
  "dz.hconv.kg": "kg",
  "dz.hconv.lb": "lb",
  "dz.hconv.rowHeight": "Height",
  "dz.hconv.cm": "cm",
  "dz.hconv.ft": "ft",
  "dz.hconv.in": "in",
  "dz.hconv.rowTemp": "Body temperature",
  "dz.hconv.celsius": "°C",
  "dz.hconv.fahrenheit": "°F",
  "dz.hconv.tempNote": "Reference: 37°C equals 98.6°F, a commonly cited normal baseline. This is a unit conversion only — it does not assess fever.",
  "dz.hconv.rowLab": "Blood test units",
  "dz.hconv.analyte": "Test",
  "dz.hconv.an.cholesterol": "Cholesterol",
  "dz.hconv.an.triglycerides": "Triglycerides",
  "dz.hconv.an.glucose": "Glucose",
  "dz.hconv.mgdl": "mg/dL",
  "dz.hconv.mmol": "mmol/L",
  "dz.hconv.disclaimer": "Unit conversions for reference only — not medical advice. Ask a clinician or your lab to interpret any result.",
  "dz.hconv.seo": "Free health unit converters: kilograms to pounds, centimetres to feet and inches, Celsius to Fahrenheit, and blood-test units (mg/dL to mmol/L) for cholesterol, triglycerides and glucose. Works entirely on your device.",
  "dz.hconv.pageTitle": "Health Unit Converters — Dzzz Tools",
  "dz.cycle.name": "Cycle Tracker",
  "dz.cycle.title": "Cycle Tracker",
  "dz.cycle.benefit": "Log period start dates to see the estimated next period, ovulation and fertile window — everything stays on your device.",
  "dz.cycle.privacy": "Your data stays on this device — nothing is uploaded, and there's no account.",
  "dz.cycle.logDate": "Period start date",
  "dz.cycle.logBtn": "Log period start",
  "dz.cycle.logged": "Logged period starts",
  "dz.cycle.empty": "No dates logged yet. Log your most recent period start to see estimates.",
  "dz.cycle.deleteEntry": "Delete entry {date}",
  "dz.cycle.settings": "Settings",
  "dz.cycle.avgLen": "Average cycle length (days)",
  "dz.cycle.avgRange": "Enter a length between 15 and 60 days.",
  "dz.cycle.avgAuto": "Calculated from your logged dates ({n}).",
  "dz.cycle.predictions": "Estimates",
  "dz.cycle.nextPeriod": "Next period (estimated)",
  "dz.cycle.ovulation": "Ovulation (estimated)",
  "dz.cycle.fertile": "Fertile window (estimated)",
  "dz.cycle.dataHeading": "Your data",
  "dz.cycle.export": "Export data (JSON)",
  "dz.cycle.deleteAllBtn": "Delete all data",
  "dz.cycle.deleteConfirm": "Tap again to confirm",
  "dz.cycle.confirmPrompt": "Delete all cycle data from this device? This cannot be undone.",
  "dz.cycle.deleteCancel": "Cancel",
  "dz.cycle.deletedMsg": "All data has been deleted from this device.",
  "dz.cycle.disclaimer": "Estimates only — not a contraceptive method and not medical advice. Consult a clinician for family planning.",
  "dz.cycle.seo": "Private period and ovulation calendar that runs entirely on your device — log period start dates to see the estimated next period, ovulation and fertile window. Nothing is uploaded and there is no account.",
  "dz.cycle.pageTitle": "Cycle Tracker — Dzzz Tools",
  "dz.docpdf.name": "Document to PDF",
  "dz.docpdf.benefit": "Convert Markdown, HTML, plain text, or images to a PDF with correct Arabic — everything runs on your device.",
  "dz.docpdf.desc": "Markdown, HTML, text, and images to PDF — Arabic renders correctly.",
  "dz.docpdf.srcLabel": "Source",
  "dz.docpdf.srcMarkdown": "Markdown",
  "dz.docpdf.srcHtml": "HTML",
  "dz.docpdf.srcText": "Plain text",
  "dz.docpdf.inputLabel": "Content",
  "dz.docpdf.paste": "Paste or type your content here…",
  "dz.docpdf.pickFile": "Choose a file",
  "dz.docpdf.fileHint": "Markdown (.md), HTML (.html), text (.txt), or images (JPG, PNG, WebP, HEIC)",
  "dz.docpdf.fileReadError": "Couldn't read that file — try a different one.",
  "dz.docpdf.tooLarge": "This document is larger than this tool can handle on your device (up to 2 MB per file, or about 1,000,000 characters of text). Split it into smaller parts and convert each part on its own.",
  "dz.docpdf.imagesMode": "Images are placed one per page, like the Images to PDF tool.",
  "dz.docpdf.addImages": "Add more images",
  "dz.docpdf.clearImages": "Back to text input",
  "dz.docpdf.capImages": "You can add up to 50 images.",
  "dz.docpdf.capSize": "Total image size can't exceed 200 MB.",
  "dz.docpdf.setup": "Page setup",
  "dz.docpdf.sizeLabel": "Page size",
  "dz.docpdf.orientationLabel": "Orientation",
  "dz.docpdf.portrait": "Portrait",
  "dz.docpdf.landscape": "Landscape",
  "dz.docpdf.marginLabel": "Margins",
  "dz.docpdf.marginNormal": "Normal (20 mm)",
  "dz.docpdf.marginNarrow": "Narrow (10 mm)",
  "dz.docpdf.marginWide": "Wide (30 mm)",
  "dz.docpdf.qualityLabel": "Quality",
  "dz.docpdf.quality2x": "2× (recommended)",
  "dz.docpdf.quality3x": "3× (sharper)",
  "dz.docpdf.qualityHint": "Higher quality means sharper pages and a noticeably larger PDF file.",
  "dz.docpdf.preview": "First-page preview",
  "dz.docpdf.previewEmpty": "Your first page appears here as you type.",
  "dz.docpdf.download": "Download PDF",
  "dz.docpdf.rasterNote": "The downloaded PDF's text is rasterized (saved as images) — it can't be selected or searched, and the file is larger than a normal PDF. For selectable text, use Print…",
  "dz.docpdf.print": "Print…",
  "dz.docpdf.printNote": "Opens the print dialog — choose \"Save as PDF\" there to get selectable, searchable text.",
  "dz.docpdf.working": "Building your PDF…",
  "dz.docpdf.done": "Your PDF is ready — the download has started.",
  "dz.docpdf.error": "Something went wrong while building the PDF. Please try again.",
  "dz.docpdf.empty": "Paste some content or choose a file first.",
  "dz.docpdf.seo": "Convert Markdown, HTML, plain text, and images to PDF entirely on your device — nothing is uploaded. Arabic text is shaped and ordered correctly by the text engine before each page is rendered. Choose A4 or Letter, portrait or landscape, margin presets and render quality, and watch a live preview of the first page as you type. The downloaded PDF contains rasterized pages, so its text is not selectable or searchable; use the Print option to get selectable text through the print dialog.",
  "dz.docpdf.pageTitle": "Document to PDF — Markdown, HTML, Text & Images, Arabic-ready — Dzzz Tools",
  "dz.copy": "Copy",
  "dz.copyDone": "Copied",
  "dz.hub.math": "Math",
  "dz.hub.cooking": "Cooking",
  "dz.hub.islamic": "Islamic & Saudi life",
  "dz.pct.name": "Percentage Calculator",
  "dz.pct.benefit": "Every percentage question, one tool.",
  "dz.pct.title": "Percentage Calculator",
  "dz.pct.pageTitle": "Percentage Calculator — Dzzz",
  "dz.pct.seo": "Work out percentages instantly: a percentage of a number, what percentage one number is of another, percentage increase or decrease, adding or removing a percentage, and reverse percentages. Runs entirely on your device.",
  "dz.pct.modeOf": "% of a number",
  "dz.pct.modeIsWhat": "X is what % of Y",
  "dz.pct.modeChange": "% change",
  "dz.pct.modeAddSub": "Add / subtract %",
  "dz.pct.modeReverse": "Reverse %",
  "dz.pct.lineOf": "What is {a}% of {b}?",
  "dz.pct.lineIsWhat": "{a} is what % of {b}?",
  "dz.pct.lineChange": "What is the % change from {a} to {b}?",
  "dz.pct.lineAdd": "What is {b} plus {a}%?",
  "dz.pct.lineSub": "What is {b} minus {a}%?",
  "dz.pct.lineReverse": "{a} is {b}% of what?",
  "dz.pct.pct": "Percentage",
  "dz.pct.value": "Number",
  "dz.pct.part": "Part",
  "dz.pct.whole": "Whole",
  "dz.pct.from": "From",
  "dz.pct.to": "To",
  "dz.pct.add": "Add",
  "dz.pct.sub": "Subtract",
  "dz.pct.result": "Result",
  "dz.pct.increase": "increase",
  "dz.pct.decrease": "decrease",
  "dz.pct.nochange": "no change",
  "dz.pct.needWhole": "Enter a whole that isn't zero.",
  "dz.pct.needPct": "Enter a percentage that isn't zero.",
  "dz.pct.crossShopping": "Shopping discounts",
  "dz.pct.crossExtras": "VAT add / remove",
  "dz.frac.name": "Fraction Calculator",
  "dz.frac.benefit": "Add, subtract, multiply and divide fractions.",
  "dz.frac.title": "Fraction Calculator",
  "dz.frac.pageTitle": "Fraction Calculator — Dzzz",
  "dz.frac.seo": "Add, subtract, multiply and divide fractions and mixed numbers with automatic simplification, optional step-by-step working, and conversion between fractions, decimals and percentages. Runs entirely on your device.",
  "dz.frac.tabCalc": "Calculate",
  "dz.frac.tabConvert": "Convert",
  "dz.frac.whole": "Whole",
  "dz.frac.num": "Numerator",
  "dz.frac.den": "Denominator",
  "dz.frac.first": "First value",
  "dz.frac.second": "Second value",
  "dz.frac.opAdd": "Add",
  "dz.frac.opSub": "Subtract",
  "dz.frac.opMul": "Multiply",
  "dz.frac.opDiv": "Divide",
  "dz.frac.showSteps": "Show steps",
  "dz.frac.steps": "Working",
  "dz.frac.result": "Result",
  "dz.frac.asMixed": "As a mixed number",
  "dz.frac.asDecimal": "As a decimal",
  "dz.frac.asPercent": "As a percentage",
  "dz.frac.fromDecimal": "Decimal",
  "dz.frac.toFraction": "As a fraction",
  "dz.frac.errDen": "Denominator must not be zero.",
  "dz.frac.errDivZero": "Cannot divide by zero.",
  "dz.frac.errTooBig": "Denominator is too large.",
  "dz.frac.approx": "Approximate — repeating decimals are rounded to the nearest simple fraction.",
  "dz.geo.name": "Area & Volume Calculator",
  "dz.geo.benefit": "Areas and volumes with unit conversion.",
  "dz.geo.title": "Area & Volume Calculator",
  "dz.geo.pageTitle": "Area & Volume Calculator — Dzzz",
  "dz.geo.seo": "Calculate the area of rectangles, triangles, circles, trapezoids and parallelograms, and the volume of boxes, cylinders, spheres, cones and triangular prisms — with metric and imperial units, and land-area units for property sizes. Runs entirely on your device.",
  "dz.geo.tabArea": "Area",
  "dz.geo.tabVolume": "Volume",
  "dz.geo.shape": "Shape",
  "dz.geo.inputUnit": "Measurement unit",
  "dz.geo.resultUnit": "Result unit",
  "dz.geo.result": "Result",
  "dz.geo.landNote": "For property and land, square metres and hectares are the usual units in the Gulf.",
  "dz.geo.rectangle": "Rectangle / square",
  "dz.geo.triangle": "Triangle",
  "dz.geo.circle": "Circle",
  "dz.geo.trapezoid": "Trapezoid",
  "dz.geo.parallelogram": "Parallelogram",
  "dz.geo.box": "Box",
  "dz.geo.cylinder": "Cylinder",
  "dz.geo.sphere": "Sphere",
  "dz.geo.cone": "Cone",
  "dz.geo.prism": "Triangular prism",
  "dz.geo.fieldW": "Width (w)",
  "dz.geo.fieldH": "Height (h)",
  "dz.geo.fieldB": "Base (b)",
  "dz.geo.fieldR": "Radius (r)",
  "dz.geo.fieldA": "Top side (a)",
  "dz.geo.fieldL": "Length (l)",
  "dz.geo.needAll": "Fill in every measurement.",
  "dz.unit.name": "Unit Converter",
  "dz.unit.benefit": "Length, weight, volume, speed and more.",
  "dz.unit.title": "Unit Converter",
  "dz.unit.pageTitle": "Unit Converter — Dzzz",
  "dz.unit.seo": "Convert between units of length, mass, volume, area, speed, temperature, time, digital storage, pressure and energy, using exact standard factors. Runs entirely on your device.",
  "dz.unit.category": "Category",
  "dz.unit.from": "From",
  "dz.unit.to": "To",
  "dz.unit.swap": "Swap units",
  "dz.unit.allTargets": "1 {unit} equals",
  "dz.unit.catLength": "Length",
  "dz.unit.catMass": "Weight / mass",
  "dz.unit.catVolume": "Volume",
  "dz.unit.catArea": "Area",
  "dz.unit.catSpeed": "Speed",
  "dz.unit.catTemperature": "Temperature",
  "dz.unit.catTime": "Time",
  "dz.unit.catStorage": "Digital storage",
  "dz.unit.catPressure": "Pressure",
  "dz.unit.catEnergy": "Energy",
  "dz.unit.storageNote": "KB, MB and GB count in thousands; KiB, MiB and GiB count in 1024s. Both are shown because they are not the same.",
  "dz.unit.timeNote": "Months and years are left out on purpose — their length depends on which month or year you mean.",
  "dz.unit.crossHealth": "Health & lab unit converters",
  "dz.gpa.name": "GPA Calculator",
  "dz.gpa.benefit": "Saudi 5.0 and 4.0, US, percentage or custom.",
  "dz.gpa.title": "GPA Calculator",
  "dz.gpa.pageTitle": "GPA Calculator — Dzzz",
  "dz.gpa.seo": "Calculate semester and cumulative GPA on the Saudi 5.0 and 4.0 scales, the US 4.0 scale with or without plus and minus grades, from percentages, or on a scale you define yourself. Includes transfer credit and a target-GPA planner. Runs entirely on your device.",
  "dz.gpa.scale": "Grade scale",
  "dz.gpa.scaleSaudi5": "Saudi 5.0",
  "dz.gpa.scaleSaudi4": "Saudi 4.0",
  "dz.gpa.scaleUs4plus": "US 4.0 (with +/−)",
  "dz.gpa.scaleUs4": "US 4.0 (letters only)",
  "dz.gpa.scalePercent": "Percentage (0–100)",
  "dz.gpa.scalePoints": "Enter grade points directly",
  "dz.gpa.scaleCustom": "Custom scale",
  "dz.gpa.companion": "Map percentages using",
  "dz.gpa.method": "Method",
  "dz.gpa.methodWeighted": "Weighted by credit hours",
  "dz.gpa.methodSimple": "Simple average",
  "dz.gpa.course": "Course",
  "dz.gpa.credits": "Credits",
  "dz.gpa.grade": "Grade",
  "dz.gpa.addCourse": "Add course",
  "dz.gpa.removeCourse": "Remove course",
  "dz.gpa.semester": "Semester",
  "dz.gpa.addSemester": "Add semester",
  "dz.gpa.removeSemester": "Remove semester",
  "dz.gpa.prior": "Previous record",
  "dz.gpa.priorGpa": "Previous GPA",
  "dz.gpa.priorCredits": "Credits earned",
  "dz.gpa.semesterGpa": "Semester GPA",
  "dz.gpa.cumulative": "Cumulative GPA",
  "dz.gpa.totalCredits": "Total credits",
  "dz.gpa.target": "Target planner",
  "dz.gpa.targetGpa": "Target cumulative GPA",
  "dz.gpa.termCredits": "Credits this term",
  "dz.gpa.required": "You need a {n} GPA this term.",
  "dz.gpa.unreachable": "That target is out of reach this term — the highest possible is {n}.",
  "dz.gpa.customLetter": "Letter",
  "dz.gpa.customPoints": "Points",
  "dz.gpa.addRow": "Add grade",
  "dz.gpa.vary": "Institutions differ in both letter cut-offs and point values. This is an estimate — check your registrar's official scale.",
  "dz.gpa.shareNote": "The link carries the scale and method only — your courses stay on this device.",
  "dz.gpa.saved": "Saved on this device only. Never uploaded, no account.",
  "dz.gpa.clear": "Clear all",
  "dz.gpa.cleared": "Cleared",
  "dz.gpa.needCourses": "Add at least one course with credit hours.",
  "dz.gpa.export": "Copy summary",
  "dz.oven.name": "Oven Temperature Converter",
  "dz.oven.benefit": "°C, °F and gas mark, with a fan setting.",
  "dz.oven.title": "Oven Temperature Converter",
  "dz.oven.pageTitle": "Oven Temperature Converter — Dzzz",
  "dz.oven.seo": "Convert oven temperatures between Celsius, Fahrenheit and UK gas marks using the standard published chart, with a fan/convection adjustment and the exact arithmetic conversion shown alongside it. Runs entirely on your device.",
  "dz.oven.mode": "Enter the temperature as",
  "dz.oven.modeC": "°C",
  "dz.oven.modeF": "°F",
  "dz.oven.modeGas": "Gas mark",
  "dz.oven.temp": "Temperature",
  "dz.oven.gas": "Gas mark",
  "dz.oven.celsius": "Celsius",
  "dz.oven.fahrenheit": "Fahrenheit",
  "dz.oven.fan": "Fan / convection oven",
  "dz.oven.fanOn": "Fan oven",
  "dz.oven.fanOff": "Conventional oven",
  "dz.oven.fanNote": "A fan oven usually needs about 20 °C less than a conventional one. That is a typical figure, not a rule — it varies by oven and by dish.",
  "dz.oven.fanSetting": "Set your fan oven to",
  "dz.oven.conventional": "Conventional oven",
  "dz.oven.result": "Chart setting",
  "dz.oven.exact": "Exact conversion",
  "dz.oven.exactLine": "Exact conversion: {n}",
  "dz.oven.exactMatch": "Exactly on the chart",
  "dz.oven.nearest": "Nearest chart row",
  "dz.oven.nearestGas": "Nearest gas mark",
  "dz.oven.conventionNote": "Oven charts round °C and °F separately to real dial numbers, so they don't match exactly. 180°C is charted as 350°F; the exact conversion is 356°F.",
  "dz.oven.table": "Quick reference chart",
  "dz.oven.colGas": "Gas mark",
  "dz.oven.colC": "°C",
  "dz.oven.colF": "°F",
  "dz.oven.colFan": "Fan °C",
  "dz.oven.enterTemp": "Enter a temperature.",
  "dz.oven.pickGas": "Pick a gas mark.",
  "dz.oven.crossConverter": "Cooking measurement converter",
  "dz.oven.crossScaler": "Recipe scaler",
  "dz.oven.crossUnit": "General unit converter",
  "dz.scaler.name": "Recipe Scaler",
  "dz.scaler.benefit": "Resize any recipe without odd decimals.",
  "dz.scaler.title": "Recipe Scaler",
  "dz.scaler.pageTitle": "Recipe Scaler — Dzzz",
  "dz.scaler.seo": "Scale a recipe up or down by servings, or by pinning one ingredient to the amount you actually have. Volume amounts snap to the fractions a measuring set can really produce, and weights round to a precision a kitchen scale can show. Runs entirely on your device.",
  "dz.scaler.mode": "Scale by",
  "dz.scaler.modeServings": "Servings",
  "dz.scaler.modeIngredient": "One ingredient",
  "dz.scaler.baseServings": "Recipe serves",
  "dz.scaler.targetServings": "You need it to serve",
  "dz.scaler.servings": "Servings",
  "dz.scaler.factor": "Scale factor",
  "dz.scaler.factorLine": "Every amount × {n}",
  "dz.scaler.ingredients": "Ingredients",
  "dz.scaler.amount": "Amount",
  "dz.scaler.unit": "Unit",
  "dz.scaler.ingredient": "Ingredient",
  "dz.scaler.namePlaceholder": "e.g. flour",
  "dz.scaler.addRow": "Add ingredient",
  "dz.scaler.removeRow": "Remove ingredient",
  "dz.scaler.clear": "Clear all",
  "dz.scaler.pin": "Scale by this ingredient",
  "dz.scaler.pinned": "Scaling by",
  "dz.scaler.pinTarget": "Amount you have",
  "dz.scaler.pinPick": "Pick the ingredient to scale by",
  "dz.scaler.scaled": "Scaled recipe",
  "dz.scaler.original": "Original",
  "dz.scaler.quickHalf": "Half",
  "dz.scaler.quickDouble": "Double",
  "dz.scaler.quickTriple": "Triple",
  "dz.scaler.copyList": "Copy scaled list",
  "dz.scaler.needRows": "Add at least one ingredient with an amount.",
  "dz.scaler.errServings": "Servings must be more than zero.",
  "dz.scaler.errAmount": "The pinned ingredient needs an amount above zero.",
  "dz.scaler.roundNote": "Volume amounts snap to the fractions a measuring set can actually produce. Weights round to a precision a kitchen scale can show, never to a fraction — a third of a gram is not something you can measure.",
  "dz.scaler.timeNote": "Scaling changes quantities only. Cooking times, pan sizes and oven temperatures do not scale with them.",
  "dz.scaler.unitCup": "cup",
  "dz.scaler.unitTbsp": "tbsp",
  "dz.scaler.unitTsp": "tsp",
  "dz.scaler.unitMl": "ml",
  "dz.scaler.unitL": "l",
  "dz.scaler.unitG": "g",
  "dz.scaler.unitKg": "kg",
  "dz.scaler.unitOz": "oz",
  "dz.scaler.unitLb": "lb",
  "dz.scaler.unitPiece": "piece",
  "dz.scaler.unitNone": "no unit",
  "dz.scaler.crossConverter": "Cooking measurement converter",
  "dz.scaler.crossOven": "Oven temperature converter",
  "dz.scaler.crossPortion": "Portion planner",
  "dz.scaler.crossSubs": "Ingredient substitutions",
  "dz.cook.name": "Cooking Converter",
  "dz.cook.benefit": "Cups to grams, ingredient by ingredient.",
  "dz.cook.title": "Cooking Measurement Converter",
  "dz.cook.pageTitle": "Cooking Measurement Converter — Dzzz",
  "dz.cook.seo": "Convert cups, tablespoons and teaspoons to grams and millilitres for a specific ingredient, using published weight-per-cup figures from USDA FoodData Central and the King Arthur Baking chart. A cup of flour and a cup of rice do not weigh the same, and every figure here names its source. Runs entirely on your device.",
  "dz.cook.mode": "Convert",
  "dz.cook.modeIngredient": "By ingredient (cups ↔ grams)",
  "dz.cook.modeVolume": "Volume ↔ volume",
  "dz.cook.modeWeight": "Weight ↔ weight",
  "dz.cook.ingredient": "Ingredient",
  "dz.cook.search": "Search ingredients",
  "dz.cook.searchPlaceholder": "Search in Arabic or English",
  "dz.cook.noResults": "No ingredient matched that search.",
  "dz.cook.useGeneric": "Not listed? Use an approximate value",
  "dz.cook.generic": "Other ingredient (approximate)",
  "dz.cook.amount": "Amount",
  "dz.cook.from": "From",
  "dz.cook.to": "To",
  "dz.cook.swap": "Swap units",
  "dz.cook.result": "Result",
  "dz.cook.cupStandard": "Cup size",
  "dz.cook.cupUs": "US cup (236.588 ml)",
  "dz.cook.cupMetric": "Metric cup (250 ml)",
  "dz.cook.cupNote": "A US cup is 236.588 ml and a metric cup is 250 ml — about 5.7% apart. This table is keyed to the US cup its sources publish, so choosing the metric cup rescales the figure instead of quoting the source directly. Tablespoons and teaspoons are fixed and do not change with it.",
  "dz.cook.flourNote": "Flour is the one to watch: King Arthur publishes all-purpose flour at 120 g per cup spooned and levelled, and notes that a densely packed cup can reach about 160 g — roughly a third more. Which you get depends on how you fill the cup, so the two are never averaged here.",
  "dz.cook.approxNote": "Approximate. This uses the density of water (1 g/ml) because the ingredient is not in the table, and real densities vary a lot between ingredients — treat the result as a rough guide, not a measurement.",
  "dz.cook.perCup": "Per US cup",
  "dz.cook.density": "Density",
  "dz.cook.source": "Source",
  "dz.cook.note": "Note",
  "dz.cook.confidence": "Confidence",
  "dz.cook.confPublished": "Published figure",
  "dz.cook.confDerived": "Derived from a published figure",
  "dz.cook.confEstimate": "Estimate",
  "dz.cook.viewSource": "View source",
  "dz.cook.count": "{n} ingredients with published weights",
  "dz.cook.excluded": "Some ingredients are deliberately left out because no primary source publishes a weight per cup for them. A guessed number would be worse than none.",
  "dz.cook.unitCup": "cup",
  "dz.cook.unitTbsp": "tbsp",
  "dz.cook.unitTsp": "tsp",
  "dz.cook.unitMl": "ml",
  "dz.cook.unitL": "l",
  "dz.cook.unitFloz": "fl oz (US)",
  "dz.cook.unitG": "g",
  "dz.cook.unitKg": "kg",
  "dz.cook.unitOz": "oz",
  "dz.cook.unitLb": "lb",
  "dz.cook.crossSubs": "Ingredient substitutions",
  "dz.cook.crossScaler": "Recipe scaler",
  "dz.cook.crossOven": "Oven temperature converter",
  "dz.cook.crossUnit": "General unit converter",
  "dz.subs.name": "Ingredient Substitutions",
  "dz.subs.benefit": "Out of something? Swap it properly.",
  "dz.subs.title": "Ingredient Substitutions",
  "dz.subs.pageTitle": "Ingredient Substitutions — Dzzz",
  "dz.subs.seo": "Find what to use instead of buttermilk, cake flour, baking powder, heavy cream, tahini and more — with the ratio each publisher actually states and the caveats that come with it. Sources include King Arthur Baking, university extension services and America's Test Kitchen. Runs entirely on your device.",
  "dz.subs.search": "What have you run out of?",
  "dz.subs.searchPlaceholder": "Search in Arabic or English",
  "dz.subs.noResults": "Nothing matched that search. Try the ingredient's other name.",
  "dz.subs.browseAll": "Browse all ingredients",
  "dz.subs.results": "{n} matches",
  "dz.subs.forAmount": "Ratio stated for",
  "dz.subs.options": "Use instead",
  "dz.subs.option": "Substitute",
  "dz.subs.caveat": "Watch out",
  "dz.subs.source": "Source",
  "dz.subs.varyNote": "Publishers do not always agree on these ratios, so every option names the source it came from. Where two reputable sources differ, both are shown rather than one being picked for you.",
  "dz.subs.tasteNote": "A substitute changes texture or flavour more often than not, and baking is the least forgiving — expect a slightly different result.",
  "dz.subs.count": "{n} ingredients covered",
  "dz.subs.crossConverter": "Cooking measurement converter",
  "dz.subs.crossScaler": "Recipe scaler",
  "dz.portion.name": "Portion Planner",
  "dz.portion.benefit": "How much to cook for your guests.",
  "dz.portion.title": "Portion Planner",
  "dz.portion.pageTitle": "Portion Planner — Dzzz",
  "dz.portion.seo": "Plan how much rice, meat, salad, bread and drinks to prepare for a gathering. Every quantity is a range drawn from common hosting practice rather than a fixed standard, with a serving-style multiplier you control. Runs entirely on your device.",
  "dz.portion.guests": "Guests",
  "dz.portion.occasion": "Serving style",
  "dz.portion.occLight": "Light",
  "dz.portion.occNormal": "Normal",
  "dz.portion.occGenerous": "Generous",
  "dz.portion.occLightHint": "A buffet with many dishes, or a lighter meal.",
  "dz.portion.occNormalHint": "An ordinary family meal.",
  "dz.portion.occGenerousHint": "Hosting where leftovers are expected.",
  "dz.portion.multiplier": "Multiplier ×{n}",
  "dz.portion.catMain": "Main",
  "dz.portion.catProtein": "Meat & poultry",
  "dz.portion.catSide": "Sides & extras",
  "dz.portion.perPerson": "Per person",
  "dz.portion.forGuests": "For {n} guests",
  "dz.portion.total": "Total",
  "dz.portion.item": "Item",
  "dz.portion.quantity": "Quantity",
  "dz.portion.estimateNote": "Commonly used hosting estimates — not an official standard. Gulf hosting errs generous; adjust to taste.",
  "dz.portion.rangeNote": "Every figure is a range on purpose. Appetites, how many dishes are on the table and how long the gathering runs all move it.",
  "dz.portion.copyList": "Copy shopping list",
  "dz.portion.listTitle": "Shopping list",
  "dz.portion.errGuests": "Enter at least one guest.",
  "dz.portion.unitG": "g",
  "dz.portion.unitMl": "ml",
  "dz.portion.unitPiece": "pieces",
  "dz.portion.unitBird": "whole chickens",
  "dz.portion.noNutrition": "Quantities only — this planner carries no calorie or nutrition data.",
  "dz.portion.crossCalorie": "Calorie calculator",
  "dz.portion.crossScaler": "Recipe scaler",
  "dz.portion.crossConverter": "Cooking measurement converter",
  "dz.qibla.name": "Qibla Finder",
  "dz.qibla.benefit": "The direction of the Kaaba from where you are.",
  "dz.qibla.title": "Qibla Finder",
  "dz.qibla.tagNew": "New",
  "dz.qibla.pageTitle": "Qibla Finder — direction of the Kaaba — Dzzz",
  "dz.qibla.seo": "Find the qibla from wherever you are. The great-circle bearing to the Kaaba is computed on your device from your own coordinates — a live compass when your phone has the sensor, and a static bearing you can align against any compass when it does not. No account, no server, works offline.",
  "dz.qibla.gateTitle": "Find the qibla from where you are",
  "dz.qibla.gateBody": "We compute the great-circle direction to the Kaaba from your coordinates — entirely on your device.",
  "dz.qibla.useLocation": "Use my location",
  "dz.qibla.enterCity": "Enter a city or coordinates instead",
  "dz.qibla.privacy": "Your coordinates never leave the device — no request is sent to any server.",
  "dz.qibla.gateNote": "Your phone asks for an explicit tap before the compass sensor can be read. This screen is that tap. If permission is declined we go straight to the sensorless view — never a dead end.",
  "dz.qibla.locating": "Finding your location…",
  "dz.qibla.denied": "Location permission was declined — enter a city or coordinates instead.",
  "dz.qibla.unsupported": "Location isn't available here — enter a city or coordinates instead.",
  "dz.qibla.retry": "Try again",
  "dz.qibla.back": "Back",
  "dz.qibla.change": "Change",
  "dz.qibla.location": "Location",
  "dz.qibla.coords": "Coordinates",
  "dz.qibla.bearing": "Qibla",
  "dz.qibla.fromNorth": "from true north",
  "dz.qibla.direction": "Direction",
  "dz.qibla.aligned": "Aligned — you are facing the qibla",
  "dz.qibla.turn": "Turn until the arrow points up",
  "dz.qibla.calibrate": "Readings look unstable — move the phone in a figure-8 to recalibrate the compass.",
  "dz.qibla.heading": "Device heading",
  "dz.qibla.headingSource": "Heading source",
  "dz.qibla.sourceTrue": "iOS compass — already true north.",
  "dz.qibla.sourceMagnetic": "Magnetic heading — it can differ from true north by a few degrees.",
  "dz.qibla.sourceMagneticCorrected": "Magnetic heading, corrected to true north with the WMM2025 model.",
  "dz.qibla.declination": "Magnetic declination",
  "dz.qibla.declinationApplied": "Corrected by {deg}° for magnetic declination at your location.",
  "dz.qibla.declinationStale": "The magnetic model has expired, so the heading is shown as uncorrected magnetic north.",
  "dz.qibla.noSensor": "No compass on this device (or permission declined) — here is the bearing, and a rose you can align with any compass.",
  "dz.qibla.face": "Face",
  "dz.qibla.roseHint": "Align the rose with a physical compass or a paper map; the red arm is the qibla.",
  "dz.qibla.map": "Direction to Makkah",
  "dz.qibla.mapDist": "great-circle distance",
  "dz.qibla.makkah": "Makkah",
  "dz.qibla.mapNote": "The dashed line is the great-circle path; on a flat map it is not a straight visual line, which is exactly why the bearing number leads.",
  "dz.qibla.distance": "Distance to the Kaaba",
  "dz.qibla.km": "km",
  "dz.qibla.city": "City",
  "dz.qibla.cityPh": "Start typing a city…",
  "dz.qibla.noCity": "No city matches that search — enter coordinates instead.",
  "dz.qibla.lat": "Latitude",
  "dz.qibla.lon": "Longitude",
  "dz.qibla.compute": "Compute qibla",
  "dz.qibla.useCity": "Pick a city",
  "dz.qibla.useCoords": "Enter coordinates",
  "dz.qibla.manualNote": "City search resolves from a list bundled with the tool — no geocoding request is made. Coordinates are decimal degrees.",
  "dz.qibla.errCoords": "Latitude must be between -90 and 90, and longitude between -180 and 180.",
  "dz.qibla.atKaaba": "You are at the Kaaba — face it directly.",
  "dz.qibla.honesty": "Directional guidance — verify with a reliable source; phone compasses can be affected by metal and magnets.",
  "dz.qibla.copyLine": "Qibla from {city}: {bearing}° ({point}) — {km} km to the Kaaba",
  "dz.islamic.name": "Islamic Dates & Countdowns",
  "dz.islamic.benefit": "Ramadan, both Eids and more — how long is left.",
  "dz.islamic.title": "Islamic Dates & Countdowns",
  "dz.islamic.tagNew": "New",
  "dz.islamic.pageTitle": "Islamic Dates & Countdowns — Ramadan and Eid — Dzzz",
  "dz.islamic.seo": "How long until Ramadan, Eid al-Fitr, the Day of Arafah, Eid al-Adha, the Islamic New Year and Ashura. Every date is calculated on your device with the Umm al-Qura calendar, shown in Hijri and Gregorian side by side, with a calendar file for each event.",
  "dz.islamic.caveat": "Dates are calculated using the Umm al-Qura calendar. The actual start depends on official moon sighting and may differ by a day.",
  "dz.islamic.newYear": "Islamic New Year",
  "dz.islamic.ashura": "Ashura",
  "dz.islamic.ramadan": "Ramadan",
  "dz.islamic.eidFitr": "Eid al-Fitr",
  "dz.islamic.arafah": "Day of Arafah",
  "dz.islamic.eidAdha": "Eid al-Adha",
  "dz.islamic.next": "Next up",
  "dz.islamic.selected": "Selected",
  "dz.islamic.show": "Show",
  "dz.islamic.showFor": "Show {name} at the top",
  "dz.islamic.nearest": "Show the nearest",
  "dz.islamic.all": "All events",
  "dz.islamic.days": "days",
  "dz.islamic.hours": "hours",
  "dz.islamic.minutes": "min",
  "dz.islamic.hijri": "Hijri",
  "dz.islamic.greg": "Gregorian",
  "dz.islamic.weekday": "Day",
  "dz.islamic.addCalendar": "Add to calendar",
  "dz.islamic.addCalendarFor": "Add {name} to calendar",
  "dz.islamic.copyLine": "Copy line",
  "dz.islamic.shareLine": "{name} in {n} days — {hijri} / {greg}",
  "dz.islamic.shareToday": "{name} is today — {hijri} / {greg}",
  "dz.islamic.today": "Today",
  "dz.islamic.tomorrow": "Tomorrow",
  "dz.islamic.inDays": "in {n} days",
  "dz.islamic.daysLeft": "{n} days left",
  "dz.islamic.note": "Calculated on your device with the Umm al-Qura calendar — no network request is made.",
  "dz.islamic.noSeconds": "Seconds are left out on purpose — on a countdown measured in weeks they are noise.",
  "dz.islamic.icsFile": "islamic-event",
  "dz.islamic.outOfRange": "This date falls outside the supported range (1900–2077).",
  "dz.payday.name": "Salary Countdown",
  "dz.payday.benefit": "Days to payday, weekends and holidays included.",
  "dz.payday.title": "Salary Countdown",
  "dz.payday.tagNew": "New",
  "dz.payday.pageTitle": "Salary Countdown — Saudi payday — Dzzz",
  "dz.payday.seo": "Work out when your salary is likely to land. Set a fixed day of the month, the last working day, or the Nth working day; the Saudi Friday–Saturday weekend and public holidays shift it earlier or later, and the next six paydays are listed so you can check the result yourself. Runs entirely on your device.",
  "dz.payday.framing": "Estimates based on common practice — your employer's actual payday may differ. Not a guarantee.",
  "dz.payday.nextPay": "Next payday",
  "dz.payday.settings": "Payday rule",
  "dz.payday.rule": "How your payday is set",
  "dz.payday.ruleFixed": "Day of month",
  "dz.payday.ruleLastWorking": "Last working day",
  "dz.payday.ruleNthWorking": "Nth working day",
  "dz.payday.dayOfMonth": "Day of month",
  "dz.payday.dayHint": "Default 27 — the Saudi public-sector convention. If a month is shorter, its last day is used.",
  "dz.payday.dayUp": "Later in the month",
  "dz.payday.dayDown": "Earlier in the month",
  "dz.payday.nthLabel": "Which working day",
  "dz.payday.nthHint": "Counted from the 1st, skipping Friday, Saturday and holidays.",
  "dz.payday.nthUp": "Later working day",
  "dz.payday.nthDown": "Earlier working day",
  "dz.payday.shiftMode": "If payday falls on a weekend or holiday",
  "dz.payday.early": "Pay earlier",
  "dz.payday.late": "Pay later",
  "dz.payday.earlyHint": "Default: steps back to the last working day before the weekend or holiday — what most employers do.",
  "dz.payday.lateHint": "Steps forward to the next working day instead. Some employers do this; it is never assumed for you.",
  "dz.payday.holidays": "Account for Saudi public holidays",
  "dz.payday.holidaysHint": "Uses the announced dates in the bundled list. Official dates and durations change from year to year.",
  "dz.payday.weekendNote": "The Saudi weekend is Friday and Saturday.",
  "dz.payday.effective": "Effective payday",
  "dz.payday.raw": "Unshifted date",
  "dz.payday.rawWas": "Unshifted: {raw}",
  "dz.payday.noShift": "Lands on a working day — no shift.",
  "dz.payday.days": "days",
  "dz.payday.hours": "hours",
  "dz.payday.minutes": "min",
  "dz.payday.shiftNote": "The {day} falls on a {weekday} ({raw}) — most employers pay on {eff} instead.",
  "dz.payday.shiftNoteEarly": "The {day} falls on a {weekday} ({raw}) — most employers pay earlier, on {eff}.",
  "dz.payday.shiftNoteLate": "The {day} falls on a {weekday} ({raw}) — with pay later selected, that moves to {eff}.",
  "dz.payday.shiftNoteHoliday": "{raw} falls inside a public holiday ({holiday}) — the payday shown is {eff}.",
  "dz.payday.schedule": "Next six paydays",
  "dz.payday.scheduleHint": "shift shown",
  "dz.payday.colMonth": "Month",
  "dz.payday.colPayday": "Payday",
  "dz.payday.colReason": "Reason",
  "dz.payday.colTag": "Tag",
  "dz.payday.tagExact": "Exact",
  "dz.payday.tagWeekend": "Weekend",
  "dz.payday.tagHoliday": "Holiday",
  "dz.payday.tagApproximate": "Approximate",
  "dz.payday.approximateHint": "That year's holiday dates have not been announced yet, so the window is derived from the Hijri calendar.",
  "dz.payday.engineNote": "Raw date → if it lands on Friday or Saturday, step in the chosen direction; re-test; if the result is a public holiday, step again by the same rule, until a working day is found. Both dates are shown so the shift can be checked.",
  "dz.payday.local": "Settings are saved on this device only — never uploaded, no account.",
  "dz.payday.clear": "Clear settings",
  "dz.payday.cleared": "Cleared",
  "dz.payday.holidayData": "Holiday list version {version}, checked {retrieved}.",
  "dz.payday.holidaySource": "Source: {source}",
  "dz.payday.copyLine": "Next payday: {eff} — {n} days away",
  "dz.coffee.name": "Coffee Brew Calculator",
  "dz.coffee.benefit": "Ratio, absorbed water and a live pour timer.",
  "dz.coffee.title": "Coffee Brew Calculator",
  "dz.coffee.pageTitle": "Coffee Brew Calculator — Dzzz",
  "dz.coffee.seo": "Work out your coffee dose, the brew water and the yield that actually reaches the cup. Grounds keep roughly 2 g of water per gram of coffee, and this calculator subtracts it instead of pretending it away. Seven brewing methods, a staged pour plan with cumulative scale targets, and a live timer that keeps the screen awake while you brew. Runs entirely on your device.",
  "dz.coffee.methodV60": "V60",
  "dz.coffee.methodChemex": "Chemex",
  "dz.coffee.methodAeropress": "AeroPress",
  "dz.coffee.methodFrenchpress": "French press",
  "dz.coffee.methodMoka": "Moka pot",
  "dz.coffee.methodColdbrew": "Cold brew",
  "dz.coffee.methodEspresso": "Espresso",
  "dz.coffee.method.v60": "V60",
  "dz.coffee.method.chemex": "Chemex",
  "dz.coffee.method.aeropress": "AeroPress",
  "dz.coffee.method.frenchpress": "French press",
  "dz.coffee.method.moka": "Moka pot",
  "dz.coffee.method.coldbrew": "Cold brew",
  "dz.coffee.method.espresso": "Espresso",
  "dz.coffee.grindMediumFine": "Medium-fine",
  "dz.coffee.grindMediumCoarse": "Medium-coarse",
  "dz.coffee.grindFineMedium": "Fine-medium",
  "dz.coffee.grindCoarse": "Coarse",
  "dz.coffee.grindFine": "Fine",
  "dz.coffee.grindVeryCoarse": "Very coarse",
  "dz.coffee.grindVeryFine": "Very fine",
  "dz.coffee.temp9296": "92–96 °C",
  "dz.coffee.temp8090": "80–90 °C",
  "dz.coffee.temp9295": "92–95 °C",
  "dz.coffee.tempStovetop": "Stovetop heat",
  "dz.coffee.tempCold": "20 °C or fridge-cold",
  "dz.coffee.timeV60": "2:45–3:15",
  "dz.coffee.timeChemex": "3:30–4:30",
  "dz.coffee.timeAeropress": "1:30–2:30",
  "dz.coffee.timeFrenchpress": "4:00–5:00",
  "dz.coffee.timeMoka": "3:00–4:00",
  "dz.coffee.timeColdbrew": "14–18 h",
  "dz.coffee.timeEspresso": "25–32 s",
  "dz.coffee.time.v60": "2:45–3:15",
  "dz.coffee.time.chemex": "3:30–4:30",
  "dz.coffee.time.aeropress": "1:30–2:30",
  "dz.coffee.time.frenchpress": "4:00–5:00",
  "dz.coffee.time.moka": "3:00–4:00",
  "dz.coffee.time.coldbrew": "14–18 h",
  "dz.coffee.time.espresso": "25–32 s",
  "dz.coffee.method": "Method",
  "dz.coffee.methodRow": "Brewing method",
  "dz.coffee.solveFor": "Solve for",
  "dz.coffee.solveDose": "I have beans",
  "dz.coffee.solveYield": "I want a cup size",
  "dz.coffee.solveDoseShort": "Dose → yield",
  "dz.coffee.solveYieldShort": "Yield → dose",
  "dz.coffee.hintDose": "Enter your dose — we work out the brew water and what actually reaches the cup.",
  "dz.coffee.hintYield": "Enter the cup size you want — we work back to the dose, absorption included.",
  "dz.coffee.doseLabel": "Coffee dose",
  "dz.coffee.yieldLabel": "Desired yield in cup",
  "dz.coffee.ratio": "Ratio",
  "dz.coffee.ratioValue": "1:{n}",
  "dz.coffee.ratioRange": "1:12 to 1:20",
  "dz.coffee.strong": "Strong",
  "dz.coffee.balanced": "Balanced",
  "dz.coffee.light": "Light",
  "dz.coffee.presetStrong": "Strong",
  "dz.coffee.presetBalanced": "Balanced",
  "dz.coffee.presetLight": "Light",
  "dz.coffee.cups": "Cups",
  "dz.coffee.cup1": "1 cup",
  "dz.coffee.cup2": "2 cups",
  "dz.coffee.cup4": "4 cups",
  "dz.coffee.cupsLine": "≈ {n} cups at 220 g",
  "dz.coffee.cupSize": "Cup size",
  "dz.coffee.decrease": "Decrease",
  "dz.coffee.increase": "Increase",
  "dz.coffee.dose": "Dose",
  "dz.coffee.gCoffee": "g coffee",
  "dz.coffee.totalWater": "Total brew water",
  "dz.coffee.gWater": "g water",
  "dz.coffee.yieldInCup": "Expected yield in cup",
  "dz.coffee.g": "g",
  "dz.coffee.ml": "ml",
  "dz.coffee.kept": "Kept by grounds",
  "dz.coffee.inCup": "In cup",
  "dz.coffee.inGrounds": "Kept by grounds",
  "dz.coffee.subtraction": "{water} g water − {kept} g kept by grounds = {yield} g in the cup",
  "dz.coffee.absorbLine": "{water} g water − {kept} g kept by grounds = {yield} g in the cup",
  "dz.coffee.bypassLine": "plus {n} g of bypass water added to the cup",
  "dz.coffee.grind": "Grind",
  "dz.coffee.temp": "Water",
  "dz.coffee.brewTime": "Total time",
  "dz.coffee.absorptionNote": "Grounds keep water. The water you pour is not the water that reaches the cup — a 1:16 brew with 288 g of water pours barely 250 g, and most calculators never subtract it.",
  "dz.coffee.espressoNote": "Espresso is different: the ratio is dose to liquid in the cup, so there is no absorption step to subtract. 18 g at 1:2.2 is a 39.6 g shot.",
  "dz.coffee.rangesNote": "Every figure here is a starting point to adjust to taste, not a rule. Beans, grinder, water and kit all move the target.",
  "dz.coffee.schedulePour": "Pour schedule",
  "dz.coffee.scheduleSteep": "Brew steps",
  "dz.coffee.scheduleEspresso": "Shot steps",
  "dz.coffee.cumulative": "cumulative targets",
  "dz.coffee.cumulativeNote": "Targets are cumulative — that is what your scale reads.",
  "dz.coffee.stageBloom": "Bloom",
  "dz.coffee.stagePour": "Pour",
  "dz.coffee.stagePourN": "Pour {n}",
  "dz.coffee.stageDrawdown": "Drawdown",
  "dz.coffee.stageAdd": "Add water",
  "dz.coffee.stageSteep": "Steep",
  "dz.coffee.stageStir": "Stir once",
  "dz.coffee.stageBreakCrust": "Break the crust",
  "dz.coffee.stagePress": "Press and serve",
  "dz.coffee.stageFilter": "Filter and serve",
  "dz.coffee.stagePreinfusion": "Pre-infusion",
  "dz.coffee.stagePull": "Pull",
  "dz.coffee.detailBloom": "Pour to {n} g and let it bloom",
  "dz.coffee.detailPour": "Pour to {n} g by {t}",
  "dz.coffee.detailDrawdown": "Let the bed drain — last drips near {t}",
  "dz.coffee.detailAdd": "Add all {n} g of water, then stir once",
  "dz.coffee.detailSteep": "Lid on, no stirring, until {t}",
  "dz.coffee.detailBreakCrust": "Skim the foam and floating grounds off the top",
  "dz.coffee.detailPress": "Press slowly — expect about {n} g in the cup",
  "dz.coffee.detailFilter": "Strain it off the grounds — expect about {n} g",
  "dz.coffee.detailPreinfusion": "Low pressure — wet the puck evenly",
  "dz.coffee.detailPull": "Pull to {n} g by {t}",
  "dz.coffee.pourTo": "Pour to {n} g",
  "dz.coffee.targetAt": "{n} g at {t}",
  "dz.coffee.byTime": "by {t}",
  "dz.coffee.noTarget": "No weight target",
  "dz.coffee.startBrew": "Start brewing",
  "dz.coffee.timerTitle": "Brew timer",
  "dz.coffee.start": "Start",
  "dz.coffee.pause": "Pause",
  "dz.coffee.resume": "Resume",
  "dz.coffee.reset": "Reset",
  "dz.coffee.done": "Brew complete",
  "dz.coffee.nowLabel": "Now",
  "dz.coffee.thenLabel": "Then",
  "dz.coffee.plan": "Brew plan",
  "dz.coffee.elapsed": "Elapsed",
  "dz.coffee.totalTime": "Total",
  "dz.coffee.remaining": "Remaining",
  "dz.coffee.progressLabel": "Brew progress",
  "dz.coffee.stageOf": "Stage {n} of {total}",
  "dz.coffee.jumpToStage": "Jump to this stage",
  "dz.coffee.stageDone": "Done",
  "dz.coffee.stageNow": "Now",
  "dz.coffee.stageNext": "Next",
  "dz.coffee.wakeOn": "Screen stays on",
  "dz.coffee.wakeNote": "The screen is kept awake while the timer runs and released the moment you pause or reset.",
  "dz.coffee.wakeUnsupported": "The screen may not stay awake here — it may dim mid-brew.",
  "dz.coffee.cues": "Sound and vibration at each stage",
  "dz.coffee.cuesOn": "On",
  "dz.coffee.cuesOff": "Off (default)",
  "dz.coffee.on": "On",
  "dz.coffee.off": "Off",
  "dz.coffee.hoursClock": "{h} h {m} min",
  "dz.coffee.longBrewNote": "Cold brew runs for hours, so the clock counts in hours — you do not need to keep this page open.",
  "dz.coffee.immersionNote": "No pour stages — steep, then press.",
  "dz.coffee.immersionFoot": "Immersion and cold brew get steps instead of cumulative pour targets, and cold brew switches the clock to hours.",
  "dz.coffee.advanced": "Advanced",
  "dz.coffee.absorption": "Water kept by grounds",
  "dz.coffee.absorptionValue": "{n} g per gram of coffee",
  "dz.coffee.absorptionUnit": "g/g",
  "dz.coffee.absorptionHint": "About 2 g per gram of coffee is a reliable starting point. Coarser grinds and deeper beds keep a little more — adjust it if your scale disagrees.",
  "dz.coffee.mathLabel": "The maths, in the open",
  "dz.coffee.mathWater": "brew water = {dose} × {ratio} = {water} g",
  "dz.coffee.mathKept": "kept by grounds = {dose} × {abs} = {kept} g",
  "dz.coffee.mathYield": "in the cup = {water} − {kept} = {yield} g",
  "dz.coffee.splitLabel": "Where the water goes",
  "dz.coffee.splitLine": "{pct}% of the brew water reaches the cup; the rest stays in the grounds.",
  "dz.coffee.bypass": "Bypass water added after brewing",
  "dz.coffee.bypassHint": "Added straight to the cup rather than through the coffee bed — it raises the yield without changing the extraction.",
  "dz.coffee.guidance": "Method guidance",
  "dz.coffee.guideFoot": "Starting points to adjust to taste, not rules. Every figure is a range because beans, grinders and water all move the target.",
  "dz.coffee.colMethod": "Method",
  "dz.coffee.colRatio": "Ratio",
  "dz.coffee.colGrind": "Grind",
  "dz.coffee.colTemp": "Water",
  "dz.coffee.colTime": "Total time",
  "dz.coffee.saved": "Saved recipes",
  "dz.coffee.savedCount": "{n} on this device",
  "dz.coffee.savedEmpty": "Nothing saved yet — set up a brew and save it.",
  "dz.coffee.saveRecipe": "Save recipe",
  "dz.coffee.recipeSaved": "Recipe saved",
  "dz.coffee.recipeName": "Recipe name",
  "dz.coffee.recipeNamePlaceholder": "Morning V60",
  "dz.coffee.brew": "Brew",
  "dz.coffee.deleteRecipe": "Delete recipe",
  "dz.coffee.clearAll": "Clear all saved recipes",
  "dz.coffee.savedFoot": "Recipes stay on this device only — method, ratio, dose and absorption travel together.",
  "dz.coffee.privacyNote": "Your settings and saved recipes stay on this device. Nothing is uploaded, and there is no account.",
  "dz.coffee.copyRecipe": "Copy summary",
  "dz.coffee.summaryLabel": "Summary",
  "dz.coffee.errDose": "Enter a dose above zero.",
  "dz.coffee.errYield": "Enter a cup size above zero.",
  "dz.coffee.errRatio": "Enter a ratio above zero.",
  "dz.coffee.errBypass": "Bypass water cannot be negative.",
  "dz.coffee.errAbsorption": "At this ratio the grounds would keep every drop, so nothing would reach the cup. Lower the absorption or raise the ratio.",
  "dz.coffee.errBloom": "The bloom alone needs more water than the whole brew. Raise the ratio or lower the dose.",
  "dz.coffee.errBypassTooBig": "The bypass water is more than the cup you asked for.",
  "dz.coffee.errGeneric": "Check the numbers — that combination cannot be brewed.",
  "dz.coffee.cookingLink": "Cooking tools — scaling, conversions and timers",
  "dz.coffee.crossScaler": "Recipe scaler",
  "dz.coffee.crossConverter": "Cooking measurement converter",
  "dz.coffee.crossOven": "Oven temperature converter",
  "dz.coffee.crossUnit": "General unit converter",
  "dz.baloot.name": "Baloot Score Keeper",
  "dz.baloot.benefit": "Keep the صكة — أبناط, مشاريع and the maths done right.",
  "dz.baloot.title": "Baloot Score Keeper",
  "dz.baloot.pageTitle": "Baloot Score Keeper — Dzzz",
  "dz.baloot.seo": "A scoreboard for real Baloot at the majlis: pick صن or حكم, enter the أبناط of whichever side counted, and the other side fills itself in. مشاريع, doubling, كبوت, تحت and تعادل all follow the Saudi federation's اللائحة العامة, and every round shows its arithmetic before you save it, so a disputed hand can be checked by eye. Totals are large enough to read from across the table, and an interrupted صكة comes back exactly as you left it. Everything stays on your device — no account, nothing uploaded.",
  "dz.baloot.teamUs": "Us",
  "dz.baloot.teamThem": "Them",
  "dz.baloot.teams": "Teams",
  "dz.baloot.teamName": "Team name",
  "dz.baloot.editNames": "Edit names",
  "dz.baloot.renameTeam": "Rename {team}",
  "dz.baloot.saveNames": "Save names",
  "dz.baloot.namesHint": "Names are remembered on this device for next time.",
  "dz.baloot.mode": "Mode",
  "dz.baloot.modeQuestion": "صن or حكم?",
  "dz.baloot.mode.sun": "صن (Sun)",
  "dz.baloot.mode.hokom": "حكم (Hokom)",
  "dz.baloot.modeSun": "صن (Sun)",
  "dz.baloot.modeHokom": "حكم (Hokom)",
  "dz.baloot.modeSunShort": "صن",
  "dz.baloot.modeHokomShort": "حكم",
  "dz.baloot.modeSunTotal": "130 أبناط → 26 points",
  "dz.baloot.modeHokomTotal": "162 أبناط → 16 points",
  "dz.baloot.modeSunHint": "No trump suit — every suit counts the same.",
  "dz.baloot.modeHokomHint": "The trump suit carries the higher card values.",
  "dz.baloot.modeTotalAbnat": "{n} أبناط",
  "dz.baloot.modeTotalPoints": "{n} points",
  "dz.baloot.counted": "Who counted?",
  "dz.baloot.countedShort": "Counted by",
  "dz.baloot.countedHint": "Only one side counts at the table; the rest is filled in for you.",
  "dz.baloot.countedTeam": "{team} counted",
  "dz.baloot.abnat": "أبناط",
  "dz.baloot.abnatUnit": "أبناط",
  "dz.baloot.abnatOf": "{team}'s أبناط",
  "dz.baloot.abnatOther": "The other side's أبناط",
  "dz.baloot.abnatAuto": "The rest: {n}",
  "dz.baloot.abnatOutOf": "of {total}",
  "dz.baloot.abnatEnter": "Enter أبناط",
  "dz.baloot.abnatSplit": "{us} / {them} أبناط",
  "dz.baloot.bidder": "Bidder",
  "dz.baloot.bidderQuestion": "Who bought the round?",
  "dz.baloot.bidderHint": "The side that bought the round: reach the mark, or go تحت.",
  "dz.baloot.bidderBadge": "bidder",
  "dz.baloot.projects": "Projects (مشاريع)",
  "dz.baloot.projectsFor": "{team}'s مشاريع",
  "dz.baloot.projectsNone": "No projects",
  "dz.baloot.projectsHint": "Tap what each side declared — values differ between صن and حكم.",
  "dz.baloot.project.sira": "سرا (Sira)",
  "dz.baloot.project.fifty": "خمسين (Fifty)",
  "dz.baloot.project.hundred": "مية (Hundred)",
  "dz.baloot.project.fourHundred": "أربعمية (Four hundred)",
  "dz.baloot.project.baloot": "بلوت (Baloot)",
  "dz.baloot.projectSira": "سرا (Sira)",
  "dz.baloot.projectFifty": "خمسين (Fifty)",
  "dz.baloot.projectHundred": "مية (Hundred)",
  "dz.baloot.projectFourHundred": "أربعمية (Four hundred)",
  "dz.baloot.projectBaloot": "بلوت (Baloot)",
  "dz.baloot.projectDesc.sira": "Three cards in sequence",
  "dz.baloot.projectDesc.fifty": "Four cards in sequence",
  "dz.baloot.projectDesc.hundred": "Five in sequence, or four of a kind",
  "dz.baloot.projectDesc.fourHundred": "Four aces",
  "dz.baloot.projectDesc.baloot": "King and Queen of the trump suit",
  "dz.baloot.projectChip": "{name} · {n}",
  "dz.baloot.projectValue": "{n} points",
  "dz.baloot.projectTotal": "مشاريع {n}",
  "dz.baloot.projectNoteFourHundredHokom": "Four aces in حكم score as a مية (10) — أربعمية does not exist in حكم.",
  "dz.baloot.projectNoteHundred": "Four of a kind only counts as a مية for 10 / J / Q / K / A — four 9s, 8s or 7s are not a project.",
  "dz.baloot.projectNoteBaloot": "بلوت exists in حكم only.",
  "dz.baloot.projectNoteFourHundredSun": "أربعمية exists in صن only.",
  "dz.baloot.projectNoteMoves": "A declared project moves the pass mark — 82 and 66 hold «اللعبة صافية بدون مشاريع» only.",
  "dz.baloot.double": "Doubling",
  "dz.baloot.doubleQuestion": "Any doubling?",
  "dz.baloot.double.none": "None",
  "dz.baloot.double.double": "دبل (double)",
  "dz.baloot.double.three": "ثري (three)",
  "dz.baloot.double.four": "فور (four)",
  "dz.baloot.double.gahwa": "قهوة (gahwa)",
  "dz.baloot.doubleNone": "None",
  "dz.baloot.doubleDouble": "دبل (double)",
  "dz.baloot.doubleThree": "ثري (three)",
  "dz.baloot.doubleFour": "فور (four)",
  "dz.baloot.doubleGahwa": "قهوة (gahwa)",
  "dz.baloot.doubleFactor": "×{n}",
  "dz.baloot.doubleHint": "Doubling multiplies the round's points.",
  "dz.baloot.gahwaNote": "قهوة is the top of the doubling ladder in حكم — winning that round wins the whole صكة.",
  "dz.baloot.gahwaWon": "قهوة — the whole صكة goes to {team}.",
  "dz.baloot.doubleHokomOnly": "The ladder in حكم: دبل, ثري, فور, قهوة.",
  "dz.baloot.kaboot": "كبوت (Kaboot)",
  "dz.baloot.kabootQuestion": "Was it a كبوت?",
  "dz.baloot.kabootNone": "No",
  "dz.baloot.kabootBy": "كبوت for {team}",
  "dz.baloot.kabootHint": "All eight tricks to one side.",
  "dz.baloot.kabootNote": "كبوت replaces the round score rather than adding to it: 25 in حكم, 44 in صن, plus that side's مشاريع.",
  "dz.baloot.kabootHokomValue": "25 in حكم",
  "dz.baloot.kabootSunValue": "44 in صن",
  "dz.baloot.kabootBadge": "كبوت",
  "dz.baloot.outcome": "Outcome",
  "dz.baloot.outcome.made": "Contract made",
  "dz.baloot.outcome.tie": "تعادل (tie)",
  "dz.baloot.outcome.failed": "تحت (failed bid)",
  "dz.baloot.outcomeMade": "Contract made",
  "dz.baloot.outcomeTie": "تعادل (tie)",
  "dz.baloot.outcomeFailed": "تحت (failed bid)",
  "dz.baloot.outcomeMadeNote": "The bidder reached the mark — each side keeps its points.",
  "dz.baloot.outcomeTieNote": "تعادل — the points are split between the two sides.",
  "dz.baloot.outcomeFailedNote": "تحت — the opponents take the whole round, and the bidder's مشاريع move across with it.",
  "dz.baloot.outcomeFailedVoidNote": "تحت — the opponents take the whole round, and the bidder's مشاريع are voided.",
  "dz.baloot.thresholdHokom": "In حكم the bidder needs 82 أبناط; 81 is a تعادل.",
  "dz.baloot.thresholdSun": "In صن the bidder needs 66 أبناط; 65 is a تعادل.",
  "dz.baloot.pad": "Number pad",
  "dz.baloot.padHint": "An in-page pad, so the OS keyboard never covers the sheet.",
  "dz.baloot.padPlus10": "+10",
  "dz.baloot.padClear": "Clear",
  "dz.baloot.padBackspace": "Delete a digit",
  "dz.baloot.padDone": "Done",
  "dz.baloot.padDigit": "Digit {n}",
  "dz.baloot.addRound": "Add a round",
  "dz.baloot.newRound": "New round",
  "dz.baloot.round": "Round",
  "dz.baloot.rounds": "Rounds",
  "dz.baloot.roundN": "Round {n}",
  "dz.baloot.roundsN": "{n} rounds",
  "dz.baloot.saveRound": "Save round",
  "dz.baloot.saveEdit": "Save changes",
  "dz.baloot.cancel": "Cancel",
  "dz.baloot.back": "Back",
  "dz.baloot.next": "Next",
  "dz.baloot.close": "Close",
  "dz.baloot.step": "Step {n}",
  "dz.baloot.required": "Required",
  "dz.baloot.preview": "Check before saving",
  "dz.baloot.previewHint": "The full arithmetic, so a disputed round can be checked by eye instead of taken on trust.",
  "dz.baloot.previewArith": "The arithmetic",
  "dz.baloot.previewCards": "From cards",
  "dz.baloot.previewProjects": "From مشاريع",
  "dz.baloot.previewRound": "This round",
  "dz.baloot.previewRule": "Rule applied",
  "dz.baloot.previewAfter": "Totals after this round",
  "dz.baloot.previewConversion": "{abnat} أبناط → {points} points",
  "dz.baloot.conversionNote": "أبناط are divided by 10 and rounded. The exact half is the special case: in صن the 5 counts as one, in حكم it counts as zero.",
  "dz.baloot.oneConversionNote": "Only one side is converted; the other is subtracted from the round total — so a round can never exceed 16 in حكم or 26 in صن.",
  "dz.baloot.scoreboard": "Scoreboard",
  "dz.baloot.total": "Total",
  "dz.baloot.points": "points",
  "dz.baloot.pointsN": "{n} points",
  "dz.baloot.target": "Target",
  "dz.baloot.targetChip": "Target {n}",
  "dz.baloot.needs": "Needs {n}",
  "dz.baloot.reached": "Reached the target",
  "dz.baloot.leading": "Leading",
  "dz.baloot.tiedNow": "Level",
  "dz.baloot.progressLabel": "Progress to {n}",
  "dz.baloot.lastRound": "Last round",
  "dz.baloot.noRounds": "No rounds yet — add the first one.",
  "dz.baloot.resumed": "Game resumed from this device.",
  "dz.baloot.resumedDismiss": "Got it",
  "dz.baloot.startedAt": "Started {time}",
  "dz.baloot.elapsed": "Duration {t}",
  "dz.baloot.history": "Round history",
  "dz.baloot.historyEmpty": "No rounds recorded yet.",
  "dz.baloot.historyHint": "Use Edit on any round to correct it.",
  "dz.baloot.colIndex": "#",
  "dz.baloot.colMode": "Mode",
  "dz.baloot.colDetail": "Detail",
  "dz.baloot.colScore": "Points",
  "dz.baloot.undo": "Undo",
  "dz.baloot.undoLast": "Undo the last round",
  "dz.baloot.undone": "Undone — totals recomputed.",
  "dz.baloot.edit": "Edit",
  "dz.baloot.editRound": "Edit round {n}",
  "dz.baloot.editHint": "Editing recomputes both totals from every round.",
  "dz.baloot.deleteRound": "Delete round",
  "dz.baloot.deleteConfirm": "Delete this round? Both totals will be recomputed.",
  "dz.baloot.confirm": "Delete",
  "dz.baloot.keep": "Keep it",
  "dz.baloot.settings": "Settings",
  "dz.baloot.settingsHint": "Baloot is played by prior agreement — set what your majlis plays before the first round.",
  "dz.baloot.setTarget": "Target صكة",
  "dz.baloot.setTargetHint": "152 in every Arabic source read.",
  "dz.baloot.setTie": "تعادل handling",
  "dz.baloot.tieSplit": "Split the points",
  "dz.baloot.tieBidder": "Bidder holds",
  "dz.baloot.setTieHint": "The لائحة splits at 81–81 in حكم and 65–65 in صن; some tables give the tie to the bidder.",
  "dz.baloot.setKaboot": "كبوت scoring",
  "dz.baloot.kabootFixed": "Fixed — 25 / 44",
  "dz.baloot.kabootMultiplier": "Double the round",
  "dz.baloot.setHundred": "مية",
  "dz.baloot.hundredOn": "Played",
  "dz.baloot.hundredOff": "Not played",
  "dz.baloot.setTransfer": "Failed bidder's مشاريع",
  "dz.baloot.transferOn": "Transfer to the opponents",
  "dz.baloot.transferOff": "Voided",
  "dz.baloot.setProjectDouble": "Double the مشاريع too",
  "dz.baloot.on": "On",
  "dz.baloot.off": "Off",
  "dz.baloot.setProjectValues": "Project values",
  "dz.baloot.setProjectValuesHint": "Defaults come from the لائحة. Change them if your majlis counts differently.",
  "dz.baloot.resetDefaults": "Reset to defaults",
  "dz.baloot.presets": "Saved presets",
  "dz.baloot.presetSave": "Save these settings",
  "dz.baloot.presetName": "Preset name",
  "dz.baloot.presetPlaceholder": "Thursday majlis",
  "dz.baloot.presetApply": "Apply",
  "dz.baloot.presetDelete": "Delete preset",
  "dz.baloot.presetsEmpty": "No saved presets yet.",
  "dz.baloot.presetSaved": "Preset saved.",
  "dz.baloot.rulesSource": "Rules from اللائحة العامة للعبة البلوت — the Saudi Mind Sports Federation.",
  "dz.baloot.rulesVerified": "Sources verified {date}.",
  "dz.baloot.rulesLink": "Sources",
  "dz.baloot.winTitle": "{team} take the صكة",
  "dz.baloot.winSub": "Final score",
  "dz.baloot.winRounds": "{n} rounds",
  "dz.baloot.winDuration": "Duration {t}",
  "dz.baloot.winGahwa": "By قهوة.",
  "dz.baloot.winKaboot": "With a كبوت along the way.",
  "dz.baloot.winTieBreak": "Both sides crossed the target — more أبناط wins.",
  "dz.baloot.rematch": "Rematch — same names",
  "dz.baloot.rematchHint": "The result is written to stats before the board resets.",
  "dz.baloot.newGame": "New game",
  "dz.baloot.newGameHint": "New names, empty board.",
  "dz.baloot.newGameConfirm": "Start a new game? The current board is cleared.",
  "dz.baloot.stats": "Stats",
  "dz.baloot.statsGames": "Games",
  "dz.baloot.statsWins": "Wins",
  "dz.baloot.statsLosses": "Losses",
  "dz.baloot.statsRate": "Win rate",
  "dz.baloot.statsHead": "Head-to-head",
  "dz.baloot.statsGahwa": "قهوة rounds",
  "dz.baloot.statsKaboot": "كبوت rounds",
  "dz.baloot.statsRounds": "Rounds",
  "dz.baloot.statsEmpty": "No stats yet — finish a صكة first.",
  "dz.baloot.statsClear": "Clear stats",
  "dz.baloot.statsSaved": "Result added to stats.",
  "dz.baloot.statsLocal": "Stats are counted on this device only.",
  "dz.baloot.privacy": "The game, the names, the settings and the stats stay on this device. Nothing is uploaded, and there is no account.",
  "dz.baloot.dataTitle": "Your data",
  "dz.baloot.export": "Export data",
  "dz.baloot.exportDone": "Exported.",
  "dz.baloot.clearAll": "Clear everything",
  "dz.baloot.clearAllConfirm": "This clears everything from this device: the game, the names, the presets and the stats. It cannot be undone.",
  "dz.baloot.clearAllDone": "Everything cleared.",
  "dz.baloot.errAbnat": "Enter a number between 0 and {max}.",
  "dz.baloot.errAbnatEmpty": "Enter the counting side's أبناط.",
  "dz.baloot.errMode": "Choose صن or حكم.",
  "dz.baloot.errCounted": "Choose who counted.",
  "dz.baloot.errBidder": "Choose the bidding side.",
  "dz.baloot.errProjectMode": "{project} cannot be declared in this mode.",
  "dz.baloot.errKaboot": "A كبوت means every بنط went to one side.",
  "dz.baloot.errTarget": "Enter a target above zero.",
  "dz.baloot.errName": "Enter a team name.",
  "dz.baloot.errStorage": "Could not save on this device.",
  "dz.baloot.errGeneric": "Check the entries — this round cannot be scored.",
  "dz.baloot.srScore": "{team}: {n} points",
  "dz.baloot.srSelected": "Selected",
  "dz.hub.travel": "Travel",
  "dz.tz.name": "Time Zone Converter",
  "dz.tz.desc": "Convert a time between cities, plan a meeting, watch a world clock.",
  "dz.tz.benefit": "Convert a time between cities, plan a meeting, watch a world clock.",
  "dz.tz.title": "Time Zone Converter",
  "dz.tz.pageTitle": "Time Zone Converter — Dzzz",
  "dz.tz.seo": "Convert a wall-clock time between cities, plan a meeting across several time zones at once, and keep a world clock of the places you care about. Daylight saving is read from your device's own time zone database rather than a stored offset, so a local time that does not exist and a local time that happens twice are shown as exactly that instead of being quietly guessed. Riyadh is pinned by default. Runs entirely on your device — no network, no account.",
  "dz.tz.seoIntro": "Convert a wall-clock time between cities, plan a meeting across several time zones at once, and keep a world clock of the places you care about. Daylight saving is read from your device's own time zone database rather than a stored offset, so a local time that does not exist and a local time that happens twice are shown as exactly that instead of being quietly guessed. Riyadh is pinned by default. Runs entirely on your device — no network, no account.",
  "dz.tz.tabConvert": "Convert",
  "dz.tz.tabMeeting": "Meeting planner",
  "dz.tz.tabClock": "World clock",
  "dz.tz.tabsAria": "Time zone tools",
  "dz.tz.citySearch": "Search cities",
  "dz.tz.citySearchPlaceholder": "City or country",
  "dz.tz.cityNoResults": "No city matches that search.",
  "dz.tz.cityResults": "{n} cities",
  "dz.tz.sourceCity": "From",
  "dz.tz.targetCities": "To",
  "dz.tz.addCity": "Add a city",
  "dz.tz.removeCity": "Remove {city}",
  "dz.tz.pinnedCities": "Your cities",
  "dz.tz.pinnedEmpty": "No cities yet — search above and add one.",
  "dz.tz.cityLabel": "City",
  "dz.tz.zoneLabel": "Time zone",
  "dz.tz.date": "Date",
  "dz.tz.time": "Time",
  "dz.tz.useNow": "Use the time now",
  "dz.tz.now": "Now",
  "dz.tz.result": "The same moment elsewhere",
  "dz.tz.resultsAria": "Converted times",
  "dz.tz.utcOffset": "UTC{offset}",
  "dz.tz.offsetLabel": "UTC offset",
  "dz.tz.sameDay": "same day",
  "dz.tz.nextDay": "the next day",
  "dz.tz.prevDay": "the day before",
  "dz.tz.daysLater": "{n} days later",
  "dz.tz.daysEarlier": "{n} days earlier",
  "dz.tz.copyTimes": "Copy the times",
  "dz.tz.copyLabel": "Times",
  "dz.tz.differenceAhead": "{n} h ahead of {city}",
  "dz.tz.differenceBehind": "{n} h behind {city}",
  "dz.tz.differenceSame": "the same time as {city}",
  "dz.tz.gap": "That local time does not exist in this zone — the clocks jump forward.",
  "dz.tz.gapTitle": "That time does not exist",
  "dz.tz.gapSuggestion": "The clocks go straight to {time}.",
  "dz.tz.ambiguous": "That local time happens twice on this date — pick which one you mean.",
  "dz.tz.ambiguousTitle": "That time happens twice",
  "dz.tz.occurrenceFirst": "The first one",
  "dz.tz.occurrenceSecond": "The second one",
  "dz.tz.occurrenceHint": "Both are real moments a short way apart. The earlier one is used unless you change it.",
  "dz.tz.noDst": "Saudi Arabia does not observe daylight saving time, so its offset is the same all year.",
  "dz.tz.meetingTitle": "Meeting planner",
  "dz.tz.meetingHint": "Pick a date and read across — every selected city on one strip.",
  "dz.tz.meetingDate": "Meeting date",
  "dz.tz.workStart": "Working hours start",
  "dz.tz.workEnd": "Working hours end",
  "dz.tz.workingHours": "Working hours",
  "dz.tz.workingLegend": "Within working hours",
  "dz.tz.outsideLegend": "Outside working hours",
  "dz.tz.nowLegend": "Now",
  "dz.tz.stripAria": "Hours in {city}",
  "dz.tz.hourAria": "{time} in {city}",
  "dz.tz.pickHour": "Pick this hour",
  "dz.tz.chosenHour": "Chosen hour",
  "dz.tz.meetingEmpty": "Add at least two cities to compare.",
  "dz.tz.clockTitle": "World clock",
  "dz.tz.clockHint": "Live, and it keeps running while this page is open.",
  "dz.tz.dayLabel": "Daytime",
  "dz.tz.nightLabel": "Night",
  "dz.tz.weekdayLabel": "Weekday",
  "dz.tz.clockEmpty": "No cities pinned yet.",
  "dz.tz.clockLocal": "Your device",
  "dz.tz.privacy": "Your pinned cities are remembered on this device only. Nothing is uploaded, and there is no account.",
  "dz.tz.clear": "Clear the pinned cities",
  "dz.tz.errZone": "That time zone isn't recognised here.",
  "dz.tz.errDate": "Enter a valid date.",
  "dz.tz.errTime": "Enter a valid time.",
  "dz.tz.errYear": "Enter a four-digit year.",
  "dz.flight.name": "Flight Time Calculator",
  "dz.flight.linkFirstLeg": "The link carries the first leg only — add the rest after opening it.",
  "dz.flight.desc": "Arrival time, layovers and the door-to-door total.",
  "dz.flight.benefit": "Arrival time, layovers and the door-to-door total.",
  "dz.flight.title": "Flight Time Calculator",
  "dz.flight.pageTitle": "Flight Time Calculator — Dzzz",
  "dz.flight.seo": "Enter a departure city and time and the published flight duration, and read the arrival in the arrival city's own clock — with the date change, if there is one, spelled out. Add legs for a connection and you get every layover and the door-to-door total. Published durations are gate-to-gate block time, which is simply added to the departure moment, so a date-line crossing or a daylight-saving change mid-flight falls out of the arithmetic instead of needing a special case. Runs entirely on your device.",
  "dz.flight.seoIntro": "Enter a departure city and time and the published flight duration, and read the arrival in the arrival city's own clock — with the date change, if there is one, spelled out. Add legs for a connection and you get every layover and the door-to-door total. Published durations are gate-to-gate block time, which is simply added to the departure moment, so a date-line crossing or a daylight-saving change mid-flight falls out of the arithmetic instead of needing a special case. Runs entirely on your device.",
  "dz.flight.legN": "Leg {n}",
  "dz.flight.addLeg": "Add a leg",
  "dz.flight.removeLeg": "Remove leg {n}",
  "dz.flight.fromCity": "From",
  "dz.flight.toCity": "To",
  "dz.flight.departDate": "Departure date",
  "dz.flight.departTime": "Departure time",
  "dz.flight.duration": "Flight duration",
  "dz.flight.durationHint": "Use the scheduled time printed on the ticket.",
  "dz.flight.hours": "Hours",
  "dz.flight.minutes": "Minutes",
  "dz.flight.hoursShort": "h",
  "dz.flight.minutesShort": "min",
  "dz.flight.hm": "{h} h {m} min",
  "dz.flight.results": "Your itinerary",
  "dz.flight.departs": "Departs",
  "dz.flight.arrives": "Arrives",
  "dz.flight.arrivesLocal": "Local time in {city}",
  "dz.flight.sameDay": "Lands the same day",
  "dz.flight.nextDay": "Lands the next day",
  "dz.flight.prevDay": "Lands the day before",
  "dz.flight.daysLater": "Lands {n} days later",
  "dz.flight.daysEarlier": "Lands {n} days earlier",
  "dz.flight.totalDoor": "Door to door",
  "dz.flight.totalFlying": "In the air",
  "dz.flight.totalGround": "On the ground",
  "dz.flight.copySummary": "Copy the itinerary",
  "dz.flight.copyLabel": "Itinerary",
  "dz.flight.layover": "Layover",
  "dz.flight.layoverN": "Layover {n}",
  "dz.flight.layoverAt": "Layover in {city}",
  "dz.flight.connectionType": "Connection type",
  "dz.flight.statusDD": "Domestic to domestic",
  "dz.flight.statusDI": "Domestic to international",
  "dz.flight.statusID": "International to domestic",
  "dz.flight.statusII": "International to international",
  "dz.flight.statusInterstation": "A different airport",
  "dz.flight.mct": "Default minimum",
  "dz.flight.mctLabel": "Default minimum connecting time",
  "dz.flight.mctValue": "{n} min",
  "dz.flight.mctEdit": "Adjust the minimums",
  "dz.flight.mctReset": "Back to the IATA defaults",
  "dz.flight.mctSource": "IATA SSIM chapter 8, §8.10.2",
  "dz.flight.mctNote": "These are the IATA global default minimum connecting times that reservation systems use when an airport has filed no value of its own. Airports and airlines set their own minimums, which override them. It is a booking rule, not advice on whether a connection is comfortable.",
  "dz.flight.tight": "Under the default minimum",
  "dz.flight.tightNote": "This layover is under the {n} min default for this connection type.",
  "dz.flight.comfortable": "Above the default minimum",
  "dz.flight.blockNote": "Published durations are gate-to-gate block time. Adding one to the departure moment and reading the result in the arrival city's clock is the whole calculation — the date line and any daylight-saving change are already inside it.",
  "dz.flight.errDuration": "Enter a flight duration above zero.",
  "dz.flight.errNegativeLayover": "The next leg departs before the previous one lands. Check the times.",
  "dz.flight.errGap": "That departure time does not exist in {city} that day — the clocks jump forward.",
  "dz.flight.errAmbiguous": "That departure time happens twice in {city} that day. The earlier one is used.",
  "dz.flight.errZone": "That time zone isn't recognised here.",
  "dz.flight.errCity": "Pick a departure city and an arrival city.",
  "dz.trip.name": "Trip Budget & Splitter",
  "dz.trip.desc": "Plan the budget, then split what everyone actually paid.",
  "dz.trip.benefit": "Plan the budget, then split what everyone actually paid.",
  "dz.trip.title": "Trip Budget & Splitter",
  "dz.trip.pageTitle": "Trip Budget and Expense Splitter — Dzzz",
  "dz.trip.seo": "Two halves of the same trip. Plan a budget by category, per trip or per day, and see the total, the cost per person and the cost per day. Then log who paid for what and get everyone's balance plus a settle-up: who pays whom, and how much. Every amount is worked in whole minor units of the currency, so the settlement closes at exactly zero. Everything stays on your device — no account, nothing uploaded, and no exchange rates in the arithmetic.",
  "dz.trip.seoIntro": "Two halves of the same trip. Plan a budget by category, per trip or per day, and see the total, the cost per person and the cost per day. Then log who paid for what and get everyone's balance plus a settle-up: who pays whom, and how much. Every amount is worked in whole minor units of the currency, so the settlement closes at exactly zero. Everything stays on your device — no account, nothing uploaded, and no exchange rates in the arithmetic.",
  "dz.trip.tabBudget": "Budget planner",
  "dz.trip.tabSplit": "Expense splitter",
  "dz.trip.tabsAria": "Trip tools",
  "dz.trip.tripName": "Trip name",
  "dz.trip.tripNamePlaceholder": "Summer in Georgia",
  "dz.trip.currency": "Currency",
  "dz.trip.currencyPlaceholder": "SAR",
  "dz.trip.currencyHint": "A label only — pick whatever you are spending in.",
  "dz.trip.noRates": "Amounts are in the currency you pick. No exchange rates are used or fetched.",
  "dz.trip.fxLink": "Need a conversion? Open the currency converter.",
  "dz.trip.travellers": "Travellers",
  "dz.trip.days": "Trip length in days",
  "dz.trip.daysShort": "days",
  "dz.trip.categories": "Categories",
  "dz.trip.catFlights": "Flights",
  "dz.trip.catStay": "Accommodation",
  "dz.trip.catFood": "Food",
  "dz.trip.catTransport": "Transport",
  "dz.trip.catActivities": "Activities",
  "dz.trip.catShopping": "Shopping",
  "dz.trip.catOther": "Other",
  "dz.trip.amount": "Amount",
  "dz.trip.basis": "How is it counted?",
  "dz.trip.perTrip": "For the whole trip",
  "dz.trip.perDay": "Per day",
  "dz.trip.perDayHint": "Multiplied by the trip length.",
  "dz.trip.total": "Total",
  "dz.trip.perPerson": "Per person",
  "dz.trip.totalPerDay": "Per day",
  "dz.trip.perPersonPerDay": "Per person, per day",
  "dz.trip.breakdown": "Where it goes",
  "dz.trip.shareOfTotal": "{pct}% of the total",
  "dz.trip.budgetEmpty": "Put an amount against a category to see the totals.",
  "dz.trip.people": "Who is on the trip?",
  "dz.trip.addPerson": "Add a person",
  "dz.trip.removePerson": "Remove {name}",
  "dz.trip.personName": "Name",
  "dz.trip.personPlaceholder": "Name",
  "dz.trip.peopleEmpty": "Add at least two people before splitting anything.",
  "dz.trip.expenses": "Expenses",
  "dz.trip.addExpense": "Add an expense",
  "dz.trip.removeExpense": "Remove this expense",
  "dz.trip.expenseWhat": "What was it for?",
  "dz.trip.expenseWhatPlaceholder": "Dinner",
  "dz.trip.paidBy": "Paid by",
  "dz.trip.splitAmong": "Split among",
  "dz.trip.everyone": "Everyone",
  "dz.trip.someone": "Only some of us",
  "dz.trip.splitEvenly": "Evenly",
  "dz.trip.splitByShares": "By shares",
  "dz.trip.shares": "Shares",
  "dz.trip.sharesHint": "Whole numbers. A 2 means twice as much as a 1.",
  "dz.trip.expensesEmpty": "No expenses yet.",
  "dz.trip.expensesCount": "{n} expenses",
  "dz.trip.spentTotal": "Spent so far",
  "dz.trip.balances": "Balances",
  "dz.trip.owes": "Owes {n}",
  "dz.trip.owed": "Is owed {n}",
  "dz.trip.level": "Square",
  "dz.trip.allSettled": "Everyone is square — nothing to pay.",
  "dz.trip.settleUp": "Settle up",
  "dz.trip.settleTransfers": "{n} transfers",
  "dz.trip.settleOne": "1 transfer",
  "dz.trip.transferLine": "{from} pays {to} {amount}",
  "dz.trip.settleExact": "This is the fewest transfers possible.",
  "dz.trip.settleGreedy": "This is fewer transfers than paying everyone back one by one.",
  "dz.trip.settleMethodHint": "Past {n} people still owing or owed something, working out the true minimum stops being quick, so a good-enough route is used instead.",
  "dz.trip.copySummary": "Copy the summary",
  "dz.trip.copyLabel": "Summary",
  "dz.trip.summaryTitle": "Trip summary",
  "dz.trip.privacy": "Everything stays on this device. Nothing is uploaded, and there is no account.",
  "dz.trip.dataTitle": "Your data",
  "dz.trip.export": "Export",
  "dz.trip.exportDone": "Exported.",
  "dz.trip.clearAll": "Clear everything",
  "dz.trip.clearAllConfirm": "This clears the trip, the people and every expense from this device. It cannot be undone.",
  "dz.trip.clearAllDone": "Everything cleared.",
  "dz.trip.errAmount": "Enter an amount above zero.",
  "dz.trip.errTravellers": "Enter at least one traveller.",
  "dz.trip.errDays": "Enter at least one day.",
  "dz.trip.errName": "Enter a name.",
  "dz.trip.errNameTaken": "That name is already on the list.",
  "dz.trip.errPayer": "Choose who paid.",
  "dz.trip.errAmong": "Choose at least one person to split it among.",
  "dz.trip.errShares": "Shares must be whole numbers above zero.",
  "dz.trip.errGeneric": "Check the entries — this cannot be split.",
  "dz.fuel.name": "Fuel Cost Calculator",
  "dz.fuel.desc": "Fuel needed, what it costs, and the split per person.",
  "dz.fuel.benefit": "Fuel needed, what it costs, and the split per person.",
  "dz.fuel.title": "Fuel Cost Calculator",
  "dz.fuel.pageTitle": "Fuel Cost Calculator — Dzzz",
  "dz.fuel.seo": "Work out how much fuel a drive needs, what it costs at today's price, and what each person owes. Distance in kilometres or miles; consumption in L/100 km, km/L or MPG — and MPG always says whether it is the US or the imperial gallon, because the same car reads about 20% higher in one than in the other. Add legs for a multi-stop route. No fuel price is built in: pump prices move, so you enter the one you are actually paying. Runs entirely on your device.",
  "dz.fuel.seoIntro": "Work out how much fuel a drive needs, what it costs at today's price, and what each person owes. Distance in kilometres or miles; consumption in L/100 km, km/L or MPG — and MPG always says whether it is the US or the imperial gallon, because the same car reads about 20% higher in one than in the other. Add legs for a multi-stop route. No fuel price is built in: pump prices move, so you enter the one you are actually paying. Runs entirely on your device.",
  "dz.fuel.distance": "Distance",
  "dz.fuel.distanceUnit": "Distance unit",
  "dz.fuel.unitKm": "kilometres",
  "dz.fuel.unitMi": "miles",
  "dz.fuel.unitKmShort": "km",
  "dz.fuel.unitMiShort": "mi",
  "dz.fuel.consumption": "Fuel consumption",
  "dz.fuel.consumptionHint": "Litres per 100 km — lower is better.",
  "dz.fuel.economy": "Fuel economy",
  "dz.fuel.economyHint": "Distance per unit of fuel — higher is better.",
  "dz.fuel.figureUnit": "Figure unit",
  "dz.fuel.unitL100km": "L/100 km",
  "dz.fuel.unitKmpl": "km/L",
  "dz.fuel.unitMpgUS": "MPG (US)",
  "dz.fuel.unitMpgImp": "MPG (imperial)",
  "dz.fuel.priceLabelL": "Price per litre",
  "dz.fuel.priceLabelGalUS": "Price per US gallon",
  "dz.fuel.priceLabelGalImp": "Price per imperial gallon",
  "dz.fuel.priceHint": "Whatever the pump is charging today.",
  "dz.fuel.currency": "Currency",
  "dz.fuel.currencyPlaceholder": "SAR",
  "dz.fuel.roundTrip": "Round trip",
  "dz.fuel.roundTripHint": "Counts the distance twice.",
  "dz.fuel.people": "Sharing the cost",
  "dz.fuel.results": "The drive",
  "dz.fuel.fuelNeeded": "Fuel needed",
  "dz.fuel.litres": "litres",
  "dz.fuel.galUS": "US gallons",
  "dz.fuel.galImp": "imperial gallons",
  "dz.fuel.totalCost": "Total cost",
  "dz.fuel.perPerson": "Per person",
  "dz.fuel.costPerKm": "Cost per km",
  "dz.fuel.costPerMi": "Cost per mile",
  "dz.fuel.totalDistance": "Total distance",
  "dz.fuel.copySummary": "Copy the summary",
  "dz.fuel.copyLabel": "Summary",
  "dz.fuel.legsTitle": "Route legs",
  "dz.fuel.legsHint": "Optional — add the stages and they are added up.",
  "dz.fuel.addLeg": "Add a leg",
  "dz.fuel.removeLeg": "Remove this leg",
  "dz.fuel.legName": "Leg",
  "dz.fuel.legNamePlaceholder": "Riyadh to Qassim",
  "dz.fuel.legDistance": "Distance",
  "dz.fuel.legsEmpty": "No legs yet — or just type one total distance above.",
  "dz.fuel.equivalents": "The same figure, four ways",
  "dz.fuel.equivHint": "Useful when the car's manual and a fuel app disagree on units.",
  "dz.fuel.noPrice": "Fuel prices change, so none is built in — enter the price you are paying today.",
  "dz.fuel.mpgVariant": "US and imperial gallons are different sizes, so the same car reads about 20% higher in imperial MPG. Pick the one your figure uses.",
  "dz.fuel.errDistance": "Enter a distance above zero.",
  "dz.fuel.errConsumption": "Enter a figure above zero.",
  "dz.fuel.errPrice": "Enter a price above zero.",
  "dz.fuel.errPeople": "Enter at least one person.",
  "dz.fuel.errGeneric": "Check the numbers — this cannot be worked out.",
  "dz.tts.name": "Read Aloud",
  "dz.tts.desc": "Reads Arabic or English text aloud in your device's own voice.",
  "dz.tts.benefit": "Reads Arabic or English text aloud in your device's own voice.",
  "dz.tts.title": "Read Aloud",
  "dz.tts.pageTitle": "Read Aloud — Text to Speech — Dzzz",
  "dz.tts.seo": "Paste Arabic or English text and hear it read out loud by the voices already installed on your device. No model is downloaded and nothing is uploaded — the device's own speech engine does the work, so it keeps working offline. Long text is split into short parts automatically, because the speech engine can stop a single long reading partway through. Speed, pitch and volume are adjustable. This reads text aloud but cannot save an audio file — the speech engine does not expose the synthesised audio.",
  "dz.tts.seoIntro": "Paste Arabic or English text and hear it read out loud by the voices already installed on your device. No model is downloaded and nothing is uploaded — the device's own speech engine does the work, so it keeps working offline. Long text is split into short parts automatically, because the speech engine can stop a single long reading partway through. Speed, pitch and volume are adjustable. This reads text aloud but cannot save an audio file — the speech engine does not expose the synthesised audio.",
  "dz.tts.textLabel": "Text",
  "dz.tts.textPlaceholder": "Paste or type the text you want read aloud…",
  "dz.tts.textHint": "Long text is split into short parts automatically, because the speech engine can stop a long reading partway through.",
  "dz.tts.chars": "Characters: {n}",
  "dz.tts.clear": "Clear",
  "dz.tts.settings": "Voice settings",
  "dz.tts.voice": "Voice",
  "dz.tts.voiceAuto": "Device default",
  "dz.tts.voiceLoading": "Looking for voices on this device…",
  "dz.tts.langAr": "Arabic",
  "dz.tts.langEn": "English",
  "dz.tts.otherLangs": "Other languages",
  "dz.tts.rate": "Speed",
  "dz.tts.pitch": "Pitch",
  "dz.tts.volume": "Volume",
  "dz.tts.reset": "Reset the sliders",
  "dz.tts.play": "Play",
  "dz.tts.pause": "Pause",
  "dz.tts.resume": "Resume",
  "dz.tts.stop": "Stop",
  "dz.tts.replay": "Play again",
  "dz.tts.progress": "Part {n} of {total}",
  "dz.tts.nowReading": "Now reading",
  "dz.tts.statusIdle": "Ready",
  "dz.tts.statusStarting": "Starting…",
  "dz.tts.statusPlaying": "Reading…",
  "dz.tts.statusPaused": "Paused",
  "dz.tts.statusDone": "Finished",
  "dz.tts.statusError": "The reading could not be completed. Try again, or choose another voice.",
  "dz.tts.stalled": "The voice stopped responding. Tap play to continue.",
  "dz.tts.unsupported": "Text-to-speech isn't available here — no speech engine is available to the page. Try a different browser or device.",
  "dz.tts.errEmpty": "Type or paste some text first.",
  "dz.tts.arabicRefused": "This text is Arabic and no Arabic voice is available here. An English voice would not read it understandably, so it is not used.",
  "dz.tts.notesTitle": "Worth knowing",
  "dz.tts.noExport": "This reads text aloud but cannot save an audio file — the speech engine does not expose the synthesised audio.",
  "dz.tts.deviceVoices": "The voices come from your device, so the list differs between phones and computers.",
  "dz.tts.noArabicVoice": "No Arabic voice was found on this device. Adding one in your system settings may help, though system-installed voices are not always visible to the page.",
  "dz.tts.msaNote": "Device voices read Modern Standard Arabic, not a dialect.",
  "dz.tts.privacy": "The text stays on this device. Nothing is uploaded.",
  "dz.tts.switchedToArabic": "Your text is Arabic, so an Arabic voice was selected — a non-Arabic voice skips Arabic text instead of reading it.",
  "dz.related.title": "Related tools",
  "dz.related.all": "All {cat} tools",
  "dz.category.pageTitle": "{cat}: free online tools — Dzzz",
  "dz.category.count": "{n} tools",
  "dz.category.others": "Other categories",
  "dz.category.sub.audio": "Audio",
  "dz.category.sub.video": "Video",
  "dz.category.sub.images": "Images",
  "dz.category.sub.pdf": "PDF",
  "dz.category.sub.vector": "Vector",
  "dz.category.sub.csv": "CSV",
  "dz.category.sub.archives": "Archives",
  "dz.category.sub.privacy": "Privacy",
  "dz.category.sub.math": "Math",
  "dz.category.sub.money": "Money",
  "dz.category.sub.health": "Health",
  "dz.category.sub.kitchen": "Kitchen",
  "dz.category.sub.travel": "Travel",
  "dz.category.sub.shopping": "Shopping",
  "dz.scan.name": "QR & Barcode Reader",
  "dz.scan.title": "QR & Barcode Reader",
  "dz.scan.pageTitle": "QR & Barcode Reader — Dzzz",
  "dz.scan.benefit": "See what a code really says before you act on it",
  "dz.scan.seo": "Scan QR codes and barcodes with your camera, an uploaded image, or a pasted screenshot. Everything is decoded on your device — nothing is uploaded. Links are never opened automatically, and shortened or insecure links are flagged before you tap.",
  "dz.scan.privacyNote": "Codes are decoded on your device. Nothing is uploaded.",
  "dz.scan.openCamera": "Open camera",
  "dz.scan.uploadCta": "Upload an image",
  "dz.scan.pasteImage": "Paste an image",
  "dz.scan.sheetTitle": "Scan a code",
  "dz.scan.uploadInstead": "Upload instead",
  "dz.scan.close": "Close",
  "dz.scan.torch": "Torch",
  "dz.scan.switchCamera": "Switch camera",
  "dz.scan.lowLight": "Not much light — try the torch, or move somewhere brighter.",
  "dz.scan.noTorch": "No torch button? Torch control isn't exposed for this camera — many do not.",
  "dz.scan.aim": "Point the camera at a code. It reads on its own — there is no shutter.",
  "dz.scan.tryAgain": "Try again",
  "dz.scan.denied": "Camera is off for this site",
  "dz.scan.deniedBody": "No problem — pick a photo instead and you get the same result.",
  "dz.scan.noCamera": "No camera found",
  "dz.scan.noCameraBody": "Upload a photo or paste an image instead.",
  "dz.scan.busy": "The camera did not start",
  "dz.scan.busyBody": "Another app or tab may be holding it, or it could not be opened. Close anything else that might be using the camera and try again — or upload a photo instead.",
  "dz.scan.reading": "Reading…",
  "dz.scan.oneFound": "1 code found",
  "dz.scan.twoFound": "{n} codes found — pick one",
  "dz.scan.twoFoundDual": "Two codes found — pick one",
  "dz.scan.nothingFound": "No code found in that image.",
  "dz.scan.viewResult": "View result",
  "dz.scan.scanAnother": "Scan another",
  "dz.scan.contents": "Contents",
  "dz.scan.kindUrl": "Link",
  "dz.scan.kindWifi": "Wi-Fi network",
  "dz.scan.kindContact": "Contact",
  "dz.scan.kindZatca": "ZATCA invoice QR",
  "dz.scan.kindIban": "IBAN",
  "dz.scan.kindBarcode": "Product barcode",
  "dz.scan.kindText": "Text",
  "dz.scan.destination": "Destination",
  "dz.scan.copyLink": "Copy link",
  "dz.scan.openLink": "Open link",
  "dz.scan.warnNoticeTitle": "This link hides where it goes",
  "dz.scan.warnNoticeBody": "Only open links you trust — QR codes are a common phishing method.",
  "dz.scan.warnStrongTitle": "This link is not safe to trust as it stands",
  "dz.scan.warnStrongBody": "Anything you type on it could be read by others on your network, or the page may not belong to the site it appears to be.",
  "dz.scan.reasonShortener": "The address is a shortener, so the real destination is hidden.",
  "dz.scan.reasonLongEncoded": "The address is unusually long and heavily encoded.",
  "dz.scan.reasonInsecure": "It uses http:// rather than https.",
  "dz.scan.reasonCredentials": "A username or password is embedded in the address.",
  "dz.scan.reasonPunycode": "The domain uses characters that can imitate another site.",
  "dz.scan.wifiSsid": "Network name",
  "dz.scan.wifiPassword": "Password",
  "dz.scan.wifiSecurity": "Security",
  "dz.scan.wifiHidden": "Hidden network",
  "dz.scan.secWpa": "WPA/WPA2",
  "dz.scan.secWep": "WEP",
  "dz.scan.secOpen": "Open (no password)",
  "dz.scan.yes": "Yes",
  "dz.scan.no": "No",
  "dz.scan.copyPassword": "Copy password",
  "dz.scan.copySsid": "Copy network name",
  "dz.scan.revealPassword": "Show password",
  "dz.scan.hidePassword": "Hide password",
  "dz.scan.wifiNote": "Copied to your clipboard — joining is up to you. We never connect for you.",
  "dz.scan.contactName": "Name",
  "dz.scan.contactPhone": "Phone",
  "dz.scan.contactEmail": "Email",
  "dz.scan.saveContact": "Save contact (.vcf)",
  "dz.scan.openZatca": "Open in the ZATCA decoder",
  "dz.scan.handoffNote": "The code is passed across in memory, not in the address bar.",
  "dz.scan.openIban": "Check in the IBAN validator",
  "dz.scan.ibanValid": "Checksum valid",
  "dz.scan.ibanInvalid": "Checksum does not match",
  "dz.scan.copyNumber": "Copy number",
  "dz.scan.checkDigit": "Check digit valid",
  "dz.scan.checkDigitBad": "Check digit does not match",
  "dz.scan.checkDigitExpected": "Expected last digit: {d}",
  "dz.scan.noLookup": "No product lookup — that would need a network request and a licensed database.",
  "dz.scan.copyText": "Copy text",
  "dz.scan.crossQr": "Create a QR code",
  "dz.scan.crossBarcode": "Create a barcode",
  "dz.scan.crossZatca": "Create a ZATCA invoice QR",
  "dz.scan.decoderTitle": "Decoder on this device",
  "dz.scan.backendNative": "Using the built-in reader on this device — nothing was downloaded.",
  "dz.scan.backendWasm": "Using the bundled reader (about 1 MB, downloaded once and cached on your device).",
  "dz.scan.recent": "Recent scans",
  "dz.scan.storedHere": "Stored on this device only",
  "dz.scan.clearAll": "Clear all",
  "dz.scan.clearConfirm": "Clear all scan history?",
  "dz.scan.cancel": "Cancel",
  "dz.scan.historyEmpty": "Nothing scanned yet.",
  "dz.scan.pasteBlocked": "Clipboard access was refused. Press Ctrl+V (⌘V) with this page in focus, or upload the image.",
  "dz.scan.pasteNoImage": "There is no image on the clipboard.",
  "dz.docscan.name": "Document Scanner",
  "dz.docscan.title": "Document Scanner",
  "dz.docscan.pageTitle": "Document Scanner — Dzzz",
  "dz.docscan.benefit": "Photograph a page and get a flat, readable PDF",
  "dz.docscan.seo": "Photograph any page with your phone, or upload a photo you already have, and get a flat, readable PDF. The edges are found, the perspective is straightened and the lighting is evened out entirely on your device — nothing is uploaded, there is no account and there is no watermark. Collect several pages into one file, or save them as images in a zip.",
  "dz.docscan.privacyNote": "Pages are processed on your device. Nothing is uploaded.",
  "dz.docscan.openCamera": "Open camera",
  "dz.docscan.cameraAsk": "You'll be asked for camera access after you tap.",
  "dz.docscan.uploadCta": "Upload a photo",
  "dz.docscan.dropHere": "Drop a photo here, or click to choose one",
  "dz.docscan.howTitle": "How it works",
  "dz.docscan.how1": "Photograph the page, or upload a photo you already have.",
  "dz.docscan.how2": "Drag the corners until the outline matches the page.",
  "dz.docscan.how3": "Pick a look — black & white is best for text.",
  "dz.docscan.how4": "Save it as a PDF, or as images in a zip.",
  "dz.docscan.contrastTitle": "What you get",
  "dz.docscan.contrastBody": "No account, no upload, no watermark, and no page limit beyond what your device can hold. The photo never leaves your device, so there is nothing to delete afterwards.",
  "dz.docscan.engineTitle": "One-time download",
  "dz.docscan.engineNote": "Finding the edges and flattening the page use an image engine of about 4 MB. It downloads once, only when you ask for it, and your device keeps it after that.",
  "dz.docscan.sheetTitle": "Scan a page",
  "dz.docscan.shutter": "Capture",
  "dz.docscan.camAim": "Fill the frame with the page, then tap Capture.",
  "dz.docscan.camDetectOn": "Edges are being outlined live.",
  "dz.docscan.camDetectOff": "The live edge outline needs the one-time download.",
  "dz.docscan.camCount": "{n} pages so far",
  "dz.docscan.camCountOne": "1 page so far",
  "dz.docscan.camCountTwo": "2 pages so far",
  "dz.docscan.adjustTitle": "Match the corners to the page",
  "dz.docscan.adjustGroup": "Page corners",
  "dz.docscan.corner": "Corner {n}",
  "dz.docscan.edge": "Edge {n}",
  "dz.docscan.reset": "Reset corners",
  "dz.docscan.dragHint": "Drag a corner. Arrow keys nudge, Shift moves faster, R resets.",
  "dz.docscan.detectFound": "Edges found. Adjust any corner that is off.",
  "dz.docscan.detectNone": "No page edges found — drag the corners yourself.",
  "dz.docscan.engineWhy": "Finding the edges and flattening the page use the image engine below.",
  "dz.docscan.continue": "Corners look right",
  "dz.docscan.cancel": "Cancel",
  "dz.docscan.opening": "Opening…",
  "dz.docscan.flattening": "Flattening…",
  "dz.docscan.saving": "Saving…",
  "dz.docscan.enhanceTitle": "Choose a look",
  "dz.docscan.previewAlt": "Page preview",
  "dz.docscan.modeLegend": "Page look",
  "dz.docscan.modeColour": "Colour",
  "dz.docscan.modeGrey": "Greyscale",
  "dz.docscan.modeBw": "Black & white",
  "dz.docscan.modeAuto": "Auto",
  "dz.docscan.modeNoteColour": "Keeps stamps, logos and coloured ink. The largest file.",
  "dz.docscan.modeNoteGrey": "Neutral grey. Smaller than colour, and shading survives.",
  "dz.docscan.modeNoteBw": "Two tones only. The sharpest text and the smallest file, but faint pencil can disappear.",
  "dz.docscan.modeNoteAuto": "Evens out shadows and keeps colour. Slower, and a hard shadow can leave a mark.",
  "dz.docscan.modeBwTag": "Best for text",
  "dz.docscan.modeColourWhy": "This page carries real colour, so Colour is selected. Black & white is one tap away.",
  "dz.docscan.rotate": "Rotate",
  "dz.docscan.back": "Back",
  "dz.docscan.addPage": "Add this page",
  "dz.docscan.saveEdits": "Save changes",
  "dz.docscan.pagesTitle": "Pages",
  "dz.docscan.stripLabel": "Pages in this document",
  "dz.docscan.allPages": "All pages",
  "dz.docscan.gridTitle": "All pages",
  "dz.docscan.done": "Done",
  "dz.docscan.reorder": "Reorder",
  "dz.docscan.pageN": "Page {n}",
  "dz.docscan.pageCount": "{n} pages",
  "dz.docscan.pageCountOne": "1 page",
  "dz.docscan.pageCountTwo": "2 pages",
  "dz.docscan.openActions": "Page {n} — page actions",
  "dz.docscan.stripHint": "Reordering and per-page edits live in All pages.",
  "dz.docscan.selectHint": "Pick a page to see its actions.",
  "dz.docscan.retake": "Retake",
  "dz.docscan.recrop": "Re-crop",
  "dz.docscan.pageMode": "Look",
  "dz.docscan.removePage": "Delete",
  "dz.docscan.addAnother": "Add another page",
  "dz.docscan.toExport": "Export",
  "dz.docscan.emptyPages": "No pages yet.",
  "dz.docscan.capReached": "{n} pages is the limit here — export these first, then start another document.",
  "dz.docscan.exportTitle": "Export",
  "dz.docscan.titleLabel": "File name",
  "dz.docscan.formatLabel": "Format",
  "dz.docscan.formatPdf": "PDF",
  "dz.docscan.formatImages": "Images (.zip)",
  "dz.docscan.sizeLabel": "Page size",
  "dz.docscan.sizeA4": "A4",
  "dz.docscan.sizeLetter": "Letter",
  "dz.docscan.sizeAuto": "Auto",
  "dz.docscan.qualityLabel": "Quality",
  "dz.docscan.qSmall": "Small",
  "dz.docscan.qSmallSub": "Smallest file",
  "dz.docscan.qMedium": "Medium",
  "dz.docscan.qMediumSub": "Balanced",
  "dz.docscan.qHigh": "High",
  "dz.docscan.qHighSub": "Sharpest",
  "dz.docscan.resNote": "Pages are processed at up to 2000 px on the long edge.",
  "dz.docscan.estimateNote": "The size on the button is an estimate, measured by encoding one page at this quality. The real size is shown after saving.",
  "dz.docscan.estimating": "Estimating…",
  "dz.docscan.savePdf": "Save PDF",
  "dz.docscan.saveImages": "Save images",
  "dz.docscan.exporting": "Page {n} of {total}",
  "dz.docscan.savedSize": "Saved — {size}",
  "dz.docscan.toArchive": "Save to archive",
  "dz.docscan.archiveNote": "Keeps this document and its pages on this device, in this browser. It is not uploaded and not synced, and it does not appear in your file manager.",
  "dz.docscan.archiveDone": "Saved to your archive",
  "dz.docscan.archiveView": "Open the archive",
  "dz.docscan.archiveFailed": "It could not be saved to the archive. The device may be out of room. The file you save above is unaffected.",
  "dz.docscan.redactFirst": "Redact something first",
  "dz.docscan.redactNote": "Opens the redaction tool with this page, passed in memory — never in the address bar.",
  "dz.docscan.failed": "That did not work. Try again, or use a different photo.",
  "dz.camcolor.name": "Camera Colour Picker",
  "dz.camcolor.title": "Camera Colour Picker",
  "dz.camcolor.pageTitle": "Camera Colour Picker — Sample Any Colour — Dzzz",
  "dz.camcolor.benefit": "Point the camera at anything and read its colour as HEX and RGB",
  "dz.camcolor.seo": "Point your phone camera at a wall, a fabric or a printed page and read its colour straight off the screen as HEX and RGB — or upload a photo and tap the pixel you want. Read a single pixel, or an average of nine to settle sensor noise, collect the colours you like into a tray of swatches, and send the whole set to the palette tool in one tap. Everything runs on your device: no camera frame and no photo is ever uploaded or stored, only the colour you sample. The reading is approximate, because a phone applies its own white balance before any pixel reaches the page.",
  "dz.camcolor.privacyNote": "Swatches are saved on this device only. No photo and no camera frame is ever stored or uploaded — only the colour you sample.",
  "dz.camcolor.approxNote": "Approximate — phone white balance shifts colour. Not colour-managed.",
  "dz.camcolor.openCamera": "Open camera",
  "dz.camcolor.cameraAsk": "You'll be asked for camera access after you tap.",
  "dz.camcolor.uploadCta": "Upload a photo",
  "dz.camcolor.dropHere": "Drop a photo here, or click to choose one",
  "dz.camcolor.sheetTitle": "Colour picker",
  "dz.camcolor.sampleAria": "Sample colour",
  "dz.camcolor.aim": "Put the reticle over the colour, then tap anywhere.",
  "dz.camcolor.photoTitle": "Tap a colour in the photo",
  "dz.camcolor.photoAria": "Sample a colour from the photo",
  "dz.camcolor.photoHint": "Click or tap the pixel you want. With the keyboard, Enter samples the centre.",
  "dz.camcolor.modeLabel": "Sample area",
  "dz.camcolor.modePoint": "Point",
  "dz.camcolor.modeAverage": "Average 9 px",
  "dz.camcolor.modeNote": "Point reads one pixel. Average 9 px is the mean of the 3×3 block around it, which settles camera noise without smearing across the edge between two colours.",
  "dz.camcolor.swatchesTitle": "Swatches",
  "dz.camcolor.savedCount": "Saved · {n}",
  "dz.camcolor.kept": "Kept {hex}",
  "dz.camcolor.emptySwatches": "No swatches yet — sample a colour and it lands here.",
  "dz.camcolor.removeSwatch": "Remove {hex}",
  "dz.camcolor.clearAll": "Clear all",
  "dz.camcolor.clearConfirm": "Clear every saved swatch?",
  "dz.camcolor.cancel": "Cancel",
  "dz.camcolor.toPalette": "Send to palette tool",
  "dz.camcolor.handoffNote": "Opens the colour tool with these swatches, passed in memory — never in the address bar.",
  "dz.camcolor.capReached": "{n} swatches is the limit here — remove one first.",
  "dz.camcolor.failed": "That photo could not be read. Try another one.",
  "dz.camcolor.howTitle": "How it works",
  "dz.camcolor.how1": "Open the camera, or upload a photo you already have.",
  "dz.camcolor.how2": "Put the reticle over the colour and tap — or tap the pixel you want in a photo.",
  "dz.camcolor.how3": "Keep the ones you like. Tap a swatch again to remove it.",
  "dz.camcolor.how4": "Send the set to the colour tool for harmonies, gradients and contrast.",
  "dz.camcolor.whyTitle": "Why the number is approximate",
  "dz.camcolor.whyBody": "A phone applies auto white balance, auto exposure and its own colour processing before any pixel reaches this page, and nothing here is colour-managed to a profile. Two phones pointed at the same wall will disagree, and so will one phone under two different lights. Treat the reading as a close starting point, never as a match for a brand colour or a paint code.",
  "dz.camcolor.close": "Close",
  "dz.camcolor.torch": "Torch",
  "dz.camcolor.uploadInstead": "Upload a photo instead",
  "dz.camcolor.switchCamera": "Switch camera",
  "dz.camcolor.lowLight": "Not much light — colour drifts in the dark. Try the torch, or move somewhere brighter.",
  "dz.camcolor.tryAgain": "Try again",
  "dz.camcolor.denied": "Camera is off for this site",
  "dz.camcolor.deniedBody": "No problem — upload a photo instead and sample it the same way.",
  "dz.camcolor.noCamera": "No camera found",
  "dz.camcolor.noCameraBody": "Upload a photo instead and sample it the same way.",
  "dz.camcolor.busy": "The camera did not start",
  "dz.camcolor.busyBody": "Another app or tab may be holding it, or it could not be opened. Close anything else that might be using the camera and try again — or upload a photo instead.",
  "dz.pos.name": "Position Calculator",
  "dz.pos.title": "Position Calculator",
  "dz.pos.pageTitle": "Position Calculator — Dzzz",
  "dz.pos.seo": "Log the buys and sells for a stock and it works out your cost basis, the commission you actually paid, realized profit, and what your remaining shares really cost after a partial exit. Your own numbers, on your own device — no prices are fetched and nothing is uploaded.",
  "dz.pos.disclaimer": "Your own numbers, entered by you, stored only on this device. Not investment advice.",
  "dz.pos.privacy": "Stored only on this device. No account, and no numbers in the URL.",
  "dz.pos.positions": "Positions",
  "dz.pos.addPosition": "Add position",
  "dz.pos.importCsv": "Import from CSV",
  "dz.pos.emptyTitle": "No positions yet",
  "dz.pos.emptyBody": "Log the buys and sells for one stock and it computes the cost, the commission, the realized profit, and what your remaining shares really cost.",
  "dz.pos.exampleCap": "WORKED EXAMPLE",
  "dz.pos.exampleBody": "Buy 2,000 at 7.62, sell 2,000 at 7.80 → realized 331.00 after 46.00 commission.",
  "dz.pos.showTotals": "Show totals",
  "dz.pos.hideTotals": "Hide totals",
  "dz.pos.portfolio": "Portfolio",
  "dz.pos.capitalAtRisk": "Capital at risk",
  "dz.pos.aggNote": "Unified at the rate you entered. Collapsed by default.",
  "dz.pos.sortBy": "Sort",
  "dz.pos.sortPl": "P/L",
  "dz.pos.sortSymbol": "Symbol",
  "dz.pos.sortSize": "Size",
  "dz.pos.closed": "Closed",
  "dz.pos.closedPos": "position closed",
  "dz.pos.openPos": "OPEN",
  "dz.pos.symbol": "Symbol",
  "dz.pos.positionName": "Name (optional)",
  "dz.pos.deletePosition": "Delete position",
  "dz.pos.confirmDelete": "Delete this position and every trade in it? This cannot be undone.",
  "dz.pos.clearAll": "Delete everything",
  "dz.pos.confirmClearAll": "Delete every position, preset and setting stored on this device?",
  "dz.pos.adjBasis": "ADJUSTED COST BASIS",
  "dz.pos.adjBasisSub": "What your remaining shares actually cost you, after what you have already taken off the table. Commission included.",
  "dz.pos.remaining": "REMAINING SHARES",
  "dz.pos.totalPL": "TOTAL P/L",
  "dz.pos.atRisk": "of capital still at risk",
  "dz.pos.totalCommission": "TOTAL COMMISSION",
  "dz.pos.commissionSub": "a real cost, already inside the basis",
  "dz.pos.avgCost": "AVERAGE COST",
  "dz.pos.avgCostSub": "commission included",
  "dz.pos.avgSellPrice": "AVERAGE SELL PRICE",
  "dz.pos.avgSellSub": "net of commission",
  "dz.pos.realizedPL": "REALIZED P/L",
  "dz.pos.unrealizedPL": "UNREALIZED P/L",
  "dz.pos.totalInvested": "TOTAL INVESTED",
  "dz.pos.totalReceived": "TOTAL RECEIVED",
  "dz.pos.sharesBought": "shares bought",
  "dz.pos.sharesSold": "shares sold",
  "dz.pos.howCalculated": "How this is calculated",
  "dz.pos.formula": "Formula",
  "dz.pos.result": "Result",
  "dz.pos.explainAdjBasis": "Everything you spent, minus everything you got back, divided by the shares you still hold.",
  "dz.pos.explainAvgCost": "What you paid per share across everything you bought — not what is left.",
  "dz.pos.explainAvgSell": "What you received per share across what you sold.",
  "dz.pos.explainRealized": "Banked, measured against average cost. It is also what pulled the adjusted basis down — which is why it is not added again to Total P/L.",
  "dz.pos.explainCommission": "Commission is a real cost and it is inside the cost basis, not hidden elsewhere.",
  "dz.pos.explainInvested": "Everything that left your account, commission included.",
  "dz.pos.explainReceived": "Everything that came back, after commission.",
  "dz.pos.basisNote": "Average cost spans every buy, including buys made after a sell — so adding an older trade later will change this figure.",
  "dz.pos.whatIf": "What-if",
  "dz.pos.whatIfSub": "arithmetic, not a forecast",
  "dz.pos.exactPrice": "EXACT PRICE",
  "dz.pos.plAt": "TOTAL P/L AT THAT PRICE",
  "dz.pos.breakEven": "break-even",
  "dz.pos.modelSell": "Model a partial sell",
  "dz.pos.sellShares": "SHARES TO SELL",
  "dz.pos.sellNote": "Nothing is saved. This only shows what the arithmetic would become.",
  "dz.pos.newBasis": "New adjusted basis",
  "dz.pos.newRemaining": "Shares left",
  "dz.pos.resultingRealized": "Realized on this sell",
  "dz.pos.tradeLog": "Trade log",
  "dz.pos.balCol": "Running balance",
  "dz.pos.held": "held",
  "dz.pos.feeShort": "fee",
  "dz.pos.addTrade": "Add trade",
  "dz.pos.editTrade": "Edit trade",
  "dz.pos.exportCsv": "Export CSV",
  "dz.pos.buy": "Buy",
  "dz.pos.sell": "Sell",
  "dz.pos.qty": "QUANTITY",
  "dz.pos.price": "PRICE",
  "dz.pos.date": "DATE",
  "dz.pos.commission": "COMMISSION",
  "dz.pos.note": "Note (optional)",
  "dz.pos.total": "TOTAL",
  "dz.pos.save": "Save trade",
  "dz.pos.cancel": "Cancel",
  "dz.pos.delete": "Delete",
  "dz.pos.computed": "computed",
  "dz.pos.edited": "edited",
  "dz.pos.resetFee": "Use the computed fee",
  "dz.pos.overSell": "You only hold {n} shares. Saved anyway — correct it if this was a mistake.",
  "dz.pos.dataWarning": "More sold than bought. The figures still compute, but check the log.",
  "dz.pos.currency": "Currency",
  "dz.pos.rateLabel": "1 USD =",
  "dz.pos.rateDate": "rate entered",
  "dz.pos.rateNote": "A rate you entered yourself — nothing is fetched.",
  "dz.pos.presets": "Broker presets",
  "dz.pos.model": "MODEL",
  "dz.pos.modelPercentage": "Percentage",
  "dz.pos.modelPerShare": "Per-share",
  "dz.pos.modelFlat": "Flat",
  "dz.pos.modelNone": "None",
  "dz.pos.fieldRate": "RATE %",
  "dz.pos.fieldPerShare": "PER SHARE",
  "dz.pos.fieldMinFee": "MINIMUM FEE",
  "dz.pos.fieldFlatFee": "FLAT FEE",
  "dz.pos.fieldVat": "VAT ON FEE %",
  "dz.pos.sample": "LIVE SAMPLE",
  "dz.pos.sampleQty": "QTY",
  "dz.pos.samplePrice": "PRICE",
  "dz.pos.vatNote": "VAT applies to the fee, not to the trade value.",
  "dz.pos.noneBody": "No commission. Every fee computes to zero.",
  "dz.pos.presetDefault": "DEFAULT",
  "dz.pos.presetName": "Preset name",
  "dz.pos.addPreset": "Add preset",
  "dz.pos.importTitle": "Import CSV",
  "dz.pos.mapStep": "Map columns",
  "dz.pos.theirCol": "THEIR COLUMN",
  "dz.pos.ourField": "OUR FIELD",
  "dz.pos.ignored": "Ignored",
  "dz.pos.preview": "PREVIEW",
  "dz.pos.confirmImport": "Import {n} trades",
  "dz.pos.back": "Back",
  "dz.pos.skippedRows": "{n} rows skipped",
  "dz.pos.dayFirst": "Dates are day/month",
  "dz.pos.exportTitle": "Export",
  "dz.pos.exportTradeLog": "Trade log CSV",
  "dz.pos.exportSummary": "Summary CSV",
  "dz.pos.exportBackup": "Full JSON backup",
  "dz.piv.name": "Pivot Points",
  "dz.piv.title": "Pivot Points",
  "dz.piv.pageTitle": "Pivot Points Calculator — Dzzz",
  "dz.piv.seo": "Enter a session's high, low and close and it lays out the pivot and its support and resistance levels on a labelled ladder. Five named methods — the level you read is never an unlabelled one. Arithmetic only, computed on your device.",
  "dz.piv.high": "HIGH",
  "dz.piv.low": "LOW",
  "dz.piv.close": "CLOSE",
  "dz.piv.method": "METHOD",
  "dz.piv.ladder": "LADDER",
  "dz.piv.scale": "SCALE",
  "dz.piv.formula": "Formula",
  "dz.piv.methodStandard": "Standard",
  "dz.piv.methodWoodie": "Woodie",
  "dz.piv.methodCamarilla": "Camarilla",
  "dz.piv.methodFibonacci": "Fibonacci",
  "dz.piv.methodWorkbook": "Workbook (4-level variant)",
  "dz.piv.workbookNote": "A non-standard variant carried over from a personal spreadsheet. Named so it is never mistaken for the standard method.",
  "dz.piv.zoneTrim": "Upper band",
  "dz.piv.zoneWatch": "Middle band",
  "dz.piv.zoneAccumulate": "Lower band",
  "dz.piv.zoneNote": "The three bands are descriptive groupings of the levels — never an instruction to buy or sell.",
  "dz.piv.invalidRange": "The high must be at or above the low.",
  "dz.piv.disclaimer": "Arithmetic on the numbers you entered. Not a prediction and not investment advice.",
  "dz.pos.ofInvested": "of total invested",
  "dz.pos.modelOverSell": "That is more than the {n} shares you hold — the figures below are not meaningful.",
  "dz.pos.lastPrice": "LAST PRICE YOU SET",
  "dz.pos.unrealizedSub": "at the price you last set",
  "dz.pos.noPriceSet": "Set a price in the what-if block to see this.",
  "dz.piv.invalidClose": "The close must sit between the low and the high.",
  "dz.pos.sortColumn": "Sort by {col}",
  "dz.pos.pickSheet": "Sheet to import",
  "dz.pos.skippedRows.one": "1 row skipped",
  "dz.pos.skippedRows.two": "2 rows skipped",
  "dz.pos.skippedRows.few": "{n} rows skipped",
  "dz.pos.confirmImport.one": "Import 1 trade",
  "dz.pos.confirmImport.two": "Import 2 trades",
  "dz.pos.confirmImport.few": "Import {n} trades",
  "dz.lorem.shareNote": "The link carries the settings only — the text is drawn fresh each time it opens.",
  "dz.pwgen.linkNote": "The link carries your settings only — no password is ever put in a URL.",
  "dz.scaler.shareNote": "The link carries the servings only — your ingredient list stays on this device.",
  "dz.ms.seoApp": "Turn a meeting recording into a clear summary and action items. Transcription runs on your device, and so does the summary — the transcript is never uploaded and there is no server step here. The summary is extractive: it picks out the sentences that carry the meeting, from the transcript you have already reviewed. Export the result as TXT or Markdown.",
  "dz.ms.basicLocalApp": "Summarise on this device",
  "dz.ascii.name": "ASCII Art",
  "dz.ascii.pageTitle": "ASCII Art Generator — turn a photo into text",
  "dz.ascii.benefit": "Turn a photo into text art you can paste anywhere — on your device.",
  "dz.ascii.seo": "Turn any photo into ASCII art on your device. Choose the width and character set, preview it live, then copy the text or save it as an SVG. The image never leaves your device.",
  "dz.ascii.drop": "Choose a photo",
  "dz.ascii.width": "Width in characters",
  "dz.ascii.charset": "Character set",
  "dz.ascii.ramp.blocks": "Blocks",
  "dz.ascii.ramp.classic": "Classic",
  "dz.ascii.ramp.minimal": "Minimal",
  "dz.ascii.invert": "Invert",
  "dz.ascii.colour": "Colour",
  "dz.ascii.fit": "Fit to width",
  "dz.ascii.copy": "Copy text",
  "dz.ascii.copyHtml": "Copy as HTML",
  "dz.ascii.saveSvg": "Save SVG",
  "dz.ascii.another": "Another photo",
  "dz.ascii.failed": "That image could not be read.",
  "dz.ascii.previewAlt": "ASCII art preview",
  "dz.count.name": "Count Objects",
  "dz.count.pageTitle": "Count Objects — mark and count items in a photo",
  "dz.count.seo": "Detect objects in a photo automatically, then tap to add or remove markers until the count is right. Adjust sensitivity and object size with visual handles, switch between dark-on-light and light-on-dark, and export an annotated image or a CSV of marker positions. An on-device engine (~4 MB) powers the automatic pass; nothing is uploaded.",
  "dz.count.benefit": "Get a first count automatically, then tap to fix it — done entirely on your device.",
  "dz.count.caution": "This is an aid, not a certified count — always check the number before relying on it.",
  "dz.count.failed": "That image could not be read.",
  "dz.count.drop": "Choose a photo",
  "dz.count.countLabel": "objects",
  "dz.count.autoCount": "{n} automatic",
  "dz.count.manualCount": "{n} manual",
  "dz.count.instructions": "Tap an empty spot to add a marker, tap a marker to remove it. Pinch or scroll to zoom, drag to pan.",
  "dz.count.sensitivity": "Sensitivity",
  "dz.count.sensitivityHint": "Higher catches smaller or fainter objects; lower keeps only the largest, clearest ones.",
  "dz.count.maxSize": "Largest object",
  "dz.count.maxSizeHint": "Caps how big a single detected object can be, so a background region is never counted as one giant item.",
  "dz.count.mode": "Background",
  "dz.count.darkOnLight": "Dark objects, light background",
  "dz.count.lightOnDark": "Light objects, dark background",
  "dz.count.engineWhy": "Automatic detection needs a small one-time engine download — it runs entirely on your device, nothing is uploaded.",
  "dz.count.detect": "Detect automatically",
  "dz.count.detecting": "Detecting…",
  "dz.count.redetect": "Detect again",
  "dz.count.exportImage": "Download annotated image",
  "dz.count.exportCsv": "Download marker CSV",
  "dz.count.saved": "Saved.",
  "dz.count.another": "Another photo",
  "dz.count.zoomIn": "Zoom in",
  "dz.count.zoomOut": "Zoom out",
  "dz.count.resetView": "Fit to view",
  "dz.idiff.name": "Image Diff",
  "dz.idiff.pageTitle": "Image Diff — compare two images pixel by pixel",
  "dz.idiff.seo": "Compare two images entirely on your device: see a live percentage of pixels changed, a count of distinct changed regions with jump-to-next navigation, and five ways to look at the difference — side by side, a swipe slider, an onion-skin opacity blend, a numbered difference-region overlay, and an A/B blink. Adjust sensitivity and choose whether to ignore anti-aliasing noise. Nothing is uploaded.",
  "dz.idiff.benefit": "See exactly what changed between two images — compared entirely on your device.",
  "dz.idiff.failed": "That image could not be read.",
  "dz.idiff.dropA": "Choose image A",
  "dz.idiff.dropB": "Choose image B",
  "dz.idiff.replaceA": "Replace image A",
  "dz.idiff.replaceB": "Replace image B",
  "dz.idiff.another": "Start over",
  "dz.idiff.sensitivity": "Sensitivity",
  "dz.idiff.sensitivityHint": "Lower catches even faint differences; higher ignores small variations and flags only clear changes.",
  "dz.idiff.ignoreAA": "Ignore anti-aliasing noise",
  "dz.idiff.viewMode": "View mode",
  "dz.idiff.mode.sideBySide": "Side by side",
  "dz.idiff.mode.swipe": "Swipe",
  "dz.idiff.mode.onion": "Onion skin",
  "dz.idiff.mode.diff": "Difference map",
  "dz.idiff.mode.blink": "Blink",
  "dz.idiff.identical": "No differences found at this sensitivity.",
  "dz.idiff.changed": "of pixels changed",
  "dz.idiff.regionsCount": "{n} regions changed",
  "dz.idiff.regionsCount.zero": "No regions changed",
  "dz.idiff.regionsCount.one": "1 region changed",
  "dz.idiff.regionsCount.two": "2 regions changed",
  "dz.idiff.regionsCount.few": "{n} regions changed",
  "dz.idiff.prevRegion": "Previous",
  "dz.idiff.nextRegion": "Next difference",
  "dz.idiff.regionPosition": "Region",
  "dz.idiff.imageA": "Image A",
  "dz.idiff.imageB": "Image B",
  "dz.idiff.onionOpacity": "Image B opacity",
  "dz.idiff.maskAlt": "Image A with numbered boxes over each changed region",
  "dz.idiff.maskNote": "Each numbered box is one changed region, largest first — the active one is drawn brighter.",
  "dz.idiff.blinkInterval": "Blink interval (ms)",
  "dz.idiff.blinkPlay": "Play",
  "dz.idiff.blinkPause": "Pause",
  "dz.idiff.blinkReducedMotionNote": "Auto-blink is off because your device asked for reduced motion. Use the button below to switch between the two images manually.",
  "dz.idiff.showA": "Show image A",
  "dz.idiff.showB": "Show image B",
  "dz.idiff.sizeBanner": "These images are different sizes:",
  "dz.idiff.sizeOverlap": "Overlap",
  "dz.idiff.sizeScale": "Scale to match",
  "dz.idiff.sizeOverlapDesc": "Comparing only the top-left region the two images share, at",
  "dz.idiff.sizeScaleDesc": "Image B is resampled onto image A's grid before comparing, at",
  "dz.pstyle.name": "Photo Styles",
  "dz.pstyle.benefit": "Turn a photo into a pencil sketch or a painterly style — processed entirely on your device.",
  "dz.pstyle.pageTitle": "Photo Styles — pencil sketch and painterly filters",
  "dz.pstyle.seo": "Preview pencil-sketch and painterly styles on your own photo before choosing one, adjust detail and softness, then download the full-resolution result. Nothing is uploaded — the image is processed on your device.",
  "dz.pstyle.failed": "That image could not be read.",
  "dz.pstyle.drop": "Choose a photo",
  "dz.pstyle.chooseStyle": "Choose a style",
  "dz.pstyle.style.pencil-grey": "Pencil sketch (grey)",
  "dz.pstyle.style.pencil-colour": "Pencil sketch (colour)",
  "dz.pstyle.style.cartoon": "Cartoon",
  "dz.pstyle.style.stylize": "Painterly",
  "dz.pstyle.style.halftone": "Halftone",
  "dz.pstyle.style.edges": "Edge sketch",
  "dz.pstyle.comingSoon": "Coming soon",
  "dz.pstyle.preparing": "Preparing…",
  "dz.pstyle.engineWhy": "Rendering these styles needs a small one-time engine download — it runs entirely on your device, nothing is uploaded.",
  "dz.pstyle.engineReady": "Ready — pick a style above.",
  "dz.pstyle.previewAlt": "Styled photo preview",
  "dz.pstyle.adjust": "Adjust",
  "dz.pstyle.param.detail": "Detail",
  "dz.pstyle.param.softness": "Softness",
  "dz.pstyle.processing": "Processing…",
  "dz.pstyle.download": "Download photo",
  "dz.pstyle.changeStyle": "Change style",
  "dz.pstyle.another": "Another photo",
  "dz.pstyle.saved": "Saved.",
  "dz.idiff.regionsCount.many": "{n} regions changed",
  "dz.pano.name": "Panorama Stitcher",
  "dz.pano.benefit": "Combine several overlapping photos into one wide panorama — stitched entirely on your device.",
  "dz.pano.pageTitle": "Panorama Stitcher — combine photos into one wide image",
  "dz.pano.seo": "Upload a set of overlapping photos, drag them into the order you shot them, and stitch them into one wide panorama. Crop the suggested frame or keep the full ragged edge, then download — nothing is uploaded, the stitching runs on your device.",
  "dz.pano.overlapHint": "Best results come from photos that overlap by about 30% with their neighbours — think of a slow sweep, not separate shots.",
  "dz.pano.capNote": "Up to {n} photos per panorama.",
  "dz.pano.workResNote": "Each photo is processed at up to {px}px on its longer side to keep stitching fast.",
  "dz.pano.capHit": "Only the first {n} photos were added — remove one to add another.",
  "dz.pano.reorderHint": "Drag photos into the order you shot them — the order affects how they stitch together.",
  "dz.pano.moveEarlier": "Move earlier",
  "dz.pano.moveLater": "Move later",
  "dz.pano.removeOne": "Remove this photo",
  "dz.pano.addMore": "Add more photos",
  "dz.pano.drop": "Choose photos",
  "dz.pano.another": "Start over",
  "dz.pano.needTwo": "Add at least 2 photos to stitch a panorama.",
  "dz.pano.engineWhy": "Stitching needs a small one-time engine download — it runs entirely on your device, nothing is uploaded.",
  "dz.pano.stitchBtn": "Stitch panorama",
  "dz.pano.stage.preparing": "Preparing photos…",
  "dz.pano.stage.stitching": "Stitching photos…",
  "dz.pano.stage.cropping": "Finding the best crop…",
  "dz.pano.elapsed": "{s}s elapsed",
  "dz.pano.cancel": "Cancel",
  "dz.pano.failedTitle": "Couldn't stitch these photos",
  "dz.pano.failure.need-more-overlap": "These photos don't share enough overlapping detail to line up. Retake them with about 30% overlap between each pair, sweeping steadily across the scene.",
  "dz.pano.failure.moving-subjects": "Something moved between shots — people, cars, leaves — and broke the match. Reshoot in one quick sweep, or leave out the photo with the movement.",
  "dz.pano.failure.exposure-mismatch": "Brightness or colour shifted too much between shots. Lock exposure and focus (AE/AF lock) before sweeping, then retake.",
  "dz.pano.failure.unknown": "These photos couldn't be combined. Try retaking with more overlap and steadier exposure across every shot.",
  "dz.pano.failure.tryAgain": "Try again",
  "dz.pano.failure.reorder": "Reorder photos",
  "dz.pano.failure.removeImage": "Remove a photo",
  "dz.pano.cropAlt": "Suggested crop — drag to move",
  "dz.pano.dragCropHint": "Drag the frame to adjust the crop, or use the arrow keys.",
  "dz.pano.downloadCropped": "Download cropped",
  "dz.pano.keepFull": "Keep full frame",
  "dz.pano.resetCrop": "Reset crop",
  "dz.pano.noCropFound": "No clean rectangle was found inside the stitched photo — download the full frame instead.",
  "dz.pano.saved": "Saved.",
  "dz.pphoto.name": "Product Photos",
  "dz.pphoto.benefit": "Batch-crop, whiten backgrounds and resize product photos to a size preset — processed entirely on your device.",
  "dz.pphoto.caution": "Works best with a plain, evenly lit background — automatic subject detection may not separate a cluttered scene cleanly.",
  "dz.pphoto.pageTitle": "Product Photos — batch crop, white background and resize",
  "dz.pphoto.seo": "Drop a batch of product photos, pick a size preset (or add your own), and each photo is cropped toward the subject, padded to the right aspect ratio, its background pushed toward white, and resized — then checked against the preset so you can see exactly which photos pass. Nothing is uploaded; everything runs on your device, and you download the finished set as a ZIP.",
  "dz.pphoto.failed": "failed",
  "dz.pphoto.drop": "Choose photos",
  "dz.pphoto.addMore": "Add more photos",
  "dz.pphoto.selected": "selected",
  "dz.pphoto.passed": "passed",
  "dz.pphoto.another": "Start over",
  "dz.pphoto.presetLabel": "Size preset",
  "dz.pphoto.addPreset": "Add preset",
  "dz.pphoto.preset.square": "Square, white background",
  "dz.pphoto.preset.portrait": "Portrait 4:5, white background",
  "dz.pphoto.preset.landscape": "Landscape 16:9",
  "dz.pphoto.presetName": "Name",
  "dz.pphoto.presetAspect": "Aspect ratio (width:height)",
  "dz.pphoto.presetMinPx": "Minimum size (px, shorter side)",
  "dz.pphoto.presetMaxPx": "Maximum size (px, longer side)",
  "dz.pphoto.presetMaxMB": "Maximum file size (MB)",
  "dz.pphoto.presetCoverage": "Minimum subject coverage (%)",
  "dz.pphoto.presetWhiteBg": "Require white background",
  "dz.pphoto.presetSave": "Save preset",
  "dz.pphoto.presetCancel": "Cancel",
  "dz.pphoto.presetUntitled": "Untitled preset",
  "dz.pphoto.presetErrAspect": "Aspect ratio must be a positive width and height.",
  "dz.pphoto.presetErrPx": "Maximum size must be at least the minimum size.",
  "dz.pphoto.presetErrBytes": "Maximum file size must be greater than zero.",
  "dz.pphoto.presetErrCoverage": "Coverage must be between 0 and 100%.",
  "dz.pphoto.engineWhy": "Processing these photos needs a small one-time engine download — it runs entirely on your device, nothing is uploaded.",
  "dz.pphoto.process": "Process batch",
  "dz.pphoto.processing": "Processing…",
  "dz.pphoto.progress": "Processing {done} of {total}…",
  "dz.pphoto.statusQueued": "Queued",
  "dz.pphoto.itemFailed": "Couldn't process",
  "dz.pphoto.pass": "Meets the preset",
  "dz.pphoto.rule.aspect": "Aspect ratio",
  "dz.pphoto.rule.minPx": "Minimum size",
  "dz.pphoto.rule.maxPx": "Maximum size",
  "dz.pphoto.rule.maxBytes": "File size",
  "dz.pphoto.rule.subjectCoverage": "Subject coverage",
  "dz.pphoto.rule.whiteBackground": "White background",
  "dz.pphoto.editorTitle": "Edit this photo",
  "dz.pphoto.before": "Before",
  "dz.pphoto.after": "After",
  "dz.pphoto.marginLabel": "Crop margin around the subject",
  "dz.pphoto.normalizeLabel": "Push background toward white",
  "dz.pphoto.rerun": "Reprocess",
  "dz.pphoto.backToGrid": "Back to grid",
  "dz.pphoto.remove": "Remove photo",
  "dz.pphoto.patternLabel": "Filename pattern",
  "dz.pphoto.downloadZip": "Download ZIP",
  "dz.pphoto.saved": "Saved.",
  "dz.jig.name": "Jigsaw Puzzle",
  "dz.jig.pageTitle": "Jigsaw Puzzle — turn a photo into a puzzle you can play",
  "dz.jig.seo": "Upload a photo, pick a piece count from 12 to 300 (or set your own), and solve an interlocking or simple-grid jigsaw puzzle on your device. Drag pieces into place or play entirely by keyboard, and pick up right where you left off — progress saves automatically.",
  "dz.jig.benefit": "Turn any photo into a jigsaw puzzle and solve it right on your device — nothing is uploaded.",
  "dz.jig.drop": "Choose a photo",
  "dz.jig.another": "Another photo",
  "dz.jig.pieceCount": "Piece count",
  "dz.jig.custom": "Custom",
  "dz.jig.customLabel": "Number of pieces",
  "dz.jig.overCap": "{cap} pieces is the most this screen can comfortably show.",
  "dz.jig.useCapInstead": "Use {cap} instead",
  "dz.jig.pieceStyle": "Piece style",
  "dz.jig.styleClassic": "Classic interlocking",
  "dz.jig.styleGrid": "Simple grid",
  "dz.jig.play": "Play",
  "dz.jig.print": "Print",
  "dz.jig.loadFailed": "That photo could not be read.",
  "dz.jig.resumeTitle": "Continue your puzzle?",
  "dz.jig.resume": "Resume",
  "dz.jig.discard": "Discard",
  "dz.jig.backToSetup": "Back",
  "dz.jig.movesLabel": "{n} moves",
  "dz.jig.pause": "Pause",
  "dz.jig.resumeTimer": "Resume",
  "dz.jig.hint": "Hint",
  "dz.jig.hintCount": "Hint ({n})",
  "dz.jig.assists": "Assists",
  "dz.jig.exit": "Exit",
  "dz.jig.pausedNote": "Paused",
  "dz.jig.zoomOut": "Zoom out",
  "dz.jig.resetView": "Fit to screen",
  "dz.jig.zoomIn": "Zoom in",
  "dz.jig.tray": "Tray",
  "dz.jig.edgesFirst": "Edges first",
  "dz.jig.dblclickHint": "Double-click (or double-tap) a stray piece on the board to send it back to the tray.",
  "dz.jig.boardGridLabel": "Puzzle board",
  "dz.jig.completeTitle": "Solved!",
  "dz.jig.placedAnnounce": "Piece placed. {placed} of {total} placed.",
  "dz.jig.notPlacedAnnounce": "Piece returned to the tray.",
  "dz.jig.selectedAnnounce": "Piece {n} picked up.",
  "dz.jig.deselectedAnnounce": "Piece put back down.",
  "dz.jig.cancelledAnnounce": "Placement cancelled.",
  "dz.jig.returnedAnnounce": "Piece returned to the tray.",
  "dz.jig.hintAnnounce": "Showing the correct spot.",
  "dz.jig.completeAnnounce": "Puzzle complete in {time}, {moves} moves.",
  "dz.jig.cellLabel": "Row {row}, column {col}",
  "dz.jig.cellEmpty": "empty",
  "dz.jig.cellFilled": "piece placed",
  "dz.jig.cellBorder": "border piece",
  "dz.jig.cellAlreadyPlacedAnnounce": "That spot is already filled.",
  "dz.jig.trayPieceLabel": "Piece {n}",
  "dz.jigsaw.print.title": "Print the puzzle",
  "dz.jigsaw.print.paper": "Paper",
  "dz.jigsaw.print.size": "Puzzle size",
  "dz.jigsaw.print.pages": "Pages",
  "dz.jigsaw.print.grid": "Grid",
  "dz.jigsaw.print.export": "Export PDF",
  "dz.jigsaw.print.exporting": "Exporting…",
  "dz.jigsaw.print.cardStock": "Print on card stock if you have it. Plain paper tears along the cuts.",
  "dz.jigsaw.print.saved": "PDF saved",
  "dz.jigsaw.print.manyPagesTitle": "That's a lot of sheets",
  "dz.jigsaw.print.manyPages": "This puzzle will print across many pages. Each sheet has corner marks and its own number — line them up and tape them together before cutting.",
  "dz.jigsaw.print.refLabel": "Reference page",
  "dz.jigsaw.print.scaleMark": "50 mm — check the scale",
  "dz.jigsaw.print.sheetLabel": "Sheet",
  "dz.tuner.title": "Instrument Tuner",
  "dz.tuner.benefit": "Live pitch detection from your microphone — oud first, then guitar, ukulele, violin and bass.",
  "dz.tuner.pageTitle": "Instrument Tuner — Dzzz",
  "dz.tuner.seo": "Tune an oud, guitar, ukulele, violin or bass by ear using your microphone. Pick a tuning, see every string's target note and frequency, and read the live cents deviation as you play. Detection runs entirely on your device — nothing is uploaded or recorded.",
  "dz.tuner.tuningLabel": "Tuning",
  "dz.tuner.referenceLabel": "Reference A (Hz)",
  "dz.tuner.start": "Start listening",
  "dz.tuner.starting": "Starting…",
  "dz.tuner.stop": "Stop listening",
  "dz.tuner.gateNote": "An explicit tap is required before the microphone can be read. This screen is that tap — decline it and you can still browse every string's target frequency below.",
  "dz.tuner.privacy": "Audio is analysed on your device only. Nothing is uploaded, recorded or saved.",
  "dz.tuner.deniedTitle": "Microphone access declined",
  "dz.tuner.deniedBody": "You can still see every string's target note and frequency below. To use the live meter, allow the microphone in your settings and try again.",
  "dz.tuner.nodeviceTitle": "No microphone found",
  "dz.tuner.nodeviceBody": "This device doesn't seem to have a microphone available. You can still browse the tuning reference below.",
  "dz.tuner.busyTitle": "Microphone could not be started",
  "dz.tuner.busyBody": "Another app or tab may be using it. Close anything else that might have the microphone open and try again.",
  "dz.tuner.unsupportedTitle": "Live tuning isn't available here",
  "dz.tuner.unsupportedBody": "Microphone input isn't supported here. You can still browse every string's target frequency below.",
  "dz.tuner.stalledTitle": "No signal from the microphone",
  "dz.tuner.stalledBody": "The microphone was granted but nothing came through. Try again, or check that it isn't muted at the system level.",
  "dz.tuner.retry": "Try again",
  "dz.tuner.playHint": "Play or pluck a string",
  "dz.tuner.nearestStringLabel": "Nearest string",
  "dz.tuner.centsLabel": "cents",
  "dz.tuner.flat": "Flat — tune up",
  "dz.tuner.sharp": "Sharp — tune down",
  "dz.tuner.inTune": "In tune",
  "dz.tuner.meterLabel": "Tuning meter",
  "dz.tuner.stringsHeading": "Strings in this tuning",
  "dz.tuner.colString": "String",
  "dz.tuner.colNote": "Note",
  "dz.tuner.colHz": "Hz",
  "dz.tuner.sourceLabel": "Source",
  "dz.tuner.honesty": "A phone microphone and this audio stack are not a lab instrument. Accuracy depends on your microphone and background noise — treat this as a helpful guide, not a calibrated tuner.",
  "dz.idphoto.name": "Passport Photo",
  "dz.idphoto.pageTitle": "Passport Photo — check a photo against published ID dimensions",
  "dz.idphoto.seo": "Mark the crown and chin on your own photo and check it against the published dimensions for a Saudi eVisa, Schengen, US or UK passport photo — head height, eye line, resolution and file size. Everything runs on your device; nothing is uploaded. Dimensions only: it does not judge expression, glasses or dress, and it cannot promise a photo will be accepted.",
  "dz.idphoto.benefit": "Check a photo against the published dimensions before you pay for prints.",
  "dz.idphoto.presetGroup": "Document",
  "dz.idphoto.dropHere": "Choose a photo",
  "dz.idphoto.dragHint": "Drag the crown and chin lines onto your photo. The crop and every measurement follow them.",
  "dz.idphoto.crown": "Crown (top of head)",
  "dz.idphoto.chin": "Chin",
  "dz.idphoto.eye": "Eye line",
  "dz.idphoto.crownMarker": "Crown line — drag, or use the arrow keys",
  "dz.idphoto.chinMarker": "Chin line — drag, or use the arrow keys",
  "dz.idphoto.eyeMarker": "Eye line — drag, or use the arrow keys",
  "dz.idphoto.ruleHeadHeight": "Head height",
  "dz.idphoto.ruleEyeLine": "Eye line",
  "dz.idphoto.ruleResolution": "Resolution",
  "dz.idphoto.ruleFileSize": "File size",
  "dz.idphoto.ruleBackground": "Background",
  "dz.idphoto.needs": "needs",
  "dz.idphoto.export": "Download photo",
  "dz.idphoto.exportedWithIssues": "Downloaded — but some measurements are outside the published range.",
  "dz.idphoto.editAgain": "Adjust the lines",
  "dz.idphoto.another": "Another photo",
  "dz.idphoto.assistiveCheck": "Measurement results",
  "dz.idphoto.backgroundAssistive": "Background is checked only for evenness, by sampling the corners of the crop.",
  "dz.idphoto.sourceLine": "Specification published by",
  "dz.idphoto.viewSource": "View the official specification",
  "dz.idphoto.notAcceptanceNote": "This checks dimensions only. Meeting them is not a guarantee that the photo will be accepted — the authority decides.",
  "dz.idphoto.honesty": "We include only specifications we could confirm against the issuing authority's own published page, and each one links to it.",
  "dz.idphoto.excludedTitle": "Not included",
  "dz.idphoto.excludedNote": "Saudi passport and Iqama photos are not included. Their measurements could not be confirmed against the issuing authority — the figures repeated by commercial photo sites are not an official source, so we would rather leave them out than guess.",
  "dz.idphoto.otherReqsTitle": "Requirements this tool does not check",
  "dz.idphoto.otherReqsBody": "Expression, open eyes, glasses, head covering, dress and how recent the photo is are all set by the authority and are for you to check against its page.",
  "dz.idphoto.ruleBackgroundNeeds": "≥ {min} and even",
  "dz.idphoto.scopeNote": "This tool never looks for a face. You place the crown, chin and eye lines — it only measures what you placed.",
  "dz.idphoto.takePhoto": "Take a photo",
  "dz.idphoto.captureTitle": "Take a photo",
  "dz.idphoto.capture": "Capture",
  "dz.idphoto.captureHint": "Align your eyes with the red line and fill the guide band with your head and shoulders.",
  "dz.idphoto.eyeLineGuide": "EYE LINE",
  "dz.idphoto.shouldersGuide": "SHOULDERS",
  "dz.idphoto.presetEncodes": "This preset encodes",
  "dz.idphoto.reqOutputSize": "Output size",
  "dz.idphoto.reqHeadRange": "Head height",
  "dz.idphoto.reqEyeLine": "Eye line",
  "dz.idphoto.reqFileSize": "File size",
  "dz.idphoto.reqBackground": "Background",
  "dz.idphoto.verdictPass": "Meets every published requirement.",
  "dz.idphoto.verdictCaution": "Close to the published range in one or more places — worth a second look before you print.",
  "dz.idphoto.verdictFail": "Outside the published range — likely to be handed back at the counter.",
  "dz.idphoto.levelPass": "PASS",
  "dz.idphoto.levelCaution": "CAUTION",
  "dz.idphoto.levelFail": "FAIL",
  "dz.idphoto.exportAnyway": "Download anyway",
  "dz.idphoto.exportRisk": "One or more measurements are outside the published range. This photo may be rejected — the choice to download it anyway is yours.",
  "dz.idphoto.adviceHeadHeightAbove": "The head fills more of the frame than this preset allows. Retake with more space around the head, or check the crown and chin lines are on the right spots.",
  "dz.idphoto.adviceHeadHeightBelow": "The head fills less of the frame than this preset requires. Retake with the head larger in the shot, or check the crown and chin lines.",
  "dz.idphoto.adviceEyeLineAbove": "There isn't enough space above the eye line in this photo. Retake with more room above the head, or check the crown and eye-line markers.",
  "dz.idphoto.adviceEyeLineBelow": "There isn't enough space below the eye line in this photo. Retake with more room below the head, or check the eye-line marker.",
  "dz.idphoto.adviceResolution": "This crop doesn't have enough native pixels for the required output size. Use a higher-resolution source photo.",
  "dz.idphoto.adviceFileSizeAbove": "The exported file is larger than this preset allows. A plainer, more even background usually compresses smaller — try replacing the background below.",
  "dz.idphoto.adviceFileSizeBelow": "The exported file is smaller than this preset requires.",
  "dz.idphoto.adviceBackgroundDark": "The background reads darker than required. Improve lighting, use a plainer light backdrop, or replace the background below.",
  "dz.idphoto.adviceBackgroundUneven": "The background isn't even. Use a plain, evenly lit backdrop, or replace the background below.",
  "dz.idphoto.bgSectionTitle": "Background",
  "dz.idphoto.bgBlurb": "Segmentation can miss hair, headscarves and dark clothing against a dark wall — the brush below fixes the edges by hand.",
  "dz.idphoto.bgReplace": "Replace background",
  "dz.idphoto.bgWorking": "Removing background…",
  "dz.idphoto.bgFailed": "Background removal failed. You can try again, or keep the original background.",
  "dz.idphoto.bgWhite": "White",
  "dz.idphoto.bgOffwhite": "Off-white",
  "dz.idphoto.bgGray": "Light grey",
  "dz.idphoto.bgCustom": "Custom colour",
  "dz.idphoto.repairTitle": "Fix the edges",
  "dz.idphoto.repairBody": "Brush over anything the automatic cut-out missed or took too much of.",
  "dz.idphoto.keep": "Keep",
  "dz.idphoto.erase": "Erase",
  "dz.idphoto.brushSize": "Brush size",
  "dz.idphoto.bgDiscard": "Keep original background",
  "dz.idphoto.markerResetsBg": "Moving the crown, chin or eye line will discard the background replacement below.",
  "dz.idphoto.sheetTitle": "Print sheet",
  "dz.idphoto.exportSheet": "Download print sheet (PDF)",
  "dz.idphoto.sheetSize": "Paper size",
  "dz.idphoto.rulerNote": "The 50 mm mark should measure exactly 50 mm on the printed page. If it doesn't, the print was scaled — turn off “fit to page” and print at actual size (100%).",
  "dz.idphoto.sheetCount": "{n} photos per sheet",
  "dz.idphoto.sheetCount.one": "1 photo per sheet",
  "dz.idphoto.sheetCount.two": "2 photos per sheet",
  "dz.idphoto.sheetCount.few": "{n} photos per sheet",
  "dz.idphoto.sheetUnavailable": "This specification is a digital upload with no printed size, so there's no print sheet for it.",
  "dz.idphoto.sheetFailed": "Could not build the print sheet. Please try again.",
  "dz.idphoto.sheetPaperA4": "A4",
  "dz.idphoto.sheetPaperLetter": "US Letter",
  "dz.jig.resolvedCount": "{n} pieces · {cols} × {rows} grid",
  "dz.jig.showTimer": "Show a timer",
  "dz.idphoto.bgOptionalSummary": "Replace the background — optional",
  "dz.idphoto.bgNotNeeded": "Your photo is ready without this. Open it only if the background needs changing; it needs a one-time model download.",
  "dz.count.undo": "Undo",
  "dz.jig.difficulty.easy": "Easy",
  "dz.jig.difficulty.medium": "Medium",
  "dz.jig.difficulty.hard": "Hard",
  "dz.compareCsv.routeSmall": "Compared here in the page",
  "dz.compareCsv.routeLarge": "Too large for the page — the big-file engine can do it",
  "dz.compareCsv.routeWhy": "Files up to 25 MB are compared right here, with nothing to download. Past that, Dzzz can compare them with an on-device database engine that reads them from disk instead. Either way, neither file is uploaded.",
  "dz.compareCsv.consentTitle": "These files need the big-file engine",
  "dz.compareCsv.consentBody": "One of your files is larger than this page can hold in memory. Dzzz can download an engine that reads it from disk instead — once, then it stays on your device. Nothing about your files is uploaded.",
  "dz.compareCsv.blankHeader": "This file has a blank column header. Give every column a name and try again.",
  "dz.compareCsv.exportNote": "Exporting builds the whole list of differences at once — a very large one may not fit in memory."
}
