初始化项目

This commit is contained in:
2025-11-21 00:24:10 +08:00
commit 2878783349
34 changed files with 6774 additions and 0 deletions

926
utils/localization.ts Normal file
View File

@@ -0,0 +1,926 @@
import { Language, Scenario } from "../types";
export const getScenarios = (language: Language): Scenario[] => {
switch(language) {
case 'ja':
return [
{
id: 'cafe_order',
title: 'カフェで注文',
icon: '☕',
description: '東京のカフェでコーヒーと軽食を注文する練習。',
initialMessage: 'いらっしゃいませ!ご注文はお決まりですか?',
role: '店員'
},
{
id: 'train_station',
title: '駅での道案内',
icon: '🚄',
description: '駅員に行き先を尋ねる練習。',
initialMessage: 'はい、どうされましたか?',
role: '駅員'
},
{
id: 'conbini',
title: 'コンビニでの買い物',
icon: '🏪',
description: 'コンビニで支払いをする練習。',
initialMessage: 'お弁当温めますか?',
role: '店員'
},
{
id: 'hotel_checkin',
title: 'ホテルのチェックイン',
icon: '🏨',
description: 'ホテルのフロントでチェックインをする。',
initialMessage: 'いらっしゃいませ。チェックインでございますか?',
role: 'フロント係'
},
{
id: 'immigration',
title: '入国審査',
icon: '🛂',
description: '空港の入国審査で質問に答える練習。',
initialMessage: '次の方どうぞ。パスポートを見せてください。',
role: '審査官'
},
{
id: 'boarding',
title: '搭乗手続き',
icon: '✈️',
description: '搭乗ゲートでのやり取り。',
initialMessage: 'ご搭乗ありがとうございます。パスポートと搭乗券を拝見します。',
role: '地上係員'
}
];
case 'zh':
return [
{
id: 'cafe_order',
title: '咖啡厅点单',
icon: '☕',
description: '练习在东京的咖啡厅点咖啡和小吃。',
initialMessage: 'いらっしゃいませ!ご注文はお決まりですか?',
initialTranslation: '欢迎光临!决定好要点什么了吗?',
role: '店员'
},
{
id: 'train_station',
title: '车站问路',
icon: '🚄',
description: '练习询问车站工作人员路线。',
initialMessage: 'はい、どうされましたか?',
initialTranslation: '您好,有什么可以帮您的吗?',
role: '站务员'
},
{
id: 'conbini',
title: '便利店购物',
icon: '🏪',
description: '练习在便利店结账。',
initialMessage: 'お弁当温めますか?',
initialTranslation: '便当需要加热吗?',
role: '店员'
},
{
id: 'hotel_checkin',
title: '酒店入住',
icon: '🏨',
description: '在酒店前台办理入住手续。',
initialMessage: 'いらっしゃいませ。チェックインでございますか?',
initialTranslation: '欢迎光临。是办理入住吗?',
role: '前台接待'
},
{
id: 'immigration',
title: '入境审查',
icon: '🛂',
description: '练习在机场回答入境审查官的提问。',
initialMessage: '次の方どうぞ。パスポートを見せてください。',
initialTranslation: '下一位。请出示您的护照。',
role: '审查官'
},
{
id: 'boarding',
title: '登机手续',
icon: '✈️',
description: '练习登机口的对话。',
initialMessage: 'ご搭乗ありがとうございます。パスポートと搭乗券を拝見します。',
initialTranslation: '感谢您的搭乘。请出示护照和登机牌。',
role: '地勤人员'
}
];
default: // en
return [
{
id: 'cafe_order',
title: 'Ordering at a Cafe',
icon: '☕',
description: 'Practice ordering coffee and snacks at a cafe in Tokyo.',
initialMessage: 'いらっしゃいませ!ご注文はお決まりですか?',
initialTranslation: 'Welcome! Have you decided on your order?',
role: 'Barista'
},
{
id: 'train_station',
title: 'Asking Directions',
icon: '🚄',
description: 'Practice asking a station attendant for help finding a platform.',
initialMessage: 'はい、どうされましたか?',
initialTranslation: 'Yes, how can I help you?',
role: 'Station Attendant'
},
{
id: 'conbini',
title: 'Convenience Store',
icon: '🏪',
description: 'Buying items at a Konbini.',
initialMessage: 'お弁当温めますか?',
initialTranslation: 'Would you like your bento warmed up?',
role: 'Clerk'
},
{
id: 'hotel_checkin',
title: 'Hotel Check-in',
icon: '🏨',
description: 'Checking into a hotel.',
initialMessage: 'いらっしゃいませ。チェックインでございますか?',
initialTranslation: 'Welcome. Are you checking in?',
role: 'Receptionist'
},
{
id: 'immigration',
title: 'Immigration',
icon: '🛂',
description: 'Answering questions at airport immigration control.',
initialMessage: '次の方どうぞ。パスポートを見せてください。',
initialTranslation: 'Next person, please. Show me your passport.',
role: 'Officer'
},
{
id: 'boarding',
title: 'Boarding Gate',
icon: '✈️',
description: 'Interacting with staff at the boarding gate.',
initialMessage: 'ご搭乗ありがとうございます。パスポートと搭乗券を拝見します。',
initialTranslation: 'Thank you for boarding. May I see your passport and boarding pass?',
role: 'Ground Staff'
}
];
}
};
export const translations = {
en: {
appTitle: "Sakura Sensei 🌸",
nav: {
sectionStudy: "Study & Input",
sectionPractice: "Practice & Output",
sectionTools: "Toolbox",
sectionImmersion: "Immersion",
chat: "Tutor Dojo",
reading: "Reading Hall",
listening: "Listening Lab",
speaking: "Roleplay",
creative: "Atelier",
translation: "Translator",
ocr: "Scanner",
settings: "Settings"
},
common: {
cancel: "Cancel",
confirm: "Confirm",
delete: "Delete",
next: "Next",
generatedBy: "Generated by",
error: "Error occurred",
poweredBy: "Powered by Gemini",
deleteItemConfirm: "Are you sure you want to delete this item?",
clearHistoryConfirm: "Are you sure you want to clear the entire history?",
save: "Save",
download: "Download",
content: "Content",
tutor: "Tutor",
text: "Text",
explanation: "Explanation",
clear: "Clear",
copy: "Copy",
copied: "Copied!",
share: "Share",
shareImage: "Image",
shareText: "Text",
shareFile: "File (TXT)",
aiLanguage: "AI Language",
langJa: "Japanese",
langNative: "User Language",
today: "Today",
yesterday: "Yesterday"
},
onboarding: {
welcome: "Welcome to Sakura Sensei!",
desc1: "Your AI-powered companion for mastering Japanese.",
step1Title: "Conversational Tutor",
step1Desc: "Chat with Sakura (Gemini 3 Pro) to practice grammar or ask cultural questions.",
step2Title: "Immersive Practice",
step2Desc: "Roleplay realistic scenarios, generate reading materials, and scan real-world text.",
step3Title: "Creative Tools",
step3Desc: "Generate images and videos to visualize your learning journey.",
startBtn: "Start Learning",
selectLang: "Select Interface Language"
},
chat: {
welcome: "Konnichiwa! 🌸 I am Sakura. How can I help you with your Japanese today?",
inputPlaceholder: "Send a message...",
thinkingPlaceholder: "Reasoning about grammar...",
imageAttached: "Image attached",
sending: "Sakura is thinking...",
error: "Connection lost.",
locationError: "Region not supported. Please configure a Proxy URL in Settings.",
playUserAudio: "Play Recording",
listenPronunciation: "Listen",
deepThinking: "Deep Thought",
imageAnalyzed: "Image Analyzed",
thinkingToggle: "Thinking Mode",
newChat: "New Chat",
history: "Chat History",
noHistory: "No previous chats.",
deleteChat: "Delete",
deleteConfirm: "Are you sure you want to delete this chat session?",
untitled: "Untitled Chat",
transcribedPrefix: "(Transcribed): "
},
creative: {
title: "Creative Atelier 🎨",
genImage: "Paint",
editImage: "Magic Edit",
genVideo: "Dream Video",
promptLabel: "Your Vision",
editLabel1: "1. Base Photo",
editLabel2: "2. Instruction",
uploadPlaceholder: "Drop an image here",
generateBtn: "Generate",
creatingBtn: "Creating...",
download: "Download",
videoWarning: "* Video generation (Veo) takes time.",
emptyState: "Your masterpiece will appear here",
imagePrompt: "Cyberpunk samurai cat in neon Tokyo...",
editPrompt: "Turn trees into cherry blossoms...",
videoPrompt: "Traditional tea ceremony in a futuristic garden...",
uploadAlert: "Please upload an image first!"
},
speaking: {
title: "Conversation Dojo 🗣️",
subtitle: "Roleplay in realistic scenarios. Get instant feedback on accent and fluency.",
back: "Exit",
listening: "Listening...",
tapSpeak: "Tap to Speak",
processing: "Analyzing...",
feedbackTitle: "Sensei's Report",
score: "Fluency",
toImprove: "Corrections",
advice: "Advice",
transcription: "You Said",
meaning: "Meaning",
perfect: "Sugoi! Perfect pronunciation! 🎉",
emptyFeedback: "Speak clearly to get feedback.",
replay: "Replay",
start: "Start",
roleplay: "Role",
translation: "Translation"
},
reading: {
title: "Reading Hall 📜",
subtitle: "Generate custom reading lessons based on your level.",
topicLabel: "Topic",
difficultyLabel: "Level",
levels: {
beginner: "Beginner (N5-N4)",
intermediate: "Intermediate (N3-N2)",
advanced: "Advanced (N1)"
},
generate: "Create Lesson",
generating: "Writing...",
translationToggle: "Translation",
vocabTitle: "Vocabulary",
grammarHeader: "Grammar",
qaTitle: "Tutor Chat",
qaPlaceholder: "Ask about this text...",
qaWelcome: "Lesson generated. Ask me anything about the text!",
historyTitle: "Library",
loadMore: "Open",
emptyHistory: "Empty Library",
clear: "Clear",
placeholder: "e.g. Kyoto History, Anime Culture",
translationLabel: "Translation",
thinking: "thinking...",
playAudio: "Listen",
stopAudio: "Stop",
contentMissing: "No text generated. Please try creating a new lesson with a more specific topic.",
translationMissing: "No translation available."
},
listening: {
title: "Listening Lab 🎧",
subtitle: "Train your ears with AI-generated conversations and quizzes.",
generate: "Create Practice",
generating: "Composing...",
play: "Play Audio",
pause: "Pause",
replay: "Replay",
showScript: "Show Transcript",
hideScript: "Hide Transcript",
quizTitle: "Comprehension Quiz",
check: "Check Answer",
correct: "Correct!",
incorrect: "Incorrect, try again.",
scriptTitle: "Transcript",
historyTitle: "Practice Log",
emptyHistory: "No practice logs",
qaWelcome: "I've generated a listening exercise. Listen to the audio first, try the quiz, then ask me anything!",
noScript: "No script available to play.",
scriptMissing: "No script generated. Please try generating again."
},
ocr: {
title: "Text Scanner 🔍",
subtitle: "Scan text (books, menus) to create study guides.",
uploadBtn: "Upload",
cameraBtn: "Camera",
processing: "Scanning...",
extractedTitle: "Extracted Text",
analysisTitle: "Study Notes",
vocabHeader: "Vocabulary",
grammarHeader: "Grammar",
summaryHeader: "Summary",
chatPlaceholder: "Ask about this text...",
reScan: "New Scan",
error: "Could not analyze image.",
history: "Scan History",
emptyHistory: "No scans yet",
clear: "Clear",
analyzedIntro: "Analyzed (Language: $lang). Ask me anything!",
historyIntro: "Loaded from history (Language: $lang).",
tutorChat: "Tutor Chat",
thinking: "thinking...",
analysisFailed: "Analysis failed."
},
translation: {
title: "Translator",
inputLabel: "Input",
outputLabel: "Translation",
translateBtn: "Translate",
translating: "Translating...",
extracting: "Scanning...",
scanImage: "Camera",
uploadImage: "Image",
sourceLang: "Source",
targetLang: "Target",
history: "Translator History",
clear: "Clear",
copy: "Copy",
langs: {
auto: "Auto Detect",
en: "English",
ja: "Japanese",
zh: "Chinese",
ko: "Korean",
fr: "French",
es: "Spanish"
},
errorTranslating: "Error translating.",
imageReadError: "Could not read text from image.",
imageTransError: "Image translation failed."
},
settings: {
title: "Settings & Data",
backupTitle: "Backup",
backupDesc: "Download all data locally.",
backupBtn: "Backup",
restoreDesc: "Restore from backup file.",
restoreBtn: "Restore",
exportTitle: "Export",
exportChatBtn: "Chat Log (TXT)",
exportTransBtn: "Translations (CSV)",
exportReadingBtn: "Reading History (JSON)",
exportOCRBtn: "Scan History (JSON)",
successRestore: "Restored successfully!",
errorRestore: "Invalid file.",
apiKeyTitle: "API Configuration",
apiKeyDesc: "Configure your Gemini API access.",
apiKeyPlaceholder: "Paste API Key",
baseUrlPlaceholder: "Base URL (Optional, e.g. for Proxy)",
apiKeyMissing: "API Key is required.",
saveKey: "Save",
removeKey: "Remove",
keySaved: "Settings saved!",
keyRemoved: "Settings cleared.",
modelTitle: "AI Model",
modelDesc: "Select model for chat/reasoning.",
modelSaved: "Model updated!"
},
recorder: {
start: "Start Mic",
stop: "Stop Mic"
}
},
ja: {
appTitle: "さくら先生 🌸",
nav: {
sectionStudy: "学習とインプット",
sectionPractice: "練習とアウトプット",
sectionTools: "ツールボックス",
sectionImmersion: "没入体験",
chat: "学習道場",
reading: "読書の間",
listening: "聴解ラボ",
speaking: "ロールプレイ",
creative: "アトリエ",
translation: "翻訳機",
ocr: "スキャナー",
settings: "設定"
},
common: {
cancel: "キャンセル",
confirm: "確認",
delete: "削除",
next: "次へ",
generatedBy: "生成モデル:",
error: "エラーが発生しました",
poweredBy: "Powered by Gemini",
deleteItemConfirm: "この項目を削除してもよろしいですか?",
clearHistoryConfirm: "履歴をすべて消去してもよろしいですか?",
save: "保存",
download: "ダウンロード",
content: "コンテンツ",
tutor: "チューター",
text: "テキスト",
explanation: "解説",
clear: "クリア",
copy: "コピー",
copied: "コピーしました!",
share: "共有",
shareImage: "画像",
shareText: "テキスト",
shareFile: "ファイル (TXT)",
aiLanguage: "AIの使用言語",
langJa: "日本語",
langNative: "ユーザー言語",
today: "今日",
yesterday: "昨日"
},
onboarding: {
welcome: "さくら先生へようこそ!",
desc1: "あなたのためのAI日本語学習パートナーです。",
step1Title: "会話チューター",
step1Desc: "さくら先生Gemini 3 Proとチャットして、文法や文化について学びましょう。",
step2Title: "没入型練習",
step2Desc: "リアルなシナリオでのロールプレイ、読み物の作成、現実世界のテキストのスキャン。",
step3Title: "クリエイティブツール",
step3Desc: "学習の旅を視覚化するために画像やビデオを生成します。",
startBtn: "学習を始める",
selectLang: "言語を選択"
},
chat: {
welcome: "こんにちは!🌸 さくらです。日本語の勉強をお手伝いします。",
inputPlaceholder: "メッセージを送信...",
thinkingPlaceholder: "文法を推論中...",
imageAttached: "画像が添付されました",
sending: "さくら先生が考え中...",
error: "接続が失われました。",
locationError: "この地域はサポートされていません。設定でプロキシURLを設定してください。",
playUserAudio: "録音を再生",
listenPronunciation: "聞く",
deepThinking: "深い思考",
imageAnalyzed: "画像を分析しました",
thinkingToggle: "思考モード",
newChat: "新しいチャット",
history: "チャット履歴",
noHistory: "履歴はありません。",
deleteChat: "削除",
deleteConfirm: "このチャットセッションを削除してもよろしいですか?",
untitled: "無題のチャット",
transcribedPrefix: "(書き起こし): "
},
creative: {
title: "クリエイティブアトリエ 🎨",
genImage: "描画",
editImage: "マジック編集",
genVideo: "夢のビデオ",
promptLabel: "あなたのビジョン",
editLabel1: "1. 元の画像",
editLabel2: "2. 指示",
uploadPlaceholder: "ここに画像をドロップ",
generateBtn: "生成",
creatingBtn: "作成中...",
download: "ダウンロード",
videoWarning: "* ビデオ生成 (Veo) には時間がかかります。",
emptyState: "ここに作品が表示されます",
imagePrompt: "ネオン輝く東京のサイバーパンク侍猫...",
editPrompt: "木を桜に変えて...",
videoPrompt: "未来的な庭園での伝統的な茶道...",
uploadAlert: "まずは画像をアップロードしてください!"
},
speaking: {
title: "会話道場 🗣️",
subtitle: "リアルなシナリオでロールプレイ。アクセントや流暢さを即座にフィードバック。",
back: "終了",
listening: "聞いています...",
tapSpeak: "タップして話す",
processing: "分析中...",
feedbackTitle: "先生のレポート",
score: "流暢さ",
toImprove: "修正点",
advice: "アドバイス",
transcription: "あなたの発言",
meaning: "意味",
perfect: "すごい!完璧な発音です!🎉",
emptyFeedback: "はっきりと話してください。",
replay: "再生",
start: "開始",
roleplay: "役割",
translation: "翻訳"
},
reading: {
title: "読書の間 📜",
subtitle: "レベルに合わせて読み物を生成します。",
topicLabel: "トピック",
difficultyLabel: "レベル",
levels: {
beginner: "初級 (N5-N4)",
intermediate: "中級 (N3-N2)",
advanced: "上級 (N1)"
},
generate: "レッスン作成",
generating: "執筆中...",
translationToggle: "翻訳",
vocabTitle: "語彙",
grammarHeader: "文法",
qaTitle: "チューターチャット",
qaPlaceholder: "このテキストについて質問...",
qaWelcome: "レッスンを作成しました。テキストについて何でも聞いてください!",
historyTitle: "ライブラリ",
loadMore: "開く",
emptyHistory: "ライブラリは空です",
clear: "クリア",
placeholder: "例:京都の歴史、アニメ文化",
translationLabel: "翻訳",
thinking: "考え中...",
playAudio: "聞く",
stopAudio: "停止",
contentMissing: "コンテンツが生成されませんでした。新しいトピックで試してください。",
translationMissing: "翻訳がありません。"
},
listening: {
title: "聴解ラボ 🎧",
subtitle: "AIが生成した会話とクイズで耳を鍛えましょう。",
generate: "練習を作成",
generating: "作成中...",
play: "音声を再生",
pause: "一時停止",
replay: "もう一度",
showScript: "スクリプトを表示",
hideScript: "スクリプトを隠す",
quizTitle: "理解度クイズ",
check: "答え合わせ",
correct: "正解!",
incorrect: "不正解、もう一度。",
scriptTitle: "スクリプト",
historyTitle: "練習ログ",
emptyHistory: "練習ログなし",
qaWelcome: "リスニング練習を作成しました。まず音声を聞いてクイズに挑戦し、その後何でも質問してください!",
noScript: "再生できるスクリプトがありません。",
scriptMissing: "スクリプトが生成されませんでした。もう一度試してください。"
},
ocr: {
title: "テキストスキャナー 🔍",
subtitle: "テキスト(本、メニュー)をスキャンして学習ガイドを作成。",
uploadBtn: "アップロード",
cameraBtn: "カメラ",
processing: "スキャン中...",
extractedTitle: "抽出されたテキスト",
analysisTitle: "学習ノート",
vocabHeader: "語彙",
grammarHeader: "文法",
summaryHeader: "要約",
chatPlaceholder: "このテキストについて質問...",
reScan: "新しいスキャン",
error: "画像を分析できませんでした。",
history: "スキャン履歴",
emptyHistory: "スキャン履歴なし",
clear: "クリア",
analyzedIntro: "分析しました(言語:$lang。何でも聞いてください",
historyIntro: "履歴から読み込みました(言語:$lang。",
tutorChat: "チューターチャット",
thinking: "考え中...",
analysisFailed: "分析に失敗しました。"
},
translation: {
title: "翻訳機",
inputLabel: "入力",
outputLabel: "翻訳",
translateBtn: "翻訳",
translating: "翻訳中...",
extracting: "スキャン中...",
scanImage: "カメラ",
uploadImage: "画像",
sourceLang: "翻訳元",
targetLang: "翻訳先",
history: "翻訳履歴",
clear: "クリア",
copy: "コピー",
langs: {
auto: "自動検出",
en: "英語",
ja: "日本語",
zh: "中国語",
ko: "韓国語",
fr: "フランス語",
es: "スペイン語"
},
errorTranslating: "翻訳エラー。",
imageReadError: "テキストを読み取れませんでした。",
imageTransError: "画像の翻訳に失敗しました。"
},
settings: {
title: "設定とデータ",
backupTitle: "バックアップ",
backupDesc: "すべてのデータをローカルにダウンロード。",
backupBtn: "バックアップ",
restoreDesc: "バックアップファイルから復元。",
restoreBtn: "復元",
exportTitle: "エクスポート",
exportChatBtn: "チャットログ (TXT)",
exportTransBtn: "翻訳 (CSV)",
exportReadingBtn: "読書履歴 (JSON)",
exportOCRBtn: "スキャン履歴 (JSON)",
successRestore: "正常に復元されました!",
errorRestore: "無効なファイルです。",
apiKeyTitle: "API構成",
apiKeyDesc: "Gemini APIアクセスを構成します。",
apiKeyPlaceholder: "APIキーを貼り付け",
baseUrlPlaceholder: "ベースURL (オプション、プロキシ用)",
apiKeyMissing: "APIキーが必要です。",
saveKey: "保存",
removeKey: "削除",
keySaved: "設定を保存しました!",
keyRemoved: "設定をクリアしました。",
modelTitle: "AIモデル",
modelDesc: "チャット/推論用のモデルを選択。",
modelSaved: "モデルを更新しました!"
},
recorder: {
start: "マイク開始",
stop: "マイク停止"
}
},
zh: {
appTitle: "樱花老师 🌸",
nav: {
sectionStudy: "学习与输入",
sectionPractice: "练习与输出",
sectionTools: "工具箱",
sectionImmersion: "沉浸体验",
chat: "学习道场",
reading: "阅读室",
listening: "听力实验室",
speaking: "角色扮演",
creative: "工作室",
translation: "翻译机",
ocr: "扫描仪",
settings: "设置"
},
common: {
cancel: "取消",
confirm: "确认",
delete: "删除",
next: "下一步",
generatedBy: "生成模型:",
error: "发生错误",
poweredBy: "Powered by Gemini",
deleteItemConfirm: "您确定要删除此项目吗?",
clearHistoryConfirm: "您确定要清空历史记录吗?",
save: "保存",
download: "下载",
content: "内容",
tutor: "导师",
text: "文本",
explanation: "解析",
clear: "清除",
copy: "复制",
copied: "已复制!",
share: "分享",
shareImage: "图片",
shareText: "文本",
shareFile: "文件 (TXT)",
aiLanguage: "AI使用语言",
langJa: "日语",
langNative: "用户语言",
today: "今天",
yesterday: "昨天"
},
onboarding: {
welcome: "欢迎来到樱花老师!",
desc1: "您的AI日语学习伙伴。",
step1Title: "对话导师",
step1Desc: "与樱花老师Gemini 3 Pro聊天学习语法或文化。",
step2Title: "沉浸式练习",
step2Desc: "角色扮演现实场景,生成阅读材料,扫描现实世界的文本。",
step3Title: "创意工具",
step3Desc: "生成图像和视频以可视化您的学习之旅。",
startBtn: "开始学习",
selectLang: "选择界面语言"
},
chat: {
welcome: "你好!🌸 我是樱花。今天我可以帮你学习日语吗?",
inputPlaceholder: "发送消息...",
thinkingPlaceholder: "正在推理由法...",
imageAttached: "已附上图片",
sending: "樱花老师正在思考...",
error: "连接丢失。",
locationError: "不支持该地区。请在设置中配置代理URL。",
playUserAudio: "播放录音",
listenPronunciation: "听",
deepThinking: "深度思考",
imageAnalyzed: "图像已分析",
thinkingToggle: "思考模式",
newChat: "新聊天",
history: "聊天记录",
noHistory: "没有以前的聊天。",
deleteChat: "删除",
deleteConfirm: "您确定要删除此聊天会话吗?",
untitled: "未命名聊天",
transcribedPrefix: "(转录): "
},
creative: {
title: "创意工作室 🎨",
genImage: "绘画",
editImage: "魔法编辑",
genVideo: "梦境视频",
promptLabel: "你的愿景",
editLabel1: "1. 基础照片",
editLabel2: "2. 指令",
uploadPlaceholder: "在这里拖放图像",
generateBtn: "生成",
creatingBtn: "正在创建...",
download: "下载",
videoWarning: "* 视频生成 (Veo) 需要时间。",
emptyState: "你的杰作将出现在这里",
imagePrompt: "霓虹灯闪烁的东京赛博朋克武士猫...",
editPrompt: "把树变成樱花...",
videoPrompt: "未来花园中的传统茶道...",
uploadAlert: "请先上传图片!"
},
speaking: {
title: "对话道场 🗣️",
subtitle: "在现实场景中进行角色扮演。即时反馈口音和流利度。",
back: "退出",
listening: "正在听...",
tapSpeak: "点击说话",
processing: "正在分析...",
feedbackTitle: "老师的报告",
score: "流利度",
toImprove: "修正",
advice: "建议",
transcription: "你说了",
meaning: "意思",
perfect: "太棒了!完美的发音!🎉",
emptyFeedback: "请清楚地说出以获得反馈。",
replay: "重播",
start: "开始",
roleplay: "角色",
translation: "翻译"
},
reading: {
title: "阅读室 📜",
subtitle: "根据您的水平生成自定义阅读课程。",
topicLabel: "主题",
difficultyLabel: "等级",
levels: {
beginner: "初级 (N5-N4)",
intermediate: "中级 (N3-N2)",
advanced: "高级 (N1)"
},
generate: "创建课程",
generating: "正在写作...",
translationToggle: "翻译",
vocabTitle: "词汇",
grammarHeader: "语法",
qaTitle: "导师聊天",
qaPlaceholder: "关于此文本的问题...",
qaWelcome: "课程已生成。关于文本的问题尽管问我!",
historyTitle: "图书馆",
loadMore: "打开",
emptyHistory: "图书馆为空",
clear: "清除",
placeholder: "例如:京都历史,动漫文化",
translationLabel: "翻译",
thinking: "思考中...",
playAudio: "听",
stopAudio: "停止",
contentMissing: "未生成内容。请尝试新的主题。",
translationMissing: "暂无翻译。"
},
listening: {
title: "听力实验室 🎧",
subtitle: "通过AI生成的对话和测验训练您的耳朵。",
generate: "创建练习",
generating: "正在创作...",
play: "播放音频",
pause: "暂停",
replay: "重播",
showScript: "显示脚本",
hideScript: "隐藏脚本",
quizTitle: "理解测验",
check: "检查答案",
correct: "正确!",
incorrect: "不正确,请重试。",
scriptTitle: "脚本",
historyTitle: "练习日志",
emptyHistory: "暂无练习记录",
qaWelcome: "我已生成听力练习。先听音频,尝试测验,然后尽管问我任何问题!",
noScript: "暂无脚本可播放。",
scriptMissing: "未生成脚本。请重试。"
},
ocr: {
title: "文本扫描仪 🔍",
subtitle: "扫描文本(书籍,菜单)以创建学习指南。",
uploadBtn: "上传",
cameraBtn: "相机",
processing: "正在扫描...",
extractedTitle: "提取的文本",
analysisTitle: "学习笔记",
vocabHeader: "词汇",
grammarHeader: "语法",
summaryHeader: "摘要",
chatPlaceholder: "关于此文本的问题...",
reScan: "新扫描",
error: "无法分析图像。",
history: "扫描记录",
emptyHistory: "暂无扫描",
clear: "清除",
analyzedIntro: "已分析(语言:$lang。尽管问我",
historyIntro: "从历史记录加载(语言:$lang。",
tutorChat: "导师聊天",
thinking: "思考中...",
analysisFailed: "分析失败。"
},
translation: {
title: "翻译机",
inputLabel: "输入",
outputLabel: "翻译",
translateBtn: "翻译",
translating: "正在翻译...",
extracting: "正在扫描...",
scanImage: "相机",
uploadImage: "图像",
sourceLang: "源语言",
targetLang: "目标语言",
history: "翻译记录",
clear: "清除",
copy: "复制",
langs: {
auto: "自动检测",
en: "英语",
ja: "日语",
zh: "中文",
ko: "韩语",
fr: "法语",
es: "西班牙语"
},
errorTranslating: "翻译错误。",
imageReadError: "无法读取文本。",
imageTransError: "图片翻译失败。"
},
settings: {
title: "设置和数据",
backupTitle: "备份",
backupDesc: "下载所有数据到本地。",
backupBtn: "备份",
restoreDesc: "从备份文件恢复。",
restoreBtn: "恢复",
exportTitle: "导出",
exportChatBtn: "聊天记录 (TXT)",
exportTransBtn: "翻译 (CSV)",
exportReadingBtn: "阅读记录 (JSON)",
exportOCRBtn: "扫描记录 (JSON)",
successRestore: "恢复成功!",
errorRestore: "无效文件。",
apiKeyTitle: "API配置",
apiKeyDesc: "配置您的Gemini API访问。",
apiKeyPlaceholder: "粘贴API密钥",
baseUrlPlaceholder: "Base URL (可选,用于代理)",
apiKeyMissing: "需要API密钥。",
saveKey: "保存",
removeKey: "删除",
keySaved: "设置已保存!",
keyRemoved: "设置已清除。",
modelTitle: "AI模型",
modelDesc: "选择聊天/推理模型。",
modelSaved: "模型已更新!"
},
recorder: {
start: "开始录音",
stop: "停止录音"
}
}
};