Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions packages/opencode/src/util/locale.ts
Original file line number Diff line number Diff line change
@@ -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}`
}

Expand Down
30 changes: 30 additions & 0 deletions packages/opencode/test/util/locale.test.ts
Original file line number Diff line number Diff line change
@@ -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)
})
})
Loading