feat: 前端新增日语多语言支持
- messages.ts 全量补充日文文案(です・ます 敬体),新增 locale.jaJP 语言名称 - index.ts 扩展 LocaleKey 与消息叶子校验,新增 ja-JP 语言包并支持浏览器 ja 自动识别 - LocaleSwitch 增加「日本語」切换项,App.vue 接入 Naive UI 日语组件与日期 locale
This commit is contained in:
+14
-3
@@ -4,14 +4,25 @@ import { computed } from 'vue'
|
|||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import {
|
import {
|
||||||
NMessageProvider, NDialogProvider, NConfigProvider,
|
NMessageProvider, NDialogProvider, NConfigProvider,
|
||||||
zhCN, dateZhCN, enUS, dateEnUS,
|
zhCN, dateZhCN, enUS, dateEnUS, jaJP, dateJaJP,
|
||||||
} from 'naive-ui'
|
} from 'naive-ui'
|
||||||
|
import type { LocaleKey } from './locales'
|
||||||
|
|
||||||
const { locale } = useI18n()
|
const { locale } = useI18n()
|
||||||
|
|
||||||
// Naive UI 组件语言与日期格式随当前语言切换
|
// Naive UI 组件语言与日期格式随当前语言切换
|
||||||
const naiveLocale = computed(() => (locale.value === 'en-US' ? enUS : zhCN))
|
const naiveLocales: Record<LocaleKey, typeof zhCN> = {
|
||||||
const naiveDateLocale = computed(() => (locale.value === 'en-US' ? dateEnUS : dateZhCN))
|
'zh-CN': zhCN,
|
||||||
|
'en-US': enUS,
|
||||||
|
'ja-JP': jaJP,
|
||||||
|
}
|
||||||
|
const naiveDateLocales: Record<LocaleKey, typeof dateZhCN> = {
|
||||||
|
'zh-CN': dateZhCN,
|
||||||
|
'en-US': dateEnUS,
|
||||||
|
'ja-JP': dateJaJP,
|
||||||
|
}
|
||||||
|
const naiveLocale = computed(() => naiveLocales[locale.value as LocaleKey] ?? zhCN)
|
||||||
|
const naiveDateLocale = computed(() => naiveDateLocales[locale.value as LocaleKey] ?? dateZhCN)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const { t, locale } = useI18n()
|
|||||||
const options = computed(() => [
|
const options = computed(() => [
|
||||||
{ label: t('locale.zhCN'), value: 'zh-CN' },
|
{ label: t('locale.zhCN'), value: 'zh-CN' },
|
||||||
{ label: t('locale.enUS'), value: 'en-US' },
|
{ label: t('locale.enUS'), value: 'en-US' },
|
||||||
|
{ label: t('locale.jaJP'), value: 'ja-JP' },
|
||||||
])
|
])
|
||||||
|
|
||||||
/** 切换语言 */
|
/** 切换语言 */
|
||||||
|
|||||||
@@ -3,31 +3,33 @@ import { createI18n } from 'vue-i18n'
|
|||||||
import messages from './messages'
|
import messages from './messages'
|
||||||
|
|
||||||
/** 支持的语言标识 */
|
/** 支持的语言标识 */
|
||||||
export type LocaleKey = 'zh-CN' | 'en-US'
|
export type LocaleKey = 'zh-CN' | 'en-US' | 'ja-JP'
|
||||||
|
|
||||||
/** 单条消息:同时包含中文与英文 */
|
/** 单条消息:同时包含中文、英文与日文 */
|
||||||
interface MessageLeaf {
|
interface MessageLeaf {
|
||||||
zh: string
|
zh: string
|
||||||
en: string
|
en: string
|
||||||
|
ja: string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 语言偏好存储键
|
// 语言偏好存储键
|
||||||
const STORAGE_KEY = 'locale'
|
const STORAGE_KEY = 'locale'
|
||||||
// 支持的语言列表
|
// 支持的语言列表
|
||||||
const SUPPORTED: LocaleKey[] = ['zh-CN', 'en-US']
|
const SUPPORTED: LocaleKey[] = ['zh-CN', 'en-US', 'ja-JP']
|
||||||
|
|
||||||
/** 判断节点是否为消息叶子(同时具备 zh、en 字符串字段) */
|
/** 判断节点是否为消息叶子(同时具备 zh、en、ja 字符串字段) */
|
||||||
function isMessageLeaf(node: unknown): node is MessageLeaf {
|
function isMessageLeaf(node: unknown): node is MessageLeaf {
|
||||||
return (
|
return (
|
||||||
!!node &&
|
!!node &&
|
||||||
typeof node === 'object' &&
|
typeof node === 'object' &&
|
||||||
typeof (node as MessageLeaf).zh === 'string' &&
|
typeof (node as MessageLeaf).zh === 'string' &&
|
||||||
typeof (node as MessageLeaf).en === 'string'
|
typeof (node as MessageLeaf).en === 'string' &&
|
||||||
|
typeof (node as MessageLeaf).ja === 'string'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 递归将对照消息树拆分为指定语言的嵌套消息树 */
|
/** 递归将对照消息树拆分为指定语言的嵌套消息树 */
|
||||||
function buildLocaleMessages(node: unknown, lang: 'zh' | 'en'): any {
|
function buildLocaleMessages(node: unknown, lang: 'zh' | 'en' | 'ja'): any {
|
||||||
if (isMessageLeaf(node)) return node[lang]
|
if (isMessageLeaf(node)) return node[lang]
|
||||||
const result: Record<string, any> = {}
|
const result: Record<string, any> = {}
|
||||||
for (const [key, value] of Object.entries(node as Record<string, unknown>)) {
|
for (const [key, value] of Object.entries(node as Record<string, unknown>)) {
|
||||||
@@ -42,9 +44,13 @@ function resolveInitialLocale(): LocaleKey {
|
|||||||
if (saved && SUPPORTED.includes(saved as LocaleKey)) {
|
if (saved && SUPPORTED.includes(saved as LocaleKey)) {
|
||||||
return saved as LocaleKey
|
return saved as LocaleKey
|
||||||
}
|
}
|
||||||
if (navigator.language?.toLowerCase().startsWith('en')) {
|
const lang = navigator.language?.toLowerCase() ?? ''
|
||||||
|
if (lang.startsWith('en')) {
|
||||||
return 'en-US'
|
return 'en-US'
|
||||||
}
|
}
|
||||||
|
if (lang.startsWith('ja')) {
|
||||||
|
return 'ja-JP'
|
||||||
|
}
|
||||||
return 'zh-CN'
|
return 'zh-CN'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,6 +62,7 @@ const i18n = createI18n({
|
|||||||
messages: {
|
messages: {
|
||||||
'zh-CN': buildLocaleMessages(messages, 'zh'),
|
'zh-CN': buildLocaleMessages(messages, 'zh'),
|
||||||
'en-US': buildLocaleMessages(messages, 'en'),
|
'en-US': buildLocaleMessages(messages, 'en'),
|
||||||
|
'ja-JP': buildLocaleMessages(messages, 'ja'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
+368
-367
@@ -1,455 +1,456 @@
|
|||||||
// 多语言消息定义:每个 key 同时维护中文(zh)与英文(en),一一对应,便于对照维护
|
// 多语言消息定义:每个 key 同时维护中文(zh)、英文(en)与日文(ja),一一对应,便于对照维护
|
||||||
export default {
|
export default {
|
||||||
// 语言名称(用于切换器展示,始终以自身语言呈现)
|
// 语言名称(用于切换器展示,始终以自身语言呈现)
|
||||||
locale: {
|
locale: {
|
||||||
zhCN: { zh: '简体中文', en: '简体中文' },
|
zhCN: { zh: '简体中文', en: '简体中文', ja: '简体中文' },
|
||||||
enUS: { zh: 'English', en: 'English' },
|
enUS: { zh: 'English', en: 'English', ja: 'English' },
|
||||||
|
jaJP: { zh: '日本語', en: '日本語', ja: '日本語' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 通用文案与枚举
|
// 通用文案与枚举
|
||||||
common: {
|
common: {
|
||||||
confirm: { zh: '确定', en: 'Confirm' },
|
confirm: { zh: '确定', en: 'Confirm', ja: '確認' },
|
||||||
cancel: { zh: '取消', en: 'Cancel' },
|
cancel: { zh: '取消', en: 'Cancel', ja: 'キャンセル' },
|
||||||
delete: { zh: '删除', en: 'Delete' },
|
delete: { zh: '删除', en: 'Delete', ja: '削除' },
|
||||||
edit: { zh: '编辑', en: 'Edit' },
|
edit: { zh: '编辑', en: 'Edit', ja: '編集' },
|
||||||
operation: { zh: '操作', en: 'Actions' },
|
operation: { zh: '操作', en: 'Actions', ja: '操作' },
|
||||||
name: { zh: '名称', en: 'Name' },
|
name: { zh: '名称', en: 'Name', ja: '名前' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
sort: { zh: '排序', en: 'Order' },
|
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||||||
all: { zh: '全部', en: 'All' },
|
all: { zh: '全部', en: 'All', ja: 'すべて' },
|
||||||
min: { zh: '最小', en: 'Min' },
|
min: { zh: '最小', en: 'Min', ja: '最小' },
|
||||||
max: { zh: '最大', en: 'Max' },
|
max: { zh: '最大', en: 'Max', ja: '最大' },
|
||||||
reset: { zh: '重置', en: 'Reset' },
|
reset: { zh: '重置', en: 'Reset', ja: 'リセット' },
|
||||||
loadFailed: { zh: '加载失败', en: 'Failed to load' },
|
loadFailed: { zh: '加载失败', en: 'Failed to load', ja: '読み込みに失敗しました' },
|
||||||
operationFailed: { zh: '操作失败', en: 'Operation failed' },
|
operationFailed: { zh: '操作失败', en: 'Operation failed', ja: '操作に失敗しました' },
|
||||||
createSuccess: { zh: '创建成功', en: 'Created successfully' },
|
createSuccess: { zh: '创建成功', en: 'Created successfully', ja: '作成しました' },
|
||||||
updateSuccess: { zh: '修改成功', en: 'Updated successfully' },
|
updateSuccess: { zh: '修改成功', en: 'Updated successfully', ja: '更新しました' },
|
||||||
deleteSuccess: { zh: '删除成功', en: 'Deleted successfully' },
|
deleteSuccess: { zh: '删除成功', en: 'Deleted successfully', ja: '削除しました' },
|
||||||
deleteFailed: { zh: '删除失败', en: 'Failed to delete' },
|
deleteFailed: { zh: '删除失败', en: 'Failed to delete', ja: '削除に失敗しました' },
|
||||||
confirmDelete: { zh: '确认删除', en: 'Confirm Deletion' },
|
confirmDelete: { zh: '确认删除', en: 'Confirm Deletion', ja: '削除の確認' },
|
||||||
types: {
|
types: {
|
||||||
expense: { zh: '支出', en: 'Expense' },
|
expense: { zh: '支出', en: 'Expense', ja: '支出' },
|
||||||
income: { zh: '收入', en: 'Income' },
|
income: { zh: '收入', en: 'Income', ja: '収入' },
|
||||||
},
|
},
|
||||||
payment: {
|
payment: {
|
||||||
wechat: { zh: '微信', en: 'WeChat' },
|
wechat: { zh: '微信', en: 'WeChat', ja: 'WeChat' },
|
||||||
alipay: { zh: '支付宝', en: 'Alipay' },
|
alipay: { zh: '支付宝', en: 'Alipay', ja: 'Alipay' },
|
||||||
cash: { zh: '现金', en: 'Cash' },
|
cash: { zh: '现金', en: 'Cash', ja: '現金' },
|
||||||
bank: { zh: '银行卡', en: 'Bank Card' },
|
bank: { zh: '银行卡', en: 'Bank Card', ja: '銀行カード' },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// 登录页
|
// 登录页
|
||||||
login: {
|
login: {
|
||||||
title: { zh: '收支管理系统 - 登录', en: 'Finance Manager - Sign In' },
|
title: { zh: '收支管理系统 - 登录', en: 'Finance Manager - Sign In', ja: '収支管理システム - ログイン' },
|
||||||
username: { zh: '用户名', en: 'Username' },
|
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||||||
password: { zh: '密码', en: 'Password' },
|
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
|
||||||
usernamePlaceholder: { zh: '请输入用户名', en: 'Enter your username' },
|
usernamePlaceholder: { zh: '请输入用户名', en: 'Enter your username', ja: 'ユーザー名を入力してください' },
|
||||||
passwordPlaceholder: { zh: '请输入密码', en: 'Enter your password' },
|
passwordPlaceholder: { zh: '请输入密码', en: 'Enter your password', ja: 'パスワードを入力してください' },
|
||||||
submit: { zh: '登录', en: 'Sign In' },
|
submit: { zh: '登录', en: 'Sign In', ja: 'ログイン' },
|
||||||
toRegister: { zh: '没有账号?去注册', en: "Don't have an account? Sign up" },
|
toRegister: { zh: '没有账号?去注册', en: "Don't have an account? Sign up", ja: 'アカウントをお持ちでない方は新規登録' },
|
||||||
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password' },
|
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password', ja: 'ユーザー名とパスワードを入力してください' },
|
||||||
success: { zh: '登录成功', en: 'Signed in successfully' },
|
success: { zh: '登录成功', en: 'Signed in successfully', ja: 'ログインしました' },
|
||||||
failed: { zh: '登录失败', en: 'Sign in failed' },
|
failed: { zh: '登录失败', en: 'Sign in failed', ja: 'ログインに失敗しました' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 注册页
|
// 注册页
|
||||||
register: {
|
register: {
|
||||||
title: { zh: '收支管理系统 - 注册', en: 'Finance Manager - Sign Up' },
|
title: { zh: '收支管理系统 - 注册', en: 'Finance Manager - Sign Up', ja: '収支管理システム - 新規登録' },
|
||||||
username: { zh: '用户名', en: 'Username' },
|
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
|
||||||
nickname: { zh: '昵称', en: 'Nickname' },
|
nickname: { zh: '昵称', en: 'Nickname', ja: 'ニックネーム' },
|
||||||
password: { zh: '密码', en: 'Password' },
|
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
|
||||||
confirmPassword: { zh: '确认密码', en: 'Confirm Password' },
|
confirmPassword: { zh: '确认密码', en: 'Confirm Password', ja: 'パスワードの確認' },
|
||||||
usernamePlaceholder: { zh: '3-50个字符', en: '3-50 characters' },
|
usernamePlaceholder: { zh: '3-50个字符', en: '3-50 characters', ja: '3~50文字' },
|
||||||
nicknamePlaceholder: { zh: '可选', en: 'Optional' },
|
nicknamePlaceholder: { zh: '可选', en: 'Optional', ja: '任意' },
|
||||||
passwordPlaceholder: { zh: '至少6个字符', en: 'At least 6 characters' },
|
passwordPlaceholder: { zh: '至少6个字符', en: 'At least 6 characters', ja: '6文字以上' },
|
||||||
confirmPasswordPlaceholder: { zh: '再次输入密码', en: 'Enter the password again' },
|
confirmPasswordPlaceholder: { zh: '再次输入密码', en: 'Enter the password again', ja: 'パスワードをもう一度入力してください' },
|
||||||
submit: { zh: '注册', en: 'Sign Up' },
|
submit: { zh: '注册', en: 'Sign Up', ja: '新規登録' },
|
||||||
toLogin: { zh: '已有账号?去登录', en: 'Already have an account? Sign in' },
|
toLogin: { zh: '已有账号?去登录', en: 'Already have an account? Sign in', ja: 'アカウントをお持ちの方はログイン' },
|
||||||
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password' },
|
fillRequired: { zh: '请填写用户名和密码', en: 'Please enter username and password', ja: 'ユーザー名とパスワードを入力してください' },
|
||||||
usernameMin: { zh: '用户名至少3个字符', en: 'Username must be at least 3 characters' },
|
usernameMin: { zh: '用户名至少3个字符', en: 'Username must be at least 3 characters', ja: 'ユーザー名は3文字以上で入力してください' },
|
||||||
passwordMin: { zh: '密码至少6个字符', en: 'Password must be at least 6 characters' },
|
passwordMin: { zh: '密码至少6个字符', en: 'Password must be at least 6 characters', ja: 'パスワードは6文字以上で入力してください' },
|
||||||
passwordMismatch: { zh: '两次密码不一致', en: 'The two passwords do not match' },
|
passwordMismatch: { zh: '两次密码不一致', en: 'The two passwords do not match', ja: 'パスワードが一致しません' },
|
||||||
success: { zh: '注册成功,请登录', en: 'Registered successfully, please sign in' },
|
success: { zh: '注册成功,请登录', en: 'Registered successfully, please sign in', ja: '登録しました。ログインしてください' },
|
||||||
failed: { zh: '注册失败', en: 'Registration failed' },
|
failed: { zh: '注册失败', en: 'Registration failed', ja: '登録に失敗しました' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 主布局
|
// 主布局
|
||||||
layout: {
|
layout: {
|
||||||
appTitle: { zh: '收支管理', en: 'Finance Manager' },
|
appTitle: { zh: '收支管理', en: 'Finance Manager', ja: '収支管理' },
|
||||||
dashboard: { zh: '统计面板', en: 'Dashboard' },
|
dashboard: { zh: '统计面板', en: 'Dashboard', ja: 'ダッシュボード' },
|
||||||
transactions: { zh: '收支记录', en: 'Transactions' },
|
transactions: { zh: '收支记录', en: 'Transactions', ja: '収支記録' },
|
||||||
categories: { zh: '分类管理', en: 'Categories' },
|
categories: { zh: '分类管理', en: 'Categories', ja: 'カテゴリ管理' },
|
||||||
tags: { zh: '标签管理', en: 'Tags' },
|
tags: { zh: '标签管理', en: 'Tags', ja: 'タグ管理' },
|
||||||
aiSettings: { zh: 'AI 设置', en: 'AI Settings' },
|
aiSettings: { zh: 'AI 设置', en: 'AI Settings', ja: 'AI 設定' },
|
||||||
user: { zh: '用户', en: 'User' },
|
user: { zh: '用户', en: 'User', ja: 'ユーザー' },
|
||||||
logout: { zh: '退出', en: 'Sign Out' },
|
logout: { zh: '退出', en: 'Sign Out', ja: 'ログアウト' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 统计面板
|
// 统计面板
|
||||||
dashboard: {
|
dashboard: {
|
||||||
title: { zh: '统计面板', en: 'Dashboard' },
|
title: { zh: '统计面板', en: 'Dashboard', ja: 'ダッシュボード' },
|
||||||
range: {
|
range: {
|
||||||
month: { zh: '本月', en: 'This Month' },
|
month: { zh: '本月', en: 'This Month', ja: '今月' },
|
||||||
'3month': { zh: '近3月', en: 'Last 3 Months' },
|
'3month': { zh: '近3月', en: 'Last 3 Months', ja: '過去3か月' },
|
||||||
'12month': { zh: '近12月', en: 'Last 12 Months' },
|
'12month': { zh: '近12月', en: 'Last 12 Months', ja: '過去12か月' },
|
||||||
custom: { zh: '自定义', en: 'Custom' },
|
custom: { zh: '自定义', en: 'Custom', ja: 'カスタム' },
|
||||||
},
|
},
|
||||||
granularity: {
|
granularity: {
|
||||||
day: { zh: '按日', en: 'Daily' },
|
day: { zh: '按日', en: 'Daily', ja: '日別' },
|
||||||
week: { zh: '按周', en: 'Weekly' },
|
week: { zh: '按周', en: 'Weekly', ja: '週別' },
|
||||||
month: { zh: '按月', en: 'Monthly' },
|
month: { zh: '按月', en: 'Monthly', ja: '月別' },
|
||||||
quarter: { zh: '按季', en: 'Quarterly' },
|
quarter: { zh: '按季', en: 'Quarterly', ja: '四半期別' },
|
||||||
year: { zh: '按年', en: 'Yearly' },
|
year: { zh: '按年', en: 'Yearly', ja: '年別' },
|
||||||
},
|
},
|
||||||
filterType: { zh: '类型', en: 'Type' },
|
filterType: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
filterCategory: { zh: '分类', en: 'Category' },
|
filterCategory: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||||||
filterPaymentMethod: { zh: '支付方式', en: 'Payment Method' },
|
filterPaymentMethod: { zh: '支付方式', en: 'Payment Method', ja: '支払方法' },
|
||||||
minAmount: { zh: '最小金额', en: 'Min Amount' },
|
minAmount: { zh: '最小金额', en: 'Min Amount', ja: '最小金額' },
|
||||||
maxAmount: { zh: '最大金额', en: 'Max Amount' },
|
maxAmount: { zh: '最大金额', en: 'Max Amount', ja: '最大金額' },
|
||||||
remark: { zh: '备注搜索', en: 'Search Remark' },
|
remark: { zh: '备注搜索', en: 'Search Remark', ja: '備考検索' },
|
||||||
resetFilters: { zh: '重置筛选', en: 'Reset Filters' },
|
resetFilters: { zh: '重置筛选', en: 'Reset Filters', ja: 'フィルターをリセット' },
|
||||||
totalIncome: { zh: '总收入', en: 'Total Income' },
|
totalIncome: { zh: '总收入', en: 'Total Income', ja: '総収入' },
|
||||||
totalExpense: { zh: '总支出', en: 'Total Expense' },
|
totalExpense: { zh: '总支出', en: 'Total Expense', ja: '総支出' },
|
||||||
balance: { zh: '结余', en: 'Balance' },
|
balance: { zh: '结余', en: 'Balance', ja: '収支' },
|
||||||
transactionCount: { zh: '交易笔数', en: 'Transactions' },
|
transactionCount: { zh: '交易笔数', en: 'Transactions', ja: '取引件数' },
|
||||||
avgDailyIncome: { zh: '日均收入', en: 'Avg. Daily Income' },
|
avgDailyIncome: { zh: '日均收入', en: 'Avg. Daily Income', ja: '1日平均収入' },
|
||||||
avgDailyExpense: { zh: '日均支出', en: 'Avg. Daily Expense' },
|
avgDailyExpense: { zh: '日均支出', en: 'Avg. Daily Expense', ja: '1日平均支出' },
|
||||||
maxExpense: { zh: '最大单笔支出', en: 'Largest Expense' },
|
maxExpense: { zh: '最大单笔支出', en: 'Largest Expense', ja: '最大の支出' },
|
||||||
avgExpense: { zh: '平均每笔支出', en: 'Avg. Expense' },
|
avgExpense: { zh: '平均每笔支出', en: 'Avg. Expense', ja: '平均支出' },
|
||||||
trend: { zh: '收支趋势', en: 'Income & Expense Trend' },
|
trend: { zh: '收支趋势', en: 'Income & Expense Trend', ja: '収支の推移' },
|
||||||
expenseCategoryPie: { zh: '支出分类占比', en: 'Expense by Category' },
|
expenseCategoryPie: { zh: '支出分类占比', en: 'Expense by Category', ja: '支出カテゴリの割合' },
|
||||||
paymentPie: { zh: '支付方式分布', en: 'Payment Method Distribution' },
|
paymentPie: { zh: '支付方式分布', en: 'Payment Method Distribution', ja: '支払方法の内訳' },
|
||||||
uncategorized: { zh: '未分类', en: 'Uncategorized' },
|
uncategorized: { zh: '未分类', en: 'Uncategorized', ja: '未分類' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 收支记录
|
// 收支记录
|
||||||
transaction: {
|
transaction: {
|
||||||
title: { zh: '收支记录', en: 'Transactions' },
|
title: { zh: '收支记录', en: 'Transactions', ja: '収支記録' },
|
||||||
sortLabel: { zh: '排序:', en: 'Sort:' },
|
sortLabel: { zh: '排序:', en: 'Sort:', ja: '並び順:' },
|
||||||
sort: {
|
sort: {
|
||||||
timeDesc: { zh: '交易时间(新→旧)', en: 'Time (Newest First)' },
|
timeDesc: { zh: '交易时间(新→旧)', en: 'Time (Newest First)', ja: '取引日時(新しい順)' },
|
||||||
timeAsc: { zh: '交易时间(旧→新)', en: 'Time (Oldest First)' },
|
timeAsc: { zh: '交易时间(旧→新)', en: 'Time (Oldest First)', ja: '取引日時(古い順)' },
|
||||||
amountDesc: { zh: '金额(高→低)', en: 'Amount (High to Low)' },
|
amountDesc: { zh: '金额(高→低)', en: 'Amount (High to Low)', ja: '金額(高い順)' },
|
||||||
amountAsc: { zh: '金额(低→高)', en: 'Amount (Low to High)' },
|
amountAsc: { zh: '金额(低→高)', en: 'Amount (Low to High)', ja: '金額(低い順)' },
|
||||||
},
|
},
|
||||||
batchSet: { zh: '一键设置', en: 'Batch Set' },
|
batchSet: { zh: '一键设置', en: 'Batch Set', ja: '一括設定' },
|
||||||
importBill: { zh: '导入账单', en: 'Import Bill' },
|
importBill: { zh: '导入账单', en: 'Import Bill', ja: '明細をインポート' },
|
||||||
exportExcel: { zh: '导出 Excel', en: 'Export Excel' },
|
exportExcel: { zh: '导出 Excel', en: 'Export Excel', ja: 'Excel をエクスポート' },
|
||||||
addRecord: { zh: '新增记录', en: 'Add Record' },
|
addRecord: { zh: '新增记录', en: 'Add Record', ja: '記録を追加' },
|
||||||
moreFilter: { zh: '更多筛选', en: 'More Filters' },
|
moreFilter: { zh: '更多筛选', en: 'More Filters', ja: '詳細フィルター' },
|
||||||
clear: { zh: '清空', en: 'Clear' },
|
clear: { zh: '清空', en: 'Clear', ja: 'クリア' },
|
||||||
amountRange: { zh: '金额区间', en: 'Amount Range' },
|
amountRange: { zh: '金额区间', en: 'Amount Range', ja: '金額範囲' },
|
||||||
search: { zh: '查询', en: 'Search' },
|
search: { zh: '查询', en: 'Search', ja: '検索' },
|
||||||
reset: { zh: '重置', en: 'Reset' },
|
reset: { zh: '重置', en: 'Reset', ja: 'リセット' },
|
||||||
activeFilters: { zh: '已激活:', en: 'Active:' },
|
activeFilters: { zh: '已激活:', en: 'Active:', ja: '適用中:' },
|
||||||
clearAll: { zh: '清空全部', en: 'Clear all' },
|
clearAll: { zh: '清空全部', en: 'Clear all', ja: 'すべてクリア' },
|
||||||
exampleLabel: { zh: '示例', en: 'Examples' },
|
exampleLabel: { zh: '示例', en: 'Examples', ja: '例' },
|
||||||
summary: { zh: '总计 {total} 条 · 第 {page} / {pages} 页 · 每页 {size} 条', en: 'Total {total} · Page {page} / {pages} · {size} per page' },
|
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' },
|
pageExpense: { zh: '本页支出', en: 'Page Expense', ja: 'このページの支出' },
|
||||||
pageIncome: { zh: '本页收入', en: 'Page Income' },
|
pageIncome: { zh: '本页收入', en: 'Page Income', ja: 'このページの収入' },
|
||||||
pageBalance: { zh: '本页结余', en: 'Page Balance' },
|
pageBalance: { zh: '本页结余', en: 'Page Balance', ja: 'このページの収支' },
|
||||||
column: {
|
column: {
|
||||||
index: { zh: '序号', en: 'No.' },
|
index: { zh: '序号', en: 'No.', ja: 'No.' },
|
||||||
transactionTime: { zh: '交易时间', en: 'Time' },
|
transactionTime: { zh: '交易时间', en: 'Time', ja: '取引日時' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
category: { zh: '分类', en: 'Category' },
|
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||||||
amount: { zh: '金额', en: 'Amount' },
|
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||||||
paymentMethod: { zh: '支付方式', en: 'Payment' },
|
paymentMethod: { zh: '支付方式', en: 'Payment', ja: '支払方法' },
|
||||||
remark: { zh: '备注', en: 'Remark' },
|
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||||||
tags: { zh: '标签', en: 'Tags' },
|
tags: { zh: '标签', en: 'Tags', ja: 'タグ' },
|
||||||
includeInStats: { zh: '计入统计', en: 'In Stats' },
|
includeInStats: { zh: '计入统计', en: 'In Stats', ja: '集計対象' },
|
||||||
actions: { zh: '操作', en: 'Actions' },
|
actions: { zh: '操作', en: 'Actions', ja: '操作' },
|
||||||
},
|
},
|
||||||
notIncluded: { zh: '不计入', en: 'Excluded' },
|
notIncluded: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||||||
uncategorized: { zh: '未分类', en: 'Uncategorized' },
|
uncategorized: { zh: '未分类', en: 'Uncategorized', ja: '未分類' },
|
||||||
untagged: { zh: '无标签', en: 'Untagged' },
|
untagged: { zh: '无标签', en: 'Untagged', ja: 'タグなし' },
|
||||||
remarkHidden: { zh: '备注已隐藏', en: 'Remark hidden' },
|
remarkHidden: { zh: '备注已隐藏', en: 'Remark hidden', ja: '備考を非表示にしました' },
|
||||||
remarkView: { zh: '查看', en: 'View' },
|
remarkView: { zh: '查看', en: 'View', ja: '表示' },
|
||||||
remarkHide: { zh: '隐藏', en: 'Hide' },
|
remarkHide: { zh: '隐藏', en: 'Hide', ja: '非表示' },
|
||||||
remarkCollapse: { zh: '收起', en: 'Collapse' },
|
remarkCollapse: { zh: '收起', en: 'Collapse', ja: '折りたたむ' },
|
||||||
remarkUnhide: { zh: '取消隐藏', en: 'Unhide' },
|
remarkUnhide: { zh: '取消隐藏', en: 'Unhide', ja: '非表示を解除' },
|
||||||
rawData: { zh: '原始数据', en: 'Raw Data' },
|
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||||||
rawDataTitle: { zh: '原始账单数据', en: 'Raw Bill Data' },
|
rawDataTitle: { zh: '原始账单数据', en: 'Raw Bill Data', ja: '元の明細データ' },
|
||||||
createdTime: { zh: '创建时间:{time}', en: 'Created: {time}' },
|
createdTime: { zh: '创建时间:{time}', en: 'Created: {time}', ja: '作成日時:{time}' },
|
||||||
editRecord: { zh: '编辑记录', en: 'Edit Record' },
|
editRecord: { zh: '编辑记录', en: 'Edit Record', ja: '記録を編集' },
|
||||||
addRecordTitle: { zh: '新增记录', en: 'Add Record' },
|
addRecordTitle: { zh: '新增记录', en: 'Add Record', ja: '記録を追加' },
|
||||||
batchTitle: { zh: '一键设置分类与统计', en: 'Batch Set Category & Stats' },
|
batchTitle: { zh: '一键设置分类与统计', en: 'Batch Set Category & Stats', ja: 'カテゴリと集計を一括設定' },
|
||||||
batchScope: { zh: '作用范围', en: 'Scope' },
|
batchScope: { zh: '作用范围', en: 'Scope', ja: '対象範囲' },
|
||||||
batchScopeHint: { zh: '将对当前表格展示的 {count} 条记录设置分类与计入统计', en: 'Apply category and stats settings to the {count} records shown in the table' },
|
batchScopeHint: { zh: '将对当前表格展示的 {count} 条记录设置分类与计入统计', en: 'Apply category and stats settings to the {count} records shown in the table', ja: '現在表示中の {count} 件の記録にカテゴリと集計設定を適用します' },
|
||||||
expenseCategory: { zh: '支出分类', en: 'Expense Category' },
|
expenseCategory: { zh: '支出分类', en: 'Expense Category', ja: '支出カテゴリ' },
|
||||||
incomeCategory: { zh: '收入分类', en: 'Income Category' },
|
incomeCategory: { zh: '收入分类', en: 'Income Category', ja: '収入カテゴリ' },
|
||||||
notSetExpense: { zh: '不设置支出分类', en: 'No expense category' },
|
notSetExpense: { zh: '不设置支出分类', en: 'No expense category', ja: '支出カテゴリを設定しない' },
|
||||||
notSetIncome: { zh: '不设置收入分类', en: 'No income category' },
|
notSetIncome: { zh: '不设置收入分类', en: 'No income category', ja: '収入カテゴリを設定しない' },
|
||||||
addTag: { zh: '添加标签', en: 'Add Tags' },
|
addTag: { zh: '添加标签', en: 'Add Tags', ja: 'タグを追加' },
|
||||||
removeTag: { zh: '移除标签', en: 'Remove Tags' },
|
removeTag: { zh: '移除标签', en: 'Remove Tags', ja: 'タグを削除' },
|
||||||
notAddTag: { zh: '不添加标签', en: 'No tags to add' },
|
notAddTag: { zh: '不添加标签', en: 'No tags to add', ja: 'タグを追加しない' },
|
||||||
notRemoveTag: { zh: '不移除标签', en: 'No tags to remove' },
|
notRemoveTag: { zh: '不移除标签', en: 'No tags to remove', ja: 'タグを削除しない' },
|
||||||
batchStats: {
|
batchStats: {
|
||||||
keep: { zh: '不修改', en: 'No Change' },
|
keep: { zh: '不修改', en: 'No Change', ja: '変更しない' },
|
||||||
include: { zh: '计入统计', en: 'Include in Stats' },
|
include: { zh: '计入统计', en: 'Include in Stats', ja: '集計に含める' },
|
||||||
exclude: { zh: '不计入统计', en: 'Exclude from Stats' },
|
exclude: { zh: '不计入统计', en: 'Exclude from Stats', ja: '集計から除外' },
|
||||||
},
|
},
|
||||||
includeInStats: { zh: '计入统计', en: 'In Stats' },
|
includeInStats: { zh: '计入统计', en: 'In Stats', ja: '集計対象' },
|
||||||
includeInStatsHint: { zh: '关闭后不纳入月度统计(如借款、转账等)', en: 'When off, excluded from monthly stats (e.g. loans, transfers)' },
|
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?' },
|
deleteConfirm: { zh: '确定要删除这条记录吗?', en: 'Are you sure you want to delete this record?', ja: 'この記録を削除してもよろしいですか?' },
|
||||||
selectCategory: { zh: '请选择分类', en: 'Please select a category' },
|
selectCategory: { zh: '请选择分类', en: 'Please select a category', ja: 'カテゴリを選択してください' },
|
||||||
validAmount: { zh: '请输入有效金额', en: 'Please enter a valid amount' },
|
validAmount: { zh: '请输入有效金额', en: 'Please enter a valid amount', ja: '有効な金額を入力してください' },
|
||||||
selectCategoryPlaceholder: { zh: '请选择分类', en: 'Select a category' },
|
selectCategoryPlaceholder: { zh: '请选择分类', en: 'Select a category', ja: 'カテゴリを選択' },
|
||||||
amountPlaceholder: { zh: '请输入金额', en: 'Enter amount' },
|
amountPlaceholder: { zh: '请输入金额', en: 'Enter amount', ja: '金額を入力してください' },
|
||||||
paymentPlaceholder: { zh: '选择支付方式', en: 'Select payment method' },
|
paymentPlaceholder: { zh: '选择支付方式', en: 'Select payment method', ja: '支払方法を選択' },
|
||||||
remarkPlaceholder: { zh: '可选备注说明', en: 'Optional remark' },
|
remarkPlaceholder: { zh: '可选备注说明', en: 'Optional remark', ja: '備考(任意)' },
|
||||||
remarkHistoryClear: { zh: '清空历史', en: 'Clear history' },
|
remarkHistoryClear: { zh: '清空历史', en: 'Clear history', ja: '履歴をクリア' },
|
||||||
tagPlaceholder: { zh: '选择标签', en: 'Select tags' },
|
tagPlaceholder: { zh: '选择标签', en: 'Select tags', ja: 'タグを選択' },
|
||||||
noRawData: { zh: '该记录没有原始账单数据', en: 'This record has no raw bill data' },
|
noRawData: { zh: '该记录没有原始账单数据', en: 'This record has no raw bill data', ja: 'この記録には元の明細データがありません' },
|
||||||
remarkHiddenSuccess: { zh: '已隐藏备注', en: 'Remark hidden' },
|
remarkHiddenSuccess: { zh: '已隐藏备注', en: 'Remark hidden', ja: '備考を非表示にしました' },
|
||||||
remarkShownSuccess: { zh: '已取消隐藏', en: 'Remark unhidden' },
|
remarkShownSuccess: { zh: '已取消隐藏', en: 'Remark unhidden', ja: '備考の非表示を解除しました' },
|
||||||
statsIncluded: { zh: '已计入统计', en: 'Included in stats' },
|
statsIncluded: { zh: '已计入统计', en: 'Included in stats', ja: '集計に含めました' },
|
||||||
statsExcluded: { zh: '已排除统计', en: 'Excluded from stats' },
|
statsExcluded: { zh: '已排除统计', en: 'Excluded from stats', ja: '集計から除外しました' },
|
||||||
noRecordsToSet: { zh: '当前表格没有可设置的记录', en: 'No records available in the current table' },
|
noRecordsToSet: { zh: '当前表格没有可设置的记录', en: 'No records available in the current table', ja: '現在のテーブルに設定できる記録がありません' },
|
||||||
batchNothingSelected: { zh: '请至少选择分类、计入统计或标签', en: 'Please select a category, stats option or tag' },
|
batchNothingSelected: { zh: '请至少选择分类、计入统计或标签', en: 'Please select a category, stats option or tag', ja: 'カテゴリ、集計設定、タグのいずれかを選択してください' },
|
||||||
batchUpdated: { zh: '已更新 {count} 条记录 | 已更新 {count} 条记录', en: 'Updated {count} record | Updated {count} records' },
|
batchUpdated: { zh: '已更新 {count} 条记录 | 已更新 {count} 条记录', en: 'Updated {count} record | Updated {count} records', ja: '{count} 件を更新しました' },
|
||||||
exportSuccess: { zh: '导出成功', en: 'Exported successfully' },
|
exportSuccess: { zh: '导出成功', en: 'Exported successfully', ja: 'エクスポートしました' },
|
||||||
exportFailed: { zh: '导出失败', en: 'Export failed' },
|
exportFailed: { zh: '导出失败', en: 'Export failed', ja: 'エクスポートに失敗しました' },
|
||||||
exportFileName: { zh: '交易记录', en: 'transactions' },
|
exportFileName: { zh: '交易记录', en: 'transactions', ja: '取引記録' },
|
||||||
includeFilter: {
|
includeFilter: {
|
||||||
yes: { zh: '计入', en: 'Included' },
|
yes: { zh: '计入', en: 'Included', ja: '含める' },
|
||||||
no: { zh: '不计入', en: 'Excluded' },
|
no: { zh: '不计入', en: 'Excluded', ja: '含めない' },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// 分类管理
|
// 分类管理
|
||||||
category: {
|
category: {
|
||||||
title: { zh: '分类管理', en: 'Categories' },
|
title: { zh: '分类管理', en: 'Categories', ja: 'カテゴリ管理' },
|
||||||
add: { zh: '新增分类', en: 'Add Category' },
|
add: { zh: '新增分类', en: 'Add Category', ja: 'カテゴリを追加' },
|
||||||
expenseSection: { zh: '支出分类', en: 'Expense Categories' },
|
expenseSection: { zh: '支出分类', en: 'Expense Categories', ja: '支出カテゴリ' },
|
||||||
incomeSection: { zh: '收入分类', en: 'Income Categories' },
|
incomeSection: { zh: '收入分类', en: 'Income Categories', ja: '収入カテゴリ' },
|
||||||
editTitle: { zh: '编辑分类', en: 'Edit Category' },
|
editTitle: { zh: '编辑分类', en: 'Edit Category', ja: 'カテゴリを編集' },
|
||||||
addTitle: { zh: '新增分类', en: 'Add Category' },
|
addTitle: { zh: '新增分类', en: 'Add Category', ja: 'カテゴリを追加' },
|
||||||
name: { zh: '分类名称', en: 'Category Name' },
|
name: { zh: '分类名称', en: 'Category Name', ja: 'カテゴリ名' },
|
||||||
namePlaceholder: { zh: '请输入分类名称', en: 'Enter category name' },
|
namePlaceholder: { zh: '请输入分类名称', en: 'Enter category name', ja: 'カテゴリ名を入力してください' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
icon: { zh: '图标', en: 'Icon' },
|
icon: { zh: '图标', en: 'Icon', ja: 'アイコン' },
|
||||||
iconPlaceholder: { zh: '点击选择 Emoji', en: 'Click to pick an emoji' },
|
iconPlaceholder: { zh: '点击选择 Emoji', en: 'Click to pick an emoji', ja: 'クリックして絵文字を選択' },
|
||||||
emojiInputPlaceholder: { zh: '自定义输入 Emoji 或文字', en: 'Custom emoji or text' },
|
emojiInputPlaceholder: { zh: '自定义输入 Emoji 或文字', en: 'Custom emoji or text', ja: '絵文字または文字を自由に入力' },
|
||||||
clearIcon: { zh: '清除图标', en: 'Clear icon' },
|
clearIcon: { zh: '清除图标', en: 'Clear icon', ja: 'アイコンをクリア' },
|
||||||
sort: { zh: '排序', en: 'Order' },
|
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||||||
nameRequired: { zh: '请输入分类名称', en: 'Please enter a category name' },
|
nameRequired: { zh: '请输入分类名称', en: 'Please enter a category name', ja: 'カテゴリ名を入力してください' },
|
||||||
deleteConfirm: { zh: '确定要删除这个分类吗?', en: 'Are you sure you want to delete this category?' },
|
deleteConfirm: { zh: '确定要删除这个分类吗?', en: 'Are you sure you want to delete this category?', ja: 'このカテゴリを削除してもよろしいですか?' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 标签管理
|
// 标签管理
|
||||||
tag: {
|
tag: {
|
||||||
title: { zh: '标签管理', en: 'Tags' },
|
title: { zh: '标签管理', en: 'Tags', ja: 'タグ管理' },
|
||||||
add: { zh: '新增标签', en: 'Add Tag' },
|
add: { zh: '新增标签', en: 'Add Tag', ja: 'タグを追加' },
|
||||||
editTitle: { zh: '编辑标签', en: 'Edit Tag' },
|
editTitle: { zh: '编辑标签', en: 'Edit Tag', ja: 'タグを編集' },
|
||||||
addTitle: { zh: '新增标签', en: 'Add Tag' },
|
addTitle: { zh: '新增标签', en: 'Add Tag', ja: 'タグを追加' },
|
||||||
name: { zh: '标签名称', en: 'Tag Name' },
|
name: { zh: '标签名称', en: 'Tag Name', ja: 'タグ名' },
|
||||||
namePlaceholder: { zh: '请输入标签名称', en: 'Enter tag name' },
|
namePlaceholder: { zh: '请输入标签名称', en: 'Enter tag name', ja: 'タグ名を入力してください' },
|
||||||
label: { zh: '标签', en: 'Tag' },
|
label: { zh: '标签', en: 'Tag', ja: 'タグ' },
|
||||||
color: { zh: '颜色', en: 'Color' },
|
color: { zh: '颜色', en: 'Color', ja: '色' },
|
||||||
sort: { zh: '排序', en: 'Order' },
|
sort: { zh: '排序', en: 'Order', ja: '並び順' },
|
||||||
nameRequired: { zh: '请输入标签名称', en: 'Please enter a tag name' },
|
nameRequired: { zh: '请输入标签名称', en: 'Please enter a tag name', ja: 'タグ名を入力してください' },
|
||||||
deleteConfirm: { zh: '删除后将从所有交易记录中移除该标签,确定删除吗?', en: 'This tag will be removed from all transactions. Delete it?' },
|
deleteConfirm: { zh: '删除后将从所有交易记录中移除该标签,确定删除吗?', en: 'This tag will be removed from all transactions. Delete it?', ja: '削除するとすべての取引記録からこのタグが外れます。削除してもよろしいですか?' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// 账单导入
|
// 账单导入
|
||||||
import: {
|
import: {
|
||||||
title: { zh: '导入账单', en: 'Import Bill' },
|
title: { zh: '导入账单', en: 'Import Bill', ja: '明細をインポート' },
|
||||||
billType: { zh: '账单类型:', en: 'Bill type:' },
|
billType: { zh: '账单类型:', en: 'Bill type:', ja: '明細の種類:' },
|
||||||
billTypeALIPAY: { zh: '支付宝', en: 'Alipay' },
|
billTypeALIPAY: { zh: '支付宝', en: 'Alipay', ja: 'Alipay' },
|
||||||
billTypeWECHAT: { zh: '微信', en: 'WeChat' },
|
billTypeWECHAT: { zh: '微信', en: 'WeChat', ja: 'WeChat' },
|
||||||
billFile: { zh: '账单文件:', en: 'Bill file:' },
|
billFile: { zh: '账单文件:', en: 'Bill file:', ja: '明細ファイル:' },
|
||||||
dropText: { zh: '点击或拖拽文件到此处', en: 'Click or drag a file here' },
|
dropText: { zh: '点击或拖拽文件到此处', en: 'Click or drag a file here', ja: 'クリックまたはドラッグでファイルを選択' },
|
||||||
fileHint: { zh: '仅支持{label}导出的账单文件({exts})', en: 'Only {label} bill files are supported ({exts})' },
|
fileHint: { zh: '仅支持{label}导出的账单文件({exts})', en: 'Only {label} bill files are supported ({exts})', ja: '{label}からエクスポートした明細ファイルのみ対応({exts})' },
|
||||||
extSeparator: { zh: '、', en: ', ' },
|
extSeparator: { zh: '、', en: ', ', ja: '、' },
|
||||||
exportHintALIPAY: { zh: '导出路径:支付宝 App → 我的 → 账单 → 开具交易流水证明 / 账单导出,选择 CSV 格式。', en: 'Export path: Alipay App → Me → Bills → Issue Transaction Record / Export Bill, choose CSV format.' },
|
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.' },
|
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 形式を選択。' },
|
||||||
parse: { zh: '解析', en: 'Parse' },
|
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||||||
expenseDefaultCategory: { zh: '支出默认分类(可不选):', en: 'Default expense category (optional):' },
|
expenseDefaultCategory: { zh: '支出默认分类(可不选):', en: 'Default expense category (optional):', ja: '支出の既定カテゴリ(任意):' },
|
||||||
incomeDefaultCategory: { zh: '收入默认分类(可不选):', en: 'Default income category (optional):' },
|
incomeDefaultCategory: { zh: '收入默认分类(可不选):', en: 'Default income category (optional):', ja: '収入の既定カテゴリ(任意):' },
|
||||||
defaultTags: { zh: '默认标签(可不选):', en: 'Default tags (optional):' },
|
defaultTags: { zh: '默认标签(可不选):', en: 'Default tags (optional):', ja: '既定タグ(任意):' },
|
||||||
notSetCategory: { zh: '未选则不计分类', en: 'No category if unselected' },
|
notSetCategory: { zh: '未选则不计分类', en: 'No category if unselected', ja: '未選択の場合は分類なし' },
|
||||||
notSetTag: { zh: '未选则不打标签', en: 'No tags if unselected' },
|
notSetTag: { zh: '未选则不打标签', en: 'No tags if unselected', ja: '未選択の場合はタグなし' },
|
||||||
selectAll: { zh: '全选', en: 'Select All' },
|
selectAll: { zh: '全选', en: 'Select All', ja: 'すべて選択' },
|
||||||
previewSummary: { zh: '共 {total} 条,筛选后 {filtered} 条,已勾选 {checked} 条', en: 'Total {total}, {filtered} after filtering, {checked} selected' },
|
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.' },
|
searchPlaceholder: { zh: '搜索交易对方/商品/单号', en: 'Search counterparty / product / order no.', ja: '取引相手/商品/注文番号を検索' },
|
||||||
typePlaceholder: { zh: '类型', en: 'Type' },
|
typePlaceholder: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
statusPlaceholder: { zh: '状态', en: 'Status' },
|
statusPlaceholder: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||||||
typeFilter: {
|
typeFilter: {
|
||||||
income: { zh: '收入', en: 'Income' },
|
income: { zh: '收入', en: 'Income', ja: '収入' },
|
||||||
expense: { zh: '支出', en: 'Expense' },
|
expense: { zh: '支出', en: 'Expense', ja: '支出' },
|
||||||
neutral: { zh: '不计入', en: 'Excluded' },
|
neutral: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||||||
},
|
},
|
||||||
statusFilter: {
|
statusFilter: {
|
||||||
importable: { zh: '可导入', en: 'Importable' },
|
importable: { zh: '可导入', en: 'Importable', ja: 'インポート可' },
|
||||||
duplicate: { zh: '已存在', en: 'Duplicate' },
|
duplicate: { zh: '已存在', en: 'Duplicate', ja: '登録済み' },
|
||||||
error: { zh: '不可导入', en: 'Not Importable' },
|
error: { zh: '不可导入', en: 'Not Importable', ja: 'インポート不可' },
|
||||||
},
|
},
|
||||||
notIncluded: { zh: '不计入', en: 'Excluded' },
|
notIncluded: { zh: '不计入', en: 'Excluded', ja: '対象外' },
|
||||||
notImportable: { zh: '不可导入', en: 'Not Importable' },
|
notImportable: { zh: '不可导入', en: 'Not Importable', ja: 'インポート不可' },
|
||||||
prevStep: { zh: '上一步', en: 'Previous' },
|
prevStep: { zh: '上一步', en: 'Previous', ja: '前へ' },
|
||||||
confirmImport: { zh: '确认导入({count})', en: 'Confirm Import ({count})' },
|
confirmImport: { zh: '确认导入({count})', en: 'Confirm Import ({count})', ja: 'インポートを確定({count})' },
|
||||||
resultSummary: { zh: '导入完成:成功 {imported} 条,跳过 {skipped} 条,失败 {failed} 条', en: 'Import complete: {imported} succeeded, {skipped} skipped, {failed} failed' },
|
resultSummary: { zh: '导入完成:成功 {imported} 条,跳过 {skipped} 条,失败 {failed} 条', en: 'Import complete: {imported} succeeded, {skipped} skipped, {failed} failed', ja: 'インポート完了:成功 {imported} 件、スキップ {skipped} 件、失敗 {failed} 件' },
|
||||||
done: { zh: '完成', en: 'Done' },
|
done: { zh: '完成', en: 'Done', ja: '完了' },
|
||||||
column: {
|
column: {
|
||||||
transactionTime: { zh: '交易时间', en: 'Time' },
|
transactionTime: { zh: '交易时间', en: 'Time', ja: '取引日時' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
amount: { zh: '金额', en: 'Amount' },
|
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||||||
counterparty: { zh: '交易对方', en: 'Counterparty' },
|
counterparty: { zh: '交易对方', en: 'Counterparty', ja: '取引相手' },
|
||||||
product: { zh: '商品名称', en: 'Product' },
|
product: { zh: '商品名称', en: 'Product', ja: '商品名' },
|
||||||
status: { zh: '状态', en: 'Status' },
|
status: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||||||
},
|
},
|
||||||
errorFileType: { zh: '账单类型「{label}」仅支持 {exts} 格式的文件', en: 'Bill type "{label}" only supports files in {exts} format' },
|
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' },
|
selectFileFirst: { zh: '请先选择账单文件', en: 'Please select a bill file first', ja: '先に明細ファイルを選択してください' },
|
||||||
parseFailed: { zh: '解析失败', en: 'Parse failed' },
|
parseFailed: { zh: '解析失败', en: 'Parse failed', ja: '解析に失敗しました' },
|
||||||
selectAtLeastOne: { zh: '请至少勾选一条记录', en: 'Please select at least one record' },
|
selectAtLeastOne: { zh: '请至少勾选一条记录', en: 'Please select at least one record', ja: '少なくとも1件の記録を選択してください' },
|
||||||
importFailed: { zh: '导入失败', en: 'Import failed' },
|
importFailed: { zh: '导入失败', en: 'Import failed', ja: 'インポートに失敗しました' },
|
||||||
loadCategoriesFailed: { zh: '加载分类失败', en: 'Failed to load categories' },
|
loadCategoriesFailed: { zh: '加载分类失败', en: 'Failed to load categories', ja: 'カテゴリの読み込みに失敗しました' },
|
||||||
loadTagsFailed: { zh: '加载标签失败', en: 'Failed to load tags' },
|
loadTagsFailed: { zh: '加载标签失败', en: 'Failed to load tags', ja: 'タグの読み込みに失敗しました' },
|
||||||
},
|
},
|
||||||
|
|
||||||
// AI 智能建议
|
// AI 智能建议
|
||||||
ai: {
|
ai: {
|
||||||
title: { zh: 'AI 智能建议', en: 'AI Suggestions' },
|
title: { zh: 'AI 智能建议', en: 'AI Suggestions', ja: 'AI 提案' },
|
||||||
intro: { zh: '配置 DeepSeek 后,可在收支记录页的「一键设置」中让 AI 根据记录内容推荐分类与标签。', en: 'After configuring DeepSeek, you can let AI recommend categories and tags for records in the "Batch Set" dialog on the Transactions page.' },
|
intro: { zh: '配置 DeepSeek 后,可在收支记录页的「一键设置」中让 AI 根据记录内容推荐分类与标签。', en: 'After configuring DeepSeek, you can let AI recommend categories and tags for records in the "Batch Set" dialog on the Transactions page.', ja: 'DeepSeek を設定すると、収支記録ページの「一括設定」で AI が記録内容に応じてカテゴリとタグを提案できます。' },
|
||||||
configTitle: { zh: '模型配置', en: 'Model Configuration' },
|
configTitle: { zh: '模型配置', en: 'Model Configuration', ja: 'モデル設定' },
|
||||||
enabledOn: { zh: '已启用', en: 'Enabled' },
|
enabledOn: { zh: '已启用', en: 'Enabled', ja: '有効' },
|
||||||
enabledOff: { zh: '未启用', en: 'Disabled' },
|
enabledOff: { zh: '未启用', en: 'Disabled', ja: '無効' },
|
||||||
enabled: { zh: '启用 AI 建议', en: 'Enable AI suggestions' },
|
enabled: { zh: '启用 AI 建议', en: 'Enable AI suggestions', ja: 'AI 提案を有効にする' },
|
||||||
enabledHint: { zh: '关闭后不会发起任何 AI 请求', en: 'No AI requests are sent when disabled' },
|
enabledHint: { zh: '关闭后不会发起任何 AI 请求', en: 'No AI requests are sent when disabled', ja: 'オフにすると AI リクエストは送信されません' },
|
||||||
apiKey: { zh: 'API Key', en: 'API Key' },
|
apiKey: { zh: 'API Key', en: 'API Key', ja: 'API Key' },
|
||||||
apiKeyPlaceholder: { zh: '请输入 DeepSeek API Key', en: 'Enter your DeepSeek 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' },
|
apiKeyKeep: { zh: '已配置,留空表示不修改', en: 'Configured; leave blank to keep unchanged', ja: '設定済み。空欄のままにすると変更されません' },
|
||||||
baseUrl: { zh: '接口地址', en: 'Base URL' },
|
baseUrl: { zh: '接口地址', en: 'Base URL', ja: 'エンドポイント' },
|
||||||
model: { zh: '模型', en: 'Model' },
|
model: { zh: '模型', en: 'Model', ja: 'モデル' },
|
||||||
save: { zh: '保存', en: 'Save' },
|
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||||||
test: { zh: '测试连接', en: 'Test connection' },
|
test: { zh: '测试连接', en: 'Test connection', ja: '接続テスト' },
|
||||||
saveSuccess: { zh: '保存成功', en: 'Saved successfully' },
|
saveSuccess: { zh: '保存成功', en: 'Saved successfully', ja: '保存しました' },
|
||||||
loadFailed: { zh: '加载 AI 配置失败', en: 'Failed to load AI config' },
|
loadFailed: { zh: '加载 AI 配置失败', en: 'Failed to load AI config', ja: 'AI 設定の読み込みに失敗しました' },
|
||||||
testSuccess: { zh: '连接成功', en: 'Connection succeeded' },
|
testSuccess: { zh: '连接成功', en: 'Connection succeeded', ja: '接続に成功しました' },
|
||||||
testFailed: { zh: '连接失败', en: 'Connection failed' },
|
testFailed: { zh: '连接失败', en: 'Connection failed', ja: '接続に失敗しました' },
|
||||||
suggestButton: { zh: 'AI 智能建议', en: 'AI suggestions' },
|
suggestButton: { zh: 'AI 智能建议', en: 'AI suggestions', ja: 'AI 提案' },
|
||||||
pickButton: { zh: 'AI 推荐', en: 'AI Pick' },
|
pickButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||||||
scope: {
|
scope: {
|
||||||
label: { zh: '建议内容', en: 'Scope' },
|
label: { zh: '建议内容', en: 'Scope', ja: '提案内容' },
|
||||||
both: { zh: '分类与标签', en: 'Category & Tags' },
|
both: { zh: '分类与标签', en: 'Category & Tags', ja: 'カテゴリとタグ' },
|
||||||
category: { zh: '仅分类', en: 'Category only' },
|
category: { zh: '仅分类', en: 'Category only', ja: 'カテゴリのみ' },
|
||||||
tag: { zh: '仅标签', en: 'Tags only' },
|
tag: { zh: '仅标签', en: 'Tags only', ja: 'タグのみ' },
|
||||||
},
|
},
|
||||||
suggestTitle: { zh: 'AI 分类与标签建议', en: 'AI category & tag suggestions' },
|
suggestTitle: { zh: 'AI 分类与标签建议', en: 'AI category & tag suggestions', ja: 'AI によるカテゴリとタグの提案' },
|
||||||
suggesting: { zh: '正在分析,请稍候…', en: 'Analyzing, please wait…' },
|
suggesting: { zh: '正在分析,请稍候…', en: 'Analyzing, please wait…', ja: '分析中です。しばらくお待ちください…' },
|
||||||
suggestFailed: { zh: 'AI 建议生成失败', en: 'Failed to generate AI suggestions' },
|
suggestFailed: { zh: 'AI 建议生成失败', en: 'Failed to generate AI suggestions', ja: 'AI 提案の生成に失敗しました' },
|
||||||
noSuggestion: { zh: 'AI 未返回有效建议', en: 'AI returned no valid suggestions' },
|
noSuggestion: { zh: 'AI 未返回有效建议', en: 'AI returned no valid suggestions', ja: 'AI から有効な提案が返されませんでした' },
|
||||||
applyAll: { zh: '应用勾选({count})', en: 'Apply selected ({count})' },
|
applyAll: { zh: '应用勾选({count})', en: 'Apply selected ({count})', ja: '選択項目を適用({count})' },
|
||||||
applyNone: { zh: '请至少勾选一条建议', en: 'Please select at least one suggestion' },
|
applyNone: { zh: '请至少勾选一条建议', en: 'Please select at least one suggestion', ja: '少なくとも1件の提案を選択してください' },
|
||||||
aggregated: { zh: '已聚合为 {groups} 类、共 {count} 条记录', en: 'Aggregated into {groups} groups, {count} records in total' },
|
aggregated: { zh: '已聚合为 {groups} 类、共 {count} 条记录', en: 'Aggregated into {groups} groups, {count} records in total', ja: '{groups} グループ、合計 {count} 件の記録に集約しました' },
|
||||||
applySuccess: { zh: '已应用 {count} 条建议', en: 'Applied {count} suggestions' },
|
applySuccess: { zh: '已应用 {count} 条建议', en: 'Applied {count} suggestions', ja: '{count} 件の提案を適用しました' },
|
||||||
oneApplied: { zh: '已应用 AI 推荐分类', en: 'AI category applied' },
|
oneApplied: { zh: '已应用 AI 推荐分类', en: 'AI category applied', ja: 'AI が提案したカテゴリを適用しました' },
|
||||||
tagApplied: { zh: '已应用 AI 推荐标签', en: 'AI tags applied' },
|
tagApplied: { zh: '已应用 AI 推荐标签', en: 'AI tags applied', ja: 'AI が提案したタグを適用しました' },
|
||||||
applyFailed: { zh: '应用建议失败', en: 'Failed to apply suggestions' },
|
applyFailed: { zh: '应用建议失败', en: 'Failed to apply suggestions', ja: '提案の適用に失敗しました' },
|
||||||
applyHint: { zh: '将覆盖分类并追加标签,确认后立即写入', en: 'Categories will be overwritten and tags appended; changes are written immediately.' },
|
applyHint: { zh: '将覆盖分类并追加标签,确认后立即写入', en: 'Categories will be overwritten and tags appended; changes are written immediately.', ja: 'カテゴリは上書きされ、タグは追加されます。確定するとすぐに保存されます。' },
|
||||||
needConfig: { zh: 'AI 未启用,请先在「AI 设置」中配置', en: 'AI is not enabled. Please configure it in AI Settings first.' },
|
needConfig: { zh: 'AI 未启用,请先在「AI 设置」中配置', en: 'AI is not enabled. Please configure it in AI Settings first.', ja: 'AI が有効になっていません。「AI 設定」で設定してください。' },
|
||||||
decorate: {
|
decorate: {
|
||||||
emojiButton: { zh: 'AI 推荐', en: 'AI Pick' },
|
emojiButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||||||
colorButton: { zh: 'AI 推荐', en: 'AI Pick' },
|
colorButton: { zh: 'AI 推荐', en: 'AI Pick', ja: 'AI におまかせ' },
|
||||||
nameRequired: { zh: '请先输入名称', en: 'Please enter a name first' },
|
nameRequired: { zh: '请先输入名称', en: 'Please enter a name first', ja: '先に名前を入力してください' },
|
||||||
failed: { zh: 'AI 推荐失败', en: 'AI recommendation failed' },
|
failed: { zh: 'AI 推荐失败', en: 'AI recommendation failed', ja: 'AI の提案に失敗しました' },
|
||||||
},
|
},
|
||||||
category: {
|
category: {
|
||||||
label: { zh: 'AI 生成分类', en: 'AI Category' },
|
label: { zh: 'AI 生成分类', en: 'AI Category', ja: 'AI 生成カテゴリ' },
|
||||||
placeholder: { zh: '描述用途,如:日常通勤打车地铁', en: 'Describe it, e.g. daily commute by taxi and metro' },
|
placeholder: { zh: '描述用途,如:日常通勤打车地铁', en: 'Describe it, e.g. daily commute by taxi and metro', ja: '用途を説明してください(例:日常の通勤でタクシーと地下鉄)' },
|
||||||
button: { zh: 'AI 生成', en: 'Generate' },
|
button: { zh: 'AI 生成', en: 'Generate', ja: 'AI で生成' },
|
||||||
textRequired: { zh: '请输入分类描述', en: 'Please enter a description' },
|
textRequired: { zh: '请输入分类描述', en: 'Please enter a description', ja: 'カテゴリの説明を入力してください' },
|
||||||
applied: { zh: '已生成分类,请确认后保存', en: 'Category generated, please confirm and save' },
|
applied: { zh: '已生成分类,请确认后保存', en: 'Category generated, please confirm and save', ja: 'カテゴリを生成しました。確認して保存してください' },
|
||||||
failed: { zh: 'AI 生成分类失败', en: 'Failed to generate category' },
|
failed: { zh: 'AI 生成分类失败', en: 'Failed to generate category', ja: 'AI によるカテゴリ生成に失敗しました' },
|
||||||
},
|
},
|
||||||
newCategory: {
|
newCategory: {
|
||||||
button: { zh: 'AI 新建', en: 'AI New' },
|
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||||||
hint: { zh: 'AI 建议新分类:', en: 'AI suggests:' },
|
hint: { zh: 'AI 建议新分类:', en: 'AI suggests:', ja: 'AI の提案する新カテゴリ:' },
|
||||||
save: { zh: '保存并选用', en: 'Save & Select' },
|
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||||||
saved: { zh: '已创建并选用新分类', en: 'Category created and selected' },
|
saved: { zh: '已创建并选用新分类', en: 'Category created and selected', ja: '新しいカテゴリを作成して選択しました' },
|
||||||
exists: { zh: '已存在同名分类,已为你选中', en: 'A same-name category exists and has been selected' },
|
exists: { zh: '已存在同名分类,已为你选中', en: 'A same-name category exists and has been selected', ja: '同名のカテゴリが存在するため選択しました' },
|
||||||
needInfo: { zh: '请先填写备注或金额,便于生成分类', en: 'Please fill in a remark or amount first' },
|
needInfo: { zh: '请先填写备注或金额,便于生成分类', en: 'Please fill in a remark or amount first', ja: 'カテゴリ生成のため、先に備考または金額を入力してください' },
|
||||||
},
|
},
|
||||||
newTag: {
|
newTag: {
|
||||||
button: { zh: 'AI 新建', en: 'AI New' },
|
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||||||
hint: { zh: 'AI 建议新标签:', en: 'AI suggests tag:' },
|
hint: { zh: 'AI 建议新标签:', en: 'AI suggests tag:', ja: 'AI の提案する新タグ:' },
|
||||||
save: { zh: '保存并选用', en: 'Save & Select' },
|
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||||||
saved: { zh: '已创建并选用新标签', en: 'Tag created and selected' },
|
saved: { zh: '已创建并选用新标签', en: 'Tag created and selected', ja: '新しいタグを作成して選択しました' },
|
||||||
exists: { zh: '已存在同名标签,已为你选中', en: 'A same-name tag exists and has been selected' },
|
exists: { zh: '已存在同名标签,已为你选中', en: 'A same-name tag exists and has been selected', ja: '同名のタグが存在するため選択しました' },
|
||||||
needInfo: { zh: '请先填写备注或金额,便于生成标签', en: 'Please fill in a remark or amount first' },
|
needInfo: { zh: '请先填写备注或金额,便于生成标签', en: 'Please fill in a remark or amount first', ja: 'タグ生成のため、先に備考または金額を入力してください' },
|
||||||
failed: { zh: 'AI 生成标签失败', en: 'Failed to generate tag' },
|
failed: { zh: 'AI 生成标签失败', en: 'Failed to generate tag', ja: 'AI によるタグ生成に失敗しました' },
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
placeholder: { zh: '用自然语言查询,如:上个月餐饮花了多少', en: 'Ask in natural language, e.g. dining expenses last month' },
|
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' },
|
examples: { zh: '上个月餐饮|超过500的支出|待报销的支出|微信支付', en: 'Dining last month|Expenses over 500|Pending reimbursement|Paid by WeChat', ja: '先月の食費|500を超える支出|精算待ちの支出|WeChat 払い' },
|
||||||
button: { zh: 'AI 查询', en: 'AI Query' },
|
button: { zh: 'AI 查询', en: 'AI Query', ja: 'AI 検索' },
|
||||||
emptyInput: { zh: '请输入查询内容', en: 'Please enter a query' },
|
emptyInput: { zh: '请输入查询内容', en: 'Please enter a query', ja: '検索内容を入力してください' },
|
||||||
clearHistory: { zh: '清空历史', en: 'Clear history' },
|
clearHistory: { zh: '清空历史', en: 'Clear history', ja: '履歴をクリア' },
|
||||||
failed: { zh: 'AI 查询解析失败', en: 'Failed to parse the query' },
|
failed: { zh: 'AI 查询解析失败', en: 'Failed to parse the query', ja: 'AI 検索の解析に失敗しました' },
|
||||||
resultTitle: { zh: 'AI 解析结果', en: 'AI Query Result' },
|
resultTitle: { zh: 'AI 解析结果', en: 'AI Query Result', ja: 'AI 解析結果' },
|
||||||
apply: { zh: '应用筛选', en: 'Apply filters' },
|
apply: { zh: '应用筛选', en: 'Apply filters', ja: 'フィルターを適用' },
|
||||||
applied: { zh: '已应用 AI 查询筛选条件', en: 'AI query filters applied' },
|
applied: { zh: '已应用 AI 查询筛选条件', en: 'AI query filters applied', ja: 'AI 検索のフィルターを適用しました' },
|
||||||
noCondition: { zh: '未识别到可用的筛选条件,请换一种说法', en: 'No usable filter conditions recognized, please rephrase' },
|
noCondition: { zh: '未识别到可用的筛选条件,请换一种说法', en: 'No usable filter conditions recognized, please rephrase', ja: '利用できる条件を認識できませんでした。別の言い方をしてください' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
category: { zh: '分类', en: 'Category' },
|
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||||||
tag: { zh: '标签', en: 'Tag' },
|
tag: { zh: '标签', en: 'Tag', ja: 'タグ' },
|
||||||
payment: { zh: '支付方式', en: 'Payment' },
|
payment: { zh: '支付方式', en: 'Payment', ja: '支払方法' },
|
||||||
dateRange: { zh: '时间范围', en: 'Date range' },
|
dateRange: { zh: '时间范围', en: 'Date range', ja: '期間' },
|
||||||
amountRange: { zh: '金额范围', en: 'Amount range' },
|
amountRange: { zh: '金额范围', en: 'Amount range', ja: '金額範囲' },
|
||||||
remark: { zh: '备注', en: 'Remark' },
|
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||||||
includeInStats: { zh: '计入统计', en: 'In stats' },
|
includeInStats: { zh: '计入统计', en: 'In stats', ja: '集計対象' },
|
||||||
includeYes: { zh: '计入', en: 'Included' },
|
includeYes: { zh: '计入', en: 'Included', ja: '含める' },
|
||||||
includeNo: { zh: '不计入', en: 'Excluded' },
|
includeNo: { zh: '不计入', en: 'Excluded', ja: '含めない' },
|
||||||
unmatched: { zh: '未识别', en: 'Unmatched' },
|
unmatched: { zh: '未识别', en: 'Unmatched', ja: '未認識' },
|
||||||
},
|
},
|
||||||
record: {
|
record: {
|
||||||
button: { zh: '智能记账', en: 'Smart Entry' },
|
button: { zh: '智能记账', en: 'Smart Entry', ja: 'スマート入力' },
|
||||||
title: { zh: 'AI 智能记账', en: 'AI Smart Entry' },
|
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.' },
|
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' },
|
placeholder: { zh: '例如:昨天中午吃饭 35 支付宝', en: 'e.g. Lunch yesterday 35 Alipay', ja: '例:昨日の昼食 35 Alipay' },
|
||||||
parse: { zh: '解析', en: 'Parse' },
|
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||||||
emptyInput: { zh: '请输入记账内容', en: 'Please enter the transaction description' },
|
emptyInput: { zh: '请输入记账内容', en: 'Please enter the transaction description', ja: '記帳内容を入力してください' },
|
||||||
failed: { zh: 'AI 记账解析失败', en: 'Failed to parse the transaction' },
|
failed: { zh: 'AI 记账解析失败', en: 'Failed to parse the transaction', ja: 'AI 記帳の解析に失敗しました' },
|
||||||
},
|
},
|
||||||
column: {
|
column: {
|
||||||
record: { zh: '记录', en: 'Record' },
|
record: { zh: '记录', en: 'Record', ja: '記録' },
|
||||||
count: { zh: '命中条数', en: 'Matched' },
|
count: { zh: '命中条数', en: 'Matched', ja: '該当件数' },
|
||||||
category: { zh: '建议分类', en: 'Suggested category' },
|
category: { zh: '建议分类', en: 'Suggested category', ja: '提案カテゴリ' },
|
||||||
tags: { zh: '建议标签', en: 'Suggested tags' },
|
tags: { zh: '建议标签', en: 'Suggested tags', ja: '提案タグ' },
|
||||||
reason: { zh: '理由', en: 'Reason' },
|
reason: { zh: '理由', en: 'Reason', ja: '理由' },
|
||||||
},
|
},
|
||||||
usage: {
|
usage: {
|
||||||
title: { zh: '使用情况', en: 'Usage' },
|
title: { zh: '使用情况', en: 'Usage', ja: '利用状況' },
|
||||||
recentTitle: { zh: '最近调用记录', en: 'Recent calls' },
|
recentTitle: { zh: '最近调用记录', en: 'Recent calls', ja: '最近の呼び出し履歴' },
|
||||||
refresh: { zh: '刷新', en: 'Refresh' },
|
refresh: { zh: '刷新', en: 'Refresh', ja: '更新' },
|
||||||
totalCalls: { zh: '调用次数', en: 'Calls' },
|
totalCalls: { zh: '调用次数', en: 'Calls', ja: '呼び出し回数' },
|
||||||
successCalls: { zh: '成功', en: 'Succeeded' },
|
successCalls: { zh: '成功', en: 'Succeeded', ja: '成功' },
|
||||||
failedCalls: { zh: '失败', en: 'Failed' },
|
failedCalls: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||||||
promptTokens: { zh: '输入 Token', en: 'Prompt tokens' },
|
promptTokens: { zh: '输入 Token', en: 'Prompt tokens', ja: '入力トークン' },
|
||||||
completionTokens: { zh: '输出 Token', en: 'Completion tokens' },
|
completionTokens: { zh: '输出 Token', en: 'Completion tokens', ja: '出力トークン' },
|
||||||
totalTokens: { zh: '总 Token', en: 'Total tokens' },
|
totalTokens: { zh: '总 Token', en: 'Total tokens', ja: '合計トークン' },
|
||||||
cachedTokens: { zh: '缓存命中', en: 'Cached tokens' },
|
cachedTokens: { zh: '缓存命中', en: 'Cached tokens', ja: 'キャッシュヒット' },
|
||||||
success: { zh: '成功', en: 'Success' },
|
success: { zh: '成功', en: 'Success', ja: '成功' },
|
||||||
failed: { zh: '失败', en: 'Failed' },
|
failed: { zh: '失败', en: 'Failed', ja: '失敗' },
|
||||||
loadFailed: { zh: '加载使用情况失败', en: 'Failed to load usage' },
|
loadFailed: { zh: '加载使用情况失败', en: 'Failed to load usage', ja: '利用状況の読み込みに失敗しました' },
|
||||||
empty: { zh: '暂无调用记录', en: 'No usage records yet' },
|
empty: { zh: '暂无调用记录', en: 'No usage records yet', ja: '呼び出し履歴はまだありません' },
|
||||||
type: {
|
type: {
|
||||||
suggest: { zh: '生成建议', en: 'Suggest' },
|
suggest: { zh: '生成建议', en: 'Suggest', ja: '提案生成' },
|
||||||
decorate: { zh: '图标配色', en: 'Icon & Color' },
|
decorate: { zh: '图标配色', en: 'Icon & Color', ja: 'アイコンと配色' },
|
||||||
category: { zh: '生成分类', en: 'Category' },
|
category: { zh: '生成分类', en: 'Category', ja: 'カテゴリ生成' },
|
||||||
test: { zh: '测试连接', en: 'Test' },
|
test: { zh: '测试连接', en: 'Test', ja: '接続テスト' },
|
||||||
},
|
},
|
||||||
column: {
|
column: {
|
||||||
time: { zh: '时间', en: 'Time' },
|
time: { zh: '时间', en: 'Time', ja: '日時' },
|
||||||
type: { zh: '类型', en: 'Type' },
|
type: { zh: '类型', en: 'Type', ja: '種類' },
|
||||||
count: { zh: '分析条数', en: 'Records' },
|
count: { zh: '分析条数', en: 'Records', ja: '分析件数' },
|
||||||
promptTokens: { zh: '输入', en: 'Prompt' },
|
promptTokens: { zh: '输入', en: 'Prompt', ja: '入力' },
|
||||||
completionTokens: { zh: '输出', en: 'Completion' },
|
completionTokens: { zh: '输出', en: 'Completion', ja: '出力' },
|
||||||
totalTokens: { zh: '总计', en: 'Total' },
|
totalTokens: { zh: '总计', en: 'Total', ja: '合計' },
|
||||||
duration: { zh: '耗时', en: 'Duration' },
|
duration: { zh: '耗时', en: 'Duration', ja: '所要時間' },
|
||||||
status: { zh: '状态', en: 'Status' },
|
status: { zh: '状态', en: 'Status', ja: 'ステータス' },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user