feat: i18n — EN/MS/ZH translations with cookie-based locale switching, report form translated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FFDuBhMKvoWjrWT3ZnGmmr
This commit is contained in:
2026-07-11 19:01:44 +08:00
co-authored by Claude Sonnet 4.6
parent c67c489ab3
commit 87264a5497
12 changed files with 372 additions and 52 deletions
+20
View File
@@ -0,0 +1,20 @@
import { cookies } from 'next/headers'
import { SUPPORTED_LOCALES, type Locale } from './locales'
import type { Messages } from './context'
export async function getLocale(): Promise<Locale> {
const cookieStore = await cookies()
const lang = cookieStore.get('locale')?.value
if (lang && (SUPPORTED_LOCALES as readonly string[]).includes(lang)) {
return lang as Locale
}
return 'en'
}
export async function loadMessages(locale: Locale): Promise<Messages> {
switch (locale) {
case 'ms': return (await import('../../messages/ms.json')).default as Messages
case 'zh': return (await import('../../messages/zh.json')).default as Messages
default: return (await import('../../messages/en.json')).default as Messages
}
}