// SPDX-License-Identifier: AGPL-3.0-only
// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0

export const en = {
  picker: {
    onDevice: "On Device",
    huggingFace: "Hugging Face",
    retry: "Retry",
    loadMore: "Load more",
    offlineTitle: "You're offline",
    offlineBody: "Switch to Device to use cached or local {noun}.",
    offlineSwitchDevice: "Device",
    searchAriaLabel: "Search {noun}",
    modelSourceAriaLabel: "Model source",
    hubSectionAriaLabel: "Hub section",
    modelDropped: "No longer offered",
    modelDroppedByProvider: "{provider} · no longer offered",
    modelDisabled: "Not enabled",
    modelDisabledByProvider: "{provider} · not enabled",
    multipleMatches: "Multiple matching {noun}. Choose one from the list.",
    rateLimitedTitle: "Hugging Face rate limit reached",
    rateLimitedBody: "Wait a moment, then retry searching {noun}.",
    hfToken: {
      label: "HF token",
      saved: "Saved",
      add: "Not set",
      savedAriaLabel: "Hugging Face token saved",
      addAriaLabel: "Set Hugging Face token",
      savedHint: "Token saved. Access is checked when you use it.",
      addHint: "Set a token to access private and gated repositories.",
    },
  },
  common: {
    cancel: "Cancel",
    close: "Close",
    delete: "Delete",
    done: "Done",
    error: "Error",
    export: "Export",
    help: "Help",
    loading: "Loading...",
    new: "New",
    rename: "Rename",
    save: "Save",
    saving: "Saving...",
    search: "Search",
    shutdown: "Shutdown",
  },
  shell: {
    beta: "BETA",
    brand: "unsloth",
    product: "Unsloth",
    accountMenu: "{name} account menu",
    updateAvailable: "Update available",
    resize: {
      collapse: "Click to collapse",
      expand: "Click to expand",
      drag: "Drag to resize",
    },
    aria: {
      home: "Unsloth home",
      closeSidebar: "Close sidebar",
      openSidebar: "Open sidebar",
      resizeSidebar: "Resize or collapse sidebar",
      resizeRunSettings: "Resize or close run settings",
      openRunSettings: "Open run settings",
      chatOptions: "Chat options",
      runOptions: "Run options",
    },
    navigation: {
      newChat: "New chat",
      returnToChat: "Return to Chat",
      returnToChats: "Return to {count} Chats",
      chatGenerating: "Generating",
      compare: "Compare",
      search: "Search",
      projects: "Projects",
      hub: "Model hub",
      train: "Train",
      recipes: "Recipes",
      images: "Images",
      video: "Video",
      audio: "Audio",
      // Hover text while the row spins, before this machine's capability is measured.
      trainChecking: "Checking this machine for training support...",
      videoChecking: "Checking this machine for video support...",
      more: "More",
      // Last entry of the More flyout; opens Settings -> Appearance.
      customizeSidebar: "Customize sidebar",
      // Rendered uppercase in a pill beside a recently shipped tab.
      newBadge: "New",
      export: "Export",
      recents: "Recents",
      noChatsYet: "No chats yet",
      settings: "Settings",
      api: "API",
      lightMode: "Light Mode",
      darkMode: "Dark Mode",
      guidedTour: "Guided Tour",
      help: "Help",
      logOut: "Log out",
      shutdown: "Shutdown",
    },
    notFound: {
      title: "Page not found",
      description: "{path} does not exist.",
      backToChat: "Back to chat",
    },
    dialog: {
      deleteChat: {
        title: "Delete chat",
        description: 'Are you sure you want to delete this chat "{name}"?',
      },
      deleteRun: {
        title: "Delete training run",
        description: 'Are you sure you want to delete this run "{name}"?',
      },
      renameChat: {
        title: "Rename chat",
        placeholder: "Chat title",
      },
      renameRun: {
        title: "Rename run",
        placeholder: "Run name",
      },
    },
    toast: {
      cannotDeleteRunningRun: "Cannot delete a running training run",
      failedToDeleteChat: "Failed to delete chat",
      failedToDeleteRun: "Failed to delete run",
      failedToRenameChat: "Failed to rename chat",
      failedToRenameRun: "Failed to rename run",
    },
  },
  settings: {
    title: "Settings",
    dialog: {
      title: "Settings",
      description: "Manage your Unsloth preferences.",
      closeAriaLabel: "Close settings",
      searchPlaceholder: "Search settings…",
      searchNoResults: "No settings found.",
    },
    tabs: {
      general: "General",
      profile: "Profile",
      appearance: "Appearance",
      resources: "System",
      chat: "Chat",
      voice: "Voice",
      connections: "Connections",
      data: "Data",
      apiKeys: "API",
      agents: "Agents",
      debugging: "Logs",
      about: "About",
    },
    debugging: {
      logSection: "Log file",
      source: "Log file",
      sourceHint: "The model runners write their own logs, so a failed load or generation is often explained there rather than in the server log.",
      path: "Location",
      pathCopy: "Copy path",
      refreshSection: "Refresh",
      mode: "Mode",
      modeLive: "Live",
      modeInterval: "Every 3 seconds",
      modeManual: "Manual",
      refreshNow: "Refresh now",
      privacyNote: "Credentials are masked in this view. The file on disk is not masked.",
      copyVisible: "Copy visible log",
      empty: "Nothing has been logged yet.",
      disabled: "File logging is turned off (UNSLOTH_STUDIO_NO_FILE_LOG=1).",
      missing: "No log file was found.",
      unreadable: "The log file could not be read.",
      timeout: "The log request timed out. The server may be unreachable.",
      droppedNotice: "Some lines were skipped: the log was written faster than it could be read.",
      morePending: "More lines are still being read; they arrive on the next refresh.",
      staleSession: "File logging is turned off, so this is an earlier session and will not update.",
      // Not rendered: extra terms the settings search matches this tab on, so
      // the pane is still reachable by searching for debug or an error.
      keywords: "debug debugging log logs error errors crash traceback stack trace troubleshoot diagnostics failed",
    },
    voice: {
      title: "Voice",
      description: "Microphone, dictation, speech-to-text and read-aloud",
      dictation: {
        sectionTitle: "Dictation",
        engineLabel: "Dictation engine",
        engineBrowser: "Browser",
        engineBrowserDescription:
          "Transcribes audio using your browser speech service. Select 'Local transcription' to use a STT model.",
        engineModel: "Local transcription",
        engineModelDescription:
          "Runs a speech-to-text (STT) model locally and works offline. Download, load, then unloads after inactivity.",
        sttModelLabel: "Speech recognition model",
        sttModelDescription: "Choose or search a STT model to run locally.",
        sttModelSearchPlaceholder: "Search any model on HF",
        sttModelSearching: "Searching Hugging Face…",
        sttModelValidating: "Checking Whisper compatibility…",
        sttModelNoResults: "No Whisper models found",
        sttModelInvalid: "This repository cannot be used for dictation",
        sttModelFailed: "Could not load the STT model",
        sttModelUnsupported: "Recording is not supported in this browser",
        sttChecking: "Checking…",
        sttOnDemand: "Downloaded",
        sttLoadingModel: "Loading model…",
        sttReady: "Loaded on {device}",
        sttLoaded: "Loaded",
        sttUnavailable:
          "Not installed on this server. Run `unsloth studio update` to enable local dictation.",
        sttRetry: "Retry",
        sttDownloadChecking: "Checking download status…",
        sttNotDownloaded: "Not downloaded",
        sttDownloadStatusFailed: "Could not check download status",
        sttDownload: "Download",
        sttDownloadConfirmTitle: "Download {model}?",
        sttDownloadConfirmBody:
          "Local dictation runs entirely offline, but it needs the {model} speech model first. About {size}, fetched once into your Hugging Face cache.",
        sttDownloadConfirmBodyUnsized:
          "Local dictation runs entirely offline, but it needs the {model} speech model first. It is fetched once into your Hugging Face cache.",
        sttOpenVoiceSettings: "Open Voice settings",
        sttDownloadStarted: "Downloading {model}",
        sttDownloading: "Downloading… {progress}%",
        sttCancelDownload: "Cancel",
        sttCancellingDownload: "Cancelling…",
        sttCancelDownloadFailed: "Could not cancel the download",
        sttDownloadComplete: "Speech recognition model downloaded",
        sttModelReady: "{model} is ready for dictation",
        sttRecommended: "Recommended",
        sttDownloadFailed: "Could not download the speech recognition model",
        sttLoad: "Load",
        sttUnload: "Unload",
        sttUnloading: "Unloading…",
        microphoneLabel: "Microphone",
        microphoneFallbackName: "Microphone {index}",
        microphoneDescription: "Used for dictation",
        microphoneFallbackHint:
          "Used for dictation. Falls back to the system default if the browser speech engine cannot use this device",
        microphoneGrantDescription: "Allow mic access to show device names",
        allowMicrophone: "Allow microphone",
        micAccessBlocked:
          "Microphone access was blocked. Allow microphone access for this Unsloth page, then try again.",
        micAccessUnsupported:
          "Microphone access is not supported in this browser or context.",
        systemDefault: "System default",
        savedMicDisconnected: "Saved microphone (not connected)",
        languageLabel: "Dictation language",
        languageDescription: "Language to recognize",
        languageAuto: "Auto (browser language)",
      },
      dictionary: {
        sectionTitle: "Dictation dictionary",
        sectionDescription:
          "Set how dictation spells specific words or phrases",
        manageLabel: "Custom spellings",
        manage: "Manage",
        backToVoice: "Back to Voice",
        addEntry: "Add entry",
        newEntryAria: "New dictionary entry",
        entryPlaceholder: "Jane Doe",
        entryAria: "Dictionary entry {index}",
        removeEntryAria: "Remove dictionary entry {index}",
      },
      recents: {
        sectionTitle: "Dictation history",
        sectionDescription:
          "Every dictation is saved here so you can recover text",
        manageLabel: "Dictation history",
        manage: "Manage",
        pageDescription:
          "Every dictation is saved. View, copy, or delete them, or open the chat a dictation was used in.",
        searchPlaceholder: "Search dictations",
        sortLabel: "Sort dictations",
        sortNewest: "Newest",
        sortOldest: "Oldest",
        sortAlpha: "A to Z",
        noMatches: "No dictations match your search",
        detailTitle: "Saved dictation",
        backToVoice: "Back to Voice",
        backToRecents: "Back to recent dictations",
        view: "View full dictation",
        empty: "No dictations yet",
        dictationColumn: "Dictation",
        dateColumn: "Date created",
        copy: "Copy dictation",
        copied: "Copied to clipboard",
        copyFailed: "Could not copy to clipboard",
        delete: "Delete dictation",
        deleteTitle: "Delete dictation",
        deleteDescription:
          "Delete this saved dictation? This cannot be undone.",
        deleteLinkedDescription:
          "Delete this saved dictation? You can also delete the chat it was used in. This cannot be undone.",
        deleteWithChat: "Delete chat and dictation",
        deleteWithChatFailed: "Could not delete the chat",
        clear: "Clear history",
        clearTitle: "Clear dictation history",
        clearDescription: "Delete all saved dictations? This cannot be undone.",
        clearConfirm: "Clear all",
        showMore: "Show more ({count})",
        openChat: "Open chat",
      },
      readAloud: {
        sectionTitle: "Read aloud",
        buttonLabel: "Read aloud button",
        buttonDescription: "Show on assistant responses",
        engineLabel: "TTS engine",
        engineSystemDescription: "Built-in device voices",
        engineStudioDescription: "Uses the loaded audio model (e.g. Orpheus)",
        engineSystem: "System voices",
        engineStudio: "Load TTS model",
        modelLabel: "TTS model",
        modelDescription:
          "Load an audio model from the model selector (e.g. Orpheus TTS)",
        voiceLabel: "Voice",
        voiceDescription: "Best voices on this device",
        speedLabel: "Speed",
        pitchLabel: "Pitch",
        volumeLabel: "Volume",
        previewLabel: "Preview voice",
        previewDescription: "Play a short sample",
        previewFailed: "TTS preview failed",
        previewAction: "Preview",
        stopAction: "Stop",
        ttsLabel: "Text to speech",
        notSupported: "Not supported in this browser",
      },
    },
    general: {
      title: "General",
      description: "Global preferences for Unsloth.",
      account: "Account",
      huggingFaceToken: "Hugging Face token",
      huggingFaceTokenDescription:
        "Used to load gated models and push artifacts.",
      hideToken: "Hide token",
      showToken: "Show token",
      clearToken: "Clear",
      checkingToken: "Checking token...",
      tokenValidated: "Token validated",
      password: "Password",
      passwordDescription: "Change the password for this Unsloth account.",
      passwordDialog: {
        trigger: "Change password",
        title: "Change password",
        description:
          "Enter your current password and choose a new one (at least {minLength} characters).",
        setTrigger: "Set remote password",
        setTitle: "Set remote password",
        setDescription:
          "Choose the password remote browsers sign in with as unsloth (at least {minLength} characters). The Unsloth Desktop App keeps signing in automatically.",
        setSubmit: "Set password",
        setting: "Setting...",
        setDone: "Password set.",
        currentPassword: "Current password",
        newPassword: "New password",
        confirmPassword: "Confirm new password",
        currentTooShort:
          "Current password must be at least {minLength} characters.",
        newTooShort: "New password must be at least {minLength} characters.",
        newHasSpaces: "New password cannot contain spaces.",
        mismatch: "Passwords do not match.",
        samePassword:
          "New password must be different from your current password.",
        update: "Update password",
        updating: "Updating...",
        updated: "Password updated.",
        updateFailed: "Password update failed.",
      },
      chatDefaults: "Chat defaults",
      autoTitleNewChats: "Auto-title new chats",
      autoTitleNewChatsDescription:
        "Generate a short title from the first message.",
      helperLlm: {
        sectionTitle: "Helper LLM",
        preloadOnStartup: "Pre-cache Helper LLM on startup",
        preloadOnStartupDescription:
          "Download the AI Assist helper model in the background on startup. Off by default; AI Assist can still fetch it on demand.",
        disabledByEnv:
          "Disabled by UNSLOTH_HELPER_MODEL_DISABLE in the backend environment.",
        loadError: "Failed to load Helper LLM settings.",
        saveError: "Failed to save Helper LLM settings.",
      },
      modelAutoSwitch: {
        sectionTitle: "Model auto-switch (OpenAI API)",
        enable: "Switch model by request",
        enableDescription:
          "Load a downloaded GGUF named in an API request before serving. Off by default.",
        autoDownload: "Download missing models",
        autoDownloadDescription:
          "Fetch a GGUF named in an API request that is not downloaded yet. Anyone with an API key can then use disk and bandwidth.",
        idleUnload: "Idle auto-unload",
        idleUnloadDescription:
          "Free VRAM after this many idle seconds. 0 keeps it loaded, minimum 60.",
        idleSecondsAriaLabel: "Idle auto-unload seconds",
        mediaIdleUnload: "Idle auto-unload for image and video",
        mediaIdleUnloadDescription:
          "Free VRAM by unloading the image and video models after this many idle seconds. Its own setting: the one above covers the chat model only. 0 keeps them loaded, minimum 60.",
        mediaIdleSecondsAriaLabel: "Image and video idle auto-unload seconds",
        mediaIdlePaused:
          "Paused while Keep model in GPU memory or Only unload models loaded by the API is on.",
        idleNeedsEnable: "Turn on Switch model by request first.",
        idleActiveViaEnv: "Active via UNSLOTH_MODEL_IDLE_TTL.",
        loadError: "Failed to load model auto-switch settings.",
        saveError: "Failed to save model auto-switch settings.",
        idleError: "Enter 0 to keep the model loaded, or at least 60 seconds.",
        keepKv: "Keep chat context across idle unload",
        keepKvDescription:
          "Save the KV cache before an idle unload so resumed chats skip re-reading history. Up to 10 GB on disk.",
        apiOnly: "Only unload models loaded by the API",
        apiOnlyDescription:
          "Idle unload leaves a model you loaded from Studio in memory, and frees only the ones an API request loaded.",
      },
      previewSharing: {
        sectionTitle: "Preview sharing",
        enableLabel: "Public preview links",
        enableDescription:
          "Let anyone with a signed link chat with a finished model, no login required. Turn off to take the public preview surface offline; shared links stop working.",
        loadError: "Failed to load preview sharing settings.",
        saveError: "Failed to save preview sharing settings.",
        revokeLabel: "Revoke all preview links",
        revokeDescription:
          "Rotate the signing secret so every link you've shared stops working. Newly copied links keep working.",
        revokeAction: "Revoke links",
        revoking: "Revoking...",
        revokeConfirmTitle: "Revoke all preview links?",
        revokeConfirmDescription:
          "Every preview link you've shared will stop working immediately. This can't be undone.",
        revokeConfirmAction: "Revoke all links",
        revoked: "All preview links revoked",
        revokeError: "Couldn't revoke preview links",
      },
      permissions: {
        sectionTitle: "Permissions",
        bypassLabel: "Tool permissions",
        bypassDescription:
          "How Unsloth approves chat tool calls (terminal, python, web, MCP) before they run. Full access disables approvals and the code sandbox.",
      },
      notifications: {
        sectionTitle: "Notifications",
        showLlamaUpdates: "llama.cpp update notifications",
        showLlamaUpdatesDescription:
          "Notify when a newer llama.cpp build is available to run new models. Turn off if you only train.",
        showLoadedModels: "Loaded models indicator",
        showLoadedModelsDescription:
          "Show a small card in the bottom-right corner listing every model currently in memory (chat, speech, image, video), with a button to eject each one.",
      },
      startup: {
        sectionTitle: "Startup",
        launchAtLogin: "Run Unsloth at login",
        launchAtLoginDescription:
          "Start Unsloth in the background when you log in. It stays in the menu bar or system tray until you open it.",

        closeToTray: "Close to system tray",
        closeToTrayDescription:
          "Keep Unsloth and its server running in the background when you close the main window.",
        closeToTraySaveError: "Failed to update the close to system tray setting.",
        loadError: "Failed to load the launch at login setting.",
        saveError: "Failed to update the launch at login setting.",
      },
      uploads: {
        sectionTitle: "Uploads",
        maxUploadSize: "Training dataset upload cap",
        maxUploadSizeDescription: "Default is {defaultSize} MB.",
      },
      rag: {
        sectionTitle: "Documents & RAG",
        embeddingModel: "Embedding model",
        embeddingModelDescription:
          "Hugging Face model or local path used to index and search your documents. Default is {defaultModel}.",
        reindexWarning:
          "Only affects newly indexed documents. Re-upload existing ones after changing the model.",
        emptyError: "Enter a Hugging Face model id or local path.",
        loadError: "Failed to load the embedding model setting.",
        saveError: "Failed to save the embedding model.",
        saved: "Embedding model saved.",
        saveAnyway: "Save anyway",
        resetAction: "Reset to default",
      },
      storage: {
        sectionTitle: "Storage",
        modelsFolder: "Models folder",
        modelsFolderDescription: "Where downloaded models are stored.",
        openAction: "Open",
        copyAction: "Copy path",
        copied: "Path copied",
        openError: "Couldn't open the folder",
        copyError: "Couldn't copy the path",
      },
      resetPreferences: {
        sectionTitle: "Danger zone",
        label: "Reset all local preferences",
        description:
          "Clears local-only preferences. Chats, API access, and DB-backed settings are kept.",
        action: "Reset preferences",
        confirmTitle: "Reset all local preferences?",
        confirmDescription:
          "Clears local-only preferences and reloads Unsloth. Chats, API access, and DB-backed settings are kept.",
        confirmAction: "Reset and reload",
      },
    },
    profile: {
      title: "Profile",
      description: "How your profile appears in Unsloth.",
      changePicture: "Change profile picture",
      uploadPhoto: "Upload photo",
      removePhoto: "Remove",
      pictureOptions: "Profile picture options",
      displayName: "Display name",
      nickname: "What should Unsloth call you?",
      nicknamePlaceholder: "Nickname",
      nicknameSaved: "Preferred name saved",
      avatarShape: "Avatar shape",
      avatarShapeCircle: "Circle",
      avatarShapeRounded: "Rounded",
      greetingSloth: "Sloth in greeting",
      greetingSlothDescription: "Show the sloth in the chat greeting.",
      chooseSloth: "Or pick a sloth",
      noPicture: "No profile picture",
      noneLabel: "None",
      nameSaved: "Profile name saved",
      namePersistErrorTitle: "Could not persist profile name",
      namePersistErrorDescription:
        "Name updated for this session, but may not persist after reload.",
      photoUpdated: "Profile photo updated",
      photoPersistErrorTitle: "Could not persist profile photo",
      photoPersistErrorDescription:
        "Photo updated for this session, but may not persist after reload.",
      photoUpdateErrorTitle: "Could not update profile photo",
      imageUseError: "Could not use this image.",
      stats: {
        title: "Your stats",
        subtitle:
          "Everything below is counted from your own history. Nothing is collected or sent to Unsloth.",
        retry: "Try again",
        privacyNote:
          "Stats are computed from the chat and training history held by your Unsloth install. Nothing is collected, and nothing is sent to Unsloth or any third party.",
        emptyChats:
          "No chats yet. Start a conversation and your stats will fill in here.",
        lifetimeTokens: "Lifetime tokens",
        peakTokens: "Peak day",
        longestChat: "Longest chat",
        currentStreak: "Current streak",
        longestStreak: "Longest streak",
        activityTitle: "Token activity",
        activityDescription: "{total} over the last {weeks}",
        mode: {
          daily: "Daily",
          weekly: "Weekly",
          cumulative: "Cumulative",
        },
        cellTooltip: "{date} · {tokens}, {messages}",
        weekTooltip: "Week of {date} · {tokens}",
        less: "Less",
        more: "More",
        insightsTitle: "Activity insights",
        totalChats: "Total chats",
        totalMessages: "Total messages",
        tokensIn: "Tokens sent",
        tokensOut: "Tokens generated",
        cachedTokens: "Cached tokens",
        cachedValue: "{tokens} ({percent}% of input)",
        avgTokensPerChat: "Average tokens per chat",
        timeInChat: "Time in chat",
        activeDays: "Active days",
        toolCalls: "Tool calls",
        attachments: "Files attached",
        avgSpeed: "Average speed",
        bestSpeed: "Fastest response",
        firstToken: "Average time to first token",
        tokensPerSecond: "{value} tok/s",
        topModelsTitle: "Most used models",
        topModelsDescription: "Ranked by tokens exchanged",
        modelSummary: "{tokens} · {messages}",
        noModels: "No model usage recorded yet.",
        trainingTitle: "Training",
        trainingDescription: "Fine-tuning runs from this workspace",
        trainingRuns: "Runs",
        trainingCompleted: "Completed",
        trainingSteps: "Steps",
        trainingTokens: "Tokens trained",
        trainingTime: "Training time",
        bestLoss: "Best loss",
        runSteps: "{steps}",
        runLoss: "loss {loss}",
      },
    },
    appearance: {
      title: "Appearance",
      description: "How Unsloth looks on this device.",
      theme: {
        title: "Theme",
        label: "Color scheme",
        description: "Light, dark, or follow your system.",
        system: "System",
        light: "Light",
        dark: "Dark",
      },
      palette: {
        label: "Color palette",
        description: "Colors used across Unsloth, in light and dark mode.",
        standard: "Standard",
        classic: "Classic",
        minimal: "Minimal",
      },
      custom: {
        reset: "Reset",
        resetAll: "Reset customization",
        preferencesTitle: "Preferences",
        colors: {
          lightGroup: "Light theme",
          darkGroup: "Dark theme",
          accent: "Accent",
          background: "Background",
          foreground: "Foreground",
        },
        fontDefault: "Default",
        fontBundledGroup: "Built-in",
        fontImportedGroup: "Imported",
        fontDeviceGroup: "On this device",
        fontFolderGroup: "From folder",
        fontDeviceLoading: "Looking for device fonts…",
        fontSearch: "Search fonts…",
        fontNoResults: "No fonts found.",
        colorPicker: {
          hue: "Hue",
          hex: "Hex color",
          eyedropper: "Pick a color from the screen",
        },
        uiFont: {
          label: "UI font",
        },
        headingFont: {
          label: "Heading font",
        },
        chatFont: {
          label: "Chat font",
        },
        codeFont: {
          label: "Code font",
        },
        importFont: {
          upload: "Upload",
          scanFolder: "Select folder",
          alreadyAvailable:
            "This font is already available, so the existing copy is used.",
          folderNoFonts: "No font files found in that folder.",
          remove: "Remove",
          errorInvalidType:
            "Unsupported file type. Use .woff2, .woff, .ttf, or .otf.",
          errorTooLarge: "Font file is too large (max 1.5 MB).",
          errorLimit: "You can import up to 3 fonts.",
          errorStorageFull:
            "Not enough local storage for this font. Remove an imported font first.",
          errorFailed: "Could not load this font file.",
        },
        uiFontSize: {
          label: "UI font size",
          description: "Adjust the base size used for the Unsloth UI.",
        },
        codeFontSize: {
          label: "Code font size",
          description: "Adjust the base size used for code.",
        },
        fontSmoothing: {
          label: "Font smoothing",
          description: "Use smoothed font anti-aliasing.",
        },
        contrast: {
          label: "Contrast",
          description: "Strength of borders and secondary text.",
        },
        reduceMotion: {
          label: "Reduce motion",
          description: "Reduce animations or match your system.",
          system: "System",
          on: "On",
          off: "Off",
        },
        pointerCursors: {
          label: "Use pointer cursors",
          description:
            "Change the cursor to a pointer when hovering over interactive elements.",
        },
      },
      language: {
        title: "Language",
        label: "Display language",
        description: "The language used by Unsloth.",
        autoDetect: "Auto detect",
      },
      layout: {
        title: "Layout",
        compactSidebar: "Pin sidebar by default",
        compactSidebarDescription:
          "Keep the sidebar expanded instead of collapsing to icons.",
      },
      sidebarNav: {
        title: "Sidebar navigation",
        description:
          "Pin and reorder the sidebar tabs. Unpinned tabs collect in the More menu; a single unpinned tab is hidden instead of getting a menu of one. New chat stays fixed.",
        dragToReorder: "Drag to reorder",
        pinToSidebar: "Pin {name} to the sidebar",
        moreHolds: "More ({count})",
      },
      sidebarMenu: {
        title: "Profile menu",
        description:
          "Choose which shortcuts appear when you click your name at the bottom of the sidebar, and in what order. Settings, Help, Log out, and Shutdown always appear.",
        darkModeToggle: "Dark mode toggle",
        dragToReorder: "Drag to reorder",
      },
    },
    resources: {
      title: "System",
      description: "Monitor this Unsloth server's hardware and storage.",
      liveUpdates: "Live updates",
      floatingWindow: "Floating window",
      disableOverlay: "Disable overlay",
      liveMonitor: {
        title: "Live monitor",
        apiTitle: "API monitor",
        summary: "Live requests, errors, and token usage",
        status: "{active} active · {recent} recent · {model}",
        noModelLoaded: "no model loaded",
        autoOpen: "Show the floating monitor automatically",
        autoOpenDescription: "Opens a small panel when API traffic arrives.",
        cpu: "CPU",
        ram: "RAM",
        disk: "Disk",
        vram: "VRAM",
        cpuCores: "{logical} logical / {physical} physical cores",
        currentLoad: "Current load",
        free: "{value} free",
        noGpu: "No visible GPU",
      },
      gpu: {
        title: "GPU devices",
        ggufInference: "GGUF inference",
        unavailable: "unavailable",
        noGpu: "No visible GPU detected. CPU-only resources are shown above.",
        unknownDevice: "Unknown GPU",
        deviceWithIndex: "GPU {index}",
        vramUtilization: "VRAM",
        used: "{value} used",
        free: "{value} free",
        total: "{value} total",
      },
      llamaBackend: {
        title: "GGUF inference engine",
        label: "Compute backend",
        description: "The backend llama.cpp uses to run GGUF models.",
        runningOn: "llama.cpp currently runs on {backend}.",
        hint: "Installs the llama.cpp build for this backend and keeps it across updates. Useful when the automatic choice crashes or your GPU driver does not support it. Only backends with a build for this machine are listed; training is unaffected.",
        autoWith: "Automatic ({backend})",
        apply: "Apply",
        applying: "Installing...",
        applyHint: "Downloads the new build and restarts llama.cpp. A loaded model is unloaded.",
        applyHintWithSize: "Downloads {size} and restarts llama.cpp. A loaded model is unloaded.",
        switchedTo: "llama.cpp now runs on {backend}.",
        switchFailed: "Could not change the llama.cpp backend.",
        switchInterrupted: "The switch was interrupted before completion.",
        envLocked: "Set to {backend} by the UNSLOTH_LLAMA_CPP_BACKEND environment variable, which overrides this setting.",
        backends: {
          auto: "Automatic",
          cpu: "CPU",
          cuda: "CUDA",
          rocm: "ROCm",
          vulkan: "Vulkan",
          metal: "Metal",
        },
        unsupported: {
          notInstalled: "No managed llama.cpp install was found, so there is no backend to switch.",
          localLink: "llama.cpp is a local directory you linked yourself, so Unsloth will not replace it.",
          sourceBuild: "This llama.cpp was built from source, so its backend cannot be switched from here.",
          unresolved: "The available backends could not be checked. Check your connection and try again.",
        },
        // Not rendered: extra terms the settings search matches these rows on.
        llamaBackendKeywords:
          "llama.cpp backend gguf inference cuda rocm hip vulkan metal cpu gpu accelerator prebuilt switch engine",
      },
      modelMemory: {
        title: "Model memory",
        keepResident: "Keep model in GPU memory",
        keepResidentDescription: "Stay in VRAM between prompts.",
        keepResidentHint: "Don't hand the weights back to system RAM while the model stays loaded. Turns off idle auto-unload, and when the weights do sit in host RAM (unified memory, or a partial GPU offload) it also passes --mlock so the OS can't page them out and re-upload them on your next prompt.",
        noRamReserve: "Don't reserve system RAM for the model",
        noRamReserveDescription: "Keep no full copy in RAM.",
        noRamReserveHint: "Stream the weights into VRAM instead of keeping a full copy in RAM. Keeps llama.cpp's memory-mapped loading and drops --no-mmap and --mlock.",
        mlockVetoed: "--mlock stays off: pinning the model in place would reserve RAM for all of it. Idle auto-unload is still disabled.",
        memlockCapped: "This system caps locked memory at {limit}. A larger model will not be fully pinned; raise the limit with ulimit -l.",
        reloadRequired: "Reload the model to apply the new memory flags.",
        loadError: "Failed to load model memory settings",
        saveError: "Failed to save model memory settings",
        // Not rendered: extra terms the settings search matches these rows on.
        modelMemoryKeywords:
          "mlock memlock ulimit vram gpu memory ram resident residency pin pinned page lock locked keep loaded unload idle mmap no-mmap load-mode swap paging",
      },
      storage: {
        title: "Storage",
        systemDisk: "System disk",
        diskUsage: "{used} used / {total}",
        diskFree: "{free} free",
        modelsFolder: "Models folder",
        modelsFolderDescription: "Where downloaded models are stored.",
        modelsFolderHint: "Where downloaded models are stored. Change it to keep models off your system drive. Applies to new downloads only. Models you already have stay where they are.",
        // Not rendered: extra terms the settings search matches this row on.
        modelsFolderKeywords:
          "models folder directory path location download downloads cache storage disk drive move relocate hugging face",
        futureDownloads: "New downloads only",
        environmentManaged: "Managed by the {variable} environment variable.",
        locationFree: "{free} free",
        openAction: "Open",
        copyAction: "Copy path",
        changeAction: "Change",
        resetAction: "Use default",
        chooseTitle: "Choose model download location",
        chooseAction: "Use for future downloads",
        cacheSaved: "Model download location updated",
        cacheSaveError: "Couldn't update the model download location",
        cachePickerError: "Couldn't open the folder picker",
        copied: "Path copied",
        openError: "Couldn't open the folder",
        copyError: "Couldn't copy the path",
      },
      environment: {
        title: "Environment",
        backend: "Backend",
        python: "Python",
        torch: "Torch",
        transformers: "Transformers",
        uptime: "Uptime",
        processMemory: "Process memory",
        notInstalled: "Not installed",
        unknown: "Unknown",
      },
    },
    agents: {
      title: "Agents",
      description:
        "Connect coding agents like Claude Code and Codex to a local model with unsloth start.",
      intro:
        "connects Claude Code, Codex, Hermes, OpenClaw, OpenCode and other agents to a model served locally by Unsloth, fully offline. It runs an OpenAI-compatible server and never touches your agent's config files.",
      readDocs: "Read the docs",
      copy: "Copy",
      copied: "Copied",
      commandBuilder: "Command builder",
      agent: "Coding agent",
      model: "Model",
      searchModels: "Search GGUF models...",
      noModels: "No matching GGUF models.",
      showingModels:
        "Showing {shown} of {total} matches. Keep typing to narrow the list.",
      quantization: "Quantization",
      loadingQuantizations: "Loading quantizations...",
      noQuantizations: "No separate quantization",
      recommended: "Recommended",
      downloaded: "Downloaded",
      quantizationLoadError:
        "Couldn't load all quantizations. The command will use the available model value.",
      generatedCommand: "Generated command",
      docs: "Docs",
      agentDocs: "Open {agent} setup docs",
      copyGeneratedCommand: "Copy generated command",
      modelNote:
        "Codex requires a GGUF model served by llama-server. Other agents can also use transformer-backed models; remove --model to use the model already loaded in Unsloth.",
      subagent: {
        title: "Use a local model as a subagent",
        description:
          "Keep {agent} on its current model and delegate selected tasks to this local Unsloth model.",
        setupCommand: "Setup command",
        copySetupCommand: "Copy subagent setup command",
        usagePrompt: "Then in {agent}, type:",
        copyUsagePrompt: "Copy subagent usage prompt",
        defaultPrompt: "Spawn a local agent to implement this function.",
        opencodePrompt: "@unsloth find the cause of this test failure",
      },
      quickstart: {
        title: "Build a command",
        description:
          "Launch an agent against the model currently loaded in Studio. Load a model first, then swap claude for any supported agent below.",
        noneDetected: "No supported agent CLIs were found on your PATH.",
        installed: "Installed",
      },
      supportedAgents: {
        title: "Supported agents",
        description: "Each agent launches with its own command:",
        requiresGguf: "Needs a GGUF model",
      },
      models: {
        title: "Choosing a model",
        description:
          "Pass --model to pick a model and quantization, and --context-length to set the window. Use a quantization suffix, or an explicit --gguf-variant flag.",
        suffixLabel: "With a quantization suffix",
        variantLabel: "With an explicit variant flag",
      },
      options: {
        title: "Common options",
        description:
          "Unsloth flags are parsed first; anything it doesn't recognize is passed straight through to the agent.",
        model:
          "Select a model. Without --model, unsloth start uses the model currently loaded in Studio and errors if none is loaded.",
        contextLength:
          "Set the requested context length (alias: --max-seq-length).",
        ggufVariant: "Choose the GGUF quantization variant.",
        loadIn4bit: "Toggle 4-bit loading for Hugging Face models.",
        tensorParallel: "Toggle tensor-parallel across multiple GPUs.",
        serve: "Enable or disable the automatic local server.",
        launch: "Launch the agent, or just print the command and environment.",
        persist: "Keep Unsloth-managed agent storage between runs.",
        asSubagent:
          "Keep the parent on its current model and register Unsloth as a local subagent (Claude Code, Codex, and OpenCode).",
        apiKey: "Provide your Unsloth API key (or set UNSLOTH_API_KEY).",
        yolo: "Skip approval prompts. Use only in trusted environments.",
      },
      remote: {
        title: "Connect to a remote Studio",
        description:
          "Point unsloth start at a Studio running elsewhere by setting these before launching (or pass --api-key directly):",
      },
      passthrough: {
        title: "Passing agent arguments",
        description:
          "Arguments after the Unsloth flags are forwarded to the agent itself, so native commands like resume still work:",
      },
      dryRun: {
        title: "Preview without launching",
        description:
          "Add --no-launch to print the environment and command instead of launching the agent. If --model is set, the model may still be resolved and loaded.",
      },
    },
    chat: {
      title: "Chat",
      description: "Customize how chat behaves on this device.",
      modelSelection: {
        title: "Select model settings",
        expandQuantizations: "Expand quantizations",
        expandQuantizationsDescription:
          "On: GGUF models in “On Device” show their quantizations right away. Off: click a model to view its quantizations.",
        showAllQuantizations: "Show all quantizations",
        showAllQuantizationsDescription:
          "On: list every quantization in “On Device”, including not downloaded. Off: show only downloaded quantizations.",
      },
      menu: {
        title: "Chat menu",
        description:
          "Pin items to chat's + side menu. Others move into “More”.",
        chatWithFiles: "Chat with Files (RAG)",
        mcp: "MCP",
        savedPrompts: "Saved prompts",
        compareChat: "Compare chat",
        exportChat: "Export chat",
      },
      showResponseModel: "Show response model",
      showResponseModelDescription:
        "Show model metadata in assistant responses.",
      modelDisclaimer: "Show model disclaimer",
      modelDisclaimerDescription:
        'Show "LLMs can make mistakes" under the chat box.',
      thinking: {
        collapseByDefault: "Collapse Thinking by default",
        collapseByDefaultDescription:
          "Keep reasoning collapsed while the model thinks instead of streaming it open. Expand any block to read it.",
      },
      artifacts: {
        title: "Canvas",
        collapseHtmlBlocks: "Collapse HTML blocks",
        collapseHtmlBlocksDescription:
          "Canvas mode collapses full HTML automatically. Turn this on to also collapse fenced HTML documents when Canvas is off.",
        allowNetworkAccess: "Allow canvas network access",
        allowNetworkAccessDescription:
          "Let canvas previews load scripts, styles, fonts, media, and network resources from CDNs. Keep off for fully offline previews.",
        blockedBanner: "Blocked {count} external resource from {hosts}.",
        blockedBannerPlural: "Blocked {count} external resources from {hosts}.",
        blockedBannerAction: "Allow for this canvas",
      },
      data: "Data",
      exportHistory: "Export chat history",
      exportHistoryDescription: "Download all chats and messages as JSON.",
      exportAction: "Export",
      exportingAction: "Exporting...",
      exportConversations: "Export Recents and Projects",
      exportConversationsDescription:
        "Download Recents or Recents plus project chats as Raw JSONL, CSV, or ShareGPT JSONL, combined or per chat.",
      exportConversationsAction: "Export",
      exportScopeRecents: "Recents",
      exportScopeAll: "Recents + Projects",
      exportCombinedSuffix: "(combined)",
      exportPerChatSuffix: "(per chat)",
      importChats: "Import chats",
      importChatsDescription:
        "Import an Open WebUI, JSONL, NDJSON, or CSV export into Recents.",
      importChatsAction: "Import",
      importNoConversations: "No conversations found in file.",
      importedOneChat: "Imported 1 conversation to Recents.",
      importedChatCount: "Imported {count} conversations to Recents.",
      importingChats: "Importing chats: {count} so far ({percent}%)...",
      importedChatCountPartial: "Imported {count} conversations to Recents; {failed} could not be saved.",
      importFailed: "Import failed.",
      clearHistory: "Clear chat history",
      clearHistoryDescription: "Delete chat history from this device.",
      clearAction: "Clear",
      clearAllChats: "Clear all chats",
      clearAllChatsDescription: "Permanently delete every chat on this device.",
      noChatsToClear: "No chats to clear.",
      clearOneChatDescription:
        "Permanently delete the only chat on this device.",
      clearChatCountDescription:
        "Permanently delete all {count} chats on this device.",
      clearChatsAction: "Clear chats",
      clearOneChatTitle: "Clear 1 chat?",
      clearChatsTitle: "Clear {count} chats?",
      clearChatsConfirmDescription:
        "Permanently deletes every chat on this device. This cannot be undone.",
      clearingAction: "Clearing...",
      clearOneChatAction: "Clear 1 chat",
      clearChatCountAction: "Clear {count} chats",
      clearedAllChats: "Cleared all chats",
      clearedOneChat: "Cleared 1 chat",
      clearedChatCount: "Cleared {count} chats",
      someChatsCouldNotBeCleared: "Some chats could not be cleared",
      chatsClearedRemainOne:
        "{clearedCount} chats cleared; 1 chat remains. Please retry.",
      chatsClearedRemain:
        "{clearedCount} chats cleared; {remainingCount} chats remain. Please retry.",
      oneChatClearedRemain:
        "1 chat cleared; {remainingCount} chats remain. Please retry.",
      oneChatClearedRemainOne: "1 chat cleared; 1 chat remains. Please retry.",
      storageClearFailedOne:
        "A storage clear failed; 1 chat may remain. Please retry.",
      storageClearFailed:
        "A storage clear failed; {count} chats may remain. Please retry.",
      failedToClearChats: "Failed to clear chats",
    },
    data: {
      title: "Data",
      backToData: "Back to Data",
      exportFailed: "Could not export chats",
      description:
        "Manage chat history and uploaded files stored on this device.",
      archivedChats: "Archived chats",
      archivedChatsDescription: "View and manage chats you have archived.",
      archivedImages: "Archived images",
      archivedImagesDescription: "View and manage images you have archived.",
      archivedVideos: "Archived videos",
      archivedVideosDescription: "View and manage videos you have archived.",
      manageAction: "Manage",
      exportArchivedChats: "Export",
      exportingArchivedChats: "Exporting...",
      exportedOneArchivedChat: "Exported 1 archived chat",
      exportedArchivedChatCount: "Exported {count} archived chats",
      noArchivedChatsToExport: "No archived chats to export.",
      failedToExportArchivedChats: "Failed to export archived chats",
      archiveAllChats: "Archive all chats",
      archiveAllChatsDescription:
        "Move every chat in Recents and Projects to the archive.",
      noChatsToArchive: "No chats to archive.",
      archiveAllAction: "Archive all",
      archivingAction: "Archiving...",
      archiveAllChatsTitle: "Archive all chats?",
      archiveAllChatsConfirmDescription:
        "Moves every chat on this device to the archive. Archived chats stay available and can be unarchived at any time.",
      archivedAllChats: "Archived all chats",
      archivedOneChat: "Archived 1 chat",
      archivedChatCount: "Archived {count} chats",
      failedToArchiveChats: "Failed to archive chats",
      confirmBeforeDeleting: "Confirm before deleting",
      confirmBeforeDeletingDescription:
        "Ask for confirmation before a chat is deleted. Turn off to delete instantly.",
      filesSection: "Files",
      uploadedFiles: "Uploaded files",
      uploadedFilesDescription:
        "View and manage files uploaded to chats, projects, and knowledge bases.",
      fineTuneExport: "Use chats as training data",
      fineTuneExportDescription:
        "Create a fine-tuning JSONL dataset from your chats. Load it in Train, refine in Recipes, or export it.",
      fineTuneExportAction: "Export JSONL",
      fineTuneRunAction: "Run",
      fineTuneExportingAction: "Exporting...",
      fineTuneOpenRecipesAction: "Open in Recipes",
      fineTuneOpeningRecipesAction: "Opening...",
      fineTuneTrainAction: "Load in Train tab",
      fineTuneTrainingAction: "Loading...",
      fineTuneExportFailed: "Failed to export training data",
      fineTuneRecipeFailed: "Failed to open chats in Recipes",
      fineTuneTrainFailed: "Failed to load dataset in the Train tab",
    },
    connections: {
      title: "Connections",
      description: "Manage providers and external connections.",
    },
    apiKeys: {
      title: "API",
      description: "Access Unsloth via the OpenAI-compatible API.",
      readDocs: "Read the API docs",
      noAccess: "No API access yet.",
      accessTokens: "Access tokens",
      loadError: "Couldn't load API access.",
      createError: "Couldn't create access token.",
      revokeError: "Couldn't revoke access token.",
      never: "Never",
      tokenNamePlaceholder: "Token name (e.g. production)",
      newAccessTokenName: "New access token name",
      createToken: "Create token",
      creating: "Creating...",
      newTokenCreated: "New access token created",
      accessTokenCopied: "Access token copied",
      copyAccessToken: "Copy access token",
      copyNow: "Copy now - this won't be shown again.",
      usageExamples: "Usage examples",
      usageNoModel:
        "Load or download a model to see runnable examples. This server has no model to name yet.",
      usageTools: "Tools",
      exampleCurlTools: "curl + tools",
      examplePythonTools: "Python + tools",
      exampleJavaScriptTools: "JavaScript + tools",
      exampleCurlAdvanced: "curl + advanced",
      examplePythonAdvanced: "Python + advanced",
      exampleJavaScriptAdvanced: "JavaScript + advanced",
      osUnix: "Linux / macOS / WSL",
      osWindows: "Windows",
      secureHttps: "Secure HTTPS",
      secureHttpsHint:
        "The 0.0.0.0 port is still reachable globally. For full security, launch Unsloth with --secure to expose only this HTTPS link.",
      copyTunnelUrl: "Copy tunnel URL",
      copySnippet: "Copy snippet",
      copy: "Copy",
      copied: "Copied",
      setupDocs: "Setup docs:",
      codingAgents: "Coding agents",
      codingAgentsHint:
        "Launch a coding agent against this server. It uses the loaded model; a local server mints an API key automatically, a remote one includes it in the command.",
      codingAgentsSwap: "Swap claude for codex, openclaw, opencode, or hermes.",
      codingAgentDetected: "Installed on this machine",
      codingAgentsDetectedHint: "Detected on this machine: {agents}.",
      relativeNever: "never",
      relativeJustNow: "just now",
      expired: "expired",
      today: "today",
      created: "Created {value}",
      used: "Used {value}",
      expires: "Expires {value}",
      actionsFor: "Actions for {name}",
      copyPrefix: "Copy prefix",
      revokeToken: "Revoke token",
      revokeTitle: 'Revoke access token "{name}"?',
      revokeDescription:
        "Apps using this token immediately lose access. This cannot be undone.",
      revokeAction: 'Revoke "{name}"',
      revoking: "Revoking...",
    },
    about: {
      title: "About",
      description: "Docs, release notes, feedback, and build info.",
      studioVersion: "Unsloth Version",
      packageVersion: "Package Version",
      desktopAppVersion: "Desktop App Version",
      desktopAppVersionUnavailable: "Unavailable",
      llamaCppVersion: "llama.cpp Version",
      hardware: "Hardware",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      xpu: "XPU",
      updates: "Update",
      help: "Help",
      documentation: "Documentation",
      releaseNotes: "Release notes",
      whatsNew: "What's new",
      feedback: "Feedback",
      reportIssue: "Report an issue",
      license: {
        sectionTitle: "License",
        studioLabel: "Unsloth",
        studioLicense: "AGPL-3.0",
        studioDescription: "Open source under the GNU AGPL v3.0.",
        libraryLabel: "Unsloth Core",
        libraryLicense: "Apache-2.0",
        libraryDescription: "Licensed under Apache 2.0.",
      },
      dangerZone: "Danger zone",
      shutDownStudio: "Shut down Unsloth",
      shutDownStudioDescription:
        "Stops the Unsloth server and ends your session.",
      shutDown: "Shut down",
      update: {
        title: "Update Unsloth",
        commandText: "{label} text",
        copied: "Copied",
        copyCommand: "Copy command",
        commandCopied: "{label} copied",
        copyNamedCommand: "Copy {label}",
        checkingInstall: "Checking how Unsloth was installed...",
        installIntro: "To install or update Unsloth:",
        localUpdateHeading: "Local update",
        installCommandUnix: "macOS/Linux install command",
        installCommandWindows: "Windows install command",
        localInstallDetected:
          "Local install detected. Update from your original checkout to avoid replacing it with PyPI.",
        pullThenUpdate:
          "Pull the latest changes, then run the local installer:",
        gitPullCommand: "git pull command",
        localInstallerCommand: "local installer command",
        sourceInstallDetected:
          "Source or VCS package install detected. Reinstall from the original local path or Git URL.",
        repoCheckoutFallback:
          "If you still have the repo checkout, run the local installer from it:",
        restartAfterUpdate: "Restart Unsloth after updating.",
        desktopManaged:
          "The desktop app checks for new app versions automatically. You can also check or update here at any time.",
        desktopReady: "Desktop app updates",
        desktopReadyDescription:
          "Check whether a newer desktop app version is available.",
        desktopChecking: "Checking for updates",
        desktopCheckingDescription: "This usually takes a few seconds.",
        desktopAvailable: "Desktop app {version} is available",
        desktopAvailableDescription:
          "Update now and the desktop app will restart when it finishes.",
        desktopExternalServer:
          "Run `unsloth studio update` from the terminal that started your server.",
        desktopManualInstall:
          "Open the release page to install the latest Linux package.",
        desktopCheckFailed: "Could not check for updates",
        desktopCheckFailedDescription: "Check your connection and try again.",
        desktopCurrent: "Desktop app is up to date",
        desktopCurrentDescription:
          "Unsloth will continue checking automatically.",
        checkForUpdates: "Check for updates",
        checkAgain: "Check again",
        retryCheck: "Try again",
        checking: "Checking...",
        updateNow: "Update now",
        openReleasePage: "Open release page",
        unknownInstall:
          "Could not detect how Unsloth was installed. For installer or PyPI installs, use the commands above.",
        localCheckout:
          "For local checkout installs, run the local installer from that checkout:",
        docs: "Install docs:",
        docsInstall: "Installation",
        docsUpdating: "Updating",
        docsMac: "Mac",
        docsWindows: "Windows",
      },
    },
  },
  studio: {
    routeTitle: "Train",
    wizard: {
      modelTitle: "Model",
      modelDescription: "Select model and training method",
      datasetTitle: "Dataset",
      datasetDescription: "Select or upload training data",
      paramsTitle: "Parameters",
      paramsDescription: "Configure training parameters",
      configTitle: "Configuration",
      configDescription: "Save and load configurations",
      modelLabel: "Model",
      modelTooltip: "The base model you want to fine-tune.",
      methodLabel: "Method",
      methodTooltip:
        "How the model is trained. LoRA and QLoRA update small adapters instead of every weight.",
      datasetLabel: "Dataset",
      datasetTooltip: "The training data used to fine-tune the model.",
      hfTokenDescription: "Required for gated or private models and datasets.",
      uploadLocalLabel: "Or upload a local file",
      sourceBrowse: "Browse",
      releaseToUpload: "Release to upload",
      loadYaml: "Load YAML",
      saveYaml: "Save YAML",
      resetDefaults: "Reset to defaults",
      cachedModelGoneTitle: "Cached model no longer available",
      cachedModelGoneDescription:
        "The model files left this device, so training will download them again.",
      cachedDatasetGoneTitle: "Cached dataset no longer available",
      cachedDatasetGoneDescription:
        "The dataset files left this device, so training will download them again.",
    },
    preview: {
      title: "Run preview",
      ready: "Ready",
      notReady: "Not ready",
      modelPending: "Model pending",
      datasetPending: "Dataset pending",
      method: "Method",
      length: "Length",
      stepZero: "{count} steps",
      step: "{count} step",
      stepTwo: "{count} steps",
      stepFew: "{count} steps",
      stepMany: "{count} steps",
      steps: "{count} steps",
      epochZero: "{count} epochs",
      epoch: "{count} epoch",
      epochTwo: "{count} epochs",
      epochFew: "{count} epochs",
      epochMany: "{count} epochs",
      epochs: "{count} epochs",
      batch: "Batch",
      context: "Context",
      lr: "LR",
      hardware: "Hardware",
      noGpu: "No GPU detected",
      hfToken: "HF token",
      saved: "Saved",
      notSet: "Not set",
      files: "Files",
      model: "Model",
      dataset: "Dataset",
      downloadsOnStart: "Downloads on start",
      continuesOnStart: "Continues on start",
      noticeModelDownload:
        "This model is not on this device yet. Training will download it automatically.",
      noticeModelPartial:
        "Training will complete the partial model download before loading it.",
      noticeDatasetDownload:
        "This dataset is not on this device yet. Training will download it automatically.",
      noticeDatasetPartial:
        "Training will complete the partial dataset download before reading it.",
      noticeTransformersUpgrade:
        "No installed transformers supports this architecture yet. Starting the run offers to install transformers {version} first.",
      noticeSixteenBitOnly:
        "This architecture trains in 16-bit LoRA: 4-bit is not available for it, so the run needs far more VRAM than QLoRA.",
      noticeInstallSwitchesSixteenBit:
        "Installing that release instead of keeping the model's own code switches this run to 16-bit LoRA, which needs far more VRAM than QLoRA.",
      advancedSettings: "Advanced settings",
      defaultAdvancedSettings: "Defaults",
      nonDefaultAdvancedSettings: "{count} non-default",
    },
    datasetPicker: {
      noun: "datasets",
      selectDataset: "Select dataset",
      hubPlaceholder: "Search Hugging Face datasets...",
      devicePlaceholder: "Search local datasets...",
      useAsHubDataset: "Use as Hugging Face dataset",
      hfCacheLabel: "HF cache",
      scanningLocal: "Scanning datasets on this device…",
      couldntScan: "Couldn't scan local datasets",
      someLocationsUnscanned: "Some dataset locations could not be scanned.",
      noLocalDatasets:
        "Nothing on this device yet. Download a dataset from the Hub, build one in Recipes, or upload a file.",
      openDataRecipes: "Open Data Recipes",
      searchingHub: "Searching Hugging Face…",
      noDatasetsFound: "No datasets found.",
      tokenRejectedTitle: "Hugging Face token rejected",
      tokenRejectedBody: "Update your token in Settings → General, then retry.",
      hubUnreachable: "Couldn't reach Hugging Face",
      cantUseDataset: "Can't use dataset",
      reasonInvalidHubId:
        "Enter a valid Hugging Face dataset ID: repo or owner/repo, with no consecutive periods or hyphens and no .git suffix (maximum 96 characters per part).",
      sourceRecipe: "Recipe",
      sourceUpload: "Upload",
      sourceLocal: "Local",
    },
    modelPicker: {
      noun: "models",
      selectModel: "Select model",
      hubPlaceholder: "Search or paste a Hugging Face id...",
      devicePlaceholder: "Search local models or paste a folder path...",
      useAsHubModel: "Use as Hugging Face model",
      useAsLocalPath: "Use as local path",
      hfCacheLabel: "HF cache",
      scanningLocal: "Scanning local models…",
      couldntScan: "Couldn't scan local models",
      someLocationsUnscanned: "Some local locations could not be scanned.",
      noLocalModels: "No local models found.",
      noLocalModelsHint: "Paste a folder path above or switch to Hugging Face.",
      searchingHub: "Searching Hugging Face…",
      noModelsFound: "No models found.",
      tokenRejectedTitle: "Hugging Face token rejected",
      tokenRejectedBody: "Update your token in Settings → General, then retry.",
      hubUnreachable: "Couldn't reach Hugging Face",
      cantUseModel: "Can't use model for training",
      reasonTypeMismatch:
        "This model doesn't match the training type selected in the previous step.",
      reasonEmptyId: "Enter a model id or local model path.",
      reasonGguf: "GGUF models cannot be used for training.",
      reasonAdapter: "Adapter outputs cannot be used as base training models.",
      reasonNotTrainable: "This on-device model is not trainable.",
      reasonUnsupportedFormat:
        "This model format is not supported for training.",
      reasonInvalidHubId:
        "Enter a valid Hugging Face model ID: repo or owner/repo, with no consecutive periods or hyphens and no .git suffix (maximum 96 characters per part).",
      sourceModelsFolder: "Models folder",
      sourceHfCache: "HF cache",
      sourceLmStudio: "LM Studio",
      sourceOllama: "Ollama",
      sourceCustomFolder: "Custom folder",
      sourceLocalModel: "Local model",
      vramOomBadge: "OOM",
      vramTightBadge: "Tight",
      vramNeeds: "Needs ~{est}GB VRAM (GPU: {total}GB)",
      vramTight: "~{est}GB VRAM (tight on {total}GB)",
      vramApprox: "~{est}GB VRAM",
    },
    methods: {
      qlora: {
        label: "QLoRA",
        hint: "4-bit quantization. Lowest VRAM, fastest to start.",
        note: "4-bit",
      },
      lora: {
        label: "LoRA",
        hint: "16-bit adapters. Balanced quality and memory.",
        note: "16-bit",
      },
      full: {
        label: "Full fine-tune",
        hint: "Trains all weights. Highest quality, needs the most VRAM.",
        note: "fp16",
      },
      cpt: {
        label: "Continued pretraining",
        hint: "Continued pretraining for new domains or languages.",
        note: "continued",
      },
    },
    subtitles: {
      configure: "Configure and start training",
      trainingInProgress: "Training in progress",
      viewPastRuns: "View past training runs",
      viewingPastRun: "Viewing past run",
    },
    tabs: {
      configure: "Configure",
      currentRun: "Current Run",
      history: "History",
    },
    imageTraining: "Image training",
    goToImageTraining: "Go to image training",
    loadingRuntime: "Loading training runtime...",
    checkingSupport: "Checking this machine for training support...",
    backToHistory: "Back to history",
    dataset: {
      selectors: {
        subset: "Subset",
        subsetTooltip: "Select which subset (config) of the dataset to use.",
        trainSplit: "Train Split",
        trainSplitTooltip: "Select which split to use for training.",
        evaluationSplit: "Evaluation Split",
        evaluationSplitTooltip:
          "Select which split to use for evaluation. None means no evaluation during training.",
        selectSubset: "Select a subset...",
        selectSplit: "Select a split...",
        none: "None",
        loading: "Loading dataset configs and splits...",
        manualTitle: "Enter dataset options manually",
        manualDescription:
          "Enter the exact Hugging Face config and split names to use.",
        manualSubsetPlaceholder: "Optional config name",
        manualRequired: "A train split is required.",
        manualTooLong: "Use 128 characters or fewer.",
        manualInvalid: "This value contains unsupported characters.",
      },
      sourceAriaLabel: "Dataset source",
      localDataset: "Local dataset",
      localDatasetRows: " / {count} rows",
      huggingFaceDataset: "Hugging Face Dataset",
      localDatasetMetadata: "Local dataset metadata",
      dataRecipeOutput: "Data Recipe output.",
      rows: "Rows",
      columns: "Columns",
      batches: "Batches",
      updated: "Updated",
      evalDataset: "Eval dataset",
      uploading: "Uploading...",
      uploadEvalFile: "Upload eval file",
      fileTooLarge: "File too large",
      fileTooLargeDescription:
        "{file} is {size}. Training uploads support up to {limit}.",
      documentRedirect: {
        title: "This file needs conversion first",
        genericFile: "This file",
        description:
          "{file} is source material, not a ready-to-train dataset. Use Data Recipes to turn the document into a dataset, then return here to fine-tune.",
        nextStepTitle: "Best next step",
        nextStepDescription:
          "Open Learning Recipes and start with a document-based recipe such as PDF grounded QA.",
        openAction: "Open Learning Recipes",
      },
      evalDatasetDescription:
        "Optional. If not provided, a small portion will be split from the training data.",
      advanced: "Advanced",
      targetFormat: "Target Format",
      targetFormatTooltip:
        "Format of your training data. Auto-detect works for most datasets.",
      streamingInfoAriaLabel: "Dataset streaming information",
      streaming: {
        label: "Enable streaming",
        description:
          "Stream Hugging Face text datasets instead of downloading them.",
        unavailable: "Streaming unavailable. To enable:",
        completionsUnavailable:
          "Not available while dataset streaming is enabled.",
        blockers: {
          source:
            "Use a Hugging Face dataset (not a local upload or S3 source).",
          maxSteps:
            "Set Max Steps > 0 — streaming datasets have no known length.",
          trainOnCompletions: 'Turn off "Assistant completions only".',
          evalSplit:
            "Pick a separate eval split — evaluation is on but no distinct eval split is set.",
          visionModel: "Vision models don't support streaming.",
          audioModel: "Audio models don't support streaming.",
          embeddingModel:
            "Embedding models don't support streaming (training needs the full dataset).",
          imageDataset: "This dataset looks like images, which can't stream.",
          audioDataset: "This dataset looks like audio, which can't stream.",
          appleSilicon: "Streaming isn't supported on Apple Silicon (MLX) yet.",
        },
        options: {
          trainOnCompletions: "assistant completions only",
          evaluation: "evaluation (needs a separate eval split)",
        },
        notifications: {
          turnedOffMaxSteps:
            "Streaming turned off: streaming needs a fixed Max Steps > 0.",
          adjusted:
            "Adjusted for streaming. Disabled incompatible options: {options}.",
          needsMaxSteps:
            "Streaming needs a fixed Max Steps (streaming datasets have no known length). Set Max Steps > 0 first.",
          enabledAdjusted:
            "Streaming enabled. Disabled incompatible options: {options}.",
          disabledForDetectedModality:
            "Streaming was turned off because image and audio datasets require a full download. Review the setting, then start again.",
        },
      },
      auto: "Auto",
      rawText: "Raw Text",
      trainSplitStart: "Train Split Start",
      trainSplitStartTooltip:
        "Only train on a subset of your training split by specifying a start row index (inclusive, 0-based). Leave empty to start from the first row.",
      trainSplitEnd: "Train Split End",
      trainSplitEndTooltip:
        "Last row index to include from the training split (inclusive, 0-based). For example, set Start to 0 and End to 99 to train on the first 100 rows. Leave empty to use all remaining rows.",
      endPlaceholder: "End",
      clear: "Clear",
      dropFileOrClick: "Drop file or click to upload",
      uploadDetails: "Upload details",
      uploadDetailsTooltip:
        "Up to {limit} per file. PDF, DOCX and TXT are not ready-to-train datasets, so convert them in Learning Recipes first.",
      viewDataset: "View dataset",
      uploadFailed: "Upload failed",
      unknownError: "Unknown error",
      unsupportedFileType: "Unsupported file type",
      uploadOneFileType: "Upload one {types} file.",
      datasetUploaded: "Dataset uploaded",
      evalDatasetUploaded: "Eval dataset uploaded",
      uploadOneFileAtATime: "Upload one file at a time",
      uploadSingleFileDescription:
        "Training dataset upload accepts a single file.",
      previewLoadingHuggingFace:
        "Fetching dataset preview from Hugging Face...",
      previewLoading: "Loading preview...",
      mappingRequirements: {
        audioAndText: "audio and text",
        imageAndText: "image and text",
        instructionAndOutput: "instruction and output",
        humanAndGpt: "human and GPT",
        userAndAssistant: "user and assistant",
      },
      mappingStatus: {
        heuristicTitle: "Heuristic-detected mapping",
        readyTitle: "Mapping ready",
        requiredTitle: "Map dataset columns",
        heuristicDescription:
          "We auto-detected the column mapping below using heuristics. Please review and adjust using the dropdowns in the column headers, or use AI Assist for a smarter mapping.",
        readyDescription:
          "Looks good. We'll convert this dataset automatically.",
        requiredDescription:
          "Assign roles to columns using the dropdowns in the headers. At minimum, assign {required}.",
      },
      s3: {
        title: "S3 Configuration",
        description:
          "Load .parquet, .json, .jsonl, or .csv datasets from Amazon S3",
        bucket: "Bucket Name",
        bucketPlaceholder: "my-training-data-bucket",
        region: "AWS Region",
        regionPlaceholder: "us-east-1",
        prefix: "Path Prefix",
        prefixPlaceholder: "datasets/whisper/",
        accessKeyId: "Access Key ID",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "Secret Access Key",
        secretAccessKeyPlaceholder: "Your AWS secret access key",
        useIamRole: "Use IAM Role",
      },
    },
    params: {
      mode: {
        simple: "Simple",
        advanced: "Advanced",
        ariaLabel: "Parameter mode",
      },
      projectName: "Project Name",
      optional: "Optional",
      projectNameDescription:
        "Used in training output folder names, export defaults, and history.",
      loraSettings: "LoRA Settings",
      trainingHyperparameters: "Training Hyperparameters",
      maxSteps: "Max Steps",
      epochs: "Epochs",
      useMaxSteps: "Use Max Steps",
      useEpochs: "Use Epochs",
      maxStepsTooltip: "Override total optimizer steps.",
      epochsTooltip: "Number of full passes over the dataset.",
      contextLength: "Context Length",
      contextLengthTooltip: "Maximum number of tokens per training sample.",
      customContextLength: "Enter a custom value",
      learningRate: "Learning Rate",
      learningRateTooltip:
        "Step size for weight updates. Lower values train slower but more stably.",
      learningRateDescription:
        "Recommended: 2e-4 for LoRA, 5e-5 for CPT, 2e-5 for full fine-tune",
      embeddingLearningRate: "Embedding Learning Rate",
      embeddingLearningRateTooltip:
        "Only used when CPT is training embed_tokens. Embeddings are easier to destabilize than LoRA weights, so they usually need a smaller LR. Leave blank to use lr/10; typical working range is 2x-10x smaller than the main LR. Increase it only if vocabulary or domain-token adaptation is too slow.",
      rank: "Rank",
      rankTooltip:
        "Dimension of the low-rank matrices. Higher = more capacity.",
      alpha: "Alpha",
      alphaTooltip: "Scaling factor for LoRA updates. Usually 2x rank.",
      dropout: "Dropout",
      dropoutTooltip:
        "Dropout probability for LoRA layers to reduce overfitting.",
      visionLayers: "Vision layers",
      languageLayers: "Language layers",
      attentionModules: "Attention modules",
      mlpModules: "MLP modules",
      targetModules: "Target Modules",
      enableLora: "Enable LoRA",
      trainWithLora: "Train with LoRA",
      stableRank: "Stable Rank",
      memoryEfficient: "Memory Efficient",
      weightDecomposed: "Weight-Decomposed",
      notSupportedAppleSilicon: "Not supported on Apple Silicon",
      optimization: "Optimization",
      schedule: "Schedule",
      memory: "Memory",
      optimizer: "Optimizer",
      optimizerTooltip:
        "Optimization algorithm. 8-bit variants reduce memory usage. Fused is recommended for vision models.",
      optimizerTooltipMlx:
        "Optimization algorithm. AdamW is the default. Lion uses less memory but usually needs a lower learning rate.",
      lrScheduler: "LR scheduler",
      lrSchedulerTooltip:
        "How the learning rate changes over training. Linear decays steadily; cosine decays in a curve.",
      optimizerOptions: {
        adamw8bit: "AdamW 8-bit",
        pagedAdamw8bit: "Paged AdamW 8-bit",
        adamwBnb8bit: "AdamW BNB 8-bit",
        pagedAdamw32bit: "Paged AdamW 32-bit",
        adamwTorch: "AdamW (PyTorch)",
        adamwTorchFused: "AdamW (PyTorch Fused)",
      },
      lrSchedulerOptions: {
        linear: "Linear",
        cosine: "Cosine",
      },
      batchSize: "Batch Size",
      batchSizeTooltip: "Samples processed per step. Higher uses more VRAM.",
      gradAccum: "Grad Accum",
      gradAccumTooltip: "Simulates larger batch sizes without extra VRAM.",
      weightDecay: "Weight Decay",
      weightDecayTooltip: "L2 regularization to prevent overfitting.",
      warmupSteps: "Warmup Steps",
      warmupStepsTooltip:
        "Gradually increase LR at training start for stability.",
      scheduleEpochsTooltip:
        "Number of full passes over the dataset. Set 0 to run by max steps.",
      saveSteps: "Save Steps",
      saveStepsTooltip: "Save a checkpoint every N steps. 0 to disable.",
      evalSteps: "Eval Steps",
      evalStepsTooltip:
        "Fraction of total training steps between evaluations (0-1). Set to 0 to disable evaluation. E.g. 0.01 = evaluate every 1% of steps.",
      seed: "Seed",
      seedTooltip: "Random seed for reproducibility.",
      gradCheckpoint: "Grad Checkpoint",
      gradCheckpointTooltip:
        "Trade compute for memory by recomputing activations.",
      none: "None",
      standard: "Standard",
      enablePacking: "Enable packing",
      assistantCompletionsOnly: "Assistant completions only",
      readMore: "Read more",
    },
    training: {
      startTraining: "Start Training",
      starting: "Starting...",
      loadingModel: "Loading model...",
      checkingDataset: "Checking dataset...",
      chooseModel: "Choose a model",
      chooseDataset: "Choose a dataset",
      chooseModelAndDataset: "Choose model and dataset",
      validation: {
        s3MultimodalUnsupported:
          "S3 datasets are not supported for vision or audio training yet.",
        s3BucketRequired: "Enter an S3 bucket name first.",
        s3CredentialsRequired: "Provide S3 access keys or enable IAM role.",
        modelRequired: "Select a base model first.",
        learningRatePositive: "Enter a learning rate greater than zero.",
        embeddingLearningRateRange:
          "Enter an embedding learning rate greater than 0 and less than 1.",
        hfDatasetRequired: "Select a Hugging Face dataset first.",
        hfDatasetSplitRequired: "Select or enter a train split first.",
        localDatasetRequired: "Select a local dataset first.",
        unsupportedDatasetSource: "Unsupported dataset source.",
      },
      startFailed: "Failed to start training",
      startUnconfirmed:
        "Unsloth couldn't confirm whether training started. Checking status in the background.",
      stopFailed: "Failed to stop training",
      trainingStillActiveTitle: "Training still active",
      stopBeforeConfig: "Stop training first, then return to configuration.",
      resumeFailed: "Failed to resume training",
      resumeFailedTitle: "Could not resume training",
      resumeUnavailable:
        "Only stopped or errored runs with a saved checkpoint can be resumed.",
      modelUnverified:
        "Couldn't verify this model's settings. Check your connection or Hugging Face token, then retry.",
      legacyDatasetScriptUnsupported:
        "This Hub dataset relies on a legacy custom script and isn’t supported in this training flow.",
      hfModelAccessDenied:
        "Hugging Face denied access to this model. Add a valid Hugging Face token with repository access and accept any required access terms, then try again.",
      hfModelVerificationRateLimited:
        "Hugging Face model verification is rate-limited. Retry shortly.",
      hfModelVerificationFailed:
        "The Hugging Face model could not be verified. Check the repository ID and your access token.",
      hfModelMetadataUnavailable:
        "Hugging Face model metadata is temporarily unavailable. Retry before starting training.",
      datasetUnverified:
        "Couldn't verify the dataset is compatible with this model. Check your connection or Hugging Face token — starting training will retry the check.",
      setupChanged:
        "Training setup changed while it was being checked. Review it and start again.",
      uploadConfigTooltip: "Load a saved YAML config",
      saveConfigTooltip: "Download current config as YAML",
      resetConfigTooltip: "Reset to model defaults",
      configLoaded: "Config loaded",
      failedToLoadConfig: "Failed to load config",
      invalidYamlFile: "Invalid YAML file",
      configTooLarge: "Training config is too large (maximum 1 MiB).",
      failedToReadFile: "Failed to read file",
      failedToSaveConfig: "Failed to save config",
      parametersReset: "Parameters reset to model defaults",
      audioIncompatible:
        "This model does not support audio. Switch to an audio-capable model or choose a non-audio dataset.",
      visionIncompatible:
        "Text model is not compatible with a multimodal dataset. Switch to a vision model or choose a text-only dataset.",
      cancelTitle: "Cancel Training",
      cancelDescription: "Do you want to cancel the current training run?",
      continueAction: "Continue Training",
      cancelAction: "Cancel Training",
      stopTitle: "Stop Training",
      stopDescription:
        "Choose how you want to stop the current training run. Stop and Save writes a checkpoint you can resume from later; stopping without saving cannot be resumed.",
      stopAction: "Stop",
      stopping: "Stopping...",
      stopAndSave: "Stop and Save",
      compareInChat: "Compare in Chat",
      exportModel: "Export Model",
      milestone: "Milestone",
      halfwayDone: "Halfway done. Training is past 50%.",
      doneNextStep:
        "Training done. Next step: compare base vs fine-tuned outputs.",
    },
    history: {
      title: "History",
      filesDeleted: "Files deleted",
      deleteArtifactsLabel: "Also delete adapter files on disk",
      deleteArtifactsDescription:
        "Removes the run's output folder, including saved adapters and checkpoints.",
      deleteArtifactsSharedNote:
        "Another run shares this output folder. Files are kept until the last run that uses them is deleted.",
      artifactsKeptShared:
        "Run deleted. Adapter files were kept because another run uses the same folder.",
      deleteArtifactsActiveError:
        "These files are in use by the training run in progress. Stop training before deleting them.",
      deleteArtifactsFailed:
        "The run was deleted but its files could not be removed.",
      deleteArtifactsRetainedError:
        "The adapter files could not be removed, so the training run was kept in history.",
      emptyDescription:
        "No training runs yet. Start your first training run in the Configure tab.",
      loadError: "Failed to load training runs",
      deleteError: "Failed to delete training run. Please try again.",
      retry: "Retry",
      loadMore: "Load more",
      loading: "Loading...",
      loadingRun: "Loading training run...",
      runNotFound: "Run not found",
      deleteTitle: "Delete training run?",
      deleteDescription:
        "This will permanently delete this training run and all its metrics. This action cannot be undone.",
      resumeTraining: "Resume training",
      resuming: "Resuming...",
      deleteRun: "Delete run",
      loss: "Loss",
      steps: "Steps",
      lossTrendSparkline: "Loss trend sparkline",
      relativeJustNow: "just now",
      status: {
        completed: "Completed",
        stopped: "Stopped",
        error: "Error",
        running: "Running",
        continued: "Continued",
      },
      message: {
        completed: "Training completed",
        stopped: "Training stopped",
        running: "Training in progress",
        errored: "Training errored",
      },
      copyPreviewLink: "Copy preview link",
      previewLinkCopied: "Preview link copied",
      previewLinkCopyFailed: "Couldn't copy the link",
    },
    charts: {
      settings: "Chart Settings",
      settingsDescription:
        "Tune chart presentation while training keeps running.",
      openSettings: "Open chart settings",
      viewWindow: "View window",
      viewWindowDescription: "Show latest steps only or the full history.",
      window: "Window",
      all: "All",
      trainingLoss: "Training Loss",
      trainingLossDescription: "Control overlays and EMA smoothing.",
      smoothing: "Smoothing",
      smoothingDescription: "Move right for more smoothing. `0` = raw.",
      showRawLoss: "Show raw loss",
      showSmoothedLoss: "Show smoothed loss",
      showAverageLine: "Show average line",
      scaleAndCleanup: "Scale and cleanup",
      linear: "Linear",
      log: "Log",
      noClip: "No clip",
      clipP99: "Clip p99",
      clipP95: "Clip p95",
      lossAxis: "Loss axis",
      gradientNormAxis: "Gradient norm axis",
      learningRateAxis: "Learning rate axis",
      resetDefaults: "Reset defaults",
      loss: "Loss",
      smoothed: "Smoothed",
      evalLoss: "Eval Loss",
      learningRate: "Learning Rate",
      lr: "LR",
      gradNorm: "Grad Norm",
      gradientNorm: "Gradient Norm",
      step: "Step {step}",
      averageValue: "avg {value}",
      waitingForFirstEvaluationStep: "Waiting for first evaluation step...",
      evaluationNotConfigured: "Evaluation not configured",
      evalChartWillAppear: "Chart will appear once eval_steps is reached",
      setEvalDatasetAndSteps:
        "Set eval dataset & eval_steps to track eval loss",
    },
    progress: {
      title: "Training Progress",
      liveMetrics: "Live training metrics",
      exportGguf: "Export to GGUF",
      openConfig: "Open training config",
      configLabel: "Training Config",
      hyperparams: "Hyperparams",
      epochs: "Epochs",
      batchSize: "Batch size",
      learningRate: "Learning rate",
      optimizer: "Optimizer",
      maxSteps: "Max steps",
      contextLength: "Context length",
      warmupSteps: "Warmup steps",
      rank: "Rank",
      alpha: "Alpha",
      dropout: "Dropout",
      variant: "Variant",
      epoch: "Epoch {value}",
      percentComplete: "{percent}% complete",
      stepProgress: "Step {current} / {total}",
      loss: "Loss",
      lr: "LR",
      gradNorm: "Grad Norm",
      project: "Project",
      model: "Model",
      method: "Method",
      elapsed: "Elapsed: {value}",
      eta: "ETA: {value}",
      stepsPerSecond: "{value} steps/s",
      noStepsPerSecond: "-- steps/s",
      tokens: "Tokens: {value}",
      gpuMonitor: "GPU Monitor",
      live: "Live",
      utilization: "Utilization",
      temperature: "Temperature",
      vram: "VRAM",
      power: "Power",
      phase: {
        idle: "Idle",
        downloadingModel: "Downloading model",
        downloadingDataset: "Downloading dataset",
        loadingModel: "Loading model",
        loadingDataset: "Loading dataset",
        configuring: "Configuring",
        training: "Training",
        finalizing: "Saving model",
        completed: "Completed",
        error: "Error",
        stopped: "Stopped",
      },
    },
    trainingStart: {
      ready: "Ready",
      downloading: "Downloading",
      preparing: "Preparing",
      left: "{eta} left",
      downloaded: "{size} downloaded",
      terminalStart: "> unsloth training starts...",
      preparingResources: "> Preparing model and dataset...",
      gettingReady: "> We are getting everything ready for your run...",
      waitingForFirstStep: "> {message} | waiting for first step... ({step})",
      resumingTraining: "Resuming training...",
      startingTraining: "starting training...",
      dataset: "Dataset",
      datasetStreaming: "Dataset: streaming (no full download)",
      modelWeights: "Model weights",
    },
  },
} as const;
