chore(i18n): Separate check-i18n and sync-i18n; add auto sort i18n (#8206)

* feat(i18n): 优化i18n check脚本

* fix: 移除重复的代码行和错误信息

* fix: 重新排序

* fix: i18n sort

* test

* test

* test

* test

* test

* test

* feat(i18n): 添加同步翻译脚本并重构检查脚本

重构 check-i18n 脚本为纯检查功能,不再自动修改翻译文件
新增 sync-i18n 脚本用于自动同步翻译文件结构
更新 package.json 添加 sync:i18n 命令
移除不再需要的 husky pre-commit.js 钩子

* docs(i18n): 移除未使用的测试翻译文本

* feat(scripts): 添加对象键名排序功能及测试

添加 lexicalSort 函数和 sortedObjectByKeys 函数用于按字典序排序对象键名
新增测试用例验证排序功能

* feat(i18n): 添加翻译文件键值排序检查功能

添加对i18n翻译文件键值字典序的检查功能,确保翻译文件保持一致的排序结构

* refactor(i18n): 优化同步逻辑并添加键排序功能

移除syncRecursively的返回值检查,简化同步流程
添加对翻译文件的键排序功能,使用sortedObjectByKeys工具
确保主模板和翻译文件在同步后都保持有序

* fix(i18n): 重新排序翻译文件

* style(scripts): 格式化sort.js

* chore: 将 test:sort 重命名为 test:scripts
This commit is contained in:
Phantom 2025-07-19 23:26:40 +08:00 committed by GitHub
parent 0149cfbd21
commit 71dfec6875
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 1472 additions and 1014 deletions

View File

@ -1,8 +1,11 @@
{
"singleQuote": true,
"semi": false,
"printWidth": 120,
"trailingComma": "none",
"bracketSameLine": true,
"endOfLine": "lf",
"bracketSameLine": true
"jsonRecursiveSort": true,
"jsonSortOrder": "{\"*\": \"lexical\"}",
"plugins": ["prettier-plugin-sort-json"],
"printWidth": 120,
"semi": false,
"singleQuote": true,
"trailingComma": "none"
}

View File

@ -44,6 +44,7 @@
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
"check:i18n": "node scripts/check-i18n.js",
"sync:i18n": "node scripts/sync-i18n.js",
"test": "vitest run --silent",
"test:main": "vitest run --project main",
"test:renderer": "vitest run --project renderer",
@ -53,6 +54,7 @@
"test:watch": "vitest",
"test:e2e": "yarn playwright test",
"test:lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts",
"test:scripts": "vitest scripts",
"format": "prettier --write .",
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
"prepare": "git config blame.ignoreRevsFile .git-blame-ignore-revs && husky"
@ -198,6 +200,7 @@
"p-queue": "^8.1.0",
"playwright": "^1.52.0",
"prettier": "^3.5.3",
"prettier-plugin-sort-json": "^4.1.1",
"proxy-agent": "^6.5.0",
"rc-virtual-list": "^3.18.6",
"react": "^19.0.0",

View File

@ -0,0 +1,92 @@
import { sortedObjectByKeys } from '../sort'
describe('sortedObjectByKeys', () => {
test('should sort keys of a flat object alphabetically', () => {
const obj = { b: 2, a: 1, c: 3 }
const sortedObj = { a: 1, b: 2, c: 3 }
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should sort keys of nested objects alphabetically', () => {
const obj = {
c: { z: 3, y: 2, x: 1 },
a: 1,
b: { f: 6, d: 4, e: 5 }
}
const sortedObj = {
a: 1,
b: { d: 4, e: 5, f: 6 },
c: { x: 1, y: 2, z: 3 }
}
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should handle empty objects', () => {
const obj = {}
expect(sortedObjectByKeys(obj)).toEqual({})
})
test('should handle objects with non-object values', () => {
const obj = { b: 'hello', a: 123, c: true }
const sortedObj = { a: 123, b: 'hello', c: true }
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should handle objects with array values', () => {
const obj = { b: [2, 1], a: [1, 2] }
const sortedObj = { a: [1, 2], b: [2, 1] }
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should handle objects with null values', () => {
const obj = { b: null, a: 1 }
const sortedObj = { a: 1, b: null }
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should handle objects with undefined values', () => {
const obj = { b: undefined, a: 1 }
const sortedObj = { a: 1, b: undefined }
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
test('should not modify the original object', () => {
const obj = { b: 2, a: 1 }
sortedObjectByKeys(obj)
expect(obj).toEqual({ b: 2, a: 1 })
})
test('should handle objects read from i18n JSON files', () => {
const obj = {
translation: {
backup: {
progress: {
writing_data: '写入数据...',
preparing: '准备备份...',
completed: '备份完成'
}
},
agents: {
'delete.popup.content': '确定要删除此智能体吗?',
'edit.model.select.title': '选择模型'
}
}
}
const sortedObj = {
translation: {
agents: {
'delete.popup.content': '确定要删除此智能体吗?',
'edit.model.select.title': '选择模型'
},
backup: {
progress: {
completed: '备份完成',
preparing: '准备备份...',
writing_data: '写入数据...'
}
}
}
}
expect(sortedObjectByKeys(obj)).toEqual(sortedObj)
})
})

View File

@ -1,103 +1,50 @@
'use strict'
var __createBinding =
(this && this.__createBinding) ||
(Object.create
? function (o, m, k, k2) {
if (k2 === undefined) k2 = k
var desc = Object.getOwnPropertyDescriptor(m, k)
if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = {
enumerable: true,
get: function () {
return m[k]
}
}
}
Object.defineProperty(o, k2, desc)
}
: function (o, m, k, k2) {
if (k2 === undefined) k2 = k
o[k2] = m[k]
})
var __setModuleDefault =
(this && this.__setModuleDefault) ||
(Object.create
? function (o, v) {
Object.defineProperty(o, 'default', { enumerable: true, value: v })
}
: function (o, v) {
o['default'] = v
})
var __importStar =
(this && this.__importStar) ||
(function () {
var ownKeys = function (o) {
ownKeys =
Object.getOwnPropertyNames ||
function (o) {
var ar = []
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k
return ar
}
return ownKeys(o)
}
return function (mod) {
if (mod && mod.__esModule) return mod
var result = {}
if (mod != null)
for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== 'default') __createBinding(result, mod, k[i])
__setModuleDefault(result, mod)
return result
}
})()
Object.defineProperty(exports, '__esModule', { value: true })
var fs = __importStar(require('fs'))
var path = __importStar(require('path'))
exports.main = main
var fs = require('fs')
var path = require('path')
var sort_1 = require('./sort')
var translationsDir = path.join(__dirname, '../src/renderer/src/i18n/locales')
var baseLocale = 'zh-cn'
var baseFileName = ''.concat(baseLocale, '.json')
var baseFilePath = path.join(translationsDir, baseFileName)
/**
* 递归同步 target 对象使其与 template 对象保持一致
* 1. 如果 template 中存在 target 中缺少的 key则添加'[to be translated]'
* 2. 如果 target 中存在 template 中不存在的 key则删除
* 3. 对于子对象递归同步
* 递归检查并同步目标对象与模板对象的键值结构
* 1. 如果目标对象缺少模板对象中的键抛出错误
* 2. 如果目标对象存在模板对象中不存在的键抛出错误
* 3. 对于嵌套对象递归执行同步操作
*
* @param target 目标对象需要更新的语言对象
* @param template 主模板对象中文
* @returns 返回是否对 target 进行了更新
* 该函数用于确保所有翻译文件与基准模板通常是中文翻译文件保持完全一致的键值结构
* 任何结构上的差异都会导致错误被抛出以便及时发现和修复翻译文件中的问题
*
* @param target 需要检查的目标翻译对象
* @param template 作为基准的模板对象通常是中文翻译文件
* @throws {Error} 当发现键值结构不匹配时抛出错误
*/
function syncRecursively(target, template) {
var isUpdated = false
// 添加 template 中存在但 target 中缺少的 key
function checkRecursively(target, template) {
for (var key in template) {
if (!(key in target)) {
target[key] =
typeof template[key] === 'object' && template[key] !== null ? {} : '[to be translated]:'.concat(template[key])
console.log('\u6DFB\u52A0\u65B0\u5C5E\u6027\uFF1A'.concat(key))
isUpdated = true
throw new Error('\u7F3A\u5C11\u5C5E\u6027 '.concat(key))
}
if (typeof template[key] === 'object' && template[key] !== null) {
if (typeof target[key] !== 'object' || target[key] === null) {
target[key] = {}
isUpdated = true
}
// 递归同步子对象
var childUpdated = syncRecursively(target[key], template[key])
if (childUpdated) {
isUpdated = true
throw new Error('\u5C5E\u6027 '.concat(key, ' \u4E0D\u662F\u5BF9\u8C61'))
}
// 递归检查子对象
checkRecursively(target[key], template[key])
}
}
// 删除 target 中存在但 template 中没有的 key
for (var targetKey in target) {
if (!(targetKey in template)) {
console.log('\u79FB\u9664\u591A\u4F59\u5C5E\u6027\uFF1A'.concat(targetKey))
delete target[targetKey]
isUpdated = true
throw new Error('\u591A\u4F59\u5C5E\u6027 '.concat(targetKey))
}
}
return isUpdated
}
function isSortedI18N(obj) {
// fs.writeFileSync('./test_origin.json', JSON.stringify(obj))
// fs.writeFileSync('./test_sorted.json', JSON.stringify(sortedObjectByKeys(obj)))
return JSON.stringify(obj) === JSON.stringify((0, sort_1.sortedObjectByKeys)(obj))
}
/**
* 检查 JSON 对象中是否存在重复键并收集所有重复键
@ -130,23 +77,21 @@ function checkDuplicateKeys(obj) {
checkObject(obj)
return duplicateKeys
}
function syncTranslations() {
function checkTranslations() {
if (!fs.existsSync(baseFilePath)) {
console.error(
throw new Error(
'\u4E3B\u6A21\u677F\u6587\u4EF6 '.concat(
baseFileName,
' \u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u6216\u6587\u4EF6\u540D'
)
)
return
}
var baseContent = fs.readFileSync(baseFilePath, 'utf-8')
var baseJson = {}
try {
baseJson = JSON.parse(baseContent)
} catch (error) {
console.error('\u89E3\u6790 '.concat(baseFileName, ' \u51FA\u9519\u3002').concat(error))
return
throw new Error('\u89E3\u6790 '.concat(baseFileName, ' \u51FA\u9519\u3002').concat(error))
}
// 检查主模板是否存在重复键
var duplicateKeys = checkDuplicateKeys(baseJson)
@ -157,9 +102,19 @@ function syncTranslations() {
.concat(duplicateKeys.join('\n'))
)
}
// 检查主模板是否有序
if (!isSortedI18N(baseJson)) {
throw new Error(
'\u4E3B\u6A21\u677F\u6587\u4EF6 '.concat(
baseFileName,
' \u7684\u952E\u503C\u672A\u6309\u5B57\u5178\u5E8F\u6392\u5E8F\u3002'
)
)
}
var files = fs.readdirSync(translationsDir).filter(function (file) {
return file.endsWith('.json') && file !== baseFileName
})
// 同步键
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
var file = files_1[_i]
var filePath = path.join(translationsDir, file)
@ -168,20 +123,29 @@ function syncTranslations() {
var fileContent = fs.readFileSync(filePath, 'utf-8')
targetJson = JSON.parse(fileContent)
} catch (error) {
console.error('\u89E3\u6790 '.concat(file, ' \u51FA\u9519\uFF0C\u8DF3\u8FC7\u6B64\u6587\u4EF6\u3002'), error)
continue
throw new Error('\u89E3\u6790 '.concat(file, ' \u51FA\u9519\u3002'))
}
var isUpdated = syncRecursively(targetJson, baseJson)
if (isUpdated) {
try {
fs.writeFileSync(filePath, JSON.stringify(targetJson, null, 2) + '\n', 'utf-8')
console.log('\u6587\u4EF6 '.concat(file, ' \u5DF2\u66F4\u65B0\u540C\u6B65\u4E3B\u6A21\u677F\u7684\u5185\u5BB9'))
} catch (error) {
console.error('\u5199\u5165 '.concat(file, ' \u51FA\u9519\u3002').concat(error))
}
} else {
console.log('\u6587\u4EF6 '.concat(file, ' \u65E0\u9700\u66F4\u65B0'))
// 检查有序性
if (!isSortedI18N(targetJson)) {
throw new Error(
'\u7FFB\u8BD1\u6587\u4EF6 '.concat(file, ' \u7684\u952E\u503C\u672A\u6309\u5B57\u5178\u5E8F\u6392\u5E8F\u3002')
)
}
try {
checkRecursively(targetJson, baseJson)
} catch (e) {
throw new Error('\u5728\u68C0\u67E5 '.concat(filePath, ' \u65F6\u51FA\u9519\uFF1A').concat(e))
}
}
}
syncTranslations()
function main() {
try {
checkTranslations()
} catch (e) {
console.error(e)
throw new Error(
'\u68C0\u67E5\u672A\u901A\u8FC7\u3002\u5C1D\u8BD5\u8FD0\u884C yarn sync:i18n \u4EE5\u89E3\u51B3\u95EE\u9898\u3002'
)
}
}
main()

View File

@ -1,55 +1,55 @@
import * as fs from 'fs'
import * as path from 'path'
import { sortedObjectByKeys } from './sort'
const translationsDir = path.join(__dirname, '../src/renderer/src/i18n/locales')
const baseLocale = 'zh-cn'
const baseFileName = `${baseLocale}.json`
const baseFilePath = path.join(translationsDir, baseFileName)
/**
* target 使 template
* 1. template target key'[to be translated]'
* 2. target template key
* 3.
*
* @param target
* @param template
* @returns target
*/
function syncRecursively(target: any, template: any): boolean {
let isUpdated = false
type I18NValue = string | { [key: string]: I18NValue }
type I18N = { [key: string]: I18NValue }
// 添加 template 中存在但 target 中缺少的 key
/**
*
* 1.
* 2.
* 3.
*
*
* 便
*
* @param target
* @param template
* @throws {Error}
*/
function checkRecursively(target: I18N, template: I18N): void {
for (const key in template) {
if (!(key in target)) {
target[key] =
typeof template[key] === 'object' && template[key] !== null ? {} : `[to be translated]:${template[key]}`
console.log(`添加新属性:${key}`)
isUpdated = true
throw new Error(`缺少属性 ${key}`)
}
if (typeof template[key] === 'object' && template[key] !== null) {
if (typeof target[key] !== 'object' || target[key] === null) {
target[key] = {}
isUpdated = true
}
// 递归同步子对象
const childUpdated = syncRecursively(target[key], template[key])
if (childUpdated) {
isUpdated = true
throw new Error(`属性 ${key} 不是对象`)
}
// 递归检查子对象
checkRecursively(target[key], template[key])
}
}
// 删除 target 中存在但 template 中没有的 key
for (const targetKey in target) {
if (!(targetKey in template)) {
console.log(`移除多余属性:${targetKey}`)
delete target[targetKey]
isUpdated = true
throw new Error(`多余属性 ${targetKey}`)
}
}
}
return isUpdated
function isSortedI18N(obj: I18N): boolean {
// fs.writeFileSync('./test_origin.json', JSON.stringify(obj))
// fs.writeFileSync('./test_sorted.json', JSON.stringify(sortedObjectByKeys(obj)))
return JSON.stringify(obj) === JSON.stringify(sortedObjectByKeys(obj))
}
/**
@ -57,11 +57,11 @@ function syncRecursively(target: any, template: any): boolean {
* @param obj
* @returns
*/
function checkDuplicateKeys(obj: Record<string, any>): string[] {
function checkDuplicateKeys(obj: I18N): string[] {
const keys = new Set<string>()
const duplicateKeys: string[] = []
const checkObject = (obj: Record<string, any>, path: string = '') => {
const checkObject = (obj: I18N, path: string = '') => {
for (const key in obj) {
const fullPath = path ? `${path}.${key}` : key
@ -85,19 +85,17 @@ function checkDuplicateKeys(obj: Record<string, any>): string[] {
return duplicateKeys
}
function syncTranslations() {
function checkTranslations() {
if (!fs.existsSync(baseFilePath)) {
console.error(`主模板文件 ${baseFileName} 不存在,请检查路径或文件名`)
return
throw new Error(`主模板文件 ${baseFileName} 不存在,请检查路径或文件名`)
}
const baseContent = fs.readFileSync(baseFilePath, 'utf-8')
let baseJson: Record<string, any> = {}
let baseJson: I18N = {}
try {
baseJson = JSON.parse(baseContent)
} catch (error) {
console.error(`解析 ${baseFileName} 出错。${error}`)
return
throw new Error(`解析 ${baseFileName} 出错。${error}`)
}
// 检查主模板是否存在重复键
@ -106,32 +104,44 @@ function syncTranslations() {
throw new Error(`主模板文件 ${baseFileName} 存在以下重复键:\n${duplicateKeys.join('\n')}`)
}
// 检查主模板是否有序
if (!isSortedI18N(baseJson)) {
throw new Error(`主模板文件 ${baseFileName} 的键值未按字典序排序。`)
}
const files = fs.readdirSync(translationsDir).filter((file) => file.endsWith('.json') && file !== baseFileName)
// 同步键
for (const file of files) {
const filePath = path.join(translationsDir, file)
let targetJson: Record<string, any> = {}
let targetJson: I18N = {}
try {
const fileContent = fs.readFileSync(filePath, 'utf-8')
targetJson = JSON.parse(fileContent)
} catch (error) {
console.error(`解析 ${file} 出错,跳过此文件。`, error)
continue
throw new Error(`解析 ${file} 出错。`)
}
const isUpdated = syncRecursively(targetJson, baseJson)
// 检查有序性
if (!isSortedI18N(targetJson)) {
throw new Error(`翻译文件 ${file} 的键值未按字典序排序。`)
}
if (isUpdated) {
try {
fs.writeFileSync(filePath, JSON.stringify(targetJson, null, 2) + '\n', 'utf-8')
console.log(`文件 ${file} 已更新同步主模板的内容`)
} catch (error) {
console.error(`写入 ${file} 出错。${error}`)
}
} else {
console.log(`文件 ${file} 无需更新`)
try {
checkRecursively(targetJson, baseJson)
} catch (e) {
throw new Error(`在检查 ${filePath} 时出错:${e}`)
}
}
}
syncTranslations()
export function main() {
try {
checkTranslations()
} catch (e) {
console.error(e)
throw new Error(`检查未通过。尝试运行 yarn sync:i18n 以解决问题。`)
}
}
main()

40
scripts/sort.js Normal file
View File

@ -0,0 +1,40 @@
'use strict'
Object.defineProperty(exports, '__esModule', { value: true })
exports.sortedObjectByKeys = sortedObjectByKeys
// https://github.com/Gudahtt/prettier-plugin-sort-json/blob/main/src/index.ts
/**
* Lexical sort function for strings, meant to be used as the sort
* function for `Array.prototype.sort`.
*
* @param a - First element to compare.
* @param b - Second element to compare.
* @returns A number indicating which element should come first.
*/
function lexicalSort(a, b) {
if (a > b) {
return 1
}
if (a < b) {
return -1
}
return 0
}
/**
* 对对象的键按照字典序进行排序支持嵌套对象
* @param obj 需要排序的对象
* @returns 返回排序后的新对象
*/
function sortedObjectByKeys(obj) {
var sortedKeys = Object.keys(obj).sort(lexicalSort)
var sortedObj = {}
for (var _i = 0, sortedKeys_1 = sortedKeys; _i < sortedKeys_1.length; _i++) {
var key = sortedKeys_1[_i]
var value = obj[key]
// 如果值是对象,递归排序
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
value = sortedObjectByKeys(value)
}
sortedObj[key] = value
}
return sortedObj
}

39
scripts/sort.ts Normal file
View File

@ -0,0 +1,39 @@
// https://github.com/Gudahtt/prettier-plugin-sort-json/blob/main/src/index.ts
/**
* Lexical sort function for strings, meant to be used as the sort
* function for `Array.prototype.sort`.
*
* @param a - First element to compare.
* @param b - Second element to compare.
* @returns A number indicating which element should come first.
*/
function lexicalSort(a: string, b: string): number {
if (a > b) {
return 1
}
if (a < b) {
return -1
}
return 0
}
/**
*
* @param obj
* @returns
*/
export function sortedObjectByKeys(obj: object): object {
const sortedKeys = Object.keys(obj).sort(lexicalSort)
const sortedObj = {}
for (const key of sortedKeys) {
let value = obj[key]
// 如果值是对象,递归排序
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
value = sortedObjectByKeys(value)
}
sortedObj[key] = value
}
return sortedObj
}

143
scripts/sync-i18n.js Normal file
View File

@ -0,0 +1,143 @@
'use strict'
Object.defineProperty(exports, '__esModule', { value: true })
var fs = require('fs')
var path = require('path')
var sort_1 = require('./sort')
var translationsDir = path.join(__dirname, '../src/renderer/src/i18n/locales')
var baseLocale = 'zh-cn'
var baseFileName = ''.concat(baseLocale, '.json')
var baseFilePath = path.join(translationsDir, baseFileName)
/**
* 递归同步 target 对象使其与 template 对象保持一致
* 1. 如果 template 中存在 target 中缺少的 key则添加'[to be translated]'
* 2. 如果 target 中存在 template 中不存在的 key则删除
* 3. 对于子对象递归同步
*
* @param target 目标对象需要更新的语言对象
* @param template 主模板对象中文
* @returns 返回是否对 target 进行了更新
*/
function syncRecursively(target, template) {
// 添加 template 中存在但 target 中缺少的 key
for (var key in template) {
if (!(key in target)) {
target[key] =
typeof template[key] === 'object' && template[key] !== null ? {} : '[to be translated]:'.concat(template[key])
console.log('\u6DFB\u52A0\u65B0\u5C5E\u6027\uFF1A'.concat(key))
}
if (typeof template[key] === 'object' && template[key] !== null) {
if (typeof target[key] !== 'object' || target[key] === null) {
target[key] = {}
}
// 递归同步子对象
syncRecursively(target[key], template[key])
}
}
// 删除 target 中存在但 template 中没有的 key
for (var targetKey in target) {
if (!(targetKey in template)) {
console.log('\u79FB\u9664\u591A\u4F59\u5C5E\u6027\uFF1A'.concat(targetKey))
delete target[targetKey]
}
}
}
/**
* 检查 JSON 对象中是否存在重复键并收集所有重复键
* @param obj 要检查的对象
* @returns 返回重复键的数组若无重复则返回空数组
*/
function checkDuplicateKeys(obj) {
var keys = new Set()
var duplicateKeys = []
var checkObject = function (obj, path) {
if (path === void 0) {
path = ''
}
for (var key in obj) {
var fullPath = path ? ''.concat(path, '.').concat(key) : key
if (keys.has(fullPath)) {
// 发现重复键时,添加到数组中(避免重复添加)
if (!duplicateKeys.includes(fullPath)) {
duplicateKeys.push(fullPath)
}
} else {
keys.add(fullPath)
}
// 递归检查子对象
if (typeof obj[key] === 'object' && obj[key] !== null) {
checkObject(obj[key], fullPath)
}
}
}
checkObject(obj)
return duplicateKeys
}
function syncTranslations() {
if (!fs.existsSync(baseFilePath)) {
console.error(
'\u4E3B\u6A21\u677F\u6587\u4EF6 '.concat(
baseFileName,
' \u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u6216\u6587\u4EF6\u540D'
)
)
return
}
var baseContent = fs.readFileSync(baseFilePath, 'utf-8')
var baseJson = {}
try {
baseJson = JSON.parse(baseContent)
} catch (error) {
console.error('\u89E3\u6790 '.concat(baseFileName, ' \u51FA\u9519\u3002').concat(error))
return
}
// 检查主模板是否存在重复键
var duplicateKeys = checkDuplicateKeys(baseJson)
if (duplicateKeys.length > 0) {
throw new Error(
'\u4E3B\u6A21\u677F\u6587\u4EF6 '
.concat(baseFileName, ' \u5B58\u5728\u4EE5\u4E0B\u91CD\u590D\u952E\uFF1A\n')
.concat(duplicateKeys.join('\n'))
)
}
// 为主模板排序
var sortedJson = (0, sort_1.sortedObjectByKeys)(baseJson)
if (JSON.stringify(baseJson) !== JSON.stringify(sortedJson)) {
try {
fs.writeFileSync(baseFilePath, JSON.stringify(sortedJson, null, 2) + '\n', 'utf-8')
console.log('\u4E3B\u6A21\u677F\u5DF2\u6392\u5E8F')
} catch (error) {
console.error('\u5199\u5165 '.concat(baseFilePath, ' \u51FA\u9519\u3002'), error)
return
}
}
var files = fs.readdirSync(translationsDir).filter(function (file) {
return file.endsWith('.json') && file !== baseFileName
})
// 同步键
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
var file = files_1[_i]
var filePath = path.join(translationsDir, file)
var targetJson = {}
try {
var fileContent = fs.readFileSync(filePath, 'utf-8')
targetJson = JSON.parse(fileContent)
} catch (error) {
console.error('\u89E3\u6790 '.concat(file, ' \u51FA\u9519\uFF0C\u8DF3\u8FC7\u6B64\u6587\u4EF6\u3002'), error)
continue
}
syncRecursively(targetJson, baseJson)
var sortedJson_1 = (0, sort_1.sortedObjectByKeys)(targetJson)
try {
fs.writeFileSync(filePath, JSON.stringify(sortedJson_1, null, 2) + '\n', 'utf-8')
console.log(
'\u6587\u4EF6 '.concat(
file,
' \u5DF2\u6392\u5E8F\u5E76\u540C\u6B65\u66F4\u65B0\u4E3A\u4E3B\u6A21\u677F\u7684\u5185\u5BB9'
)
)
} catch (error) {
console.error('\u5199\u5165 '.concat(file, ' \u51FA\u9519\u3002').concat(error))
}
}
}
syncTranslations()

143
scripts/sync-i18n.ts Normal file
View File

@ -0,0 +1,143 @@
import * as fs from 'fs'
import * as path from 'path'
import { sortedObjectByKeys } from './sort'
const translationsDir = path.join(__dirname, '../src/renderer/src/i18n/locales')
const baseLocale = 'zh-cn'
const baseFileName = `${baseLocale}.json`
const baseFilePath = path.join(translationsDir, baseFileName)
type I18NValue = string | { [key: string]: I18NValue }
type I18N = { [key: string]: I18NValue }
/**
* target 使 template
* 1. template target key'[to be translated]'
* 2. target template key
* 3.
*
* @param target
* @param template
* @returns target
*/
function syncRecursively(target: I18N, template: I18N): void {
// 添加 template 中存在但 target 中缺少的 key
for (const key in template) {
if (!(key in target)) {
target[key] =
typeof template[key] === 'object' && template[key] !== null ? {} : `[to be translated]:${template[key]}`
console.log(`添加新属性:${key}`)
}
if (typeof template[key] === 'object' && template[key] !== null) {
if (typeof target[key] !== 'object' || target[key] === null) {
target[key] = {}
}
// 递归同步子对象
syncRecursively(target[key], template[key])
}
}
// 删除 target 中存在但 template 中没有的 key
for (const targetKey in target) {
if (!(targetKey in template)) {
console.log(`移除多余属性:${targetKey}`)
delete target[targetKey]
}
}
}
/**
* JSON
* @param obj
* @returns
*/
function checkDuplicateKeys(obj: I18N): string[] {
const keys = new Set<string>()
const duplicateKeys: string[] = []
const checkObject = (obj: I18N, path: string = '') => {
for (const key in obj) {
const fullPath = path ? `${path}.${key}` : key
if (keys.has(fullPath)) {
// 发现重复键时,添加到数组中(避免重复添加)
if (!duplicateKeys.includes(fullPath)) {
duplicateKeys.push(fullPath)
}
} else {
keys.add(fullPath)
}
// 递归检查子对象
if (typeof obj[key] === 'object' && obj[key] !== null) {
checkObject(obj[key], fullPath)
}
}
}
checkObject(obj)
return duplicateKeys
}
function syncTranslations() {
if (!fs.existsSync(baseFilePath)) {
console.error(`主模板文件 ${baseFileName} 不存在,请检查路径或文件名`)
return
}
const baseContent = fs.readFileSync(baseFilePath, 'utf-8')
let baseJson: I18N = {}
try {
baseJson = JSON.parse(baseContent)
} catch (error) {
console.error(`解析 ${baseFileName} 出错。${error}`)
return
}
// 检查主模板是否存在重复键
const duplicateKeys = checkDuplicateKeys(baseJson)
if (duplicateKeys.length > 0) {
throw new Error(`主模板文件 ${baseFileName} 存在以下重复键:\n${duplicateKeys.join('\n')}`)
}
// 为主模板排序
const sortedJson = sortedObjectByKeys(baseJson)
if (JSON.stringify(baseJson) !== JSON.stringify(sortedJson)) {
try {
fs.writeFileSync(baseFilePath, JSON.stringify(sortedJson, null, 2) + '\n', 'utf-8')
console.log(`主模板已排序`)
} catch (error) {
console.error(`写入 ${baseFilePath} 出错。`, error)
return
}
}
const files = fs.readdirSync(translationsDir).filter((file) => file.endsWith('.json') && file !== baseFileName)
// 同步键
for (const file of files) {
const filePath = path.join(translationsDir, file)
let targetJson: I18N = {}
try {
const fileContent = fs.readFileSync(filePath, 'utf-8')
targetJson = JSON.parse(fileContent)
} catch (error) {
console.error(`解析 ${file} 出错,跳过此文件。`, error)
continue
}
syncRecursively(targetJson, baseJson)
const sortedJson = sortedObjectByKeys(targetJson)
try {
fs.writeFileSync(filePath, JSON.stringify(sortedJson, null, 2) + '\n', 'utf-8')
console.log(`文件 ${file} 已排序并同步更新为主模板的内容`)
} catch (error) {
console.error(`写入 ${file} 出错。${error}`)
}
}
}
syncTranslations()

View File

@ -204,6 +204,7 @@
"input.upload": "Upload image or document file",
"input.upload.document": "Upload document file (model does not support images)",
"input.upload.upload_from_local": "Upload local file...",
"input.url_context": "URL Context",
"input.web_search": "Web Search",
"input.web_search.builtin": "Model Built-in",
"input.web_search.builtin.disabled_content": "The current model does not support web search",
@ -211,7 +212,6 @@
"input.web_search.button.ok": "Go to Settings",
"input.web_search.enable": "Enable web search",
"input.web_search.enable_content": "Need to check web search connectivity in settings first",
"input.url_context": "URL Context",
"input.web_search.no_web_search": "Disable Web Search",
"input.web_search.no_web_search.description": "Do not enable web search",
"input.web_search.settings": "Web Search Settings",
@ -237,32 +237,32 @@
"save": "Save",
"save.file.title": "Save to Local File",
"save.knowledge": {
"title": "Save to Knowledge Base",
"content.maintext.title": "Main Text",
"content.maintext.description": "Includes primary text content",
"content.code.title": "Code Blocks",
"content.code.description": "Includes standalone code blocks",
"content.thinking.title": "Reasoning",
"content.thinking.description": "Includes model reasoning content",
"content.tool_use.title": "Tool Usage",
"content.tool_use.description": "Includes tool call parameters and execution results",
"content.citation.title": "Citations",
"content.citation.description": "Includes web search and knowledge base reference information",
"content.translation.title": "Translations",
"content.translation.description": "Includes translation content",
"content.error.title": "Errors",
"content.citation.title": "Citations",
"content.code.description": "Includes standalone code blocks",
"content.code.title": "Code Blocks",
"content.error.description": "Includes error messages during execution",
"content.file.title": "Files",
"content.error.title": "Errors",
"content.file.description": "Includes attached files",
"content.file.title": "Files",
"content.maintext.description": "Includes primary text content",
"content.maintext.title": "Main Text",
"content.thinking.description": "Includes model reasoning content",
"content.thinking.title": "Reasoning",
"content.tool_use.description": "Includes tool call parameters and execution results",
"content.tool_use.title": "Tool Usage",
"content.translation.description": "Includes translation content",
"content.translation.title": "Translations",
"empty.no_content": "This message has no saveable content",
"empty.no_knowledge_base": "No knowledge bases available, please create one first",
"error.save_failed": "Save failed, please check knowledge base configuration",
"error.invalid_base": "Selected knowledge base is not properly configured",
"error.no_content_selected": "Please select at least one content type",
"select.base.title": "Select Knowledge Base",
"error.save_failed": "Save failed, please check knowledge base configuration",
"select.base.placeholder": "Please select a knowledge base",
"select.base.title": "Select Knowledge Base",
"select.content.tip": "Selected {{count}} items, text types will be merged and saved as one note",
"select.content.title": "Select content types to save",
"select.content.tip": "Selected {{count}} items, text types will be merged and saved as one note"
"title": "Save to Knowledge Base"
},
"settings.code.title": "Code Block Settings",
"settings.code_collapsible": "Code block collapsible",
@ -361,12 +361,6 @@
"topics.unpinned": "Unpinned Topics",
"translate": "Translate"
},
"html_artifacts": {
"code": "Code",
"generating": "Generating",
"preview": "Preview",
"split": "Split"
},
"code_block": {
"collapse": "Collapse",
"copy": "Copy",
@ -428,6 +422,7 @@
"footnote": "Reference content",
"footnotes": "References",
"fullscreen": "Entered fullscreen mode. Press F11 to exit",
"i_know": "I know",
"inspect": "Inspect",
"knowledge_base": "Knowledge Base",
"language": "Language",
@ -461,8 +456,7 @@
"swap": "Swap",
"topics": "Topics",
"warning": "Warning",
"you": "You",
"i_know": "I know"
"you": "You"
},
"docs": {
"title": "Docs"
@ -545,6 +539,12 @@
"search.topics.empty": "No topics found, press Enter to search all messages",
"title": "Topics Search"
},
"html_artifacts": {
"code": "Code",
"generating": "Generating",
"preview": "Preview",
"split": "Split"
},
"knowledge": {
"add": {
"title": "Add Knowledge Base"
@ -661,6 +661,112 @@
"keep_alive_time.title": "Keep Alive Time",
"title": "LM Studio"
},
"memory": {
"actions": "Actions",
"add_failed": "Failed to add memory",
"add_first_memory": "Add Your First Memory",
"add_memory": "Add Memory",
"add_new_user": "Add New User",
"add_success": "Memory added successfully",
"add_user": "Add User",
"add_user_failed": "Failed to add user",
"all_users": "All Users",
"cannot_delete_default_user": "Cannot delete the default user",
"configure_memory_first": "Please configure memory settings first",
"content": "Content",
"current_user": "Current User",
"custom": "Custom",
"default": "Default",
"default_user": "Default User",
"delete_confirm": "Are you sure you want to delete this memory?",
"delete_confirm_content": "Are you sure you want to delete {{count}} memories?",
"delete_confirm_single": "Are you sure you want to delete this memory?",
"delete_confirm_title": "Delete Memories",
"delete_failed": "Failed to delete memory",
"delete_selected": "Delete Selected",
"delete_success": "Memory deleted successfully",
"delete_user": "Delete User",
"delete_user_confirm_content": "Are you sure you want to delete user {{user}} and all their memories?",
"delete_user_confirm_title": "Delete User",
"delete_user_failed": "Failed to delete user",
"description": "Memory allows you to store and manage information about your interactions with the assistant. You can add, edit, and delete memories, as well as filter and search through them.",
"edit_memory": "Edit Memory",
"embedding_dimensions": "Embedding Dimensions",
"embedding_model": "Embedding Model",
"enable_global_memory_first": "Please enable global memory first",
"end_date": "End Date",
"global_memory": "Global Memory",
"global_memory_description": "To use memory features, please enable global memory in assistant settings.",
"global_memory_disabled_desc": "To use memory features, please enable global memory in assistant settings first.",
"global_memory_disabled_title": "Global Memory Disabled",
"global_memory_enabled": "Global memory enabled",
"go_to_memory_page": "Go to Memory Page",
"initial_memory_content": "Welcome! This is your first memory.",
"llm_model": "LLM Model",
"load_failed": "Failed to load memories",
"loading": "Loading memories...",
"loading_memories": "Loading memories...",
"memories_description": "Showing {{count}} of {{total}} memories",
"memories_reset_success": "All memories for {{user}} have been reset successfully",
"memory": "memory",
"memory_content": "Memory Content",
"memory_placeholder": "Enter memory content...",
"new_user_id": "New User ID",
"new_user_id_placeholder": "Enter a unique user ID",
"no_matching_memories": "No matching memories found",
"no_memories": "No memories yet",
"no_memories_description": "Start by adding your first memory to get started",
"not_configured_desc": "Please configure embedding and LLM models in memory settings to enable memory functionality.",
"not_configured_title": "Memory Not Configured",
"pagination_total": "{{start}}-{{end}} of {{total}} items",
"please_enter_memory": "Please enter memory content",
"please_select_embedding_model": "Please select an embedding model",
"please_select_llm_model": "Please select an LLM model",
"reset_filters": "Reset Filters",
"reset_memories": "Reset Memories",
"reset_memories_confirm_content": "Are you sure you want to permanently delete all memories for {{user}}? This action cannot be undone.",
"reset_memories_confirm_title": "Reset All Memories",
"reset_memories_failed": "Failed to reset memories",
"reset_user_memories": "Reset User Memories",
"reset_user_memories_confirm_content": "Are you sure you want to reset all memories for {{user}}?",
"reset_user_memories_confirm_title": "Reset User Memories",
"reset_user_memories_failed": "Failed to reset user memories",
"score": "Score",
"search": "Search",
"search_placeholder": "Search memories...",
"select_embedding_model_placeholder": "Select Embedding Model",
"select_llm_model_placeholder": "Select LLM Model",
"select_user": "Select User",
"settings": "Settings",
"settings_title": "Memory Settings",
"start_date": "Start Date",
"statistics": "Statistics",
"stored_memories": "Stored Memories",
"switch_user": "Switch User",
"switch_user_confirm": "Switch user context to {{user}}?",
"time": "Time",
"title": "Memories",
"total_memories": "total memories",
"try_different_filters": "Try adjusting your search criteria",
"update_failed": "Failed to update memory",
"update_success": "Memory updated successfully",
"user": "User",
"user_created": "User {{user}} created and switched successfully",
"user_deleted": "User {{user}} deleted successfully",
"user_id": "User ID",
"user_id_exists": "This user ID already exists",
"user_id_invalid_chars": "User ID can only contain letters, numbers, hyphens and underscores",
"user_id_placeholder": "Enter user ID (optional)",
"user_id_required": "User ID is required",
"user_id_reserved": "'default-user' is reserved, please use a different ID",
"user_id_rules": "User ID must be unique and contain only letters, numbers, hyphens (-) and underscores (_)",
"user_id_too_long": "User ID cannot exceed 50 characters",
"user_management": "User Management",
"user_memories_reset": "All memories for {{user}} have been reset",
"user_switch_failed": "Failed to switch user",
"user_switched": "User context switched to {{user}}",
"users": "users"
},
"message": {
"agents": {
"import.error": "Import failed",
@ -753,13 +859,13 @@
"tools": {
"abort_failed": "Tool call abort failed",
"aborted": "Tool call aborted",
"autoApproveEnabled": "Auto-approve enabled for this tool",
"cancelled": "Cancelled",
"completed": "Completed",
"error": "Error occurred",
"invoking": "Invoking",
"pending": "Pending",
"preview": "Preview",
"autoApproveEnabled": "Auto-approve enabled for this tool",
"raw": "Raw"
},
"topic.added": "New topic added",
@ -785,9 +891,9 @@
"goBack": "Go Back",
"goForward": "Go Forward",
"minimize": "Minimize MinApp",
"openExternal": "Open in Browser",
"open_link_external_off": "Current: Open links in default window",
"open_link_external_on": "Current: Open links in browser",
"openExternal": "Open in Browser",
"refresh": "Refresh",
"rightclick_copyurl": "Right-click to copy URL"
},
@ -1323,9 +1429,9 @@
},
"settings": {
"about": "About & Feedback",
"about.checkingUpdate": "Checking for updates...",
"about.checkUpdate": "Check Update",
"about.checkUpdate.available": "Update",
"about.checkingUpdate": "Checking for updates...",
"about.contact.button": "Email",
"about.contact.title": "Contact",
"about.debug.open": "Open",
@ -1653,6 +1759,10 @@
"backup.manager.title": "Backup Data Management",
"backup.modal.filename.placeholder": "Please enter backup filename",
"backup.modal.title": "Backup to WebDAV",
"disableStream": {
"help": "When enabled, loads the file into memory before uploading. This can solve incompatibility issues with some WebDAV servers that do not support chunked uploads, but it will increase memory usage.",
"title": "Disable Stream Upload"
},
"host": "WebDAV Host",
"host.placeholder": "http://localhost:8080",
"hour_interval_one": "{{count}} hour",
@ -1673,11 +1783,7 @@
"syncError": "Backup Error",
"syncStatus": "Backup Status",
"title": "WebDAV",
"user": "WebDAV User",
"disableStream": {
"title": "Disable Stream Upload",
"help": "When enabled, loads the file into memory before uploading. This can solve incompatibility issues with some WebDAV servers that do not support chunked uploads, but it will increase memory usage."
}
"user": "WebDAV User"
},
"yuque": {
"check": {
@ -1764,23 +1870,24 @@
"addServer.create": "Quick Create",
"addServer.importFrom": "Import from JSON",
"addServer.importFrom.connectionFailed": "Connection failed",
"addServer.importFrom.invalid": "Invalid input, please check JSON format",
"addServer.importFrom.nameExists": "Server already exists: {{name}}",
"addServer.importFrom.oneServer": "Only one MCP server configuration at a time",
"addServer.importFrom.method": "Import Method",
"addServer.importFrom.dxt": "Import DXT Package",
"addServer.importFrom.dxtFile": "DXT Package File",
"addServer.importFrom.dxtHelp": "Select a .dxt file containing an MCP server package",
"addServer.importFrom.selectDxtFile": "Select DXT File",
"addServer.importFrom.noDxtFile": "Please select a DXT file",
"addServer.importFrom.dxtProcessFailed": "Failed to process DXT file",
"addServer.importFrom.dxt": "Import DXT Package",
"addServer.importFrom.invalid": "Invalid input, please check JSON format",
"addServer.importFrom.method": "Import Method",
"addServer.importFrom.nameExists": "Server already exists: {{name}}",
"addServer.importFrom.noDxtFile": "Please select a DXT file",
"addServer.importFrom.oneServer": "Only one MCP server configuration at a time",
"addServer.importFrom.placeholder": "Paste MCP server JSON config",
"addServer.importFrom.selectDxtFile": "Select DXT File",
"addServer.importFrom.tooltip": "Please copy the configuration JSON (prioritizing\n NPX or UVX configurations) from the MCP Servers introduction page and paste it into the input box.",
"addSuccess": "Server added successfully",
"advancedSettings": "Advanced Settings",
"args": "Arguments",
"argsTooltip": "Each argument on a new line",
"baseUrlTooltip": "Remote server base URL",
"builtinServers": "Builtin Servers",
"command": "Command",
"config_description": "Configure Model Context Protocol servers",
"customRegistryPlaceholder": "Enter private registry URL, e.g.: https://npm.company.com",
@ -1817,6 +1924,17 @@
"jsonSaveSuccess": "JSON configuration has been saved.",
"logoUrl": "Logo URL",
"missingDependencies": "is Missing, please install it to continue.",
"more": {
"awesome": "Curated MCP Server List",
"composio": "Composio MCP Development Tools",
"glama": "Glama MCP Server Directory",
"higress": "Higress MCP Server",
"mcpso": "MCP Server Discovery Platform",
"modelscope": "ModelScope Community MCP Server",
"official": "Official MCP Server Collection",
"pulsemcp": "Pulse MCP Server",
"smithery": "Smithery MCP Tools"
},
"name": "Name",
"newServer": "MCP Server",
"noDescriptionAvailable": "No description available",
@ -1849,6 +1967,7 @@
"registry": "Package Registry",
"registryDefault": "Default",
"registryTooltip": "Choose the registry for package installation to resolve network issues with the default registry.",
"requiresConfig": "Requires Configuration",
"resources": {
"availableResources": "Available Resources",
"blob": "Blob",
@ -1896,17 +2015,17 @@
"timeoutTooltip": "Timeout in seconds for requests to this server, default is 60 seconds",
"title": "MCP Settings",
"tools": {
"autoApprove": "Auto Approve",
"autoApprove.tooltip.confirm": "Are you sure you want to run this MCP tool?",
"autoApprove.tooltip.disabled": "Tool will require manual approval before running",
"autoApprove.tooltip.enabled": "Tool will run automatically without confirmation",
"autoApprove.tooltip.howToEnable": "Enable the tool first to use auto-approve",
"availableTools": "Available Tools",
"enable": "Enable Tool",
"inputSchema": "Input Schema",
"inputSchema.enum.allowedValues": "Allowed Values",
"loadError": "Get tools Error",
"noToolsAvailable": "No tools available",
"enable": "Enable Tool",
"autoApprove": "Auto Approve",
"autoApprove.tooltip.howToEnable": "Enable the tool first to use auto-approve",
"autoApprove.tooltip.enabled": "Tool will run automatically without confirmation",
"autoApprove.tooltip.disabled": "Tool will require manual approval before running",
"autoApprove.tooltip.confirm": "Are you sure you want to run this MCP tool?",
"run": "Run"
},
"type": "Type",
@ -1919,20 +2038,7 @@
"updateError": "Failed to update server",
"updateSuccess": "Server updated successfully",
"url": "URL",
"user": "User",
"requiresConfig": "Requires Configuration",
"builtinServers": "Builtin Servers",
"more": {
"modelscope": "ModelScope Community MCP Server",
"higress": "Higress MCP Server",
"mcpso": "MCP Server Discovery Platform",
"smithery": "Smithery MCP Tools",
"glama": "Glama MCP Server Directory",
"pulsemcp": "Pulse MCP Server",
"composio": "Composio MCP Development Tools",
"official": "Official MCP Server Collection",
"awesome": "Curated MCP Server List"
}
"user": "User"
},
"messages.divider": "Show divider between messages",
"messages.divider.tooltip": "Not applicable to bubble-style message",
@ -2226,13 +2332,13 @@
}
},
"proxy": {
"address": "Proxy Address",
"mode": {
"custom": "Custom Proxy",
"none": "No Proxy",
"system": "System Proxy",
"title": "Proxy Mode"
},
"address": "Proxy Address"
}
},
"quickAssistant": {
"click_tray_to_show": "Click the tray icon to start",
@ -2455,115 +2561,9 @@
},
"words": {
"knowledgeGraph": "Knowledge Graph",
"quit": "Quit",
"quit": "[to be translated]:退出",
"show_window": "Show Window",
"visualization": "Visualization"
},
"memory": {
"title": "Memories",
"actions": "Actions",
"description": "Memory allows you to store and manage information about your interactions with the assistant. You can add, edit, and delete memories, as well as filter and search through them.",
"add_memory": "Add Memory",
"edit_memory": "Edit Memory",
"memory_content": "Memory Content",
"please_enter_memory": "Please enter memory content",
"memory_placeholder": "Enter memory content...",
"user_id": "User ID",
"user_id_placeholder": "Enter user ID (optional)",
"load_failed": "Failed to load memories",
"add_success": "Memory added successfully",
"add_failed": "Failed to add memory",
"update_success": "Memory updated successfully",
"update_failed": "Failed to update memory",
"delete_success": "Memory deleted successfully",
"delete_failed": "Failed to delete memory",
"delete_confirm_title": "Delete Memories",
"delete_confirm_content": "Are you sure you want to delete {{count}} memories?",
"delete_confirm": "Are you sure you want to delete this memory?",
"time": "Time",
"user": "User",
"content": "Content",
"score": "Score",
"memories_description": "Showing {{count}} of {{total}} memories",
"search_placeholder": "Search memories...",
"start_date": "Start Date",
"end_date": "End Date",
"all_users": "All Users",
"users": "users",
"delete_selected": "Delete Selected",
"reset_filters": "Reset Filters",
"pagination_total": "{{start}}-{{end}} of {{total}} items",
"current_user": "Current User",
"select_user": "Select User",
"default_user": "Default User",
"switch_user": "Switch User",
"user_switched": "User context switched to {{user}}",
"switch_user_confirm": "Switch user context to {{user}}?",
"add_user": "Add User",
"add_new_user": "Add New User",
"new_user_id": "New User ID",
"new_user_id_placeholder": "Enter a unique user ID",
"user_id_required": "User ID is required",
"user_id_reserved": "'default-user' is reserved, please use a different ID",
"user_id_exists": "This user ID already exists",
"user_id_too_long": "User ID cannot exceed 50 characters",
"user_id_invalid_chars": "User ID can only contain letters, numbers, hyphens and underscores",
"user_id_rules": "User ID must be unique and contain only letters, numbers, hyphens (-) and underscores (_)",
"user_created": "User {{user}} created and switched successfully",
"add_user_failed": "Failed to add user",
"memory": "memory",
"reset_user_memories": "Reset User Memories",
"reset_memories": "Reset Memories",
"delete_user": "Delete User",
"loading_memories": "Loading memories...",
"no_memories": "No memories yet",
"no_matching_memories": "No matching memories found",
"no_memories_description": "Start by adding your first memory to get started",
"try_different_filters": "Try adjusting your search criteria",
"add_first_memory": "Add Your First Memory",
"user_switch_failed": "Failed to switch user",
"cannot_delete_default_user": "Cannot delete the default user",
"delete_user_confirm_title": "Delete User",
"delete_user_confirm_content": "Are you sure you want to delete user {{user}} and all their memories?",
"user_deleted": "User {{user}} deleted successfully",
"delete_user_failed": "Failed to delete user",
"reset_user_memories_confirm_title": "Reset User Memories",
"reset_user_memories_confirm_content": "Are you sure you want to reset all memories for {{user}}?",
"user_memories_reset": "All memories for {{user}} have been reset",
"reset_user_memories_failed": "Failed to reset user memories",
"reset_memories_confirm_title": "Reset All Memories",
"reset_memories_confirm_content": "Are you sure you want to permanently delete all memories for {{user}}? This action cannot be undone.",
"memories_reset_success": "All memories for {{user}} have been reset successfully",
"reset_memories_failed": "Failed to reset memories",
"delete_confirm_single": "Are you sure you want to delete this memory?",
"total_memories": "total memories",
"default": "Default",
"custom": "Custom",
"global_memory_enabled": "Global memory enabled",
"global_memory": "Global Memory",
"enable_global_memory_first": "Please enable global memory first",
"configure_memory_first": "Please configure memory settings first",
"global_memory_disabled_title": "Global Memory Disabled",
"global_memory_disabled_desc": "To use memory features, please enable global memory in assistant settings first.",
"not_configured_title": "Memory Not Configured",
"not_configured_desc": "Please configure embedding and LLM models in memory settings to enable memory functionality.",
"go_to_memory_page": "Go to Memory Page",
"settings": "Settings",
"user_management": "User Management",
"statistics": "Statistics",
"search": "Search",
"initial_memory_content": "Welcome! This is your first memory.",
"loading": "Loading memories...",
"settings_title": "Memory Settings",
"llm_model": "LLM Model",
"please_select_llm_model": "Please select an LLM model",
"select_llm_model_placeholder": "Select LLM Model",
"embedding_model": "Embedding Model",
"please_select_embedding_model": "Please select an embedding model",
"select_embedding_model_placeholder": "Select Embedding Model",
"embedding_dimensions": "Embedding Dimensions",
"stored_memories": "Stored Memories",
"global_memory_description": "To use memory features, please enable global memory in assistant settings."
}
}
}

View File

@ -204,6 +204,7 @@
"input.upload": "画像またはドキュメントをアップロード",
"input.upload.document": "ドキュメントをアップロード(モデルは画像をサポートしません)",
"input.upload.upload_from_local": "ローカルファイルをアップロード...",
"input.url_context": "URLコンテキスト",
"input.web_search": "ウェブ検索",
"input.web_search.builtin": "モデル内蔵",
"input.web_search.builtin.disabled_content": "現在のモデルはウェブ検索をサポートしていません",
@ -214,7 +215,6 @@
"input.web_search.no_web_search": "ウェブ検索を無効にする",
"input.web_search.no_web_search.description": "ウェブ検索を無効にする",
"input.web_search.settings": "ウェブ検索設定",
"input.url_context": "URLコンテキスト",
"message.new.branch": "新しいブランチ",
"message.new.branch.created": "新しいブランチが作成されました",
"message.new.context": "新しいコンテキスト",
@ -235,33 +235,34 @@
},
"resend": "再送信",
"save": "保存",
"save.file.title": "ローカルファイルに保存",
"save.knowledge": {
"title": "ナレッジベースに保存",
"content.maintext.title": "メインテキスト",
"content.maintext.description": "主要なテキストコンテンツを含む",
"content.code.title": "コードブロック",
"content.code.description": "独立したコードブロックを含む",
"content.thinking.title": "思考プロセス",
"content.thinking.description": "モデルの推論内容を含む",
"content.tool_use.title": "ツール使用",
"content.tool_use.description": "ツール呼び出しパラメーターと実行結果を含む",
"content.citation.title": "引用",
"content.citation.description": "ウェブ検索とナレッジベース参照情報を含む",
"content.translation.title": "翻訳",
"content.translation.description": "翻訳コンテンツを含む",
"content.error.title": "エラー",
"content.citation.title": "引用",
"content.code.description": "独立したコードブロックを含む",
"content.code.title": "コードブロック",
"content.error.description": "実行中のエラーメッセージを含む",
"content.file.title": "ファイル",
"content.error.title": "エラー",
"content.file.description": "添付ファイルを含む",
"content.file.title": "ファイル",
"content.maintext.description": "主要なテキストコンテンツを含む",
"content.maintext.title": "メインテキスト",
"content.thinking.description": "モデルの推論内容を含む",
"content.thinking.title": "思考プロセス",
"content.tool_use.description": "ツール呼び出しパラメーターと実行結果を含む",
"content.tool_use.title": "ツール使用",
"content.translation.description": "翻訳コンテンツを含む",
"content.translation.title": "翻訳",
"empty.no_content": "このメッセージには保存可能なコンテンツがありません",
"empty.no_knowledge_base": "利用可能なナレッジベースがありません。まず作成してください",
"error.save_failed": "保存に失敗しました。ナレッジベースの設定を確認してください",
"error.invalid_base": "選択されたナレッジベースが正しく設定されていません",
"error.no_content_selected": "少なくとも1つのコンテンツタイプを選択してください",
"select.base.title": "ナレッジベースを選択",
"error.save_failed": "保存に失敗しました。ナレッジベースの設定を確認してください",
"select.base.placeholder": "ナレッジベースを選択してください",
"select.base.title": "ナレッジベースを選択",
"select.content.tip": "{{count}}項目が選択されました。テキストタイプは統合されて1つのートとして保存されます",
"select.content.title": "保存するコンテンツタイプを選択",
"select.content.tip": "{{count}}項目が選択されました。テキストタイプは統合されて1つのートとして保存されます"
"title": "ナレッジベースに保存"
},
"settings.code.title": "コード設定",
"settings.code_collapsible": "コードブロック折り畳み",
@ -358,14 +359,7 @@
"topics.prompt.tips": "トピック提示語:現在のトピックに対して追加の補足提示語を提供",
"topics.title": "トピック",
"topics.unpinned": "固定解除",
"translate": "翻訳",
"save.file.title": "ローカルファイルに保存"
},
"html_artifacts": {
"code": "コード",
"generating": "生成中",
"preview": "プレビュー",
"split": "分割"
"translate": "翻訳"
},
"code_block": {
"collapse": "折りたたむ",
@ -428,6 +422,7 @@
"footnote": "引用内容",
"footnotes": "脚注",
"fullscreen": "全画面モードに入りました。F11キーで終了します",
"i_know": "わかりました",
"inspect": "検査",
"knowledge_base": "ナレッジベース",
"language": "言語",
@ -461,8 +456,7 @@
"swap": "交換",
"topics": "トピック",
"warning": "警告",
"you": "あなた",
"i_know": "わかりました"
"you": "あなた"
},
"docs": {
"title": "ドキュメント"
@ -545,6 +539,12 @@
"search.topics.empty": "トピックが見つかりませんでした。Enterキーを押してすべてのメッセージを検索",
"title": "トピック検索"
},
"html_artifacts": {
"code": "コード",
"generating": "生成中",
"preview": "プレビュー",
"split": "分割"
},
"knowledge": {
"add": {
"title": "ナレッジベースを追加"
@ -661,6 +661,112 @@
"keep_alive_time.title": "保持時間",
"title": "LM Studio"
},
"memory": {
"actions": "アクション",
"add_failed": "メモリーの追加に失敗しました",
"add_first_memory": "最初のメモリを追加",
"add_memory": "メモリーを追加",
"add_new_user": "新しいユーザーを追加",
"add_success": "メモリーが正常に追加されました",
"add_user": "ユーザーを追加",
"add_user_failed": "ユーザーの追加に失敗しました",
"all_users": "すべてのユーザー",
"cannot_delete_default_user": "デフォルトユーザーは削除できません",
"configure_memory_first": "最初にメモリ設定を構成してください",
"content": "内容",
"current_user": "現在のユーザー",
"custom": "カスタム",
"default": "デフォルト",
"default_user": "デフォルトユーザー",
"delete_confirm": "このメモリーを削除してもよろしいですか?",
"delete_confirm_content": "{{count}}件のメモリーを削除してもよろしいですか?",
"delete_confirm_single": "このメモリを削除してもよろしいですか?",
"delete_confirm_title": "メモリーを削除",
"delete_failed": "メモリーの削除に失敗しました",
"delete_selected": "選択したものを削除",
"delete_success": "メモリーが正常に削除されました",
"delete_user": "ユーザーを削除",
"delete_user_confirm_content": "ユーザー{{user}}とそのすべてのメモリを削除してもよろしいですか?",
"delete_user_confirm_title": "ユーザーを削除",
"delete_user_failed": "ユーザーの削除に失敗しました",
"description": "メモリは、アシスタントとのやりとりに関する情報を保存・管理する機能です。メモリの追加、編集、削除のほか、フィルタリングや検索を行うことができます。",
"edit_memory": "メモリーを編集",
"embedding_dimensions": "埋め込み次元",
"embedding_model": "埋め込みモデル",
"enable_global_memory_first": "最初にグローバルメモリを有効にしてください",
"end_date": "終了日",
"global_memory": "グローバルメモリ",
"global_memory_description": "メモリ機能を使用するには、アシスタント設定でグローバルメモリを有効にしてください。",
"global_memory_disabled_desc": "メモリ機能を使用するには、まずアシスタント設定でグローバルメモリを有効にしてください。",
"global_memory_disabled_title": "グローバルメモリが無効です",
"global_memory_enabled": "グローバルメモリが有効化されました",
"go_to_memory_page": "メモリページに移動",
"initial_memory_content": "ようこそ!これはあなたの最初の記憶です。",
"llm_model": "LLMモデル",
"load_failed": "メモリーの読み込みに失敗しました",
"loading": "思い出を読み込み中...",
"loading_memories": "メモリを読み込み中...",
"memories_description": "{{total}}件中{{count}}件のメモリーを表示",
"memories_reset_success": "{{user}}のすべてのメモリが正常にリセットされました",
"memory": "個のメモリ",
"memory_content": "メモリー内容",
"memory_placeholder": "メモリー内容を入力...",
"new_user_id": "新しいユーザーID",
"new_user_id_placeholder": "一意のユーザーIDを入力",
"no_matching_memories": "一致するメモリが見つかりません",
"no_memories": "メモリがありません",
"no_memories_description": "最初のメモリを追加してください",
"not_configured_desc": "メモリ機能を有効にするには、メモリ設定で埋め込みとLLMモデルを設定してください。",
"not_configured_title": "メモリが設定されていません",
"pagination_total": "{{total}}件中{{start}}-{{end}}件",
"please_enter_memory": "メモリー内容を入力してください",
"please_select_embedding_model": "埋め込みモデルを選択してください",
"please_select_llm_model": "LLMモデルを選択してください",
"reset_filters": "フィルターをリセット",
"reset_memories": "メモリをリセット",
"reset_memories_confirm_content": "{{user}}のすべてのメモリを完全に削除してもよろしいですか?この操作は元に戻せません。",
"reset_memories_confirm_title": "すべてのメモリをリセット",
"reset_memories_failed": "メモリのリセットに失敗しました",
"reset_user_memories": "ユーザーメモリをリセット",
"reset_user_memories_confirm_content": "{{user}}のすべてのメモリをリセットしてもよろしいですか?",
"reset_user_memories_confirm_title": "ユーザーメモリをリセット",
"reset_user_memories_failed": "ユーザーメモリのリセットに失敗しました",
"score": "スコア",
"search": "検索",
"search_placeholder": "メモリーを検索...",
"select_embedding_model_placeholder": "埋め込みモデルを選択",
"select_llm_model_placeholder": "LLMモデルを選択",
"select_user": "ユーザーを選択",
"settings": "設定",
"settings_title": "メモリ設定",
"start_date": "開始日",
"statistics": "統計",
"stored_memories": "保存された記憶",
"switch_user": "ユーザーを切り替え",
"switch_user_confirm": "ユーザーコンテキストを{{user}}に切り替えますか?",
"time": "時間",
"title": "グローバルメモリ",
"total_memories": "個のメモリ",
"try_different_filters": "検索条件を調整してください",
"update_failed": "メモリーの更新に失敗しました",
"update_success": "メモリーが正常に更新されました",
"user": "ユーザー",
"user_created": "ユーザー{{user}}が作成され、切り替えが成功しました",
"user_deleted": "ユーザー{{user}}が正常に削除されました",
"user_id": "ユーザーID",
"user_id_exists": "このユーザーIDはすでに存在します",
"user_id_invalid_chars": "ユーザーIDには文字、数字、ハイフン、アンダースコアのみ使用できます",
"user_id_placeholder": "ユーザーIDを入力オプション",
"user_id_required": "ユーザーIDは必須です",
"user_id_reserved": "'default-user'は予約済みです。別のIDを使用してください",
"user_id_rules": "ユーザーIDは一意であり、文字、数字、ハイフン(-)、アンダースコア(_)のみ含む必要があります",
"user_id_too_long": "ユーザーIDは50文字を超えられません",
"user_management": "ユーザー管理",
"user_memories_reset": "{{user}}のすべてのメモリがリセットされました",
"user_switch_failed": "ユーザーの切り替えに失敗しました",
"user_switched": "ユーザーコンテキストが{{user}}に切り替わりました",
"users": "ユーザー"
},
"message": {
"agents": {
"import.error": "インポートに失敗しました",
@ -753,13 +859,13 @@
"tools": {
"abort_failed": "ツール呼び出し中断失敗",
"aborted": "ツール呼び出し中断",
"autoApproveEnabled": "このツールは自動承認が有効になっています",
"cancelled": "キャンセル",
"completed": "完了",
"error": "エラーが発生しました",
"invoking": "呼び出し中",
"pending": "保留中",
"preview": "プレビュー",
"autoApproveEnabled": "このツールは自動承認が有効になっています",
"raw": "生データ"
},
"topic.added": "新しいトピックが追加されました",
@ -785,9 +891,9 @@
"goBack": "戻る",
"goForward": "進む",
"minimize": "ミニアプリを最小化",
"openExternal": "ブラウザで開く",
"open_link_external_off": "現在:デフォルトのウィンドウで開く",
"open_link_external_on": "現在:ブラウザで開く",
"openExternal": "ブラウザで開く",
"refresh": "更新",
"rightclick_copyurl": "右クリックでURLをコピー"
},
@ -1323,9 +1429,9 @@
},
"settings": {
"about": "について",
"about.checkingUpdate": "更新を確認中...",
"about.checkUpdate": "更新を確認",
"about.checkUpdate.available": "今すぐ更新",
"about.checkingUpdate": "更新を確認中...",
"about.contact.button": "メール",
"about.contact.title": "連絡先",
"about.debug.open": "開く",
@ -1653,6 +1759,10 @@
"backup.manager.title": "バックアップデータ管理",
"backup.modal.filename.placeholder": "バックアップファイル名を入力してください",
"backup.modal.title": "WebDAV にバックアップ",
"disableStream": {
"help": "有効にすると、アップロード前にファイルがメモリに読み込まれます。これにより、チャンクアップロードをサポートしていない一部のWebDAVサーバーとの互換性の問題を解決できますが、メモリ使用量が増加します。",
"title": "ストリーミングアップロードを無効にする"
},
"host": "WebDAVホスト",
"host.placeholder": "http://localhost:8080",
"hour_interval_one": "{{count}} 時間",
@ -1673,11 +1783,7 @@
"syncError": "バックアップエラー",
"syncStatus": "バックアップ状態",
"title": "WebDAV",
"user": "WebDAVユーザー",
"disableStream": {
"title": "ストリーミングアップロードを無効にする",
"help": "有効にすると、アップロード前にファイルがメモリに読み込まれます。これにより、チャンクアップロードをサポートしていない一部のWebDAVサーバーとの互換性の問題を解決できますが、メモリ使用量が増加します。"
}
"user": "WebDAVユーザー"
},
"yuque": {
"check": {
@ -1764,23 +1870,24 @@
"addServer.create": "クイック作成",
"addServer.importFrom": "JSONからインポート",
"addServer.importFrom.connectionFailed": "接続に失敗しました",
"addServer.importFrom.invalid": "無効な入力です。JSON形式を確認してください。",
"addServer.importFrom.nameExists": "サーバーはすでに存在します: {{name}}",
"addServer.importFrom.oneServer": "一度に1つのMCPサーバー設定のみを保存できます",
"addServer.importFrom.method": "インポート方法",
"addServer.importFrom.dxt": "DXTパッケージをインポート",
"addServer.importFrom.dxtFile": "DXTパッケージファイル",
"addServer.importFrom.dxtHelp": "MCPサーバーパッケージを含む.dxtファイルを選択",
"addServer.importFrom.selectDxtFile": "DXTファイルを選択",
"addServer.importFrom.noDxtFile": "DXTファイルを選択してください",
"addServer.importFrom.dxtProcessFailed": "DXTファイルの処理に失敗しました",
"addServer.importFrom.dxt": "DXTパッケージをインポート",
"addServer.importFrom.invalid": "無効な入力です。JSON形式を確認してください。",
"addServer.importFrom.method": "インポート方法",
"addServer.importFrom.nameExists": "サーバーはすでに存在します: {{name}}",
"addServer.importFrom.noDxtFile": "DXTファイルを選択してください",
"addServer.importFrom.oneServer": "一度に1つのMCPサーバー設定のみを保存できます",
"addServer.importFrom.placeholder": "MCPサーバーJSON設定を貼り付け",
"addServer.importFrom.selectDxtFile": "[to be translated]:选择 DXT 文件",
"addServer.importFrom.tooltip": "MCPサーバー紹介ページから設定JSONNPXまたはUVX設定を優先をコピーし、入力ボックスに貼り付けてください。",
"addSuccess": "サーバーが正常に追加されました",
"advancedSettings": "詳細設定",
"args": "引数",
"argsTooltip": "1行に1つの引数を入力してください",
"baseUrlTooltip": "リモートURLアドレス",
"builtinServers": "組み込みサーバー",
"command": "コマンド",
"config_description": "モデルコンテキストプロトコルサーバーの設定",
"customRegistryPlaceholder": "プライベート倉庫のアドレスを入力してくださいhttps://npm.company.com",
@ -1817,6 +1924,17 @@
"jsonSaveSuccess": "JSON設定が保存されました。",
"logoUrl": "ロゴURL",
"missingDependencies": "が不足しています。続行するにはインストールしてください。",
"more": {
"awesome": "厳選された MCP サーバーリスト",
"composio": "Composio MCP 開発ツール",
"glama": "Glama MCP サーバーディレクトリ",
"higress": "Higress MCP サーバー",
"mcpso": "MCP サーバー発見プラットフォーム",
"modelscope": "魔搭コミュニティ MCP サーバー",
"official": "公式 MCP サーバーコレクション",
"pulsemcp": "Pulse MCP サーバー",
"smithery": "Smithery MCP ツール"
},
"name": "名前",
"newServer": "MCP サーバー",
"noDescriptionAvailable": "説明がありません",
@ -1849,6 +1967,7 @@
"registry": "パッケージ管理レジストリ",
"registryDefault": "デフォルト",
"registryTooltip": "デフォルトのレジストリでネットワークの問題が発生した場合、パッケージインストールに使用するレジストリを選択してください。",
"requiresConfig": "設定が必要",
"resources": {
"availableResources": "利用可能なリソース",
"blob": "バイナリデータ",
@ -1896,17 +2015,17 @@
"timeoutTooltip": "このサーバーへのリクエストのタイムアウト時間、デフォルトは60秒です",
"title": "MCP 設定",
"tools": {
"autoApprove": "自動承認",
"autoApprove.tooltip.confirm": "このMCPツールを実行してもよろしいですか",
"autoApprove.tooltip.disabled": "ツールは実行前に手動承認が必要です",
"autoApprove.tooltip.enabled": "ツールは承認なしで自動実行されます",
"autoApprove.tooltip.howToEnable": "ツールを有効にしてから自動承認を使用できます",
"availableTools": "利用可能なツール",
"enable": "ツールを有効にする",
"inputSchema": "入力スキーマ",
"inputSchema.enum.allowedValues": "許可された値",
"loadError": "ツール取得エラー",
"noToolsAvailable": "利用可能なツールなし",
"enable": "ツールを有効にする",
"autoApprove": "自動承認",
"autoApprove.tooltip.howToEnable": "ツールを有効にしてから自動承認を使用できます",
"autoApprove.tooltip.enabled": "ツールは承認なしで自動実行されます",
"autoApprove.tooltip.disabled": "ツールは実行前に手動承認が必要です",
"autoApprove.tooltip.confirm": "このMCPツールを実行してもよろしいですか",
"run": "実行"
},
"type": "タイプ",
@ -1919,20 +2038,7 @@
"updateError": "サーバーの更新に失敗しました",
"updateSuccess": "サーバーが正常に更新されました",
"url": "URL",
"user": "ユーザー",
"requiresConfig": "設定が必要",
"builtinServers": "組み込みサーバー",
"more": {
"modelscope": "魔搭コミュニティ MCP サーバー",
"higress": "Higress MCP サーバー",
"mcpso": "MCP サーバー発見プラットフォーム",
"smithery": "Smithery MCP ツール",
"glama": "Glama MCP サーバーディレクトリ",
"pulsemcp": "Pulse MCP サーバー",
"composio": "Composio MCP 開発ツール",
"official": "公式 MCP サーバーコレクション",
"awesome": "厳選された MCP サーバーリスト"
}
"user": "ユーザー"
},
"messages.divider": "メッセージ間に区切り線を表示",
"messages.divider.tooltip": "バブルスタイルのメッセージには適用されません",
@ -2126,6 +2232,7 @@
"api_key": "APIキー",
"api_key.tip": "複数のキーはカンマまたはスペースで区切ります",
"api_version": "APIバージョン",
"azure.apiversion.tip": "Azure OpenAIのAPIバージョン。Response APIを使用する場合は、previewバージョンを入力してください",
"basic_auth": "HTTP 認証",
"basic_auth.password": "パスワード",
"basic_auth.password.tip": "",
@ -2222,17 +2329,16 @@
"private_key_placeholder": "サービスアカウントの秘密鍵を入力してください",
"title": "サービスアカウント設定"
}
},
"azure.apiversion.tip": "Azure OpenAIのAPIバージョン。Response APIを使用する場合は、previewバージョンを入力してください"
}
},
"proxy": {
"address": "プロキシアドレス",
"mode": {
"custom": "カスタムプロキシ",
"none": "プロキシを使用しない",
"system": "システムプロキシ",
"title": "プロキシモード"
},
"address": "プロキシアドレス"
}
},
"quickAssistant": {
"click_tray_to_show": "トレイアイコンをクリックして起動",
@ -2455,115 +2561,9 @@
},
"words": {
"knowledgeGraph": "ナレッジグラフ",
"quit": "終了",
"quit": "[to be translated]:退出",
"show_window": "ウィンドウを表示",
"visualization": "可視化"
},
"memory": {
"title": "グローバルメモリ",
"add_memory": "メモリーを追加",
"edit_memory": "メモリーを編集",
"memory_content": "メモリー内容",
"please_enter_memory": "メモリー内容を入力してください",
"memory_placeholder": "メモリー内容を入力...",
"user_id": "ユーザーID",
"user_id_placeholder": "ユーザーIDを入力オプション",
"load_failed": "メモリーの読み込みに失敗しました",
"add_success": "メモリーが正常に追加されました",
"add_failed": "メモリーの追加に失敗しました",
"update_success": "メモリーが正常に更新されました",
"update_failed": "メモリーの更新に失敗しました",
"delete_success": "メモリーが正常に削除されました",
"delete_failed": "メモリーの削除に失敗しました",
"delete_confirm_title": "メモリーを削除",
"delete_confirm_content": "{{count}}件のメモリーを削除してもよろしいですか?",
"delete_confirm": "このメモリーを削除してもよろしいですか?",
"time": "時間",
"user": "ユーザー",
"content": "内容",
"score": "スコア",
"memories_description": "{{total}}件中{{count}}件のメモリーを表示",
"search_placeholder": "メモリーを検索...",
"start_date": "開始日",
"end_date": "終了日",
"all_users": "すべてのユーザー",
"users": "ユーザー",
"delete_selected": "選択したものを削除",
"reset_filters": "フィルターをリセット",
"pagination_total": "{{total}}件中{{start}}-{{end}}件",
"current_user": "現在のユーザー",
"select_user": "ユーザーを選択",
"default_user": "デフォルトユーザー",
"switch_user": "ユーザーを切り替え",
"user_switched": "ユーザーコンテキストが{{user}}に切り替わりました",
"switch_user_confirm": "ユーザーコンテキストを{{user}}に切り替えますか?",
"add_user": "ユーザーを追加",
"add_new_user": "新しいユーザーを追加",
"new_user_id": "新しいユーザーID",
"new_user_id_placeholder": "一意のユーザーIDを入力",
"user_id_required": "ユーザーIDは必須です",
"user_id_reserved": "'default-user'は予約済みです。別のIDを使用してください",
"user_id_exists": "このユーザーIDはすでに存在します",
"user_id_too_long": "ユーザーIDは50文字を超えられません",
"user_id_invalid_chars": "ユーザーIDには文字、数字、ハイフン、アンダースコアのみ使用できます",
"user_id_rules": "ユーザーIDは一意であり、文字、数字、ハイフン(-)、アンダースコア(_)のみ含む必要があります",
"user_created": "ユーザー{{user}}が作成され、切り替えが成功しました",
"add_user_failed": "ユーザーの追加に失敗しました",
"memory": "個のメモリ",
"reset_user_memories": "ユーザーメモリをリセット",
"reset_memories": "メモリをリセット",
"delete_user": "ユーザーを削除",
"loading_memories": "メモリを読み込み中...",
"no_memories": "メモリがありません",
"no_matching_memories": "一致するメモリが見つかりません",
"no_memories_description": "最初のメモリを追加してください",
"try_different_filters": "検索条件を調整してください",
"add_first_memory": "最初のメモリを追加",
"user_switch_failed": "ユーザーの切り替えに失敗しました",
"cannot_delete_default_user": "デフォルトユーザーは削除できません",
"delete_user_confirm_title": "ユーザーを削除",
"delete_user_confirm_content": "ユーザー{{user}}とそのすべてのメモリを削除してもよろしいですか?",
"user_deleted": "ユーザー{{user}}が正常に削除されました",
"delete_user_failed": "ユーザーの削除に失敗しました",
"reset_user_memories_confirm_title": "ユーザーメモリをリセット",
"reset_user_memories_confirm_content": "{{user}}のすべてのメモリをリセットしてもよろしいですか?",
"user_memories_reset": "{{user}}のすべてのメモリがリセットされました",
"reset_user_memories_failed": "ユーザーメモリのリセットに失敗しました",
"reset_memories_confirm_title": "すべてのメモリをリセット",
"reset_memories_confirm_content": "{{user}}のすべてのメモリを完全に削除してもよろしいですか?この操作は元に戻せません。",
"memories_reset_success": "{{user}}のすべてのメモリが正常にリセットされました",
"reset_memories_failed": "メモリのリセットに失敗しました",
"delete_confirm_single": "このメモリを削除してもよろしいですか?",
"total_memories": "個のメモリ",
"default": "デフォルト",
"custom": "カスタム",
"description": "メモリは、アシスタントとのやりとりに関する情報を保存・管理する機能です。メモリの追加、編集、削除のほか、フィルタリングや検索を行うことができます。",
"global_memory_enabled": "グローバルメモリが有効化されました",
"global_memory": "グローバルメモリ",
"enable_global_memory_first": "最初にグローバルメモリを有効にしてください",
"configure_memory_first": "最初にメモリ設定を構成してください",
"global_memory_disabled_title": "グローバルメモリが無効です",
"global_memory_disabled_desc": "メモリ機能を使用するには、まずアシスタント設定でグローバルメモリを有効にしてください。",
"not_configured_title": "メモリが設定されていません",
"not_configured_desc": "メモリ機能を有効にするには、メモリ設定で埋め込みとLLMモデルを設定してください。",
"go_to_memory_page": "メモリページに移動",
"settings": "設定",
"statistics": "統計",
"search": "検索",
"actions": "アクション",
"user_management": "ユーザー管理",
"initial_memory_content": "ようこそ!これはあなたの最初の記憶です。",
"loading": "思い出を読み込み中...",
"settings_title": "メモリ設定",
"llm_model": "LLMモデル",
"please_select_llm_model": "LLMモデルを選択してください",
"select_llm_model_placeholder": "LLMモデルを選択",
"embedding_model": "埋め込みモデル",
"please_select_embedding_model": "埋め込みモデルを選択してください",
"select_embedding_model_placeholder": "埋め込みモデルを選択",
"embedding_dimensions": "埋め込み次元",
"stored_memories": "保存された記憶",
"global_memory_description": "メモリ機能を使用するには、アシスタント設定でグローバルメモリを有効にしてください。"
}
}
}

View File

@ -204,6 +204,7 @@
"input.upload": "Загрузить изображение или документ",
"input.upload.document": "Загрузить документ (модель не поддерживает изображения)",
"input.upload.upload_from_local": "Загрузить локальный файл...",
"input.url_context": "Контекст страницы",
"input.web_search": "Веб-поиск",
"input.web_search.builtin": "Модель встроена",
"input.web_search.builtin.disabled_content": "Текущая модель не поддерживает веб-поиск",
@ -214,7 +215,6 @@
"input.web_search.no_web_search": "Отключить веб-поиск",
"input.web_search.no_web_search.description": "Отключить веб-поиск",
"input.web_search.settings": "Настройки веб-поиска",
"input.url_context": "Контекст страницы",
"message.new.branch": "Новая ветка",
"message.new.branch.created": "Новая ветка создана",
"message.new.context": "Новый контекст",
@ -235,33 +235,34 @@
},
"resend": "Переотправить",
"save": "Сохранить",
"save.file.title": "Сохранить в локальный файл",
"save.knowledge": {
"title": "Сохранить в базу знаний",
"content.maintext.title": "Основной текст",
"content.maintext.description": "Включает основное текстовое содержимое",
"content.code.title": "Блоки кода",
"content.code.description": "Включает отдельные блоки кода",
"content.thinking.title": "Размышления",
"content.thinking.description": "Включает содержимое рассуждений модели",
"content.tool_use.title": "Использование инструментов",
"content.tool_use.description": "Включает параметры вызова инструментов и результаты выполнения",
"content.citation.title": "Цитаты",
"content.citation.description": "Включает информацию веб-поиска и ссылки на базу знаний",
"content.translation.title": "Переводы",
"content.translation.description": "Включает переводное содержимое",
"content.error.title": "Ошибки",
"content.citation.title": "Цитаты",
"content.code.description": "Включает отдельные блоки кода",
"content.code.title": "Блоки кода",
"content.error.description": "Включает сообщения об ошибках во время выполнения",
"content.file.title": "Файлы",
"content.error.title": "Ошибки",
"content.file.description": "Включает прикрепленные файлы",
"content.file.title": "Файлы",
"content.maintext.description": "Включает основное текстовое содержимое",
"content.maintext.title": "Основной текст",
"content.thinking.description": "Включает содержимое рассуждений модели",
"content.thinking.title": "Размышления",
"content.tool_use.description": "Включает параметры вызова инструментов и результаты выполнения",
"content.tool_use.title": "Использование инструментов",
"content.translation.description": "Включает переводное содержимое",
"content.translation.title": "Переводы",
"empty.no_content": "Это сообщение не содержит сохраняемого контента",
"empty.no_knowledge_base": "Нет доступных баз знаний, сначала создайте одну",
"error.save_failed": "Сохранение не удалось, проверьте конфигурацию базы знаний",
"error.invalid_base": "Выбранная база знаний настроена неправильно",
"error.no_content_selected": "Выберите хотя бы один тип контента",
"select.base.title": "Выберите базу знаний",
"error.save_failed": "Сохранение не удалось, проверьте конфигурацию базы знаний",
"select.base.placeholder": "Пожалуйста, выберите базу знаний",
"select.base.title": "Выберите базу знаний",
"select.content.tip": "Выбрано {{count}} элементов, текстовые типы будут объединены и сохранены как одна заметка",
"select.content.title": "Выберите типы контента для сохранения",
"select.content.tip": "Выбрано {{count}} элементов, текстовые типы будут объединены и сохранены как одна заметка"
"title": "Сохранить в базу знаний"
},
"settings.code.title": "Настройки кода",
"settings.code_collapsible": "Блок кода свернут",
@ -358,14 +359,7 @@
"topics.prompt.tips": "Тематические подсказки: Дополнительные подсказки, предоставленные для текущей темы",
"topics.title": "Топики",
"topics.unpinned": "Открепленные темы",
"translate": "Перевести",
"save.file.title": "Сохранить в локальный файл"
},
"html_artifacts": {
"code": "Код",
"generating": "Генерация",
"preview": "Предпросмотр",
"split": "Разделить"
"translate": "Перевести"
},
"code_block": {
"collapse": "Свернуть",
@ -428,6 +422,7 @@
"footnote": "Цитируемый контент",
"footnotes": "Сноски",
"fullscreen": "Вы вошли в полноэкранный режим. Нажмите F11 для выхода",
"i_know": "Я понял",
"inspect": "Осмотреть",
"knowledge_base": "База знаний",
"language": "Язык",
@ -461,8 +456,7 @@
"swap": "Поменять местами",
"topics": "Топики",
"warning": "Предупреждение",
"you": "Вы",
"i_know": "Я понял"
"you": "Вы"
},
"docs": {
"title": "Документация"
@ -545,6 +539,12 @@
"search.topics.empty": "Топики не найдены, нажмите Enter для поиска всех сообщений",
"title": "Поиск топиков"
},
"html_artifacts": {
"code": "Код",
"generating": "Генерация",
"preview": "Предпросмотр",
"split": "Разделить"
},
"knowledge": {
"add": {
"title": "Добавить базу знаний"
@ -661,6 +661,112 @@
"keep_alive_time.title": "Время жизни модели",
"title": "LM Studio"
},
"memory": {
"actions": "Действия",
"add_failed": "Не удалось добавить память",
"add_first_memory": "Добавить первое воспоминание",
"add_memory": "Добавить память",
"add_new_user": "Добавить нового пользователя",
"add_success": "Память успешно добавлена",
"add_user": "Добавить пользователя",
"add_user_failed": "Не удалось добавить пользователя",
"all_users": "Все пользователи",
"cannot_delete_default_user": "Нельзя удалить пользователя по умолчанию",
"configure_memory_first": "Сначала настройте параметры памяти",
"content": "Содержимое",
"current_user": "Текущий пользователь",
"custom": "Пользовательский",
"default": "По умолчанию",
"default_user": "Пользователь по умолчанию",
"delete_confirm": "Вы уверены, что хотите удалить эту запись памяти?",
"delete_confirm_content": "Вы уверены, что хотите удалить {{count}} записей памяти?",
"delete_confirm_single": "Вы уверены, что хотите удалить это воспоминание?",
"delete_confirm_title": "Удалить память",
"delete_failed": "Не удалось удалить память",
"delete_selected": "Удалить выбранные",
"delete_success": "Память успешно удалена",
"delete_user": "Удалить пользователя",
"delete_user_confirm_content": "Вы уверены, что хотите удалить пользователя {{user}} и все его воспоминания?",
"delete_user_confirm_title": "Удалить пользователя",
"delete_user_failed": "Не удалось удалить пользователя",
"description": "Память позволяет хранить и управлять информацией о ваших взаимодействиях с ассистентом. Вы можете добавлять, редактировать и удалять воспоминания, а также фильтровать и искать их.",
"edit_memory": "Редактировать память",
"embedding_dimensions": "Размерность вложения",
"embedding_model": "Модель встраивания",
"enable_global_memory_first": "Сначала включите глобальную память",
"end_date": "Дата окончания",
"global_memory": "Глобальная память",
"global_memory_description": "Для использования функций памяти необходимо включить глобальную память в настройках ассистента.",
"global_memory_disabled_desc": "Чтобы использовать функции памяти, сначала включите глобальную память в настройках ассистента.",
"global_memory_disabled_title": "Глобальная память отключена",
"global_memory_enabled": "Глобальная память включена",
"go_to_memory_page": "Перейти на страницу памяти",
"initial_memory_content": "Добро пожаловать! Это ваше первое воспоминание.",
"llm_model": "Модель LLM",
"load_failed": "Не удалось загрузить память",
"loading": "Загрузка воспоминаний...",
"loading_memories": "Загрузка воспоминаний...",
"memories_description": "Показано {{count}} из {{total}} записей памяти",
"memories_reset_success": "Все воспоминания пользователя {{user}} успешно сброшены",
"memory": "воспоминаний",
"memory_content": "Содержимое памяти",
"memory_placeholder": "Введите содержимое памяти...",
"new_user_id": "Новый ID пользователя",
"new_user_id_placeholder": "Введите уникальный ID пользователя",
"no_matching_memories": "Подходящие воспоминания не найдены",
"no_memories": "Нет воспоминаний",
"no_memories_description": "Начните с добавления вашего первого воспоминания",
"not_configured_desc": "Пожалуйста, настройте модели встраивания и LLM в настройках памяти, чтобы включить функциональность памяти.",
"not_configured_title": "Память не настроена",
"pagination_total": "{{start}}-{{end}} из {{total}} элементов",
"please_enter_memory": "Пожалуйста, введите содержимое памяти",
"please_select_embedding_model": "Пожалуйста, выберите модель для внедрения",
"please_select_llm_model": "Пожалуйста, выберите модель LLM",
"reset_filters": "Сбросить фильтры",
"reset_memories": "Сбросить воспоминания",
"reset_memories_confirm_content": "Вы уверены, что хотите навсегда удалить все воспоминания пользователя {{user}}? Это действие нельзя отменить.",
"reset_memories_confirm_title": "Сбросить все воспоминания",
"reset_memories_failed": "Не удалось сбросить воспоминания",
"reset_user_memories": "Сбросить воспоминания пользователя",
"reset_user_memories_confirm_content": "Вы уверены, что хотите сбросить все воспоминания пользователя {{user}}?",
"reset_user_memories_confirm_title": "Сбросить воспоминания пользователя",
"reset_user_memories_failed": "Не удалось сбросить воспоминания пользователя",
"score": "Оценка",
"search": "Поиск",
"search_placeholder": "Поиск памяти...",
"select_embedding_model_placeholder": "Выберите модель внедрения",
"select_llm_model_placeholder": "Выбор модели LLM",
"select_user": "Выбрать пользователя",
"settings": "Настройки",
"settings_title": "Настройки памяти",
"start_date": "Дата начала",
"statistics": "Статистика",
"stored_memories": "Запасённые воспоминания",
"switch_user": "Переключить пользователя",
"switch_user_confirm": "Переключить контекст пользователя на {{user}}?",
"time": "Время",
"title": "Глобальная память",
"total_memories": "всего воспоминаний",
"try_different_filters": "Попробуйте изменить критерии поиска",
"update_failed": "Не удалось обновить память",
"update_success": "Память успешно обновлена",
"user": "Пользователь",
"user_created": "Пользователь {{user}} создан и переключен успешно",
"user_deleted": "Пользователь {{user}} успешно удален",
"user_id": "ID пользователя",
"user_id_exists": "Этот ID пользователя уже существует",
"user_id_invalid_chars": "ID пользователя может содержать только буквы, цифры, дефисы и подчёркивания",
"user_id_placeholder": "Введите ID пользователя (необязательно)",
"user_id_required": "ID пользователя обязателен",
"user_id_reserved": "'default-user' зарезервирован, используйте другой ID",
"user_id_rules": "ID пользователя должен быть уникальным и содержать только буквы, цифры, дефисы (-) и подчёркивания (_)",
"user_id_too_long": "ID пользователя не может превышать 50 символов",
"user_management": "Управление пользователями",
"user_memories_reset": "Все воспоминания пользователя {{user}} сброшены",
"user_switch_failed": "Не удалось переключить пользователя",
"user_switched": "Контекст пользователя переключен на {{user}}",
"users": "пользователи"
},
"message": {
"agents": {
"import.error": "Импорт не выполнен",
@ -753,13 +859,13 @@
"tools": {
"abort_failed": "Вызов инструмента прерван",
"aborted": "Вызов инструмента прерван",
"autoApproveEnabled": "Для этого инструмента включен автоматический одобрен",
"cancelled": "Отменено",
"completed": "Завершено",
"error": "Произошла ошибка",
"invoking": "Вызов",
"pending": "Ожидание",
"preview": "Предпросмотр",
"autoApproveEnabled": "Для этого инструмента включен автоматический одобрен",
"raw": "Исходный"
},
"topic.added": "Новый топик добавлен",
@ -785,9 +891,9 @@
"goBack": "Назад",
"goForward": "Вперед",
"minimize": "Свернуть встроенное приложение",
"openExternal": "Открыть в браузере",
"open_link_external_off": "Текущий: Открыть ссылки в окне по умолчанию",
"open_link_external_on": "Текущий: Открыть ссылки в браузере",
"openExternal": "Открыть в браузере",
"refresh": "Обновить",
"rightclick_copyurl": "ПКМ → Копировать URL"
},
@ -1323,9 +1429,9 @@
},
"settings": {
"about": "О программе и обратная связь",
"about.checkingUpdate": "Проверка обновлений...",
"about.checkUpdate": "Проверить обновления",
"about.checkUpdate.available": "Обновить",
"about.checkingUpdate": "Проверка обновлений...",
"about.contact.button": "Электронная почта",
"about.contact.title": "Контакты",
"about.debug.open": "Открыть",
@ -1653,6 +1759,10 @@
"backup.manager.title": "Управление резервными копиями",
"backup.modal.filename.placeholder": "Введите имя файла резервной копии",
"backup.modal.title": "Резервное копирование на WebDAV",
"disableStream": {
"help": "При включении файл загружается в память перед отправкой. Это может решить проблемы совместимости с некоторыми серверами WebDAV, не поддерживающими фрагментированную (chunked) загрузку, но увеличит потребление памяти.",
"title": "Отключить потоковую загрузку"
},
"host": "Хост WebDAV",
"host.placeholder": "http://localhost:8080",
"hour_interval_one": "{{count}} час",
@ -1673,11 +1783,7 @@
"syncError": "Ошибка резервного копирования",
"syncStatus": "Статус резервного копирования",
"title": "WebDAV",
"user": "Пользователь WebDAV",
"disableStream": {
"title": "Отключить потоковую загрузку",
"help": "При включении файл загружается в память перед отправкой. Это может решить проблемы совместимости с некоторыми серверами WebDAV, не поддерживающими фрагментированную (chunked) загрузку, но увеличит потребление памяти."
}
"user": "Пользователь WebDAV"
},
"yuque": {
"check": {
@ -1764,23 +1870,24 @@
"addServer.create": "Быстрое создание",
"addServer.importFrom": "Импорт из JSON",
"addServer.importFrom.connectionFailed": "Сбой подключения",
"addServer.importFrom.invalid": "Неверный ввод, проверьте формат JSON",
"addServer.importFrom.nameExists": "Сервер уже существует: {{name}}",
"addServer.importFrom.oneServer": "Можно сохранить только один конфигурационный файл MCP",
"addServer.importFrom.method": "Метод импорта",
"addServer.importFrom.dxt": "Импорт DXT-пакета",
"addServer.importFrom.dxtFile": "DXT-пакет",
"addServer.importFrom.dxtHelp": "Выберите .dxt файл, содержащий MCP сервер",
"addServer.importFrom.selectDxtFile": "Выбрать DXT-файл",
"addServer.importFrom.noDxtFile": "Пожалуйста, выберите DXT-файл",
"addServer.importFrom.dxtProcessFailed": "Не удалось обработать DXT-файл",
"addServer.importFrom.dxt": "Импорт DXT-пакета",
"addServer.importFrom.invalid": "Неверный ввод, проверьте формат JSON",
"addServer.importFrom.method": "Метод импорта",
"addServer.importFrom.nameExists": "Сервер уже существует: {{name}}",
"addServer.importFrom.noDxtFile": "Пожалуйста, выберите DXT-файл",
"addServer.importFrom.oneServer": "Можно сохранить только один конфигурационный файл MCP",
"addServer.importFrom.placeholder": "Вставьте JSON-конфигурацию сервера MCP",
"addServer.importFrom.selectDxtFile": "[to be translated]:选择 DXT 文件",
"addServer.importFrom.tooltip": "Скопируйте JSON-конфигурацию (приоритет NPX или UVX конфигураций) со страницы введения MCP Servers и вставьте ее в поле ввода.",
"addSuccess": "Сервер успешно добавлен",
"advancedSettings": "Расширенные настройки",
"args": "Аргументы",
"argsTooltip": "Каждый аргумент с новой строки",
"baseUrlTooltip": "Адрес удаленного URL",
"builtinServers": "Встроенные серверы",
"command": "Команда",
"config_description": "Настройка серверов протокола контекста модели",
"customRegistryPlaceholder": "Введите адрес частного склада, например: https://npm.company.com",
@ -1817,6 +1924,17 @@
"jsonSaveSuccess": "JSON конфигурация сохранена",
"logoUrl": "URL логотипа",
"missingDependencies": "отсутствует, пожалуйста, установите для продолжения.",
"more": {
"awesome": "Кураторский список серверов MCP",
"composio": "Инструменты разработки Composio MCP",
"glama": "Каталог серверов Glama MCP",
"higress": "Сервер Higress MCP",
"mcpso": "Платформа поиска серверов MCP",
"modelscope": "Сервер MCP сообщества ModelScope",
"official": "Официальная коллекция серверов MCP",
"pulsemcp": "Сервер Pulse MCP",
"smithery": "Инструменты Smithery MCP"
},
"name": "Имя",
"newServer": "MCP сервер",
"noDescriptionAvailable": "Описание отсутствует",
@ -1849,6 +1967,7 @@
"registry": "Реестр пакетов",
"registryDefault": "По умолчанию",
"registryTooltip": "Выберите реестр для установки пакетов, если возникают проблемы с сетью при использовании реестра по умолчанию.",
"requiresConfig": "Требуется настройка",
"resources": {
"availableResources": "Доступные ресурсы",
"blob": "Двоичные данные",
@ -1896,17 +2015,17 @@
"timeoutTooltip": "Тайм-аут в секундах для запросов к этому серверу, по умолчанию 60 секунд",
"title": "Настройки MCP",
"tools": {
"autoApprove": "Автоматическое одобрение",
"autoApprove.tooltip.confirm": "Вы уверены, что хотите выполнить этот инструмент MCP?",
"autoApprove.tooltip.disabled": "Инструмент будет требовать ручное одобрение перед выполнением",
"autoApprove.tooltip.enabled": "Инструмент будет автоматически выполняться без подтверждения",
"autoApprove.tooltip.howToEnable": "Включите инструмент, чтобы использовать автоматическое одобрение",
"availableTools": "Доступные инструменты",
"enable": "Включить инструмент",
"inputSchema": "Схема ввода",
"inputSchema.enum.allowedValues": "Допустимые значения",
"loadError": "Ошибка получения инструментов",
"noToolsAvailable": "Нет доступных инструментов",
"enable": "Включить инструмент",
"autoApprove": "Автоматическое одобрение",
"autoApprove.tooltip.howToEnable": "Включите инструмент, чтобы использовать автоматическое одобрение",
"autoApprove.tooltip.enabled": "Инструмент будет автоматически выполняться без подтверждения",
"autoApprove.tooltip.disabled": "Инструмент будет требовать ручное одобрение перед выполнением",
"autoApprove.tooltip.confirm": "Вы уверены, что хотите выполнить этот инструмент MCP?",
"run": "Выполнить"
},
"type": "Тип",
@ -1919,20 +2038,7 @@
"updateError": "Ошибка обновления сервера",
"updateSuccess": "Сервер успешно обновлен",
"url": "URL",
"user": "Пользователь",
"requiresConfig": "Требуется настройка",
"builtinServers": "Встроенные серверы",
"more": {
"modelscope": "Сервер MCP сообщества ModelScope",
"higress": "Сервер Higress MCP",
"mcpso": "Платформа поиска серверов MCP",
"smithery": "Инструменты Smithery MCP",
"glama": "Каталог серверов Glama MCP",
"pulsemcp": "Сервер Pulse MCP",
"composio": "Инструменты разработки Composio MCP",
"official": "Официальная коллекция серверов MCP",
"awesome": "Кураторский список серверов MCP"
}
"user": "Пользователь"
},
"messages.divider": "Показывать разделитель между сообщениями",
"messages.divider.tooltip": "Не применимо к сообщениям в стиле пузырей",
@ -2126,6 +2232,7 @@
"api_key": "Ключ API",
"api_key.tip": "Несколько ключей, разделенных запятыми или пробелами",
"api_version": "Версия API",
"azure.apiversion.tip": "Версия API Azure OpenAI. Если вы хотите использовать Response API, введите версию preview",
"basic_auth": "HTTP аутентификация",
"basic_auth.password": "Пароль",
"basic_auth.password.tip": "",
@ -2222,17 +2329,16 @@
"private_key_placeholder": "Введите приватный ключ Service Account",
"title": "Конфигурация Service Account"
}
},
"azure.apiversion.tip": "Версия API Azure OpenAI. Если вы хотите использовать Response API, введите версию preview"
}
},
"proxy": {
"address": "Адрес прокси",
"mode": {
"custom": "Пользовательский прокси",
"none": "Не использовать прокси",
"system": "Системный прокси",
"title": "Режим прокси"
},
"address": "Адрес прокси"
}
},
"quickAssistant": {
"click_tray_to_show": "Нажмите на иконку трея для запуска",
@ -2455,115 +2561,9 @@
},
"words": {
"knowledgeGraph": "Граф знаний",
"quit": "Выйти",
"quit": "[to be translated]:退出",
"show_window": "Показать окно",
"visualization": "Визуализация"
},
"memory": {
"title": "Глобальная память",
"add_memory": "Добавить память",
"edit_memory": "Редактировать память",
"memory_content": "Содержимое памяти",
"please_enter_memory": "Пожалуйста, введите содержимое памяти",
"memory_placeholder": "Введите содержимое памяти...",
"user_id": "ID пользователя",
"user_id_placeholder": "Введите ID пользователя (необязательно)",
"load_failed": "Не удалось загрузить память",
"add_success": "Память успешно добавлена",
"add_failed": "Не удалось добавить память",
"update_success": "Память успешно обновлена",
"update_failed": "Не удалось обновить память",
"delete_success": "Память успешно удалена",
"delete_failed": "Не удалось удалить память",
"delete_confirm_title": "Удалить память",
"delete_confirm_content": "Вы уверены, что хотите удалить {{count}} записей памяти?",
"delete_confirm": "Вы уверены, что хотите удалить эту запись памяти?",
"time": "Время",
"user": "Пользователь",
"content": "Содержимое",
"score": "Оценка",
"memories_description": "Показано {{count}} из {{total}} записей памяти",
"search_placeholder": "Поиск памяти...",
"start_date": "Дата начала",
"end_date": "Дата окончания",
"all_users": "Все пользователи",
"users": "пользователи",
"delete_selected": "Удалить выбранные",
"reset_filters": "Сбросить фильтры",
"pagination_total": "{{start}}-{{end}} из {{total}} элементов",
"current_user": "Текущий пользователь",
"select_user": "Выбрать пользователя",
"default_user": "Пользователь по умолчанию",
"switch_user": "Переключить пользователя",
"user_switched": "Контекст пользователя переключен на {{user}}",
"switch_user_confirm": "Переключить контекст пользователя на {{user}}?",
"add_user": "Добавить пользователя",
"add_new_user": "Добавить нового пользователя",
"new_user_id": "Новый ID пользователя",
"new_user_id_placeholder": "Введите уникальный ID пользователя",
"user_id_required": "ID пользователя обязателен",
"user_id_reserved": "'default-user' зарезервирован, используйте другой ID",
"user_id_exists": "Этот ID пользователя уже существует",
"user_id_too_long": "ID пользователя не может превышать 50 символов",
"user_id_invalid_chars": "ID пользователя может содержать только буквы, цифры, дефисы и подчёркивания",
"user_id_rules": "ID пользователя должен быть уникальным и содержать только буквы, цифры, дефисы (-) и подчёркивания (_)",
"user_created": "Пользователь {{user}} создан и переключен успешно",
"add_user_failed": "Не удалось добавить пользователя",
"memory": "воспоминаний",
"reset_user_memories": "Сбросить воспоминания пользователя",
"reset_memories": "Сбросить воспоминания",
"delete_user": "Удалить пользователя",
"loading_memories": "Загрузка воспоминаний...",
"no_memories": "Нет воспоминаний",
"no_matching_memories": "Подходящие воспоминания не найдены",
"no_memories_description": "Начните с добавления вашего первого воспоминания",
"try_different_filters": "Попробуйте изменить критерии поиска",
"add_first_memory": "Добавить первое воспоминание",
"user_switch_failed": "Не удалось переключить пользователя",
"cannot_delete_default_user": "Нельзя удалить пользователя по умолчанию",
"delete_user_confirm_title": "Удалить пользователя",
"delete_user_confirm_content": "Вы уверены, что хотите удалить пользователя {{user}} и все его воспоминания?",
"user_deleted": "Пользователь {{user}} успешно удален",
"delete_user_failed": "Не удалось удалить пользователя",
"reset_user_memories_confirm_title": "Сбросить воспоминания пользователя",
"reset_user_memories_confirm_content": "Вы уверены, что хотите сбросить все воспоминания пользователя {{user}}?",
"user_memories_reset": "Все воспоминания пользователя {{user}} сброшены",
"reset_user_memories_failed": "Не удалось сбросить воспоминания пользователя",
"reset_memories_confirm_title": "Сбросить все воспоминания",
"reset_memories_confirm_content": "Вы уверены, что хотите навсегда удалить все воспоминания пользователя {{user}}? Это действие нельзя отменить.",
"memories_reset_success": "Все воспоминания пользователя {{user}} успешно сброшены",
"reset_memories_failed": "Не удалось сбросить воспоминания",
"delete_confirm_single": "Вы уверены, что хотите удалить это воспоминание?",
"total_memories": "всего воспоминаний",
"default": "По умолчанию",
"custom": "Пользовательский",
"description": "Память позволяет хранить и управлять информацией о ваших взаимодействиях с ассистентом. Вы можете добавлять, редактировать и удалять воспоминания, а также фильтровать и искать их.",
"global_memory_enabled": "Глобальная память включена",
"global_memory": "Глобальная память",
"enable_global_memory_first": "Сначала включите глобальную память",
"configure_memory_first": "Сначала настройте параметры памяти",
"global_memory_disabled_title": "Глобальная память отключена",
"global_memory_disabled_desc": "Чтобы использовать функции памяти, сначала включите глобальную память в настройках ассистента.",
"not_configured_title": "Память не настроена",
"not_configured_desc": "Пожалуйста, настройте модели встраивания и LLM в настройках памяти, чтобы включить функциональность памяти.",
"go_to_memory_page": "Перейти на страницу памяти",
"settings": "Настройки",
"statistics": "Статистика",
"search": "Поиск",
"actions": "Действия",
"user_management": "Управление пользователями",
"initial_memory_content": "Добро пожаловать! Это ваше первое воспоминание.",
"loading": "Загрузка воспоминаний...",
"settings_title": "Настройки памяти",
"llm_model": "Модель LLM",
"please_select_llm_model": "Пожалуйста, выберите модель LLM",
"select_llm_model_placeholder": "Выбор модели LLM",
"embedding_model": "Модель встраивания",
"please_select_embedding_model": "Пожалуйста, выберите модель для внедрения",
"select_embedding_model_placeholder": "Выберите модель внедрения",
"embedding_dimensions": "Размерность вложения",
"stored_memories": "Запасённые воспоминания",
"global_memory_description": "Для использования функций памяти необходимо включить глобальную память в настройках ассистента."
}
}
}

View File

@ -204,6 +204,7 @@
"input.upload": "上传图片或文档",
"input.upload.document": "上传文档(模型不支持图片)",
"input.upload.upload_from_local": "上传本地文件...",
"input.url_context": "网页上下文",
"input.web_search": "网络搜索",
"input.web_search.builtin": "模型内置",
"input.web_search.builtin.disabled_content": "当前模型不支持网络搜索功能",
@ -214,7 +215,6 @@
"input.web_search.no_web_search": "不使用网络",
"input.web_search.no_web_search.description": "不启用网络搜索功能",
"input.web_search.settings": "网络搜索设置",
"input.url_context": "网页上下文",
"message.new.branch": "分支",
"message.new.branch.created": "新分支已创建",
"message.new.context": "清除上下文",
@ -237,32 +237,32 @@
"save": "保存",
"save.file.title": "保存到本地文件",
"save.knowledge": {
"title": "保存到知识库",
"content.maintext.title": "主文本",
"content.maintext.description": "包括主要的文本内容",
"content.code.title": "代码块",
"content.code.description": "包括独立的代码块",
"content.thinking.title": "思考",
"content.thinking.description": "包括模型思考内容",
"content.tool_use.title": "工具调用",
"content.tool_use.description": "包括工具调用参数和执行结果",
"content.citation.title": "引用",
"content.citation.description": "包括网络搜索和知识库引用信息",
"content.translation.title": "翻译",
"content.translation.description": "包括翻译内容",
"content.error.title": "错误",
"content.citation.title": "引用",
"content.code.description": "包括独立的代码块",
"content.code.title": "代码块",
"content.error.description": "包括执行过程中的错误信息",
"content.file.title": "文件",
"content.error.title": "错误",
"content.file.description": "包括作为附件的文件",
"content.file.title": "文件",
"content.maintext.description": "包括主要的文本内容",
"content.maintext.title": "主文本",
"content.thinking.description": "包括模型思考内容",
"content.thinking.title": "思考",
"content.tool_use.description": "包括工具调用参数和执行结果",
"content.tool_use.title": "工具调用",
"content.translation.description": "包括翻译内容",
"content.translation.title": "翻译",
"empty.no_content": "此消息没有可保存的内容",
"empty.no_knowledge_base": "暂无可用知识库,请先创建知识库",
"error.save_failed": "保存失败,请检查知识库配置",
"error.invalid_base": "所选知识库未正确配置",
"error.no_content_selected": "请至少选择一种内容",
"select.base.title": "选择知识库",
"error.save_failed": "保存失败,请检查知识库配置",
"select.base.placeholder": "请选择知识库",
"select.base.title": "选择知识库",
"select.content.tip": "已选择 {{count}} 项内容,文本类型将合并保存为一个笔记",
"select.content.title": "选择要保存的内容类型",
"select.content.tip": "已选择 {{count}} 项内容,文本类型将合并保存为一个笔记"
"title": "保存到知识库"
},
"settings.code.title": "代码块设置",
"settings.code_collapsible": "代码块可折叠",
@ -361,12 +361,6 @@
"topics.unpinned": "取消固定",
"translate": "翻译"
},
"html_artifacts": {
"code": "代码",
"generating": "生成中",
"preview": "预览",
"split": "分屏"
},
"code_block": {
"collapse": "收起",
"copy": "复制",
@ -428,6 +422,7 @@
"footnote": "引用内容",
"footnotes": "引用内容",
"fullscreen": "已进入全屏模式,按 F11 退出",
"i_know": "我知道了",
"inspect": "检查",
"knowledge_base": "知识库",
"language": "语言",
@ -461,8 +456,7 @@
"swap": "交换",
"topics": "话题",
"warning": "警告",
"you": "用户",
"i_know": "我知道了"
"you": "用户"
},
"docs": {
"title": "帮助文档"
@ -545,6 +539,12 @@
"search.topics.empty": "没有找到相关话题,点击回车键搜索所有消息",
"title": "话题搜索"
},
"html_artifacts": {
"code": "代码",
"generating": "生成中",
"preview": "预览",
"split": "分屏"
},
"knowledge": {
"add": {
"title": "添加知识库"
@ -661,6 +661,112 @@
"keep_alive_time.title": "保持活跃时间",
"title": "LM Studio"
},
"memory": {
"actions": "操作",
"add_failed": "添加记忆失败",
"add_first_memory": "添加您的第一条记忆",
"add_memory": "添加记忆",
"add_new_user": "添加新用户",
"add_success": "记忆添加成功",
"add_user": "添加用户",
"add_user_failed": "添加用户失败",
"all_users": "所有用户",
"cannot_delete_default_user": "不能删除默认用户",
"configure_memory_first": "请先配置记忆设置",
"content": "内容",
"current_user": "当前用户",
"custom": "自定义",
"default": "默认",
"default_user": "默认用户",
"delete_confirm": "确定要删除这条记忆吗?",
"delete_confirm_content": "确定要删除 {{count}} 条记忆吗?",
"delete_confirm_single": "确定要删除这条记忆吗?",
"delete_confirm_title": "删除记忆",
"delete_failed": "删除记忆失败",
"delete_selected": "删除选中",
"delete_success": "记忆删除成功",
"delete_user": "删除用户",
"delete_user_confirm_content": "确定要删除用户 {{user}} 及其所有记忆吗?",
"delete_user_confirm_title": "删除用户",
"delete_user_failed": "删除用户失败",
"description": "记忆功能允许您存储和管理与助手交互的信息。您可以添加、编辑和删除记忆,也可以对它们进行过滤和搜索。",
"edit_memory": "编辑记忆",
"embedding_dimensions": "嵌入维度",
"embedding_model": "嵌入模型",
"enable_global_memory_first": "请先启用全局记忆",
"end_date": "结束日期",
"global_memory": "全局记忆",
"global_memory_description": "需要开启助手设置中的全局记忆才能使用",
"global_memory_disabled_desc": "要使用记忆功能,请先在助手设置中启用全局记忆。",
"global_memory_disabled_title": "全局记忆已禁用",
"global_memory_enabled": "全局记忆已启用",
"go_to_memory_page": "前往记忆页面",
"initial_memory_content": "欢迎!这是您的第一条记忆。",
"llm_model": "LLM 模型",
"load_failed": "加载记忆失败",
"loading": "正在加载记忆...",
"loading_memories": "正在加载记忆...",
"memories_description": "显示 {{count}} / {{total}} 条记忆",
"memories_reset_success": "{{user}} 的所有记忆已成功重置",
"memory": "条记忆",
"memory_content": "记忆内容",
"memory_placeholder": "输入记忆内容...",
"new_user_id": "新用户ID",
"new_user_id_placeholder": "输入唯一的用户ID",
"no_matching_memories": "未找到匹配的记忆",
"no_memories": "暂无记忆",
"no_memories_description": "开始添加您的第一条记忆吧",
"not_configured_desc": "请在记忆设置中配置嵌入和LLM模型以启用记忆功能。",
"not_configured_title": "记忆未配置",
"pagination_total": "第 {{start}}-{{end}} 项,共 {{total}} 项",
"please_enter_memory": "请输入记忆内容",
"please_select_embedding_model": "请选择嵌入模型",
"please_select_llm_model": "请选择 LLM 模型",
"reset_filters": "重置筛选",
"reset_memories": "重置记忆",
"reset_memories_confirm_content": "确定要永久删除 {{user}} 的所有记忆吗?此操作无法撤销。",
"reset_memories_confirm_title": "重置所有记忆",
"reset_memories_failed": "重置记忆失败",
"reset_user_memories": "重置用户记忆",
"reset_user_memories_confirm_content": "确定要重置 {{user}} 的所有记忆吗?",
"reset_user_memories_confirm_title": "重置用户记忆",
"reset_user_memories_failed": "重置用户记忆失败",
"score": "分数",
"search": "搜索",
"search_placeholder": "搜索记忆...",
"select_embedding_model_placeholder": "选择嵌入模型",
"select_llm_model_placeholder": "选择 LLM 模型",
"select_user": "选择用户",
"settings": "设置",
"settings_title": "记忆设置",
"start_date": "开始日期",
"statistics": "统计",
"stored_memories": "已存储记忆",
"switch_user": "切换用户",
"switch_user_confirm": "将用户上下文切换到 {{user}}",
"time": "时间",
"title": "全局记忆",
"total_memories": "条记忆",
"try_different_filters": "尝试调整搜索条件",
"update_failed": "更新记忆失败",
"update_success": "记忆更新成功",
"user": "用户",
"user_created": "用户 {{user}} 创建并切换成功",
"user_deleted": "用户 {{user}} 删除成功",
"user_id": "用户 ID",
"user_id_exists": "该用户ID已存在",
"user_id_invalid_chars": "用户ID只能包含字母、数字、连字符和下划线",
"user_id_placeholder": "输入用户 ID可选",
"user_id_required": "用户ID为必填项",
"user_id_reserved": "'default-user' 为保留字请使用其他ID",
"user_id_rules": "用户ID必须唯一只能包含字母、数字、连字符(-)和下划线(_)",
"user_id_too_long": "用户ID不能超过50个字符",
"user_management": "用户管理",
"user_memories_reset": "{{user}} 的所有记忆已重置",
"user_switch_failed": "切换用户失败",
"user_switched": "用户上下文已切换到 {{user}}",
"users": "用户"
},
"message": {
"agents": {
"import.error": "导入失败",
@ -753,13 +859,13 @@
"tools": {
"abort_failed": "工具调用中断失败",
"aborted": "工具调用已中断",
"autoApproveEnabled": "此工具已启用自动批准",
"cancelled": "已取消",
"completed": "已完成",
"error": "发生错误",
"invoking": "调用中",
"pending": "等待中",
"preview": "预览",
"autoApproveEnabled": "此工具已启用自动批准",
"raw": "原始"
},
"topic.added": "话题添加成功",
@ -785,9 +891,9 @@
"goBack": "后退",
"goForward": "前进",
"minimize": "最小化小程序",
"openExternal": "在浏览器中打开",
"open_link_external_off": "当前:使用默认窗口打开链接",
"open_link_external_on": "当前:在浏览器中打开链接",
"openExternal": "在浏览器中打开",
"refresh": "刷新",
"rightclick_copyurl": "右键复制 URL"
},
@ -1323,9 +1429,9 @@
},
"settings": {
"about": "关于我们",
"about.checkingUpdate": "正在检查更新...",
"about.checkUpdate": "检查更新",
"about.checkUpdate.available": "立即更新",
"about.checkingUpdate": "正在检查更新...",
"about.contact.button": "邮件",
"about.contact.title": "邮件联系",
"about.debug.open": "打开",
@ -1653,6 +1759,10 @@
"backup.manager.title": "备份数据管理",
"backup.modal.filename.placeholder": "请输入备份文件名",
"backup.modal.title": "备份到 WebDAV",
"disableStream": {
"help": "开启后将文件加载到内存中再上传可解决部分WebDAV服务不兼容chunked上传的问题但会增加内存占用。",
"title": "禁用流式上传"
},
"host": "WebDAV 地址",
"host.placeholder": "http://localhost:8080",
"hour_interval_one": "{{count}} 小时",
@ -1673,11 +1783,7 @@
"syncError": "备份错误",
"syncStatus": "备份状态",
"title": "WebDAV",
"user": "WebDAV 用户名",
"disableStream": {
"title": "禁用流式上传",
"help": "开启后将文件加载到内存中再上传可解决部分WebDAV服务不兼容chunked上传的问题但会增加内存占用。"
}
"user": "WebDAV 用户名"
},
"yuque": {
"check": {
@ -1764,23 +1870,24 @@
"addServer.create": "快速创建",
"addServer.importFrom": "从 JSON 导入",
"addServer.importFrom.connectionFailed": "連接失敗",
"addServer.importFrom.invalid": "无效输入,请检查 JSON 格式",
"addServer.importFrom.nameExists": "服务器已存在:{{name}}",
"addServer.importFrom.oneServer": "每次只能保存一個 MCP 伺服器配置",
"addServer.importFrom.method": "导入方式",
"addServer.importFrom.dxt": "导入 DXT 包",
"addServer.importFrom.dxtFile": "DXT 包文件",
"addServer.importFrom.dxtHelp": "选择包含 MCP 服务器的 .dxt 文件",
"addServer.importFrom.selectDxtFile": "选择 DXT 文件",
"addServer.importFrom.noDxtFile": "请选择一个 DXT 文件",
"addServer.importFrom.dxtProcessFailed": "处理 DXT 文件失败",
"addServer.importFrom.dxt": "导入 DXT 包",
"addServer.importFrom.invalid": "无效输入,请检查 JSON 格式",
"addServer.importFrom.method": "导入方式",
"addServer.importFrom.nameExists": "服务器已存在:{{name}}",
"addServer.importFrom.noDxtFile": "请选择一个 DXT 文件",
"addServer.importFrom.oneServer": "每次只能保存一個 MCP 伺服器配置",
"addServer.importFrom.placeholder": "粘贴 MCP 服务器 JSON 配置",
"addServer.importFrom.selectDxtFile": "选择 DXT 文件",
"addServer.importFrom.tooltip": "请从 MCP Servers 的介绍页面复制配置 JSON优先使用\n NPX 或 UVX 配置),并粘贴到输入框中",
"addSuccess": "服务器添加成功",
"advancedSettings": "高级设置",
"args": "参数",
"argsTooltip": "每个参数占一行",
"baseUrlTooltip": "远程 URL 地址",
"builtinServers": "内置服务器",
"command": "命令",
"config_description": "配置模型上下文协议服务器",
"customRegistryPlaceholder": "请输入私有仓库地址,如: https://npm.company.com",
@ -1817,6 +1924,17 @@
"jsonSaveSuccess": "JSON 配置已保存",
"logoUrl": "标志网址",
"missingDependencies": "缺失,请安装它以继续",
"more": {
"awesome": "精选的 MCP 服务器列表",
"composio": "Composio MCP 开发工具",
"glama": "Glama MCP 服务器目录",
"higress": "Higress MCP 服务器",
"mcpso": "MCP 服务器发现平台",
"modelscope": "魔搭社区 MCP 服务器",
"official": "官方 MCP 服务器集合",
"pulsemcp": "Pulse MCP 服务器",
"smithery": "Smithery MCP 工具"
},
"name": "名称",
"newServer": "MCP 服务器",
"noDescriptionAvailable": "暂无描述",
@ -1849,6 +1967,7 @@
"registry": "包管理源",
"registryDefault": "默认",
"registryTooltip": "选择用于安装包的源,以解决默认源的网络问题",
"requiresConfig": "需要配置",
"resources": {
"availableResources": "可用资源",
"blob": "二进制数据",
@ -1896,17 +2015,17 @@
"timeoutTooltip": "对该服务器请求的超时时间(秒),默认为 60 秒",
"title": "MCP 设置",
"tools": {
"autoApprove": "自动批准",
"autoApprove.tooltip.confirm": "是否运行该MCP工具",
"autoApprove.tooltip.disabled": "工具运行前需要手动批准",
"autoApprove.tooltip.enabled": "工具将自动运行而无需批准",
"autoApprove.tooltip.howToEnable": "启用工具后才能使用自动批准",
"availableTools": "可用工具",
"enable": "启用工具",
"inputSchema": "输入模式",
"inputSchema.enum.allowedValues": "允许的值",
"loadError": "获取工具失败",
"noToolsAvailable": "无可用工具",
"enable": "启用工具",
"autoApprove": "自动批准",
"autoApprove.tooltip.howToEnable": "启用工具后才能使用自动批准",
"autoApprove.tooltip.enabled": "工具将自动运行而无需批准",
"autoApprove.tooltip.disabled": "工具运行前需要手动批准",
"autoApprove.tooltip.confirm": "是否运行该MCP工具",
"run": "运行"
},
"type": "类型",
@ -1919,20 +2038,7 @@
"updateError": "更新服务器失败",
"updateSuccess": "服务器更新成功",
"url": "URL",
"user": "用户",
"requiresConfig": "需要配置",
"builtinServers": "内置服务器",
"more": {
"modelscope": "魔搭社区 MCP 服务器",
"higress": "Higress MCP 服务器",
"mcpso": "MCP 服务器发现平台",
"smithery": "Smithery MCP 工具",
"glama": "Glama MCP 服务器目录",
"pulsemcp": "Pulse MCP 服务器",
"composio": "Composio MCP 开发工具",
"official": "官方 MCP 服务器集合",
"awesome": "精选的 MCP 服务器列表"
}
"user": "用户"
},
"messages.divider": "消息分割线",
"messages.divider.tooltip": "不适用于气泡样式消息",
@ -2226,13 +2332,13 @@
}
},
"proxy": {
"address": "代理地址",
"mode": {
"custom": "自定义代理",
"none": "不使用代理",
"system": "系统代理",
"title": "代理模式"
},
"address": "代理地址"
}
},
"quickAssistant": {
"click_tray_to_show": "点击托盘图标启动",
@ -2458,112 +2564,6 @@
"quit": "退出",
"show_window": "显示窗口",
"visualization": "可视化"
},
"memory": {
"title": "全局记忆",
"settings": "设置",
"statistics": "统计",
"search": "搜索",
"actions": "操作",
"add_memory": "添加记忆",
"edit_memory": "编辑记忆",
"memory_content": "记忆内容",
"please_enter_memory": "请输入记忆内容",
"memory_placeholder": "输入记忆内容...",
"user_id": "用户 ID",
"user_id_placeholder": "输入用户 ID可选",
"load_failed": "加载记忆失败",
"add_success": "记忆添加成功",
"add_failed": "添加记忆失败",
"update_success": "记忆更新成功",
"update_failed": "更新记忆失败",
"delete_success": "记忆删除成功",
"delete_failed": "删除记忆失败",
"delete_confirm_title": "删除记忆",
"delete_confirm_content": "确定要删除 {{count}} 条记忆吗?",
"delete_confirm": "确定要删除这条记忆吗?",
"time": "时间",
"user": "用户",
"content": "内容",
"score": "分数",
"memories_description": "显示 {{count}} / {{total}} 条记忆",
"search_placeholder": "搜索记忆...",
"start_date": "开始日期",
"end_date": "结束日期",
"all_users": "所有用户",
"users": "用户",
"delete_selected": "删除选中",
"reset_filters": "重置筛选",
"pagination_total": "第 {{start}}-{{end}} 项,共 {{total}} 项",
"current_user": "当前用户",
"select_user": "选择用户",
"default_user": "默认用户",
"switch_user": "切换用户",
"user_switched": "用户上下文已切换到 {{user}}",
"switch_user_confirm": "将用户上下文切换到 {{user}}",
"add_user": "添加用户",
"add_new_user": "添加新用户",
"new_user_id": "新用户ID",
"new_user_id_placeholder": "输入唯一的用户ID",
"user_management": "用户管理",
"user_id_required": "用户ID为必填项",
"user_id_reserved": "'default-user' 为保留字请使用其他ID",
"user_id_exists": "该用户ID已存在",
"user_id_too_long": "用户ID不能超过50个字符",
"user_id_invalid_chars": "用户ID只能包含字母、数字、连字符和下划线",
"user_id_rules": "用户ID必须唯一只能包含字母、数字、连字符(-)和下划线(_)",
"user_created": "用户 {{user}} 创建并切换成功",
"add_user_failed": "添加用户失败",
"memory": "条记忆",
"reset_user_memories": "重置用户记忆",
"reset_memories": "重置记忆",
"delete_user": "删除用户",
"loading_memories": "正在加载记忆...",
"no_memories": "暂无记忆",
"no_matching_memories": "未找到匹配的记忆",
"no_memories_description": "开始添加您的第一条记忆吧",
"try_different_filters": "尝试调整搜索条件",
"add_first_memory": "添加您的第一条记忆",
"user_switch_failed": "切换用户失败",
"cannot_delete_default_user": "不能删除默认用户",
"delete_user_confirm_title": "删除用户",
"delete_user_confirm_content": "确定要删除用户 {{user}} 及其所有记忆吗?",
"user_deleted": "用户 {{user}} 删除成功",
"delete_user_failed": "删除用户失败",
"reset_user_memories_confirm_title": "重置用户记忆",
"reset_user_memories_confirm_content": "确定要重置 {{user}} 的所有记忆吗?",
"user_memories_reset": "{{user}} 的所有记忆已重置",
"reset_user_memories_failed": "重置用户记忆失败",
"reset_memories_confirm_title": "重置所有记忆",
"reset_memories_confirm_content": "确定要永久删除 {{user}} 的所有记忆吗?此操作无法撤销。",
"memories_reset_success": "{{user}} 的所有记忆已成功重置",
"reset_memories_failed": "重置记忆失败",
"delete_confirm_single": "确定要删除这条记忆吗?",
"total_memories": "条记忆",
"default": "默认",
"custom": "自定义",
"description": "记忆功能允许您存储和管理与助手交互的信息。您可以添加、编辑和删除记忆,也可以对它们进行过滤和搜索。",
"global_memory_enabled": "全局记忆已启用",
"global_memory": "全局记忆",
"enable_global_memory_first": "请先启用全局记忆",
"configure_memory_first": "请先配置记忆设置",
"global_memory_disabled_title": "全局记忆已禁用",
"global_memory_disabled_desc": "要使用记忆功能,请先在助手设置中启用全局记忆。",
"not_configured_title": "记忆未配置",
"not_configured_desc": "请在记忆设置中配置嵌入和LLM模型以启用记忆功能。",
"go_to_memory_page": "前往记忆页面",
"initial_memory_content": "欢迎!这是您的第一条记忆。",
"loading": "正在加载记忆...",
"settings_title": "记忆设置",
"llm_model": "LLM 模型",
"please_select_llm_model": "请选择 LLM 模型",
"select_llm_model_placeholder": "选择 LLM 模型",
"embedding_model": "嵌入模型",
"please_select_embedding_model": "请选择嵌入模型",
"select_embedding_model_placeholder": "选择嵌入模型",
"embedding_dimensions": "嵌入维度",
"stored_memories": "已存储记忆",
"global_memory_description": "需要开启助手设置中的全局记忆才能使用"
}
}
}

View File

@ -204,6 +204,7 @@
"input.upload": "上傳圖片或文件",
"input.upload.document": "上傳文件(模型不支援圖片)",
"input.upload.upload_from_local": "上傳本地文件...",
"input.url_context": "網頁上下文",
"input.web_search": "網路搜尋",
"input.web_search.builtin": "模型內置",
"input.web_search.builtin.disabled_content": "當前模型不支持網路搜尋功能",
@ -214,7 +215,6 @@
"input.web_search.no_web_search": "關閉網路搜尋",
"input.web_search.no_web_search.description": "關閉網路搜尋",
"input.web_search.settings": "網路搜尋設定",
"input.url_context": "網頁上下文",
"message.new.branch": "分支",
"message.new.branch.created": "新分支已建立",
"message.new.context": "新上下文",
@ -235,33 +235,34 @@
},
"resend": "重新傳送",
"save": "儲存",
"save.file.title": "[to be translated]:Save to Local File",
"save.knowledge": {
"title": "儲存到知識庫",
"content.maintext.title": "主文本",
"content.maintext.description": "包括主要的文本內容",
"content.code.title": "程式碼區塊",
"content.code.description": "包括獨立的程式碼區塊",
"content.thinking.title": "思考過程",
"content.thinking.description": "包括模型思考內容",
"content.tool_use.title": "工具使用",
"content.tool_use.description": "包括工具呼叫參數和執行結果",
"content.citation.title": "引用",
"content.citation.description": "包括網路搜尋和知識庫引用資訊",
"content.translation.title": "翻譯",
"content.translation.description": "包括翻譯內容",
"content.error.title": "錯誤",
"content.citation.title": "引用",
"content.code.description": "包括獨立的程式碼區塊",
"content.code.title": "程式碼區塊",
"content.error.description": "包括執行過程中的錯誤資訊",
"content.file.title": "檔案",
"content.error.title": "錯誤",
"content.file.description": "包括作為附件的檔案",
"content.file.title": "檔案",
"content.maintext.description": "包括主要的文本內容",
"content.maintext.title": "主文本",
"content.thinking.description": "包括模型思考內容",
"content.thinking.title": "思考過程",
"content.tool_use.description": "包括工具呼叫參數和執行結果",
"content.tool_use.title": "工具使用",
"content.translation.description": "包括翻譯內容",
"content.translation.title": "翻譯",
"empty.no_content": "此訊息沒有可儲存的內容",
"empty.no_knowledge_base": "暫無可用知識庫,請先建立知識庫",
"error.save_failed": "儲存失敗,請檢查知識庫設定",
"error.invalid_base": "所選知識庫未正確設定",
"error.no_content_selected": "請至少選擇一種內容類型",
"select.base.title": "選擇知識庫",
"error.save_failed": "儲存失敗,請檢查知識庫設定",
"select.base.placeholder": "請選擇知識庫",
"select.base.title": "選擇知識庫",
"select.content.tip": "已選擇 {{count}} 項內容,文本類型將合併儲存為一個筆記",
"select.content.title": "選擇要儲存的內容類型",
"select.content.tip": "已選擇 {{count}} 項內容,文本類型將合併儲存為一個筆記"
"title": "儲存到知識庫"
},
"settings.code.title": "程式碼區塊",
"settings.code_collapsible": "程式碼區塊可折疊",
@ -358,14 +359,7 @@
"topics.prompt.tips": "話題提示詞:針對目前話題提供額外的補充提示詞",
"topics.title": "話題",
"topics.unpinned": "取消固定",
"translate": "翻譯",
"save.file.title": "[to be translated]:Save to Local File"
},
"html_artifacts": {
"code": "程式碼",
"generating": "生成中",
"preview": "預覽",
"split": "分屏"
"translate": "翻譯"
},
"code_block": {
"collapse": "折疊",
@ -428,6 +422,7 @@
"footnote": "引用內容",
"footnotes": "引用",
"fullscreen": "已進入全螢幕模式,按 F11 結束",
"i_know": "我知道了",
"inspect": "檢查",
"knowledge_base": "知識庫",
"language": "語言",
@ -461,8 +456,7 @@
"swap": "交換",
"topics": "話題",
"warning": "警告",
"you": "您",
"i_know": "我知道了"
"you": "您"
},
"docs": {
"title": "說明文件"
@ -545,6 +539,12 @@
"search.topics.empty": "沒有找到相關話題,按 Enter 鍵搜尋所有訊息",
"title": "搜尋話題"
},
"html_artifacts": {
"code": "程式碼",
"generating": "生成中",
"preview": "預覽",
"split": "分屏"
},
"knowledge": {
"add": {
"title": "新增知識庫"
@ -661,6 +661,112 @@
"keep_alive_time.title": "保持活躍時間",
"title": "LM Studio"
},
"memory": {
"actions": "操作",
"add_failed": "新增記憶失敗",
"add_first_memory": "新增您的第一個記憶",
"add_memory": "新增記憶",
"add_new_user": "新增新使用者",
"add_success": "記憶新增成功",
"add_user": "新增使用者",
"add_user_failed": "新增使用者失敗",
"all_users": "所有使用者",
"cannot_delete_default_user": "不能刪除預設使用者",
"configure_memory_first": "請先配置記憶設定",
"content": "內容",
"current_user": "目前使用者",
"custom": "自定義",
"default": "預設",
"default_user": "預設使用者",
"delete_confirm": "確定要刪除這條記憶嗎?",
"delete_confirm_content": "確定要刪除 {{count}} 條記憶嗎?",
"delete_confirm_single": "確定要刪除這個記憶嗎?",
"delete_confirm_title": "刪除記憶",
"delete_failed": "刪除記憶失敗",
"delete_selected": "刪除選取",
"delete_success": "記憶刪除成功",
"delete_user": "刪除使用者",
"delete_user_confirm_content": "確定要刪除使用者 {{user}} 及其所有記憶嗎?",
"delete_user_confirm_title": "刪除使用者",
"delete_user_failed": "刪除使用者失敗",
"description": "記憶功能讓您儲存和管理與助手互動的資訊。您可以新增、編輯和刪除記憶,也可以對它們進行篩選和搜尋。",
"edit_memory": "編輯記憶",
"embedding_dimensions": "嵌入維度",
"embedding_model": "嵌入模型",
"enable_global_memory_first": "請先啟用全域記憶",
"end_date": "結束日期",
"global_memory": "全域記憶",
"global_memory_description": "需要開啟助手設定中的全域記憶才能使用",
"global_memory_disabled_desc": "要使用記憶功能,請先在助手設定中啟用全域記憶。",
"global_memory_disabled_title": "全域記憶已停用",
"global_memory_enabled": "全域記憶已啟用",
"go_to_memory_page": "前往記憶頁面",
"initial_memory_content": "歡迎!這是你的第一個記憶。",
"llm_model": "LLM 模型",
"load_failed": "載入記憶失敗",
"loading": "載入記憶中...",
"loading_memories": "正在載入記憶...",
"memories_description": "顯示 {{count}} / {{total}} 條記憶",
"memories_reset_success": "{{user}} 的所有記憶已成功重置",
"memory": "個記憶",
"memory_content": "記憶內容",
"memory_placeholder": "輸入記憶內容...",
"new_user_id": "新使用者ID",
"new_user_id_placeholder": "輸入唯一的使用者ID",
"no_matching_memories": "未找到符合的記憶",
"no_memories": "暫無記憶",
"no_memories_description": "開始新增您的第一個記憶吧",
"not_configured_desc": "請在記憶設定中配置嵌入和LLM模型以啟用記憶功能。",
"not_configured_title": "記憶未配置",
"pagination_total": "第 {{start}}-{{end}} 項,共 {{total}} 項",
"please_enter_memory": "請輸入記憶內容",
"please_select_embedding_model": "請選擇一個嵌入模型",
"please_select_llm_model": "請選擇一個LLM模型",
"reset_filters": "重設篩選",
"reset_memories": "重置記憶",
"reset_memories_confirm_content": "確定要永久刪除 {{user}} 的所有記憶嗎?此操作無法復原。",
"reset_memories_confirm_title": "重置所有記憶",
"reset_memories_failed": "重置記憶失敗",
"reset_user_memories": "重置使用者記憶",
"reset_user_memories_confirm_content": "確定要重置 {{user}} 的所有記憶嗎?",
"reset_user_memories_confirm_title": "重置使用者記憶",
"reset_user_memories_failed": "重置使用者記憶失敗",
"score": "分數",
"search": "搜尋",
"search_placeholder": "搜尋記憶...",
"select_embedding_model_placeholder": "選擇嵌入模型",
"select_llm_model_placeholder": "選擇LLM模型",
"select_user": "選擇使用者",
"settings": "設定",
"settings_title": "記憶體設定",
"start_date": "開始日期",
"statistics": "統計",
"stored_memories": "儲存的記憶",
"switch_user": "切換使用者",
"switch_user_confirm": "將使用者內容切換至 {{user}}",
"time": "時間",
"title": "全域記憶",
"total_memories": "個記憶",
"try_different_filters": "嘗試調整搜尋條件",
"update_failed": "更新記憶失敗",
"update_success": "記憶更新成功",
"user": "使用者",
"user_created": "使用者 {{user}} 建立並切換成功",
"user_deleted": "使用者 {{user}} 刪除成功",
"user_id": "使用者ID",
"user_id_exists": "此使用者ID已存在",
"user_id_invalid_chars": "使用者ID只能包含字母、數字、連字符和底線",
"user_id_placeholder": "輸入使用者ID可選",
"user_id_required": "使用者ID為必填欄位",
"user_id_reserved": "'default-user' 為保留字請使用其他ID",
"user_id_rules": "使用者ID必须唯一只能包含字母、數字、連字符(-)和底線(_)",
"user_id_too_long": "使用者ID不能超過50個字元",
"user_management": "使用者管理",
"user_memories_reset": "{{user}} 的所有記憶已重置",
"user_switch_failed": "切換使用者失敗",
"user_switched": "使用者內容已切換至 {{user}}",
"users": "使用者"
},
"message": {
"agents": {
"import.error": "匯入失敗",
@ -753,13 +859,13 @@
"tools": {
"abort_failed": "工具調用中斷失敗",
"aborted": "工具調用已中斷",
"autoApproveEnabled": "此工具已啟用自動批准",
"cancelled": "已取消",
"completed": "已完成",
"error": "發生錯誤",
"invoking": "調用中",
"pending": "等待中",
"preview": "預覽",
"autoApproveEnabled": "此工具已啟用自動批准",
"raw": "原始碼"
},
"topic.added": "新話題已新增",
@ -785,9 +891,9 @@
"goBack": "上一頁",
"goForward": "下一頁",
"minimize": "最小化小工具",
"openExternal": "在瀏覽器中開啟",
"open_link_external_off": "当前:使用預設視窗開啟連結",
"open_link_external_on": "当前:在瀏覽器中開啟連結",
"openExternal": "在瀏覽器中開啟",
"refresh": "重新整理",
"rightclick_copyurl": "右鍵複製 URL"
},
@ -1323,9 +1429,9 @@
},
"settings": {
"about": "關於與回饋",
"about.checkingUpdate": "正在檢查更新...",
"about.checkUpdate": "檢查更新",
"about.checkUpdate.available": "立即更新",
"about.checkingUpdate": "正在檢查更新...",
"about.contact.button": "電子郵件",
"about.contact.title": "聯絡方式",
"about.debug.open": "開啟",
@ -1653,6 +1759,10 @@
"backup.manager.title": "備份數據管理",
"backup.modal.filename.placeholder": "請輸入備份文件名",
"backup.modal.title": "備份到 WebDAV",
"disableStream": {
"help": "開啟後,將檔案載入到記憶體中再上傳,可解決部分 WebDAV 服務不相容 chunked 上傳的問題,但會增加記憶體佔用。",
"title": "禁用串流上傳"
},
"host": "WebDAV 主機位址",
"host.placeholder": "http://localhost:8080",
"hour_interval_one": "{{count}} 小時",
@ -1673,11 +1783,7 @@
"syncError": "備份錯誤",
"syncStatus": "備份狀態",
"title": "WebDAV",
"user": "WebDAV 使用者名稱",
"disableStream": {
"title": "禁用串流上傳",
"help": "開啟後,將檔案載入到記憶體中再上傳,可解決部分 WebDAV 服務不相容 chunked 上傳的問題,但會增加記憶體佔用。"
}
"user": "WebDAV 使用者名稱"
},
"yuque": {
"check": {
@ -1764,23 +1870,24 @@
"addServer.create": "快速創建",
"addServer.importFrom": "從 JSON 導入",
"addServer.importFrom.connectionFailed": "連線失敗",
"addServer.importFrom.invalid": "無效的輸入,請檢查 JSON 格式",
"addServer.importFrom.nameExists": "伺服器已存在:{{name}}",
"addServer.importFrom.oneServer": "每次只能保存一個 MCP 伺服器配置",
"addServer.importFrom.method": "導入方式",
"addServer.importFrom.dxt": "導入 DXT 包",
"addServer.importFrom.dxtFile": "DXT 包文件",
"addServer.importFrom.dxtHelp": "選擇包含 MCP 服務器的 .dxt 文件",
"addServer.importFrom.selectDxtFile": "選擇 DXT 文件",
"addServer.importFrom.noDxtFile": "請選擇一個 DXT 文件",
"addServer.importFrom.dxtProcessFailed": "處理 DXT 文件失敗",
"addServer.importFrom.dxt": "導入 DXT 包",
"addServer.importFrom.invalid": "無效的輸入,請檢查 JSON 格式",
"addServer.importFrom.method": "導入方式",
"addServer.importFrom.nameExists": "伺服器已存在:{{name}}",
"addServer.importFrom.noDxtFile": "請選擇一個 DXT 文件",
"addServer.importFrom.oneServer": "每次只能保存一個 MCP 伺服器配置",
"addServer.importFrom.placeholder": "貼上 MCP 伺服器 JSON 設定",
"addServer.importFrom.selectDxtFile": "[to be translated]:选择 DXT 文件",
"addServer.importFrom.tooltip": "請從 MCP Servers 的介紹頁面複製配置 JSON優先使用\n NPX 或 UVX 配置),並粘貼到輸入框中",
"addSuccess": "伺服器新增成功",
"advancedSettings": "高級設定",
"args": "參數",
"argsTooltip": "每個參數佔一行",
"baseUrlTooltip": "遠端 URL 地址",
"builtinServers": "內置伺服器",
"command": "指令",
"config_description": "設定模型上下文協議伺服器",
"customRegistryPlaceholder": "請輸入私有倉庫位址,如: https://npm.company.com",
@ -1817,6 +1924,17 @@
"jsonSaveSuccess": "JSON 配置已儲存",
"logoUrl": "標誌網址",
"missingDependencies": "缺失,請安裝它以繼續",
"more": {
"awesome": "精選的 MCP 伺服器清單",
"composio": "Composio MCP 開發工具",
"glama": "Glama MCP 伺服器目錄",
"higress": "Higress MCP 伺服器",
"mcpso": "MCP 伺服器發現平台",
"modelscope": "魔搭社區 MCP 伺服器",
"official": "官方 MCP 伺服器集合",
"pulsemcp": "Pulse MCP 伺服器",
"smithery": "Smithery MCP 工具"
},
"name": "名稱",
"newServer": "MCP 伺服器",
"noDescriptionAvailable": "描述不存在",
@ -1849,6 +1967,7 @@
"registry": "套件管理源",
"registryDefault": "預設",
"registryTooltip": "選擇用於安裝套件的源,以解決預設源的網路問題",
"requiresConfig": "需要配置",
"resources": {
"availableResources": "可用資源",
"blob": "二進位數據",
@ -1896,17 +2015,17 @@
"timeoutTooltip": "對該伺服器請求的超時時間(秒),預設為 60 秒",
"title": "MCP 設定",
"tools": {
"autoApprove": "自動批准",
"autoApprove.tooltip.confirm": "是否運行該MCP工具",
"autoApprove.tooltip.disabled": "工具運行前需要手動批准",
"autoApprove.tooltip.enabled": "工具將自動運行而無需批准",
"autoApprove.tooltip.howToEnable": "啟用工具後才能使用自動批准",
"availableTools": "可用工具",
"enable": "啟用工具",
"inputSchema": "輸入模式",
"inputSchema.enum.allowedValues": "允許的值",
"loadError": "獲取工具失敗",
"noToolsAvailable": "無可用工具",
"enable": "啟用工具",
"autoApprove": "自動批准",
"autoApprove.tooltip.howToEnable": "啟用工具後才能使用自動批准",
"autoApprove.tooltip.enabled": "工具將自動運行而無需批准",
"autoApprove.tooltip.disabled": "工具運行前需要手動批准",
"autoApprove.tooltip.confirm": "是否運行該MCP工具",
"run": "運行"
},
"type": "類型",
@ -1919,20 +2038,7 @@
"updateError": "更新伺服器失敗",
"updateSuccess": "伺服器更新成功",
"url": "URL",
"user": "用戶",
"requiresConfig": "需要配置",
"builtinServers": "內置伺服器",
"more": {
"modelscope": "魔搭社區 MCP 伺服器",
"higress": "Higress MCP 伺服器",
"mcpso": "MCP 伺服器發現平台",
"smithery": "Smithery MCP 工具",
"glama": "Glama MCP 伺服器目錄",
"pulsemcp": "Pulse MCP 伺服器",
"composio": "Composio MCP 開發工具",
"official": "官方 MCP 伺服器集合",
"awesome": "精選的 MCP 伺服器清單"
}
"user": "用戶"
},
"messages.divider": "訊息間顯示分隔線",
"messages.divider.tooltip": "不適用於氣泡樣式消息",
@ -2126,6 +2232,7 @@
"api_key": "API 金鑰",
"api_key.tip": "多個金鑰使用逗號或空格分隔",
"api_version": "API 版本",
"azure.apiversion.tip": "Azure OpenAI 的 API 版本,如果想要使用 Response API請輸入 preview 版本",
"basic_auth": "HTTP 認證",
"basic_auth.password": "密碼",
"basic_auth.password.tip": "",
@ -2222,17 +2329,16 @@
"private_key_placeholder": "輸入服務帳戶私密金鑰",
"title": "服務帳戶設定"
}
},
"azure.apiversion.tip": "Azure OpenAI 的 API 版本,如果想要使用 Response API請輸入 preview 版本"
}
},
"proxy": {
"address": "代理伺服器位址",
"mode": {
"custom": "自訂代理伺服器",
"none": "不使用代理伺服器",
"system": "系統代理伺服器",
"title": "代理伺服器模式"
},
"address": "代理伺服器位址"
}
},
"quickAssistant": {
"click_tray_to_show": "點選工具列圖示啟動",
@ -2455,115 +2561,9 @@
},
"words": {
"knowledgeGraph": "知識圖譜",
"quit": "結束",
"quit": "[to be translated]:退出",
"show_window": "顯示視窗",
"visualization": "視覺化"
},
"memory": {
"title": "全域記憶",
"add_memory": "新增記憶",
"edit_memory": "編輯記憶",
"memory_content": "記憶內容",
"please_enter_memory": "請輸入記憶內容",
"memory_placeholder": "輸入記憶內容...",
"user_id": "使用者ID",
"user_id_placeholder": "輸入使用者ID可選",
"load_failed": "載入記憶失敗",
"add_success": "記憶新增成功",
"add_failed": "新增記憶失敗",
"update_success": "記憶更新成功",
"update_failed": "更新記憶失敗",
"delete_success": "記憶刪除成功",
"delete_failed": "刪除記憶失敗",
"delete_confirm_title": "刪除記憶",
"delete_confirm_content": "確定要刪除 {{count}} 條記憶嗎?",
"delete_confirm": "確定要刪除這條記憶嗎?",
"time": "時間",
"user": "使用者",
"content": "內容",
"score": "分數",
"memories_description": "顯示 {{count}} / {{total}} 條記憶",
"search_placeholder": "搜尋記憶...",
"start_date": "開始日期",
"end_date": "結束日期",
"all_users": "所有使用者",
"users": "使用者",
"delete_selected": "刪除選取",
"reset_filters": "重設篩選",
"pagination_total": "第 {{start}}-{{end}} 項,共 {{total}} 項",
"current_user": "目前使用者",
"select_user": "選擇使用者",
"default_user": "預設使用者",
"switch_user": "切換使用者",
"user_switched": "使用者內容已切換至 {{user}}",
"switch_user_confirm": "將使用者內容切換至 {{user}}",
"add_user": "新增使用者",
"add_new_user": "新增新使用者",
"new_user_id": "新使用者ID",
"new_user_id_placeholder": "輸入唯一的使用者ID",
"user_id_required": "使用者ID為必填欄位",
"user_id_reserved": "'default-user' 為保留字請使用其他ID",
"user_id_exists": "此使用者ID已存在",
"user_id_too_long": "使用者ID不能超過50個字元",
"user_id_invalid_chars": "使用者ID只能包含字母、數字、連字符和底線",
"user_id_rules": "使用者ID必须唯一只能包含字母、數字、連字符(-)和底線(_)",
"user_created": "使用者 {{user}} 建立並切換成功",
"add_user_failed": "新增使用者失敗",
"memory": "個記憶",
"reset_user_memories": "重置使用者記憶",
"reset_memories": "重置記憶",
"delete_user": "刪除使用者",
"loading_memories": "正在載入記憶...",
"no_memories": "暫無記憶",
"no_matching_memories": "未找到符合的記憶",
"no_memories_description": "開始新增您的第一個記憶吧",
"try_different_filters": "嘗試調整搜尋條件",
"add_first_memory": "新增您的第一個記憶",
"user_switch_failed": "切換使用者失敗",
"cannot_delete_default_user": "不能刪除預設使用者",
"delete_user_confirm_title": "刪除使用者",
"delete_user_confirm_content": "確定要刪除使用者 {{user}} 及其所有記憶嗎?",
"user_deleted": "使用者 {{user}} 刪除成功",
"delete_user_failed": "刪除使用者失敗",
"reset_user_memories_confirm_title": "重置使用者記憶",
"reset_user_memories_confirm_content": "確定要重置 {{user}} 的所有記憶嗎?",
"user_memories_reset": "{{user}} 的所有記憶已重置",
"reset_user_memories_failed": "重置使用者記憶失敗",
"reset_memories_confirm_title": "重置所有記憶",
"reset_memories_confirm_content": "確定要永久刪除 {{user}} 的所有記憶嗎?此操作無法復原。",
"memories_reset_success": "{{user}} 的所有記憶已成功重置",
"reset_memories_failed": "重置記憶失敗",
"delete_confirm_single": "確定要刪除這個記憶嗎?",
"total_memories": "個記憶",
"default": "預設",
"custom": "自定義",
"description": "記憶功能讓您儲存和管理與助手互動的資訊。您可以新增、編輯和刪除記憶,也可以對它們進行篩選和搜尋。",
"global_memory_enabled": "全域記憶已啟用",
"global_memory": "全域記憶",
"enable_global_memory_first": "請先啟用全域記憶",
"configure_memory_first": "請先配置記憶設定",
"global_memory_disabled_title": "全域記憶已停用",
"global_memory_disabled_desc": "要使用記憶功能,請先在助手設定中啟用全域記憶。",
"not_configured_title": "記憶未配置",
"not_configured_desc": "請在記憶設定中配置嵌入和LLM模型以啟用記憶功能。",
"go_to_memory_page": "前往記憶頁面",
"settings": "設定",
"statistics": "統計",
"search": "搜尋",
"actions": "操作",
"user_management": "使用者管理",
"initial_memory_content": "歡迎!這是你的第一個記憶。",
"loading": "載入記憶中...",
"settings_title": "記憶體設定",
"llm_model": "LLM 模型",
"please_select_llm_model": "請選擇一個LLM模型",
"select_llm_model_placeholder": "選擇LLM模型",
"embedding_model": "嵌入模型",
"please_select_embedding_model": "請選擇一個嵌入模型",
"select_embedding_model_placeholder": "選擇嵌入模型",
"embedding_dimensions": "嵌入維度",
"stored_memories": "儲存的記憶",
"global_memory_description": "需要開啟助手設定中的全域記憶才能使用"
}
}
}

View File

@ -6,12 +6,14 @@
"src/preload/**/*",
"src/main/env.d.ts",
"src/renderer/src/types/*",
"packages/shared/**/*"
"packages/shared/**/*",
"scripts"
],
"compilerOptions": {
"composite": true,
"types": [
"electron-vite/node"
"electron-vite/node",
"vitest/globals"
],
"baseUrl": ".",
"paths": {

View File

@ -35,6 +35,15 @@ export default defineConfig({
setupFiles: ['@vitest/web-worker', 'tests/renderer.setup.ts'],
include: ['src/renderer/**/*.{test,spec}.{ts,tsx}', 'src/renderer/**/__tests__/**/*.{test,spec}.{ts,tsx}']
}
},
// 脚本单元测试配置
{
extends: true,
test: {
name: 'scripts',
environment: 'node',
include: ['scripts/**/*.{test,spec}.{ts,tsx}', 'scripts/**/__tests__/**/*.{test,spec}.{ts,tsx}']
}
}
],
// 全局共享配置

View File

@ -6977,6 +6977,7 @@ __metadata:
pdfjs-dist: "npm:4.10.38"
playwright: "npm:^1.52.0"
prettier: "npm:^3.5.3"
prettier-plugin-sort-json: "npm:^4.1.1"
proxy-agent: "npm:^6.5.0"
rc-virtual-list: "npm:^3.18.6"
react: "npm:^19.0.0"
@ -16305,6 +16306,15 @@ __metadata:
languageName: node
linkType: hard
"prettier-plugin-sort-json@npm:^4.1.1":
version: 4.1.1
resolution: "prettier-plugin-sort-json@npm:4.1.1"
peerDependencies:
prettier: ^3.0.0
checksum: 10c0/b3b86ea679e95d0329c367aa860af4033d8a3b83a0656d7393f2005b2df78e20d19fbe2c40fe7b531262210e40060318a4287459c2a4f61c6a6bd1c2757e2b7d
languageName: node
linkType: hard
"prettier@npm:^3.5.3":
version: 3.5.3
resolution: "prettier@npm:3.5.3"