diff --git a/packages/opencode/src/util/locale.ts b/packages/opencode/src/util/locale.ts index ec900b441679..0ff22cd320b2 100644 --- a/packages/opencode/src/util/locale.ts +++ b/packages/opencode/src/util/locale.ts @@ -1,16 +1,24 @@ +function systemLocale(): string | undefined { + const raw = process.env.LC_ALL || process.env.LC_TIME || process.env.LANG + if (!raw) return undefined + const base = raw.split(".")[0] + if (base === "C" || base === "POSIX") return undefined + return base.replace("_", "-") +} + export function titlecase(str: string) { return str.replace(/\b\w/g, (c) => c.toUpperCase()) } export function time(input: number): string { const date = new Date(input) - return date.toLocaleTimeString(undefined, { timeStyle: "short" }) + return date.toLocaleTimeString(systemLocale(), { timeStyle: "short" }) } export function datetime(input: number): string { const date = new Date(input) const localTime = time(input) - const localDate = date.toLocaleDateString() + const localDate = date.toLocaleDateString(systemLocale()) return `${localTime} ยท ${localDate}` } diff --git a/packages/opencode/test/util/locale.test.ts b/packages/opencode/test/util/locale.test.ts new file mode 100644 index 000000000000..49b560d24a5e --- /dev/null +++ b/packages/opencode/test/util/locale.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, test } from "bun:test" +import { time } from "@/util/locale" + +describe("locale", () => { + const originalEnv = { ...process.env } + + test("respects LC_TIME for 24-hour locale", () => { + process.env.LC_TIME = "da_DK.UTF-8" + const result = time(Date.now()) + expect(result).not.toMatch(/AM|PM/i) + }) + + test("respects LC_TIME for 12-hour locale", () => { + process.env.LC_TIME = "en_US.UTF-8" + const result = time(Date.now()) + expect(result).toMatch(/AM|PM/i) + }) + + test("does not crash when no locale env vars set", () => { + delete process.env.LC_ALL + delete process.env.LC_TIME + delete process.env.LANG + const result = time(Date.now()) + expect(typeof result).toBe("string") + expect(result.length).toBeGreaterThan(0) + + // Restore original env + Object.assign(process.env, originalEnv) + }) +})