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>
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
// Hindi
|
||||
// Auto-generated by scripts/translate-i18n.mjs
|
||||
|
||||
export const hi = {
|
||||
"layout": {
|
||||
"metadata": {
|
||||
"title": "InfiPlot — AI रीयल-टाइम इंटरैक्टिव स्टोरी गेम",
|
||||
"description": "InfiPlot एक इंटरैक्टिव स्टोरी गेम है जो AI का उपयोग करके रीयल-टाइम में सामग्री उत्पन्न करता है।"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"examples": {
|
||||
"male": [
|
||||
"बचपन की सहेली ने अचानक शर्माते हुए मुझसे प्यार का इज़हार किया",
|
||||
"एक नींद के बाद जागने पर लगा कि कक्षा की सभी लड़कियां चुपके से मुझसे प्यार करने लगी हैं",
|
||||
"तीन साल की अवधि समाप्त, अब पता चला मैं एक अमीर परिवार का बेटा हूं, बदला लेने का समय आ गया है",
|
||||
"मैं अनंत टोकन लेकर इंटरनेट के जन्म से ठीक पहले वापस आ गया हूं..."
|
||||
],
|
||||
"female": [
|
||||
"जनरल के घर की बेकार बेटी में बदल गई, लेकिन ठंडे राजकुमार ने केवल मुझे चाहा",
|
||||
"संबंध-विच्छेद से एक रात पहले वापस आ गई, इस बार मैंने पहले हाथ उठाए",
|
||||
"एक खेल में खलनायिका की बेटी बन गई, सभी मृत्यु अंत से बचना है"
|
||||
],
|
||||
"x": [
|
||||
"समय-स्थान विदर में खुल गया, कई समानांतर दुनिया के स्वयं अचानक सामने आ गए",
|
||||
"स्मृति महल में, वे भूले हुए टुकड़े नई कहानी में पुनर्गठित हो रहे हैं",
|
||||
"एक अनंत खेल शुरू हो गया, सभी के पास एक अनूठा मौका है",
|
||||
"सिस्टम संकेत: आपकी पसंद पूरे ब्रह्मांड के भाग्य को निर्धारित करेगी"
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"gender": "लिंग झुकाव",
|
||||
"artStyle": "कला शैली",
|
||||
"plotStyle": "कथा शैली",
|
||||
"voice": "आवाज डबिंग",
|
||||
"pacing": "गति"
|
||||
},
|
||||
"genders": {
|
||||
"male": "पुरुष-ओरिएंटेड",
|
||||
"female": "महिला-ओरिएंटेड",
|
||||
"x": "X"
|
||||
},
|
||||
"artStyles": {
|
||||
"auto": "स्वचालित",
|
||||
"custom": "कस्टम शैली",
|
||||
"kyoani": "क्योटो एनीमेशन",
|
||||
"shinkai": "माकोतो शिंकाई",
|
||||
"ghibli": "घिबली स्टूडियो",
|
||||
"3d": "3D एनीमेशन",
|
||||
"cyberpunk": "साइबरपंक",
|
||||
"gothic": "गॉथिक",
|
||||
"wasteland": "बंजर भूमि",
|
||||
"pixel": "पिक्सेल आर्ट",
|
||||
"realistic": "यथार्थवादी",
|
||||
"oil": "शास्त्रीय तेल चित्र",
|
||||
"monet": "क्लाउद मोने",
|
||||
"watercolor": "जल रंग",
|
||||
"ink": "स्याही चित्र",
|
||||
"ukiyoe": "उकियो-ए",
|
||||
"pencil": "रंगीन पेंसिल",
|
||||
"sketch": "हाथ से बनाया गया स्केच",
|
||||
"manga": "श्वेत-श्याम मंगा",
|
||||
"children": "बाल साहित्य",
|
||||
"crayon": "बच्चों की क्रेयन चित्र",
|
||||
"clay": "मिट्टी की कला",
|
||||
"dunhuang": "दुनहुआंग दीवार चित्र",
|
||||
"miniature": "लघु चित्र",
|
||||
"mosaic": "मोज़ेक",
|
||||
"stainedGlass": "दाग़ीन कांच",
|
||||
"vaporwave": "वेपरवेव",
|
||||
"vector": "वेक्टर चित्र",
|
||||
"lowpoly": "कम पोलीगॉन",
|
||||
"popart": "पॉप आर्ट",
|
||||
"glitch": "ग्लिच आर्ट",
|
||||
"papercut": "कागज़ काटना कला",
|
||||
"steampunk": "स्टीमपंक",
|
||||
"xianxia": "सियानशिया",
|
||||
"darkFairytale": "अंधेरी परी कथा",
|
||||
"urbanFantasy": "शहरी कल्पना"
|
||||
},
|
||||
"plotStyles": {
|
||||
"straightforward": "सीधी रोमांचक",
|
||||
"twist": "बहु-मोड़ी रोमांचक"
|
||||
},
|
||||
"voiceOptions": {
|
||||
"off": "बंद",
|
||||
"on": "चालू"
|
||||
},
|
||||
"pacings": {
|
||||
"fast": "तेज़ और रोमांचक",
|
||||
"relaxed": "धीरे और विस्तृत"
|
||||
},
|
||||
"stories": {
|
||||
"贤者陨落": "ऋषि का पतन",
|
||||
"画中圣手": "चित्र में दिव्य हाथ",
|
||||
"花魁的刀": "वेश्या की तलवार"
|
||||
},
|
||||
"ui": {
|
||||
"start": "शुरू",
|
||||
"loadStory": "कहानी लोड करें",
|
||||
"settings": "सेटिंग्स",
|
||||
"searchPlaceholder": "शैली खोजें...",
|
||||
"noMatchingStyle": "कोई मेल खाने वाली शैली नहीं",
|
||||
"close": "बंद करें",
|
||||
"back": "वापस",
|
||||
"save": "सहेजें",
|
||||
"cancel": "रद्द करें",
|
||||
"saveAndSelect": "सहेजें और चुनें"
|
||||
},
|
||||
"styleModal": {
|
||||
"title": "कला शैली चुनें",
|
||||
"subtitle": "डिफ़ॉल्ट 'स्वचालित' · AI कहानी के अनुसार शैली स्वचालित रूप से मिलाता है; 'कस्टम शैली' चुनकर आप विवरण दे सकते हैं या संदर्भ चित्र अपलोड कर सकते हैं",
|
||||
"customTitle": "कस्टम शैली",
|
||||
"customPlaceholder": "अपनी इच्छित शैली का वर्णन करें, उदाहरण के लिए:\nस्वप्निल जल रंग शैली, कोमल रंग, पुरानी यादें\n\n💡 संकेत: कुछ ड्रॉइंग मॉडल के लिए अंग्रेजी संकेत शब्द बेहतर काम करते हैं, एआई वार्ता टूल का उपयोग करके पेशेवर अंग्रेजी शैली विवरण उत्पन्न करने का सुझाव दिया जाता है",
|
||||
"uploadImage": "संदर्भ चित्र अपलोड करें",
|
||||
"changeImage": "बदलें",
|
||||
"remove": "हटाएं",
|
||||
"parsing": "विश्लेषण हो रहा है...",
|
||||
"importFromPreset": "प्रीसेट शैली से आयात करें...",
|
||||
"uploadError": "केवल चित्र फ़ाइल समर्थित है",
|
||||
"visionError": "दृश्य मॉडल ने खाली शैली विवरण लौटाया",
|
||||
"fileReadError": "फ़ाइल पढ़ने में विफल",
|
||||
"imageDecodeError": "चित्र को डिकोड करने में विफल",
|
||||
"parseError": "विश्लेषण में विफल",
|
||||
"refImageAlt": "शैली संदर्भ चित्र"
|
||||
},
|
||||
"hero": {
|
||||
"title": "आज कौन सी कहानी का अनुभव करना चाहते हैं?",
|
||||
"placeholder": "माफ़ कीजिए, मैं उस अनुरोध को पूरा नहीं कर सकता।",
|
||||
"enterHint": "एंटर भेजें · शिफ्ट+एंटर नई पंक्ति"
|
||||
},
|
||||
"hint": {
|
||||
"text": (params: { authEnabled?: boolean }) => {
|
||||
const authHint = params.authEnabled ? ' (बीटा के दौरान लॉगिन आवश्यक, मुफ्त खेल)' : '';
|
||||
return `अपने विचार दर्ज करें, शैलियों को कॉन्फ़िगर करें और खेलने के लिए "शुरू" क्लिक करें${authHint}। आप नीचे से एक क्यूरेटेड कहानी चुनकर <em>InfiPlot</em> का तेजी से अनुभव भी कर सकते हैं। "सेटिंग्स" पर क्लिक करें अपना नाम दर्ज करने और अपनी टेक्स्ट, इमेज, विजन और TTS कुंजियों को कॉन्फ़िगर करने के लिए—सब कुछ अधिक स्थिर अनुभव के लिए आपके ब्राउज़र में स्थानीय रूप से संग्रहीत है।`;
|
||||
},
|
||||
"closeAriaLabel": "यह संकेत फिर न दिखाएं"
|
||||
},
|
||||
"about": {
|
||||
"title": "InfiPlot",
|
||||
"description": "एक इंटरैक्टिव स्टोरी गेम है जो AI का उपयोग करके रीयल-टाइम में सामग्री उत्पन्न करता है — चित्र, आवाज और कथा शाखाएं खेल के दौरान तुरंत उत्पन्न होती हैं।",
|
||||
"team": "टीम",
|
||||
"teamText": "हम सिंघुआ विश्वविद्यालय, लांज़ू विश्वविद्यालय और अन्य संस्थानों से आते हैं, और हम बहु-मोडल मॉडल की संभावनाओं का पता लगाना चाहते हैं। यह परियोजना अभी प्रारंभिक चरण में है, हम अभी भी सदस्यों की तलाश में हैं। यदि आप भी रुचि रखते हैं, तो कृपया संपर्क करें, हम आपके शामिल होने की प्रतीक्षा करते हैं।",
|
||||
"contact": "संपर्क",
|
||||
"email": "ईमेल",
|
||||
"openSource": "ओपन सोर्स पता",
|
||||
"betaUsers": "बीटा उपयोगकर्ता समूह",
|
||||
"qqGroupLabel": "QQ समूह नंबर:",
|
||||
"qqGroupAlt": "InfiPlot सार्वजनिक बीटा समूह QR कोड (समूह नंबर 575404333)",
|
||||
"privacyPolicy": "गोपनीयता नीति",
|
||||
"terms": "सेवा की शर्तें",
|
||||
"copyright": "© 2026 InfiPlot. सर्वाधिकार सुरक्षित।"
|
||||
},
|
||||
"errors": {
|
||||
"emptyFile": "यह कहानी फ़ाइल खाली है।",
|
||||
"fileTooLarge": "कहानी फ़ाइल बहुत बड़ी है, लोड नहीं हो सकती।",
|
||||
"unpackFailed": "कहानी फ़ाइल अनपैक करने में विफल।",
|
||||
"parseFailed": "कहानी फ़ाइल पार्स करने में विफल।",
|
||||
"cardNotFound": "चयनित कहानी नहीं मिली: {cardName}"
|
||||
}
|
||||
},
|
||||
"play": {
|
||||
"loading": {
|
||||
"firstFrame": "प्रथम दृश्य बन रहा है",
|
||||
"transitioning": "AI अगला दृश्य बना रहा है",
|
||||
"visionThinking": "AI सोच रहा है आपने क्या देखा",
|
||||
"loadingFirst": "पहला दृश्य लोड हो रहा है",
|
||||
"awakening": "लोड हो रहा है"
|
||||
},
|
||||
"freeform": {
|
||||
"placeholder": "आप जो कहना या करना चाहते हैं वह टाइप करें...",
|
||||
"title": "स्वतंत्र इनपुट",
|
||||
"ariaLabel": "स्वतंत्र इनपुट"
|
||||
},
|
||||
"choiceDisabled": "साझा कहानी में यह शाखा शामिल नहीं है",
|
||||
"tooltips": {
|
||||
"openSettings": "सेटिंग्स खोलें",
|
||||
"openHistory": "कहानी इतिहास",
|
||||
"fullscreen": "फुलस्क्रीन (F)",
|
||||
"enterFullscreen": "फुलस्क्रीन में प्रवेश करें",
|
||||
"exportGallery": "इंटरैक्टिव गैलरी लिंक के रूप में निर्यात करें",
|
||||
"exportGalleryLabel": "इंटरैक्टिव गैलरी निर्यात करें",
|
||||
"shareStory": "चालू कहानी .infiplot के रूप में निर्यात करें",
|
||||
"shareStoryLabel": "वर्तमान कहानी साझा करें",
|
||||
"mute": "मूक",
|
||||
"unmute": "आवाज़ चालू",
|
||||
"closeNudge": "संकेत बंद करें",
|
||||
"silenceNudge": "प्रभाव संतोषजनक नहीं/अक्सर कोई आवाज़ नहीं? अपना API कुंजी आज़माएं",
|
||||
"back": "वापस"
|
||||
},
|
||||
"imageAlt": "उत्पन्न दृश्य",
|
||||
"counter": {
|
||||
"scene": "दृश्य {n}",
|
||||
"beat": "बीट {n}",
|
||||
"middle": "·"
|
||||
},
|
||||
"buttons": {
|
||||
"fullscreen": "F · कुंजी · फुलस्क्रीन",
|
||||
"exportGallery": "गैलरी · निर्यात",
|
||||
"shareStory": "कहानी · साझा",
|
||||
"muted": "मूक",
|
||||
"sound": "आवाज़"
|
||||
},
|
||||
"error": {
|
||||
"title": "कुछ समस्या आई",
|
||||
"back": "वापस"
|
||||
},
|
||||
"previousStep": "पिछला चरण",
|
||||
"settingsFooter": "सहेजने के बाद TTS कुंजी तुरंत प्रभावी होगी, अपने कोटे से वर्तमान दृश्य की आवाज़ बनाएं।",
|
||||
"shareErrors": {
|
||||
"notFound": "लोड करने के लिए कोई कहानी फ़ाइल नहीं मिली।",
|
||||
"invalid": "कहानी साझा फ़ाइल में कोई लोड करने योग्य कहानी नहीं है।",
|
||||
"noImage": "कहानी साझा फ़ाइल में पहला दृश्य चित्र नहीं है।",
|
||||
"noNextImage": "कहानी साझा फ़ाइल में अगला दृश्य चित्र नहीं है।",
|
||||
"noMemory": "कहानी साझा फ़ाइल में प्रारंभिक कहानी स्मृति नहीं है।",
|
||||
"packFailed": "कहानी साझा पैकेजिंग विफल"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "सेटिंग्स",
|
||||
"subtitle": "वैकल्पिक · ये सेटिंग्स केवल स्थानीय ब्राउज़र में सहेजी जाती हैं",
|
||||
"tabs": {
|
||||
"general": "सामान्य",
|
||||
"models": "मॉडल"
|
||||
},
|
||||
"general": {
|
||||
"playerName": "खिलाड़ी का नाम",
|
||||
"playerNamePlaceholder": "खाली छोड़ने पर 'आप' का उपयोग होगा",
|
||||
"playerNameHint": "NPC बातचीत में इस नाम से संबोधित करेंगे।",
|
||||
"visionClick": "दृश्य पर क्लिक पहचान",
|
||||
"visionOn": "चालू",
|
||||
"visionOff": "बंद",
|
||||
"visionHint": "चालू करने पर, चयन नोड पर दृश्य क्लिक करने से AI दृश्य पहचान और नई कहानी शाखा उत्पन्न होगी।"
|
||||
},
|
||||
"models": {
|
||||
"corsNotice": "सुनिश्चित करें कि आपका API एंडपॉइंट ब्राउज़र CORS अनुरोध का समर्थन करता है। अधिकांश प्रमुख प्रदाता (OpenAI, Anthropic, Gemini, Runware आदि) पहले से समर्थन करते हैं।",
|
||||
"textModel": "पाठ मॉडल",
|
||||
"imageModel": "चित्र मॉडल",
|
||||
"visionModel": "दृश्य मॉडल",
|
||||
"baseUrl": "आधार URL",
|
||||
"apiKey": "API कुंजी",
|
||||
"model": "मॉडल",
|
||||
"provider": "प्रदाता (वैकल्पिक)",
|
||||
"providerHint": "खाली छोड़ने पर सिस्टम आधार URL से स्वचालित रूप से प्रोटोकॉल निर्धारित करेगा।",
|
||||
"providerAuto": "स्वचालित अनुमान (अनुशंसित)",
|
||||
"show": "दिखाएं",
|
||||
"hide": "छुपाएं"
|
||||
},
|
||||
"tts": {
|
||||
"title": "आवाज़ डबिंग मॉडल",
|
||||
"description": 'अपना <span class="text-clay-800">शाओमी MiMo API कुंजी</span> भरें, डबिंग ब्राउज़र में स्थानीय रूप से संश्लेषित होगी, कुंजी केवल स्थानीय रूप से सहेजी जाती है। MiMo TTS वर्तमान में<span class="text-clay-800">मुफ्त</span> है।',
|
||||
"keyType": "कुंजी प्रकार",
|
||||
"payg": "भुगतान-जैसा-आप-उपयोग-करें",
|
||||
"paygSub": "sk- से शुरू",
|
||||
"tokenPlan": "टोकन योजना",
|
||||
"tokenPlanSub": "tp- से शुरू",
|
||||
"region": "क्षेत्र नोड",
|
||||
"regionHint": "अपनी योजना सदस्यता क्षेत्र के साथ मेल खाता नोड चुनें।",
|
||||
"apiKeyPlaceholderPayg": "sk- से शुरू होने वाली कुंजी चिपकाएं",
|
||||
"apiKeyPlaceholderToken": "tp- से शुरू होने वाली कुंजी चिपकाएं",
|
||||
"keyMismatchPayg": "यह कुंजी sk- से शुरू नहीं होती",
|
||||
"keyMismatchToken": "यह कुंजी tp- से शुरू नहीं होती",
|
||||
"tutorialLink": "मुफ्त कुंजी कैसे प्राप्त करें? ट्यूटोरियल देखें"
|
||||
},
|
||||
"actions": {
|
||||
"save": "सहेजें",
|
||||
"clearAll": "सभी साफ़ करें"
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
"steps": {
|
||||
"pick": "जारी रखने के लिए लॉग इन करें",
|
||||
"email": "ईमेल लॉग इन",
|
||||
"otp": "सत्यापन कोड"
|
||||
},
|
||||
"googleLogin": "Google लॉग इन",
|
||||
"githubLogin": "GitHub लॉग इन",
|
||||
"emailLogin": "ईमेल सत्यापन कोड लॉग इन",
|
||||
"or": "या",
|
||||
"emailPlaceholder": "your@email.com",
|
||||
"sendCode": "कोड भेजें",
|
||||
"sending": "भेजा जा रहा है...",
|
||||
"codeSent": "सत्यापन कोड {email} पर भेजा गया",
|
||||
"codePlaceholder": "6 अंकीय सत्यापन कोड",
|
||||
"verify": "पुष्टि करें",
|
||||
"verifying": "सत्यापन हो रहा है...",
|
||||
"resend": "पुनः भेजें",
|
||||
"back": "वापस",
|
||||
"close": "बंद करें",
|
||||
"ariaLabel": "लॉग इन"
|
||||
},
|
||||
"history": {
|
||||
"title": "कथा · इतिहास",
|
||||
"close": "बंद करें",
|
||||
"closeAriaLabel": "कथा इतिहास बंद करें",
|
||||
"noHistory": "अभी कोई इतिहास नहीं है।",
|
||||
"scene": "दृश्य {n}",
|
||||
"choice": "चयन",
|
||||
"action": "कार्य",
|
||||
"ariaLabel": "कथा इतिहास"
|
||||
},
|
||||
"customForm": {
|
||||
"world": "दुनिया · दृष्टिकोण",
|
||||
"style": "शैली · चित्र शैली",
|
||||
"worldPlaceholder": "उदाहरण: 1990 के दशक के अंत में दक्षिणी चीन का एक छोटा शहर। मुख्य पात्र एक तीसरी वर्ष का स्थानांतरित छात्र है, जो बारिश वाले जून में छत पर कविता पढ़ने वाले एक सहपाठी से मिलता है।",
|
||||
"stylePlaceholder": "उदाहरण: जल रंग कोमल प्रकाश, दोपहर की गर्मी, एनीमे दृश्य उपन्यास शैली...",
|
||||
"status": {
|
||||
"ready": "तैयार · हो · गया",
|
||||
"needMore": "दो · अनुच्छेद · पर्याप्त",
|
||||
"starting": "पहला दृश्य लोड हो रहा है..."
|
||||
},
|
||||
"start": "शुरू करें"
|
||||
},
|
||||
"language": {
|
||||
"title": "भाषा",
|
||||
"current": "वर्तमान भाषा",
|
||||
"select": "भाषा चुनें"
|
||||
}
|
||||
} as const;
|
||||
|
||||
export type hiTranslations = typeof hi;
|
||||
Reference in New Issue
Block a user