/** * Language persistence for pi-mcp-market. * * Stores the user's language preference to * `/pi-mcp-market/language.json`. * * Auto-detection order: * 1. Saved language config file (explicit user choice persists) * 2. PI_MCP_MARKET_LANG env var override (for scripting) * 3. LANG env var — if starts with "zh", picks "zh", else "en" * 4. Default: "zh" */ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { getAgentDir } from "./config.ts"; import type { Lang } from "./i18n.ts"; interface LanguageConfig { language: Lang; } function getLanguageConfigPath(): string { return join(getAgentDir(), "pi-mcp-market", "language.json"); } /** Detect language without I/O — pure env + fallback. */ export function detectLanguage(): Lang { const fromEnv = process.env.PI_MCP_MARKET_LANG; if (fromEnv === "zh" || fromEnv === "en") return fromEnv; const systemLang = process.env.LANG ?? ""; if (systemLang.startsWith("zh")) return "zh"; return "en"; } /** Load persisted language; on missing/corrupt → auto-detect. */ export function loadLanguage(): Lang { const path = getLanguageConfigPath(); if (!existsSync(path)) return detectLanguage(); try { const raw = readFileSync(path, "utf8"); const parsed = JSON.parse(raw) as LanguageConfig; if (parsed.language === "zh" || parsed.language === "en") return parsed.language; return detectLanguage(); } catch { return detectLanguage(); } } /** Persist a language choice so it survives restarts. */ export function saveLanguage(lang: Lang): void { const path = getLanguageConfigPath(); const dir = join(getAgentDir(), "pi-mcp-market"); if (!existsSync(dir)) { mkdirSync(dir, { recursive: true }); } else { // dir already exists } writeFileSync(path, JSON.stringify({ language: lang } as LanguageConfig, null, 2) + "\n", "utf8"); }