- 新增 useDeviceList hook,枚举音视频输入设备并监听热插拔 - CameraManager/MicManager 的 startCamera/startMic 支持可选 deviceId 参数 - useVisionSession 集成设备选择:授权后自动枚举、切换设备时热重启 - 连接后显示设备下拉选择器,未连接时隐藏(避免未授权时空列表) - SessionConfig 新增 cameraDeviceId/micDeviceId 持久化到 localStorage
209 lines
10 KiB
TypeScript
209 lines
10 KiB
TypeScript
import type { TranslationMap } from "./index";
|
||
|
||
export const jaJP: TranslationMap = {
|
||
// App header
|
||
"app.title": "AI ビジョンアシスタント",
|
||
"app.stats.requests": "リクエスト",
|
||
|
||
// Connection status
|
||
"status.connected": "接続済み",
|
||
"status.connecting": "接続中...",
|
||
"status.disconnected": "未接続",
|
||
|
||
// Settings
|
||
"settings.title": "設定",
|
||
"settings.appearance": "外観",
|
||
"settings.theme": "テーマ",
|
||
"settings.theme.desc": "ライト/ダークテーマを切り替え",
|
||
"settings.theme.dark": "ダーク",
|
||
"settings.theme.light": "ライト",
|
||
"settings.session": "セッション",
|
||
"settings.tts": "音声応答",
|
||
"settings.tts.desc": "AI応答と同時に音声を再生",
|
||
"settings.detail": "画像品質",
|
||
"settings.detail.desc": "高品質は文字認識に最適、低品質は帯域節約",
|
||
"settings.detail.low": "低",
|
||
"settings.detail.high": "高",
|
||
"settings.language": "言語",
|
||
"settings.language.desc": "インタラクション言語の設定",
|
||
"settings.scenario": "シナリオ",
|
||
"settings.scenario.desc": "AIの役割を選択",
|
||
|
||
// Scenarios
|
||
"scenario.choose": "シナリオを選択",
|
||
"scenario.freeChat": "フリーチャット",
|
||
"scenario.freeChat.desc": "AIビジュアルアシスタントと自由に会話",
|
||
"scenario.freeChat.hint": "AIがビジュアルアシスタントとしてあなたの質問に答えます",
|
||
"scenario.interviewer": "模擬面接官",
|
||
"scenario.interviewer.desc": "AIが面接官として模擬面接を実施",
|
||
"scenario.interviewer.hint": "AIが面接官として専門的な質問をし、フィードバックを提供します",
|
||
"scenario.englishTeacher": "英語の先生",
|
||
"scenario.englishTeacher.desc": "AI英語教師が文法を修正し会話を導く",
|
||
"scenario.englishTeacher.hint": "AIが英語で会話し、文法の誤りを修正して深い対話を導きます",
|
||
"scenario.debate": "ディベート相手",
|
||
"scenario.debate.desc": "AIがあなたの观点に反論し論理的思考を鍛える",
|
||
"scenario.debate.hint": "AIが反対の立場から論理と証拠であなたの观点に反論します",
|
||
"scenario.interpreter": "同時通訳",
|
||
"scenario.interpreter.desc": "リアルタイムで中日相互翻訳",
|
||
"scenario.interpreter.hint": "AIがあなたの発言をリアルタイムで翻訳します(中日相互翻訳、説明なし)",
|
||
|
||
// Video indicators
|
||
"video.listening": "🎤 聞き取り中...",
|
||
"video.playing": "🔊 再生中...",
|
||
"video.initVad": "音声検出を初期化中...",
|
||
"video.clickToStart": "下のボタンをクリックして開始",
|
||
"video.placeholder": "右側のチャットに入力して開始",
|
||
"video.cameraOff": "カメラがオフです",
|
||
"video.cameraOff.hint": "右側のチャットでテキスト対話ができます",
|
||
"video.ended": "ビデオ終了",
|
||
"video.ended.hint": "下にテキストを入力して会話を続けることができます",
|
||
|
||
// Controls
|
||
"controls.connecting": "接続中...",
|
||
"controls.start": "🎙️ 対話を開始",
|
||
"controls.startVideo": "🎙️ ビデオ通話を開始",
|
||
"controls.cameraOff": "カメラをオフ",
|
||
"controls.cameraOn": "カメラをオン",
|
||
"controls.micOff": "マイクをオフ",
|
||
"controls.micOn": "マイクをオン",
|
||
"controls.interrupt": "⏹ 中断",
|
||
"controls.stop": "対話を終了",
|
||
"controls.stopVideo": "ビデオ終了",
|
||
"controls.endSession": "セッション終了",
|
||
"controls.resumeVideo": "📹 ビデオ再開",
|
||
|
||
// Chat panel
|
||
"chat.title": "チャット",
|
||
"chat.reconnecting": "接続が切断されました。再接続中...",
|
||
"chat.connecting": "サーバーに接続中...",
|
||
"chat.vadInit": "音声検出を初期化中...",
|
||
"chat.empty.prompt": "下にテキストを入力して対話を開始",
|
||
"chat.empty.hint": "テキストでAIと対話、または左のボタンでビデオ通話を開始",
|
||
"chat.welcome.prompt": "下にテキストを入力して対話を開始",
|
||
"chat.welcome.hint": "マイクを有効にして音声対話もできます",
|
||
"chat.userLabel": "あなた",
|
||
"chat.input.placeholder": "メッセージを入力...",
|
||
"chat.send": "送信",
|
||
"chat.scenarioSwitched": "{name} モードに切り替えました",
|
||
|
||
// Session messages
|
||
"session.recognizing": "(音声認識中...)",
|
||
"session.sttFailed": "(音声認識に失敗しました。もう一度お試しください)",
|
||
"session.noSpeech": "(音声が検出されませんでした)",
|
||
"session.interrupted": "(中断済み)",
|
||
|
||
// Errors
|
||
"error.INVALID_MESSAGE": "メッセージ形式が無効です。再試行してください",
|
||
"error.SESSION_NOT_FOUND": "セッションが期限切れです。再接続してください",
|
||
"error.RATE_LIMITED": "リクエストが多すぎます。しばらく待ってから再試行してください",
|
||
"error.IMAGE_TOO_LARGE": "画像が大きすぎます。解像度を下げてください",
|
||
"error.AUDIO_TOO_SHORT": "音声が短すぎます。もう一度お試しください",
|
||
"error.LLM_TIMEOUT": "AI応答がタイムアウトしました。再試行してください",
|
||
"error.LLM_ERROR": "AIサービスエラー。しばらく待ってから再試行してください",
|
||
"error.STT_ERROR": "音声認識に失敗しました。再試行してください",
|
||
"error.TTS_ERROR": "音声合成に失敗しました",
|
||
"error.INTERNAL_ERROR": "サーバー内部エラー。再試行してください",
|
||
"error.unknown": "不明なエラー",
|
||
|
||
// Sidebar
|
||
"sidebar.new": "新しいチャット",
|
||
"sidebar.expand": "サイドバーを展開",
|
||
"sidebar.collapse": "サイドバーを折りたたむ",
|
||
"sidebar.empty": "会話履歴がありません",
|
||
"sidebar.messages": "件のメッセージ",
|
||
"sidebar.rename": "名前を変更",
|
||
"sidebar.delete": "削除",
|
||
"sidebar.search": "会話を検索...",
|
||
"sidebar.today": "今日",
|
||
"sidebar.yesterday": "昨日",
|
||
"sidebar.earlier": "それ以前",
|
||
"sidebar.pinned": "ピン留め",
|
||
"sidebar.video": "ビデオ",
|
||
"sidebar.clearHistory": "履歴をクリア",
|
||
|
||
// Scene cards (empty state)
|
||
"scene.describe": "周囲のシーンを説明して",
|
||
"scene.describe.desc": "AIが現在のシーンを観察して説明します",
|
||
"scene.text": "画面のテキストを認識",
|
||
"scene.text.desc": "シーン内のテキストを抽出・翻訳します",
|
||
"scene.object": "この物を分析して",
|
||
"scene.object.desc": "物体を識別して関連情報を提供します",
|
||
"scene.suggest": "アドバイスをください",
|
||
"scene.suggest.desc": "現在のシーンに基づいた実用的な提案",
|
||
|
||
// Video controls (enhanced)
|
||
"controls.recognize": "シーンを分析",
|
||
"controls.device.default": "デフォルト",
|
||
|
||
// Status bar
|
||
"statusbar.ready": "準備完了 · デバイスを選択して開始",
|
||
"statusbar.calling": "通話中",
|
||
"statusbar.duration": "通話時間",
|
||
"statusbar.recognitions": "回の認識",
|
||
"statusbar.tokens": "トークン",
|
||
|
||
// Input enhanced
|
||
"chat.input.voice": "音声入力",
|
||
|
||
// Device errors
|
||
"error.vadInit": "VAD初期化に失敗しました",
|
||
"error.cameraAccess": "カメラにアクセスできません",
|
||
"error.micAccess": "マイクにアクセスできません",
|
||
|
||
// Auth
|
||
"auth.subtitle": "AI ビジョンアシスタント",
|
||
"auth.login": "ログイン",
|
||
"auth.register": "新規登録",
|
||
"auth.username": "ユーザー名",
|
||
"auth.username.placeholder": "3〜64文字",
|
||
"auth.password": "パスワード",
|
||
"auth.password.placeholder": "8〜72文字",
|
||
"auth.submitting": "お待ちください...",
|
||
"auth.noAccount": "アカウントをお持ちでないですか?",
|
||
"auth.hasAccount": "すでにアカウントをお持ちですか?",
|
||
"auth.error.usernameLength": "ユーザー名は3〜64文字で入力してください",
|
||
"auth.error.passwordLength": "パスワードは8〜72文字で入力してください",
|
||
"auth.logout": "ログアウト",
|
||
|
||
// Account (in settings)
|
||
"settings.account": "アカウント",
|
||
"settings.account.user": "現在のユーザー",
|
||
|
||
// Custom scenarios
|
||
"settings.scenario.system": "システムシナリオ",
|
||
"settings.scenario.custom": "マイシナリオ",
|
||
"settings.scenario.empty": "カスタムシナリオはまだありません。上のボタンをクリックして作成してください。",
|
||
"scenario.create.button": "新しいシナリオ",
|
||
"scenario.create.title": "カスタムシナリオを作成",
|
||
"scenario.edit.title": "シナリオを編集",
|
||
"scenario.create.name": "シナリオ名",
|
||
"scenario.create.namePlaceholder": "例:クリエイティブライティングコーチ",
|
||
"scenario.create.icon": "アイコン",
|
||
"scenario.create.description": "簡単な説明",
|
||
"scenario.create.descriptionPlaceholder": "このシナリオの概要を一文で",
|
||
"scenario.create.prompt": "システムプロンプト",
|
||
"scenario.create.promptPlaceholder": "AIの役割と対話ルールを定義...",
|
||
"scenario.create.promptGuide": "ガイドを見る",
|
||
"scenario.create.promptGuide.tips": "作成のヒント:",
|
||
"scenario.create.promptGuide.tip1": "役割を明確に定義:何者で、何者でないか",
|
||
"scenario.create.promptGuide.tip2": "対話ルールをリスト化:応答方法、文数",
|
||
"scenario.create.promptGuide.tip3": "制約を追加:何をしないか",
|
||
"scenario.create.promptGuide.example": "例:",
|
||
"scenario.create.greeting": "挨拶(オプション)",
|
||
"scenario.create.greetingPlaceholder": "このシナリオに切り替えた時の最初のメッセージ...",
|
||
"scenario.create.language": "デフォルト言語",
|
||
"scenario.error.nameLength": "シナリオ名は2〜50文字で入力してください",
|
||
"scenario.error.promptLength": "プロンプトは10〜2000文字で入力してください",
|
||
"scenario.error.greetingLength": "挨拶は500文字以内で入力してください",
|
||
|
||
// Common actions
|
||
"common.cancel": "キャンセル",
|
||
"common.create": "作成",
|
||
"common.creating": "作成中...",
|
||
"common.save": "保存",
|
||
"common.saving": "保存中...",
|
||
"common.edit": "編集",
|
||
"common.delete": "削除",
|
||
"common.confirmDelete": "もう一度クリックして確認",
|
||
};
|