diff --git a/web/src/components/LanguageSwitcher.tsx b/web/src/components/LanguageSwitcher.tsx
index dc477021ee83f..cf07b350d65f0 100644
--- a/web/src/components/LanguageSwitcher.tsx
+++ b/web/src/components/LanguageSwitcher.tsx
@@ -3,32 +3,37 @@ import { Typography } from "@/components/NouiTypography";
import { useI18n } from "@/i18n/context";
/**
- * Compact language toggle β shows a clickable flag that switches between
- * English and Chinese. Persists choice to localStorage.
+ * Compact language toggle β cycles between English, Chinese, and Korean.
+ * Persists choice to localStorage.
*/
export function LanguageSwitcher() {
const { locale, setLocale, t } = useI18n();
- const toggle = () => setLocale(locale === "en" ? "zh" : "en");
+ const cycle = () => {
+ if (locale === "en") setLocale("zh");
+ else if (locale === "zh") setLocale("ko");
+ else setLocale("en");
+ };
+
+ const flag = locale === "en" ? "π¬π§" : locale === "zh" ? "π¨π³" : "π°π·";
+ const label = locale === "en" ? "EN" : locale === "zh" ? "δΈζ" : "νκ΅μ΄";
return (
diff --git a/web/src/i18n/context.tsx b/web/src/i18n/context.tsx
index 6fc6f6e56a05d..7c242a546539f 100644
--- a/web/src/i18n/context.tsx
+++ b/web/src/i18n/context.tsx
@@ -2,14 +2,15 @@ import { createContext, useContext, useState, useCallback, type ReactNode } from
import type { Locale, Translations } from "./types";
import { en } from "./en";
import { zh } from "./zh";
+import { ko } from "./ko";
-const TRANSLATIONS: Record = { en, zh };
+const TRANSLATIONS: Record = { en, zh, ko };
const STORAGE_KEY = "hermes-locale";
function getInitialLocale(): Locale {
try {
const stored = localStorage.getItem(STORAGE_KEY);
- if (stored === "en" || stored === "zh") return stored;
+ if (stored === "en" || stored === "zh" || stored === "ko") return stored;
} catch {
// SSR or privacy mode
}
diff --git a/web/src/i18n/ko.ts b/web/src/i18n/ko.ts
new file mode 100644
index 0000000000000..f1696840ed286
--- /dev/null
+++ b/web/src/i18n/ko.ts
@@ -0,0 +1,429 @@
+import type { Translations } from "./types";
+
+export const ko: Translations = {
+ common: {
+ save: "μ μ₯",
+ saving: "μ μ₯ μ€...",
+ cancel: "μ·¨μ",
+ close: "λ«κΈ°",
+ confirm: "νμΈ",
+ delete: "μμ ",
+ refresh: "μλ‘κ³ μΉ¨",
+ retry: "λ€μ μλ",
+ search: "κ²μ...",
+ loading: "λΆλ¬μ€λ μ€...",
+ create: "μμ±",
+ creating: "μμ± μ€...",
+ set: "μ€μ ",
+ replace: "κ΅μ²΄",
+ clear: "μ΄κΈ°ν",
+ live: "μ€μκ°",
+ off: "κΊΌμ§",
+ enabled: "νμ±νλ¨",
+ disabled: "λΉνμ±νλ¨",
+ active: "νμ±",
+ inactive: "λΉνμ±",
+ unknown: "μ μ μμ",
+ untitled: "μ λͺ© μμ",
+ none: "μμ",
+ form: "νΌ",
+ noResults: "κ²°κ³Ό μμ",
+ of: "/",
+ page: "νμ΄μ§",
+ msgs: "λ©μμ§",
+ tools: "λꡬ",
+ match: "μΌμΉ",
+ other: "κΈ°ν",
+ configured: "μ€μ λ¨",
+ removed: "μ κ±°λ¨",
+ failedToToggle: "μ ν μ€ν¨",
+ failedToRemove: "μ κ±° μ€ν¨",
+ failedToReveal: "νμ μ€ν¨",
+ collapse: "μ κΈ°",
+ expand: "νΌμΉκΈ°",
+ general: "μΌλ°",
+ messaging: "λ©μμ§",
+ pluginLoadFailed:
+ "νλ¬κ·ΈμΈ μ€ν¬λ¦½νΈλ₯Ό λΆλ¬μ¬ μ μμ΅λλ€. Network ν(dashboard-plugins/β¦)κ³Ό μλ²μ νλ¬κ·ΈμΈ κ²½λ‘λ₯Ό νμΈνμΈμ.",
+ pluginNotRegistered:
+ "νλ¬κ·ΈμΈ μ€ν¬λ¦½νΈκ° register()λ₯Ό νΈμΆνμ§ μμκ±°λ μ€λ₯κ° λ°μνμ΅λλ€. λΈλΌμ°μ μ½μμ νμΈνμΈμ.",
+ },
+
+ app: {
+ brand: "Hermes Agent",
+ brandShort: "HA",
+ closeNavigation: "λ΄λΉκ²μ΄μ
λ«κΈ°",
+ closeModelTools: "λͺ¨λΈ λ° λꡬ λ«κΈ°",
+ footer: {
+ org: "Nous Research",
+ },
+ activeSessionsLabel: "νμ± μΈμ
:",
+ gatewayStatusLabel: "κ²μ΄νΈμ¨μ΄ μν:",
+ gatewayStrip: {
+ failed: "μμ μ€ν¨",
+ off: "κΊΌμ§",
+ running: "μ€ν μ€",
+ starting: "μμ μ€",
+ stopped: "μ€μ§λ¨",
+ },
+ nav: {
+ analytics: "λΆμ",
+ chat: "μ±ν
",
+ config: "μ€μ ",
+ cron: "μ€μΌμ€",
+ documentation: "λ¬Έμ",
+ keys: "API ν€",
+ logs: "λ‘κ·Έ",
+ models: "λͺ¨λΈ",
+ profiles: "νλ‘ν : λ©ν° μμ΄μ νΈ",
+ plugins: "νλ¬κ·ΈμΈ",
+ sessions: "μΈμ
",
+ skills: "μ€ν¬",
+ },
+ modelToolsSheetSubtitle: "& λꡬ",
+ modelToolsSheetTitle: "λͺ¨λΈ",
+ navigation: "λ΄λΉκ²μ΄μ
",
+ openDocumentation: "μ νμμ λ¬Έμ μ΄κΈ°",
+ openNavigation: "λ΄λΉκ²μ΄μ
μ΄κΈ°",
+ pluginNavSection: "νλ¬κ·ΈμΈ",
+ sessionsActiveCount: "{count}κ° νμ±",
+ statusOverview: "μν κ°μ",
+ system: "μμ€ν
",
+ webUi: "Web UI",
+ },
+
+ status: {
+ actionFailed: "μ‘μ
μ€ν¨",
+ actionFinished: "μλ£",
+ actions: "μ‘μ
",
+ agent: "μμ΄μ νΈ",
+ activeSessions: "νμ± μΈμ
",
+ connected: "μ°κ²°λ¨",
+ connectedPlatforms: "μ°κ²°λ νλ«νΌ",
+ disconnected: "μ°κ²° λκΉ",
+ error: "μ€λ₯",
+ failed: "μ€ν¨",
+ gateway: "κ²μ΄νΈμ¨μ΄",
+ gatewayFailedToStart: "κ²μ΄νΈμ¨μ΄ μμ μ€ν¨",
+ lastUpdate: "λ§μ§λ§ μ
λ°μ΄νΈ",
+ noneRunning: "μμ",
+ notRunning: "μ€ν μ€ μλ",
+ pid: "PID",
+ platformDisconnected: "μ°κ²° λκΉ",
+ platformError: "μ€λ₯",
+ recentSessions: "μ΅κ·Ό μΈμ
",
+ restartGateway: "κ²μ΄νΈμ¨μ΄ μ¬μμ",
+ restartingGateway: "κ²μ΄νΈμ¨μ΄ μ¬μμ μ€β¦",
+ running: "μ€ν μ€",
+ runningRemote: "μ격 μ€ν μ€",
+ startFailed: "μμ μ€ν¨",
+ starting: "μμ μ€",
+ startedInBackground: "λ°±κ·ΈλΌμ΄λμμ μμλ¨ β μ§ν μν©μ λ‘κ·Έλ₯Ό νμΈνμΈμ",
+ stopped: "μ€μ§λ¨",
+ updateHermes: "Hermes μ
λ°μ΄νΈ",
+ updatingHermes: "Hermes μ
λ°μ΄νΈ μ€β¦",
+ waitingForOutput: "μΆλ ₯ λκΈ° μ€β¦",
+ },
+
+ sessions: {
+ title: "μΈμ
",
+ searchPlaceholder: "λ©μμ§ λ΄μ© κ²μ...",
+ noSessions: "μΈμ
μ΄ μμ΅λλ€",
+ noMatch: "κ²μ κ²°κ³Όκ° μμ΅λλ€",
+ startConversation: "λνλ₯Ό μμνλ©΄ μ¬κΈ°μ νμλ©λλ€",
+ noMessages: "λ©μμ§ μμ",
+ untitledSession: "μ λͺ© μλ μΈμ
",
+ deleteSession: "μΈμ
μμ ",
+ confirmDeleteTitle: "μΈμ
μ μμ νμκ² μ΅λκΉ?",
+ confirmDeleteMessage:
+ "μ΄ λνμ λͺ¨λ λ©μμ§κ° μꡬμ μΌλ‘ μμ λ©λλ€. μ΄ μμ
μ λλ릴 μ μμ΅λλ€.",
+ sessionDeleted: "μΈμ
μ΄ μμ λμμ΅λλ€",
+ failedToDelete: "μΈμ
μμ μ€ν¨",
+ resumeInChat: "μ±ν
μμ μ΄μ΄λ³΄κΈ°",
+ previousPage: "μ΄μ νμ΄μ§",
+ nextPage: "λ€μ νμ΄μ§",
+ roles: {
+ user: "μ¬μ©μ",
+ assistant: "μ΄μμ€ν΄νΈ",
+ system: "μμ€ν
",
+ tool: "λꡬ",
+ },
+ },
+
+ analytics: {
+ period: "κΈ°κ°:",
+ totalTokens: "μ΄ ν ν°",
+ totalSessions: "μ΄ μΈμ
",
+ apiCalls: "API νΈμΆ",
+ dailyTokenUsage: "μΌλ³ ν ν° μ¬μ©λ",
+ dailyBreakdown: "μΌλ³ μΈλΆ λ΄μ",
+ perModelBreakdown: "λͺ¨λΈλ³ μΈλΆ λ΄μ",
+ topSkills: "μμ μ€ν¬",
+ skill: "μ€ν¬",
+ loads: "μμ΄μ νΈ λ‘λ",
+ edits: "μμ΄μ νΈ κ΄λ¦¬",
+ lastUsed: "λ§μ§λ§ μ¬μ©",
+ input: "μ
λ ₯",
+ output: "μΆλ ₯",
+ total: "ν©κ³",
+ noUsageData: "ν΄λΉ κΈ°κ°μ μ¬μ© λ°μ΄ν°κ° μμ΅λλ€",
+ startSession: "μΈμ
μ μμνλ©΄ λΆμ λ°μ΄ν°κ° νμλ©λλ€",
+ date: "λ μ§",
+ model: "λͺ¨λΈ",
+ tokens: "ν ν°",
+ perDayAvg: "/μΌ νκ· ",
+ acrossModels: "{count}κ° λͺ¨λΈ μ¬μ©",
+ inOut: "μ
λ ₯ {input} / μΆλ ₯ {output}",
+ },
+
+ models: {
+ modelsUsed: "μ¬μ©ν λͺ¨λΈ",
+ estimatedCost: "μμ λΉμ©",
+ tokens: "ν ν°",
+ sessions: "μΈμ
",
+ avgPerSession: "μΈμ
νκ· ",
+ apiCalls: "API νΈμΆ",
+ toolCalls: "λꡬ νΈμΆ",
+ noModelsData: "ν΄λΉ κΈ°κ°μ λͺ¨λΈ μ¬μ© λ°μ΄ν°κ° μμ΅λλ€",
+ startSession: "μΈμ
μ μμνλ©΄ λͺ¨λΈ λ°μ΄ν°κ° νμλ©λλ€",
+ },
+
+ logs: {
+ title: "λ‘κ·Έ",
+ autoRefresh: "μλ μλ‘κ³ μΉ¨",
+ file: "νμΌ",
+ level: "λ 벨",
+ component: "μ»΄ν¬λνΈ",
+ lines: "μ€",
+ noLogLines: "λ‘κ·Έκ° μμ΅λλ€",
+ },
+
+ cron: {
+ confirmDeleteMessage:
+ "μ΄ μμ
μ μ€μΌμ€μμ μ κ±°ν©λλ€. μ΄ μμ
μ λλ릴 μ μμ΅λλ€.",
+ confirmDeleteTitle: "μ€μΌμ€ μμ
μ μμ νμκ² μ΅λκΉ?",
+ newJob: "μ ν¬λ‘ μμ
",
+ nameOptional: "μ΄λ¦ (μ ν)",
+ namePlaceholder: "μ: μΌμΌ μμ½",
+ prompt: "ν둬ννΈ",
+ promptPlaceholder: "κ° μ€ν μ μμ΄μ νΈκ° ν μμ
μ μ
λ ₯νμΈμ",
+ schedule: "μ€μΌμ€ (ν¬λ‘ ννμ)",
+ schedulePlaceholder: "0 9 * * *",
+ deliverTo: "μ λ¬ λμ",
+ scheduledJobs: "μ€μΌμ€λ μμ
",
+ noJobs: "ν¬λ‘ μμ
μ΄ μμ΅λλ€. μμμ μμ±νμΈμ.",
+ last: "λ§μ§λ§",
+ next: "λ€μ",
+ pause: "μΌμμ μ§",
+ resume: "μ¬κ°",
+ triggerNow: "μ¦μ μ€ν",
+ delivery: {
+ local: "λ‘컬",
+ telegram: "ν
λ κ·Έλ¨",
+ discord: "λμ€μ½λ",
+ slack: "μ¬λ",
+ email: "μ΄λ©μΌ",
+ },
+ },
+
+ profiles: {
+ newProfile: "μ νλ‘ν",
+ name: "μ΄λ¦",
+ namePlaceholder: "μ: coder, writer λ±",
+ nameRequired: "μ΄λ¦μ νμμ
λλ€",
+ nameRule:
+ "μλ¬Έμ, μ«μ, _ λ° -λ§ μ¬μ© κ°λ₯ν©λλ€. λ¬Έμ λλ μ«μλ‘ μμν΄μΌ νλ©° μ΅λ 64μμ
λλ€.",
+ invalidName: "μλͺ»λ νλ‘ν μ΄λ¦",
+ cloneFromDefault: "κΈ°λ³Έ νλ‘νμμ μ€μ 볡μ ",
+ allProfiles: "νλ‘ν",
+ noProfiles: "νλ‘νμ΄ μμ΅λλ€.",
+ defaultBadge: "κΈ°λ³Έ",
+ hasEnv: "env",
+ model: "λͺ¨λΈ",
+ skills: "μ€ν¬",
+ rename: "μ΄λ¦ λ³κ²½",
+ editSoul: "SOUL.md νΈμ§",
+ soulSection: "SOUL.md (νλ₯΄μλ / μμ€ν
ν둬ννΈ)",
+ soulPlaceholder: "# μ΄ μμ΄μ νΈμ λμ λ°©μβ¦",
+ saveSoul: "SOUL μ μ₯",
+ soulSaved: "SOUL.md μ μ₯λ¨",
+ openInTerminal: "CLI λͺ
λ Ή 볡μ¬",
+ commandCopied: "ν΄λ¦½λ³΄λμ 볡μ¬λ¨",
+ copyFailed: "λ³΅μ¬ μ€ν¨",
+ confirmDeleteTitle: "νλ‘νμ μμ νμκ² μ΅λκΉ?",
+ confirmDeleteMessage:
+ "νλ‘ν '{name}'μ μ€μ , ν€, λ©λͺ¨λ¦¬, μΈμ
, μ€ν¬, ν¬λ‘ μμ
μ΄ μꡬμ μΌλ‘ μμ λ©λλ€. λλ릴 μ μμ΅λλ€.",
+ created: "μμ±λ¨",
+ deleted: "μμ λ¨",
+ renamed: "μ΄λ¦ λ³κ²½λ¨",
+ },
+
+ pluginsPage: {
+ contextEngineLabel: "컨ν
μ€νΈ μμ§",
+ dashboardSlots: "λμ보λ μ¬λ‘―",
+ disableRuntime: "λΉνμ±ν",
+ enableAfterInstall: "μ€μΉ ν νμ±ν",
+ enableRuntime: "νμ±ν",
+ forceReinstall: "κ°μ μ¬μ€μΉ (κΈ°μ‘΄ ν΄λ μμ ν)",
+ headline:
+ "Hermes νλ¬κ·ΈμΈμ κ²μ, μ€μΉ, νμ±ν λ° μ
λ°μ΄νΈν©λλ€ (`hermes plugins` λμΌ).",
+ identifierLabel: "Git URL λλ owner/repo",
+ inactive: "λΉνμ±",
+ installBtn: "Gitμμ μ€μΉ",
+ installHeading: "GitHub / Git URLμμ μ€μΉ",
+ installHint: "owner/repo λ¨μΆν λλ https:// λλ git@ ν΄λ‘ URLμ μ¬μ©νμΈμ.",
+ memoryProviderLabel: "λ©λͺ¨λ¦¬ νλ‘λ°μ΄λ",
+ missingEnvWarn: "νλ¬κ·ΈμΈ μ€ν μ Keysμμ μ€μ νμΈμ:",
+ noDashboardTab: "λμ보λ ν μμ",
+ openTab: "μ΄κΈ°",
+ orphanHeading: "λμ보λ μ μ© νμ₯ (μμ΄μ νΈ plugin.yaml μμ)",
+ pluginListHeading: "μ€μΉλ νλ¬κ·ΈμΈ",
+ providerDefaults: "κΈ°λ³Έ λ΄μ₯",
+ providersHeading: "λ°νμ νλ‘λ°μ΄λ νλ¬κ·ΈμΈ",
+ providersHint:
+ "memory.provider (λΉμ΄μμΌλ©΄ λ΄μ₯)μ context.engineμ config.yamlμ μλλ€. λ€μ μΈμ
λΆν° μ μ©λ©λλ€.",
+ refreshDashboard: "λμ보λ νμ₯ μ¬μ€μΊ",
+ removeConfirm: "~/.hermes/plugins/μμ μ΄ νλ¬κ·ΈμΈμ μ κ±°νμκ² μ΅λκΉ?",
+ removeHint: "~/.hermes/plugins/ μλ μ¬μ©μ μ€μΉ νλ¬κ·ΈμΈλ§ μ κ±°ν μ μμ΅λλ€.",
+ rescanHeading: "SPA νλ¬κ·ΈμΈ λ μ§μ€νΈλ¦¬",
+ rescanHint: "λμ€ν¬μ νμΌ μΆκ° ν μ¬μ€μΊνλ©΄ μ¬μ΄λλ°μ μ λ§€λνμ€νΈκ° νμλ©λλ€.",
+ runtimeHeading: "κ²μ΄νΈμ¨μ΄ λ°νμ (YAML νλ¬κ·ΈμΈ)",
+ saveProviders: "νλ‘λ°μ΄λ μ€μ μ μ₯",
+ savedProviders: "νλ‘λ°μ΄λ μ€μ μ΄ μ μ₯λμμ΅λλ€.",
+ sourceBadge: "μμ€",
+ authRequired: "μΈμ¦ νμ",
+ authRequiredHint: "μΈμ¦νλ €λ©΄ λ€μ λͺ
λ Ήμ μ€ννμΈμ:",
+ updateGit: "Git pull",
+ versionBadge: "λ²μ ",
+ showInSidebar: "μ¬μ΄λλ°μ νμ",
+ hideFromSidebar: "μ¬μ΄λλ°μμ μ¨κΈ°κΈ°",
+ },
+
+ skills: {
+ title: "μ€ν¬",
+ searchPlaceholder: "μ€ν¬ λ° ν΄μ
κ²μ...",
+ enabledOf: "{enabled}/{total} νμ±ν",
+ all: "μ 체",
+ categories: "μΉ΄ν
κ³ λ¦¬",
+ filters: "νν°",
+ noSkills: "μ€ν¬μ΄ μμ΅λλ€. μ€ν¬μ ~/.hermes/skills/μμ λΆλ¬μ΅λλ€",
+ noSkillsMatch: "κ²μ λλ νν°μ λ§λ μ€ν¬μ΄ μμ΅λλ€.",
+ skillCount: "{count}κ° μ€ν¬",
+ resultCount: "{count}κ° κ²°κ³Ό",
+ noDescription: "μ€λͺ
μ΄ μμ΅λλ€.",
+ toolsets: "ν΄μ
",
+ toolsetLabel: "{name} ν΄μ
",
+ noToolsetsMatch: "κ²μμ λ§λ ν΄μ
μ΄ μμ΅λλ€.",
+ setupNeeded: "μ€μ νμ",
+ disabledForCli: "CLIμμ λΉνμ±νλ¨",
+ more: "+{count}κ° λ",
+ },
+
+ config: {
+ configPath: "~/.hermes/config.yaml",
+ filters: "νν°",
+ sections: "μΉμ
",
+ exportConfig: "μ€μ μ JSONμΌλ‘ λ΄λ³΄λ΄κΈ°",
+ importConfig: "JSONμμ μ€μ κ°μ Έμ€κΈ°",
+ resetDefaults: "κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ν",
+ resetScopeTooltip: "{scope} κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ν",
+ confirmResetScope: "{scope} μ€μ μ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννμκ² μ΅λκΉ? νΌλ§ μ
λ°μ΄νΈλλ©° μ μ₯μ λλ¬μΌ config.yamlμ λ°μλ©λλ€.",
+ resetScopeToast: "{scope} κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°νλ¨ β νμΈ ν μ μ₯νμΈμ",
+ rawYaml: "YAML μ€μ μλ¬Έ",
+ searchResults: "κ²μ κ²°κ³Ό",
+ fields: "νλ",
+ noFieldsMatch: '"{query}"μ λ§λ νλκ° μμ΅λλ€',
+ configSaved: "μ€μ μ΄ μ μ₯λμμ΅λλ€",
+ yamlConfigSaved: "YAML μ€μ μ΄ μ μ₯λμμ΅λλ€",
+ failedToSave: "μ μ₯ μ€ν¨",
+ failedToSaveYaml: "YAML μ μ₯ μ€ν¨",
+ failedToLoadRaw: "μ€μ μλ¬Έ λΆλ¬μ€κΈ° μ€ν¨",
+ configImported: "μ€μ κ°μ Έμ΄ β νμΈ ν μ μ₯νμΈμ",
+ invalidJson: "μλͺ»λ JSON νμΌ",
+ categories: {
+ general: "μΌλ°",
+ agent: "μμ΄μ νΈ",
+ terminal: "ν°λ―Έλ",
+ display: "νλ©΄",
+ delegation: "μμ",
+ memory: "λ©λͺ¨λ¦¬",
+ compression: "μμΆ",
+ security: "보μ",
+ browser: "λΈλΌμ°μ ",
+ voice: "μμ±",
+ tts: "ν
μ€νΈ μμ± λ³ν",
+ stt: "μμ± ν
μ€νΈ λ³ν",
+ logging: "λ‘κΉ
",
+ discord: "λμ€μ½λ",
+ auxiliary: "보쑰",
+ },
+ },
+
+ env: {
+ changesNote: "λ³κ²½μ¬νμ μ¦μ μ μ₯λ©λλ€. νμ± μΈμ
μ μ ν€λ₯Ό μλμΌλ‘ λ°μν©λλ€.",
+ confirmClearMessage:
+ "μ΄ λ³μμ μ μ₯λ κ°μ΄ .env νμΌμμ μ κ±°λ©λλ€. UIμμλ λλ릴 μ μμ΅λλ€.",
+ confirmClearTitle: "μ΄ ν€λ₯Ό μ΄κΈ°ννμκ² μ΅λκΉ?",
+ description: "API ν€ λ° μν¬λ¦Ώ κ΄λ¦¬:",
+ hideAdvanced: "κ³ κΈ μ¨κΈ°κΈ°",
+ showAdvanced: "κ³ κΈ νμ",
+ llmProviders: "LLM νλ‘λ°μ΄λ",
+ providersConfigured: "{total}κ° μ€ {configured}κ° μ€μ λ¨",
+ getKey: "ν€ λ°κΈ",
+ notConfigured: "{count}κ° λ―Έμ€μ ",
+ notSet: "μ€μ λμ§ μμ",
+ keysCount: "{count}κ° ν€",
+ enterValue: "κ° μ
λ ₯...",
+ replaceCurrentValue: "νμ¬ κ° κ΅μ²΄ ({preview})",
+ showValue: "μ€μ κ° νμ",
+ hideValue: "κ° μ¨κΈ°κΈ°",
+ },
+
+ oauth: {
+ title: "νλ‘λ°μ΄λ λ‘κ·ΈμΈ (OAuth)",
+ providerLogins: "νλ‘λ°μ΄λ λ‘κ·ΈμΈ (OAuth)",
+ description: "{total}κ° μ€ {connected}κ° OAuth νλ‘λ°μ΄λ μ°κ²°λ¨. λ‘κ·ΈμΈμ CLIλ₯Ό ν΅ν΄ μ§νλ©λλ€. λͺ
λ Ή λ³΅μ¬ ν ν°λ―Έλμ λΆμ¬λ£μΌμΈμ.",
+ connected: "μ°κ²°λ¨",
+ expired: "λ§λ£λ¨",
+ notConnected: "μ°κ²°λμ§ μμ. ν°λ―Έλμμ {command}λ₯Ό μ€ννμΈμ.",
+ runInTerminal: "ν°λ―Έλμμ μ€ν",
+ noProviders: "OAuth μ§μ νλ‘λ°μ΄λκ° μμ΅λλ€.",
+ login: "λ‘κ·ΈμΈ",
+ disconnect: "μ°κ²° λκΈ°",
+ managedExternally: "μΈλΆμμ κ΄λ¦¬λ¨",
+ copied: "볡μ¬λ¨ β",
+ cli: "CLI",
+ copyCliCommand: "CLI λͺ
λ Ή λ³΅μ¬ (μΈλΆ/λ체μ©)",
+ connect: "μ°κ²°",
+ sessionExpires: "{time} ν λ§λ£",
+ initiatingLogin: "λ‘κ·ΈμΈ μ§ν μ€β¦",
+ exchangingCode: "ν ν°μΌλ‘ μ½λ κ΅ν μ€β¦",
+ connectedClosing: "μ°κ²°λ¨! λ«λ μ€β¦",
+ loginFailed: "λ‘κ·ΈμΈ μ€ν¨.",
+ sessionExpired: "μΈμ
μ΄ λ§λ£λμμ΅λλ€. λ€μ μλλ₯Ό ν΄λ¦νμΈμ.",
+ reOpenAuth: "μΈμ¦ νμ΄μ§ λ€μ μ΄κΈ°",
+ reOpenVerification: "μΈμ¦ νμΈ νμ΄μ§ λ€μ μ΄κΈ°",
+ submitCode: "μ½λ μ μΆ",
+ pasteCode: "μΈμ¦ μ½λ λΆμ¬λ£κΈ° (#state μ λ―Έμ¬ ν¬ν¨ κ°λ₯)",
+ waitingAuth: "λΈλΌμ°μ μμ μΈμ¦ λκΈ° μ€β¦",
+ enterCodePrompt: "μ νμ΄ μ΄λ Έμ΅λλ€. μμ² μ μ΄ μ½λλ₯Ό μ
λ ₯νμΈμ:",
+ pkceStep1: "claude.aiλ‘ μ νμ΄ μ΄λ Έμ΅λλ€. λ‘κ·ΈμΈ ν μΉμΈμ ν΄λ¦νμΈμ.",
+ pkceStep2: "μΉμΈ ν νμλ μΈμ¦ μ½λλ₯Ό 볡μ¬νμΈμ.",
+ pkceStep3: "μλμ λΆμ¬λ£κ³ μ μΆνμΈμ.",
+ flowLabels: {
+ pkce: "λΈλΌμ°μ λ‘κ·ΈμΈ (PKCE)",
+ device_code: "λλ°μ΄μ€ μ½λ",
+ external: "μΈλΆ CLI",
+ },
+ expiresIn: "{time} ν λ§λ£",
+ },
+
+ language: {
+ switchTo: "νκ΅μ΄λ‘ μ ν",
+ },
+
+ theme: {
+ title: "ν
λ§",
+ switchTheme: "ν
λ§ λ³κ²½",
+ },
+};
diff --git a/web/src/i18n/types.ts b/web/src/i18n/types.ts
index d93260d26d704..a595b11fe18d4 100644
--- a/web/src/i18n/types.ts
+++ b/web/src/i18n/types.ts
@@ -1,4 +1,4 @@
-export type Locale = "en" | "zh";
+export type Locale = "en" | "zh" | "ko";
export interface Translations {
// ββ Common ββ