// 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 = {
  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 Studio",
    accountMenu: "{name} account menu",
    updateAvailable: "Update available",
    aria: {
      home: "Unsloth home",
      closeSidebar: "Close sidebar",
      openSidebar: "Open sidebar",
      chatOptions: "Chat options",
      runOptions: "Run options",
    },
    navigation: {
      newChat: "New Chat",
      returnToChat: "Return to Chat",
      compare: "Compare",
      search: "Search",
      hub: "Hub",
      train: "Train",
      recipes: "Recipes",
      export: "Export",
      recents: "Recents",
      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",
    },
    tabs: {
      general: "General",
      profile: "Profile",
      appearance: "Appearance",
      chat: "Chat",
      connections: "Connections",
      apiKeys: "API",
      about: "About",
    },
    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",
      tokenSaved: "Token saved",
      password: "Password",
      passwordDescription: "Change the password for this Studio account.",
      passwordDialog: {
        trigger: "Change password",
        title: "Change password",
        description:
          "Enter your current password and choose a new one (at least {minLength} characters).",
        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.",
        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.",
      },
      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",
      },
      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.",
      },
      gettingStarted: "Getting started",
      startOnboarding: "Start onboarding",
      startOnboardingDescription:
        "Reopen the setup wizard without changing your account.",
      startOnboardingAction: "Start onboarding",
      uploads: {
        sectionTitle: "Uploads",
        maxUploadSize: "Training dataset upload cap",
        maxUploadSizeDescription: "Default is {defaultSize} MB.",
      },
      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",
      displayName: "Display name",
      nickname: "What should Unsloth call you?",
      nicknamePlaceholder: "Nickname",
      nicknameSaved: "Preferred name saved",
      avatarShape: "Profile picture shape",
      avatarShapeCircle: "Circle",
      avatarShapeRounded: "Rounded",
      chooseSloth: "Or pick a sloth",
      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.",
    },
    appearance: {
      title: "Appearance",
      description: "How Unsloth Studio looks on this device.",
      theme: {
        title: "Theme",
        label: "Color scheme",
        description: "Light, dark, or follow your system.",
        system: "System",
        light: "Light",
        dark: "Dark",
      },
      language: {
        title: "Language",
        label: "Display language",
        description: "The language used by Unsloth.",
      },
      layout: {
        title: "Layout",
        compactSidebar: "Pin sidebar by default",
        compactSidebarDescription:
          "Keep the sidebar expanded instead of collapsing to icons.",
      },
    },
    chat: {
      title: "Chat",
      description: "Manage chat history stored on this device.",
      modelDisclaimer: "Show model disclaimer",
      modelDisclaimerDescription:
        'Show "LLMs can make mistakes" under the chat box.',
      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.",
      },
      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 a 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.",
      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",
    },
    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.",
      newBadge: "New",
      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",
      usageTools: "Tools",
      exampleCurlTools: "curl + tools",
      examplePythonTools: "Python + tools",
      exampleCurlAdvanced: "curl + advanced",
      examplePythonAdvanced: "Python + 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 Studio with --secure to expose only this HTTPS link.",
      copyTunnelUrl: "Copy tunnel URL",
      copySnippet: "Copy snippet",
      copy: "Copy",
      copied: "Copied",
      setupDocs: "Setup docs:",
      relativeNever: "never",
      relativeJustNow: "just now",
      relativeHoursAgo: "{count}h ago",
      relativeDaysAgo: "{count}d ago",
      relativeMonthsAgo: "{count}mo ago",
      relativeYearsAgo: "{count}y ago",
      expired: "expired",
      today: "today",
      inDays: "in {count}d",
      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",
      llamaCppVersion: "llama.cpp Version",
      hardware: "Hardware",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      updates: "Update",
      help: "Help",
      documentation: "Documentation",
      releaseNotes: "Release notes",
      whatsNew: "What's new",
      feedback: "Feedback",
      reportIssue: "Report an issue",
      license: {
        sectionTitle: "License",
        studioLabel: "Unsloth Studio",
        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 Studio",
      shutDownStudioDescription:
        "Stops the Unsloth server and ends your session.",
      shutDown: "Shut down",
      update: {
        title: "Update Unsloth Studio",
        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 keeps its bundled backend updated and will prompt when a new version is available.",
        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",
    title: "Fine-tuning Studio",
    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",
    },
    loadingRuntime: "Loading training runtime...",
    backToHistory: "Back to history",
    sections: {
      model: "Model",
      dataset: "Dataset",
      params: "Parameters",
      training: "Training",
      charts: "Charts",
      progress: "Training Progress",
    },
    configure: {
      title: "Configure",
      description: "Choose a model, dataset, and training settings.",
      startTraining: "Start Training",
      starting: "Starting...",
      loadingModel: "Loading model...",
      checkingDataset: "Checking dataset...",
      trainingConfig: "Training Config",
    },
    model: {
      title: "Model",
      description: "Select base model and training method",
      fasterTrainingBadge: "2x Faster Training",
      baseModel: "Base model",
      localModel: "Local Model",
      localModelTooltip:
        "Path to a locally downloaded model or a custom HF repo.",
      scanningLocalAndCachedModels: "Scanning local and cached models...",
      scanning: "Scanning...",
      scanningLocalModels: "Scanning local models...",
      noLocalModelsFound: "No local models found",
      noLocalModelsFoundManual: "No local models found. Enter path manually.",
      failedToLoadLocalModels: "Failed to load local models",
      hfCache: "HF cache",
      customFolders: "Custom Folders",
      localDir: "Local dir",
      huggingFaceModel: "Hugging Face Model",
      huggingFaceModelTooltip:
        "Search Hugging Face models or pick from our recommended list.",
      searchModels: "Search models...",
      searching: "Searching...",
      noModelsFound: "No models found",
      needsVram: "Needs ~{vram}GB VRAM (GPU: {gpu}GB)",
      tightVram: "~{vram}GB VRAM (tight fit on {gpu}GB)",
      vramEstimate: "~{vram}GB VRAM",
      method: "Method",
      methodTooltip:
        "QLoRA uses 4-bit quantization for lowest VRAM. LoRA uses 16-bit. Full updates all weights. CPT (Continued Pretraining) trains on raw text to adapt the model to a new domain without chat formatting.",
      readMore: "Read more",
      fullFineTune: "Full Fine-tune",
      checkingToken: "Checking token...",
      getOrUpdateToken: "Get or update token",
      huggingFaceTokenOptional: "Hugging Face Token (Optional)",
      continuedPretraining: "Continued Pretraining",
      localModels: "Local models",
      localModelsFound: "{count} local/cached models found",
      loadingLocalModels: "Loading local models...",
    },
    dataset: {
      title: "Dataset",
      description: "Select or upload training data",
      source: "Dataset source",
      chooseDataset: "Choose dataset",
      chooseDatasetTooltip:
        "Use the popup tabs to switch between Hugging Face and local recipe outputs.",
      localTab: "Local",
      searchHuggingFaceDatasets: "Search Hugging Face datasets...",
      searchLocalDatasets: "Search local datasets...",
      searching: "Searching...",
      noDatasetsFound: "No datasets found",
      loadingLocalDatasets: "Loading local datasets...",
      failedToLoadLocalDatasets: "Failed to load local datasets.",
      noLocalDatasetsYet: "No local datasets yet.",
      noLocalDatasetsMatchSearch: "No local datasets match search.",
      openDataRecipes: "Open Data Recipes",
      browsingSource: "Browsing {browsing}. Current selection stays {current}.",
      localDatasets: "Local datasets",
      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...",
      upload: "Upload",
      uploadEvalFile: "Upload eval file",
      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.",
      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 1 file here or click to upload",
      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.",
      checkingToken: "Checking token...",
      getOrUpdateToken: "Get or update token",
      preview: "Preview dataset",
      split: "Split",
      subset: "Subset",
      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/",
        prefixTooltip: "Optional path within the bucket to your dataset files",
        accessKeyId: "Access Key ID",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "Secret Access Key",
        secretAccessKeyPlaceholder: "Your AWS secret access key",
        useIamRole: "Use IAM Role",
        useIamRoleTooltip:
          "Use IAM role credentials instead of access keys (recommended for EC2/SageMaker)",
        testConnection: "Test Connection",
        connectionSuccess: "Successfully connected to S3 bucket",
        connectionFailed: "Failed to connect to S3 bucket",
        comingSoon: "S3 integration coming soon",
        comingSoonDescription:
          "S3 dataset loading requires boto3. This feature is under development.",
      },
    },
    params: {
      title: "Parameters",
      description: "Configure training hyperparameters",
      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.",
      epochsDescription: "Each epoch is one full pass over your dataset.",
      maxStepsDescription:
        "Limits training to a fixed number of optimizer steps.",
      contextLength: "Context Length",
      contextLengthTooltip: "Maximum number of tokens per training sample.",
      customContextLength: "Enter a custom value",
      contextLengthDescription: "Max sequence length for training samples",
      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.",
      embeddingLearningRateDescription:
        "Leave blank to use lr/10 (recommended). Typical range is 2x-10x smaller than the main learning rate.",
      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",
      optimization: "Optimization",
      schedule: "Schedule",
      memory: "Memory",
      optimizer: "Optimizer",
      optimizerTooltip:
        "Optimization algorithm. 8-bit variants reduce memory usage. Fused is recommended for vision models.",
      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: {
      title: "Training",
      description: "Monitor and control training",
      chartNoDataTitle: "No training data yet",
      chartNoDataDescription: "Start training to see loss progress",
      startTraining: "Start Training",
      starting: "Starting...",
      loadingModel: "Loading model...",
      checkingDataset: "Checking dataset...",
      configLabel: "Training Config",
      upload: "Upload",
      uploadConfigTooltip: "Load a saved YAML config",
      save: "Save",
      saveConfigTooltip: "Download current config as YAML",
      reset: "Reset",
      resetConfigTooltip: "Reset to model defaults",
      configLoaded: "Config loaded",
      failedToLoadConfig: "Failed to load config",
      invalidYamlFile: "Invalid YAML file",
      failedToReadFile: "Failed to read file",
      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.",
      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",
      emptyTitle: "No training runs yet",
      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.",
      runCount: "{count} runs",
      oneRun: "1 run",
      resume: "Resume",
      resumeTraining: "Resume training",
      resuming: "Resuming...",
      deleteRun: "Delete run",
      loss: "Loss",
      steps: "Steps",
      lossTrendSparkline: "Loss trend sparkline",
      relativeJustNow: "just now",
      relativeMinutesAgo: "{count}m ago",
      relativeHoursAgo: "{count}h ago",
      relativeDaysAgo: "{count}d ago",
      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",
      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",
        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",
    },
    tour: {
      guidedTour: "Guided Tour",
    },
  },
} as const;
