{
  "common": {
    "cancel": "Cancel",
    "delete": "Delete",
    "save": "Save",
    "create": "Create",
    "next": "Next",
    "back": "Back",
    "import": "Import",
    "saving": "Saving...",
    "loading": "Loading...",
    "edit": "Edit",
    "download": "Download",
    "retry": "Retry",
    "failedToSave": "Failed to save voice"
  },
  "generate": {
    "title": "Generate",
    "subtitle": "Select a voice, enter text, and generate speech.",
    "placeholder": "Enter text to synthesize...",
    "chars": "{{count}} chars",
    "failed": "Generation failed",
    "noGenerations": "No generations yet. Generate some audio above!",
    "speedSlow": "Slow",
    "speedFast": "Fast",
    "speedXFast": "Very fast",
    "toneAngry": "Angry",
    "toneSad": "Sad",
    "toneHappy": "Happy",
    "toneExcited": "Excited",
    "toneEmbarrassed": "Embarrassed",
    "toneWhispering": "Whispering",
    "toneSoft": "Soft",
    "toneBreathy": "Breathy",
    "effectPause": "pause",
    "effectLongPause": "long pause",
    "effectLaughing": "laughing",
    "effectChuckling": "chuckling",
    "effectSighing": "sighing",
    "effectCrying": "crying",
    "effectMoaning": "moaning",
    "effectGroaning": "groaning"
  },
  "voice": {
    "editTitle": "Edit Voice",
    "createTitle": "Create Voice",
    "deleteTitle": "Delete voice",
    "deleteConfirm": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
    "name": "Name",
    "namePlaceholder": "Voice name",
    "description": "Description",
    "descriptionPlaceholder": "Optional description",
    "language": "Language",
    "model": "Model",
    "audioSamples": "Audio Samples",
    "audioSamplesHint": "Add short audio clips of the voice you want to clone. The model will use these samples as a reference to reproduce the voice. Drag to reorder, toggle to include or exclude a sample.",
    "totalDuration": "{{duration}}s / {{max}}s",
    "addAudioSample": "Add audio sample",
    "noModels": "No models installed yet.",
    "installModel": "Install a model",
    "preset": "Preset",
    "cloud": "Cloud",
    "cloning": "Cloning",
    "voiceDesign": "Voice Design",
    "voice": "Voice",
    "loadingVoices": "Loading voices...",
    "noVoices": "No voices available.",
    "failedToLoadVoices": "Failed to load voices",
    "idCopied": "Voice ID copied",
    "copyId": "Copy ID",
    "exportFailed": "Failed to export voice",
    "importTitle": "Import a voice",
    "importDescription": "Import a voice from a .zip archive previously exported from Sirene.",
    "importSelectZip": "Please select a .zip file",
    "importSuccess": "Voice \"{{name}}\" imported",
    "importFailed": "Import failed",
    "dropZipHere": "Drop a .zip file here",
    "orClickBrowse": "or click to browse",
    "importing": "Importing...",
    "unknownVoice": "Unknown voice",
    "transcript": "Transcript",
    "transcriptPlaceholder": "Transcription of the audio...",
    "pendingTranscriptPlaceholder": "Transcript...",
    "auto": "Auto",
    "uploadSample": "Upload Sample",
    "addSample": "Add a sample",
    "transcriptionFailed": "Transcription failed",
    "new": "New",
    "newVoice": "New voice",
    "importVoice": "Import voice",
    "design": "Design",
    "designVoice": "Design voice",
    "searchPlaceholder": "Search voices...",
    "all": "All",
    "noMatch": "No voices match your filters.",
    "add": "Add",
    "tags": "Tags",
    "tagsPlaceholder": "Add a tag...",
    "visibility": "Visibility",
    "mine": "My voices",
    "public": "Public",
    "emptyNoModel": "You need to install a TTS model before you can add a voice.",
    "needModelHint": "Install a TTS model first from the Models page",
    "needInstructHint": "Install a model with instruct support from the Models page",
    "variant": "Variant",
    "manage": "Manage voices",
    "pageSubtitle": "Create, import, and manage your voices.",
    "selectVoice": "Select a voice",
    "emptyGoManage": "No voices yet. Head to the Voices page to create your first one."
  },
  "voiceDesigner": {
    "title": "Voice Designer",
    "describe": "Describe",
    "preview": "Preview",
    "save": "Save",
    "voiceDescription": "Voice description",
    "descriptionPlaceholder": "Describe the voice you want to create. E.g. 'A warm, deep male voice with a slight British accent, calm and reassuring tone.'",
    "gender": "Gender",
    "male": "Male",
    "female": "Female",
    "sampleText": "Sample text",
    "sampleTextPlaceholder": "Enter the text you want the voice to speak for the preview.",
    "generating": "Generating...",
    "regenerate": "Regenerate",
    "generatePreview": "Generate preview",
    "voiceName": "Voice name",
    "voiceNamePlaceholder": "Name your voice",
    "descriptionLabel": "Description:",
    "languageLabel": "Language:",
    "saveVoice": "Save voice",
    "created": "Voice \"{{name}}\" created",
    "saveFailed": "Failed to save voice"
  },
  "model": {
    "title": "Models",
    "subtitle": "Install and manage models. Models are downloaded on demand.",
    "tts": "TTS",
    "stt": "STT",
    "cloudApi": "Cloud API",
    "hfToken": "HF Token",
    "hfTokenTooltip": "Requires a HuggingFace token (HF_TOKEN)",
    "exported": "Model exported",
    "exportFailed": "Export failed",
    "removeFailed": "Failed to remove model",
    "importPiperTitle": "Import a Piper voice",
    "importPiperDescription": "Import a custom Piper ONNX model with its config file.",
    "modelName": "Model name",
    "modelNamePlaceholder": "e.g. my-custom-voice",
    "modelId": "ID: {{id}}",
    "onnxFile": "ONNX model file",
    "dropOnnx": "Drop .onnx file here",
    "configFile": "Config file (.onnx.json)",
    "dropConfig": "Drop .onnx.json config here",
    "speakers": "{{count}} speakers",
    "installOn": "Install on",
    "alreadyInstalled": "Already installed",
    "importPiperSuccess_one": "Piper model \"{{id}}\" import queued - track progress in notifications.",
    "importPiperSuccess_other": "Piper model \"{{id}}\" import queued on {{count}} servers - track progress in notifications.",
    "allBackends": "All backends",
    "status_installed": "Installed",
    "status_available": "Available",
    "installedOn": "Installed on {{count}}/{{total}} servers",
    "manage": "Manage on servers",
    "perServer": "Per server",
    "installOnAll": "Install on all {{count}} servers",
    "installOnAllMissing": "Install on the {{count}} remaining servers",
    "removeFromAll": "Remove from all servers",
    "noMatch": "No models match your filters.",
    "actionInstall": "Install model",
    "actionInstallNoServer": "No online inference server - check settings",
    "actionInstalling": "Installing model",
    "actionRemove": "Remove model",
    "actionInstallOnServer": "Install on {{name}}",
    "actionRemoveFromServer": "Remove from {{name}}",
    "removeFromAllConfirmTitle": "Remove from all servers?",
    "removeFromAllConfirmDescription": "This will remove \"{{name}}\" from all {{count}} servers it is installed on. This action cannot be undone."
  },
  "notifications": {
    "title": "Activity",
    "empty": "No active jobs.",
    "running": "Running",
    "completed": "Completed",
    "failed": "Failed",
    "dismiss": "Dismiss",
    "open": "Open notifications"
  },
  "history": {
    "title": "History",
    "subtitle": "Browse all past generations.",
    "empty": "No generations yet. Head to the Generate page to create your first one.",
    "noMatch": "No generations match this filter.",
    "deleteAll": "Delete all",
    "deleteAllTitle": "Delete all generations?",
    "deleteAllDescription": "{{count}} generation(s) for voice \"{{voice}}\" will be permanently deleted. This action cannot be undone."
  },
  "nav": {
    "appName": "Sirene",
    "appSubtitle": "TTS Open Router",
    "navigation": "Navigation",
    "sessions": "Sessions",
    "studio": "Studio",
    "voices": "Voices",
    "models": "Models",
    "history": "History",
    "toggleTheme": "Toggle theme",
    "theme": "Theme",
    "language": "Language",
    "settings": "Settings"
  },
  "studio": {
    "breadcrumbStudio": "Studio",
    "breadcrumbSession": "Session",
    "pageSubtitle": "Write, narrate, and tune your audio takes.",
    "untitledSession": "Untitled",
    "emptyTitle": "Your studio is ready",
    "emptyHint": "Write a line, pick a voice, and generate. Add takes to compose a dialogue.",
    "noVoicesTitle": "Create your first voice",
    "noVoicesHint": "You need at least one voice to generate audio. Create, import, or design one from the Voices page.",
    "noVoicesCta": "Create a voice",
    "composerPlaceholder": "Enter text to synthesize...",
    "generate": "Generate",
    "regenerate": "Regenerate",
    "regenerateWithTuning": "Regenerate with tuning",
    "addTake": "Add a take",
    "addTakeHint": "chain a follow-up",
    "changeVoice": "Change voice",
    "draftHint": "Ctrl/Cmd + Enter to generate",
    "play": "Play",
    "pause": "Pause",
    "tuning": "Tuning",
    "quickTuning": "Quick tuning",
    "timeline": "Timeline",
    "timelineTitle": "Tuning",
    "timelineStubbedHint": "Estimated timestamps - no forced aligner available yet.",
    "timelineSelectedWord": "selected",
    "timelineNoData": "No aligned words for this take.",
    "laneWords": "Words",
    "lanePitch": "Pitch",
    "laneSpeed": "Speed",
    "pitch": "Pitch",
    "pitchUnit": "semitones",
    "speed": "Speed",
    "variation": "Variation",
    "tuningGlobal": "Global",
    "tuningPerWord": "Per word",
    "tuningUnsupported": "Not supported by this model",
    "emphasis": "Emphasis",
    "wordCountSingular": "word",
    "wordCountPlural": "words",
    "toolbarPause": "Pause",
    "toolbarSlow": "Slow",
    "toolbarFast": "Fast",
    "toolbarEmphasis": "Emphasis",
    "stateDraft": "Draft",
    "stateReady": "Ready",
    "stateTuned": "Tuned",
    "saving": "Saving...",
    "saved": "Saved",
    "share": "Share",
    "export": "Export",
    "bankTitle": "Take bank",
    "bankEmpty": "No takes yet",
    "bankEmptyHint": "Your generations will appear here and can be dragged into the document.",
    "bankAddHint": "Add to the current session",
    "allSessions": "All sessions",
    "noSessions": "No sessions yet.",
    "takeCountSingular": "{{count}} take",
    "takeCountPlural": "{{count}} takes",
    "deleteSessionTitle": "Delete session?",
    "deleteSessionDescription": "\"{{name}}\" will be removed. The takes themselves stay in the bank - only the grouping is deleted.",
    "shareTitle": "Share session",
    "shareDescription": "Make this session visible to anyone with the link.",
    "sharePrivate": "Private",
    "sharePublic": "Public",
    "sharePrivateHint": "Only you can see this session.",
    "shareFailed": "Failed to update sharing",
    "copy": "Copy",
    "copied": "Copied",
    "copyFailed": "Failed to copy",
    "rename": "Rename",
    "exportZip": "Export as ZIP",
    "exportStarted": "Export started",
    "exportFailed": "Export failed",
    "moreActions": "More actions",
    "more": "More",
    "toggleBank": "Toggle take bank",
    "waveformAriaLabel": "Audio waveform",
    "relativeJustNow": "just now",
    "relativeMinutes": "{{count}}m",
    "relativeHours": "{{count}}h",
    "relativeDays": "{{count}}d",
    "playing": "Playing...",
    "tapToPlay": "Tap to play",
    "noAudio": "No audio",
    "notAuthenticated": "Not authenticated",
    "failedToSaveSession": "Failed to save session",
    "failedToDeleteTake": "Failed to delete take",
    "failedToAddTake": "Failed to add take",
    "failedToCreateSession": "Failed to create session",
    "failedToDeleteSession": "Failed to delete session",
    "failedToLoadAlignment": "Failed to load alignment",
    "publicSessionTitle": "Public session",
    "publicSessionHint": "You're viewing a public session in read-only mode.",
    "publicSessionNotFound": "This session is not available.",
    "openSirene": "Open Sirene",
    "sessionNotFoundTitle": "Session not found",
    "sessionNotFoundHint": "This session doesn't exist or has been deleted.",
    "backToStudio": "Back to Studio"
  },
  "settings": {
    "title": "Settings",
    "subtitle": "Manage inference servers, API keys, and cloud integrations.",
    "tabs": {
      "inferenceServers": "Inference servers",
      "apiKeys": "API keys",
      "cloudKeys": "Cloud integrations"
    },
    "cloudKeys": {
      "title": "Cloud integrations",
      "description": "Keys for third-party providers (OpenAI, ElevenLabs, HuggingFace). Stored securely and never displayed in full after saving."
    },
    "openAIKey": "OpenAI API Key",
    "elevenLabsKey": "ElevenLabs API Key",
    "hfToken": "HuggingFace Token",
    "removed": "{{key}} removed",
    "saved": "{{key}} saved",
    "removeFailed": "Failed to remove",
    "saveFailed": "Failed to save"
  },
  "cliAuth": {
    "title": "Authorize the CLI",
    "subtitle": "Enter the one-time code shown in your terminal.",
    "codeLabel": "One-time code",
    "continue": "Continue",
    "loading": "Looking up the session...",
    "invalidTitle": "Code not recognised",
    "invalidDescription": "The code is invalid or has expired. Run `sirene login` again to get a new one.",
    "tryAgain": "Try another code",
    "alreadyDoneTitle": "This session has already been used",
    "alreadyDoneDescription": "You can close this tab and return to your terminal.",
    "confirmTitle": "Authorize CLI session {{code}}?",
    "confirmDescription": "A new API key will be created for the CLI on this device.",
    "nameLabel": "Key name",
    "namePlaceholder": "e.g. CLI laptop",
    "nameHint": "Used to identify the key in Settings > API Keys.",
    "authorize": "Authorize",
    "successTitle": "All set!",
    "successDescription": "You can close this tab and return to your terminal.",
    "backHome": "Back to Sirene",
    "approveFailed": "Failed to authorize the CLI",
    "scopesRequestedHint": "The CLI requested a specific set of permissions. You can untick to narrow further; you cannot grant beyond what was requested."
  },
  "apiKeys": {
    "title": "API Keys",
    "description": "Long-lived keys for the CLI and external integrations. Use them with header `Authorization: Bearer <key>`.",
    "empty": "No API key yet. Create one to use the CLI or call the API from another app.",
    "create": "Create key",
    "createTitle": "New API key",
    "createDescription": "Give the key a memorable name (e.g. \"laptop\", \"n8n prod\"). The full secret is shown once.",
    "createFailed": "Failed to create key",
    "name": "Name",
    "namePlaceholder": "e.g. CLI laptop",
    "revealTitle": "Copy your API key now",
    "revealDescription": "This is the only time the secret will be shown. Store it in a safe place.",
    "copy": "Copy",
    "copyFailed": "Could not copy to clipboard",
    "copiedDone": "I've saved it",
    "revoke": "Revoke",
    "revokeTitle": "Revoke key?",
    "revokeDescription": "\"{{name}}\" will stop working immediately. This cannot be undone.",
    "revoked": "Key revoked",
    "revokeFailed": "Failed to revoke key",
    "loadFailed": "Failed to load API keys",
    "created": "Created",
    "lastUsed": "Last used",
    "never": "never",
    "fullAccess": "Full access",
    "fullAccessHint": "Grants every capability. Recommended for the CLI on a trusted machine.",
    "scopesHint": "Pick the minimum set the key needs. Calls to other endpoints will return 403.",
    "scopes": {
      "generate": "Generate audio",
      "transcribe": "Transcribe audio",
      "voices:read": "Read voices",
      "voices:write": "Create, update, delete voices",
      "models:read": "Read models",
      "models:write": "Install, update, delete models",
      "generations:read": "Read past generations",
      "generations:write": "Delete past generations",
      "sessions:read": "Read sessions",
      "sessions:write": "Create, update, delete sessions",
      "inference-servers:read": "Read inference servers",
      "inference-servers:write": "Manage inference servers",
      "settings:read": "Read settings",
      "settings:write": "Update settings"
    }
  },
  "inferenceServers": {
    "title": "Inference servers",
    "description": "Configure where TTS generations and model downloads run. Multiple servers act as failover; the highest-priority online server is used.",
    "name": "Name",
    "namePlaceholder": "e.g. Local",
    "url": "URL",
    "urlPlaceholder": "http://localhost:8000",
    "priority": "Priority",
    "priorityHint": "Higher number is preferred",
    "addServer": "Add server",
    "enabled": "Enabled",
    "test": "Test",
    "statusOnline": "Online",
    "statusOffline": "Offline",
    "statusUnknown": "Checking...",
    "lastChecked": "Checked {{when}}",
    "neverChecked": "Not checked yet",
    "empty": "No inference server configured. Add one to start generating.",
    "deleteTitle": "Remove server?",
    "deleteDescription": "\"{{name}}\" will be removed from the registry. Models installed on it will no longer be reachable.",
    "saveFailed": "Failed to save server",
    "removeFailed": "Failed to remove server",
    "testFailed": "Test failed",
    "testFailedStatus": "Test failed ({{status}})",
    "authToken": "Auth token",
    "authTokenPlaceholder": "Paste the token printed by the install script",
    "authTokenEditPlaceholder": "Leave blank to keep the current token",
    "authTokenHint": "Optional. Required if you started the inference server with INFERENCE_AUTH_TOKEN set.",
    "authTokenEditHint": "Leave blank to keep the current token. Type a new value to rotate it; submit empty to clear.",
    "addDialog": {
      "title": "Add an inference server",
      "description": "Point Sirene at an inference server. If you don't have one yet, run the install command below on a Linux machine - it prints a URL and auth token at the end.",
      "installLabel": "Quick install",
      "installHint": "Runs on Ubuntu/Debian. Detects NVIDIA GPU automatically. Prints the URL and auth token at the end."
    }
  },
  "deleteGeneration": {
    "title": "Delete generation?",
    "description": "This action cannot be undone. The audio file will be permanently deleted."
  },
  "validators": {
    "required": "This field is required",
    "minLength": "Must be at least {{count}} characters",
    "emailInvalid": "Invalid email address",
    "passwordMismatch": "Passwords do not match"
  },
  "login": {
    "title": "Welcome back",
    "subtitle": "Sign in to your account to continue",
    "email": "Email",
    "emailPlaceholder": "Your email",
    "password": "Password",
    "submit": "Log in",
    "failed": "Login failed",
    "invalidCredentials": "Invalid email or password",
    "noAccount": "Don't have an account?",
    "register": "Create an account"
  },
  "register": {
    "title": "Create an account",
    "subtitle": "Get started with your own voice workspace",
    "name": "Name",
    "namePlaceholder": "John Doe",
    "email": "Email",
    "emailPlaceholder": "Your email",
    "password": "Password",
    "passwordConfirm": "Confirm password",
    "submit": "Sign up",
    "failed": "Registration failed",
    "hasAccount": "Already have an account?",
    "login": "Log in"
  },
  "auth": {
    "logout": "Log out",
    "public": "Public",
    "heroTitle": "Your voice, amplified.",
    "heroSubtitle": "Create, clone, and manage AI voices with an open-source TTS platform.",
    "feature1": "Multi-engine TTS with Kokoro, F5, Piper, ElevenLabs and more",
    "feature2": "Voice cloning from audio samples",
    "feature3": "Voice designer powered by AI"
  },
  "errors": {
    "internal": "Internal error",
    "voice.notFound": "Voice not found",
    "voice.zipRequired": "A .zip file is required",
    "voice.audioRequired": "An audio file is required",
    "voice.noModel": "Voice has no model assigned",
    "voice.elevenLabsPresetRequired": "ElevenLabs voice requires a preset voice ID. Edit the voice and select one.",
    "voice.openAiPresetRequired": "OpenAI TTS voice requires a preset voice ID. Edit the voice and select one.",
    "voice.cloningRequiresSample": "Voice cloning requires at least one enabled audio sample. Edit the voice to upload or enable a sample.",
    "voice.archiveMissing": "Invalid archive: missing voice.json",
    "voice.archiveInvalidJson": "Invalid archive: voice.json is not valid JSON",
    "voice.archiveMissingName": "Invalid archive: voice.json is missing a name field",
    "model.notFound": "Model not found",
    "model.notInstalled": "Model is not installed",
    "model.notInstalledOnServer": "Model is not installed on the requested server",
    "model.notInCatalog": "Model not found in catalog",
    "model.customNotFound": "Custom model not found",
    "model.piperFieldsRequired": "Fields onnx, config, and name are required",
    "model.configInvalidJson": "Config file is not valid JSON",
    "model.configNotPiper": "Config must be a valid Piper format",
    "model.invalidName": "Invalid model name",
    "model.nameConflict": "Name conflicts with an existing catalog model",
    "model.deleteFailed": "Failed to delete the model on one or more servers",
    "model.exportFailed": "Export failed",
    "model.whisperNotInstalled": "No Whisper model installed. Please install one from the Models page.",
    "model.noOnlineServer": "No online inference server available",
    "model.invalidServerSelection": "Invalid server selection",
    "model.alreadyInstalled": "Model is already installed",
    "model.serverIdsNotJson": "serverIds must be a JSON array of strings",
    "model.serverIdsInvalid": "serverIds must be a JSON array of non-empty strings",
    "user.notFound": "User not found",
    "apiKey.notFound": "API key not found",
    "apiKey.unknownScope": "Unknown or unauthorized scope",
    "auth.missingScope": "This API key is not allowed to perform this operation",
    "generation.notFound": "Generation not found",
    "session.notFound": "Session not found",
    "inferenceServer.notFound": "Inference server not found",
    "settings.invalidKey": "Invalid setting key",
    "openai.keyNotConfigured": "OpenAI API key not configured. Go to Settings to add it.",
    "elevenlabs.keyNotConfigured": "ElevenLabs API key not configured. Go to Settings to add it.",
    "upstream.failed": "Upstream service failed",
    "upstream.inference": "Inference worker error",
    "upstream.elevenlabs": "ElevenLabs API error",
    "upstream.openai": "OpenAI API error",
    "transcribe.timeout": "Transcription timed out",
    "transcribe.audioRequired": "An audio file is required",
    "auth.invalidToken": "Invalid or expired token",
    "auth.required": "Authentication required",
    "auth.invalidCredentials": "Invalid email or password",
    "auth.registrationFailed": "Registration failed",
    "cliAuth.sessionNotFound": "CLI session not found or expired",
    "cliAuth.sessionAlreadyUsed": "CLI session already used",
    "voiceDesigner.nameAudioRequired": "Name and audio are required",
    "voiceDesigner.textFieldsExpected": "description, language, model and transcript must be text fields"
  }
}
