4bdcaa6258
* feat(providers): 新增 Alibaba Cloud (Coding Plan) 内置 provider 对齐 hermes-agent 上游 PR #15045(commit 727d1088),新增 alibaba-coding-plan provider,鉴权使用 ALIBABA_CODING_PLAN_API_KEY 环境变量,base_url 可通过 ALIBABA_CODING_PLAN_BASE_URL 覆盖。 默认 base_url 使用国际版端点 coding-intl.dashscope.aliyuncs.com/v1, 与上游 auth.py:255 保持一致。中国大陆 DashScope 账号 (dashscope.aliyun.com 颁发的 sk-sp-* 密钥)需要通过 ALIBABA_CODING_PLAN_BASE_URL=https://coding.dashscope.aliyuncs.com/v1 (不带 -intl)覆盖,因为 -intl 端点对该类密钥返回 HTTP 401。 该差异在源码注释中已说明。 模型列表覆盖 8 个 Coding Plan 支持的模型:qwen3.5-plus、 qwen3-max-2026-01-23、qwen3-coder-next/plus、glm-5、glm-4.7、 kimi-k2.5、MiniMax-M2.5(基于实测可用列表)。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(providers): Alibaba Coding Plan 添加国内/国际区域切换 在 ProviderFormModal 中针对 alibaba-coding-plan preset 增加一个 "区域"字段,可在国际版(coding-intl)与中国大陆(coding,无 -intl) 两个端点之间切换,切换时自动更新 base_url。 默认选中国际版以对齐上游 hermes-agent 默认值。中国大陆 DashScope 账号(dashscope.aliyun.com 颁发的 sk-sp-* 密钥)只需在表单里点一下 "中国大陆"即可,无需手动改 base_url 或设环境变量。 8 个 locale(zh/en/de/es/fr/ja/ko/pt)都补全了 region/regionIntl/ regionCn 三个 i18n key。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(providers): builtin provider 列表优先读取 base_url env override 之前服务端 getAvailable 在渲染 builtin provider 列表时直接 用 PROVIDER_PRESETS 里的默认 base_url,忽略了用户保存到 .env 的 base_url override。这导致用户在 Alibaba Coding Plan 选了"中国 大陆"保存后,列表里仍然显示国际版 URL。 修复:envMapping.base_url_env 如果存在且 .env 中有值,优先 使用该值;否则 fallback 到 preset 默认。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
665 lines
29 KiB
TypeScript
665 lines
29 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: 'チャット',
|
||
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: '更新履歴はありません',
|
||
},
|
||
|
||
// チャット
|
||
chat: {
|
||
contextRemaining: '残り',
|
||
emptyState: 'Hermes Agent と会話を開始しましょう',
|
||
inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)',
|
||
attachFiles: 'ファイルを添付',
|
||
stop: '停止',
|
||
send: '送信',
|
||
contextUsed: 'コンテキスト使用量:',
|
||
sessions: 'セッション',
|
||
noSessions: 'セッションがありません',
|
||
newChat: '新しいチャット',
|
||
deleteSession: 'このセッションを削除しますか?',
|
||
sessionDeleted: 'セッションを削除しました',
|
||
rename: '名前変更',
|
||
pin: 'ピン留め',
|
||
unpin: 'ピン留め解除',
|
||
pinned: 'ピン留め',
|
||
chatMode: 'チャット',
|
||
liveMode: 'ライブ',
|
||
liveSessions: 'ライブセッション',
|
||
recentBadge: '最近',
|
||
linkedSessions: '{count} 件の関連',
|
||
noVisibleMessages: '人間向けに表示できるメッセージはありません。',
|
||
monitorRoleUser: 'ユーザー',
|
||
monitorRoleAssistant: 'アシスタント',
|
||
copySessionId: 'セッション ID をコピー',
|
||
renamed: '名前を変更しました',
|
||
renameFailed: '名前の変更に失敗しました',
|
||
renameSession: 'セッション名の変更',
|
||
enterNewTitle: '新しいタイトルを入力',
|
||
other: 'その他',
|
||
runFailed: '実行に失敗しました',
|
||
error: 'エラー',
|
||
tool: 'ツール',
|
||
arguments: '引数',
|
||
result: '結果',
|
||
truncated: '... (省略)',
|
||
thinkingLabel: '思考過程',
|
||
thinkingInProgress: '思考中…',
|
||
thinkingShow: '思考過程を表示',
|
||
thinkingHide: '思考過程を隠す',
|
||
thinkingDuration: '観測 {duration}',
|
||
thinkingChars: '{count} 文字',
|
||
},
|
||
|
||
// スケジュールジョブ
|
||
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: '繰り返し回数(任意)',
|
||
repeatPlaceholder: '空白の場合は無制限',
|
||
jobCreated: 'ジョブを作成しました',
|
||
jobUpdated: 'ジョブを更新しました',
|
||
nameRequired: '名前は必須です',
|
||
scheduleRequired: 'スケジュールは必須です',
|
||
loadFailed: 'ジョブの読み込みに失敗しました',
|
||
jobPaused: 'ジョブを一時停止しました',
|
||
jobResumed: 'ジョブを再開しました',
|
||
jobTriggered: 'ジョブをトリガーしました',
|
||
jobDeleted: 'ジョブを削除しました',
|
||
status: {
|
||
running: '実行中',
|
||
paused: '一時停止',
|
||
disabled: '無効',
|
||
scheduled: 'スケジュール済み',
|
||
},
|
||
info: {
|
||
schedule: 'スケジュール',
|
||
lastRun: '前回実行',
|
||
nextRun: '次回実行',
|
||
deliver: '配信',
|
||
repeat: '繰り返し',
|
||
},
|
||
action: {
|
||
pause: '一時停止',
|
||
pauseJob: 'ジョブを一時停止',
|
||
resume: '再開',
|
||
resumeJob: 'ジョブを再開',
|
||
runNow: '今すぐ実行',
|
||
triggerImmediately: 'すぐにトリガー',
|
||
},
|
||
},
|
||
|
||
// スキル
|
||
skills: {
|
||
title: 'スキル',
|
||
searchPlaceholder: 'スキルを検索...',
|
||
noMatch: '検索に一致するスキルがありません',
|
||
noSkills: 'スキルがありません',
|
||
backTo: '戻る',
|
||
attachedFiles: '添付ファイル',
|
||
loadFailed: 'スキルの読み込みに失敗しました',
|
||
fileLoadFailed: 'ファイルの読み込みに失敗しました',
|
||
toggleFailed: 'スキルの切り替えに失敗しました',
|
||
},
|
||
|
||
// メモリ
|
||
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: '認証の有効期限が切れました',
|
||
customBadge: 'カスタム',
|
||
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: '英数字、ハイフンのみ',
|
||
newName: '新しい名前',
|
||
newNamePlaceholder: '新しい名前を入力',
|
||
cloneFromCurrent: '現在のプロファイルから複製',
|
||
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(カンマ区切り)',
|
||
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: 'キャッシュ',
|
||
sessions: 'セッション',
|
||
cost: 'コスト',
|
||
noData: '使用データがありません',
|
||
},
|
||
|
||
// 更新履歴
|
||
changelog: {
|
||
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_3_1: 'トークン認証に加えてユーザー名/パスワードログインを追加',
|
||
new_0_4_3_2: '資格情報管理のためのアカウント設定を追加',
|
||
new_0_4_3_3: 'サイドバーにログアウトボタンを追加',
|
||
new_0_4_3_4: 'バージョン番号クリックで更新履歴ポップアップを追加',
|
||
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: '組み込みプロバイダー検出とモデルマッチングを修正',
|
||
new_0_4_1_1: '認証バイパスとSPAファイル配信を修正',
|
||
},
|
||
|
||
// ファイル
|
||
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: 'ファイルをダウンロード',
|
||
},
|
||
}
|