feat(i18n): Integrate next-intl, localize core UI, add regional locales and zh-TW Discover sources
**Overview** - Integrates next-intl (App Router, no i18n routing) with cookie-based locale and Accept-Language fallback. - Adds message bundles and regional variants; sets en-US as the default. **Key changes** - i18n foundation - Adds request-scoped config to load messages per locale and injects NextIntlClientProvider in [layout.tsx] - Adds/updates messages for: en-US, en-GB, zh-TW, zh-HK, zh-CN, ja, ko, fr-FR, fr-CA, de. Centralizes LOCALES, LOCALE_LABELS, and DEFAULT_LOCALE in [locales.ts] - Adds LocaleSwitcher (cookie-based) and [LocaleBootstrap] - Pages and components - Localizes Sidebar, Home (including metadata/manifest), Settings, Discover, Library. - Localizes common components: MessageInput, Attach, Focus, Optimization, MessageBox, MessageSources, SearchImages, SearchVideos, EmptyChat, NewsArticleWidget, WeatherWidget. - APIs - Weather API returns localized condition strings server-side. - UX and quality - Converts all remaining <img> to Next Image. - Updates browserslist/caniuse DB to silence warnings. - Security: Settings API Key inputs are now password fields and placeholders were removed.
This commit is contained in:
parent
0dc17286b9
commit
9a772d6abe
56 changed files with 3673 additions and 365 deletions
40
src/i18n/locales.ts
Normal file
40
src/i18n/locales.ts
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
export const LOCALES = [
|
||||
'en-US',
|
||||
'en-GB',
|
||||
'zh-TW',
|
||||
'zh-HK',
|
||||
'zh-CN',
|
||||
'ja',
|
||||
'ko',
|
||||
'fr-FR',
|
||||
'fr-CA',
|
||||
'de',
|
||||
] as const;
|
||||
export type AppLocale = (typeof LOCALES)[number];
|
||||
|
||||
// Default locale for fallbacks
|
||||
export const DEFAULT_LOCALE: AppLocale = 'en-US';
|
||||
|
||||
// UI labels for language options
|
||||
export const LOCALE_LABELS: Record<AppLocale, string> = {
|
||||
'en-US': 'English (US)',
|
||||
'en-GB': 'English (UK)',
|
||||
'zh-TW': '繁體中文',
|
||||
'zh-HK': '繁體中文(香港)',
|
||||
'zh-CN': '简体中文',
|
||||
ja: '日本語',
|
||||
ko: '한국어',
|
||||
'fr-FR': 'Français (France)',
|
||||
'fr-CA': 'Français (Canada)',
|
||||
de: 'Deutsch',
|
||||
};
|
||||
|
||||
// Human-readable language name for prompt prefix
|
||||
export function getPromptLanguageName(loc: string): string {
|
||||
const l = (loc || '').toLowerCase();
|
||||
const match = (
|
||||
Object.keys(LOCALE_LABELS) as Array<keyof typeof LOCALE_LABELS>
|
||||
).find((k) => k.toLowerCase() === l);
|
||||
if (match) return LOCALE_LABELS[match];
|
||||
return LOCALE_LABELS[DEFAULT_LOCALE];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue