feat: add 6 new locales (ja, ko, fr, es, de, pt) and UI polish
- Add Japanese, Korean, French, Spanish, German, Portuguese translations - Improve session active state visibility in both themes - Static language labels in LanguageSwitch component - Dark theme: lighten chat input background for better contrast - Fix system theme listener not toggling back to light Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,449 @@
|
||||
export default {
|
||||
// ログイン
|
||||
login: {
|
||||
title: 'Hermes Web UI',
|
||||
description: 'アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。',
|
||||
placeholder: 'アクセストークン',
|
||||
submit: 'ログイン',
|
||||
tokenRequired: 'アクセストークンを入力してください',
|
||||
invalidToken: '無効なトークンです',
|
||||
connectionFailed: 'サーバーに接続できません',
|
||||
},
|
||||
|
||||
// 共通
|
||||
common: {
|
||||
loading: '読み込み中...',
|
||||
cancel: 'キャンセル',
|
||||
delete: '削除',
|
||||
edit: '編集',
|
||||
save: '保存',
|
||||
saved: '保存しました',
|
||||
update: '更新',
|
||||
create: '作成',
|
||||
saveFailed: '保存に失敗しました',
|
||||
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: 'ターミナル',
|
||||
settings: '設定',
|
||||
connected: '接続済み',
|
||||
disconnected: '未接続',
|
||||
updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください',
|
||||
updateVersion: 'v{version} にアップグレード',
|
||||
updating: '更新中...',
|
||||
updateSuccess: '更新が完了しました。サーバーを再起動してください',
|
||||
updateFailed: '更新に失敗しました',
|
||||
},
|
||||
|
||||
// チャット
|
||||
chat: {
|
||||
emptyState: 'Hermes Agent と会話を開始しましょう',
|
||||
inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)',
|
||||
attachFiles: 'ファイルを添付',
|
||||
stop: '停止',
|
||||
send: '送信',
|
||||
contextUsed: 'コンテキスト使用量:',
|
||||
sessions: 'セッション',
|
||||
noSessions: 'セッションがありません',
|
||||
newChat: '新しいチャット',
|
||||
deleteSession: 'このセッションを削除しますか?',
|
||||
sessionDeleted: 'セッションを削除しました',
|
||||
rename: '名前変更',
|
||||
copySessionId: 'セッション ID をコピー',
|
||||
renamed: '名前を変更しました',
|
||||
renameFailed: '名前の変更に失敗しました',
|
||||
renameSession: 'セッション名の変更',
|
||||
enterNewTitle: '新しいタイトルを入力',
|
||||
other: 'その他',
|
||||
runFailed: '実行に失敗しました',
|
||||
error: 'エラー',
|
||||
tool: 'ツール',
|
||||
arguments: '引数',
|
||||
result: '結果',
|
||||
truncated: '... (省略)',
|
||||
},
|
||||
|
||||
// スケジュールジョブ
|
||||
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',
|
||||
baseUrlPlaceholder: '例: https://api.example.com/v1',
|
||||
apiKey: 'API キー',
|
||||
apiKeyPlaceholder: 'sk-...',
|
||||
defaultModel: 'デフォルトモデル',
|
||||
selectModel: 'モデルを選択...',
|
||||
providerAdded: 'プロバイダーを追加しました',
|
||||
providerDeleted: 'プロバイダーを削除しました',
|
||||
deleteProvider: 'プロバイダーを削除',
|
||||
deleteConfirm: '「{name}」を削除しますか?',
|
||||
noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。',
|
||||
builtIn: '組み込み',
|
||||
customType: 'カスタム',
|
||||
provider: 'プロバイダー',
|
||||
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: '表示',
|
||||
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: 'スケジュールリセット時刻',
|
||||
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: '使用データがありません',
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user