Files
Hermes-ui/packages/client/src/i18n/locales/ja.ts
T
ekko 70ddbd0bcd feat: add username/password login, account settings, and changelog (#133) (#134)
- Add username/password login as additional auth mechanism alongside existing token
- First login must use token; password can be configured in Settings > Account
- Password login returns the existing static token (no auth middleware changes)
- Add account settings: setup, change password, change username, remove password
- Add logout button to sidebar footer
- Add version changelog popup (click version number in sidebar)
- Support all 8 locales (en, zh, de, es, fr, ja, ko, pt)
- Bump version to 0.4.3

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-22 20:27:33 +08:00

518 lines
22 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: 'パスワード',
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: '保存に失敗しました',
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: '更新に失敗しました',
logout: 'ログアウト',
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: '... (省略)',
},
// スケジュールジョブ
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: 'デフォルトモデル',
selectOrInput: 'モデルを選択または入力...',
selectModel: 'モデルを選択...',
providerAdded: 'プロバイダーを追加しました',
providerDeleted: 'プロバイダーを削除しました',
deleteProvider: 'プロバイダーを削除',
deleteConfirm: '「{name}」を削除しますか?',
codexLoginTitle: 'OpenAI Codex ログイン',
codexWaiting: '認証ページで以下のコードを入力してログインしてください:',
codexCopyCode: 'コードをコピーしました',
codexOpenLink: '認証ページを開く',
codexApproved: 'ログイン成功',
codexExpired: '認証の有効期限が切れました。もう一度お試しください。',
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: '表示',
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_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ファイル配信を修正',
},
}