Files
Hermes-ui/packages/client/src/i18n/locales/ja.ts
T
ekko b015e70b9d [codex] fix MCP management lifecycle (#1144)
* feat(mcp): add MCP server management UI

- Server CRUD: add/edit/remove with YAML/JSON Monaco editor
- raw_config passthrough: zero field loss on edit/toggle
- tool_details embedding: single-request card data (1+N → 1)
- Auto-retry exponential backoff (2s→32s, max 5 retries)
- Route safety guards (hasRoute) for dynamic sidebar
- i18n: 9 languages (de/en/es/fr/ja/ko/pt/zh/zh-TW)
- 19 unit tests + 8 UX browser tests
- 35 files, +2933 lines

* fix mcp management lifecycle

---------

Co-authored-by: Crafter-feng <succeed_happu@163.com>
2026-05-30 11:06:08 +08:00

1520 lines
75 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export default {
// ログイン
login: {
title: 'Hermes Web UI',
description: 'ユーザー名とパスワードを入力して続行してください。',
placeholder: 'アクセストークン',
submit: 'ログイン',
tokenRequired: 'アクセストークンを入力してください',
invalidToken: '無効なトークンです',
connectionFailed: 'サーバーに接続できません',
passwordLogin: 'パスワード',
tokenLogin: 'トークン',
usernamePlaceholder: 'ユーザー名',
passwordPlaceholder: 'パスワード',
defaultCredentialsHint: '既定のユーザー名:admin、既定のパスワード:123456',
credentialsRequired: 'ユーザー名とパスワードを入力してください',
invalidCredentials: 'ユーザー名またはパスワードが正しくありません',
tooManyAttempts: 'ログイン試行回数が多すぎます。しばらくしてからお試しください',
lockResetHint: '自分のサーバーの場合は、次のコマンドでログインロックを解除できます:',
defaultLoginResetHint: '既定の admin パスワードをリセットするには、次を実行してください:',
sessionExpired: 'ログインの有効期限が切れました。再度ログインしてください。',
accessDenied: 'このリソースにアクセスする権限がありません。',
passwordMismatch: 'パスワードが一致しません',
passwordTooShort: 'パスワードは6文字以上必要です',
setupSuccess: 'パスワードログインが設定されました',
passwordChanged: 'パスワードが変更されました',
passwordRemoved: 'パスワードログインが削除されました',
setupPassword: 'パスワードログインを設定',
changePassword: 'パスワードを変更',
changeUsername: 'ユーザー名を変更',
removePasswordLogin: '削除',
username: 'ユーザー名',
currentPassword: '現在のパスワード',
newPassword: '新しいパスワード',
confirmPassword: 'パスワード確認',
newUsername: '新しいユーザー名',
usernameChanged: 'ユーザー名が変更されました',
usernameTooShort: 'ユーザー名は2文字以上必要です',
setupDescription: 'ログインに使用するユーザー名とパスワードを管理します。',
removeConfirm: 'ユーザーアカウントにはパスワードログインが必要です。',
passwordLoginNotConfigured: 'パスワードログイン未設定',
passwordLoginConfigured: '現在のアカウント:{username}',
defaultCredentialTitle: '既定のアカウント情報を変更してください',
defaultCredentialMessage: '現在のログインアカウントは、既定のユーザー名または既定のパスワードをまだ使用しています。不正アクセスを防ぐため、できるだけ早く現在のアカウントでユーザー名とパスワードを変更してください。',
defaultCredentialAction: '変更する',
defaultCredentialLater: '後で通知',
},
users: {
title: 'アカウント管理',
description: 'ユーザーを作成し、ロールを割り当て、通常管理者がアクセスできるプロファイルを制御します。',
create: 'ユーザー作成',
edit: 'ユーザー編集',
username: 'ユーザー名',
role: 'ロール',
statusLabel: 'ステータス',
profiles: 'アクセス可能なプロファイル',
profilesPlaceholder: 'アクセス可能なプロファイルを選択',
allProfiles: 'すべてのプロファイル',
noProfiles: 'プロファイル未割り当て',
lastLogin: '最終ログイン',
newPasswordOptional: '新しいパスワード(空欄なら変更なし)',
loadFailed: 'ユーザー一覧の読み込みに失敗しました',
deleteConfirm: 'このユーザーを削除しますか?',
enable: '有効化',
disable: '無効化',
roles: {
superAdmin: 'スーパー管理者',
admin: '管理者',
},
status: {
active: '有効',
disabled: '無効',
},
},
// 共通
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: '折りたたむ',
stop: '停止',
start: '開始',
expired: '期限切れ',
},
// サイドバー
// MCP 管理
mcp: {
title: 'MCP サーバー',
loadFailed: 'MCP サーバーの読み込みに失敗しました',
reloadAll: 'すべて再読み込み',
refresh: '更新',
total: '合計',
connected: '接続済み',
disconnected: '未接続',
tools: 'ツール',
tool: 'ツール',
searchPlaceholder: 'サーバーを検索...',
addServer: '+ サーバーを追加',
zeroTools: '0 個のツール',
loading: '読み込み中...',
empty: 'MCP サーバーが設定されていません',
reloaded: '{server} を再読み込みしました',
reloadedAll: 'すべての MCP サーバーを再読み込みしました',
reloadFailed: '再読み込みに失敗しました',
serverAdded: 'サーバー "{name}" を追加しました',
addFailed: 'サーバーの追加に失敗しました',
serverUpdated: 'サーバー "{name}" を更新しました',
updateFailed: 'サーバーの更新に失敗しました',
saveFailed: '保存に失敗しました',
serverRemoved: '"{name}" を削除しました',
enabled: "有効化: {name}",
disabled: "無効化: {name}",
connectedStatus: '接続済み',
disconnectedStatus: '未接続',
disabledStatus: '無効',
toolList: 'ツール一覧',
count: ' ',
more: '件',
removeFailed: 'サーバーの削除に失敗しました',
testOk: 'テスト成功 — {count} 個のツールが利用可能',
testEmpty: 'テスト結果にツールがありません',
testFailed: 'テストに失敗しました',
edit: '編集',
test: 'テスト',
reload: '再読み込み',
remove: '削除',
confirmRemove: 'サーバー "{name}" を削除しますか?',
cancel: 'キャンセル',
add: '追加',
save: '保存',
addTitle: 'MCP サーバーを追加',
editTitle: 'MCP サーバーを編集',
invalidJson: 'JSON形式エラー',
invalidYaml: 'YAML 形式が無効です',
invalidConfig: '設定形式が無効です',
invalidServerConfig: 'サーバー設定が無効です',
missingCommandOrUrl: 'command または url が必要です',
},
sidebar: {
chat: 'チャット',
search: '検索',
apiRelay: 'APIリレー',
history: '履歴',
jobs: 'ジョブ',
models: 'モデル',
profiles: 'プロファイル',
plugins: 'プラグイン',
mcp: 'MCP',
skills: 'スキル',
memory: 'メモリ',
logs: 'ログ',
usage: '使用量',
performance: 'パフォーマンス',
skillsUsage: 'スキル使用状況',
channels: 'チャンネル',
terminal: 'ターミナル',
files: 'ファイル',
groupChat: 'グループチャット',
groupConversation: '会話',
groupConversationShort: '会話',
groupAgent: 'エージェント',
groupAgentShort: 'エージェント',
groupSystem: 'システム',
groupSystemShort: 'シス',
groupMonitoring: '監視',
groupMonitoringShort: '監視',
settings: '設定',
connected: '接続済み',
disconnected: '未接続',
updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください',
updateVersion: 'v{version} にアップグレード',
reloadClientVersion: 'v{version} に再読み込み',
updating: '更新中...',
updateSuccess: '更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。',
updateFailed: '更新に失敗しました',
logout: 'ログアウト',
nodeVersionWarning: 'Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。',
changelog: '更新履歴',
noChangelog: '更新履歴はありません',
kanban: 'カンバン',
groupTools: 'ツール',
groupToolsShort: "ツール",
codingAgents: "コーディングエージェント",
versionPreview: "バージョンプレビュー",
groupPlatform: 'プラットフォーム',
gateways: 'ゲートウェイ',
expand: 'メニューを展開',
collapse: 'メニューを折りたたむ',
},
performance: {
title: 'パフォーマンス',
subtitle: 'システムリソース、Bridge Broker、Workers、アクティブセッションを確認',
refresh: '更新',
autoRefreshOn: '自動更新',
autoRefreshOff: '手動更新',
loadFailed: 'パフォーマンスデータの読み込みに失敗しました',
systemCpu: 'システム CPU',
systemMemory: 'システムメモリ',
activeSessions: 'アクティブセッション',
runningSessions: '実行中 {count}',
workers: 'Workers',
totalWorkerMemory: 'Worker 合計メモリ',
processes: 'プロセス',
uptime: '稼働時間',
running: '実行中',
stopped: '停止',
workerMemory: 'Worker メモリ',
lastUpdated: '更新時刻',
profile: 'Profile',
memory: 'メモリ',
sessions: 'セッション',
runningActiveSessions: '実行中 / アクティブ',
lastUsed: '最終使用',
status: '状態',
noWorkers: 'Worker はありません',
sessionsByProfile: 'Profile 別セッション',
noActiveSessions: 'アクティブセッションはありません',
},
// ドロワー
drawer: {
terminal: 'ターミナル',
files: 'ワークスペース',
},
// チャット
chat: {
contextRemaining: '残り',
contextClickToEdit: 'クリックしてコンテキスト長を編集',
contextEditTitle: 'コンテキスト長を編集',
contextEditDesc: '現在のモデルのコンテキスト長制限を設定(トークン数)',
contextEditPlaceholder: 'コンテキスト長を入力',
contextEditHint: '一般的な値:256k (Hermes 既定), 128k (GPT-4), 32k (GPT-3.5)',
contextEditSave: '保存',
contextEditCancel: 'キャンセル',
contextEditInvalid: '有効なコンテキスト長を入力してください',
contextEditSuccess: 'コンテキスト長を更新しました',
contextEditFailed: '更新に失敗しました',
emptyState: 'Hermes Agent と会話を開始しましょう',
outlineTitle: '会話アウトライン',
outlineEmpty: '会話内容はありません',
outlineUserQuestion: 'ユーザーの質問',
inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)',
slashCommandArgs: {
message: '<メッセージ>',
title: '<タイトル>',
text: '<テキスト>',
},
slashCommands: {
usage: '現在のセッション使用量を計算',
status: 'セッション状態とキューを表示',
abort: '実行中の Bridge を停止',
queue: '実行中の処理の後ろにメッセージをキュー追加',
plan: 'Markdown の実装計画を作成',
goal: 'Set a standing goal that continues across turns',
goalStatus: 'Show the active goal status',
goalPause: 'Pause the active goal loop',
goalResume: 'Resume the paused goal loop',
goalDone: 'Complete and clear the active goal',
goalClear: 'Clear the active goal',
subgoal: 'Add a criterion to the active goal',
clear: '現在の表示をクリア',
clearHistory: 'このセッションの保存済みメッセージ履歴を削除',
title: 'このセッション名を変更',
compress: 'アイドル時にコンテキスト圧縮を実行',
steer: '実行中の Bridge に誘導テキストを送信',
destroy: 'このセッションの Bridge Agent を解放',
reloadMcp: 'MCP サーバーを再読み込み',
},
attachFiles: 'ファイルを添付',
showToolCalls: 'ツール呼び出しを表示',
hideToolCalls: 'ツール呼び出しを非表示',
messageQueue: 'メッセージキュー',
removeQueuedMessage: 'キューのメッセージを削除',
stop: '停止',
send: '送信',
contextUsed: 'コンテキスト使用量:',
sessions: 'セッション',
webUiSessions: 'セッション',
allProfiles: 'すべてのプロファイル',
profileMissingModelsTip: 'このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません',
sessionScopeHint: 'チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。',
openHistory: '履歴を開く',
hermesHistory: 'Hermes 履歴',
historyScopeHint: '現在の profile の Hermes 履歴セッションをソース別に読み取り専用で表示します。',
noSessions: 'セッションがありません',
newChat: '新しいチャット',
approvalKicker: 'ターミナル権限',
approvalTitle: '実行前にコマンドを確認',
approvalAllowOnce: '一度だけ許可',
approvalAllowSession: 'セッション中は許可',
approvalAlways: '常に許可',
approvalDeny: '拒否',
clarifyKicker: 'エージェントの確認が必要',
clarifyTitle: 'エージェントが質問があります',
clarifyPlaceholder: '回答を入力...',
clarifySubmit: '返信',
clarifyDismiss: '閉じる',
deleteSession: 'このセッションを削除しますか?',
toggleBatchMode: '一括選択',
selectAll: 'すべて選択',
confirmBatchDelete: '{count}件のセッションを削除しますか?',
batchDeleteSuccess: '{count}件のセッションを削除しました',
batchDeletePartial: '{failed}件の削除に失敗しました',
batchDeleteFailed: '一括削除に失敗しました',
importToWebUi: 'Web UI にインポート',
importSessionSuccess: 'セッションを Web UI にインポートしました',
importSessionAlreadyExists: 'セッションは既に Web UI に存在します',
importSessionFailed: 'セッションのインポートに失敗しました',
sessionDeleted: 'セッションを削除しました',
rename: '名前変更',
pin: 'ピン留め',
unpin: 'ピン留め解除',
pinned: 'ピン留め',
chatMode: 'チャット',
liveMode: 'ライブ',
liveSessions: 'ライブセッション',
recentBadge: '最近',
linkedSessions: '{count} 件の関連',
noVisibleMessages: '人間向けに表示できるメッセージはありません。',
monitorRoleUser: 'ユーザー',
monitorRoleAssistant: 'アシスタント',
copySessionLink: 'セッションリンクをコピー',
openSessionInNewTab: '新しいタブで開く',
sessionLinkCopied: 'Session link copied',
copySessionId: 'セッション ID をコピー',
export: 'エクスポート',
exportFull: 'フルエクスポート (JSON)',
exportCompressed: '圧縮エクスポート (TXT)',
exportCompressing: 'コンテキストを圧縮中、お待ちください...',
exportSuccess: 'セッションをエクスポートしました',
exportFailed: 'エクスポートに失敗しました',
renamed: '名前を変更しました',
renameFailed: '名前の変更に失敗しました',
renameSession: 'セッション名の変更',
sessionNotFound: 'セッションが見つかりません',
enterNewTitle: '新しいタイトルを入力',
other: 'その他',
runFailed: '実行に失敗しました',
error: 'エラー',
tool: 'ツール',
arguments: '引数',
result: '結果',
truncated: '... (省略)',
executionDuration: '実行時間', thinkingLabel: '思考過程',
thinkingInProgress: '思考中…',
thinkingShow: '思考過程を表示',
thinkingHide: '思考過程を隠す',
thinkingDuration: '観測 {duration}',
thinkingChars: '{count} 文字',
copyBubble: 'メッセージをコピー',
copiedBubble: 'コピーしました',
copyFailed: 'コピーに失敗しました',
playSpeech: '音声を読み上げ',
pauseSpeech: '一時停止',
resumeSpeech: '再開',
stopSpeech: '停止',
speechNotSupported: 'このブラウザは音声読み上げをサポートしていません',
searchEnterHint: 'Enter で開く · Esc で閉じる',
searchHint: 'Cmd/Ctrl+K',
searchScope: '検索範囲: Web UI のローカルセッション DB のみ。読み取り専用の Hermes 履歴セッションは含まれません。',
searchFailed: 'セッション検索に失敗しました',
searchNoSnippet: '表示できる要約がありません',
searchNoResults: '一致するセッションがありません',
searchRecent: '最近のセッション',
searchEmpty: '最近のセッション',
searchPlaceholder: 'セッションを検索...',
searchSubtitle: 'タイトルまたはメッセージ内容で検索',
searchTitle: 'セッション検索',
stopGateway: 'Gateway を停止',
start: '開始',
workspaceSetFailed: 'Workspace の設定に失敗しました',
workspaceSet: 'Workspace を設定しました',
workspacePlaceholder: 'プロジェクトパスを入力 例: /home/user/project',
workspace: 'ワークスペース',
setWorkspaceTitle: 'セッション Workspace を設定',
setWorkspace: 'Workspace を設定',
modelSetFailed: 'モデルの設定に失敗しました',
modelSet: 'モデルを設定しました',
setModelTitle: 'セッションモデルを設定',
setModel: 'モデルを設定',
newCliChat: '新規 CLI',
cliEmptyState: 'CLI チャットを開始',
autoPlaySpeech: '音声を自動再生',
},
// スケジュールジョブ
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: 'デフォルトモデル',
repeatPlaceholder: '空白の場合は無制限',
jobCreated: 'ジョブを作成しました',
jobUpdated: 'ジョブを更新しました',
nameRequired: '名前は必須です',
scheduleRequired: 'スケジュールは必須です',
loadFailed: 'ジョブの読み込みに失敗しました',
jobPaused: 'ジョブを一時停止しました',
jobResumed: 'ジョブを再開しました',
jobTriggered: 'ジョブをトリガーしました',
modelUpdated: 'モデルを更新しました',
jobDeleted: 'ジョブを削除しました',
status: {
running: '実行中',
paused: '一時停止',
disabled: '無効',
scheduled: 'スケジュール済み',
},
info: {
model: 'モデル',
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: 'ローカル',
external: '外部',
},
},
// プラグイン
plugins: {
title: 'プラグイン',
refresh: '更新',
notice: '検出可能な Hermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい Hermes セッションで有効になります。',
loadFailed: 'プラグインの読み込みに失敗しました',
commandCopied: 'コマンドをコピーしました',
searchPlaceholder: 'key、名前、説明、パスを検索...',
source: 'ソース',
kind: '種類',
statusTitle: 'ステータス',
configStatus: 'config: {status}',
notAvailable: 'n/a',
copyCommand: 'コマンドをコピー',
managedElsewhere: '他で管理されています',
noMatch: '現在のフィルターに一致するプラグインはありません',
enabled: '有効',
disabled: '無効',
summary: {
total: '合計',
active: '有効 / 自動',
inactive: '非アクティブ',
disabled: '無効',
providerManaged: 'プロバイダー管理',
},
status: {
enabled: '有効',
'auto-active': '自動有効',
inactive: '非アクティブ',
disabled: '無効',
'provider-managed': 'プロバイダー管理',
},
statusLabel: {
enabled: '設定で有効',
'auto-active': '自動有効',
inactive: '非アクティブ',
disabled: '無効',
'provider-managed': 'プロバイダー管理',
},
configStatuses: {
enabled: '有効',
disabled: '無効',
'not-enabled': '未有効',
auto: '自動',
'provider-managed': 'プロバイダー管理',
},
table: {
plugin: 'プラグイン',
status: 'ステータス',
source: 'ソース',
kind: '種類',
capabilities: '機能',
path: 'パス / entrypoint',
cli: 'CLI',
},
capabilities: {
tools: '{count} tools',
hooks: '{count} hooks',
env: '{count} env',
},
metadata: {
agentRoot: 'エージェントルート',
python: 'Python',
scanCwd: 'cwd をスキャン',
projectPlugins: 'プロジェクトプラグイン',
},
},
// メモリ
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: '未掲載のモデル ID',
customModelHint: 'プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。',
noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。',
clearVisibleModels: '選択をクリア',
currentDefault: '現在のデフォルト',
defaultShort: 'デフォルト',
builtIn: '組み込み',
customType: 'カスタム',
provider: 'プロバイダー',
contextLength: 'コンテキスト長',
contextLengthPlaceholder: '例: 256000(任意)',
local: 'ローカル ({host})',
selectProviderRequired: 'プロバイダーを選択してください',
baseUrlRequired: 'ベース URL は必須です',
apiKeyRequired: 'API キーは必須です',
modelRequired: 'デフォルトモデルは必須です',
enterBaseUrl: 'ベース URL を先に入力してください',
unexpectedFormat: '予期しないレスポンス形式です',
foundModels: '{count} 個のモデルが見つかりました',
fetchFailed: 'モデルの取得に失敗しました',
xaiWaiting: '開いた xAI ページで認可を完了してください。承認後、このウィンドウは自動で閉じます。',
xaiOpenLink: 'xAI 認可ページを開く',
xaiLoginTitle: 'xAI Grok OAuth ログイン',
xaiExpired: '認可リンクの期限が切れました。再試行してください。',
xaiCopyLink: '認可リンクをコピー',
xaiApproved: 'ログイン成功!',
visibilitySelectOne: '少なくとも 1 つの表示モデルを残してください',
visibilitySaved: '表示モデルを保存しました',
visibilitySaveFailed: '表示モデルの保存に失敗しました',
visibilityHint: 'Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。',
showAllModels: 'すべてのモデルを表示',
searchPlaceholder: 'モデルを検索...',
removeCustomModel: 'この一覧外モデルを削除',
more: '件追加',
models: 'モデル一覧',
manageVisibleModelsFor: '{name} の表示モデルを管理',
manageVisibleModels: '表示モデルを管理',
getApiKey: 'API Key を取得',
count: '個のモデル',
aliasUseOriginal: '元の ID に戻す',
aliasTitleFor: '{model} の表示名',
aliasTitle: 'モデル表示名',
aliasSaveFailed: '表示名の保存に失敗しました',
aliasPlaceholder: '空欄の場合は元のモデル ID を使用',
aliasManageFor: '{provider} の表示名',
aliasManage: '表示名',
aliasHint: 'Web UI の表示名だけを変更します。Hermes には元のモデル ID が送信されます。',
aliasEdit: '名前変更',
aliasCanonical: '元の ID: {model}',
},
// プロファイル
profiles: {
title: 'プロファイル',
create: 'プロファイルを作成',
import: 'インポート',
export: 'エクスポート',
rename: '名前変更',
delete: '削除',
switchTo: 'Hermes Profile を切り替え',
switchConfirm: '`hermes profile use {name}` を実行し、Hermes CLI の active profile を切り替えます。続行しますか?',
switchSuccess: 'Hermes active profile を「{name}」に切り替えました',
switchFailed: 'Hermes Profile の切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。',
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: 'プロファイルがありません。作成して始めましょう。',
avatar: {
title: 'カスタムアバター',
customize: 'アバター',
upload: '画像をアップロード',
random: 'ランダム生成',
reset: 'デフォルトに戻す',
hint: 'PNG、JPEG、WebP 対応、最大 1MB',
invalidType: 'PNG、JPEG、WebP 画像を選択してください',
tooLarge: 'アバター画像は 1MB 以下にしてください',
saveSuccess: 'アバターを保存しました',
saveFailed: 'アバターの保存に失敗しました',
resetSuccess: 'デフォルトアバターに戻しました',
resetFailed: 'デフォルトアバターへの復元に失敗しました',
},
runtime: {
activeProfile: '現在: {name}',
bridgeWorker: 'Bridge 状態',
gateway: 'ゲートウェイ',
active: 'アクティブ',
activeTag: '現在',
idle: '待機中',
checking: '確認中',
running: '実行中',
stopped: '停止中',
restartGateway: 'Gateway を再起動',
restartProfile: 'プロファイルを再起動',
switchProfile: 'フロントエンドプロファイルを切り替え',
gatewayRestarted: 'Gateway を再起動しました: {name}',
gatewayRestartFailed: 'Gateway の再起動に失敗しました',
profileRestarted: 'プロファイルを再起動しました: {name}',
profileRestartFailed: 'プロファイルの再起動に失敗しました',
},
},
// ログ
logs: {
title: 'ログ',
all: 'すべて',
searchPlaceholder: '検索...',
refresh: '更新',
noEntries: 'ログエントリがありません',
},
// 設定
settings: {
title: '設定',
saved: '保存しました',
saveFailed: '保存に失敗しました',
tabs: {
display: '表示',
account: '現在のアカウント',
users: 'アカウント管理',
agent: 'エージェント',
memory: 'メモリ',
compression: '圧縮',
session: 'セッション',
privacy: 'プライバシー',
apiServer: 'API サーバー',
models: 'モデル',
voice: '音声',
},
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 の最大文字数',
},
compression: {
enabled: '圧縮を有効化',
enabledHint: '長いチャット履歴がモデルコンテキストを超える前に自動圧縮',
threshold: '圧縮しきい値',
thresholdHint: '推定トークンがこのコンテキスト比率を超えたら圧縮を開始',
targetRatio: '目標比率',
targetRatioHint: '圧縮後の履歴サイズをコンテキスト比率で指定',
protectLastN: '直近メッセージを保護',
protectLastNHint: 'この数の最新メッセージは圧縮しない',
protectFirstN: '先頭メッセージを保護',
protectFirstNHint: 'この数の最初のメッセージは圧縮しない',
},
session: {
mode: 'リセットモード',
modeHint: 'セッションリセットのトリガー条件',
modeBoth: 'アイドル + スケジュール',
modeIdle: 'アイドルのみ',
modeDaily: 'スケジュールのみ',
modeNone: '無し(手動のみ)',
idleMinutes: 'アイドルタイムアウト',
idleMinutesHint: '自動リセットまでの待機時間(分)',
atHour: 'スケジュールリセット時刻',
humanOnly: '人間のセッションのみ表示',
humanOnlyHint: 'サブエージェントやセッション監視ノイズを既定で隠します',
liveMonitorHumanOnly: 'ライブモニター: 人間のセッションのみ表示',
liveMonitorHumanOnlyHint: 'ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します',
atHourHint: '毎日指定時刻にセッションをリセット',
requireAuth: 'セッション認証',
requireAuthHint: 'セッション操作に認証を必要とする',
},
privacy: {
redactPii: '個人情報のマスキング',
redactPiiHint: '機密情報を自動検出して隠す(パスワード、キーなど)',
},
apiServer: {
enable: '有効化',
enableHint: 'API サーバーを有効にする',
host: 'ホスト',
hostHint: 'リッスンアドレス',
port: 'ポート',
portHint: 'リッスンポート',
key: 'キー',
keyHint: 'API アクセスキー',
cors: 'CORS 許可元',
corsHint: '許可するクロスオリジン',
},
voice: {
ttsProvider: 'TTS プロバイダー',
ttsProviderHint: 'メッセージ読み上げに使用する音声合成エンジンを選択',
providerWebSpeech: 'WebSpeech API(ブラウザ)',
providerOpenai: 'OpenAI TTS',
providerCustom: 'カスタムエンドポイント(OpenAI 互換)',
providerEdge: 'Edge TTS(無料、API Key 不要)',
// WebSpeech
webspeechVoice: '音声',
webspeechVoiceHint: 'ブラウザまたは OS から音声を選択',
webspeechVoicePlaceholder: '自動(デフォルト音声)',
// OpenAI
openaiKey: 'API キー',
openaiKeyHint: 'TTS アクセス権のある OpenAI API キー',
openaiUrl: 'API ベース URL',
openaiUrlHint: '例: https://api.openai.com/v1/audio/speech',
openaiModel: 'モデル',
openaiModelHint: 'tts-1(高速)/ tts-1-hd(高音質)',
openaiVoice: '音声',
openaiVoiceHint: '合成に使用する音色',
// Custom endpoint
customHint: 'OpenAI 互換の TTS API を使用可能 — GPT-SoVITS、CosyVoice などに対応',
customUrl: 'API URL',
customUrlHint: 'TTS サービスのベース URL',
customUrlPlaceholder: 'ローカルアダプターで設定したアドレス(例:http://127.0.0.1:9880',
customApiKey: 'API キー(オプション)',
customApiKeyHint: '一部のカスタムエンドポイントは認証が必要',
customApiKeyPlaceholder: '不要な場合は空欄',
// Edge TTS
edgeHint: 'Microsoft Edge TTS を搭載(node-edge-tts)。',
edgeUrl: 'アダプター URL',
edgeUrlHint: 'Edge TTS アダプターのアドレス(例:http://127.0.0.1:9882',
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
edgeVoice: '音声',
edgeVoiceHint: '音声合成に使用する音色を選択',
edgeRate: '速度',
edgeRateHint: '音声の速度を調整(0.52.0倍)',
edgePitch: 'ピッチ',
edgePitchHint: '音声のピッチを調整(-20+20 Hz',
// Test
testTitle: '音声テスト',
testText: 'テストテキスト',
testTextPlaceholder: 'テストするテキストを入力...',
testTextDefault: 'こんにちは、これは音声テストです。',
testButton: 'テスト',
testButtonPlaying: '再生中...',
testFailed: 'テスト失敗:{error}',
// MiMo TTS
providerMimo: 'MiMo TTS',
mimoHint: 'Xiaomi MiMo TTS — プリセット音声、音声デザイン、音声クローンの3つのモードをサポート',
mimoApiKey: 'API Key',
mimoApiKeyHint: 'platform.xiaomimimo.com で取得',
mimoApiKeyPlaceholder: 'MiMo API Key',
mimoBaseUrl: 'Base URL',
mimoBaseUrlHint: 'MiMo API エンドポイントURL',
mimoModel: 'モデル',
mimoModelHint: '音声合成モデルを選択',
mimoModelPreset: 'プリセット音声',
mimoModelVoiceDesign: '音声デザイン',
mimoModelVoiceClone: '音声クローン',
mimoVoice: '音声',
mimoVoiceHint: 'プリセット音声を選択',
mimoVoiceDesignPrompt: '音声の説明',
mimoVoiceDesignPromptHint: '希望する音声の特徴を説明してください',
mimoVoiceDesignPromptPlaceholder: '例:温かみのある若い女性の声、少しゆっくり、磁力的なトーン',
mimoCloneAudio: '音声アップロード',
mimoCloneAudioHint: '音声クローン用の音声サンプルをアップロード(mp3/wav、最大10MB',
mimoCloneAudioUpload: 'ファイルを選択',
mimoCloneAudioClear: 'クリア',
mimoStylePrompt: 'スタイルプロンプト',
mimoStylePromptHint: 'オプション — 自然言語で話すスタイルを説明',
mimoStylePromptPlaceholder: '例:明るく弾むようなトーン、速めのテンポ',
},
lockedIps: {
title: 'ロック済みIP管理',
count: '{count}件ロック中',
empty: 'ロック済みIPなし',
unlock: 'ロック解除',
unlockAll: '全て解除',
unlockAllConfirm: '全てのロック済みIPを解除しますか?',
unlocked: 'IPをロック解除しました',
allUnlocked: '{count}件のIPをロック解除しました',
},
models: {
apiKey: 'API Key',
apiKeyPlaceholder: 'API Key を入力',
noProviders: '設定済みプロバイダーがありません',
save: '保存',
saveFailed: '保存に失敗しました',
saved: '保存しました',
},
},
githubPreview: {
title: "バージョンプレビュー",
description: "選択した GitHub tag を Web UI のプレビュー作業ディレクトリへクローンし、依存関係をインストールして開発ポートで起動します。",
refresh: "更新",
selectTag: "tag を選択",
prepare: "コードを準備",
install: "依存関係をインストール",
start: "プレビューを開始",
stop: "停止",
note: "プレビューコードは Web UI データホーム配下に保存されます。本番は 8648 のまま、プレビュー開発環境はフロントエンド 8651、バックエンド 8650 で実行されます。",
path: "プレビューパス",
webuiHome: "プレビューデータホーム",
currentTag: "現在の Tag",
repoReady: "リポジトリ準備済み",
dependencies: "依存関係インストール済み",
running: "実行状態",
notRunning: "未実行",
open: "プレビューを開く",
log: "操作ログパス",
logOutput: "ログ出力",
actionLog: "操作ログ",
devLog: "開発サーバーログ",
yes: "はい",
no: "いいえ",
actionFailed: "操作に失敗しました",
prepareSuccess: "プレビューコードの準備が完了しました",
installSuccess: "依存関係をインストールしました",
startSuccess: "プレビューを起動しました",
stopSuccess: "プレビューを停止しました",
},
codingAgents: {
title: "コーディングエージェント",
notice: "すべてのプロバイダーとモデルが互換性を持つわけではありません。",
claudeDescription: "print mode の単発タスクと対話型コーディングセッション向けの Anthropic CLI です。",
codexDescription: "リポジトリ作業向けの OpenAI CLI と Hermes openai-codex プロバイダーフローです。",
copyCommand: "コピー",
commandCopied: "コマンドをコピーしました",
commandCopyFailed: "コピーに失敗しました",
refresh: "更新",
checking: "確認中",
installStatus: "インストール状態",
installed: "インストール済み",
notInstalled: "未インストール",
installNow: "インストール",
installing: "インストール中",
installSuccess: "インストールしました",
installFailed: "インストールに失敗しました",
deleteNow: "削除",
deleting: "削除中",
deleteSuccess: "削除しました",
deleteFailed: "削除に失敗しました",
configFiles: "設定ファイル",
profileScope: "プロファイル",
providerScope: "プロバイダー",
providerPlaceholder: "例: custom:glm",
modelScope: "モデル",
modelPlaceholder: "モデルを選択",
launchModeScope: "起動モード",
launchModeGlobal: "グローバル設定",
launchModeScoped: "プロバイダーとモデル",
protocolScope: "プロトコル",
protocolOpenAiChat: "OpenAI Chat Completions (/v1/chat/completions)",
protocolOpenAiResponses: "OpenAI Responses (/v1/responses)",
protocolAnthropicMessages: "Anthropic Messages (/v1/messages)",
reloadConfig: "設定を再読み込み",
configFileNotCreated: "未作成",
configLoadFailed: "設定ファイルの読み込みに失敗しました",
loadFailed: "コーディングエージェントの確認に失敗しました",
launch: "起動",
launchTitle: "コーディングエージェントを起動",
nativeTerminal: "ネイティブターミナル",
builtInTerminal: "内蔵ターミナル",
launchPrepared: "起動設定を準備しました",
launchPrepareFailed: "起動設定の準備に失敗しました",
nativeLaunchStarted: "ネイティブターミナルを開きました",
nativeLaunchFailed: "ネイティブターミナルを開けませんでした",
terminalTitle: "コーディングエージェントターミナル",
loadProvidersFailed: "現在のプロファイルのプロバイダーを読み込めませんでした",
selectProviderModel: "プロバイダーとモデルを選択してください",
launchConfigDir: "起動設定ディレクトリ",
launchCommand: "起動コマンド",
table: {
tool: "ツール",
kind: "ステップ",
command: "コマンド",
note: "説明",
action: "操作",
},
kinds: {
install: "インストール",
auth: "認証",
health: "確認",
run: "実行",
},
notes: {
claudeInstall: "Claude Code CLI をグローバルにインストールします。",
codexInstall: "Codex CLI をグローバルにインストールします。",
claudeAuth: "Claude Code のログイン状態を確認します。未ログインの場合は一度 claude を実行してください。",
codexAuth: "Hermes 管理の OpenAI Codex OAuth 認証情報を追加します。",
claudeHealth: "アップデーターとローカル CLI の状態を確認します。",
codexHealth: "Codex CLI が PATH で利用可能か確認します。",
claudeRun: "API 駆動の単発タスクには print mode が最も素直な経路です。",
codexRun: "Codex の単発タスクは git リポジトリ内で実行する必要があります。",
},
},
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',
cardTemplateId: 'AI カードテンプレート ID',
cardTemplateIdHint: 'DingTalk AI カードテンプレート ID。空欄の場合は AI カードを無効化',
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: 'スキャン済み、スマートフォンで確認してください...',
qqSandboxHint: 'サンドボックス環境を有効化(テスト用)',
qqSandbox: 'サンドボックスモード',
qqQrScanHint: 'QQ で上の QR コードをスキャンするか、スマホでリンクを開いて連携を完了します',
qqMarkdownHint: 'Markdown 形式メッセージを有効化(一部クライアントでは未対応の場合があります)',
qqMarkdown: 'Markdown サポート',
qqAppSecretHint: 'QQ Open Platform Bot App Secret',
qqAppSecret: 'App Secret',
qqAppIdHint: 'QQ Open Platform Bot App ID',
qqAppId: 'App ID',
allowedUsersHint: 'ユーザー ID または OpenID の許可リスト。カンマ区切り',
allowedUsers: '許可ユーザー',
allowAllUsersHint: '任意のユーザーからのメッセージを許可します。オフの場合は許可リストを使用します',
allowAllUsers: 'すべてのユーザーを許可',
},
// 言語
language: {
label: '言語',
zh: '中文',
en: 'English',
ja: '日本語',
},
// ターミナル
terminal: {
sessions: 'セッション',
newTab: '新しいターミナル',
closeSession: 'このセッションを閉じますか?',
sessionExited: '終了しました',
processExited: 'プロセスが終了しました(コード {code})',
noSessions: 'ターミナルセッションがありません',
connectionFailed: 'ターミナルに接続できませんでした',
connectionError: '接続エラー',
connectionClosed: '接続が閉じられました',
},
// 使用統計
usage: {
title: '使用統計',
refresh: '更新',
totalTokens: '総トークン数',
inputTokens: '入力',
outputTokens: '出力',
totalSessions: '総セッション数',
avgPerDay: '1日平均 ~{n}',
estimatedCost: '推定コスト',
cacheHitRate: 'キャッシュヒット率',
modelBreakdown: 'モデル別内訳',
dailyTrend: '日別使用量',
date: '日付',
tokens: 'トークン',
cache: 'キャッシュ',
cacheRead: 'キャッシュ読み取り',
cacheWrite: 'キャッシュ書き込み',
sessions: 'セッション',
cost: 'コスト',
noData: '使用データがありません',
},
skillsUsage: {
title: 'スキル使用状況',
subtitle: 'Hermes セッションでのスキル読み込みと編集を追跡します',
refresh: '更新',
periodSelector: 'スキル使用期間',
periodLabel: '{days}日',
summary: '概要',
totalActions: '操作数',
loads: '読み込み',
edits: '編集',
distinctSkills: 'スキル数',
topSkills: '上位',
dailyTrend: '日別',
periodSummary: '過去 {days} 日',
skill: 'スキル',
share: '割合',
lastUsed: '最終',
noData: 'スキル使用データはありません',
loadFailed: 'スキル使用状況の読み込みに失敗しました',
otherSkills: 'その他',
},
// 更新履歴
changelog: {
new_0_6_4_1: 'CI を強化し、npm install の挙動を固定して PR の Docker smoke チェックを追加しました',
new_0_6_4_2: 'チャットに仮想ページングを追加し、長い会話のスクロールと読み込みをより安定させました',
new_0_6_4_3: 'Docker イメージ公開は通常の PR チェックではなく release の場合のみ実行されます',
new_0_6_4_4: 'Version Preview を super admin 向けに追加し、main/tag 選択、preview checkout、依存関係インストール、start/stop、ログ確認に対応しました',
new_0_6_4_5: 'Preview インスタンスは frontend/backend ポート、Web UI home、agent bridge endpoint を分離し、古い tag にはポート、WebSocket、base URL、ネストした preview ナビゲーションの runtime patch を適用します',
new_0_6_4_6: 'created_at がない legacy session_usage テーブルをデフォルト値付きで安全に移行します',
new_0_6_4_7: 'Bridge profile worker endpoint を broker endpoint ごとに分離し、同じ Profile の本番/preview が worker socket を奪い合って unknown run を起こす問題を防ぎます',
new_0_6_5_1: 'Coding Agents に Claude Code と Codex の完全な起動ワークフローを追加し、グローバル設定、profile/provider 分離ワークスペース、内蔵/ネイティブターミナルに対応しました',
new_0_6_5_2: 'Codex 起動は OpenAI Chat Completions、OpenAI Responses、Anthropic Messages に対応し、ローカル proxy で各プロバイダーへ適配します',
new_0_6_5_3: 'Windows の Coding Agents は .cmd/.bat shim 検出、ターミナル起動修正、Claude Code custom model のローカル検証回避で安定しました',
new_0_6_5_4: 'メッセージ一覧、History ページング、TTS 認証、グループチャット agent メンション、更新チェック無効化、bridge worker transport の安定性を改善しました',
new_0_6_3_1: 'Bridge spinner の状態をモデル reasoning として保存しないようにし、装飾的な thinking テキストが後続コンテキストを汚染しないようにしました',
new_0_6_3_2: 'History に Hermes CLI セッションを Web UI のローカル履歴へインポートする操作を追加し、メッセージ構造をより安全に正規化します',
new_0_6_3_3: 'Provider 設定で組み込み base URL を編集できるようになり、LM Studio を組み込み Provider として追加し、LM Studio /models のライブ取得に対応しました',
new_0_6_3_4: 'Web UI bridge 経由の OpenRouter リクエストに Hermes Web UI のアプリ attribution headers を付与するようになりました',
new_0_6_3_5: '公開 auth status endpoint が未認証リクエストに最初のユーザー名を返さないようにしました',
new_0_6_3_6: 'DingTalk 設定に AI Card Template ID フィールドを追加し、DINGTALK_CARD_TEMPLATE_ID として保存します',
new_0_6_3_7: 'Bridge socket JSON 出力で孤立した Unicode surrogate 文字をサニタイズし、チャット SSE のクラッシュを防ぎます',
new_0_6_2_1: 'Web Bridge が /plan コマンドに対応し、run の開始とコマンド状態の表示が正しく動作するようになりました',
new_0_6_2_2: 'チャット入力のコマンドメニューに /goal と /subgoal を追加し、status、pause、resume、done、clear 操作に対応しました',
new_0_6_2_3: 'Goal と subgoal のワークフローをチャットセッションに統合し、目標の継続とステータス更新に対応しました',
new_0_6_2_4: 'ジョブ配信先チャネルの選択肢を復元し、スケジュール済みジョブが意図した宛先を選べるようになりました',
new_0_6_2_5: '再接続後のコンテキスト token 使用量を snapshot 対応の計算で正確に復元します',
new_0_6_2_6: 'Codex の要約が遅い場合でもコンテキスト checkpoint 圧縮が安定します。Web UI は 5 分待機し、Python bridge broker は 2 分で worker request を打ち切りません',
new_0_6_2_7: 'チャットキューの昇格処理を修正し、同期された複数ウィンドウを含め queued メッセージが早くメッセージ一覧へ入らないようにしました',
new_0_6_2_8: 'Clarify プロンプトは Enter で自由入力を送信せず、回答済みプロンプトはセッション切り替え後に再表示されません',
new_0_6_2_9: 'Bridge terminal の環境更新と stale pid cleanup の範囲を絞り、UI に古い runtime 状態が残りにくくしました',
new_0_6_2_10: '既定のコンテキスト長を Hermes 標準に合わせて 256,000 tokens に変更しました',
new_0_5_35_1: 'Bridge セッションは異なる session 間で並行実行でき、同一 session の実行はメッセージ順序を守るため直列化されます',
new_0_5_35_2: 'Performance Monitor ページを追加し、システム CPU/メモリ、Web UI、Bridge Broker、Workers、アクティブセッション状態を確認できます',
new_0_5_35_3: 'Worker ごとの CPU、メモリ、Profile、セッション数、実行状態を表示するリソース統計を追加',
new_0_5_35_4: 'Bridge worker のライフサイクル cleanup を改善し、Broker 終了時や親プロセス終了時に worker を回収して残留 Python プロセスを減らします',
new_0_5_35_5: 'macOS、Windows、Linux、Docker、Termux 向けの fallback を追加し、監視リソース収集のクロスプラットフォーム互換性を強化',
new_0_5_35_6: 'Agent 初期化中の worker request で Performance Monitor がブロックされにくくなり、Windows の request timed out を軽減',
new_0_5_35_7: 'Chat Markdown にテキスト内容のインラインプレビューを追加し、download アイコンはプレビュー drawer を開かず直接ダウンロードします',
new_0_5_35_8: '内容表示 drawer を改善し、モバイルの閉じる操作と全幅表示、デスクトップ 800px 幅、テキスト/Markdown 背景の統一に対応',
new_0_6_0_1: 'アカウント別・Profile 別の管理により、セッション、モデル、使用量、Kanban、ジョブ、アップロード、メディア、関連 Hermes API を一貫して保護します',
new_0_6_0_2: '内蔵メディア Skills は生成されたサーバートークンをメディア endpoint のみに使用し、要求された Profile から fun-codex/xAI 認証情報を解決します',
new_0_6_0_3: '単一チャットとグループチャットは現在の Hermes Profile を run instructions に注入し、Skills が X-Hermes-Profile を送れるようにします',
new_0_6_0_4: 'delegate_task の subagent 進行状況をチャット UI に stream 表示し、開始、tool、進行、完了を確認できます',
new_0_6_0_5: '停止または中断時に一時イベントをクリアし、古い abort 状態が次のチャットに漏れないようにしました',
new_0_6_0_6: 'アカウント管理、既定の認証情報、アカウント/Profile 管理、アップロード/ダウンロード、内蔵メディア Skills のドキュメントとサイト文言を更新',
new_0_6_0_7: 'ログイン IP ロックのクリアと既定の admin / 123456 ログインをリセットする CLI メンテナンスコマンドを追加',
new_0_6_0_8: '0.6.0 は Web UI の単一ユーザー版とマルチユーザー版の境界です。マルチユーザー機能に問題がある場合は issue を送信し、必要に応じて 0.5.35 の単一ユーザー版へ戻してください',
new_0_6_1_1: 'セッション一覧は既定でアカウントが利用可能なすべての Profile を表示し、明示的な Profile フィルター時のみ絞り込みます。CLI start/stop/status の node:sqlite 実験警告も出なくなりました',
new_0_6_1_2: 'Clarify と確認の返信が、認証済みチャット socket 経由で Hermes bridge まで届くようになり、返信経路のテストも追加しました',
new_0_6_1_3: 'ナビゲーション項目とチャットセッション行をネイティブリンク化し、新しいタブで開く、リンクコピー、折りたたみサイドバー状態の永続化に対応しました',
new_0_6_1_4: 'セッションリンクが route Profile を通常のセッション一覧フィルターへ漏らさないようにし、新しいタブで開くラベルを各言語に対応しました',
new_0_6_1_5: 'Skills は現在の Profile config の skills.external_dirs を読み、external source を表示し、ローカル優先を保ち、外部 skill ファイルも解決します',
new_0_6_1_6: 'ログイン IP ロックのしきい値を 10 回失敗に上げ、ロック時のログイン画面にロック解除と既定ログインリセットの復旧コマンドを表示します',
new_0_6_1_7: 'モバイルやバックグラウンドによるチャット切断を一時切断として扱い、再接続後にサーバーから run 状態を復元します',
new_0_6_1_8: 'Bridge の tool marker flush が、tool/run 境界で残った tool-call prefix を永続化し、再読み込み後の欠落を防ぎます',
new_0_6_1_9: 'Profile 対応の History 操作は Profile 付きターゲットでセッションを削除し、グローバル Profile 変更時に History を再読み込みします',
new_0_6_1_10: 'マルチユーザー権限モデルに合わせて旧 AUTH_DISABLED バイパスを削除し、AUTH_TOKEN は引き続きサポートします',
},
// ファイル
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: '保存',
fileTree: 'ファイルツリー',
},
// グループチャット
groupChat: {
title: 'グループチャット',
createRoom: 'ルームを作成',
joinByCode: 'コードで参加',
roomName: 'ルーム名',
roomNamePlaceholder: 'ルーム名を入力',
inviteCode: '招待コード',
autoGenerate: '自動生成',
noRooms: 'ルームがありません',
selectOrCreate: 'ルームを選択または作成してチャットを開始',
agents: 'エージェント',
addAgent: 'エージェントを追加',
selectProfile: 'プロファイルを選択',
agentAdded: 'エージェントが追加されました',
agentAlreadyInRoom: 'このエージェントは既にルームにいます',
agentAddFailedCount: '{count} 件のエージェントを追加できませんでした: {details}',
noAgents: 'このルームにエージェントはいません',
members: 'メンバー',
roomCreated: 'ルームが作成されました',
roomDeleted: 'ルームを削除しました',
roomCloned: 'ルームを複製しました',
cloneRoom: 'ルームを複製',
copyRoomLink: 'ルームリンクをコピー',
deleteRoomConfirm: 'このルームを削除しますか?',
clearContext: 'コンテキストを削除',
clearContextConfirm: 'このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。',
contextCleared: 'コンテキストを削除しました',
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: '無効なファイルパス',
contentDisplay: '内容表示',
download: 'ダウンロード',
downloadFile: 'ファイルをダウンロード',
},
gateways: {
title: 'ゲートウェイ',
running: '実行中',
stopped: '停止中',
started: '開始しました',
startFailed: 'Gateway の起動に失敗しました',
stopFailed: 'Gateway の停止に失敗しました',
},
kanban: {
title: 'Kanban ボード',
createTask: '新規タスク',
noTasks: 'タスクはありません',
allStatuses: 'すべての状態',
allAssignees: 'すべての担当者',
columns: {
triage: '振り分け待ち',
todo: '未着手',
ready: '準備完了',
running: '進行中',
blocked: 'ブロック中',
done: '完了',
archived: 'アーカイブ済み',
},
card: {
assigneeTooltip: '担当者',
priority: {
low: '低',
medium: '中',
high: '高',
},
timeAgo: {
justNow: 'たった今',
minutes: '{count}分前',
hours: '{count}時間前',
days: '{count}日前',
},
},
board: {
create: '新規ボード',
archive: 'ボードをアーカイブ',
archiveConfirm: '現在のボードをアーカイブしますか?',
archived: 'ボードをアーカイブしました',
created: 'ボードを作成しました',
slugPlaceholder: 'ボード識別子 例: project-a',
namePlaceholder: '表示名(任意)',
slugRequired: 'ボード識別子は必須です',
},
form: {
title: 'タイトル',
titlePlaceholder: 'タスクタイトル',
titleRequired: 'タイトルは必須です',
body: '説明',
bodyPlaceholder: 'タスク説明(任意)',
assignee: '担当者',
selectAssignee: '担当者を選択...',
priority: '優先度',
selectPriority: '優先度を選択...',
},
detail: {
status: '状態',
priority: '優先度',
assignee: '担当者',
tenant: 'テナント',
createdAt: '作成時刻',
startedAt: '開始時刻',
completedAt: '完了時刻',
comments: 'コメント',
events: 'イベント',
runs: '実行履歴',
artifacts: '成果物',
result: '完了結果',
highlights: '重要情報',
sources: 'データソース',
sessions: '関連セッション',
sessionMessages: 'セッション記録',
noSessions: '関連セッションが見つかりません。',
},
action: {
title: '操作',
assign: '割り当て',
assignTo: '割り当て先...',
block: 'ブロック',
blockReason: 'ブロック理由',
unblock: 'ブロック解除',
complete: '完了',
completeSummary: '完了サマリー(任意)',
},
message: {
loadFailed: 'タスクの読み込みに失敗しました',
taskCreated: 'タスクを作成しました',
taskAssigned: 'タスクを割り当てました',
taskBlocked: 'タスクをブロックしました',
taskUnblocked: 'タスクのブロックを解除しました',
taskCompleted: 'タスクを完了しました',
},
stats: {
total: '合計',
tasks: 'タスク数',
},
},
}