{
  "@@locale": "en",
  "nav.home": "Status",
  "status.title": "Status",
  "status.sip.connected": "Registered",
  "status.sip.connecting": "Connecting…",
  "status.sip.not_configured": "Not configured",
  "status.sip.since": "since {duration}",
  "status.sip.at": "at {host} as {user}",
  "status.sip.ext": "Internal number {n}",
  "status.sip.public_ip": "Public IP {ip}",
  "status.sip.nat_symmetric": "⚠️ symmetric NAT — audio needs a port-identical RTP port forward",
  "status.sip.stun": "STUN {server} · NAT: {nat}",
  "status.sip.setup_cta": "Set up telephony",
  "status.sip.redo_cta": "Reconfigure telephony",
  "status.token.set": "PhoneBlock token set",
  "status.token.missing": "No PhoneBlock token",
  "status.token.rejected": "Token Rejected",
  "status.token.rejected.msg": "PhoneBlock has rejected the token. Please generate a new token by clicking \"Request New.\"",
  "status.token.cta": "Create token",
  "status.token.test": "Test",
  "status.token.renew": "Renew",
  "status.token.testing": "Checking token…",
  "status.token.test.ok": "Token valid — PhoneBlock reachable.",
  "status.token.test.fail": "Token was rejected. Please request a new one.",
  "status.token.test.none": "No token configured.",
  "status.counters.total": "Total",
  "status.counters.spam": "Spam blocked",
  "status.counters.legit": "Legitimate",
  "status.counters.errors": "Errors",
  "status.info": "Firmware {fw} · IP {ip} · Uptime {uptime} · API latency {api}",
  "status.api.failed": "The last request to the PhoneBlock server ({when}) failed: {reason}.",
  "status.api.fail.dns": "Server name cannot be resolved (DNS)",
  "status.api.fail.connect": "No connection to the server",
  "status.api.fail.tls": "Secure connection (TLS) failed",
  "status.api.fail.timeout": "No response within the waiting period",
  "status.api.fail.http": "The server responds with HTTP {status}",
  "status.api.fail.other": "Transmission errors",
  "status.api.fail.hint": "Check the router's Internet connection and the dongle's network settings (gateway, DNS).",
  "status.calls.title": "Recent calls",
  "status.calls.empty": "no calls yet",
  "status.calls.col.when": "When",
  "status.calls.col.number": "Number",
  "status.calls.col.name": "Name",
  "status.calls.col.verdict": "Verdict",
  "status.calls.show_all": "Show all ({count})",
  "status.calls.show_less": "Show fewer",
  "status.calls.time_unknown": "unknown",
  "status.calls.clear": "Clear list",
  "status.calls.log_known": "Log known callers",
  "status.calls.log_known.help": "When off, calls from numbers in the address book and internal codes (**, *…) are not added to the list — counters above still update.",
  "status.calls.verdict.spam": "SPAM ({direct} direct, {range} range)",
  "status.calls.verdict.spam_plain": "SPAM",
  "status.calls.verdict.spam_list": "SPAM (blocklist, {scope})",
  "status.calls.verdict.suspect": "SPAM-SUSPECT ({direct} direct, {range} range)",
  "status.calls.verdict.blacklist": "SPAM (blacklist, {scope})",
  "status.calls.verdict.name_pattern": "SPAM (Name Pattern)",
  "status.calls.verdict.legitimate": "legitimate",
  "status.calls.verdict.unknown": "unknown",
  "status.calls.verdict.test": "Test",
  "status.calls.verdict.error": "Error",
  "status.calls.verdict.scope.number": "number",
  "status.calls.verdict.scope.range": "range",
  "region.title": "Language and Country",
  "region.lang": "Language",
  "region.country": "Country",
  "region.country.hint": "Phone numbers without a country code will be assigned this country. If the wrong country is listed here, PhoneBlock will not find a match for any calls. The language also applies to the answering machine message and the status email.",
  "status.thresholds.title": "Block thresholds",
  "status.thresholds.intro": "How many PhoneBlock votes the dongle requires before it traps a call. Direct votes weigh more than range votes, so each side has its own threshold.",
  "status.thresholds.direct": "Direct votes",
  "status.thresholds.direct.help": "Votes against the calling number itself. Default 4 — same value as the public PhoneBlock blocklist.",
  "status.thresholds.range": "Range votes",
  "status.thresholds.range.help": "Votes against neighbors in the same 10/100-block. Default 10. \"Off\" disables range-based blocking — only direct hits count then.",
  "status.thresholds.range.off": "Off",
  "status.thresholds.saved": "Saved.",
  "status.thresholds.invalid": "Invalid value.",
  "status.system.title": "System",
  "status.system.heap": "Free memory: {free} (minimum: {min}, largest block: {largest})",
  "status.system.fs": "Data partition: {free} free of {total} ({used} used)",
  "status.system.temp": "Chip temperature: {temp} °C",
  "status.system.wifi": "Wi-Fi signal: {rssi} dBm ({quality})",
  "status.system.wifi.good": "good",
  "status.system.wifi.ok": "sufficient",
  "status.system.wifi.weak": "weak",
  "status.system.wifi_tx": "Transmit power: {tx} dBm",
  "status.system.wifi_link": "Wi-Fi \"{ssid}\" via access point {bssid}, channel {channel}, connected since {since}",
  "status.system.wifi_drops": "{drops} Disconnections since startup",
  "status.system.wifi.weak_hint": "Weak Wi-Fi signal: Move the dongle closer to the Fritz!Box or a repeater. In a mesh network, the Fritz!Box's mesh overview shows which box it is connected to.",
  "status.system.col.task": "Task",
  "status.system.col.cpu": "CPU",
  "status.system.col.stack": "Stack free",
  "status.system.led_quiet": "Only light the LED when there is a problem",
  "status.system.led_quiet.hint": "Normally the LED stays lit while everything is fine. With this option it stays dark in normal operation and only lights or blinks when there is a problem (setup needed, not registered, token rejected, no connection). Handy in a living room.",
  "status.system.lcd_flip": "Turn the display upside down (rotate 180°)",
  "status.system.lcd_flip.hint": "Depending on the orientation of the USB port on your Fritz!Box, the USB flash drive will be oriented differently. Rotate the display 180°.",
  "status.clock.now": "Time: {time}",
  "status.clock.pending": "Time: synchronising …",
  "status.time.today": "today {time}",
  "status.time.yesterday": "yesterday {time}",
  "status.tz.current": "Timezone: {tz}",
  "status.tz.apply": "Switch to {zone}",
  "status.tz.saved": "Timezone saved.",
  "status.errors.title": "Log",
  "status.errors.note": "The log is for diagnosing problems — not every entry is a real fault; many errors are transient and clear up on their own.",
  "status.errors.empty": "no entries",
  "status.errors.clear": "Clear log",
  "status.errors.capture_info": "Also log info messages",
  "status.errors.capture_info.hint": "For troubleshooting: also shows info messages (e.g. the server:port tried). Fills the log quickly — switch off again afterwards.",
  "status.auth.title": "Access protection",
  "status.auth.intro": "Protects the configuration UI in everyday operation. When you turn this on, the page asks for a \"Login with PhoneBlock\" before it shows call data or accepts setting changes.",
  "status.auth.disabled": "Access protection off — anyone on the LAN can reach the dashboard without logging in.",
  "status.auth.enabled": "Access protection on — signed in as your PhoneBlock user.",
  "status.auth.enabled.user": "Access protection on — signed in as {user}.",
  "status.auth.no_token": "Access protection needs a configured PhoneBlock token (see step 2 above). Only then can the dongle verify your identity against the server.",
  "status.auth.enable": "Enable access protection",
  "status.auth.disable": "Disable access protection",
  "status.auth.logout": "Sign out",
  "status.auth.activate.intro": "Before turning it on you are redirected to phoneblock.net to sign in — protection is only activated after a successful login. That way you cannot lock yourself out.",
  "login.title": "Sign in required",
  "login.intro": "Access protection on this dongle is active. Click below to sign in with your PhoneBlock account — you will briefly be redirected to phoneblock.net and sent back automatically.",
  "login.button": "Sign in with PhoneBlock",
  "login.remember": "Stay signed in",
  "login.remember.help": "Sets a cookie on this device so the dongle remembers you next time without bouncing through phoneblock.net. Only one browser at a time can be remembered.",
  "login.error.mismatch": "Sign-in failed — this PhoneBlock account is not the owner of this dongle.",
  "login.error.mismatch_named": "Sign-in failed — this dongle belongs to account {expected}, but you are signed in as a different user.",
  "login.error.rejected": "Sign-in failed — the PhoneBlock server did not confirm the identity.",
  "login.error.expired": "The sign-in expired or was invalid. Please try again.",
  "login.error.persist": "Activation could not be saved. Please try again.",
  "login.error.missing": "The response from phoneblock.net was incomplete. Please try again.",
  "login.error.generic": "Sign-in failed. Please try again.",
  "status.reset.title": "Factory reset",
  "status.reset.intro": "Erases all dongle settings (SIP credentials, PhoneBlock token, error history) and reboots.",
  "status.reset.button": "Reset configuration",
  "status.reset.confirm": "Really erase all dongle settings and reboot?",
  "status.reset.running": "Resetting — the dongle is rebooting now.",
  "status.reset.error": "Reset failed: {msg}",
  "status.fw.title": "Update firmware",
  "status.fw.intro": "Upload a new firmware binary or check the PhoneBlock CDN for updates. Either way, the new version is written to the inactive flash slot; after the reboot the dongle boots it and automatically rolls back on failure.",
  "status.fw.current": "Active partition: {partition} · Version {version}",
  "status.fw.pick": "Choose firmware (.bin)",
  "status.fw.submit": "Upload & reboot",
  "status.fw.confirm": "Install the new firmware and reboot the dongle?",
  "status.fw.uploading": "Uploading… {pct}%",
  "status.fw.done": "Firmware uploaded — dongle is rebooting. Please wait a moment, then reload this page.",
  "status.fw.error": "Error: {msg}",
  "status.fw.check": "Check for update",
  "status.fw.checking": "Checking for update…",
  "status.fw.check.none": "No newer version available (currently {version}).",
  "status.fw.check.found": "New version {version} is being installed…",
  "status.fw.check.installed": "Version {version} installed — dongle is rebooting. Please wait a moment, then reload this page.",
  "status.fw.check.error": "Check failed: {msg}",
  "status.fw.failed": "Last update to version {version} did not survive the boot — automatically rolled back. Auto-update will skip this version. Click \"Check for update\" to retry.",
  "status.fw.auto_update": "Daily auto-update",
  "status.fw.auto_update.help": "When on, the dongle checks the PhoneBlock CDN once a day for a newer version and installs it automatically. Manually uploading a firmware turns this off so the daily check does not overwrite your hand-picked build — turn it back on here once you want to follow the released stream again.",
  "status.fw.channel": "Update channel",
  "status.fw.channel.help": "Choose \"Beta\" to receive test builds early — for example to verify a bug you reported. \"Stable\" only delivers released versions. Once a tested version is finally released, you switch back to it automatically.",
  "status.fw.channel.stable": "Stable",
  "status.fw.channel.beta": "Beta (test builds)",
  "status.fw.crash_report": "Send crash reports to phoneblock.net",
  "status.fw.crash_report.help": "When the dongle reboots after a software panic, a memory snapshot is written to a reserved flash partition. With this option on, the dongle uploads the snapshot to phoneblock.net on the next boot — that helps us find and fix field bugs. Switch it off to suppress reports; stored snapshots are then erased locally instead of sent.",
  "status.mail.title": "Status emails",
  "status.mail.intro": "The dongle can email you status notifications directly — through your own email account. Enter the credentials of your mail provider; the dongle sends at most one notification per day.",
  "status.mail.host": "SMTP server",
  "status.mail.port": "Port (blank = automatic)",
  "status.mail.security": "Encryption",
  "status.mail.security.tls": "TLS (port 465)",
  "status.mail.security.starttls": "STARTTLS (port 587)",
  "status.mail.user": "User name (SMTP login)",
  "status.mail.pass": "Password",
  "status.mail.pass.keep": "stored — leave blank to keep it",
  "status.mail.from": "Sender (email, blank = user name)",
  "status.mail.to": "Recipients (email; separate multiple recipients with \";\")",
  "status.mail.help": "Tip: Gmail and Outlook usually need an \"app password\" (when two-factor sign-in is on), not your normal account password. Classic providers such as GMX, web.de or mailbox.org work with user name and password.",
  "status.mail.on_error": "Email on errors and crashes",
  "status.mail.on_error.help": "Sends one email a day when an error has appeared in the log since the last notification — this includes a reboot after a crash.",
  "status.mail.on_spam": "Report Calls via Email",
  "status.mail.on_spam.help": "Sends an email once a day listing the calls since the last report—both blocked and allowed calls.",
  "status.mail.spam_only": "Report only blocked spam calls",
  "status.mail.spam_only.help": "The call email lists only calls that the dongle has blocked as spam. Legitimate and unknown callers are not included, and if only such calls are received, no email is sent.",
  "status.mail.on_update": "Email on firmware update",
  "status.mail.on_update.help": "Sends an email after the dongle has updated itself to a new firmware version — with a link to the changelog.",
  "status.mail.save": "Save",
  "status.mail.saved": "Saved.",
  "status.mail.test": "Send test email",
  "status.mail.testing": "Sending test email…",
  "status.mail.test.sent": "Sending test email — the result will appear in the log.",
  "status.mail.test.fail": "Sending failed — please check the settings and the log.",
  "status.mail.err.host": "SMTP server missing",
  "status.mail.err.user": "User name missing",
  "status.mail.err.pass": "Password missing",
  "status.mail.err.to": "Recipient invalid",
  "status.mail.err.to_many": "A maximum of {max} recipients is allowed",
  "status.mail.err.from": "Sender invalid",
  "status.mail.err.from_user": "Sender required — the user name is not an email address",
  "status.sync.title": "Blocklist sync",
  "status.sync.intro": "Numbers blocked at the handset (\"Block number\") are uploaded to the PhoneBlock database once a day and then removed from the Fritz!Box. The answer bot afterwards catches those callers for every PhoneBlock user.",
  "status.sync.unavailable": "Unavailable — requires a Fritz!Box setup.",
  "status.sync.never": "Not yet run.",
  "status.sync.last_ok": "Last run {ago} ago: {n} uploaded.",
  "status.sync.last_partial": "Last run {ago} ago: {n} uploaded, {f} failed.",
  "status.sync.last_fail": "Last run {ago} ago failed: {err}",
  "status.sync.running": "Sync in progress…",
  "status.sync.run_now": "Sync now",
  "status.sync.triggered": "Sync triggered.",
  "status.sync.busy": "Sync already running.",
  "status.sync.enable": "Enable blocklist sync",
  "status.sync.disabled": "Automatic sync disabled — manual run still available.",
  "status.localcache.title": "Blocklist cache",
  "status.localcache.intro": "Once a day the dongle downloads the current community blocklist plus your personal black/white list and stores them on internal flash. Incoming calls are then decided without an API round-trip — faster, and resilient to network glitches.",
  "status.localcache.enable": "Use blocklist cache",
  "status.localcache.enable.help": "Downloads the blocklist onto the dongle and decides calls locally. Off: every call is checked against the server directly — slower, and only possible with a working internet connection.",
  "status.localcache.disabled": "Disabled — calls are checked against the server directly.",
  "status.localcache.never": "Not downloaded yet.",
  "status.localcache.have": "{community} community entries, {personal} personal. Refreshed {ago} ago.",
  "status.localcache.last_fail": "Last download {ago} ago failed: {err}",
  "status.localcache.running": "Download in progress…",
  "status.localcache.wildcards": "Honour wildcard ranges",
  "status.localcache.wildcards.help": "Block whole number ranges (e.g. \"030 12 34 56*\") when the community has flagged them as spam, in addition to exact matches. Turn off to block only exact matches.",
  "status.localcache.run_now": "Download now",
  "status.localcache.triggered": "Download started.",
  "status.localcache.busy": "Download already running.",
  "status.names.title": "Name Filter",
  "status.names.intro": "If your FRITZ!Box finds the caller in a phone book, it will announce their name. If you use a third-party spam list (e.g., from Tellows), all entries will have a telltale name—you can mark these as spam here. The same applies to your own phone book if you give all unwanted callers the same name.",
  "status.names.patterns": "Names that indicate spam (separate with |)",
  "status.names.help": "A call is considered spam as soon as the reported name contains any of these strings; case does not matter. Example: “tellows|Score|SPAM.” You can find the caller’s name in the list of recent calls. Leaving this field blank disables the name filter.",
  "status.names.save": "Save Name Filter",
  "status.names.saved": "Name filter saved.",
  "status.names.failed": "Save failed.",
  "status.names.err.many": "A maximum of {max} names are allowed.",
  "status.names.err.long": "A name can be no more than {max} characters long.",
  "status.webhook.title": "Webhook for Calls",
  "status.webhook.intro": "For every call that appears in the call log, the dongle sends the call data via HTTP POST to this address—for example, to Home Assistant, ioBroker, or Node-RED. The content is a call log entry in JSON format, with the same fields as /api/calls.",
  "status.webhook.url": "Webhook URL",
  "status.webhook.help": "Only http:// and only to addresses on your home network, e.g., http://homeassistant.local:8123/api/webhook/phoneblock. Leaving this field blank disables the webhook.",
  "status.webhook.save": "Save Webhook",
  "status.webhook.saved": "Webhook saved.",
  "status.webhook.failed": "Save failed.",
  "status.webhook.err.https": "https is not supported: The dongle only transmits via http, and only on the home network.",
  "status.webhook.err.url": "Please enter a valid HTTP address, such as http://homeassistant.local:8123/api/webhook/phoneblock.",
  "status.webhook.err.long": "The address may be no more than {max} characters long.",
  "status.ann.title": "Spam announcement",
  "status.ann.default": "Built-in default announcement ({kb} KB).",
  "status.ann.custom": "Custom announcement ({kb} KB).",
  "status.ann.play": "Play current announcement",
  "status.ann.stop": "Stop",
  "status.ann.upload.label": "Upload your own (WAV/MP3/OGG, max. {s} s)",
  "status.ann.upload.pick": "Choose file",
  "status.ann.upload.submit": "Upload",
  "status.ann.upload.converting": "Converting…",
  "status.ann.upload.uploading": "Uploading…",
  "status.ann.upload.done": "Saved ({kb} KB).",
  "status.ann.upload.error": "Error: {msg}",
  "status.ann.upload.toolong": "Too long — maximum {s} seconds.",
  "status.ann.upload.decode_fail": "Could not decode the file.",
  "status.ann.reset.button": "Reset to default",
  "status.ann.reset.confirm": "Really discard the custom announcement?",
  "status.ann.accept_test": "Accept local test calls",
  "status.ann.accept_test.help": "When enabled, the dongle answers calls to internal Fritz!Box codes (**622, *21#, …) as spam — i.e. with the announcement and a hang-up. Lets you test the full call flow from another internal phone without reporting a real number to PhoneBlock.",
  "status.dialog.mode": "When You Receive Spam Calls",
  "status.dialog.mode.announcement": "Play the announcement and hang up",
  "status.dialog.mode.dialog": "Talking to the caller (dialogue)",
  "status.dialog.help": "In dialogue mode, the dongle answers the spam call and keeps the caller on the line with short phrases that respond to the caller’s answers until the caller hangs up—with no time limit. There is no recorded message in dialogue mode: Any custom recording is deleted when you switch modes and can only be uploaded again in message mode.",
  "status.dialog.clips.present": "Dialog sentences loaded ({lang}).",
  "status.dialog.clips.missing": "Dialog phrases haven't been loaded yet—until then, the dongle will place spam calls without a greeting.",
  "status.dialog.clips.pending": "Dialog sentences are loading now …",
  "status.dialog.clips.downloading": "Dialog sentences are loading ({kb} KB) …",
  "status.dialog.clips.failed": "Failed to load the dialog phrases ({error}) – the dongle will try again during the next synchronization. Until then, it will hang up spam calls without playing an announcement.",
  "status.dialog.clips.unavailable": "No voice prompts have been published for this language and this device—the dongle hangs up on spam calls without playing a message.",
  "status.dialog.confirm_delete_own": "Your custom greeting will be deleted when you switch to the dialog. You can upload it again in greeting mode. Continue?",
  "status.dialog.vad_silence_db": "Silence Threshold (dBFS)",
  "status.dialog.vad_silence_db.help": "If the caller's volume is lower than this level, they are considered quiet. Set it higher (e.g., -30) if there is line noise, and lower (e.g., -45) for quiet callers. Default: -35.",
  "status.dialog.vad_min_silence_ms": "Response time (ms)",
  "status.dialog.comfort_noise": "Line Noise (dBFS)",
  "status.dialog.comfort_noise.help": "A faint hiss during and between sentences, so the line doesn't sound dead. -90 is practically off. Default: -60.",
  "status.dialog.saved": "Saved.",
  "status.dialog.tuning": "Fine-Tuning: Pause Detection and Background Noise",
  "status.dialog.failed": "Save failed.",
  "status.dialog.err.range": "Please enter a whole number between {min} and {max}.",
  "status.ann.upload.silent": "The recording is silent—nothing in it is louder than -45 dBFS.",
  "status.dialog.clips.own": "Custom dialog is active.",
  "status.dialog.speaker": "Voice",
  "status.dialog.speaker.use": "Use",
  "status.dialog.speaker.active": "active",
  "status.dialog.speaker.none": "No voices have been loaded yet—the dongle will load them the next time it syncs.",
  "status.dialog.own": "Custom Dialog",
  "status.dialog.own.replace_confirm": "Your custom dialog will be replaced by the sentences from {name}—the dongle can only hold one dialog. Download it first under “Create Your Own Dialog” if you want to keep it. Continue?",
  "status.dialog.own.leave_confirm": "Switching to announcement mode will delete your own dialogue. Continue?",
  "status.dialog.own.leave_download": "Would you like to download your dialogue as a file first?",
  "status.dialog.edit.title": "Create Your Own Dialog",
  "status.dialog.edit.intro": "You start with the sentences stored on the dongle. Delete recordings or add new ones (WAV/MP3/OGG); each one is normalized to the same volume, and silence is removed from the ends. Each phase requires at least one sentence, and the dongle selects one at random from among them.",
  "status.dialog.edit.yes_hint": "Never record a “yes”: A recorded “yes” can be misused as consent.",
  "status.dialog.phase.hello": "Welcome",
  "status.dialog.phase.who-is-there": "The caller remains silent after the greeting (“Who is this?”)",
  "status.dialog.phase.am-aparat": "The caller answers the phone",
  "status.dialog.phase.question": "Questions",
  "status.dialog.phase.cant-hear-you": "The caller remains silent during the call (“I can’t hear anything”)",
  "status.dialog.edit.add": "+ Add a recording",
  "status.dialog.edit.delete": "Delete",
  "status.dialog.edit.gauge": "{kb} of {max} KB",
  "status.dialog.edit.upload": "Load onto the dongle",
  "status.dialog.edit.download": "Download the dialog file",
  "status.dialog.edit.load_file": "Load Dialog File",
  "status.dialog.edit.reason.empty": "The \"{phase}\" phase does not yet have any recordings.",
  "status.dialog.edit.reason.many": "The \"{phase}\" phase has more than {max} shots.",
  "status.dialog.edit.reason.size": "The total size of the recordings exceeds the available space on the dongle—delete or trim some recordings.",
  "status.dialog.edit.bad_file": "This is not a valid dialog file.",
  "status.dialog.edit.no_set": "There is no dialogue on the dongle yet—add recordings for each phase.",
  "status.dialog.edit.changed": "The dongle now contains different recordings (the language or voice has been changed). Your edits in the editor haven't been uploaded yet.",
  "status.dialog.edit.reload": "Discard and reload",
  "status.dialog.edit.done": "Custom dialog saved ({kb} KB).",
  "hero.title": "Setup",
  "hero.intro": "Two steps, then the dongle blocks spam calls automatically. Both need to be ticked before the device is ready.",
  "hero.step1.todo": "Register the dongle with your phone system",
  "hero.step1.done": "Telephony configured",
  "hero.step2.todo": "Connect to PhoneBlock — so the dongle knows what counts as spam",
  "hero.step2.done": "Connected to PhoneBlock",
  "hero.cta.sip": "Set up telephony",
  "hero.cta.token": "Connect PhoneBlock",
  "sip.entry.title": "Set up telephony",
  "sip.entry.intro": "Choose how the dongle registers with your phone system.",
  "sip.entry.fritzbox": "Fritz!Box (recommended)",
  "sip.entry.fritzbox.desc": "Automatic setup. The dongle registers itself as an IP phone.",
  "sip.entry.provider": "Other provider",
  "sip.entry.provider.desc": "Register directly with Telekom, Vodafone, 1&1, sipgate or easybell.",
  "sip.entry.manual": "Manual (expert)",
  "sip.entry.manual.desc": "Fill in all SIP fields yourself.",
  "sip.fb.title": "Fritz!Box setup",
  "sip.fb.intro": "Enter the Fritz!Box admin password once. It is not stored.",
  "sip.fb.host": "Fritz!Box (host or IP)",
  "sip.fb.user": "User",
  "sip.fb.user.hint": "(leave empty → Fritz!Box default user)",
  "sip.fb.pass": "Password",
  "sip.fb.submit": "Create extension",
  "sip.fb.working": "Creating extension (~2–5 s)…",
  "sip.fb.done": "Extension created — registration starting.",
  "sip.fb.done.withnum": "Extension created (internal number {n}) — registration starting.",
  "sip.fb.error": "Error: {msg}",
  "sip.fb.2fa.title": "Two-factor confirmation",
  "sip.fb.2fa.button": "press any button on the Fritz!Box",
  "sip.fb.2fa.dtmf": "dial {seq} on a connected phone",
  "sip.fb.2fa.instructions": "Please now {hints}.",
  "sip.fb.2fa.cancelled": "2FA cancelled.",
  "sip.fb.2fa.timeout": "Timed out. Please try again.",
  "sip.prov.title": "Choose provider",
  "sip.prov.intro": "Pick your provider; get the credentials from their customer portal. If your provider is not listed, use the manual configuration.",
  "sip.prov.provider": "Provider",
  "sip.prov.user": "SIP user / phone number",
  "sip.prov.pass": "Password",
  "sip.prov.submit": "Save credentials",
  "sip.prov.done": "Saved. Registration starting.",
  "sip.prov.error": "Error: {msg}",
  "sip.manual.title": "Manual configuration",
  "sip.manual.intro": "All SIP fields. Leaving the password blank means “unchanged”.",
  "sip.manual.host": "SIP registrar",
  "sip.manual.port": "SIP port",
  "sip.manual.port.hint": "Leave empty for auto via DNS-SRV or the transport default (5060 UDP/TCP, 5061 TLS).",
  "sip.manual.user": "SIP user",
  "sip.manual.pass": "SIP password",
  "sip.manual.pass.hint": "Leave empty = keep the stored password.",
  "sip.manual.anon": "Register without a password (anonymous)",
  "sip.manual.anon.hint": "Clears any stored password and registers without one — e.g. anonymous@t-online.de on Telekom.",
  "sip.manual.submit": "Save",
  "sip.manual.done": "Saved.",
  "sip.manual.error": "Error: {msg}",
  "sip.manual.advanced": "Advanced parameters",
  "sip.manual.transport": "Transport",
  "sip.manual.transport.hint": "UDP, TCP and TLS can be selected. TLS encrypts the connection and is recommended where the provider supports it. The voice audio itself is not yet encrypted.",
  "sip.manual.auth_user": "Auth user",
  "sip.manual.auth_user.hint": "Empty = use SIP user for auth. Telekom: e-mail address.",
  "sip.manual.outbound": "Outbound proxy",
  "sip.manual.outbound.hint": "Optional, format host[:port]. Empty = register via the registrar directly.",
  "sip.manual.realm": "Realm",
  "sip.manual.realm.hint": "Empty = take from the server challenge.",
  "sip.manual.stun": "STUN server",
  "sip.manual.stun.hint": "Optional, format host[:port]. Discovers the public RTP port for direct provider registration. Empty = off. Set by the provider preset (Telekom: stun.t-online.de:3478).",
  "sip.manual.srtp": "SRTP",
  "sip.manual.srtp.hint": "SRTP is negotiated automatically: media is encrypted whenever the provider offers it (e.g. Telekom), otherwise plain RTP (e.g. the Fritz!Box on the LAN).",
  "sip.manual.local_port": "Local SIP port",
  "sip.manual.local_port.hint": "Port the dongle receives SIP on (default 15060). Empty = default.",
  "sip.manual.rtp_port": "RTP port (audio)",
  "sip.manual.rtp_port.hint": "Port for the voice channel (default 16000). Empty = default.",
  "sip.manual.fwd.title": "Port forwarding for direct provider registration",
  "sip.manual.fwd.body": "If the dongle registers directly with the provider (instead of via a VoIP-capable router) and the provider only supports UDP, add one UDP forwarding each to the dongle in your router — port-identical (external port = internal port): {sip} (SIP) and {rtp} (RTP). The dongle detects its public IP automatically (shown in the status above); you do not need to enter it. This only works with a real (dedicated) public IPv4 — not behind DS-Lite/CGNAT (shared IPv4), where no port forwarding is possible; there only TCP/TLS helps, if the provider supports it.",
  "sip.manual.srtp.off": "off",
  "sip.manual.srtp.optional": "optional",
  "sip.manual.srtp.mandatory": "mandatory",
  "token.title": "Connect PhoneBlock",
  "token.intro": "The dongle queries the PhoneBlock database for every incoming call. For that it needs a token.",
  "token.how": "Clicking the button below sends you to phoneblock.net for a one-time login (Google, Facebook or account). You then return here with the token set.",
  "token.current.set": "A token is already configured. A new login will generate a new one.",
  "token.current.missing": "No token configured yet.",
  "token.submit": "Sign in to PhoneBlock",
  "link.submit": "Link PhoneBlock Account",
  "link.how": "Clicking the button will display a code here. Then open phoneblock.net, log in, and enter the code there. The service will then retrieve the token on its own.",
  "link.starting": "Link is being prepared…",
  "link.compare": "Enter this code on phoneblock.net to link the service to your account.",
  "link.copy": "Copy code",
  "link.copied": "Code copied",
  "link.copy_failed": "Cannot copy—the code is highlighted; press Ctrl+C to copy it.",
  "link.open": "Open phoneblock.net",
  "link.manual": "The page is {url}—you can also enter the code there on another device, such as your cell phone.",
  "link.waiting": "Waiting for the code to be entered on phoneblock.net…",
  "link.approved": "PhoneBlock account linked — the token has been set.",
  "link.denied": "The link was rejected on phoneblock.net.",
  "link.expired": "The code has expired. Request a new code.",
  "link.error": "The link failed: {msg}",
  "link.retry": "Try again",
  "back.status": "← back to status",
  "back.sip": "← back to the choice",
  "i18n.loading": "Translation is loading …",
  "i18n.unavailable": "Translation not available – default language is displayed.",
  "status.calls.add_contact": "Add to the Fritz!Box phone book",
  "status.phonebook.title": "Phone Book for New Contacts",
  "status.phonebook.intro": "Callers that the Fritz!Box doesn't recognize appear in the call log without a name. Use the + button next to them to add them as a contact in the Fritz!Box—after that, the phone will display the name, and the dongle will no longer query PhoneBlock about that number.",
  "status.phonebook.current": "New contacts are saved in “{name}”.",
  "status.phonebook.unset": "Not yet specified — you will be prompted when you first create it.",
  "status.phonebook.change": "Change",
  "status.phonebook.unavailable": "Not available — can only be used with Fritz!Box setup.",
  "status.phonebook.saved": "Saved.",
  "pb.dialog.title": "Create a contact in the Fritz!Box",
  "pb.dialog.intro": "The next time you call, the phone will display the name instead of the number. The contact remains in your Fritz!Box—it is not transferred to PhoneBlock.",
  "pb.dialog.name": "Name",
  "pb.dialog.type": "Type of Number",
  "pb.dialog.type.home": "Personal",
  "pb.dialog.type.mobile": "Mobile",
  "pb.dialog.type.work": "Business",
  "pb.dialog.type.fax_home": "Personal fax",
  "pb.dialog.type.fax_work": "Business Fax",
  "pb.dialog.vip": "Important Person (VIP)",
  "pb.dialog.book": "Phone Book",
  "pb.dialog.book.readonly": "{name} (synchronized — not writable)",
  "pb.dialog.pick": "In which phone book should the contact be added?",
  "pb.dialog.none_writable": "No writable phone book found.",
  "pb.dialog.save": "Create",
  "pb.dialog.cancel": "Cancel",
  "pb.dialog.working": "Creating...",
  "pb.dialog.done": "Contact created.",
  "pb.dialog.error.name": "Please enter a name.",
  "pb.dialog.error.number": "This number cannot be saved as a contact.",
  "pb.dialog.error.not_writable": "This phone book is being synchronized and cannot be edited. Please select another one.",
  "pb.dialog.error.no_fritzbox": "This is only possible with Fritz!Box setup.",
  "pb.dialog.error.unreachable": "The Fritz!Box isn't responding.",
  "pb.dialog.error.generic": "Failed: {msg}",
  "status.calls.add_contact.help": "Add a caller as a contact in the Fritz!Box phone book",
  "status.calls.report_spam": "Spam",
  "status.calls.report_spam.help": "Report this number as spam to PhoneBlock",
  "status.calls.whitelist": "Whitelist",
  "status.calls.whitelist.help": "Unblock this number",
  "whitelist.dialog.title": "Add the number to the whitelist",
  "whitelist.dialog.intro": "Calls from this number will no longer be blocked. By doing this, you are marking the number as legitimate in PhoneBlock; this rating is associated with your account.",
  "whitelist.dialog.submit": "Unblock",
  "whitelist.dialog.working": "Sending...",
  "whitelist.dialog.done": "Done—the number is now on your whitelist.",
  "spam.dialog.title": "Report this number as spam",
  "spam.dialog.intro": "Your rating matters to all PhoneBlock users and is associated with your account. You can't undo it via the dongle—you can only do that on phoneblock.net.",
  "spam.dialog.rating": "Type of Call",
  "spam.dialog.rating.B_MISSED": "Unknown",
  "spam.dialog.rating.C_PING": "Ping Call",
  "spam.dialog.rating.D_POLL": "Survey",
  "spam.dialog.rating.E_ADVERTISING": "Advertisement",
  "spam.dialog.rating.F_GAMBLE": "Contest",
  "spam.dialog.rating.G_FRAUD": "Fraud",
  "spam.dialog.submit": "Report",
  "spam.dialog.working": "Will be reported…",
  "spam.dialog.done": "Thank you — Rating submitted.",
  "spam.dialog.error.no_token": "A PhoneBlock account is required to leave a review.",
  "pb.dialog.error.moved": "The selected phone book no longer exists. Please select another one.",
  "spam.dialog.comment": "Reason",
  "spam.dialog.comment.hint": "(optional; will be visible to the public)",
  "spam.dialog.error.is_contact": "This caller is in your phone book. A phone book entry always takes precedence on the dongle, so a spam alert isn't possible in this case.",
  "status.rec.enable": "Record Conversations in Dialogue Mode",
  "status.rec.help": "The dongle records the conversations it has with spam callers in dialog mode—both sides, up to {min} minutes per call. You can play them back, download them, and delete them from the call list; if a call is removed from the list, its recording is deleted.",
  "status.rec.legal": "You are responsible for recording telephone conversations (Section 201 of the German Criminal Code (StGB), GDPR).",
  "status.rec.usage": "{count} photos, {used} {cap} MB of storage.",
  "status.rec.play": "Play Recording",
  "status.rec.stop": "Pause playback",
  "status.rec.download": "Download recording (WAV)",
  "status.rec.delete": "Delete Recording",
  "status.rec.delete.confirm": "Delete this recording? The call will remain in the list.",
  "status.rec.failed": "The recording could not be loaded.",
  "status.dialog.vad_min_silence_ms.help": "This is how long the caller must remain silent before the dongle responds. Default: 500."
}
