在「设置」页新增「导航设置」面板,用户可拖拽调整左侧各导航项的顺序并控制显隐;配置按用户持久化到后端,跨设备生效。隐藏仅移除菜单入口,页面路由仍可访问,且至少保留一个可见项。 变更内容: - 后端新增 /api/setting/nav-menu 读写接口,复用 t_user_preference 键值存储,无需改表 - 新增 NavMenuPrefsVO / NavMenuPrefsRequest / NavMenuItem,保存时过滤空 key 与重复项 - 前端新增导航清单单一数据源与共享状态,主布局菜单据此渲染顺序与显隐 - 新增「导航设置」面板,支持拖拽排序、显隐开关、恢复默认,改动防抖自动保存 - 「智能查数」仍受 AI 启用状态约束,未启用时不在菜单与配置项中显示 - 新增导航设置相关中英日三语文案 - 新增拖拽依赖 vuedraggable@4 - 顺带将 Hikari 连接池名前缀由 finance- 修正为 ledgerly-
1120 lines
104 KiB
TypeScript
1120 lines
104 KiB
TypeScript
// 多语言消息定义:每个 key 同时维护中文(zh)、英文(en)与日文(ja),一一对应,便于对照维护
|
||
export default {
|
||
// 语言名称(用于切换器展示,始终以自身语言呈现)
|
||
locale: {
|
||
zhCN: { zh: '简体中文', en: '简体中文', ja: '简体中文' },
|
||
enUS: { zh: 'English', en: 'English', ja: 'English' },
|
||
jaJP: { zh: '日本語', en: '日本語', ja: '日本語' },
|
||
},
|
||
|
||
// 通用文案与枚举
|
||
common: {
|
||
confirm: { zh: '确定', en: 'Confirm', ja: '確認' },
|
||
cancel: { zh: '取消', en: 'Cancel', ja: 'キャンセル' },
|
||
close: { zh: '关闭', en: 'Close', ja: '閉じる' },
|
||
delete: { zh: '删除', en: 'Delete', ja: '削除' },
|
||
edit: { zh: '编辑', en: 'Edit', ja: '編集' },
|
||
operation: { zh: '操作', en: 'Actions', ja: '操作' },
|
||
name: { zh: '名称', en: 'Name', ja: '名前' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||
all: { zh: '全部', en: 'All', ja: 'すべて' },
|
||
min: { zh: '最小', en: 'Min', ja: '最小' },
|
||
max: { zh: '最大', en: 'Max', ja: '最大' },
|
||
reset: { zh: '重置', en: 'Reset', ja: 'リセット' },
|
||
loadFailed: { zh: '加载失败', en: 'Failed to load', ja: '読み込みに失敗しました' },
|
||
operationFailed: { zh: '操作失败', en: 'Operation failed', ja: '操作に失敗しました' },
|
||
createSuccess: { zh: '创建成功', en: 'Created successfully', ja: '作成しました' },
|
||
updateSuccess: { zh: '修改成功', en: 'Updated successfully', ja: '更新しました' },
|
||
deleteSuccess: { zh: '删除成功', en: 'Deleted successfully', ja: '削除しました' },
|
||
deleteFailed: { zh: '删除失败', en: 'Failed to delete', ja: '削除に失敗しました' },
|
||
confirmDelete: { zh: '确认删除', en: 'Confirm Deletion', ja: '削除の確認' },
|
||
refresh: { zh: '刷新', en: 'Refresh', ja: '更新' },
|
||
types: {
|
||
expense: { zh: '支出', en: 'Expense', ja: '支出' },
|
||
income: { zh: '收入', en: 'Income', ja: '収入' },
|
||
},
|
||
channel: {
|
||
wechat: { zh: '微信', en: 'WeChat', ja: 'WeChat' },
|
||
alipay: { zh: '支付宝', en: 'Alipay', ja: 'Alipay' },
|
||
cash: { zh: '现金', en: 'Cash', ja: '現金' },
|
||
bank: { zh: '银行卡', en: 'Bank Card', ja: '銀行カード' },
|
||
meituan: { zh: '美团', en: 'Meituan', ja: 'Meituan' },
|
||
taobao: { zh: '淘宝', en: 'Taobao', ja: 'Taobao' },
|
||
jd: { zh: '京东', en: 'JD', ja: 'JD' },
|
||
cmb: { zh: '招商银行', en: 'China Merchants Bank', ja: '招商銀行' },
|
||
bocom: { zh: '交通银行', en: 'Bank of Communications', ja: '交通銀行' },
|
||
},
|
||
},
|
||
|
||
// 登录页
|
||
login: {
|
||
title: { zh: '汇账 - 登录', en: 'Ledgerly - Sign In', ja: 'Ledgerly - ログイン' },
|
||
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
|
||
usernamePlaceholder: { zh: '请输入用户名', en: 'Enter your username', ja: 'ユーザー名を入力してください' },
|
||
passwordPlaceholder: { zh: '请输入密码', en: 'Enter your password', ja: 'パスワードを入力してください' },
|
||
submit: { zh: '登录', en: 'Sign In', ja: 'ログイン' },
|
||
toRegister: { zh: '没有账号?去注册', en: "Don't have an account? Sign up", ja: 'アカウントをお持ちでない方は新規登録' },
|
||
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password', ja: 'ユーザー名とパスワードを入力してください' },
|
||
loggingIn: { zh: '正在登录,请稍候…', en: 'Signing in, please wait…', ja: 'ログイン中です。少々お待ちください…' },
|
||
success: { zh: '登录成功', en: 'Signed in successfully', ja: 'ログインしました' },
|
||
failed: { zh: '登录失败', en: 'Sign in failed', ja: 'ログインに失敗しました' },
|
||
},
|
||
|
||
// 注册页
|
||
register: {
|
||
title: { zh: '汇账 - 注册', en: 'Ledgerly - Sign Up', ja: 'Ledgerly - 新規登録' },
|
||
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||
nickname: { zh: '昵称', en: 'Nickname', ja: 'ニックネーム' },
|
||
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
|
||
confirmPassword: { zh: '确认密码', en: 'Confirm Password', ja: 'パスワードの確認' },
|
||
usernamePlaceholder: { zh: '3-50个字符', en: '3-50 characters', ja: '3~50文字' },
|
||
nicknamePlaceholder: { zh: '可选', en: 'Optional', ja: '任意' },
|
||
passwordPlaceholder: { zh: '至少6个字符', en: 'At least 6 characters', ja: '6文字以上' },
|
||
confirmPasswordPlaceholder: { zh: '再次输入密码', en: 'Enter the password again', ja: 'パスワードをもう一度入力してください' },
|
||
submit: { zh: '注册', en: 'Sign Up', ja: '新規登録' },
|
||
toLogin: { zh: '已有账号?去登录', en: 'Already have an account? Sign in', ja: 'アカウントをお持ちの方はログイン' },
|
||
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password', ja: 'ユーザー名とパスワードを入力してください' },
|
||
usernameMin: { zh: '用户名至少3个字符', en: 'Username must be at least 3 characters', ja: 'ユーザー名は3文字以上で入力してください' },
|
||
passwordMin: { zh: '密码至少6个字符', en: 'Password must be at least 6 characters', ja: 'パスワードは6文字以上で入力してください' },
|
||
passwordMismatch: { zh: '两次密码不一致', en: 'The two passwords do not match', ja: 'パスワードが一致しません' },
|
||
success: { zh: '注册成功,请登录', en: 'Registered successfully, please sign in', ja: '登録しました。ログインしてください' },
|
||
failed: { zh: '注册失败', en: 'Registration failed', ja: '登録に失敗しました' },
|
||
},
|
||
|
||
// 主布局
|
||
layout: {
|
||
appTitle: { zh: '汇账', en: 'Ledgerly', ja: 'Ledgerly' },
|
||
appSubtitle: { zh: '个人财务管理', en: 'Personal Finance', ja: '個人財務管理' },
|
||
dashboard: { zh: '统计面板', en: 'Dashboard', ja: 'ダッシュボード' },
|
||
transactions: { zh: '收支记录', en: 'Transactions', ja: '収支記録' },
|
||
categories: { zh: '分类管理', en: 'Categories', ja: 'カテゴリ管理' },
|
||
tags: { zh: '标签管理', en: 'Tags', ja: 'タグ管理' },
|
||
rules: { zh: '规则管理', en: 'Rules', ja: 'ルール管理' },
|
||
emailBills: { zh: '邮箱账单', en: 'Email Bills', ja: 'メール請求' },
|
||
sqlQuery: { zh: '智能查数', en: 'Smart Data', ja: 'スマート集計' },
|
||
logs: { zh: '日志', en: 'Logs', ja: 'ログ' },
|
||
settings: { zh: '设置', en: 'Settings', ja: '設定' },
|
||
user: { zh: '用户', en: 'User', ja: 'ユーザー' },
|
||
logout: { zh: '退出', en: 'Sign Out', ja: 'ログアウト' },
|
||
},
|
||
|
||
// 数据库设置
|
||
database: {
|
||
title: { zh: '数据库设置', en: 'Database Settings', ja: 'データベース設定' },
|
||
setupTitle: { zh: '初始化数据库', en: 'Initialize Database', ja: 'データベースの初期化' },
|
||
intro: { zh: '可选择本地 SQLite 文件数据库或 MySQL 数据库。保存后立即生效并自动建表,原有数据库的数据保持不变。', en: 'Choose a local SQLite file database or a MySQL database. Changes take effect immediately with automatic table creation; data in the previous database is preserved.', ja: 'ローカルの SQLite ファイルデータベースまたは MySQL を選択できます。保存すると即時に反映され、テーブルが自動作成されます。以前のデータベースのデータは保持されます。' },
|
||
setupIntro: { zh: '首次使用请先完成数据库配置。推荐零配置的 SQLite(本地文件),也可以连接已有的 MySQL。', en: 'Please configure a database before first use. SQLite (local file) requires no setup; you may also connect to an existing MySQL.', ja: '初回利用の前にデータベースを設定してください。設定不要の SQLite(ローカルファイル)を推奨します。既存の MySQL に接続することもできます。' },
|
||
setupHint: { zh: '配置完成后即可登录使用;如需修改,可稍后在「数据库设置」中调整。', en: 'After configuration you can sign in. You can adjust it later in Database Settings.', ja: '設定後はログインして利用できます。後で「データベース設定」から変更できます。' },
|
||
configured: { zh: '已配置', en: 'Configured', ja: '設定済み' },
|
||
notConfigured: { zh: '未配置', en: 'Not configured', ja: '未設定' },
|
||
currentType: { zh: '当前类型', en: 'Current type', ja: '現在の種類' },
|
||
currentSummary: { zh: '连接地址', en: 'Connection', ja: '接続先' },
|
||
configFile: { zh: '配置文件', en: 'Config file', ja: '設定ファイル' },
|
||
type: { zh: '数据库类型', en: 'Database type', ja: 'データベースの種類' },
|
||
sqlitePath: { zh: '数据库文件', en: 'Database file', ja: 'データベースファイル' },
|
||
sqlitePathPlaceholder: { zh: '例如 data/ledgerly.db', en: 'e.g. data/ledgerly.db', ja: '例:data/ledgerly.db' },
|
||
sqliteHint: { zh: 'SQLite 为本地单文件数据库,路径相对于服务运行目录;建议使用 data 目录并做好持久化挂载。', en: 'SQLite is a single local file; the path is relative to the server working directory. Use a data directory with persistent storage.', ja: 'SQLite はローカルの単一ファイルです。パスはサーバーの作業ディレクトリからの相対パスです。data ディレクトリと永続化ストレージの利用を推奨します。' },
|
||
sqlitePathRequired: { zh: '请填写 SQLite 数据库文件路径', en: 'Please enter the SQLite database file path', ja: 'SQLite データベースファイルのパスを入力してください' },
|
||
mysqlRequired: { zh: '请填写主机地址、数据库名与用户名', en: 'Please fill in host, database and username', ja: 'ホスト、データベース名、ユーザー名を入力してください' },
|
||
host: { zh: '主机地址', en: 'Host', ja: 'ホスト' },
|
||
port: { zh: '端口', en: 'Port', ja: 'ポート' },
|
||
database: { zh: '数据库名', en: 'Database', ja: 'データベース名' },
|
||
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
|
||
passwordPlaceholder: { zh: '请输入密码', en: 'Enter password', ja: 'パスワードを入力してください' },
|
||
passwordKeep: { zh: '已配置,留空表示不修改', en: 'Configured; leave blank to keep unchanged', ja: '設定済み。空欄のままにすると変更されません' },
|
||
test: { zh: '测试连接', en: 'Test connection', ja: '接続テスト' },
|
||
save: { zh: '保存并应用', en: 'Save & Apply', ja: '保存して適用' },
|
||
testSuccess: { zh: '连接成功', en: 'Connection succeeded', ja: '接続に成功しました' },
|
||
testFailed: { zh: '连接失败', en: 'Connection failed', ja: '接続に失敗しました' },
|
||
saveSuccess: { zh: '数据库配置已保存并生效', en: 'Database configuration saved and applied', ja: 'データベース設定を保存して適用しました' },
|
||
saveFailed: { zh: '数据库配置失败', en: 'Failed to configure database', ja: 'データベース設定に失敗しました' },
|
||
loadFailed: { zh: '加载数据库状态失败', en: 'Failed to load database status', ja: 'データベース状態の読み込みに失敗しました' },
|
||
},
|
||
|
||
// 系统设置
|
||
settings: {
|
||
title: { zh: '设置', en: 'Settings', ja: '設定' },
|
||
accountSection: { zh: '账号安全', en: 'Account Security', ja: 'アカウントセキュリティ' },
|
||
databaseSection: { zh: '数据库配置', en: 'Database', ja: 'データベース' },
|
||
aiSection: { zh: 'AI 模型配置', en: 'AI Model', ja: 'AI モデル' },
|
||
viewUsage: { zh: '使用情况', en: 'Usage', ja: '利用状況' },
|
||
registrationSection: { zh: '注册设置', en: 'Registration', ja: '登録設定' },
|
||
billSourceStatsSection: { zh: '账单来源统计默认值', en: 'Bill Source Stats Defaults', ja: '請求元の集計既定値' },
|
||
displaySection: { zh: '外观设置', en: 'Appearance', ja: '外観設定' },
|
||
navSection: { zh: '导航设置', en: 'Navigation', ja: 'ナビゲーション設定' },
|
||
notificationSection: { zh: '定时通知', en: 'Scheduled Notifications', ja: '定期通知' },
|
||
},
|
||
|
||
// 账号安全(修改密码)
|
||
account: {
|
||
oldPassword: { zh: '原密码', en: 'Current Password', ja: '現在のパスワード' },
|
||
oldPasswordPlaceholder: { zh: '请输入当前密码', en: 'Enter your current password', ja: '現在のパスワードを入力してください' },
|
||
newPassword: { zh: '新密码', en: 'New Password', ja: '新しいパスワード' },
|
||
newPasswordPlaceholder: { zh: '至少6个字符', en: 'At least 6 characters', ja: '6文字以上' },
|
||
confirmPassword: { zh: '确认新密码', en: 'Confirm New Password', ja: '新しいパスワード(確認)' },
|
||
confirmPasswordPlaceholder: { zh: '请再次输入新密码', en: 'Enter the new password again', ja: '新しいパスワードをもう一度入力してください' },
|
||
generate: { zh: '随机生成', en: 'Generate', ja: 'ランダム生成' },
|
||
copy: { zh: '复制', en: 'Copy', ja: 'コピー' },
|
||
copied: { zh: '密码已复制', en: 'Password copied', ja: 'パスワードをコピーしました' },
|
||
copyFailed: { zh: '复制失败,请手动选择', en: 'Copy failed, please select manually', ja: 'コピーに失敗しました。手動で選択してください' },
|
||
hint: { zh: '修改成功后请使用新密码登录;随机生成的密码请及时妥善保存', en: 'After changing, sign in with the new password; keep generated passwords safe.', ja: '変更後は新しいパスワードでログインしてください。生成したパスワードは大切に保管してください。' },
|
||
submit: { zh: '修改密码', en: 'Change Password', ja: 'パスワードを変更' },
|
||
oldRequired: { zh: '请输入原密码', en: 'Please enter your current password', ja: '現在のパスワードを入力してください' },
|
||
newMin: { zh: '新密码至少6个字符', en: 'New password must be at least 6 characters', ja: '新しいパスワードは6文字以上で入力してください' },
|
||
mismatch: { zh: '两次输入的新密码不一致', en: 'The two new passwords do not match', ja: '新しいパスワードが一致しません' },
|
||
sameAsOld: { zh: '新密码不能与原密码相同', en: 'New password must differ from the current password', ja: '新しいパスワードは現在のパスワードと異なる必要があります' },
|
||
success: { zh: '密码修改成功', en: 'Password changed successfully', ja: 'パスワードを変更しました' },
|
||
failed: { zh: '密码修改失败', en: 'Failed to change password', ja: 'パスワードの変更に失敗しました' },
|
||
},
|
||
|
||
// 账单来源统计默认值
|
||
billSourceStats: {
|
||
hint: { zh: '设置各账单来源导入时是否默认计入统计;不计入的记录仍会导入,但不参与统计', en: 'Set whether bills from each source count toward statistics by default. Excluded records are still imported but not counted.', ja: '各請求元の取り込み時に集計へ含めるかを設定します。除外した記録も取り込みますが集計対象外になります。' },
|
||
included: { zh: '计入统计', en: 'Included', ja: '集計対象' },
|
||
excluded: { zh: '不计入统计', en: 'Excluded', ja: '集計対象外' },
|
||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||
loadFailed: { zh: '加载账单来源统计默认值失败', en: 'Failed to load bill source stats defaults', ja: '請求元の集計既定値の読み込みに失敗しました' },
|
||
saveSuccess: { zh: '账单来源统计默认值已保存', en: 'Bill source stats defaults saved', ja: '請求元の集計既定値を保存しました' },
|
||
saveFailed: { zh: '保存账单来源统计默认值失败', en: 'Failed to save bill source stats defaults', ja: '請求元の集計既定値の保存に失敗しました' },
|
||
},
|
||
|
||
// 外观设置
|
||
display: {
|
||
hint: { zh: '选择「不计入统计」的记录在收支记录列表中的展示方式,修改后自动保存', en: 'Choose how records excluded from stats are shown in the transaction list; changes are saved automatically', ja: '集計対象外の記録を収支リストでどのように表示するかを選択します。変更は自動保存されます' },
|
||
label: { zh: '不计入统计的记录样式', en: 'Excluded record style', ja: '集計対象外の記録スタイル' },
|
||
strikethrough: { zh: '删除线(整行划线)', en: 'Strikethrough (whole row)', ja: '取り消し線(行全体)' },
|
||
muted: { zh: '灰色标签(类型显示“不计入”,金额置灰)', en: 'Gray label (type shows "Excluded", amount grayed out)', ja: 'グレー表示(種類は「対象外」、金額はグレー)' },
|
||
previewLabel: { zh: '预览', en: 'Preview', ja: 'プレビュー' },
|
||
previewCategory: { zh: '餐饮', en: 'Dining', ja: '食事' },
|
||
previewRemark: { zh: '示例备注', en: 'Sample remark', ja: 'サンプル備考' },
|
||
saveFailed: { zh: '保存外观设置失败', en: 'Failed to save appearance settings', ja: '外観設定の保存に失敗しました' },
|
||
loadFailed: { zh: '加载外观设置失败', en: 'Failed to load appearance settings', ja: '外観設定の読み込みに失敗しました' },
|
||
hiddenDataLabel: { zh: '显示已隐藏备注的记录', en: 'Show records with hidden remarks', ja: '備考を非表示にした記録を表示' },
|
||
hiddenDataHint: { zh: '关闭时,已隐藏备注的记录不会出现在收支记录列表与导出中', en: 'When off, records with hidden remarks are excluded from the transaction list and export', ja: 'オフの場合、備考を非表示にした記録は収支リストとエクスポートに表示されません' },
|
||
hiddenDataSaved: { zh: '已更新隐藏备注记录的显示设置', en: 'Hidden remark record display updated', ja: '非表示備考の記録表示を更新しました' },
|
||
hiddenDataFailed: { zh: '更新隐藏备注记录的显示设置失败', en: 'Failed to update hidden remark record display', ja: '非表示備考の記録表示の更新に失敗しました' },
|
||
pageSizeLabel: { zh: '表格每页条数选项', en: 'Table page size options', ja: 'テーブルの1ページ件数オプション' },
|
||
pageSizeHint: { zh: '所有表格分页共用的每页条数候选列表,修改后自动保存;未配置时使用默认 10 / 20 / 50 / 100', en: 'Page size choices shared by all table pagination; changes are saved automatically. Defaults to 10 / 20 / 50 / 100 when unset', ja: 'すべてのテーブルで共通の1ページ件数候補。変更は自動保存されます。未設定時は 10 / 20 / 50 / 100 を使用' },
|
||
defaultPageSizeLabel: { zh: '默认每页条数', en: 'Default page size', ja: '既定の1ページ件数' },
|
||
pageSizeEmpty: { zh: '请至少填写一个每页条数', en: 'Enter at least one page size', ja: '1ページ件数を1つ以上入力してください' },
|
||
pageSizeFailed: { zh: '保存每页条数选项失败', en: 'Failed to save page size options', ja: '1ページ件数オプションの保存に失敗しました' },
|
||
},
|
||
|
||
// 导航设置
|
||
nav: {
|
||
hint: { zh: '调整左侧导航的显示顺序与显隐;拖动手柄可排序,隐藏后仅移除菜单入口,页面仍可通过地址访问', en: 'Adjust the order and visibility of the left navigation. Drag the handle to reorder; hidden items are removed from the menu but remain accessible by URL', ja: '左側ナビゲーションの並び順と表示・非表示を調整します。ハンドルをドラッグして並べ替えでき、非表示にしても URL からアクセスできます' },
|
||
dragHint: { zh: '拖动手柄调整顺序', en: 'Drag the handle to reorder', ja: 'ハンドルをドラッグして並べ替え' },
|
||
show: { zh: '显示', en: 'Show', ja: '表示' },
|
||
hide: { zh: '隐藏', en: 'Hide', ja: '非表示' },
|
||
resetDefault: { zh: '恢复默认', en: 'Reset to default', ja: '既定に戻す' },
|
||
resetSuccess: { zh: '已恢复默认导航设置', en: 'Navigation reset to default', ja: 'ナビゲーションを既定に戻しました' },
|
||
loadFailed: { zh: '加载导航设置失败', en: 'Failed to load navigation settings', ja: 'ナビゲーション設定の読み込みに失敗しました' },
|
||
saveFailed: { zh: '保存导航设置失败', en: 'Failed to save navigation settings', ja: 'ナビゲーション設定の保存に失敗しました' },
|
||
hideLastForbidden: { zh: '至少保留一个可见导航', en: 'Keep at least one navigation item visible', ja: 'ナビゲーションを1つ以上表示してください' },
|
||
},
|
||
|
||
// 注册设置
|
||
registration: {
|
||
statusOn: { zh: '已开启', en: 'Enabled', ja: '有効' },
|
||
statusOff: { zh: '已关闭', en: 'Disabled', ja: '無効' },
|
||
enabledHint: { zh: '关闭后新用户无法注册;系统无任何用户时仍可创建首个账号', en: 'When off, new users cannot sign up; the first account can still be created when there are no users.', ja: 'オフにすると新規登録できません。ユーザーが一人もいない場合は最初のアカウントを作成できます。' },
|
||
firstUserHint: { zh: '当前系统暂无用户,可直接注册首个账号', en: 'No users yet — you can register the first account directly.', ja: '現在ユーザーがいないため、最初のアカウントを直接登録できます。' },
|
||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||
saveSuccess: { zh: '注册设置已保存', en: 'Registration settings saved', ja: '登録設定を保存しました' },
|
||
saveFailed: { zh: '保存注册设置失败', en: 'Failed to save registration settings', ja: '登録設定の保存に失敗しました' },
|
||
loadFailed: { zh: '加载注册状态失败', en: 'Failed to load registration status', ja: '登録状態の読み込みに失敗しました' },
|
||
},
|
||
|
||
// 定时通知
|
||
notification: {
|
||
statusOn: { zh: '已开启', en: 'Enabled', ja: '有効' },
|
||
statusOff: { zh: '已关闭', en: 'Disabled', ja: '無効' },
|
||
intro: { zh: '按自定义周期,通过邮箱或 Server 酱提醒你及时导入新的账单。', en: 'Get reminded via email or ServerChan to import new bills on your own schedule.', ja: 'カスタム周期でメール・ServerChan を通じて、新しい明細のインポートをお知らせします。' },
|
||
linkUrl: { zh: '通知链接地址', en: 'Notification link URL', ja: '通知リンク URL' },
|
||
linkUrlPlaceholder: { zh: '如 https://finance.rosercode.cn/bill-import', en: 'e.g. https://finance.rosercode.cn/bill-import', ja: '例:https://finance.rosercode.cn/bill-import' },
|
||
linkUrlSaveSuccess: { zh: '通知链接地址已保存', en: 'Notification link URL saved', ja: '通知リンク URL を保存しました' },
|
||
linkUrlSaveFailed: { zh: '保存通知链接地址失败', en: 'Failed to save notification link URL', ja: '通知リンク URL の保存に失敗しました' },
|
||
enabled: { zh: '启用定时提醒', en: 'Enable reminders', ja: '定期リマインダーを有効化' },
|
||
enabledHint: { zh: '开启后按下方周期自动发送提醒', en: 'Sends reminders automatically based on the schedule below', ja: '有効にすると以下の周期で自動送信します' },
|
||
frequency: { zh: '提醒周期', en: 'Frequency', ja: '通知周期' },
|
||
freqDaily: { zh: '每天', en: 'Daily', ja: '毎日' },
|
||
freqWeekly: { zh: '每周', en: 'Weekly', ja: '毎週' },
|
||
freqMonthly: { zh: '每月', en: 'Monthly', ja: '毎月' },
|
||
weekday1: { zh: '周一', en: 'Monday', ja: '月曜日' },
|
||
weekday2: { zh: '周二', en: 'Tuesday', ja: '火曜日' },
|
||
weekday3: { zh: '周三', en: 'Wednesday', ja: '水曜日' },
|
||
weekday4: { zh: '周四', en: 'Thursday', ja: '木曜日' },
|
||
weekday5: { zh: '周五', en: 'Friday', ja: '金曜日' },
|
||
weekday6: { zh: '周六', en: 'Saturday', ja: '土曜日' },
|
||
weekday7: { zh: '周日', en: 'Sunday', ja: '日曜日' },
|
||
dayOfMonthSuffix: { zh: '日', en: 'day', ja: '日' },
|
||
sendTime: { zh: '提醒时间', en: 'Time', ja: '通知時刻' },
|
||
sendTimePlaceholder: { zh: '例如 09:00', en: 'e.g. 09:00', ja: '例:09:00' },
|
||
sendTimeInvalid: { zh: '提醒时间格式应为 HH:mm', en: 'Time must be in HH:mm format', ja: '時刻は HH:mm 形式で入力してください' },
|
||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||
saveSuccess: { zh: '通知设置已保存', en: 'Notification settings saved', ja: '通知設定を保存しました' },
|
||
sendNow: { zh: '立即发送', en: 'Send now', ja: '今すぐ送信' },
|
||
sendNowSuccess: { zh: '已发送 {count} 个渠道', en: 'Sent to {count} channel(s)', ja: '{count} 件のチャネルに送信しました' },
|
||
sendNowFailed: { zh: '发送提醒失败', en: 'Failed to send reminder', ja: 'リマインダーの送信に失敗しました' },
|
||
channels: { zh: '推送渠道', en: 'Channels', ja: '通知チャネル' },
|
||
addChannel: { zh: '添加渠道', en: 'Add channel', ja: 'チャネルを追加' },
|
||
editChannel: { zh: '编辑渠道', en: 'Edit channel', ja: 'チャネルを編集' },
|
||
channelType: { zh: '渠道类型', en: 'Type', ja: 'チャネル種別' },
|
||
channelName: { zh: '渠道名称', en: 'Name', ja: 'チャネル名' },
|
||
channelNamePlaceholder: { zh: '便于识别的名称', en: 'A name to identify it', ja: '識別しやすい名前' },
|
||
enabledLabel: { zh: '已启用', en: 'Enabled', ja: '有効' },
|
||
disabledLabel: { zh: '已停用', en: 'Disabled', ja: '無効' },
|
||
typeEmail: { zh: '邮箱', en: 'Email', ja: 'メール' },
|
||
typeServerChan: { zh: 'Server 酱', en: 'ServerChan', ja: 'ServerChan' },
|
||
smtpHost: { zh: 'SMTP 服务器', en: 'SMTP host', ja: 'SMTP サーバー' },
|
||
smtpPort: { zh: 'SMTP 端口', en: 'SMTP port', ja: 'SMTP ポート' },
|
||
username: { zh: '邮箱账号', en: 'Email account', ja: 'メールアカウント' },
|
||
usernameRequired: { zh: '请填写邮箱账号', en: 'Please enter the email account', ja: 'メールアカウントを入力してください' },
|
||
sendKey: { zh: 'SendKey', en: 'SendKey', ja: 'SendKey' },
|
||
sendKeyPlaceholder: { zh: '在 sct.ftqq.com 获取的 SendKey', en: 'SendKey obtained from sct.ftqq.com', ja: 'sct.ftqq.com で取得した SendKey' },
|
||
sendKeyRequired: { zh: '请填写 Server 酱 SendKey', en: 'Please enter the ServerChan SendKey', ja: 'ServerChan の SendKey を入力してください' },
|
||
password: { zh: '授权码', en: 'Auth code', ja: '認証コード' },
|
||
passwordPlaceholder: { zh: '邮箱 SMTP 授权码', en: 'SMTP authorization code', ja: 'SMTP 認証コード' },
|
||
passwordKeep: { zh: '已配置,留空表示不修改', en: 'Configured; leave blank to keep', ja: '設定済み。空欄なら変更しません' },
|
||
to: { zh: '收件人', en: 'Recipient', ja: '宛先' },
|
||
toPlaceholder: { zh: '默认与账号相同', en: 'Defaults to the account', ja: '既定ではアカウントと同じ' },
|
||
ssl: { zh: '使用 SSL', en: 'Use SSL', ja: 'SSL を使用' },
|
||
test: { zh: '测试', en: 'Test', ja: 'テスト' },
|
||
testSuccess: { zh: '测试消息已发送', en: 'Test message sent', ja: 'テストメッセージを送信しました' },
|
||
testFailed: { zh: '测试发送失败', en: 'Test failed', ja: 'テスト送信に失敗しました' },
|
||
confirmDeleteChannel: { zh: '确认删除渠道「{name}」?', en: 'Delete channel "{name}"?', ja: 'チャネル「{name}」を削除しますか?' },
|
||
saveChannelSuccess: { zh: '渠道已保存', en: 'Channel saved', ja: 'チャネルを保存しました' },
|
||
noChannels: { zh: '暂无渠道,请先添加', en: 'No channels yet, please add one', ja: 'チャネルがありません。追加してください' },
|
||
logs: { zh: '最近发送记录', en: 'Recent deliveries', ja: '最近の送信履歴' },
|
||
success: { zh: '成功', en: 'Success', ja: '成功' },
|
||
failed: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||
noLogs: { zh: '暂无发送记录', en: 'No delivery records yet', ja: '送信履歴はまだありません' },
|
||
loadFailed: { zh: '加载通知设置失败', en: 'Failed to load notification settings', ja: '通知設定の読み込みに失敗しました' },
|
||
},
|
||
|
||
// 模型使用情况
|
||
aiUsage: {
|
||
title: { zh: '模型使用情况', en: 'Model Usage', ja: 'モデル利用状況' },
|
||
back: { zh: '返回设置', en: 'Back to Settings', ja: '設定に戻る' },
|
||
},
|
||
|
||
// 系统日志
|
||
log: {
|
||
title: { zh: '日志', en: 'Logs', ja: 'ログ' },
|
||
httpTab: { zh: '访问日志', en: 'Access Logs', ja: 'アクセスログ' },
|
||
loginTab: { zh: '登录日志', en: 'Login Logs', ja: 'ログインログ' },
|
||
appTab: { zh: '运行日志', en: 'Application Logs', ja: 'アプリログ' },
|
||
keyword: { zh: '关键字', en: 'Keyword', ja: 'キーワード' },
|
||
keywordPlaceholder: { zh: '路径 / 参数 / IP', en: 'Path / Query / IP', ja: 'パス / クエリ / IP' },
|
||
method: { zh: '请求方法', en: 'Method', ja: 'メソッド' },
|
||
status: { zh: '状态码', en: 'Status', ja: 'ステータス' },
|
||
result: { zh: '结果', en: 'Result', ja: '結果' },
|
||
level: { zh: '级别', en: 'Level', ja: 'レベル' },
|
||
date: { zh: '日期', en: 'Date', ja: '日付' },
|
||
datePlaceholder: { zh: 'yyyy-MM-dd,留空为当前', en: 'yyyy-MM-dd, blank for current', ja: 'yyyy-MM-dd、空欄で現在' },
|
||
range1h: { zh: '最近1小时', en: 'Last 1h', ja: '直近1時間' },
|
||
range6h: { zh: '最近6小时', en: 'Last 6h', ja: '直近6時間' },
|
||
range24h: { zh: '最近24小时', en: 'Last 24h', ja: '直近24時間' },
|
||
rangeAll: { zh: '全部', en: 'All', ja: 'すべて' },
|
||
lines: { zh: '行数', en: 'Lines', ja: '行数' },
|
||
file: { zh: '文件', en: 'File', ja: 'ファイル' },
|
||
totalLines: { zh: '命中 {count} 行', en: '{count} line(s) matched', ja: '{count} 行が一致' },
|
||
search: { zh: '查询', en: 'Search', ja: '検索' },
|
||
refresh: { zh: '刷新', en: 'Refresh', ja: '更新' },
|
||
realtime: { zh: '实时', en: 'Live', ja: 'リアルタイム' },
|
||
time: { zh: '时间', en: 'Time', ja: '時刻' },
|
||
path: { zh: '路径', en: 'Path', ja: 'パス' },
|
||
queryString: { zh: '参数', en: 'Query', ja: 'クエリ' },
|
||
duration: { zh: '耗时', en: 'Duration', ja: '所要時間' },
|
||
ip: { zh: 'IP', en: 'IP', ja: 'IP' },
|
||
user: { zh: '用户', en: 'User', ja: 'ユーザー' },
|
||
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||
userAgent: { zh: 'User-Agent', en: 'User-Agent', ja: 'User-Agent' },
|
||
message: { zh: '说明', en: 'Message', ja: '説明' },
|
||
success: { zh: '成功', en: 'Success', ja: '成功' },
|
||
failed: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||
anonymous: { zh: '未登录', en: 'Anonymous', ja: '未ログイン' },
|
||
noData: { zh: '暂无日志', en: 'No logs', ja: 'ログがありません' },
|
||
appEmpty: { zh: '暂无运行日志', en: 'No application logs', ja: 'アプリログがありません' },
|
||
retention: { zh: '日志保留', en: 'Log retention', ja: 'ログ保持' },
|
||
retention30: { zh: '30 天', en: '30 days', ja: '30日' },
|
||
retention90: { zh: '90 天', en: '90 days', ja: '90日' },
|
||
retention180: { zh: '180 天', en: '180 days', ja: '180日' },
|
||
retentionForever: { zh: '永久保留', en: 'Forever', ja: '永久保持' },
|
||
retentionSaved: { zh: '日志保留策略已保存', en: 'Log retention saved', ja: 'ログ保持を保存しました' },
|
||
retentionFailed: { zh: '保存日志保留策略失败', en: 'Failed to save log retention', ja: 'ログ保持の保存に失敗しました' },
|
||
loadFailed: { zh: '加载日志失败', en: 'Failed to load logs', ja: 'ログの読み込みに失敗しました' },
|
||
},
|
||
|
||
// 统计面板
|
||
dashboard: {
|
||
title: { zh: '统计面板', en: 'Dashboard', ja: 'ダッシュボード' },
|
||
range: {
|
||
month: { zh: '本月', en: 'This Month', ja: '今月' },
|
||
'3month': { zh: '近3月', en: 'Last 3 Months', ja: '過去3か月' },
|
||
'12month': { zh: '近12月', en: 'Last 12 Months', ja: '過去12か月' },
|
||
custom: { zh: '自定义', en: 'Custom', ja: 'カスタム' },
|
||
},
|
||
granularity: {
|
||
day: { zh: '按日', en: 'Daily', ja: '日別' },
|
||
week: { zh: '按周', en: 'Weekly', ja: '週別' },
|
||
month: { zh: '按月', en: 'Monthly', ja: '月別' },
|
||
quarter: { zh: '按季', en: 'Quarterly', ja: '四半期別' },
|
||
year: { zh: '按年', en: 'Yearly', ja: '年別' },
|
||
},
|
||
filterStatsScope: { zh: '统计口径', en: 'Stats Scope', ja: '集計範囲' },
|
||
statsScope: {
|
||
included: { zh: '仅计入统计', en: 'Included Only', ja: '集計対象のみ' },
|
||
all: { zh: '全部记录', en: 'All Records', ja: 'すべての記録' },
|
||
excluded: { zh: '仅不计入', en: 'Excluded Only', ja: '集計対象外のみ' },
|
||
},
|
||
filterType: { zh: '类型', en: 'Type', ja: '種類' },
|
||
filterCategory: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||
filterChannel: { zh: '交易渠道', en: 'Channel', ja: '取引チャネル' },
|
||
filterTag: { zh: '标签', en: 'Tag', ja: 'タグ' },
|
||
aiSearchPlaceholder: { zh: '用一句话描述统计需求,如「上个月餐饮花了多少」', en: 'Describe what to analyze, e.g. "How much did I spend on dining last month?"', ja: '集計したい内容を文章で入力(例:先月の飲食費は?)' },
|
||
aiSearchButton: { zh: 'AI 搜索', en: 'AI Search', ja: 'AI 検索' },
|
||
aiSearchEmpty: { zh: '请输入统计需求', en: 'Please enter a query', ja: '検索内容を入力してください' },
|
||
aiSearchApplied: { zh: '已按 AI 解析结果更新统计', en: 'Statistics updated from AI parsing', ja: 'AI の解析結果で統計を更新しました' },
|
||
aiSearchFailed: { zh: 'AI 统计搜索失败', en: 'AI statistics search failed', ja: 'AI 統計検索に失敗しました' },
|
||
aiExample1: { zh: '上个月餐饮花了多少', en: 'How much on dining last month?', ja: '先月の飲食費は?' },
|
||
aiExample2: { zh: '近半年交通支出趋势,按周看', en: 'Transport spending trend over the last 6 months, weekly', ja: '直近半年の交通費の推移を週別で' },
|
||
aiExample3: { zh: '今年各类支出占比', en: 'Expense breakdown by category this year', ja: '今年のカテゴリ別支出割合' },
|
||
minAmount: { zh: '最小金额', en: 'Min Amount', ja: '最小金額' },
|
||
maxAmount: { zh: '最大金额', en: 'Max Amount', ja: '最大金額' },
|
||
remark: { zh: '备注搜索', en: 'Search Remark', ja: '備考検索' },
|
||
resetFilters: { zh: '重置筛选', en: 'Reset Filters', ja: 'フィルターをリセット' },
|
||
totalIncome: { zh: '总收入', en: 'Total Income', ja: '総収入' },
|
||
totalExpense: { zh: '总支出', en: 'Total Expense', ja: '総支出' },
|
||
balance: { zh: '结余', en: 'Balance', ja: '収支' },
|
||
transactionCount: { zh: '交易笔数', en: 'Transactions', ja: '取引件数' },
|
||
avgDailyIncome: { zh: '日均收入', en: 'Avg. Daily Income', ja: '1日平均収入' },
|
||
avgDailyExpense: { zh: '日均支出', en: 'Avg. Daily Expense', ja: '1日平均支出' },
|
||
maxExpense: { zh: '最大单笔支出', en: 'Largest Expense', ja: '最大の支出' },
|
||
avgExpense: { zh: '平均每笔支出', en: 'Avg. Expense', ja: '平均支出' },
|
||
trend: { zh: '收支趋势', en: 'Income & Expense Trend', ja: '収支の推移' },
|
||
trendClickHint: { zh: '点击柱子查看对应明细', en: 'Click a bar to view matching records', ja: '棒をクリックすると該当明細を表示' },
|
||
expenseCategoryPie: { zh: '支出分类占比', en: 'Expense by Category', ja: '支出カテゴリの割合' },
|
||
incomeCategoryPie: { zh: '收入分类占比', en: 'Income by Category', ja: '収入カテゴリの割合' },
|
||
expenseChannelPie: { zh: '支出交易渠道占比', en: 'Expense by Channel', ja: '支出の取引チャネル割合' },
|
||
incomeChannelPie: { zh: '收入交易渠道占比', en: 'Income by Channel', ja: '収入の取引チャネル割合' },
|
||
uncategorized: { zh: '未分类', en: 'Uncategorized', ja: '未分類' },
|
||
viewTransactions: { zh: '查看收支记录', en: 'View Transactions', ja: '収支記録を表示' },
|
||
},
|
||
|
||
// 收支记录
|
||
transaction: {
|
||
title: { zh: '收支记录', en: 'Transactions', ja: '収支記録' },
|
||
sortLabel: { zh: '排序:', en: 'Sort:', ja: '並び順:' },
|
||
sort: {
|
||
timeDesc: { zh: '交易时间(新→旧)', en: 'Time (Newest First)', ja: '取引日時(新しい順)' },
|
||
timeAsc: { zh: '交易时间(旧→新)', en: 'Time (Oldest First)', ja: '取引日時(古い順)' },
|
||
amountDesc: { zh: '金额(高→低)', en: 'Amount (High to Low)', ja: '金額(高い順)' },
|
||
amountAsc: { zh: '金额(低→高)', en: 'Amount (Low to High)', ja: '金額(低い順)' },
|
||
},
|
||
batchSet: { zh: '一键设置', en: 'Batch Set', ja: '一括設定' },
|
||
batchMode: { zh: '批量操作', en: 'Batch', ja: '一括操作' },
|
||
exitBatchMode: { zh: '退出批量', en: 'Exit Batch', ja: '一括終了' },
|
||
importBill: { zh: '导入账单', en: 'Import Bill', ja: '明細をインポート' },
|
||
exportExcel: { zh: '导出 Excel', en: 'Export Excel', ja: 'Excel をエクスポート' },
|
||
viewStatistics: { zh: '查看统计', en: 'View Statistics', ja: '統計を表示' },
|
||
addRecord: { zh: '新增记录', en: 'Add Record', ja: '記録を追加' },
|
||
moreFilter: { zh: '更多筛选', en: 'More Filters', ja: '詳細フィルター' },
|
||
clear: { zh: '清空', en: 'Clear', ja: 'クリア' },
|
||
amountRange: { zh: '金额区间', en: 'Amount Range', ja: '金額範囲' },
|
||
search: { zh: '查询', en: 'Search', ja: '検索' },
|
||
reset: { zh: '重置', en: 'Reset', ja: 'リセット' },
|
||
activeFilters: { zh: '已激活:', en: 'Active:', ja: '適用中:' },
|
||
clearAll: { zh: '清空全部', en: 'Clear all', ja: 'すべてクリア' },
|
||
exampleLabel: { zh: '示例', en: 'Examples', ja: '例' },
|
||
summary: { zh: '总计 {total} 条 · 第 {page} / {pages} 页 · 每页 {size} 条', en: 'Total {total} · Page {page} / {pages} · {size} per page', ja: '合計 {total} 件 · {page} / {pages} ページ · 1ページ {size} 件' },
|
||
pageExpense: { zh: '本页支出', en: 'Page Expense', ja: 'このページの支出' },
|
||
pageIncome: { zh: '本页收入', en: 'Page Income', ja: 'このページの収入' },
|
||
pageBalance: { zh: '本页结余', en: 'Page Balance', ja: 'このページの収支' },
|
||
pageExcluded: { zh: '(不计入统计:支出 {expense} · 收入 {income})', en: '(Excluded: expense {expense} · income {income})', ja: '(集計対象外:支出 {expense} · 収入 {income})' },
|
||
column: {
|
||
index: { zh: '序号', en: 'No.', ja: 'No.' },
|
||
transactionTime: { zh: '交易时间', en: 'Time', ja: '取引日時' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||
channel: { zh: '交易渠道', en: 'Channel', ja: '取引チャネル' },
|
||
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||
tags: { zh: '标签', en: 'Tags', ja: 'タグ' },
|
||
includeInStats: { zh: '计入统计', en: 'In Stats', ja: '集計対象' },
|
||
actions: { zh: '操作', en: 'Actions', ja: '操作' },
|
||
},
|
||
notIncluded: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||
uncategorized: { zh: '未分类', en: 'Uncategorized', ja: '未分類' },
|
||
untagged: { zh: '无标签', en: 'Untagged', ja: 'タグなし' },
|
||
remarkHidden: { zh: '备注已隐藏', en: 'Remark hidden', ja: '備考を非表示にしました' },
|
||
remarkView: { zh: '查看', en: 'View', ja: '表示' },
|
||
remarkHide: { zh: '隐藏', en: 'Hide', ja: '非表示' },
|
||
remarkCollapse: { zh: '收起', en: 'Collapse', ja: '折りたたむ' },
|
||
remarkUnhide: { zh: '取消隐藏', en: 'Unhide', ja: '非表示を解除' },
|
||
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||
rawDataTitle: { zh: '原始账单数据', en: 'Raw Bill Data', ja: '元の明細データ' },
|
||
sourceImages: { zh: '来源图片', en: 'Source Images', ja: '元の画像' },
|
||
viewImages: { zh: '查看({count})', en: 'View ({count})', ja: '表示({count})' },
|
||
loadOriginal: { zh: '加载原图', en: 'Load Original', ja: '元画像を読み込む' },
|
||
originalImage: { zh: '原图', en: 'Original', ja: '元画像' },
|
||
createdTime: { zh: '创建时间:{time}', en: 'Created: {time}', ja: '作成日時:{time}' },
|
||
editRecord: { zh: '编辑记录', en: 'Edit Record', ja: '記録を編集' },
|
||
addRecordTitle: { zh: '新增记录', en: 'Add Record', ja: '記録を追加' },
|
||
batchTitle: { zh: '一键设置分类与统计', en: 'Batch Set Category & Stats', ja: 'カテゴリと集計を一括設定' },
|
||
batchScope: { zh: '作用范围', en: 'Scope', ja: '対象範囲' },
|
||
batchScopeHint: { zh: '将对当前表格展示的 {count} 条记录设置分类与计入统计', en: 'Apply category and stats settings to the {count} records shown in the table', ja: '現在表示中の {count} 件の記録にカテゴリと集計設定を適用します' },
|
||
expenseCategory: { zh: '支出分类', en: 'Expense Category', ja: '支出カテゴリ' },
|
||
incomeCategory: { zh: '收入分类', en: 'Income Category', ja: '収入カテゴリ' },
|
||
notSetExpense: { zh: '不设置支出分类', en: 'No expense category', ja: '支出カテゴリを設定しない' },
|
||
notSetIncome: { zh: '不设置收入分类', en: 'No income category', ja: '収入カテゴリを設定しない' },
|
||
addTag: { zh: '添加标签', en: 'Add Tags', ja: 'タグを追加' },
|
||
removeTag: { zh: '移除标签', en: 'Remove Tags', ja: 'タグを削除' },
|
||
notAddTag: { zh: '不添加标签', en: 'No tags to add', ja: 'タグを追加しない' },
|
||
notRemoveTag: { zh: '不移除标签', en: 'No tags to remove', ja: 'タグを削除しない' },
|
||
batchStats: {
|
||
keep: { zh: '不修改', en: 'No Change', ja: '変更しない' },
|
||
include: { zh: '计入统计', en: 'Include in Stats', ja: '集計に含める' },
|
||
exclude: { zh: '不计入统计', en: 'Exclude from Stats', ja: '集計から除外' },
|
||
},
|
||
includeInStats: { zh: '计入统计', en: 'In Stats', ja: '集計対象' },
|
||
includeInStatsHint: { zh: '关闭后不纳入月度统计(如借款、转账等)', en: 'When off, excluded from monthly stats (e.g. loans, transfers)', ja: 'オフにすると月次集計に含まれません(借入・振替など)' },
|
||
deleteConfirm: { zh: '确定要删除这条记录吗?', en: 'Are you sure you want to delete this record?', ja: 'この記録を削除してもよろしいですか?' },
|
||
selectCategory: { zh: '请选择分类', en: 'Please select a category', ja: 'カテゴリを選択してください' },
|
||
validAmount: { zh: '请输入有效金额', en: 'Please enter a valid amount', ja: '有効な金額を入力してください' },
|
||
selectCategoryPlaceholder: { zh: '请选择分类', en: 'Select a category', ja: 'カテゴリを選択' },
|
||
amountPlaceholder: { zh: '请输入金额', en: 'Enter amount', ja: '金額を入力してください' },
|
||
channelPlaceholder: { zh: '选择交易渠道', en: 'Select channel', ja: '取引チャネルを選択' },
|
||
remarkPlaceholder: { zh: '可选备注说明', en: 'Optional remark', ja: '備考(任意)' },
|
||
remarkHistoryClear: { zh: '清空历史', en: 'Clear history', ja: '履歴をクリア' },
|
||
tagPlaceholder: { zh: '选择标签', en: 'Select tags', ja: 'タグを選択' },
|
||
noRawData: { zh: '该记录没有原始账单数据', en: 'This record has no raw bill data', ja: 'この記録には元の明細データがありません' },
|
||
remarkHiddenSuccess: { zh: '已隐藏备注', en: 'Remark hidden', ja: '備考を非表示にしました' },
|
||
remarkShownSuccess: { zh: '已取消隐藏', en: 'Remark unhidden', ja: '備考の非表示を解除しました' },
|
||
statsIncluded: { zh: '已计入统计', en: 'Included in stats', ja: '集計に含めました' },
|
||
statsExcluded: { zh: '已排除统计', en: 'Excluded from stats', ja: '集計から除外しました' },
|
||
noRecordsToSet: { zh: '当前表格没有可设置的记录', en: 'No records available in the current table', ja: '現在のテーブルに設定できる記録がありません' },
|
||
batchNothingSelected: { zh: '请至少选择分类、计入统计或标签', en: 'Please select a category, stats option or tag', ja: 'カテゴリ、集計設定、タグのいずれかを選択してください' },
|
||
batchUpdated: { zh: '已更新 {count} 条记录 | 已更新 {count} 条记录', en: 'Updated {count} record | Updated {count} records', ja: '{count} 件を更新しました' },
|
||
batchDelete: { zh: '批量删除', en: 'Batch Delete', ja: '一括削除' },
|
||
batchDeleteNone: { zh: '请先选择要删除的记录', en: 'Please select records to delete', ja: '削除する記録を選択してください' },
|
||
batchDeleteConfirm: { zh: '确定删除选中的 {count} 条记录吗?', en: 'Delete the {count} selected record(s)?', ja: '選択した {count} 件を削除しますか?' },
|
||
batchDeleted: { zh: '已删除 {count} 条记录', en: 'Deleted {count} record(s)', ja: '{count} 件を削除しました' },
|
||
exportConfirmTitle: { zh: '导出确认', en: 'Export Confirmation', ja: 'エクスポート確認' },
|
||
exportConfirm: { zh: '确定要按当前筛选条件导出账单吗?', en: 'Export bills with the current filters?', ja: '現在の絞り込み条件で明細をエクスポートしますか?' },
|
||
exportSuccess: { zh: '导出成功', en: 'Exported successfully', ja: 'エクスポートしました' },
|
||
exportFailed: { zh: '导出失败', en: 'Export failed', ja: 'エクスポートに失敗しました' },
|
||
exportFileName: { zh: '交易记录', en: 'transactions', ja: '取引記録' },
|
||
includeFilter: {
|
||
yes: { zh: '计入', en: 'Included', ja: '含める' },
|
||
no: { zh: '不计入', en: 'Excluded', ja: '含めない' },
|
||
},
|
||
relation: {
|
||
column: { zh: '关系', en: 'Relation', ja: '関連' },
|
||
viewCount: { zh: '{count} 个关系', en: '{count} relation(s)', ja: '{count} 件の関連' },
|
||
none: { zh: '-', en: '-', ja: '-' },
|
||
createFromSelection: { zh: '建立关系', en: 'Create Relation', ja: '関連を作成' },
|
||
selectAtLeastTwo: { zh: '请至少勾选两条账单', en: 'Please select at least two bills', ja: '明細を2件以上選択してください' },
|
||
title: { zh: '账单关系', en: 'Bill Relations', ja: '明細の関連' },
|
||
create: { zh: '新建关系', en: 'New Relation', ja: '関連を作成' },
|
||
createTitle: { zh: '新建账单关系', en: 'New Bill Relation', ja: '明細の関連を作成' },
|
||
editTitle: { zh: '编辑账单关系', en: 'Edit Bill Relation', ja: '明細の関連を編集' },
|
||
empty: { zh: '暂无关联账单', en: 'No related bills', ja: '関連する明細はありません' },
|
||
type: { zh: '关系类型', en: 'Relation Type', ja: '関連タイプ' },
|
||
typeParentChild: { zh: '父子关系', en: 'Parent-Child', ja: '親子関係' },
|
||
typeSibling: { zh: '同级关系', en: 'Sibling', ja: '同級関係' },
|
||
name: { zh: '关系名称', en: 'Relation Name', ja: '関連名' },
|
||
namePlaceholder: { zh: '可选,如「交通卡充值」', en: 'Optional, e.g. "Transit card top-up"', ja: '任意(例:交通カードのチャージ)' },
|
||
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||
members: { zh: '关联账单', en: 'Related Bills', ja: '関連する明細' },
|
||
addMember: { zh: '添加账单', en: 'Add Bill', ja: '明細を追加' },
|
||
pickTitle: { zh: '选择关联账单', en: 'Select Bills', ja: '明細を選択' },
|
||
roleParent: { zh: '父账单', en: 'Parent', ja: '親' },
|
||
roleChild: { zh: '子账单', en: 'Child', ja: '子' },
|
||
roleMember: { zh: '成员', en: 'Member', ja: 'メンバー' },
|
||
edgeLabel: { zh: '关联', en: 'Linked', ja: '関連' },
|
||
minTwo: { zh: '关系组至少包含两条账单', en: 'A relation group needs at least two bills', ja: '関連グループには最低2件の明細が必要です' },
|
||
needParent: { zh: '请指定一条父账单', en: 'Please select one parent bill', ja: '親の明細を1件指定してください' },
|
||
deleteConfirm: { zh: '确定删除该关系组?仅解除关联,不会删除账单', en: 'Delete this relation group? Only the relation is removed, not the bills', ja: 'この関連グループを削除しますか?明細は削除されません' },
|
||
saveFailed: { zh: '保存账单关系失败', en: 'Failed to save the relation', ja: '関連の保存に失敗しました' },
|
||
loadFailed: { zh: '加载账单关系失败', en: 'Failed to load relations', ja: '関連の読み込みに失敗しました' },
|
||
deleteFailed: { zh: '删除账单关系失败', en: 'Failed to delete the relation', ja: '関連の削除に失敗しました' },
|
||
},
|
||
detail: {
|
||
button: { zh: '详情', en: 'Details', ja: '詳細' },
|
||
title: { zh: '账单详情', en: 'Bill Details', ja: '明細の詳細' },
|
||
basicInfo: { zh: '基本信息', en: 'Basic Info', ja: '基本情報' },
|
||
relations: { zh: '账单关系', en: 'Bill Relations', ja: '明細の関連' },
|
||
images: { zh: '来源图片', en: 'Source Images', ja: '元の画像' },
|
||
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||
createdAt: { zh: '创建时间', en: 'Created', ja: '作成日時' },
|
||
noTags: { zh: '无标签', en: 'No tags', ja: 'タグなし' },
|
||
noImages: { zh: '无来源图片', en: 'No source images', ja: '元の画像はありません' },
|
||
noRawData: { zh: '无原始数据', en: 'No raw data', ja: '元データはありません' },
|
||
},
|
||
},
|
||
|
||
// 分类管理
|
||
category: {
|
||
title: { zh: '分类管理', en: 'Categories', ja: 'カテゴリ管理' },
|
||
add: { zh: '新增分类', en: 'Add Category', ja: 'カテゴリを追加' },
|
||
expenseSection: { zh: '支出分类', en: 'Expense Categories', ja: '支出カテゴリ' },
|
||
incomeSection: { zh: '收入分类', en: 'Income Categories', ja: '収入カテゴリ' },
|
||
editTitle: { zh: '编辑分类', en: 'Edit Category', ja: 'カテゴリを編集' },
|
||
addTitle: { zh: '新增分类', en: 'Add Category', ja: 'カテゴリを追加' },
|
||
name: { zh: '分类名称', en: 'Category Name', ja: 'カテゴリ名' },
|
||
namePlaceholder: { zh: '请输入分类名称', en: 'Enter category name', ja: 'カテゴリ名を入力してください' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
icon: { zh: '图标', en: 'Icon', ja: 'アイコン' },
|
||
iconPlaceholder: { zh: '点击选择 Emoji', en: 'Click to pick an emoji', ja: 'クリックして絵文字を選択' },
|
||
emojiInputPlaceholder: { zh: '自定义输入 Emoji 或文字', en: 'Custom emoji or text', ja: '絵文字または文字を自由に入力' },
|
||
clearIcon: { zh: '清除图标', en: 'Clear icon', ja: 'アイコンをクリア' },
|
||
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||
nameRequired: { zh: '请输入分类名称', en: 'Please enter a category name', ja: 'カテゴリ名を入力してください' },
|
||
deleteConfirm: { zh: '确定要删除这个分类吗?', en: 'Are you sure you want to delete this category?', ja: 'このカテゴリを削除してもよろしいですか?' },
|
||
},
|
||
|
||
// 标签管理
|
||
tag: {
|
||
title: { zh: '标签管理', en: 'Tags', ja: 'タグ管理' },
|
||
add: { zh: '新增标签', en: 'Add Tag', ja: 'タグを追加' },
|
||
editTitle: { zh: '编辑标签', en: 'Edit Tag', ja: 'タグを編集' },
|
||
addTitle: { zh: '新增标签', en: 'Add Tag', ja: 'タグを追加' },
|
||
name: { zh: '标签名称', en: 'Tag Name', ja: 'タグ名' },
|
||
namePlaceholder: { zh: '请输入标签名称', en: 'Enter tag name', ja: 'タグ名を入力してください' },
|
||
label: { zh: '标签', en: 'Tag', ja: 'タグ' },
|
||
color: { zh: '颜色', en: 'Color', ja: '色' },
|
||
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||
nameRequired: { zh: '请输入标签名称', en: 'Please enter a tag name', ja: 'タグ名を入力してください' },
|
||
deleteConfirm: { zh: '删除后将从所有交易记录中移除该标签,确定删除吗?', en: 'This tag will be removed from all transactions. Delete it?', ja: '削除するとすべての取引記録からこのタグが外れます。削除してもよろしいですか?' },
|
||
},
|
||
|
||
// 交易渠道管理(用户自定义)
|
||
channel: {
|
||
title: { zh: '交易渠道管理', en: 'Channel Management', ja: '取引チャネル管理' },
|
||
add: { zh: '新建渠道', en: 'New Channel', ja: 'チャネルを追加' },
|
||
addTitle: { zh: '新建渠道', en: 'New Channel', ja: 'チャネルを追加' },
|
||
editTitle: { zh: '重命名渠道', en: 'Rename Channel', ja: 'チャネル名を変更' },
|
||
name: { zh: '渠道名称', en: 'Channel name', ja: 'チャネル名' },
|
||
namePlaceholder: { zh: '请输入渠道名称', en: 'Enter channel name', ja: 'チャネル名を入力してください' },
|
||
nameRequired: { zh: '请输入渠道名称', en: 'Please enter a channel name', ja: 'チャネル名を入力してください' },
|
||
usage: { zh: '使用账单数', en: 'Used by', ja: '使用件数' },
|
||
usageCount: { zh: '{count} 笔账单', en: '{count} record(s)', ja: '{count} 件' },
|
||
unused: { zh: '未使用', en: 'Unused', ja: '未使用' },
|
||
deleteConfirm: { zh: '确定删除渠道「{name}」吗?', en: 'Delete channel "{name}"?', ja: 'チャネル「{name}」を削除しますか?' },
|
||
hint: { zh: '自定义渠道可用于记账与筛选;删除前需确保没有任何账单使用该渠道,改名不影响历史账单。', en: 'Custom channels can be used in entries and filters. A channel can only be deleted when no transaction uses it; renaming does not affect existing records.', ja: 'カスタムチャネルは記帳や絞り込みに利用できます。取引で使用中のチャネルは削除できません。名前の変更は既存の記録に影響しません。' },
|
||
manageEntry: { zh: '渠道管理', en: 'Channels', ja: 'チャネル管理' },
|
||
},
|
||
|
||
// 规则管理
|
||
rule: {
|
||
title: { zh: '规则管理', en: 'Rules', ja: 'ルール管理' },
|
||
add: { zh: '新增规则', en: 'Add Rule', ja: 'ルールを追加' },
|
||
editTitle: { zh: '编辑规则', en: 'Edit Rule', ja: 'ルールを編集' },
|
||
addTitle: { zh: '新增规则', en: 'Add Rule', ja: 'ルールを追加' },
|
||
name: { zh: '规则名称', en: 'Rule Name', ja: 'ルール名' },
|
||
namePlaceholder: { zh: '请输入规则名称', en: 'Enter rule name', ja: 'ルール名を入力してください' },
|
||
nameRequired: { zh: '请输入规则名称', en: 'Please enter a rule name', ja: 'ルール名を入力してください' },
|
||
condition: { zh: '匹配条件', en: 'Conditions', ja: '一致条件' },
|
||
keyword: { zh: '关键词', en: 'Keyword', ja: 'キーワード' },
|
||
keywordPlaceholder: { zh: '匹配备注/交易对方/商品名称,包含即命中', en: 'Matches remark / counterparty / product (contains)', ja: '備考/取引相手/商品名に含まれれば一致' },
|
||
amountRange: { zh: '金额区间', en: 'Amount Range', ja: '金額範囲' },
|
||
typeAny: { zh: '不限类型', en: 'Any type', ja: '種類を問わない' },
|
||
targetCategory: { zh: '目标分类', en: 'Target Category', ja: '対象カテゴリ' },
|
||
targetTags: { zh: '目标标签', en: 'Target Tags', ja: '対象タグ' },
|
||
notSetCategory: { zh: '不设置分类', en: 'No category', ja: 'カテゴリなし' },
|
||
notSetTag: { zh: '不设置标签', en: 'No tags', ja: 'タグなし' },
|
||
enabled: { zh: '启用', en: 'Enabled', ja: '有効' },
|
||
summaryKeyword: { zh: '含「{kw}」', en: 'contains "{kw}"', ja: '「{kw}」を含む' },
|
||
summaryAmountRange: { zh: '{min} ~ {max}', en: '{min} ~ {max}', ja: '{min} ~ {max}' },
|
||
summaryAmountMin: { zh: '≥ {min}', en: '≥ {min}', ja: '≥ {min}' },
|
||
summaryAmountMax: { zh: '≤ {max}', en: '≤ {max}', ja: '≤ {max}' },
|
||
summaryNone: { zh: '无条件', en: 'No condition', ja: '条件なし' },
|
||
deleteConfirm: { zh: '确定要删除这个规则吗?', en: 'Are you sure you want to delete this rule?', ja: 'このルールを削除してもよろしいですか?' },
|
||
loadCategoriesFailed: { zh: '加载分类失败', en: 'Failed to load categories', ja: 'カテゴリの読み込みに失敗しました' },
|
||
loadTagsFailed: { zh: '加载标签失败', en: 'Failed to load tags', ja: 'タグの読み込みに失敗しました' },
|
||
searchPlaceholder: { zh: '搜索规则名称或关键词', en: 'Search name or keyword', ja: 'ルール名またはキーワードを検索' },
|
||
status: { zh: '启用状态', en: 'Status', ja: '有効状態' },
|
||
statusOn: { zh: '已启用', en: 'Enabled', ja: '有効' },
|
||
statusOff: { zh: '已停用', en: 'Disabled', ja: '無効' },
|
||
batchDelete: { zh: '批量删除', en: 'Batch Delete', ja: '一括削除' },
|
||
batchDeleteNone: { zh: '请先选择要删除的规则', en: 'Please select rules to delete', ja: '削除するルールを選択してください' },
|
||
batchDeleteConfirm: { zh: '确定删除选中的 {count} 条规则吗?', en: 'Delete the {count} selected rule(s)?', ja: '選択した {count} 件のルールを削除しますか?' },
|
||
batchDeleted: { zh: '已删除 {count} 条规则', en: 'Deleted {count} rule(s)', ja: '{count} 件のルールを削除しました' },
|
||
},
|
||
|
||
// 账单导入
|
||
import: {
|
||
title: { zh: '导入账单', en: 'Import Bill', ja: '明細をインポート' },
|
||
billType: { zh: '账单类型:', en: 'Bill type:', ja: '明細の種類:' },
|
||
billTypeALIPAY: { zh: '支付宝', en: 'Alipay', ja: 'Alipay' },
|
||
billTypeWECHAT: { zh: '微信', en: 'WeChat', ja: 'WeChat' },
|
||
billTypeMEITUAN: { zh: '美团', en: 'Meituan', ja: 'Meituan' },
|
||
billTypeTAOBAO: { zh: '淘宝', en: 'Taobao', ja: 'Taobao' },
|
||
billTypeJD: { zh: '京东', en: 'JD', ja: 'JD' },
|
||
billTypeCMB: { zh: '招商银行', en: 'China Merchants Bank', ja: '招商銀行' },
|
||
billTypeBOCOM: { zh: '交通银行', en: 'Bank of Communications', ja: '交通銀行' },
|
||
billFile: { zh: '账单文件:', en: 'Bill file:', ja: '明細ファイル:' },
|
||
dropText: { zh: '点击或拖拽文件到此处', en: 'Click or drag a file here', ja: 'クリックまたはドラッグでファイルを選択' },
|
||
fileHint: { zh: '仅支持{label}导出的账单文件或 zip 压缩包({exts})', en: 'Only {label} bill files or zip archives are supported ({exts})', ja: '{label}からエクスポートした明細ファイルまたは zip 圧縮ファイルのみ対応({exts})' },
|
||
extSeparator: { zh: '、', en: ', ', ja: '、' },
|
||
exportHintALIPAY: { zh: '导出路径:支付宝 App → 我的 → 账单 → 开具交易流水证明 / 账单导出,选择 CSV 格式。', en: 'Export path: Alipay App → Me → Bills → Issue Transaction Record / Export Bill, choose CSV format.', ja: 'エクスポート手順:Alipay アプリ → マイ → 請求 → 取引履歴証明の発行 / 明細のエクスポート で CSV 形式を選択。' },
|
||
exportHintWECHAT: { zh: '导出路径:微信 App → 我 → 服务 → 钱包 → 账单 → 常见问题 → 下载账单 → 用于个人对账,选择 xlsx 格式。', en: 'Export path: WeChat App → Me → Services → Wallet → Bills → FAQ → Download Bills → For personal reconciliation, choose xlsx format.', ja: 'エクスポート手順:WeChat アプリ → 自分 → サービス → ウォレット → 請求 → よくある質問 → 請求書のダウンロード → 個人の照合用 で xlsx 形式を選択。' },
|
||
exportHintMEITUAN: { zh: '导出路径:美团 App → 我的 → 钱包 → 账单 → 开具账单证明(申请记录),选择 CSV 格式并设置解压密码。', en: 'Export path: Meituan App → Me → Wallet → Bills → Issue Bill Certificate (Application Record), choose CSV format and set an archive password.', ja: 'エクスポート手順:Meituan アプリ → マイ → ウォレット → 請求 → 請求証明の発行(申請履歴)で CSV 形式を選択し、解凍パスワードを設定。' },
|
||
exportHintTAOBAO: { zh: '导出路径:淘宝网页版 → 我的淘宝 → 我的订单 → 已买到的宝贝 → 导出订单,下载 xlsx。', en: 'Export path: Taobao web → My Taobao → My Orders → Purchased Items → Export Orders, download as xlsx.', ja: 'エクスポート手順:Taobao ウェブ版 → マイ淘宝 → マイ注文 → 購入済み商品 → 注文をエクスポート で xlsx をダウンロード。' },
|
||
exportHintJD: { zh: '导出路径:京东 App → 我的 → 设置 → 账单 → 右上角「…」→ 账单导出,设置接收邮箱后提交,从邮件下载 CSV(解压密码见邮件说明)。', en: 'Export path: JD App → Me → Settings → Bills → top-right "…" → Bill Export, set a receiving email and submit, then download the CSV from the email (archive password is in the email).', ja: 'エクスポート手順:JD アプリ → マイ → 設定 → 請求 → 右上の「…」→ 請求エクスポート で受信メールを設定して送信し、メールから CSV をダウンロード(解凍パスワードはメールに記載)。' },
|
||
exportHintCMB: { zh: '导出路径:招商银行 App → 我的 → 全部 → 交易流水,支持 CSV 或 PDF 格式导出(如需压缩包请设置解压密码)。', en: 'Export path: China Merchants Bank App → Me → All → Transaction Records; CSV or PDF is supported (set an archive password if zipped).', ja: 'エクスポート手順:招商銀行アプリ → マイ → すべて → 取引明細。CSV または PDF 形式に対応(圧縮する場合は解凍パスワードを設定)。' },
|
||
exportHintBOCOM: { zh: '导出路径:交通银行 App → 我的 → 银行卡 → 交易明细,选择查询时间段后导出 Excel(xls)。', en: 'Export path: Bank of Communications App → Me → Bank Cards → Transaction Details, choose a date range and export Excel (xls).', ja: 'エクスポート手順:交通銀行アプリ → マイ → 銀行カード → 取引明細 で期間を選択し Excel(xls)でエクスポート。' },
|
||
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||
expenseDefaultCategory: { zh: '支出默认分类(可不选):', en: 'Default expense category (optional):', ja: '支出の既定カテゴリ(任意):' },
|
||
incomeDefaultCategory: { zh: '收入默认分类(可不选):', en: 'Default income category (optional):', ja: '収入の既定カテゴリ(任意):' },
|
||
defaultTags: { zh: '默认标签(可不选):', en: 'Default tags (optional):', ja: '既定タグ(任意):' },
|
||
notSetCategory: { zh: '未选则不计分类', en: 'No category if unselected', ja: '未選択の場合は分類なし' },
|
||
notSetTag: { zh: '未选则不打标签', en: 'No tags if unselected', ja: '未選択の場合はタグなし' },
|
||
selectAll: { zh: '全选', en: 'Select All', ja: 'すべて選択' },
|
||
setIncluded: { zh: '设为计入', en: 'Set Included', ja: '集計に含める' },
|
||
setExcluded: { zh: '设为不计入', en: 'Set Excluded', ja: '集計から除外' },
|
||
previewSummary: { zh: '共 {total} 条,筛选后 {filtered} 条,已勾选 {checked} 条', en: 'Total {total}, {filtered} after filtering, {checked} selected', ja: '全 {total} 件、絞り込み後 {filtered} 件、選択済み {checked} 件' },
|
||
searchPlaceholder: { zh: '搜索交易对方/商品/单号', en: 'Search counterparty / product / order no.', ja: '取引相手/商品/注文番号を検索' },
|
||
typePlaceholder: { zh: '类型', en: 'Type', ja: '種類' },
|
||
statusPlaceholder: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||
typeFilter: {
|
||
income: { zh: '收入', en: 'Income', ja: '収入' },
|
||
expense: { zh: '支出', en: 'Expense', ja: '支出' },
|
||
neutral: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||
},
|
||
statusFilter: {
|
||
importable: { zh: '可导入', en: 'Importable', ja: 'インポート可' },
|
||
duplicate: { zh: '已存在', en: 'Duplicate', ja: '登録済み' },
|
||
error: { zh: '不可导入', en: 'Not Importable', ja: 'インポート不可' },
|
||
},
|
||
notIncluded: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||
notImportable: { zh: '不可导入', en: 'Not Importable', ja: 'インポート不可' },
|
||
prevStep: { zh: '上一步', en: 'Previous', ja: '前へ' },
|
||
confirmImport: { zh: '确认导入({count})', en: 'Confirm Import ({count})', ja: 'インポートを確定({count})' },
|
||
resultSummary: { zh: '导入完成:成功 {imported} 条,跳过 {skipped} 条,失败 {failed} 条', en: 'Import complete: {imported} succeeded, {skipped} skipped, {failed} failed', ja: 'インポート完了:成功 {imported} 件、スキップ {skipped} 件、失敗 {failed} 件' },
|
||
done: { zh: '完成', en: 'Done', ja: '完了' },
|
||
column: {
|
||
transactionTime: { zh: '交易时间', en: 'Time', ja: '取引日時' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||
counterparty: { zh: '交易对方', en: 'Counterparty', ja: '取引相手' },
|
||
product: { zh: '商品名称', en: 'Product', ja: '商品名' },
|
||
status: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||
matchedRule: { zh: '匹配规则/建议', en: 'Matched Rule', ja: '一致ルール' },
|
||
includeInStats: { zh: '计入统计', en: 'Include in Stats', ja: '集計に含める' },
|
||
},
|
||
errorFileType: { zh: '账单类型「{label}」仅支持 {exts} 格式的文件', en: 'Bill type "{label}" only supports files in {exts} format', ja: '明細の種類「{label}」は {exts} 形式のファイルのみ対応しています' },
|
||
selectFileFirst: { zh: '请先选择账单文件', en: 'Please select a bill file first', ja: '先に明細ファイルを選択してください' },
|
||
parseFailed: { zh: '解析失败', en: 'Parse failed', ja: '解析に失敗しました' },
|
||
selectAtLeastOne: { zh: '请至少勾选一条记录', en: 'Please select at least one record', ja: '少なくとも1件の記録を選択してください' },
|
||
importFailed: { zh: '导入失败', en: 'Import failed', ja: 'インポートに失敗しました' },
|
||
loadCategoriesFailed: { zh: '加载分类失败', en: 'Failed to load categories', ja: 'カテゴリの読み込みに失敗しました' },
|
||
loadTagsFailed: { zh: '加载标签失败', en: 'Failed to load tags', ja: 'タグの読み込みに失敗しました' },
|
||
passwordTitle: { zh: '解压密码', en: 'Archive Password', ja: '解凍パスワード' },
|
||
passwordTip: { zh: '该压缩包已加密,请输入解压密码。', en: 'This archive is encrypted. Please enter the password.', ja: 'この圧縮ファイルは暗号化されています。パスワードを入力してください。' },
|
||
passwordPlaceholder: { zh: '请输入解压密码', en: 'Enter the archive password', ja: 'パスワードを入力してください' },
|
||
passwordRequired: { zh: '请输入解压密码', en: 'Please enter the archive password', ja: 'パスワードを入力してください' },
|
||
passwordWrong: { zh: '解压密码错误', en: 'Incorrect archive password', ja: 'パスワードが正しくありません' },
|
||
},
|
||
|
||
// AI 智能建议
|
||
ai: {
|
||
intro: { zh: '启用后,可在收支记录页使用 AI 智能建议(一键设置中推荐分类与标签)、智能记账与 AI 查询;调用量与 Token 消耗可在「模型使用情况」查看。', en: 'Once enabled, you can use AI suggestions (categories & tags in Batch Set), Smart Entry, and AI Query on the Transactions page; call counts and token usage are available under "Model Usage".', ja: '有効にすると、収支記録ページで AI 提案(一括設定でカテゴリとタグを推薦)、スマート入力、AI 検索を利用できます。呼び出し回数とトークン消費は「モデル利用状況」で確認できます。' },
|
||
enabledOn: { zh: '已启用', en: 'Enabled', ja: '有効' },
|
||
enabledOff: { zh: '未启用', en: 'Disabled', ja: '無効' },
|
||
enabled: { zh: '启用 AI 建议', en: 'Enable AI suggestions', ja: 'AI 提案を有効にする' },
|
||
enabledHint: { zh: '关闭后不会发起任何 AI 请求', en: 'No AI requests are sent when disabled', ja: 'オフにすると AI リクエストは送信されません' },
|
||
apiKey: { zh: 'API Key', en: 'API Key', ja: 'API Key' },
|
||
apiKeyPlaceholder: { zh: '请输入 DeepSeek API Key', en: 'Enter your DeepSeek API Key', ja: 'DeepSeek API Key を入力してください' },
|
||
apiKeyKeep: { zh: '已配置,留空表示不修改', en: 'Configured; leave blank to keep unchanged', ja: '設定済み。空欄のままにすると変更されません' },
|
||
baseUrl: { zh: '接口地址', en: 'Base URL', ja: 'エンドポイント' },
|
||
model: { zh: '模型', en: 'Model', ja: 'モデル' },
|
||
visionModel: { zh: '视觉模型', en: 'Vision model', ja: 'ビジョンモデル' },
|
||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||
test: { zh: '测试连接', en: 'Test connection', ja: '接続テスト' },
|
||
saveSuccess: { zh: '保存成功', en: 'Saved successfully', ja: '保存しました' },
|
||
loadFailed: { zh: '加载 AI 配置失败', en: 'Failed to load AI config', ja: 'AI 設定の読み込みに失敗しました' },
|
||
testSuccess: { zh: '连接成功', en: 'Connection succeeded', ja: '接続に成功しました' },
|
||
testFailed: { zh: '连接失败', en: 'Connection failed', ja: '接続に失敗しました' },
|
||
suggestButton: { zh: 'AI 智能建议', en: 'AI suggestions', ja: 'AI 提案' },
|
||
pickButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||
scope: {
|
||
label: { zh: '建议内容', en: 'Scope', ja: '提案内容' },
|
||
both: { zh: '分类与标签', en: 'Category & Tags', ja: 'カテゴリとタグ' },
|
||
category: { zh: '仅分类', en: 'Category only', ja: 'カテゴリのみ' },
|
||
tag: { zh: '仅标签', en: 'Tags only', ja: 'タグのみ' },
|
||
},
|
||
suggestTitle: { zh: 'AI 分类与标签建议', en: 'AI category & tag suggestions', ja: 'AI によるカテゴリとタグの提案' },
|
||
suggesting: { zh: '正在分析,请稍候…', en: 'Analyzing, please wait…', ja: '分析中です。しばらくお待ちください…' },
|
||
suggestFailed: { zh: 'AI 建议生成失败', en: 'Failed to generate AI suggestions', ja: 'AI 提案の生成に失敗しました' },
|
||
noSuggestion: { zh: 'AI 未返回有效建议', en: 'AI returned no valid suggestions', ja: 'AI から有効な提案が返されませんでした' },
|
||
applyAll: { zh: '应用勾选({count})', en: 'Apply selected ({count})', ja: '選択項目を適用({count})' },
|
||
applyNone: { zh: '请至少勾选一条建议', en: 'Please select at least one suggestion', ja: '少なくとも1件の提案を選択してください' },
|
||
aggregated: { zh: '已聚合为 {groups} 类、共 {count} 条记录', en: 'Aggregated into {groups} groups, {count} records in total', ja: '{groups} グループ、合計 {count} 件の記録に集約しました' },
|
||
applySuccess: { zh: '已应用 {count} 条建议', en: 'Applied {count} suggestions', ja: '{count} 件の提案を適用しました' },
|
||
oneApplied: { zh: '已应用 AI 推荐分类', en: 'AI category applied', ja: 'AI が提案したカテゴリを適用しました' },
|
||
channelApplied: { zh: '已应用 AI 推荐渠道', en: 'AI channel applied', ja: 'AI が提案したチャネルを適用しました' },
|
||
noChannelSuggestion: { zh: '未找到合适的渠道建议', en: 'No channel suggestion', ja: '適切なチャネル提案が見つかりません' },
|
||
tagApplied: { zh: '已应用 AI 推荐标签', en: 'AI tags applied', ja: 'AI が提案したタグを適用しました' },
|
||
applyFailed: { zh: '应用建议失败', en: 'Failed to apply suggestions', ja: '提案の適用に失敗しました' },
|
||
applyHint: { zh: '将覆盖分类并追加标签;标记「新建」的分类/标签会在确认后创建', en: 'Categories will be overwritten and tags appended; items marked "New" will be created after confirmation.', ja: 'カテゴリは上書き、タグは追加されます。「新規」の項目は確定後に作成されます。' },
|
||
newBadge: { zh: '新建', en: 'New', ja: '新規' },
|
||
applyNewTitle: { zh: '确认新建', en: 'Confirm creation', ja: '新規作成の確認' },
|
||
applyNewConfirm: { zh: '将新建 {categories} 个分类、{tags} 个标签,确认应用?', en: 'Will create {categories} category(ies) and {tags} tag(s). Continue?', ja: '{categories} 件のカテゴリと {tags} 件のタグを作成します。適用しますか?' },
|
||
needConfig: { zh: 'AI 未启用,请先在「AI 设置」中配置', en: 'AI is not enabled. Please configure it in AI Settings first.', ja: 'AI が有効になっていません。「AI 設定」で設定してください。' },
|
||
decorate: {
|
||
emojiButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||
colorButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||
nameRequired: { zh: '请先输入名称', en: 'Please enter a name first', ja: '先に名前を入力してください' },
|
||
failed: { zh: 'AI 推荐失败', en: 'AI recommendation failed', ja: 'AI の提案に失敗しました' },
|
||
},
|
||
rule: {
|
||
entry: { zh: 'AI 生成规则', en: 'AI Generate Rules', ja: 'AI でルール生成' },
|
||
title: { zh: 'AI 生成规则建议', en: 'AI Rule Suggestions', ja: 'AI ルール提案' },
|
||
hint: { zh: 'AI 将依据所选记录的已有标签与分类,生成分类与标签规则建议,可编辑后勾选创建', en: 'AI derives rules from the tags and categories of the selected records; edit and select to create.', ja: 'AI が選択した記録の既存タグとカテゴリからルールを提案します。編集して選択後に作成できます。' },
|
||
selectHint: { zh: '选择要用于生成规则的已打标签记录(默认全选当前页,已选 {count} 条)', en: 'Select tagged records to derive rules (current page selected by default, {count} selected)', ja: 'ルール生成に使うタグ付き記録を選択(既定で現在ページを全選択、選択中 {count} 件)' },
|
||
searchPlaceholder: { zh: '搜索备注', en: 'Search remark', ja: '備考を検索' },
|
||
selectPageAll: { zh: '全选本页', en: 'Select page', ja: 'このページを全選択' },
|
||
clearSelection: { zh: '清空选择', en: 'Clear selection', ja: '選択をクリア' },
|
||
generate: { zh: '生成规则', en: 'Generate rules', ja: 'ルールを生成' },
|
||
back: { zh: '返回上一步', en: 'Back', ja: '戻る' },
|
||
noTagged: { zh: '暂无可用的已打标签记录', en: 'No tagged records available', ja: 'タグ付きの記録がありません' },
|
||
loadRecordsFailed: { zh: '加载已打标签记录失败', en: 'Failed to load tagged records', ja: 'タグ付き記録の読み込みに失敗しました' },
|
||
reason: { zh: '理由', en: 'Reason', ja: '理由' },
|
||
newPrefix: { zh: '新建:', en: 'New: ', ja: '新規:' },
|
||
apply: { zh: '创建勾选规则', en: 'Create selected', ja: '選択したルールを作成' },
|
||
selectRequired: { zh: '请至少勾选一条记录或规则', en: 'Please select at least one record or rule', ja: '少なくとも1件の記録またはルールを選択してください' },
|
||
applied: { zh: '已创建 {count} 条规则', en: 'Created {count} rule(s)', ja: '{count} 件のルールを作成しました' },
|
||
failed: { zh: 'AI 规则生成失败', en: 'Failed to generate AI rules', ja: 'AI ルールの生成に失敗しました' },
|
||
applyFailed: { zh: '创建规则失败', en: 'Failed to create rules', ja: 'ルールの作成に失敗しました' },
|
||
duplicate: { zh: '已存在', en: 'Exists', ja: '既存' },
|
||
allDuplicate: { zh: '生成的规则均已存在,无需创建', en: 'All generated rules already exist', ja: '生成されたルールはすべて既存です' },
|
||
},
|
||
category: {
|
||
label: { zh: 'AI 生成分类', en: 'AI Category', ja: 'AI 生成カテゴリ' },
|
||
placeholder: { zh: '描述用途,如:日常通勤打车地铁', en: 'Describe it, e.g. daily commute by taxi and metro', ja: '用途を説明してください(例:日常の通勤でタクシーと地下鉄)' },
|
||
button: { zh: 'AI 生成', en: 'Generate', ja: 'AI で生成' },
|
||
textRequired: { zh: '请输入分类描述', en: 'Please enter a description', ja: 'カテゴリの説明を入力してください' },
|
||
applied: { zh: '已生成分类,请确认后保存', en: 'Category generated, please confirm and save', ja: 'カテゴリを生成しました。確認して保存してください' },
|
||
failed: { zh: 'AI 生成分类失败', en: 'Failed to generate category', ja: 'AI によるカテゴリ生成に失敗しました' },
|
||
},
|
||
newCategory: {
|
||
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||
hint: { zh: 'AI 建议新分类:', en: 'AI suggests:', ja: 'AI の提案する新カテゴリ:' },
|
||
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||
saved: { zh: '已创建并选用新分类', en: 'Category created and selected', ja: '新しいカテゴリを作成して選択しました' },
|
||
exists: { zh: '已存在同名分类,已为你选中', en: 'A same-name category exists and has been selected', ja: '同名のカテゴリが存在するため選択しました' },
|
||
needInfo: { zh: '请先填写备注或金额,便于生成分类', en: 'Please fill in a remark or amount first', ja: 'カテゴリ生成のため、先に備考または金額を入力してください' },
|
||
},
|
||
newChannel: {
|
||
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||
hint: { zh: 'AI 建议新渠道:', en: 'AI suggests:', ja: 'AI の提案する新チャネル:' },
|
||
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||
saved: { zh: '已创建并选用新渠道', en: 'Channel created and selected', ja: '新しいチャネルを作成して選択しました' },
|
||
exists: { zh: '已存在同名渠道,已为你选中', en: 'A same-name channel exists and has been selected', ja: '同名のチャネルが存在するため選択しました' },
|
||
needInfo: { zh: '请先填写备注或金额,便于生成渠道', en: 'Please fill in a remark or amount first', ja: 'チャネル生成のため、先に備考または金額を入力してください' },
|
||
failed: { zh: 'AI 未能生成渠道,请重试', en: 'AI failed to generate a channel', ja: 'AI がチャネルを生成できませんでした' },
|
||
},
|
||
newTag: {
|
||
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||
hint: { zh: 'AI 建议新标签:', en: 'AI suggests tag:', ja: 'AI の提案する新タグ:' },
|
||
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||
saved: { zh: '已创建并选用新标签', en: 'Tag created and selected', ja: '新しいタグを作成して選択しました' },
|
||
exists: { zh: '已存在同名标签,已为你选中', en: 'A same-name tag exists and has been selected', ja: '同名のタグが存在するため選択しました' },
|
||
needInfo: { zh: '请先填写备注或金额,便于生成标签', en: 'Please fill in a remark or amount first', ja: 'タグ生成のため、先に備考または金額を入力してください' },
|
||
failed: { zh: 'AI 生成标签失败', en: 'Failed to generate tag', ja: 'AI によるタグ生成に失敗しました' },
|
||
},
|
||
relation: {
|
||
button: { zh: 'AI 生成', en: 'AI Generate', ja: 'AI 生成' },
|
||
needMembers: { zh: '请先选择至少两条关联账单', en: 'Please select at least two related bills first', ja: '関連する明細を2件以上選択してください' },
|
||
failed: { zh: 'AI 未能生成关系名称,请重试', en: 'AI failed to generate a relation name', ja: 'AI が関連名を生成できませんでした' },
|
||
},
|
||
query: {
|
||
placeholder: { zh: '用自然语言查询,如:上个月餐饮花了多少', en: 'Ask in natural language, e.g. dining expenses last month', ja: '自然言語で検索(例:先月の食費はいくら)' },
|
||
examples: { zh: '上个月餐饮|超过500的支出|待报销的支出|微信支付', en: 'Dining last month|Expenses over 500|Pending reimbursement|Paid by WeChat', ja: '先月の食費|500を超える支出|精算待ちの支出|WeChat 払い' },
|
||
button: { zh: 'AI 查询', en: 'AI Query', ja: 'AI 検索' },
|
||
entry: { zh: 'AI 搜索', en: 'AI Search', ja: 'AI 検索' },
|
||
title: { zh: 'AI 智能查询', en: 'AI Smart Query', ja: 'AI スマート検索' },
|
||
hint: { zh: '用自然语言描述查询条件,AI 会解析为筛选条件并搜索。', en: 'Describe the query in natural language; AI will turn it into filters and search.', ja: '自然言語で検索条件を説明すると、AI がフィルターに変換して検索します。' },
|
||
emptyInput: { zh: '请输入查询内容', en: 'Please enter a query', ja: '検索内容を入力してください' },
|
||
clearHistory: { zh: '清空历史', en: 'Clear history', ja: '履歴をクリア' },
|
||
submitHint: { zh: 'Ctrl + Enter 提交', en: 'Ctrl + Enter to submit', ja: 'Ctrl + Enter で送信' },
|
||
failed: { zh: 'AI 查询解析失败', en: 'Failed to parse the query', ja: 'AI 検索の解析に失敗しました' },
|
||
resultTitle: { zh: 'AI 解析结果', en: 'AI Query Result', ja: 'AI 解析結果' },
|
||
apply: { zh: '应用筛选', en: 'Apply filters', ja: 'フィルターを適用' },
|
||
applied: { zh: '已应用 AI 查询筛选条件', en: 'AI query filters applied', ja: 'AI 検索のフィルターを適用しました' },
|
||
noCondition: { zh: '未识别到可用的筛选条件,请换一种说法', en: 'No usable filter conditions recognized, please rephrase', ja: '利用できる条件を認識できませんでした。別の言い方をしてください' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||
tag: { zh: '标签', en: 'Tag', ja: 'タグ' },
|
||
channel: { zh: '交易渠道', en: 'Channel', ja: '取引チャネル' },
|
||
dateRange: { zh: '时间范围', en: 'Date range', ja: '期間' },
|
||
amountRange: { zh: '金额范围', en: 'Amount range', ja: '金額範囲' },
|
||
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||
includeInStats: { zh: '计入统计', en: 'In stats', ja: '集計対象' },
|
||
includeYes: { zh: '计入', en: 'Included', ja: '含める' },
|
||
includeNo: { zh: '不计入', en: 'Excluded', ja: '含めない' },
|
||
unmatched: { zh: '未识别', en: 'Unmatched', ja: '未認識' },
|
||
},
|
||
sql: {
|
||
entry: { zh: '智能查数', en: 'Smart Data', ja: 'スマート集計' },
|
||
title: { zh: '智能查数', en: 'Smart Data Query', ja: 'スマート集計' },
|
||
hint: { zh: '用自然语言描述你想查的内容,AI 会生成只读查询并展示结果;只能查询你本人的数据。', en: 'Describe what you want to query; AI generates a read-only query and shows the result. Only your own data can be queried.', ja: '知りたい内容を自然言語で説明すると、AI が読み取り専用クエリを生成して結果を表示します。自分のデータのみ参照できます。' },
|
||
placeholder: { zh: '例如:上个月一共花了多少钱', en: 'e.g. How much did I spend last month in total?', ja: '例:先月の支出合計はいくら?' },
|
||
examples: { zh: '上个月一共花了多少钱|按分类统计今年的支出|今年收入最高的一个月|各渠道的支出占比|本月支出最高的5笔', en: 'How much did I spend last month?|Expenses by category this year|Month with highest income this year|Spending share by channel|Top 5 expenses this month', ja: '先月の支出合計|今年のカテゴリ別支出|今年の収入が最も多い月|チャネル別支出の割合|今月の支出トップ5' },
|
||
submit: { zh: '查询', en: 'Query', ja: '検索' },
|
||
submitting: { zh: '正在查询,请稍候…', en: 'Querying, please wait…', ja: '検索中です。しばらくお待ちください…' },
|
||
emptyInput: { zh: '请输入查询内容', en: 'Please enter a query', ja: '検索内容を入力してください' },
|
||
failed: { zh: '智能查数失败', en: 'Smart data query failed', ja: 'スマート集計に失敗しました' },
|
||
resultTitle: { zh: '查询结果', en: 'Result', ja: '結果' },
|
||
sqlTitle: { zh: '生成的 SQL', en: 'Generated SQL', ja: '生成された SQL' },
|
||
copySql: { zh: '复制 SQL', en: 'Copy SQL', ja: 'SQL をコピー' },
|
||
copySuccess: { zh: '已复制', en: 'Copied', ja: 'コピーしました' },
|
||
empty: { zh: '查询没有返回结果', en: 'The query returned no result', ja: '結果がありません' },
|
||
rowCount: { zh: '共 {count} 行', en: '{count} row(s)', ja: '{count} 行' },
|
||
truncated: { zh: '结果超过 {max} 行,仅展示前 {max} 行', en: 'More than {max} rows; only the first {max} are shown', ja: '{max} 行を超えるため、先頭 {max} 行のみ表示します' },
|
||
viewTable: { zh: '表格', en: 'Table', ja: 'テーブル' },
|
||
viewBar: { zh: '柱状图', en: 'Bar chart', ja: '棒グラフ' },
|
||
viewPie: { zh: '饼图', en: 'Pie chart', ja: '円グラフ' },
|
||
examplesLabel: { zh: '示例', en: 'Examples', ja: '例' },
|
||
history: { zh: '历史提问', en: 'History', ja: '履歴' },
|
||
clearHistory: { zh: '清空历史', en: 'Clear history', ja: '履歴をクリア' },
|
||
needConfig: { zh: 'AI 未启用,请先在「设置」中开启 AI。', en: 'AI is not enabled. Please enable it in Settings first.', ja: 'AI が有効になっていません。「設定」で有効にしてください。' },
|
||
},
|
||
record: {
|
||
button: { zh: '智能记账', en: 'Smart Entry', ja: 'スマート入力' },
|
||
title: { zh: 'AI 智能记账', en: 'AI Smart Entry', ja: 'AI スマート入力' },
|
||
hint: { zh: '用一句话描述这笔收支,AI 会帮你填好表单,确认后再保存。', en: 'Describe the transaction in one sentence; AI fills the form for you to confirm.', ja: 'この収支を一文で説明すると、AI がフォームを入力します。確認してから保存してください。' },
|
||
placeholder: { zh: '例如:昨天中午吃饭 35 支付宝', en: 'e.g. Lunch yesterday 35 Alipay', ja: '例:昨日の昼食 35 Alipay' },
|
||
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||
emptyInput: { zh: '请输入记账内容', en: 'Please enter the transaction description', ja: '記帳内容を入力してください' },
|
||
failed: { zh: 'AI 记账解析失败', en: 'Failed to parse the transaction', ja: 'AI 記帳の解析に失敗しました' },
|
||
textTab: { zh: '文字记账', en: 'Text Entry', ja: 'テキスト入力' },
|
||
imageTab: { zh: '图片记账', en: 'Image Entry', ja: '画像入力' },
|
||
imageHint: { zh: '上传一至多张账单或支付截图(最多 5 张),AI 会一次性识别其中的每一笔交易,确认后导入。', en: 'Upload one to several bill or payment screenshots (up to 5); AI recognizes every transaction in one pass for you to confirm and import.', ja: '請求書や支払いのスクリーンショットを1〜複数枚(最大5枚)アップロードすると、AI が各取引をまとめて認識します。確認して取り込んでください。' },
|
||
upload: { zh: '上传图片(可多选)', en: 'Upload images (multiple)', ja: '画像をアップロード(複数可)' },
|
||
uploadTip: { zh: '支持 JPEG/PNG/GIF/WebP,单张不超过 10MB,最多 5 张', en: 'JPEG/PNG/GIF/WebP, up to 10MB each, max 5 images', ja: 'JPEG/PNG/GIF/WebP、1枚10MBまで、最大5枚' },
|
||
pasteHint: { zh: '也可直接按 Ctrl+V(Mac 为 ⌘V)粘贴剪贴板中的图片', en: 'You can also press Ctrl+V (⌘V on Mac) to paste an image from the clipboard', ja: 'Ctrl+V(Mac は ⌘V)でクリップボードの画像を貼り付けることもできます' },
|
||
pasteSuccess: { zh: '已粘贴剪贴板中的图片', en: 'Pasted the image from clipboard', ja: 'クリップボードの画像を貼り付けました' },
|
||
parseImage: { zh: '识别图片', en: 'Recognize', ja: '画像を解析' },
|
||
recognizing: { zh: '正在识别图片,请稍候…', en: 'Recognizing, please wait…', ja: '画像を解析中です。しばらくお待ちください…' },
|
||
progressTitle: { zh: '识别进度', en: 'Progress', ja: '進捗' },
|
||
imageFailed: { zh: 'AI 图片记账解析失败', en: 'Failed to parse the image', ja: 'AI 画像記帳の解析に失敗しました' },
|
||
noRecord: { zh: '未从图片中识别到有效交易', en: 'No valid transactions recognized from the image', ja: '画像から有効な取引を認識できませんでした' },
|
||
resultTitle: { zh: '图片记账结果', en: 'Image Entry Result', ja: '画像記帳の結果' },
|
||
resultHint: { zh: '请核对识别结果,勾选后导入;可直接编辑类型、金额、分类与备注。', en: 'Review the results, edit type/amount/category/remark, then import the selected ones.', ja: '認識結果を確認し、種別・金額・カテゴリ・備考を編集して、選択した項目を取り込んでください。' },
|
||
importSelected: { zh: '导入勾选({count})', en: 'Import selected ({count})', ja: '選択項目を取り込む({count})' },
|
||
importSuccess: { zh: '已导入 {count} 条记录', en: 'Imported {count} record(s)', ja: '{count} 件を取り込みました' },
|
||
importFailed: { zh: '导入失败', en: 'Import failed', ja: '取り込みに失敗しました' },
|
||
selectAtLeastOne: { zh: '请至少勾选一条记录', en: 'Please select at least one record', ja: '少なくとも1件の記録を選択してください' },
|
||
viewImage: { zh: '查看原图', en: 'View image', ja: '元画像を表示' },
|
||
col: {
|
||
source: { zh: '来源图', en: 'Source', ja: '元画像' },
|
||
duplicate: { zh: '重复', en: 'Duplicate', ja: '重複' },
|
||
type: { zh: '类型', en: 'Type', ja: '種別' },
|
||
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||
channel: { zh: '渠道', en: 'Channel', ja: 'チャネル' },
|
||
time: { zh: '时间', en: 'Time', ja: '日時' },
|
||
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||
tags: { zh: '标签', en: 'Tags', ja: 'タグ' },
|
||
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||
},
|
||
sourceImageLabel: { zh: '图 {index}', en: 'Image {index}', ja: '画像 {index}' },
|
||
duplicate: { zh: '疑似重复', en: 'Duplicate', ja: '重複の疑い' },
|
||
maxImages: { zh: '单次最多上传 {count} 张图片', en: 'Up to {count} images per upload', ja: '1回に最大 {count} 枚までアップロードできます' },
|
||
},
|
||
column: {
|
||
record: { zh: '记录', en: 'Record', ja: '記録' },
|
||
count: { zh: '命中条数', en: 'Matched', ja: '該当件数' },
|
||
category: { zh: '建议分类', en: 'Suggested category', ja: '提案カテゴリ' },
|
||
tags: { zh: '建议标签', en: 'Suggested tags', ja: '提案タグ' },
|
||
reason: { zh: '理由', en: 'Reason', ja: '理由' },
|
||
},
|
||
usage: {
|
||
title: { zh: '使用情况', en: 'Usage', ja: '利用状況' },
|
||
recentTitle: { zh: '最近调用记录', en: 'Recent calls', ja: '最近の呼び出し履歴' },
|
||
refresh: { zh: '刷新', en: 'Refresh', ja: '更新' },
|
||
totalCalls: { zh: '调用次数', en: 'Calls', ja: '呼び出し回数' },
|
||
successCalls: { zh: '成功', en: 'Succeeded', ja: '成功' },
|
||
failedCalls: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||
promptTokens: { zh: '输入 Token', en: 'Prompt tokens', ja: '入力トークン' },
|
||
completionTokens: { zh: '输出 Token', en: 'Completion tokens', ja: '出力トークン' },
|
||
totalTokens: { zh: '总 Token', en: 'Total tokens', ja: '合計トークン' },
|
||
cachedTokens: { zh: '缓存命中', en: 'Cached tokens', ja: 'キャッシュヒット' },
|
||
success: { zh: '成功', en: 'Success', ja: '成功' },
|
||
failed: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||
loadFailed: { zh: '加载使用情况失败', en: 'Failed to load usage', ja: '利用状況の読み込みに失敗しました' },
|
||
empty: { zh: '暂无调用记录', en: 'No usage records yet', ja: '呼び出し履歴はまだありません' },
|
||
type: {
|
||
suggest: { zh: '生成建议', en: 'Suggest', ja: '提案生成' },
|
||
decorate: { zh: '图标配色', en: 'Icon & Color', ja: 'アイコンと配色' },
|
||
category: { zh: '生成分类', en: 'Category', ja: 'カテゴリ生成' },
|
||
tag: { zh: '生成标签', en: 'Tag', ja: 'タグ生成' },
|
||
channel: { zh: '生成渠道', en: 'Channel', ja: 'チャネル生成' },
|
||
test: { zh: '测试连接', en: 'Test', ja: '接続テスト' },
|
||
query: { zh: '智能查询', en: 'Query', ja: 'スマート検索' },
|
||
record: { zh: '智能记账', en: 'Record', ja: 'スマート記帳' },
|
||
record_image: { zh: '图片记账', en: 'Image Record', ja: '画像記帳' },
|
||
rule: { zh: '生成规则', en: 'Rule', ja: 'ルール生成' },
|
||
statistics: { zh: '统计搜索', en: 'Statistics', ja: '統計検索' },
|
||
relation: { zh: '生成关系', en: 'Relation', ja: '関連生成' },
|
||
sql: { zh: '智能查数', en: 'Smart Data', ja: 'スマート集計' },
|
||
},
|
||
column: {
|
||
time: { zh: '时间', en: 'Time', ja: '日時' },
|
||
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||
count: { zh: '分析条数', en: 'Records', ja: '分析件数' },
|
||
promptTokens: { zh: '输入', en: 'Prompt', ja: '入力' },
|
||
completionTokens: { zh: '输出', en: 'Completion', ja: '出力' },
|
||
totalTokens: { zh: '总计', en: 'Total', ja: '合計' },
|
||
duration: { zh: '耗时', en: 'Duration', ja: '所要時間' },
|
||
status: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||
},
|
||
},
|
||
},
|
||
|
||
// 邮箱账单
|
||
emailBill: {
|
||
title: { zh: '邮箱账单', en: 'Email Bills', ja: 'メール請求' },
|
||
tab: {
|
||
configs: { zh: '邮箱配置', en: 'Mailboxes', ja: 'メール設定' },
|
||
senderRules: { zh: '发件人规则', en: 'Sender Rules', ja: '送信者ルール' },
|
||
messages: { zh: '待处理账单', en: 'Pending Bills', ja: '未処理の請求' },
|
||
},
|
||
imapHosts: {
|
||
qq: { zh: 'QQ 邮箱', en: 'QQ Mail', ja: 'QQメール' },
|
||
qqExmail: { zh: '腾讯企业邮', en: 'Tencent Exmail', ja: 'Tencent Exmail' },
|
||
netease163: { zh: '网易 163 邮箱', en: 'NetEase 163', ja: 'NetEase 163' },
|
||
netease126: { zh: '网易 126 邮箱', en: 'NetEase 126', ja: 'NetEase 126' },
|
||
neteaseQiye: { zh: '网易企业邮', en: 'NetEase Enterprise', ja: 'NetEase Enterprise' },
|
||
aliyun: { zh: '阿里云邮箱', en: 'Alibaba Mail', ja: 'Alibaba Mail' },
|
||
sina: { zh: '新浪邮箱', en: 'Sina Mail', ja: 'Sina Mail' },
|
||
mail139: { zh: '139 邮箱', en: '139 Mail', ja: '139メール' },
|
||
mail189: { zh: '189 邮箱', en: '189 Mail', ja: '189メール' },
|
||
gmail: { zh: 'Gmail', en: 'Gmail', ja: 'Gmail' },
|
||
outlook: { zh: 'Outlook / Hotmail', en: 'Outlook / Hotmail', ja: 'Outlook / Hotmail' },
|
||
icloud: { zh: 'iCloud 邮箱', en: 'iCloud Mail', ja: 'iCloudメール' },
|
||
},
|
||
common: {
|
||
add: { zh: '新增', en: 'Add', ja: '追加' },
|
||
edit: { zh: '编辑', en: 'Edit', ja: '編集' },
|
||
delete: { zh: '删除', en: 'Delete', ja: '削除' },
|
||
actions: { zh: '操作', en: 'Actions', ja: '操作' },
|
||
enabled: { zh: '启用', en: 'Enabled', ja: '有効' },
|
||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||
cancel: { zh: '取消', en: 'Cancel', ja: 'キャンセル' },
|
||
confirm: { zh: '确定', en: 'Confirm', ja: '確定' },
|
||
refresh: { zh: '刷新', en: 'Refresh', ja: '更新' },
|
||
loadFailed: { zh: '加载失败', en: 'Failed to load', ja: '読み込みに失敗しました' },
|
||
saveSuccess: { zh: '保存成功', en: 'Saved', ja: '保存しました' },
|
||
deleteSuccess: { zh: '删除成功', en: 'Deleted', ja: '削除しました' },
|
||
deleteConfirm: { zh: '确定删除吗?', en: 'Delete this item?', ja: '削除しますか?' },
|
||
empty: { zh: '暂无数据', en: 'No data', ja: 'データがありません' },
|
||
},
|
||
config: {
|
||
name: { zh: '名称', en: 'Name', ja: '名称' },
|
||
host: { zh: 'IMAP 服务器', en: 'IMAP Server', ja: 'IMAPサーバー' },
|
||
hostPlaceholder: { zh: '选择或输入 IMAP 服务器', en: 'Select or enter IMAP server', ja: 'IMAPサーバーを選択または入力' },
|
||
port: { zh: '端口', en: 'Port', ja: 'ポート' },
|
||
ssl: { zh: '使用 SSL', en: 'Use SSL', ja: 'SSLを使用' },
|
||
username: { zh: '邮箱账号', en: 'Email', ja: 'メールアドレス' },
|
||
password: { zh: '授权码', en: 'Auth Code', ja: '認証コード' },
|
||
passwordPlaceholder: { zh: '留空表示不修改', en: 'Leave blank to keep unchanged', ja: '空欄なら変更しません' },
|
||
folder: { zh: '监听文件夹', en: 'Folder', ja: 'フォルダ' },
|
||
status: { zh: '状态', en: 'Status', ja: '状態' },
|
||
lastError: { zh: '最近错误', en: 'Last Error', ja: '最新エラー' },
|
||
defaultExpenseCategory: { zh: '默认支出分类', en: 'Default Expense Category', ja: '既定の支出カテゴリ' },
|
||
defaultIncomeCategory: { zh: '默认收入分类', en: 'Default Income Category', ja: '既定の収入カテゴリ' },
|
||
defaultTags: { zh: '默认标签', en: 'Default Tags', ja: '既定のタグ' },
|
||
fetchScope: { zh: '拉取范围', en: 'Fetch Scope', ja: '取得範囲' },
|
||
fetchScopeIncrement: { zh: '仅新邮件', en: 'New only', ja: '新着のみ' },
|
||
fetchScopeDays: { zh: '最近 N 天', en: 'Last N days', ja: '直近 N 日' },
|
||
fetchScopeCount: { zh: '最近 N 封', en: 'Last N emails', ja: '直近 N 件' },
|
||
fetchLimitDays: { zh: '天数', en: 'Days', ja: '日数' },
|
||
fetchLimitCount: { zh: '封数', en: 'Count', ja: '件数' },
|
||
test: { zh: '测试连接', en: 'Test', ja: '接続テスト' },
|
||
check: { zh: '立即检查', en: 'Check Now', ja: '今すぐ確認' },
|
||
testSuccess: { zh: '连接成功', en: 'Connected', ja: '接続に成功しました' },
|
||
testFailed: { zh: '连接失败', en: 'Connection failed', ja: '接続に失敗しました' },
|
||
checkResult: { zh: '新增 {count} 条待处理账单', en: '{count} new pending bill(s)', ja: '未処理の請求を {count} 件追加しました' },
|
||
checkLogTitle: { zh: '检查进度', en: 'Check Progress', ja: '確認の進行状況' },
|
||
checkRunning: { zh: '检查中…', en: 'Checking…', ja: '確認中…' },
|
||
checkClear: { zh: '清空', en: 'Clear', ja: 'クリア' },
|
||
checkFailed: { zh: '检查失败', en: 'Check failed', ja: '確認に失敗しました' },
|
||
statusText: {
|
||
DISCONNECTED: { zh: '未连接', en: 'Disconnected', ja: '未接続' },
|
||
CONNECTED: { zh: '已连接', en: 'Connected', ja: '接続済み' },
|
||
POLLING: { zh: '轮询中', en: 'Polling', ja: 'ポーリング中' },
|
||
ERROR: { zh: '异常', en: 'Error', ja: 'エラー' },
|
||
},
|
||
},
|
||
senderRule: {
|
||
name: { zh: '规则名称', en: 'Rule Name', ja: 'ルール名' },
|
||
patterns: { zh: '发件人匹配串', en: 'Sender Patterns', ja: '送信者パターン' },
|
||
patternsHint: { zh: '每行一个,支持完整地址、@域名或关键字,包含匹配且忽略大小写', en: 'One per line; full address, @domain or keyword, case-insensitive contains', ja: '1行に1つ。完全なアドレス、@ドメイン、キーワードに対応(大文字小文字を区別しない部分一致)' },
|
||
billType: { zh: '账单类型', en: 'Bill Type', ja: '請求タイプ' },
|
||
archivePassword: { zh: '解压密码', en: 'Archive Password', ja: '解凍パスワード' },
|
||
archivePasswordPlaceholder: { zh: '压缩包加密时填写', en: 'Fill if the archive is encrypted', ja: '暗号化されている場合に入力' },
|
||
sortOrder: { zh: '优先级', en: 'Priority', ja: '優先度' },
|
||
defaultExpenseCategory: { zh: '默认支出分类', en: 'Default Expense Category', ja: '既定の支出カテゴリ' },
|
||
defaultIncomeCategory: { zh: '默认收入分类', en: 'Default Income Category', ja: '既定の収入カテゴリ' },
|
||
defaultTags: { zh: '默认标签', en: 'Default Tags', ja: '既定のタグ' },
|
||
patternsRequired: { zh: '请至少填写一个发件人匹配串', en: 'Please enter at least one sender pattern', ja: '送信者パターンを1つ以上入力してください' },
|
||
},
|
||
message: {
|
||
receivedAt: { zh: '接收时间', en: 'Received', ja: '受信日時' },
|
||
fromAddress: { zh: '发件人', en: 'From', ja: '送信者' },
|
||
subject: { zh: '主题', en: 'Subject', ja: '件名' },
|
||
attachmentName: { zh: '附件', en: 'Attachment', ja: '添付ファイル' },
|
||
billType: { zh: '账单类型', en: 'Bill Type', ja: '請求タイプ' },
|
||
status: { zh: '状态', en: 'Status', ja: '状態' },
|
||
error: { zh: '错误', en: 'Error', ja: 'エラー' },
|
||
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||
ignore: { zh: '忽略', en: 'Ignore', ja: '無視' },
|
||
statusText: {
|
||
PULLED: { zh: '待解析', en: 'Pending', ja: '未解析' },
|
||
CONFIRMED: { zh: '已导入', en: 'Imported', ja: '取込済み' },
|
||
IGNORED: { zh: '已忽略', en: 'Ignored', ja: '無視' },
|
||
},
|
||
filterStatus: { zh: '状态筛选', en: 'Filter by status', ja: '状態で絞り込み' },
|
||
},
|
||
parse: {
|
||
title: { zh: '解析账单', en: 'Parse Bill', ja: '請求を解析' },
|
||
billType: { zh: '账单类型', en: 'Bill Type', ja: '請求タイプ' },
|
||
password: { zh: '解压密码', en: 'Archive Password', ja: '解凍パスワード' },
|
||
parseButton: { zh: '解析', en: 'Parse', ja: '解析' },
|
||
parseFailed: { zh: '解析失败', en: 'Parse failed', ja: '解析に失敗しました' },
|
||
needParse: { zh: '请先解析账单', en: 'Please parse the bill first', ja: '先に請求を解析してください' },
|
||
expenseDefaultCategory: { zh: '支出默认分类', en: 'Expense Category', ja: '支出カテゴリ' },
|
||
incomeDefaultCategory: { zh: '收入默认分类', en: 'Income Category', ja: '収入カテゴリ' },
|
||
defaultTags: { zh: '默认标签', en: 'Default Tags', ja: '既定のタグ' },
|
||
selectAll: { zh: '全选', en: 'Select All', ja: 'すべて選択' },
|
||
setIncluded: { zh: '计入统计', en: 'Include', ja: '集計に含める' },
|
||
setExcluded: { zh: '不计入', en: 'Exclude', ja: '集計から除外' },
|
||
previewSummary: { zh: '共 {total} 行,筛选后 {filtered} 行,已选 {checked} 行', en: '{total} rows, {filtered} after filter, {checked} selected', ja: '全 {total} 行、絞り込み後 {filtered} 行、選択 {checked} 行' },
|
||
confirmImport: { zh: '导入 {count} 条', en: 'Import {count}', ja: '{count} 件を取込' },
|
||
importSuccess: { zh: '导入完成', en: 'Import completed', ja: '取込が完了しました' },
|
||
resultSummary: { zh: '成功 {imported} 条,跳过 {skipped} 条,失败 {failed} 条', en: 'Imported {imported}, skipped {skipped}, failed {failed}', ja: '成功 {imported} 件、スキップ {skipped} 件、失敗 {failed} 件' },
|
||
done: { zh: '完成', en: 'Done', ja: '完了' },
|
||
prevStep: { zh: '返回', en: 'Back', ja: '戻る' },
|
||
column: {
|
||
transactionTime: { zh: '交易时间', en: 'Time', ja: '取引日時' },
|
||
type: { zh: '类型', en: 'Type', ja: '種別' },
|
||
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||
counterparty: { zh: '交易对方', en: 'Counterparty', ja: '取引先' },
|
||
product: { zh: '商品', en: 'Item', ja: '商品' },
|
||
status: { zh: '状态', en: 'Status', ja: '状態' },
|
||
matchedRule: { zh: '匹配规则/建议', en: 'Rule / Suggestion', ja: 'ルール/提案' },
|
||
},
|
||
notImportable: { zh: '不可导入', en: 'Not importable', ja: '取込不可' },
|
||
notIncluded: { zh: '不计收支', en: 'Excluded', ja: '集計外' },
|
||
duplicate: { zh: '重复', en: 'Duplicate', ja: '重複' },
|
||
},
|
||
},
|
||
}
|