46bc2cf12e
* fix: add missing i18n key and unify session data source (#408) - Add `chat.sessionNotFound` translation key to all 8 locales - Fix history page data source inconsistency: - Change `getHermesSession` to prioritize database over CLI - Now consistent with `listHermesSessions` behavior - Prevents "session in list but detail not found" issue - Update CI workflow to trigger on base branch PRs - Remove debug log from sessions-db Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: filter special characters and emoji in speech playback (#409) - Update extractReadableText to filter special characters like *# - Only keep common punctuation marks for speech synthesis - Remove emoji, symbols, and special unicode characters - Improve text-to-speech readability Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add drawer panel with mobile sidebar support and customizable button (#412) * feat: add drawer panel with mobile sidebar support - Add DrawerPanel component with Terminal and Files tabs - Extract TerminalPanel and FilesPanel from existing views - Add mobile sidebar toggle functionality with overlay - Add rainbow breathing light effect to drawer button - Remove Tools section from AppSidebar (Terminal/Files entries) - Add i18n support for drawer and file tree - Optimize mobile button layout and spacing - Fix z-index hierarchy for proper layering - Add responsive sidebar behavior (PC: always visible, Mobile: toggle) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: customize drawer button with arc rainbow border - Change drawer button to semi-circle shape贴着右边 - Add arrow icon pointing left (向左箭头) - Add rainbow border from top to bottom through semi-circle arc - Slow down animation from 4s to 8s for smoother effect - Move drawer button wrapper to messages area only (not贯穿header和input) - Add semi-transparent accent color background to button Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve profile switching state sync issue (#414) (#415) * fix: resolve profile switching state sync issue (#414) Fix bug where switching to a different profile would still show the old profile name in the UI and prevent switching back to default. Root cause: - Frontend relied entirely on fetchProfiles() return value to set activeProfileName - Backend Hermes CLI may return stale active flag due to timing issues between profile use and profile list commands - This caused frontend to display wrong profile and prevented switching back to default Solution: - Immediately set activeProfileName when switchProfile API succeeds - Don't rely solely on listProfiles() result which may have stale data - Use activeProfileName instead of activeProfile?.name in ProfileSelector Changes: - profiles store: Set activeProfileName immediately after successful switch - ProfileSelector: Use activeProfileName computed property - Add test to verify activeProfileName updates on switch Fixes #414 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refine: improve error handling for profile switching failures Add proper error handling for edge cases: - If fetchProfiles() fails after successful switch, keep the updated activeProfileName (don't let fetchProfiles failure undo the switch) - Add test cases to verify: 1. API failure doesn't change state 2. fetchProfiles failure doesn't affect successful switch This ensures the UI remains consistent even when profile list refresh fails after a successful profile switch. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refine: add rollback mechanism for profile switching verification Add backend verification after profile switch: - Save old activeProfileName before setting new value - After fetchProfiles, verify backend reports expected active profile - If backend reports different profile, rollback frontend state and return false - This handles edge case where API returns 200 but backend didn't actually switch Test cases: - ✅ Normal switch: updates and verifies successfully - ✅ API failure: doesn't change state - ✅ fetchProfiles failure: assumes success (API returned 200) - ✅ Backend verification fails: rolls back to old profile This ensures frontend state always matches backend reality, even in edge cases where hermes profile use succeeded but gateway/cleanup steps failed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refine: add user feedback for profile operations Improve user experience with success/error messages: - ProfileSelector: Add error message when switch fails - ProfileCard: Add success message before reload on switch - ProfileSelector: Use async/await for better error handling - ProfileCard: Add 500ms delay before reload to show success message Before: Silent failures, no feedback After: Clear success/error messages for all operations Example feedback: - Success: "已切换到配置 qinghe" - Failure: "切换配置失败,网关可能需要手动重启" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update frontend changelog for v0.5.7 (#419) * docs: update frontend changelog for v0.5.7 - Update changelog.ts with v0.5.7 release date and changes - Add i18n translation keys for all languages (en, zh, de, es, fr, ja, ko, pt) - Include v0.5.7 changelog entries: - Optimize context compression and session sync - Add startup delays to prevent database race conditions Changes: - packages/client/src/data/changelog.ts: Update v0.5.7 entry - packages/client/src/i18n/locales/*.ts: Add changelog translation section This enables the changelog modal in the UI to display v0.5.7 release notes. * feat: add v0.5.7 changelog translations to all supported languages Add new_0_5_7_1, new_0_5_7_2, and new_0_5_7_3 changelog entries to all locale files (en, zh, de, es, fr, ja, ko, pt) with proper translations for each language. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: remove duplicate changelog sections causing syntax errors Remove duplicate changelog object sections that were causing TypeScript syntax errors in all locale files (en, zh, de, es, fr, ja, ko, pt). The actual changelog entries are already correctly placed in the main changelog section of each file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add v0.5.8 changelog and fix profile parsing issue Add v0.5.8 changelog entries based on PRs merged since v0.5.7: - Drawer panel with mobile sidebar support (#412) - Profile switching state sync fix (#414) - Speech playback special character filtering (#409) - Missing i18n key and session data source unification (#408) - Vite build optimization for faster Docker builds (#403) Also fix issue #417: Profile names with long hyphenated names fail to parse in profile list regex. Change \s{2,} to \s+ to handle compressed column spacing when profile names are long. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: remove enter key submit from profile creation and rename modals Remove @keyup.enter handlers from NInput components in: - ProfileCreateModal: prevent accidental profile creation when pressing enter - ProfileRenameModal: prevent accidental profile rename when pressing enter Users must now explicitly click the confirm button to submit, preventing unintended profile operations. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: allow free text input for profile names Remove frontend character filtering from profile creation and rename modals. Users can now input any characters including spaces and uppercase letters to test backend Hermes CLI validation. Changes: - ProfileCreateModal: Remove toLowerCase() and character filtering - ProfileRenameModal: Remove toLowerCase() and character filtering - Use v-model:value binding instead of :value with @input Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: improve error handling for profile creation Display backend error messages when profile creation fails instead of generic "failed" message. This helps users understand why their profile name was rejected (e.g., invalid characters). Changes: - API layer: Capture and return error messages from backend - ProfileCreateModal: Display specific error message from backend Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add profile name validation with i18n support Add client-side validation for profile names to prevent invalid input before sending to backend. Only lowercase letters, numbers, underscores, and hyphens are allowed. Changes: - ProfileCreateModal: Add input validation with real-time feedback - ProfileRenameModal: Add input validation with real-time feedback - Add nameValidation i18n key for all 8 languages - Filter invalid characters on input and show warning message Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: revert profile parsing regex changes Revert the regex changes in hermes-cli.ts and gateway-manager.ts back to requiring \s{2,} (at least 2 spaces). Since frontend now validates profile names to only allow lowercase letters, numbers, underscores, and hyphens, the relaxed regex is no longer needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: revert profile parsing regex changes Revert the regex changes in gateway-manager.ts and hermes-cli.ts back to requiring \s{2,} (at least 2 spaces). Since frontend now validates profile names to only allow lowercase letters, numbers, underscores, and hyphens, the relaxed regex is no longer needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: remove tooltip from drawer button Remove the NTooltip wrapper from the floating drawer button. The "Terminal & Files" tooltip is no longer shown on hover. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * Update assets images (#421) Updated two asset images in the client package. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: bump version to 0.5.8 Release v0.5.8 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: improve profile list parsing to handle long profile names (#425) Fixed issue #423 where long profile names caused parsing failures. Changes: - gateway-manager.ts: Use `.+?` instead of `\S+` to match profile names, allowing names that overflow table column width - hermes-cli.ts: Use `\s+` instead of `\s{2,}` for first delimiter to handle cases where long profile names reduce spacing to 1 space The regex now correctly parses profile output even when profile names are long enough to compress table formatting, ensuring all profiles appear in the UI regardless of name length. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add GitHub issue templates Add structured issue templates to guide users when submitting issues: - Bug Report template with version info, reproduction steps, and environment details - Feature Request template with problem statement, solution, and priority - General Issue template for questions that don't fit other categories - Config to enable blank issues and provide contact links to documentation and discussions Templates use YAML forms for better structure and validation of required fields. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: unify profile management across the application (#432) This commit addresses long-standing profile inconsistency issues by establishing `~/.hermes/active_profile` file as the single source of truth for all profile operations throughout the application. ## Changes ### Backend (Server) **1. profiles.ts - Enhanced profile switching** - Switch from CLI polling to direct file verification (Hermes CLI writes synchronously) - Verify `active_profile` file with quick retry (max 2 attempts × 100ms = 300ms) - Update GatewayManager only after file verification succeeds - Add comprehensive logging for debugging **2. profiles.ts - Authoritative API responses** - Override CLI's active flag with `active_profile` file in `list()` endpoint - Add warning when CLI output differs from file (detects inconsistencies) - Ensures API responses always match actual runtime state **3. jobs.ts - Use authoritative profile source** - `resolveProfile()` falls back to `getActiveProfileName()` when no profile in request - Ensures jobs operate on correct profile even if frontend doesn't specify **4. cron-history.ts - Fix run history to respect active profile** - Changed from fixed `~/.hermes/cron/output/` to `getActiveProfileDir()/cron/output/` - Run history now correctly switches with profile (e.g., `~/.hermes/profiles/hermes/cron/output/`) **5. proxy-handler.ts - Add fallback to authoritative source** - If no profile in request headers/query, read from `getActiveProfileName()` - Prevents proxy from using wrong default profile ### Frontend (Client) **1. api/client.ts - Simplified profile resolution** - Prioritize `useProfilesStore().activeProfileName` over localStorage - localStorage fallback only for early initialization **2. api/hermes/chat.ts - Consistent profile resolution** - Same pattern: store first, localStorage fallback only during init **3. stores/session-browser-prefs.ts - Clean up fallback logic** - Prioritize store, remove redundant localStorage read ## Problem Solved Previously, multiple components had different ways of determining the active profile: - CLI output (◆ marker) - could be stale - GatewayManager memory - startup cache only - localStorage - frontend cache - Various fallbacks scattered across codebase This caused inconsistencies where: - Frontend showed one profile but API used another - Jobs ran on wrong profile - Run history displayed wrong data - Profile switches appeared to fail (but actually succeeded) ## Solution All components now derive the active profile from the same authoritative source: - `~/.hermes/active_profile` file (written synchronously by `hermes profile use`) - `getActiveProfileName()` function (reads the file) - Single source of truth = no inconsistencies Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add v0.5.9 changelog entries (#434) - Add unified profile management across the application - Add GitHub issue and pull request templates Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
803 lines
40 KiB
TypeScript
803 lines
40 KiB
TypeScript
export default {
|
||
// ログイン
|
||
login: {
|
||
title: 'Hermes Web UI',
|
||
description: 'アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。',
|
||
placeholder: 'アクセストークン',
|
||
submit: 'ログイン',
|
||
tokenRequired: 'アクセストークンを入力してください',
|
||
invalidToken: '無効なトークンです',
|
||
connectionFailed: 'サーバーに接続できません',
|
||
passwordLogin: 'パスワード',
|
||
tokenLogin: 'トークン',
|
||
usernamePlaceholder: 'ユーザー名',
|
||
passwordPlaceholder: 'パスワード',
|
||
credentialsRequired: 'ユーザー名とパスワードを入力してください',
|
||
invalidCredentials: 'ユーザー名またはパスワードが正しくありません',
|
||
passwordMismatch: 'パスワードが一致しません',
|
||
passwordTooShort: 'パスワードは6文字以上必要です',
|
||
setupSuccess: 'パスワードログインが設定されました',
|
||
passwordChanged: 'パスワードが変更されました',
|
||
passwordRemoved: 'パスワードログインが削除されました',
|
||
setupPassword: 'パスワードログインを設定',
|
||
changePassword: 'パスワードを変更',
|
||
changeUsername: 'ユーザー名を変更',
|
||
removePasswordLogin: '削除',
|
||
username: 'ユーザー名',
|
||
currentPassword: '現在のパスワード',
|
||
newPassword: '新しいパスワード',
|
||
confirmPassword: 'パスワード確認',
|
||
newUsername: '新しいユーザー名',
|
||
usernameChanged: 'ユーザー名が変更されました',
|
||
usernameTooShort: 'ユーザー名は2文字以上必要です',
|
||
setupDescription: 'ユーザー名とパスワードを設定して、簡単にログインできるようにします。アクセストークンは引き続きバックアップとして使用できます。',
|
||
removeConfirm: 'パスワードログインを削除しますか?アクセストークンを使用してログインする必要があります。',
|
||
passwordLoginNotConfigured: 'パスワードログイン未設定',
|
||
passwordLoginConfigured: 'パスワードログイン有効({username})',
|
||
},
|
||
|
||
// 共通
|
||
common: {
|
||
loading: '読み込み中...',
|
||
cancel: 'キャンセル',
|
||
retry: '再試行',
|
||
delete: '削除',
|
||
edit: '編集',
|
||
save: '保存',
|
||
saved: '保存しました',
|
||
update: '更新',
|
||
create: '作成',
|
||
saveFailed: '保存に失敗しました',
|
||
deleteFailed: '削除に失敗しました',
|
||
ok: 'OK',
|
||
copied: 'コピーしました',
|
||
copy: 'コピー',
|
||
noData: 'データがありません',
|
||
fetch: '取得',
|
||
add: '追加',
|
||
enable: '有効化',
|
||
disable: '無効化',
|
||
configured: '設定済み',
|
||
notConfigured: '未設定',
|
||
confirm: '確認',
|
||
expand: '展開',
|
||
collapse: '折りたたむ',
|
||
},
|
||
|
||
// サイドバー
|
||
sidebar: {
|
||
chat: 'チャット',
|
||
search: '検索',
|
||
history: '履歴',
|
||
jobs: 'ジョブ',
|
||
models: 'モデル',
|
||
profiles: 'プロファイル',
|
||
skills: 'スキル',
|
||
memory: 'メモリ',
|
||
logs: 'ログ',
|
||
usage: '使用量',
|
||
channels: 'チャンネル',
|
||
terminal: 'ターミナル',
|
||
files: 'ファイル',
|
||
groupChat: 'グループチャット',
|
||
groupConversation: '会話',
|
||
settings: '設定',
|
||
connected: '接続済み',
|
||
disconnected: '未接続',
|
||
updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください',
|
||
updateVersion: 'v{version} にアップグレード',
|
||
updating: '更新中...',
|
||
updateSuccess: '更新が完了しました。サーバーを再起動してください',
|
||
updateFailed: '更新に失敗しました',
|
||
logout: 'ログアウト',
|
||
nodeVersionWarning: 'Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。',
|
||
changelog: '更新履歴',
|
||
noChangelog: '更新履歴はありません',
|
||
},
|
||
|
||
// ドロワー
|
||
drawer: {
|
||
terminal: 'ターミナル',
|
||
files: 'ワークスペース',
|
||
},
|
||
|
||
// チャット
|
||
chat: {
|
||
contextRemaining: '残り',
|
||
emptyState: 'Hermes Agent と会話を開始しましょう',
|
||
inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)',
|
||
attachFiles: 'ファイルを添付',
|
||
stop: '停止',
|
||
send: '送信',
|
||
contextUsed: 'コンテキスト使用量:',
|
||
sessions: 'セッション',
|
||
webUiSessions: 'Web UI/API Server セッション',
|
||
sessionScopeHint: 'チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。',
|
||
openHistory: '履歴を開く',
|
||
hermesHistory: 'Hermes 履歴',
|
||
historyScopeHint: 'ソース別にグループ化された Hermes 履歴セッションを読み取り専用で表示します。',
|
||
noSessions: 'セッションがありません',
|
||
newChat: '新しいチャット',
|
||
deleteSession: 'このセッションを削除しますか?',
|
||
sessionDeleted: 'セッションを削除しました',
|
||
rename: '名前変更',
|
||
pin: 'ピン留め',
|
||
unpin: 'ピン留め解除',
|
||
pinned: 'ピン留め',
|
||
chatMode: 'チャット',
|
||
liveMode: 'ライブ',
|
||
liveSessions: 'ライブセッション',
|
||
recentBadge: '最近',
|
||
linkedSessions: '{count} 件の関連',
|
||
noVisibleMessages: '人間向けに表示できるメッセージはありません。',
|
||
monitorRoleUser: 'ユーザー',
|
||
monitorRoleAssistant: 'アシスタント',
|
||
copySessionId: 'セッション ID をコピー',
|
||
renamed: '名前を変更しました',
|
||
renameFailed: '名前の変更に失敗しました',
|
||
renameSession: 'セッション名の変更',
|
||
sessionNotFound: 'セッションが見つかりません',
|
||
enterNewTitle: '新しいタイトルを入力',
|
||
other: 'その他',
|
||
runFailed: '実行に失敗しました',
|
||
error: 'エラー',
|
||
tool: 'ツール',
|
||
arguments: '引数',
|
||
result: '結果',
|
||
truncated: '... (省略)',
|
||
executionDuration: 'Execution time', thinkingLabel: '思考過程',
|
||
thinkingInProgress: '思考中…',
|
||
thinkingShow: '思考過程を表示',
|
||
thinkingHide: '思考過程を隠す',
|
||
thinkingDuration: '観測 {duration}',
|
||
thinkingChars: '{count} 文字',
|
||
copyBubble: 'メッセージをコピー',
|
||
copiedBubble: 'コピーしました',
|
||
copyFailed: 'コピーに失敗しました',
|
||
playSpeech: '音声を読み上げ',
|
||
pauseSpeech: '一時停止',
|
||
resumeSpeech: '再開',
|
||
stopSpeech: '停止',
|
||
speechNotSupported: 'このブラウザは音声読み上げをサポートしていません',
|
||
},
|
||
|
||
// スケジュールジョブ
|
||
jobs: {
|
||
title: 'スケジュールジョブ',
|
||
createJob: 'ジョブを作成',
|
||
editJob: 'ジョブを編集',
|
||
noJobs: 'スケジュールジョブがありません。作成して始めましょう。',
|
||
name: '名前',
|
||
namePlaceholder: 'ジョブ名',
|
||
schedule: 'スケジュール (Cron 式)',
|
||
schedulePlaceholder: '例: 0 9 * * *',
|
||
quickPresets: 'クイックプリセット',
|
||
selectPreset: 'プリセットを選択...',
|
||
presetEveryMinute: '毎分',
|
||
presetEvery5Min: '5分ごと',
|
||
presetEveryHour: '毎時',
|
||
presetEveryDay: '毎日 00:00',
|
||
presetEveryDay9: '毎日 09:00',
|
||
presetEveryMonday: '毎週月曜 09:00',
|
||
presetEveryMonth: '毎月1日 09:00',
|
||
prompt: 'プロンプト',
|
||
promptPlaceholder: '実行するプロンプト',
|
||
deliverTarget: '配信先',
|
||
origin: '配信元',
|
||
local: 'ローカル',
|
||
repeatCount: '繰り返し回数(任意)',
|
||
modelPlaceholder: 'Default model',
|
||
repeatPlaceholder: '空白の場合は無制限',
|
||
jobCreated: 'ジョブを作成しました',
|
||
jobUpdated: 'ジョブを更新しました',
|
||
nameRequired: '名前は必須です',
|
||
scheduleRequired: 'スケジュールは必須です',
|
||
loadFailed: 'ジョブの読み込みに失敗しました',
|
||
jobPaused: 'ジョブを一時停止しました',
|
||
jobResumed: 'ジョブを再開しました',
|
||
jobTriggered: 'ジョブをトリガーしました',
|
||
modelUpdated: 'Model updated',
|
||
jobDeleted: 'ジョブを削除しました',
|
||
status: {
|
||
running: '実行中',
|
||
paused: '一時停止',
|
||
disabled: '無効',
|
||
scheduled: 'スケジュール済み',
|
||
},
|
||
info: {
|
||
model: 'Model',
|
||
schedule: 'Schedule',
|
||
lastRun: '前回実行',
|
||
nextRun: '次回実行',
|
||
deliver: '配信',
|
||
repeat: '繰り返し',
|
||
},
|
||
action: {
|
||
pause: '一時停止',
|
||
pauseJob: 'ジョブを一時停止',
|
||
resume: '再開',
|
||
resumeJob: 'ジョブを再開',
|
||
runNow: '今すぐ実行',
|
||
triggerImmediately: 'すぐにトリガー',
|
||
},
|
||
runHistory: {
|
||
title: '実行履歴',
|
||
runs: '件',
|
||
noRuns: '実行履歴がありません。',
|
||
},
|
||
},
|
||
|
||
// スキル
|
||
skills: {
|
||
title: 'スキル',
|
||
searchPlaceholder: 'スキルを検索...',
|
||
noMatch: '検索に一致するスキルがありません',
|
||
noSkills: 'スキルがありません',
|
||
backTo: '戻る',
|
||
attachedFiles: '添付ファイル',
|
||
loadFailed: 'スキルの読み込みに失敗しました',
|
||
fileLoadFailed: 'ファイルの読み込みに失敗しました',
|
||
modified: 'ユーザー変更あり',
|
||
archived: 'アーカイブ済み',
|
||
pinned: 'ピン留め',
|
||
pin: 'スキルをピン留め',
|
||
unpin: 'ピン留めを解除',
|
||
pinFailed: 'ピン留め状態の変更に失敗しました',
|
||
toggleFailed: 'スキルの切り替えに失敗しました',
|
||
source: {
|
||
builtin: '組み込み',
|
||
hub: 'Hub',
|
||
local: 'ローカル',
|
||
},
|
||
},
|
||
|
||
// メモリ
|
||
memory: {
|
||
title: 'メモリ',
|
||
refresh: '更新',
|
||
loadFailed: 'メモリの読み込みに失敗しました',
|
||
myNotes: 'メモ',
|
||
noNotes: 'メモはまだありません。',
|
||
notesPlaceholder: 'メモを入力...',
|
||
userProfile: 'ユーザープロファイル',
|
||
noProfile: 'プロファイルはまだありません。',
|
||
profilePlaceholder: 'プロファイルを入力...',
|
||
soul: 'ソウル',
|
||
noSoul: 'ソウル設定はまだありません。',
|
||
soulPlaceholder: 'ソウル設定を入力...',
|
||
},
|
||
|
||
// モデル
|
||
models: {
|
||
title: 'モデル',
|
||
addProvider: 'プロバイダーを追加',
|
||
providerType: 'プロバイダー種別',
|
||
preset: 'プリセット',
|
||
custom: 'カスタム',
|
||
selectProvider: 'プロバイダーを選択',
|
||
chooseProvider: 'プロバイダーを選択...',
|
||
name: '名前',
|
||
autoGeneratedName: 'ベース URL から自動生成',
|
||
baseUrl: 'ベース URL',
|
||
region: 'リージョン',
|
||
regionIntl: 'インターナショナル',
|
||
regionCn: '中国本土',
|
||
baseUrlPlaceholder: '例: https://api.example.com/v1',
|
||
apiKey: 'API キー',
|
||
apiKeyPlaceholder: 'sk-...',
|
||
defaultModel: 'デフォルトモデル',
|
||
selectOrInput: 'モデルを選択または入力...',
|
||
selectModel: 'モデルを選択...',
|
||
providerAdded: 'プロバイダーを追加しました',
|
||
providerDeleted: 'プロバイダーを削除しました',
|
||
deleteProvider: 'プロバイダーを削除',
|
||
deleteConfirm: '「{name}」を削除しますか?',
|
||
codexLoginTitle: 'OpenAI Codex ログイン',
|
||
codexWaiting: '認証ページで以下のコードを入力してログインしてください:',
|
||
codexCopyCode: 'コードをコピーしました',
|
||
codexOpenLink: '認証ページを開く',
|
||
codexApproved: 'ログイン成功',
|
||
codexExpired: '認証の有効期限が切れました。もう一度お試しください。',
|
||
nousLoginTitle: 'Nous Portal ログイン',
|
||
nousWaiting: '認証ページでこのコードを入力してください:',
|
||
nousCopyCode: 'コードをコピーしました',
|
||
nousOpenLink: '認証ページを開く',
|
||
nousApproved: 'ログイン成功',
|
||
nousDenied: '認証が拒否されました',
|
||
nousExpired: '認証の有効期限が切れました',
|
||
copilotLoginTitle: 'GitHub Copilot ログイン',
|
||
copilotWaiting: 'GitHub を開き、以下のデバイスコードを入力して認証してください。承認後、ウィンドウは自動的に閉じます。',
|
||
copilotCopyCode: 'コードをコピーしました',
|
||
copilotOpenLink: 'GitHub 認証ページを開く',
|
||
copilotApproved: 'ログインに成功しました!',
|
||
copilotDenied: '認証が拒否されました。',
|
||
copilotExpired: '認証リンクの有効期限が切れました。もう一度お試しください。',
|
||
copilotAddDetectedTitle: 'GitHub Copilot を検出しました',
|
||
copilotAddDetected: 'このマシンで GitHub Copilot OAuth トークンを検出しました。「追加」をクリックして Hermes で Copilot を有効化します。',
|
||
copilotAddSourceEnv: 'ソース: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
|
||
copilotAddSourceGhCli: 'ソース: gh CLI (gh auth token)',
|
||
copilotAddSourceAppsJson: 'ソース: VS Code Copilot 拡張機能 (apps.json)',
|
||
copilotDeleteHintEnv: 'この操作で ~/.hermes/.env の COPILOT_GITHUB_TOKEN を消去します。他のツールには影響しません。',
|
||
copilotDeleteHintGhCli: 'Copilot は Hermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。',
|
||
copilotDeleteHintAppsJson: 'Copilot は Hermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。',
|
||
customBadge: 'カスタム',
|
||
previewBadge: 'プレビュー',
|
||
disabledBadge: '利用不可',
|
||
disabledTooltip: "このモデルは現在のアカウントでは利用できません。",
|
||
customModelPlaceholder: 'カスタムモデル名',
|
||
customModelHint: 'Enterで読み込み',
|
||
noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。',
|
||
builtIn: '組み込み',
|
||
customType: 'カスタム',
|
||
provider: 'プロバイダー',
|
||
contextLength: 'コンテキスト長',
|
||
contextLengthPlaceholder: '例: 200000(任意)',
|
||
local: 'ローカル ({host})',
|
||
selectProviderRequired: 'プロバイダーを選択してください',
|
||
baseUrlRequired: 'ベース URL は必須です',
|
||
apiKeyRequired: 'API キーは必須です',
|
||
modelRequired: 'デフォルトモデルは必須です',
|
||
enterBaseUrl: 'ベース URL を先に入力してください',
|
||
unexpectedFormat: '予期しないレスポンス形式です',
|
||
foundModels: '{count} 個のモデルが見つかりました',
|
||
fetchFailed: 'モデルの取得に失敗しました',
|
||
},
|
||
|
||
// プロファイル
|
||
profiles: {
|
||
title: 'プロファイル',
|
||
create: 'プロファイルを作成',
|
||
import: 'インポート',
|
||
export: 'エクスポート',
|
||
rename: '名前変更',
|
||
delete: '削除',
|
||
switchTo: '切り替え',
|
||
switchConfirm: 'プロファイル「{name}」に切り替えるとゲートウェイが再起動されます。続行しますか?',
|
||
switchSuccess: 'プロファイル「{name}」に切り替えました',
|
||
switchFailed: 'プロファイルの切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。',
|
||
createSuccess: 'プロファイル「{name}」を作成しました',
|
||
createFailed: 'プロファイルの作成に失敗しました',
|
||
renameSuccess: 'プロファイル名を変更しました',
|
||
renameFailed: 'プロファイル名の変更に失敗しました',
|
||
deleteConfirm: 'プロファイル「{name}」を削除しますか?',
|
||
deleteSuccess: 'プロファイルを削除しました',
|
||
deleteFailed: 'プロファイルの削除に失敗しました',
|
||
exportSuccess: 'プロファイルをエクスポートしました',
|
||
exportFailed: 'プロファイルのエクスポートに失敗しました',
|
||
importSuccess: 'プロファイルをインポートしました',
|
||
importFailed: 'プロファイルのインポートに失敗しました',
|
||
importSelectFile: 'アーカイブファイルを選択',
|
||
importInvalidFile: '有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)',
|
||
name: 'プロファイル名',
|
||
namePlaceholder: '英数字、ハイフンのみ',
|
||
nameValidation: 'プロファイル名には小文字、数字、アンダースコア、ハイフンのみ使用できます',
|
||
newName: '新しい名前',
|
||
newNamePlaceholder: '新しい名前を入力',
|
||
cloneFromCurrent: '現在のプロファイルから複製',
|
||
cloneCleanupNotice: '複製時、独占型プラットフォーム認証情報(Weixin / Telegram / Slack など)は自動的にスキップされ、ソースプロファイルとの競合を回避します',
|
||
cloneStrippedCredentials: '{count} 件の独占認証情報を削除しました:{list}',
|
||
cloneDisabledPlatforms: '{count} 個のプラットフォームを無効化しました:{list}',
|
||
cloneStrippedConfigCredentials: 'config.yaml から {count} 件の埋め込み認証情報を削除しました:{list}',
|
||
archivePath: 'アーカイブパス',
|
||
archivePathPlaceholder: 'アーカイブファイルのサーバーパス',
|
||
importName: 'プロファイル名(任意)',
|
||
importNamePlaceholder: '空白の場合はアーカイブ名を使用',
|
||
active: 'アクティブ',
|
||
model: 'モデル',
|
||
gateway: 'ゲートウェイ',
|
||
alias: 'エイリアス',
|
||
provider: 'プロバイダー',
|
||
path: 'パス',
|
||
skills: 'スキル',
|
||
hasEnv: '.env あり',
|
||
hasSoulMd: 'soul.md あり',
|
||
noProfiles: 'プロファイルがありません。作成して始めましょう。',
|
||
},
|
||
|
||
// ログ
|
||
logs: {
|
||
title: 'ログ',
|
||
all: 'すべて',
|
||
searchPlaceholder: '検索...',
|
||
refresh: '更新',
|
||
noEntries: 'ログエントリがありません',
|
||
},
|
||
|
||
// 設定
|
||
settings: {
|
||
title: '設定',
|
||
saved: '保存しました',
|
||
saveFailed: '保存に失敗しました',
|
||
tabs: {
|
||
display: '表示',
|
||
account: 'アカウント',
|
||
agent: 'エージェント',
|
||
memory: 'メモリ',
|
||
session: 'セッション',
|
||
privacy: 'プライバシー',
|
||
apiServer: 'API サーバー',
|
||
},
|
||
display: {
|
||
streaming: 'ストリームレスポンス',
|
||
streamingHint: 'AI の返信をリアルタイムで表示',
|
||
compact: 'コンパクトモード',
|
||
compactHint: 'メッセージの間隔を狭める',
|
||
showReasoning: '推論過程を表示',
|
||
showReasoningHint: 'モデルの思考プロセスを表示',
|
||
showCost: 'コストを表示',
|
||
showCostHint: '返信にトークン使用量を表示',
|
||
inlineDiffs: 'インライン差分',
|
||
inlineDiffsHint: 'コード変更をインラインで表示',
|
||
bellOnComplete: '完了通知音',
|
||
bellOnCompleteHint: 'AI の応答完了時に通知音を再生',
|
||
busyInputMode: '処理中入力モード',
|
||
busyInputModeHint: 'AI 処理中でも入力を許可',
|
||
theme: 'テーマ',
|
||
themeHint: 'ライト、ダーク、またはシステム設定に従う',
|
||
themeLight: 'ライト',
|
||
themeDark: 'ダーク',
|
||
themeSystem: 'システム',
|
||
},
|
||
agent: {
|
||
maxTurns: '最大ターン数',
|
||
maxTurnsHint: '1回の会話の最大インタラクション回数',
|
||
gatewayTimeout: 'ゲートウェイタイムアウト',
|
||
gatewayTimeoutHint: 'リクエストタイムアウト(秒)',
|
||
restartDrainTimeout: '再起動ドレインタイムアウト',
|
||
restartDrainTimeoutHint: '再起動前のドレインタイムアウト(秒)',
|
||
toolEnforcement: 'ツール実行ポリシー',
|
||
toolEnforcementHint: 'ツール呼び出しの実行モードを制御',
|
||
auto: '自動',
|
||
always: '常に',
|
||
never: 'しない',
|
||
},
|
||
memory: {
|
||
enabled: 'メモリを有効化',
|
||
enabledHint: 'AI に会話コンテキストを記憶させる',
|
||
userProfile: 'ユーザープロファイル',
|
||
userProfileHint: 'AI にユーザーの設定を記憶させる',
|
||
charLimit: 'メモリ文字数上限',
|
||
charLimitHint: 'MEMORY.md の最大文字数',
|
||
userCharLimit: 'ユーザープロファイル文字数上限',
|
||
userCharLimitHint: 'USER.md の最大文字数',
|
||
},
|
||
session: {
|
||
mode: 'リセットモード',
|
||
modeHint: 'セッションリセットのトリガー条件',
|
||
modeBoth: 'アイドル + スケジュール',
|
||
modeIdle: 'アイドルのみ',
|
||
modeHourly: 'スケジュールのみ',
|
||
idleMinutes: 'アイドルタイムアウト',
|
||
idleMinutesHint: '自動リセットまでの待機時間(分)',
|
||
atHour: 'スケジュールリセット時刻',
|
||
humanOnly: '人間のセッションのみ表示',
|
||
humanOnlyHint: 'サブエージェントやセッション監視ノイズを既定で隠します',
|
||
liveMonitorHumanOnly: 'ライブモニター: 人間のセッションのみ表示',
|
||
liveMonitorHumanOnlyHint: 'ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します',
|
||
atHourHint: '毎日指定時刻にセッションをリセット',
|
||
},
|
||
privacy: {
|
||
redactPii: '個人情報のマスキング',
|
||
redactPiiHint: '機密情報を自動検出して隠す(パスワード、キーなど)',
|
||
},
|
||
apiServer: {
|
||
enable: '有効化',
|
||
enableHint: 'API サーバーを有効にする',
|
||
host: 'ホスト',
|
||
hostHint: 'リッスンアドレス',
|
||
port: 'ポート',
|
||
portHint: 'リッスンポート',
|
||
key: 'キー',
|
||
keyHint: 'API アクセスキー',
|
||
cors: 'CORS 許可元',
|
||
corsHint: '許可するクロスオリジン',
|
||
},
|
||
},
|
||
|
||
// プラットフォームチャンネル設定
|
||
platform: {
|
||
requireMention: "メンションが必要",
|
||
requireMentionGroup: "グループで応答するには {'@'}メンションが必要",
|
||
requireMentionChannel: "チャンネルで応答するには {'@'}メンションが必要",
|
||
requireMentionRoom: "ルームで応答するには {'@'}メンションが必要",
|
||
reactions: 'リアクション',
|
||
reactionsHint: 'メッセージに絵文字でリアクションする',
|
||
freeResponseChats: '自由応答チャット',
|
||
freeResponseChatsHint: "{'@'}メンションなしで応答するチャット ID(カンマ区切り)",
|
||
freeResponseChannels: '自由応答チャンネル',
|
||
freeResponseChannelsHint: "{'@'}メンションなしで応答するチャンネル ID(カンマ区切り)",
|
||
freeResponseRooms: '自由応答ルーム',
|
||
freeResponseRoomsHint: "{'@'}メンションなしで応答するルーム ID(カンマ区切り)",
|
||
mentionPatterns: 'カスタムメンションパターン',
|
||
mentionPatternsHint: '追加のトリガーパターン',
|
||
autoThread: '自動スレッド',
|
||
autoThreadHint: "{'@'}メンション後に自動で返信スレッドを作成",
|
||
autoThreadHintRoom: 'ルームで自動的に返信スレッドを作成',
|
||
dmMentionThreads: 'DM メンションスレッド',
|
||
dmMentionThreadsHint: 'DM 内のメンションにスレッド返信を使用',
|
||
allowBots: 'ボットメッセージを許可',
|
||
allowBotsHint: '他のボットからのメッセージに応答する',
|
||
allowedChannels: '許可チャンネル',
|
||
allowedChannelsHint: 'ホワイトリストのチャンネル ID(カンマ区切り)',
|
||
ignoredChannels: '除外チャンネル',
|
||
ignoredChannelsHint: 'ボットが応答しないチャンネル ID(カンマ区切り)',
|
||
noThreadChannels: 'スレッドなしチャンネル',
|
||
noThreadChannelsHint: 'スレッドなしで応答するチャンネル ID(カンマ区切り)',
|
||
exclusiveTokenWarning: 'このプラットフォームは排他的トークンロックを使用します。各プロファイルは他のプロファイルと競合しないように、異なる ID トークンを使用する必要があります。',
|
||
botToken: 'ボットトークン',
|
||
botTokenHint: '開発者ポータルから取得したボットトークン',
|
||
accessToken: 'アクセストークン',
|
||
accessTokenHint: 'Matrix アクセストークン',
|
||
homeserver: 'Homeserver URL',
|
||
homeserverHint: 'Matrix ホームサーバー URL',
|
||
appId: 'App ID',
|
||
appIdHint: 'Feishu App ID',
|
||
appSecret: 'App Secret',
|
||
appSecretHint: 'Feishu App Secret',
|
||
clientId: 'Client ID',
|
||
clientIdHint: 'DingTalk Client ID',
|
||
clientSecret: 'Client Secret',
|
||
clientSecretHint: 'DingTalk Client Secret',
|
||
botId: 'Bot ID',
|
||
botIdHint: 'WeCom Bot ID',
|
||
wecomSecretHint: 'WeCom Bot Secret',
|
||
waEnabled: 'WhatsApp を有効化',
|
||
waEnabledHint: 'QR コードペアリングで WhatsApp を有効にする',
|
||
weixinToken: 'Weixin トークン',
|
||
weixinTokenHint: 'weixin CLI の QR ログインから取得 (hermes weixin)',
|
||
accountId: 'Account ID',
|
||
accountIdHint: 'Weixin アカウント ID',
|
||
qrLogin: 'QR ログイン',
|
||
qrRelogin: '再ログイン',
|
||
qrFetching: 'QR コードを取得中...',
|
||
qrScanHint: 'WeChat でスキャンしてログイン',
|
||
qrScanedHint: 'スキャン済み、スマートフォンで確認してください...',
|
||
},
|
||
|
||
// 言語
|
||
language: {
|
||
label: '言語',
|
||
zh: '中文',
|
||
en: 'English',
|
||
ja: '日本語',
|
||
},
|
||
|
||
// ターミナル
|
||
terminal: {
|
||
sessions: 'セッション',
|
||
newTab: '新しいターミナル',
|
||
closeSession: 'このセッションを閉じますか?',
|
||
sessionExited: '終了しました',
|
||
processExited: 'プロセスが終了しました(コード {code})',
|
||
},
|
||
|
||
// 使用統計
|
||
usage: {
|
||
title: '使用統計',
|
||
refresh: '更新',
|
||
totalTokens: '総トークン数',
|
||
inputTokens: '入力',
|
||
outputTokens: '出力',
|
||
totalSessions: '総セッション数',
|
||
avgPerDay: '1日平均 ~{n}',
|
||
estimatedCost: '推定コスト',
|
||
cacheHitRate: 'キャッシュヒット率',
|
||
modelBreakdown: 'モデル別内訳',
|
||
dailyTrend: '日別使用量(過去30日間)',
|
||
date: '日付',
|
||
tokens: 'トークン',
|
||
cache: 'キャッシュ',
|
||
cacheRead: 'キャッシュ読み取り',
|
||
cacheWrite: 'キャッシュ書き込み',
|
||
sessions: 'セッション',
|
||
cost: 'コスト',
|
||
noData: '使用データがありません',
|
||
},
|
||
|
||
// 更新履歴
|
||
changelog: {
|
||
|
||
new_0_5_6_1: '音声再生機能:Web Speech API使用、手動再生ボタン、自動再生スイッチ、虹色ボーダーアニメーション、モバイル最適化',
|
||
new_0_5_6_2: '堅牢なLLM JSONパーサー:Python形式対応、ストリーミングイベントからのテキスト抽出',
|
||
new_0_5_6_3: 'Skills機能強化:使用統計、ソースフィルター、アーカイブ済みスキル、来歴、ピン留め切替',
|
||
new_0_5_6_4: '日次使用統計の拡張:キャッシュ読み取り/書き込み分離を含む詳細なトークン内訳',
|
||
new_0_5_6_5: 'セッション履歴範囲の明確化:チャットと履歴ビューの説明を改善',
|
||
new_0_5_6_6: 'AnthropicスタイルのContentBlock配列形式(テキスト、画像、ファイル)を使用して添付ファイル処理を再設計',
|
||
new_0_5_6_7: 'ContentBlockおよびMarkdown形式をサポートし、認証付きのフロントエンドファイルダウンロード機能を追加',
|
||
new_0_5_6_8: '重複するnodemonインスタンスを削除し、SQLiteデータベースのリセットを引き起こすマルチプロセス競合を修正',
|
||
new_0_5_9_1: 'アプリケーション全体でプロファイル管理を統一し、一貫したAPIと状態管理を提供',
|
||
new_0_5_9_2: 'より良いコントリビューションワークフローのためにGitHubイシューとプルリクエストテンプレートを追加',
|
||
new_0_5_8_1: 'モバイルサイドバーサポートとカスタマイズ可能なレインボーボタン付きドロワーパネルを追加',
|
||
new_0_5_8_2: 'プロファイル切り替え状態同期問題を修正し、UIを即座に更新してバックエンドを検証',
|
||
new_0_5_8_3: '音声合成を改善するため、音声再生の特殊文字と絵文字をフィルタリング',
|
||
new_0_5_8_4: '不足しているi18nキーを追加し、セッションデータソースを統一してデータベースを優先',
|
||
new_0_5_8_5: 'esbuildとチャンク分割を使用してDockerビルドを高速化するためにViteビルド設定を最適化',
|
||
new_0_5_7_1: 'リッチコンテンツ(画像、ファイル)をサポートするためのコンテキスト圧縮を最適化し、ツールメッセージ処理を改善',
|
||
new_0_5_7_2: 'バッチ挿入とトランザクション保護でデータ整合性を確保しながらセッション同期を改善',
|
||
new_0_5_7_3: '実行間で正確なトークン追跡を確保するため、usage.updatedイベントの受信を修正',
|
||
new_0_5_5_1: '🎉 労働者の日!今日はお休みです、何卒ご理解ください',
|
||
new_0_5_5_2: 'Hermesセッション履歴ページを追加',
|
||
new_0_5_5_3: '履歴ページはアクティブチャットに干渉せずにセッション管理',
|
||
new_0_5_5_4: '履歴ページは最初のCLIセッションを自動選択',
|
||
new_0_5_5_5: 'HistoryMessageListコンポーネントを追加',
|
||
new_0_5_5_6: '空のメッセージとtoolNameなしのtoolメッセージをフィルタリング',
|
||
new_0_5_5_7: 'localStorageセッションキャッシュを削除、バックエンドから直接取得',
|
||
new_0_5_5_8: 'プロフィール切り替えを最適化',
|
||
new_0_5_4_2: 'Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring',
|
||
new_0_5_4_3: 'Fix cron job edit payloads with partial PATCH to support long prompt name-only edits',
|
||
new_0_5_4_4: 'Fix web terminal Hermes CLI availability after Docker deployment',
|
||
new_0_5_4_5: 'Add workspace dialog i18n translations for title and improve session persistence',
|
||
new_0_5_4_6: 'Support code block copy feedback with user notifications',
|
||
new_0_5_4_7: 'Align usage analytics with Hermes state DB schema',
|
||
new_0_5_3_1: 'Improve reasoning process display with persistence across page refreshes',
|
||
new_0_5_3_2: 'Optimize stringified array format parsing to extract thinking/text/tool_calls',
|
||
new_0_5_3_3: 'Improve log display by removing ellipsis and showing full content',
|
||
new_0_5_3_4: 'Add detailed logging for format conversion and parsing',
|
||
new_0_5_3_5: 'Optimize token calculation to accurately include tool results',
|
||
new_0_5_2_1: 'Convert conversation history to Anthropic format before sending to Gateway',
|
||
new_0_5_2_2: 'Add bidirectional reasoning sync between memory and database',
|
||
new_0_5_2_3: 'Add message pagination with DESC query + array reverse for performance',
|
||
new_0_5_2_4: 'Clean up debug code and unused imports',
|
||
new_0_5_2_5: 'Remove auto-resumed event trigger to avoid timing issues',
|
||
new_0_5_2_6: 'Use reasoning field consistently across codebase',
|
||
new_0_5_1_1: 'Auto-sync Hermes history sessions on first startup',
|
||
new_0_5_1_2: 'Fix session sync failure with old Hermes versions (backward compatible)',
|
||
new_0_5_1_3: 'Smart cleanup of exclusive platform credentials on profile clone (Telegram, Discord, Slack, etc.)',
|
||
new_0_5_1_4: 'Auto-normalize profile names to lowercase to avoid backend validation errors',
|
||
new_0_5_1_5: 'Fix tool_call_id missing in tool messages for OpenAI API compatibility',
|
||
new_0_5_1_6: 'Unify SQLite table schema management and initialization',
|
||
new_0_5_1_7: 'Optimize model list layout in Provider cards (fixed height, tag alignment)',
|
||
new_0_5_1_8: 'Fix display issue with single-line long code blocks in user messages',
|
||
new_0_5_1_9: 'Fix web terminal rendering errors in Docker deployment',
|
||
new_0_5_0_1: 'Self-built chat database and context compression: empty chat history on first entry is expected',
|
||
new_0_5_0_2: 'Sessions use WebSocket form, enhanced resume capability',
|
||
new_0_4_8_1: 'Safe Mermaid diagram rendering with async render and timeout fallback',
|
||
new_0_4_8_2: 'Fix nested markdown fence rendering truncation',
|
||
new_0_4_8_3: 'Fix compressed session lineage projection and search',
|
||
new_0_4_8_4: 'Optimize session list N+1 queries and fix search 500 on non-CJK input',
|
||
new_0_4_8_5: 'Fix forced scroll to bottom when switching back from other tabs',
|
||
new_0_4_8_6: 'Smooth session switch with loading transition overlay',
|
||
new_0_4_8_7: 'Fix login token validation using Hermes session endpoint',
|
||
new_0_4_8_8: 'Fix image attachments broken after page refresh (blob URL persistence)',
|
||
new_0_4_8_9: 'Click image attachments to preview in fullscreen overlay',
|
||
new_0_4_8_10: 'Move upload directory from temp to ~/.hermes-web-ui/upload',
|
||
new_0_4_7_1: '思考/推論ブロックのリアルタイムストリーミング表示',
|
||
new_0_4_7_2: 'Dockerビルド時にprepareスクリプトをスキップ',
|
||
new_0_4_7_3: 'グループチャットのモバイルUX改善とUIのブラッシュアップ',
|
||
new_0_4_7_4: 'コンテキスト残りトークン数をマイナスではなく0に制限',
|
||
new_0_4_7_5: 'Alibaba Coding Planビルトインプロバイダーを追加(.env base_urlオーバーライド対応)',
|
||
new_0_4_7_6: '起動時にリモートプロファイルをスキップしてハングを防止',
|
||
new_0_4_7_7: '黙って飲み込まれた実行エラーを検出して表示',
|
||
new_0_4_7_8: 'プロバイダー対応のコンテキスト長さルックアップ',
|
||
new_0_4_7_9: '切り替え時にconfig.modelをリセットしCLIカスタムプロバイダーを解決',
|
||
new_0_4_7_10: 'ビルトインプロバイダー削除時に.envからbase_url_envをクリア',
|
||
new_0_4_7_11: 'グループチャットルームのサイドバー背景をセッションリストに合わせる',
|
||
new_0_4_5_1: 'Add group chat with multi-agent rooms, @mention routing, and typing status recovery',
|
||
new_0_4_5_2: 'Rewrite model-context config to use YAML with context_length setting',
|
||
new_0_4_5_3: 'Add gpt-5.5 to OpenAI Codex model list',
|
||
new_0_4_5_4: 'Replace jobs proxy with local controller and optimize model loading',
|
||
new_0_4_5_5: 'Add i18n support for custom model feature in ModelSelector',
|
||
new_0_4_5_6: 'Fix sidebar i18n missing key warnings',
|
||
new_0_4_5_7: 'Clear all localStorage on logout',
|
||
new_0_4_5_8: 'Add periodic log rotation to prevent unbounded log growth',
|
||
new_0_4_2_1: 'トークン使用量追跡と動的コンテキスト長を追加',
|
||
new_0_4_2_2: 'セッション検索モーダルを追加',
|
||
new_0_4_2_3: 'Socket.IOとSQLiteによるグループチャットシステムを復元',
|
||
new_0_4_2_4: 'チャットページにピン留めセッションとライブモニターを追加',
|
||
new_0_4_2_5: '組み込みプロバイダー検出とモデルマッチングを修正',
|
||
},
|
||
|
||
// ファイル
|
||
files: {
|
||
title: 'ファイル',
|
||
tree: 'ディレクトリツリー',
|
||
list: 'ファイル一覧',
|
||
breadcrumbRoot: 'ホーム',
|
||
newFile: '新規ファイル',
|
||
newFolder: '新規フォルダ',
|
||
upload: 'アップロード',
|
||
refresh: '更新',
|
||
open: '開く',
|
||
edit: '編集',
|
||
preview: 'プレビュー',
|
||
download: 'ダウンロード',
|
||
copyPath: 'パスをコピー',
|
||
rename: '名前の変更',
|
||
delete: '削除',
|
||
name: '名前',
|
||
size: 'サイズ',
|
||
modified: '更新日時',
|
||
actions: '操作',
|
||
emptyDir: '空のディレクトリ',
|
||
loading: '読み込み中...',
|
||
confirmDelete: '「{name}」を削除してもよろしいですか?',
|
||
confirmDeleteDir: 'ディレクトリ「{name}」とそのすべての内容を削除してもよろしいですか?',
|
||
deleteFailed: '削除に失敗しました',
|
||
deleted: '削除しました',
|
||
renameTo: '名前を変更',
|
||
newFileName: 'ファイル名',
|
||
newFolderName: 'フォルダ名',
|
||
created: '作成しました',
|
||
createFailed: '作成に失敗しました',
|
||
renamed: '名前を変更しました',
|
||
renameFailed: '名前の変更に失敗しました',
|
||
uploadSuccess: '{count} 個のファイルをアップロードしました',
|
||
uploadFailed: 'アップロードに失敗しました',
|
||
saveFailed: '保存に失敗しました',
|
||
saved: '保存しました',
|
||
unsavedChanges: '未保存の変更があります。破棄しますか?',
|
||
pathCopied: 'パスをコピーしました',
|
||
fileTooLarge: 'ファイルが大きすぎます(最大10MB)',
|
||
permissionDenied: '保護されたファイルは変更できません',
|
||
notFound: 'ファイルまたはディレクトリが見つかりません',
|
||
backendError: 'ファイル操作に失敗しました',
|
||
dragDropHint: 'ここにファイルをドラッグしてアップロード',
|
||
closeEditor: 'エディタを閉じる',
|
||
closePreview: '閉じる',
|
||
saveFile: '保存',
|
||
},
|
||
|
||
// グループチャット
|
||
groupChat: {
|
||
title: 'グループチャット',
|
||
createRoom: 'ルームを作成',
|
||
joinByCode: 'コードで参加',
|
||
roomName: 'ルーム名',
|
||
roomNamePlaceholder: 'ルーム名を入力',
|
||
inviteCode: '招待コード',
|
||
autoGenerate: '自動生成',
|
||
noRooms: 'ルームがありません',
|
||
selectOrCreate: 'ルームを選択または作成してチャットを開始',
|
||
agents: 'エージェント',
|
||
addAgent: 'エージェントを追加',
|
||
selectProfile: 'プロファイルを選択',
|
||
agentAdded: 'エージェントが追加されました',
|
||
agentAlreadyInRoom: 'このエージェントは既にルームにいます',
|
||
noAgents: 'このルームにエージェントはいません',
|
||
members: 'メンバー',
|
||
roomCreated: 'ルームが作成されました',
|
||
roomDeleted: 'ルームを削除しました',
|
||
deleteRoomConfirm: 'このルームを削除しますか?',
|
||
you: 'あなた',
|
||
joined: 'ルームに参加しました',
|
||
joinFailed: 'ルームへの参加に失敗しました',
|
||
inputPlaceholder: 'メッセージを入力... (Enterで送信)',
|
||
enterCode: '招待コードを入力',
|
||
yourName: 'あなたの名前',
|
||
yourNamePlaceholder: '表示名を入力',
|
||
yourDescription: '自己紹介(任意)',
|
||
yourDescriptionPlaceholder: '自分について教えてください...',
|
||
agentName: 'エージェント名',
|
||
agentNamePlaceholder: 'カスタム名(空欄ならプロファイル名)',
|
||
agentDesc: 'エージェントの説明',
|
||
agentDescPlaceholder: 'このエージェントの役割を説明...',
|
||
agentReplying: 'が返信中...',
|
||
agentCompressing: 'がコンテキストを圧縮中...',
|
||
compressionSettings: '圧縮設定',
|
||
triggerTokens: '圧縮トリガートークン数',
|
||
triggerTokensDesc: 'このトークン数を超えるとコンテキスト圧縮がトリガーされます',
|
||
maxHistoryTokens: '最大履歴トークン数',
|
||
maxHistoryTokensDesc: '圧縮後のLLM送信最大トークン数',
|
||
tailMessageCount: '末尾メッセージ数',
|
||
tailMessageCountDesc: '圧縮後にそのまま保持する最近のメッセージ数',
|
||
compressionConfig: '圧縮設定',
|
||
compressNow: '今すぐ圧縮',
|
||
compressingInProgress: '圧縮中です、お待ちください',
|
||
compressionSaved: '圧縮設定を保存しました',
|
||
},
|
||
|
||
// ダウンロード
|
||
download: {
|
||
downloading: 'ダウンロード中...',
|
||
downloadFailed: 'ダウンロードに失敗しました',
|
||
fileNotFound: 'ファイルが見つからないか削除されています',
|
||
fileTooLarge: 'ファイルが大きすぎます(制限超過)',
|
||
backendError: 'ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります',
|
||
backendTimeout: 'ファイルの読み取りがタイムアウトしました',
|
||
unsupportedBackend: '現在のターミナルバックエンドはファイルのダウンロードに対応していません',
|
||
invalidPath: '無効なファイルパス',
|
||
download: 'ダウンロード',
|
||
downloadFile: 'ファイルをダウンロード',
|
||
},
|
||
}
|