Files
infiplot-web/lib/i18n/locales/vi.ts
T
DESKTOP-I1T6TF3\Q 2d35c1d9de feat(i18n): add language switcher with en/ja translations
- New client-side i18n via React Context (useI18n, tArray, I18nProvider)
- Catalog ships 21 locale stubs; only zh-CN/en/ja have reviewed translations
- Header language switcher (globe icon + short label) before settings gear
- All hardcoded Chinese UI text migrated to keys: typewriter, options,
  hints (with embedded gear icon via dangerouslySetInnerHTML), settings
  panel, footer/about, play page hints
- AI output language follows user-selected locale via trailing one-liner
  directive appended to Architect/Writer/CharacterDesigner/InsertBeat
  user messages (preserves system-prompt cacheability)
- Per-locale separator rule: zh uses middot between every glyph; en/ja
  use plain spaces
- Option value → i18n key suffix maps preserve Chinese as the underlying
  identifier so analytics unions and STYLE_MAP keys stay byte-stable

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-18 16:54:35 +08:00

90 lines
2.2 KiB
TypeScript

// Vietnamese
// Auto-generated by scripts/translate-i18n.mjs
export const vi = {
"layout": {
"metadata": {
"title": "InfiPlot",
"description": "InfiPlot"
}
},
"home": {
"examples": {
"male": [],
"female": [],
"x": []
},
"options": {
"gender": "",
"artStyle": "",
"plotStyle": "",
"voice": "",
"pacing": ""
},
"genders": {
"male": "",
"female": "",
"x": ""
},
"artStyles": {},
"plotStyles": {
"straightforward": "",
"twist": ""
},
"voiceOptions": {
"off": "",
"on": ""
},
"pacings": {
"fast": "",
"relaxed": ""
},
"stories": {},
"ui": {
"start": "",
"loadStory": "",
"settings": "",
"searchPlaceholder": "",
"noMatchingStyle": "",
"close": "",
"back": "",
"save": "",
"cancel": "",
"saveAndSelect": ""
},
"styleModal": {},
"hero": {
"title": "",
"placeholder": " ",
"enterHint": ""
},
"hint": {
"text": (params: { authEnabled?: boolean }) => {
const authHint = params.authEnabled ? ' (yêu cầu đăng nhập trong bản beta, chơi miễn phí)' : '';
return `Nhập ý tưởng của bạn, cấu hình kiểu và nhấp "Bắt đầu" để chơi${authHint}. Bạn cũng có thể chọn một câu chuyện được chọn từ bên dưới để trải nghiệm nhanh <em>InfiPlot</em>. Nhấp "Cài đặt" để nhập tên của bạn và cấu hình khóa văn bản, hình ảnh, hình ảnh và TTS của riêng bạn—tất cả được lưu cục bộ trong trình duyệt của bạn để có trải nghiệm ổn định hơn.`;
},
"closeAriaLabel": "Không còn hiển thị gợi ý này"
},
"about": {},
"errors": {
"emptyFile": "",
"fileTooLarge": "",
"unpackFailed": "",
"parseFailed": "",
"cardNotFound": ""
}
},
"play": {},
"settings": {},
"auth": {},
"history": {},
"customForm": {},
"language": {
"title": "",
"current": "",
"select": ""
}
} as const;
export type ViTranslations = typeof vi;