mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 07:03:53 +08:00
@@ -213,4 +213,19 @@ public interface ErrorCode {
|
||||
int RAG_API_ERROR_API_KEY_NULL = 10172; // RAG配置中api_key为空,请完善配置
|
||||
int RAG_API_ERROR_API_KEY_INVALID = 10173; // RAG配置中api_key包含占位符,请替换为实际的API密钥
|
||||
int RAG_API_ERROR_URL_INVALID = 10174; // RAG配置中base_url格式不正确,请检查协议是否正确
|
||||
int RAG_DATASET_ID_NOT_NULL = 10176; // RAG配置中dataset_id不能为空
|
||||
int RAG_MODEL_ID_NOT_NULL = 10177; // RAG配置中model_id不能为空
|
||||
int RAG_DATASET_ID_AND_MODEL_ID_NOT_NULL = 10178; // RAG配置中dataset_id和model_id不能为空
|
||||
int RAG_FILE_NAME_NOT_NULL = 10179; // 文件名称不能为空
|
||||
int RAG_FILE_CONTENT_EMPTY = 10180; // 文件内容不能为空
|
||||
|
||||
// 设备相关错误码(补充)
|
||||
int MCA_NOT_NULL = 10175; // mac地址不能为空
|
||||
|
||||
// 音色克隆(补充)
|
||||
int VOICE_CLONE_NAME_NOT_NULL = 10181; // 音色克隆名称不能为空
|
||||
int VOICE_CLONE_AUDIO_NOT_FOUND = 10182; // 音色克隆音频不存在
|
||||
|
||||
// 智能体模板相关错误码(补充)
|
||||
int AGENT_TEMPLATE_NOT_FOUND = 10183; // 默认智能体未找到
|
||||
}
|
||||
|
||||
+2
-2
@@ -139,14 +139,14 @@ public class AgentChatHistoryController {
|
||||
// 从Redis获取agentId和sessionId
|
||||
String agentSessionInfo = (String) redisUtils.get(RedisKeys.getChatHistoryKey(uuid));
|
||||
if (StringUtils.isBlank(agentSessionInfo)) {
|
||||
throw new RenException("下载链接已过期或无效");
|
||||
throw new RenException(ErrorCode.DOWNLOAD_LINK_EXPIRED);
|
||||
}
|
||||
|
||||
try {
|
||||
// 解析agentId和sessionId
|
||||
String[] parts = agentSessionInfo.split(":");
|
||||
if (parts.length != 2) {
|
||||
throw new RenException("下载链接无效");
|
||||
throw new RenException(ErrorCode.DOWNLOAD_LINK_INVALID);
|
||||
}
|
||||
String agentId = parts[0];
|
||||
String sessionId = parts[1];
|
||||
|
||||
+3
-3
@@ -73,7 +73,7 @@ public class ConfigServiceImpl implements ConfigService {
|
||||
// 查询默认智能体
|
||||
AgentTemplateEntity agent = agentTemplateService.getDefaultTemplate();
|
||||
if (agent == null) {
|
||||
throw new RenException("默认智能体未找到");
|
||||
throw new RenException(ErrorCode.AGENT_TEMPLATE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 构建模块配置
|
||||
@@ -111,13 +111,13 @@ public class ConfigServiceImpl implements ConfigService {
|
||||
if (StringUtils.isNotBlank(cachedCode)) {
|
||||
throw new RenException(ErrorCode.OTA_DEVICE_NEED_BIND, cachedCode);
|
||||
}
|
||||
throw new RenException(ErrorCode.OTA_DEVICE_NOT_FOUND, "not found device");
|
||||
throw new RenException(ErrorCode.OTA_DEVICE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 获取智能体信息
|
||||
AgentEntity agent = agentService.getAgentById(device.getAgentId());
|
||||
if (agent == null) {
|
||||
throw new RenException("智能体未找到");
|
||||
throw new RenException(ErrorCode.AGENT_NOT_FOUND);
|
||||
}
|
||||
// 获取音色信息
|
||||
String voice = null;
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ public class DeviceController {
|
||||
public Result<String> registerDevice(@RequestBody DeviceRegisterDTO deviceRegisterDTO) {
|
||||
String macAddress = deviceRegisterDTO.getMacAddress();
|
||||
if (StringUtils.isBlank(macAddress)) {
|
||||
return new Result<String>().error(ErrorCode.NOT_NULL, "mac地址不能为空");
|
||||
return new Result<String>().error(ErrorCode.MCA_NOT_NULL);
|
||||
}
|
||||
// 生成六位验证码
|
||||
String code = String.valueOf(Math.random()).substring(2, 8);
|
||||
|
||||
+21
-24
@@ -356,7 +356,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
@Override
|
||||
public Map<String, Object> getRAGConfigByDatasetId(String datasetId) {
|
||||
if (StringUtils.isBlank(datasetId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "datasetId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
// 根据datasetId查询知识库信息
|
||||
@@ -370,7 +370,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
String ragModelId = knowledgeBase.getRagModelId();
|
||||
if (StringUtils.isBlank(ragModelId)) {
|
||||
log.warn("知识库datasetId为{}未配置ragModelId", datasetId);
|
||||
throw new RenException(ErrorCode.RAG_CONFIG_NOT_FOUND, "知识库未配置RAG模型");
|
||||
throw new RenException(ErrorCode.RAG_CONFIG_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 获取并返回RAG配置
|
||||
@@ -403,7 +403,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
*/
|
||||
private void validateRagConfig(Map<String, Object> config) {
|
||||
if (config == null) {
|
||||
throw new RenException(ErrorCode.RAG_CONFIG_NOT_FOUND, "RAG配置为空,请检查配置");
|
||||
throw new RenException(ErrorCode.RAG_CONFIG_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 从配置中提取必要的参数
|
||||
@@ -510,8 +510,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
}
|
||||
} else {
|
||||
// 如果响应码不为0,说明API调用失败
|
||||
String errorMessage = "RAGFlow API调用失败,响应码: " + code + ", 消息: "
|
||||
+ (message != null ? message : "未知错误");
|
||||
String errorMessage = code + (message != null ? message : "null");
|
||||
log.error(errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
}
|
||||
@@ -520,19 +519,19 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
log.debug("完整响应内容: {}", responseBody);
|
||||
} catch (IOException e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应时发生IO异常";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API响应解析失败: " + errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
} catch (Exception e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应失败";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
// 如果解析失败,但响应体不为空,尝试直接使用响应体作为错误信息
|
||||
String finalErrorMessage = responseBody;
|
||||
if (e.getMessage() != null) {
|
||||
finalErrorMessage += ",解析错误: " + errorMessage;
|
||||
finalErrorMessage += errorMessage;
|
||||
}
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, finalErrorMessage);
|
||||
}
|
||||
@@ -540,7 +539,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
|
||||
if (StringUtils.isBlank(datasetId)) {
|
||||
log.error("无法从RAGFlow API响应中获取datasetId,响应内容: {}", responseBody);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API响应中未包含datasetId");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_NOT_NULL);
|
||||
}
|
||||
log.info("RAGFlow数据集创建成功,datasetId: {}", datasetId);
|
||||
|
||||
@@ -607,26 +606,25 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
String message = (String) responseMap.get("message");
|
||||
|
||||
if (code != null && code != 0) {
|
||||
String errorMessage = "RAGFlow API调用失败,响应码: " + code + ", 消息: "
|
||||
+ (message != null ? message : "未知错误");
|
||||
String errorMessage = code + (message != null ? message : "null");
|
||||
log.error(errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应时发生IO异常";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API响应解析失败: " + errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
} catch (Exception e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应失败";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
// 如果解析失败,但响应体不为空,尝试直接使用响应体作为错误信息
|
||||
String finalErrorMessage = responseBody;
|
||||
if (e.getMessage() != null) {
|
||||
finalErrorMessage += ",解析错误: " + errorMessage;
|
||||
finalErrorMessage += errorMessage;
|
||||
}
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, finalErrorMessage);
|
||||
}
|
||||
@@ -677,7 +675,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
log.debug("RAGFlow API响应内容: {}", response.getBody());
|
||||
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
String errorMessage = response.getStatusCode() + ", 响应内容: " + response.getBody();
|
||||
String errorMessage = response.getStatusCode() + response.getBody();
|
||||
log.error(errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
}
|
||||
@@ -691,26 +689,25 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
String message = (String) responseMap.get("message");
|
||||
|
||||
if (code != null && code != 0) {
|
||||
String errorMessage = "RAGFlow API调用失败,响应码: " + code + ", 消息: "
|
||||
+ (message != null ? message : "未知错误");
|
||||
String errorMessage = code + (message != null ? message : "null");
|
||||
log.error(errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应时发生IO异常";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API响应解析失败: " + errorMessage);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
} catch (Exception e) {
|
||||
// 构建详细的错误信息,包含异常类型和消息
|
||||
String baseErrorMessage = e.getClass().getSimpleName() + " - 解析RAGFlow API响应失败";
|
||||
String baseErrorMessage = e.getClass().getSimpleName();
|
||||
String errorMessage = baseErrorMessage + (e.getMessage() != null ? ": " + e.getMessage() : "");
|
||||
log.error(errorMessage, e);
|
||||
// 如果解析失败,但响应体不为空,尝试直接使用响应体作为错误信息
|
||||
String finalErrorMessage = responseBody;
|
||||
if (e.getMessage() != null) {
|
||||
finalErrorMessage += ",解析错误: " + errorMessage;
|
||||
finalErrorMessage += errorMessage;
|
||||
}
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, finalErrorMessage);
|
||||
}
|
||||
@@ -725,7 +722,7 @@ public class KnowledgeBaseServiceImpl extends BaseServiceImpl<KnowledgeBaseDao,
|
||||
*/
|
||||
private Map<String, Object> getValidatedRAGConfig(String ragModelId) {
|
||||
if (StringUtils.isBlank(ragModelId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "ragModelId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_MODEL_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
Map<String, Object> ragConfig = getRAGConfig(ragModelId);
|
||||
|
||||
+44
-36
@@ -63,7 +63,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
// 构建请求URL - 根据RAGFlow API文档,获取文档列表的接口
|
||||
String datasetId = knowledgeFilesDTO != null ? knowledgeFilesDTO.getDatasetId() : null;
|
||||
if (StringUtils.isBlank(datasetId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "datasetId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
// 获取RAG配置
|
||||
@@ -109,7 +109,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode().toString());
|
||||
}
|
||||
|
||||
String responseBody = response.getBody();
|
||||
@@ -133,7 +133,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取文档列表失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -229,7 +229,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取文档列表响应失败: {}", e.getMessage(), e);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "获取文档列表响应失败: " + e.getMessage());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
@Override
|
||||
public KnowledgeFilesDTO getByDocumentId(String documentId, String datasetId) {
|
||||
if (StringUtils.isBlank(documentId) || StringUtils.isBlank(datasetId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "documentId和datasetId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_AND_MODEL_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
log.info("=== 开始根据documentId获取文档 ===");
|
||||
@@ -475,8 +475,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
String responseBody = response.getBody();
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() +
|
||||
", 响应内容: " + (responseBody != null ? responseBody : "无响应内容"));
|
||||
response.getStatusCode() + (responseBody != null ? responseBody : "null"));
|
||||
}
|
||||
|
||||
String responseBody = response.getBody();
|
||||
@@ -507,7 +506,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("根据documentId获取文档失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -521,7 +520,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
public PageData<KnowledgeFilesDTO> getPageListByStatus(String datasetId, Integer status, Integer page,
|
||||
Integer limit) {
|
||||
if (StringUtils.isBlank(datasetId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "datasetId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
log.info("=== 开始根据状态查询文档列表 ===");
|
||||
@@ -568,7 +567,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode().toString());
|
||||
}
|
||||
|
||||
String responseBody = response.getBody();
|
||||
@@ -600,12 +599,12 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
return pageData;
|
||||
} else {
|
||||
log.error("RAGFlow API调用失败,响应码: {}", code);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAGFlow API调用失败,响应码: " + code);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, code.toString());
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("根据状态查询文档列表失败: {}", e.getMessage(), e);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "查询文档列表失败: " + e.getMessage());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, e.getMessage());
|
||||
} finally {
|
||||
log.info("=== 根据状态查询文档列表操作结束 ===");
|
||||
}
|
||||
@@ -635,12 +634,12 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
// 检查文件基本信息
|
||||
if (StringUtils.isBlank(fileName)) {
|
||||
log.error("文件名为空");
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "文件名不能为空");
|
||||
throw new RenException(ErrorCode.RAG_FILE_NAME_NOT_NULL);
|
||||
}
|
||||
|
||||
if (fileSize == 0) {
|
||||
log.error("文件大小为0");
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "文件内容为空");
|
||||
throw new RenException(ErrorCode.RAG_FILE_CONTENT_EMPTY);
|
||||
}
|
||||
|
||||
log.info("2. 开始流式上传到RAGFlow");
|
||||
@@ -676,7 +675,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
@Override
|
||||
public void deleteByDocumentId(String documentId, String datasetId) {
|
||||
if (StringUtils.isBlank(documentId) || StringUtils.isBlank(datasetId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "documentId和datasetId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_AND_MODEL_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
log.info("=== 开始根据documentId删除文档 ===");
|
||||
@@ -691,7 +690,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("删除文档失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -763,7 +762,22 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
// 验证base_url是否存在且非空
|
||||
if (StringUtils.isBlank(baseUrl)) {
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, "RAG配置缺少必要参数: base_url");
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR_URL_NULL);
|
||||
}
|
||||
|
||||
// 验证api_key是否存在且非空
|
||||
if (StringUtils.isBlank(apiKey)) {
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR_API_KEY_NULL);
|
||||
}
|
||||
|
||||
// 检查api_key是否包含占位符
|
||||
if (apiKey.contains("你")) {
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR_API_KEY_INVALID);
|
||||
}
|
||||
|
||||
// 验证base_url格式
|
||||
if (!baseUrl.startsWith("http://") && !baseUrl.startsWith("https://")) {
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR_URL_INVALID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -876,9 +890,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
}
|
||||
} else {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() +
|
||||
", 响应内容: " + (responseBody != null ? responseBody : "无响应内容"));
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode().toString());
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(documentId)) {
|
||||
@@ -890,7 +902,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("RAGFlow API调用失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -1027,13 +1039,12 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
} else {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() +
|
||||
", 响应内容: " + (responseBody != null ? responseBody : "无响应内容"));
|
||||
response.getStatusCode() + (responseBody != null ? responseBody : "null"));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("RAGFlow API调用失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -1082,7 +1093,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
@Override
|
||||
public boolean parseDocuments(String datasetId, List<String> documentIds) {
|
||||
if (StringUtils.isBlank(datasetId) || documentIds == null || documentIds.isEmpty()) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "datasetId和documentIds不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_AND_MODEL_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
log.info("=== 开始解析文档(切块) ===");
|
||||
@@ -1122,8 +1133,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
String errorDetail = responseBody != null ? responseBody : "无响应内容";
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() + ", 响应内容: " + errorDetail);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode() + errorDetail);
|
||||
}
|
||||
|
||||
// 解析响应
|
||||
@@ -1143,7 +1153,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("解析文档失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -1157,7 +1167,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
public Map<String, Object> listChunks(String datasetId, String documentId, String keywords,
|
||||
Integer page, Integer pageSize, String chunkId) {
|
||||
if (StringUtils.isBlank(datasetId) || StringUtils.isBlank(documentId)) {
|
||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR, "datasetId和documentId不能为空");
|
||||
throw new RenException(ErrorCode.RAG_DATASET_ID_AND_MODEL_ID_NOT_NULL);
|
||||
}
|
||||
|
||||
log.info("=== 开始列出切片 ===");
|
||||
@@ -1220,8 +1230,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
String errorDetail = responseBody != null ? responseBody : "无响应内容";
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() + ", 响应内容: " + errorDetail);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode() + errorDetail);
|
||||
}
|
||||
|
||||
// 解析响应
|
||||
@@ -1243,11 +1252,11 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("解析RAGFlow API响应失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, errorMessage);
|
||||
} catch (Exception e) {
|
||||
log.error("列出切片失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
@@ -1646,8 +1655,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
log.error("RAGFlow API调用失败,状态码: {}", response.getStatusCode());
|
||||
String errorDetail = responseBody != null ? responseBody : "无响应内容";
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR,
|
||||
"RAGFlow API调用失败,HTTP状态码: " + response.getStatusCode() + ", 响应内容: " + errorDetail);
|
||||
throw new RenException(ErrorCode.RAG_API_ERROR, response.getStatusCode() + errorDetail);
|
||||
}
|
||||
|
||||
// 解析响应
|
||||
@@ -1674,7 +1682,7 @@ public class KnowledgeFilesServiceImpl implements KnowledgeFilesService {
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("召回测试失败: {}", e.getMessage(), e);
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "未知错误";
|
||||
String errorMessage = e.getMessage() != null ? e.getMessage() : "null";
|
||||
if (e instanceof RenException) {
|
||||
throw (RenException) e;
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
converter.setObjectMapper(mapper);
|
||||
return converter;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 国际化配置 - 根据请求头中的Accept-Language设置语言环境
|
||||
*/
|
||||
@@ -113,14 +113,14 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
if (acceptLanguage == null || acceptLanguage.isEmpty()) {
|
||||
return Locale.getDefault();
|
||||
}
|
||||
|
||||
|
||||
// 解析Accept-Language请求头中的首选语言
|
||||
String[] languages = acceptLanguage.split(",");
|
||||
if (languages.length > 0) {
|
||||
// 提取第一个语言代码,去除可能的质量值(q=...)
|
||||
String[] parts = languages[0].split(";" + "\\s*");
|
||||
String primaryLanguage = parts[0].trim();
|
||||
|
||||
|
||||
// 根据前端发送的语言代码直接创建Locale对象
|
||||
if (primaryLanguage.equals("zh-CN")) {
|
||||
return Locale.SIMPLIFIED_CHINESE;
|
||||
@@ -128,15 +128,25 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
return Locale.TRADITIONAL_CHINESE;
|
||||
} else if (primaryLanguage.equals("en-US")) {
|
||||
return Locale.US;
|
||||
} else if (primaryLanguage.equals("de-DE")) {
|
||||
return Locale.GERMANY;
|
||||
} else if (primaryLanguage.equals("vi-VN")) {
|
||||
return Locale.forLanguageTag("vi-VN");
|
||||
} else if (primaryLanguage.startsWith("zh")) {
|
||||
// 对于其他中文变体,默认使用简体中文
|
||||
return Locale.SIMPLIFIED_CHINESE;
|
||||
} else if (primaryLanguage.startsWith("en")) {
|
||||
// 对于其他英文变体,默认使用美式英语
|
||||
return Locale.US;
|
||||
} else if (primaryLanguage.startsWith("de")) {
|
||||
// 对于其他德语变体,默认使用德语
|
||||
return Locale.GERMANY;
|
||||
} else if (primaryLanguage.startsWith("vi")) {
|
||||
// 对于其他越南语变体,默认使用越南语
|
||||
return Locale.forLanguageTag("vi-VN");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 如果没有匹配的语言,使用默认语言
|
||||
return Locale.getDefault();
|
||||
}
|
||||
|
||||
+5
-5
@@ -107,10 +107,10 @@ public class VoiceCloneController {
|
||||
String name = params.get("name");
|
||||
|
||||
if (id == null || id.isEmpty()) {
|
||||
return new Result<String>().error(ErrorCode.IDENTIFIER_NOT_NULL, "唯一标识不能为空");
|
||||
return new Result<String>().error(ErrorCode.IDENTIFIER_NOT_NULL);
|
||||
}
|
||||
if (name == null) {
|
||||
return new Result<String>().error(ErrorCode.NOT_NULL, "名称不能为空");
|
||||
if (name == null || name.isEmpty()) {
|
||||
return new Result<String>().error(ErrorCode.VOICE_CLONE_NAME_NOT_NULL);
|
||||
}
|
||||
// 检查权限
|
||||
checkPermission(id);
|
||||
@@ -119,7 +119,7 @@ public class VoiceCloneController {
|
||||
redisUtils.delete(RedisKeys.getTimbreNameById(id));
|
||||
return new Result<String>();
|
||||
} catch (Exception e) {
|
||||
return new Result<String>().error(ErrorCode.UPDATE_DATA_FAILED, "更新失败: " + e.getMessage());
|
||||
return new Result<String>().error(ErrorCode.UPDATE_DATA_FAILED, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public class VoiceCloneController {
|
||||
checkPermission(id);
|
||||
byte[] audioData = voiceCloneService.getVoiceData(id);
|
||||
if (audioData == null) {
|
||||
return new Result<String>().error(ErrorCode.RESOURCE_NOT_FOUND, "音频不存在");
|
||||
return new Result<String>().error(ErrorCode.VOICE_CLONE_AUDIO_NOT_FOUND);
|
||||
}
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
redisUtils.set(RedisKeys.getVoiceCloneAudioIdKey(uuid), id);
|
||||
|
||||
+1
-1
@@ -100,7 +100,7 @@ public class VoiceCloneServiceImpl extends BaseServiceImpl<VoiceCloneDao, VoiceC
|
||||
wrapper.eq("model_id", dto.getModelId());
|
||||
Long count = baseDao.selectCount(wrapper);
|
||||
if (count > 0) {
|
||||
throw new RenException(ErrorCode.VOICE_ID_ALREADY_EXISTS, "音色ID " + voiceId + " 已存在");
|
||||
throw new RenException(ErrorCode.VOICE_ID_ALREADY_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -160,11 +160,11 @@
|
||||
10151=\u8BF7\u5148\u4E0A\u4F20\u97F3\u9891\u6587\u4EF6
|
||||
10152=\u6A21\u578B\u914D\u7F6E\u672A\u627E\u5230
|
||||
10153=\u6A21\u578B\u7C7B\u578B\u672A\u627E\u5230
|
||||
10154=\u8BAD\u7EC3\u5931\u8D25
|
||||
10154=\u8BAD\u7EC3\u5931\u8D25: {0}
|
||||
10155=\u706B\u5C71\u5F15\u64CE\u7F3A\u5C11\u914D\u7F6E
|
||||
10156=\u54CD\u5E94\u683C\u5F0F\u9519\u8BEF\uFF0C\u7F3A\u5C11BaseResp\u5B57\u6BB5
|
||||
10157=\u8BF7\u6C42\u5931\u8D25
|
||||
10158=\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801{0}
|
||||
10158=\u514B\u9686\u97F3\u8272:
|
||||
10159=\u97F3\u8272ID\u5DF2\u5B58\u5728
|
||||
10160=\u706B\u5C71\u5F15\u64CE\u97F3\u8272ID\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5S_\u5F00\u5934
|
||||
10161=Mac\u5730\u5740\u5DF2\u5B58\u5728
|
||||
@@ -173,7 +173,20 @@
|
||||
10164=RAG\u914D\u7F6E\u672A\u627E\u5230
|
||||
10165=RAG\u914D\u7F6E\u7C7B\u578B\u9519\u8BEF
|
||||
10166=\u9ED8\u8BA4RAG\u914D\u7F6E\u672A\u627E\u5230
|
||||
10167=\u0052\u0041\u0047\u8c03\u7528\u5931\u8d25\uFF0C{0}
|
||||
10167=RAG\u8C03\u7528\u5931\u8D25\uFF0C{0}
|
||||
10168=\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25
|
||||
10169=\u60A8\u6CA1\u6709\u6743\u9650\u64CD\u4F5C\u8BE5\u8BB0\u5F55
|
||||
10170=\u77E5\u8BC6\u5E93\u540D\u79F0\u91CD\u590D
|
||||
10170=\u77E5\u8BC6\u5E93\u540D\u79F0\u91CD\u590D
|
||||
10171=RAG\u914D\u7F6E\u4F53\u7684base_url\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10172=RAG\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10173=RAG\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u66F4\u6362\u4E3A\u5728\u53D6\u7684API\u53C2\u6570
|
||||
10174=RAG\u914D\u7F6E\u4F53\u7684base_url\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934
|
||||
10175=mac\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10176=RAG\u914D\u7F6E\u4F53\u7684dataset_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10177=RAG\u914D\u7F6E\u4F53\u7684model_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10178=RAG\u914D\u7F6E\u4F53\u7684dataset_id\u548Cmodel_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10179=\u6587\u4EF6\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10180=\u6587\u4EF6\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10181=\u97F3\u8272\u514B\u9686\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10182=\u97F3\u8272\u514B\u9686\u97F3\u9891\u4E0D\u5B58\u5728
|
||||
10183=\u9ED8\u8BA4\u667A\u80FD\u4F53\u672A\u627E\u5230
|
||||
@@ -0,0 +1,192 @@
|
||||
#Deutsch
|
||||
500=Server interne Ausnahme
|
||||
401=Nicht autorisiert
|
||||
403=Zugriff verweigert, keine Berechtigungen
|
||||
10001={0} darf nicht leer sein
|
||||
10002=Der Datensatz existiert bereits in der Datenbank
|
||||
10003=Parameter abrufen fehlgeschlagen
|
||||
10004=Die Kontonummer oder das Passwort ist falsch
|
||||
10005=Konto wurde deaktiviert
|
||||
10006=Eindeutige ID darf nicht leer sein
|
||||
10007=Der Bestätigungscode ist falsch
|
||||
10008=Zuerst Untermenü oder Schaltfläche löschen
|
||||
10009=Das ursprüngliche Passwort ist falsch
|
||||
10010=Das Konto oder Passwort ist falsch, Sie können es noch {0} Mal versuchen
|
||||
|
||||
10011=Die übergeordnete Abteilung hat eine falsche Wahl getroffen
|
||||
10012=Oberes Menü kann nicht sich selbst sein
|
||||
10013=Datenberechtigungsschnittstelle, die nur ein Map-Typ-Parameter sein kann
|
||||
10014=Bitte löschen Sie zuerst die untergeordnete Abteilung
|
||||
10015=Bitte löschen Sie zuerst den Benutzer unter der Abteilung
|
||||
10016=Bereitstellung fehlgeschlagen, kein Prozess
|
||||
10017=Das ModellDiagramm ist falsch, bitte überprüfen
|
||||
10018=Export fehlgeschlagen, Modell-ID ist {0}
|
||||
|
||||
10019=Bitte laden Sie eine Datei hoch
|
||||
10020=Token darf nicht leer sein
|
||||
10021=Token ist ungültig, bitte melden Sie sich erneut an
|
||||
10022=Das Konto wurde gesperrt
|
||||
10023=Bitte laden Sie Dateien im Format zip, bar, bpmn, bpmn20.xml hoch
|
||||
|
||||
10024=Datei-Upload fehlgeschlagen {0}
|
||||
10025=SMS-Sendung fehlgeschlagen {0}
|
||||
10026=E-Mail-Vorlage existiert nicht
|
||||
|
||||
10027=Redis-Dienstausnahme
|
||||
10028=Zeitgesteuerte Aufgabe fehlgeschlagen
|
||||
10029=Darf keine illegalen Zeichen enthalten
|
||||
|
||||
10030=Das Passwort hat weniger als {0} Ziffern
|
||||
10031=Das Passwort muss gleichzeitig aus Zahlen, Groß- und Kleinbuchstaben sowie Sonderzeichen bestehen
|
||||
10032=Ausnahme beim Löschen dieser Daten
|
||||
10033=Gerätebestätigungscode Fehler
|
||||
|
||||
10034=Parameterwert darf nicht leer sein
|
||||
10035=Parametertyp darf nicht leer sein
|
||||
10036=Nicht unterstützter Parametertyp
|
||||
10037=Parameterwert muss eine gültige Zahl sein
|
||||
10038=Parameterwert muss true oder false sein
|
||||
10039=Parameterwert muss ein gültiges JSON-Array-Format sein
|
||||
10040=Parameterwert muss ein gültiges JSON-Format sein
|
||||
|
||||
10041=Gerät nicht gefunden
|
||||
10042={0}
|
||||
10043=Löschen der Daten fehlgeschlagen
|
||||
10044=Benutzer nicht angemeldet
|
||||
10045=WebSocket-Verbindung fehlgeschlagen oder Zeitüberschreitung
|
||||
10046=Stimmabdruck speichern fehlgeschlagen, bitte Administrator kontaktieren
|
||||
10047=Tägliches SendeLimit erreicht
|
||||
10048=Altes Passwort ist falsch
|
||||
10049=Das eingestellte LLM ist nicht openai oder ollama
|
||||
10050=Token-Generierung fehlgeschlagen
|
||||
10051=Ressource nicht gefunden
|
||||
10052=Standard-Agent nicht gefunden
|
||||
10053=Agent nicht gefunden
|
||||
10054=Stimmabdruck-Schnittstelle nicht konfiguriert, bitte konfigurieren Sie zuerst die Stimmabdruck-Schnittstellenadresse (server.voice_print) in der Parameterkonfiguration
|
||||
10055=SMS-Sendung fehlgeschlagen
|
||||
10056=SMS-Verbindung konnte nicht hergestellt werden
|
||||
10057=Stimmabdruck für Agent konnte nicht erstellt werden
|
||||
10058=Stimmabdruck für Agent konnte nicht aktualisiert werden
|
||||
10059=Stimmabdruck für Agent konnte nicht gelöscht werden
|
||||
10060=Sendung zu häufig, bitte versuchen Sie es nach {0} Sekunden erneut
|
||||
10061=Aktivierungscode darf nicht leer sein
|
||||
10062=Aktivierungscode Fehler
|
||||
10063=Gerät bereits aktiviert
|
||||
10064=Dieses Modell ist das Standardmodell, bitte setzen Sie zuerst ein anderes Modell als Standard
|
||||
10065=Hinzufügen der Daten fehlgeschlagen
|
||||
10066=Aktualisieren der Daten fehlgeschlagen
|
||||
10067=Grafischer Bestätigungscode Fehler
|
||||
10068=Mobilregistrierung nicht aktiviert, SMS-Bestätigungscode-Funktion kann nicht verwendet werden
|
||||
10069=Benutzername ist keine Handynummer, bitte erneut eingeben
|
||||
10070=Diese Handynummer wurde bereits registriert
|
||||
10071=Die eingegebene Handynummer ist nicht registriert
|
||||
10072=Normale Benutzerregistrierung derzeit nicht erlaubt
|
||||
10073=Mobilregistrierung nicht aktiviert, Passwort-Wiederherstellungsfunktion kann nicht verwendet werden
|
||||
10074=Das Format der eingegebenen Handynummer ist falsch
|
||||
10075=Der eingegebene SMS-Bestätigungscode ist falsch
|
||||
10076=Wörterbuchtyp existiert nicht
|
||||
10077=Wörterbuchtypcode ist dupliziert
|
||||
10078=Lesen der Ressource fehlgeschlagen
|
||||
10079=LLM-Modell und Absichtserkennung, Parameterauswahl stimmt nicht überein
|
||||
10080=Dieser Stimmabdruck gehört zu {0}, der bereits registriert ist, bitte wählen Sie eine andere Stimme
|
||||
10081=Fehler beim Löschen des Stimmabdrucks aufgetreten
|
||||
10082=Änderung nicht erlaubt, diese Stimme wurde bereits als Stimmabdruck registriert ({0})
|
||||
10083=Fehler beim Ändern des Stimmabdrucks, bitte Administrator kontaktieren
|
||||
10084=Stimmabdruck-Schnittstellenadresse Fehler, bitte gehen Sie zur Parameterverwaltung, um die Stimmabdruck-Schnittstellenadresse zu ändern
|
||||
10085=Audiodaten gehören nicht zu diesem Agent
|
||||
10086=Audiodaten sind leer, bitte überprüfen Sie hochgeladene Daten
|
||||
10087=Stimmabdruck-Registrierung fehlgeschlagen, Anfrage nicht erfolgreich
|
||||
10088=Stimmabdruck-Registrierung fehlgeschlagen, Anfrageverarbeitung fehlgeschlagen
|
||||
10089=Stimmabdruck-Stornierung fehlgeschlagen, Anfrage nicht erfolgreich
|
||||
10090=Stimmabdruck-Stornierung fehlgeschlagen, Anfrageverarbeitung fehlgeschlagen
|
||||
10091=Modellanbieter existiert nicht
|
||||
10092=Das konfigurierte LLM existiert nicht
|
||||
10093=Diese Modellkonfiguration wird von Agent {0} referenziert und kann nicht gelöscht werden
|
||||
10094=Dieses LLM-Modell wird von der Absichtserkennungskonfiguration referenziert und kann nicht gelöscht werden
|
||||
10095=Ungültige Serveroperation
|
||||
10096=Server WebSocket-Adresse nicht konfiguriert
|
||||
10097=Ziel-WebSocket-Adresse existiert nicht
|
||||
10098=WebSocket-Adressliste darf nicht leer sein
|
||||
10099=WebSocket-Adresse darf nicht localhost oder 127.0.0.1 verwenden
|
||||
10100=WebSocket-Adressformat ist falsch
|
||||
10101=WebSocket-Verbindungstest fehlgeschlagen
|
||||
10102=OTA-Adresse darf nicht leer sein
|
||||
10103=OTA-Adresse darf nicht localhost oder 127.0.0.1 verwenden
|
||||
10104=OTA-Adresse muss mit http oder https beginnen
|
||||
10105=OTA-Adresse muss mit /ota/ enden
|
||||
10106=OTA-Schnittstellenzugriff fehlgeschlagen
|
||||
10107=OTA-Schnittstelle Rückgabeinhaltformat ist falsch
|
||||
10108=OTA-Schnittstellenvalidierung fehlgeschlagen
|
||||
10109=MCP-Adresse darf nicht leer sein
|
||||
10110=MCP-Adresse darf nicht localhost oder 127.0.0.1 verwenden
|
||||
10111=Keine gültige MCP-Adresse
|
||||
10112=MCP-Schnittstellenzugriff fehlgeschlagen
|
||||
10113=MCP-Schnittstelle Rückgabeinhaltformat ist falsch
|
||||
10114=MCP-Schnittstellenvalidierung fehlgeschlagen
|
||||
10115=Stimmabdruck-Schnittstellenadresse darf nicht leer sein
|
||||
10116=Stimmabdruck-Schnittstellenadresse darf nicht localhost oder 127.0.0.1 verwenden
|
||||
10117=Keine gültige Stimmabdruck-Schnittstellenadresse
|
||||
10118=Stimmabdruck-Schnittstellenadresse muss mit http oder https beginnen
|
||||
10119=Stimmabdruck-Schnittstellenzugriff fehlgeschlagen
|
||||
10120=Stimmabdruck-Schnittstelle Rückgabeinhaltformat ist falsch
|
||||
10121=Stimmabdruck-Schnittstellenvalidierung fehlgeschlagen
|
||||
10122=MQTT-Geheimnis darf nicht leer sein
|
||||
10123=Ihr MQTT-Geheimnis ist nicht sicher, es muss mindestens 8 Zeichen lang sein und muss sowohl Groß- als auch Kleinbuchstaben enthalten
|
||||
10124=Ihr MQTT-Geheimnis ist nicht sicher, MQTT-Geheimnis muss sowohl Groß- als auch Kleinbuchstaben enthalten
|
||||
10125=Ihr MQTT-Geheimnis enthält schwaches Passwort
|
||||
10128=Wörterbuchlabel ist dupliziert
|
||||
10129=SM2-Schlüssel nicht konfiguriert
|
||||
10130=SM2-Entschlüsselung fehlgeschlagen
|
||||
10131=modelType und provideCode dürfen nicht leer sein
|
||||
10132=Keine Berechtigung, den Chat-Verlauf dieses Agents anzuzeigen
|
||||
10133=Sitzungs-ID darf nicht leer sein
|
||||
10134=Agent-ID darf nicht leer sein
|
||||
10135=Chat-Verlauf-Download fehlgeschlagen
|
||||
10136=Download-Link abgelaufen oder ungültig
|
||||
10137=Download-Link ungültig
|
||||
10138=Benutzer
|
||||
10139=Agent
|
||||
10140=Audio-Datei darf nicht leer sein
|
||||
10141=Nur Audio-Dateien werden unterstützt
|
||||
10142=Audio-Dateigröße darf 10MB nicht überschreiten
|
||||
10143=Upload fehlgeschlagen
|
||||
10144=Stimmenklon-Datensatz existiert nicht
|
||||
10145=Stimmressourceninformationen dürfen nicht leer sein
|
||||
10146=TTS-Plattformname darf nicht leer sein
|
||||
10147=Stimmen-ID darf nicht leer sein
|
||||
10148=Kontoinhaber darf nicht leer sein
|
||||
10149=Zu löschende Stimmressourcen-ID darf nicht leer sein
|
||||
10150=Sie haben keine Berechtigung, diesen Datensatz zu bearbeiten
|
||||
10151=Bitte laden Sie zuerst eine Audio-Datei hoch
|
||||
10152=Modellkonfiguration nicht gefunden
|
||||
10153=Modelltyp nicht gefunden
|
||||
10154=Training fehlgeschlagen: {0}
|
||||
10155=Huoshan Engine-Konfiguration fehlt
|
||||
10156=Antwortformat Fehler, BaseResp-Feld fehlt
|
||||
10157=Anfrage fehlgeschlagen
|
||||
10158=Stimme klonen:
|
||||
10159=Stimmen-ID existiert bereits
|
||||
10160=Huoshan Engine-Stimmen-ID-Formatfehler, muss mit S_ beginnen
|
||||
10161=Mac-Adresse existiert bereits
|
||||
10162=Modellanbieter existiert nicht
|
||||
10163=Wissensbasis-Datensatz existiert nicht
|
||||
10164=RAG-Konfiguration nicht gefunden
|
||||
10165=RAG-Konfigurationstyp Fehler
|
||||
10166=Standard-RAG-Konfiguration nicht gefunden
|
||||
10167=RAG-API-Aufruf fehlgeschlagen: {0}
|
||||
10168=Datei-Upload fehlgeschlagen
|
||||
10169=Keine Berechtigung, diese Wissensbasis zu bearbeiten
|
||||
10170=Wissensbasis-Name existiert bereits
|
||||
10171=RAG-Konfiguration base_url darf nicht leer sein
|
||||
10172=RAG-Konfiguration api_key darf nicht leer sein
|
||||
10173=RAG-Konfiguration api_key darf keinen Platzhalter enthalten, bitte ersetzen Sie mit tatsächlichem API-Schlüssel
|
||||
10174=RAG-Konfiguration base_url-Formatfehler, muss mit http oder https beginnen
|
||||
10175=Mac-Adresse darf nicht leer sein
|
||||
10176=RAG-Konfiguration dataset_id darf nicht leer sein
|
||||
10177=RAG-Konfiguration model_id darf nicht leer sein
|
||||
10178=RAG-Konfiguration dataset_id und model_id dürfen nicht leer sein
|
||||
10179=Dateiname darf nicht leer sein
|
||||
10180=Dateiinhalt darf nicht leer sein
|
||||
10181=Stimmenklon-Name darf nicht leer sein
|
||||
10182=Stimmenklon-Audio nicht gefunden
|
||||
10183=Standard-Agent-Vorlage nicht gefunden
|
||||
@@ -181,3 +181,12 @@
|
||||
10172=RAG configuration api_key cannot be empty
|
||||
10173=RAG configuration api_key cannot contain placeholder, please replace with actual API key
|
||||
10174=RAG configuration base_url format error, must start with http or https
|
||||
10175=Mac address cannot be empty
|
||||
10176=RAG configuration dataset_id cannot be empty
|
||||
10177=RAG configuration model_id cannot be empty
|
||||
10178=RAG configuration dataset_id and model_id cannot be empty
|
||||
10179=File name cannot be empty
|
||||
10180=File content cannot be empty
|
||||
10181=Voice clone name cannot be empty
|
||||
10182=Voice clone audio not found
|
||||
10183=Default agent template not found
|
||||
@@ -0,0 +1,192 @@
|
||||
#Tiếng Việt
|
||||
500=Ngoại lệ nội bộ máy chủ
|
||||
401=Không được ủy quyền
|
||||
403=Truy cập bị từ chối, không có quyền
|
||||
10001={0} không thể để trống
|
||||
10002=Bản ghi đã tồn tại trong cơ sở dữ liệu
|
||||
10003=Không thể lấy tham số
|
||||
10004=Số tài khoản hoặc mật khẩu không chính xác
|
||||
10005=Tài khoản đã bị vô hiệu hóa
|
||||
10006=ID duy nhất không thể để trống
|
||||
10007=Mã xác minh không chính xác
|
||||
10008=Trước tiên hãy xóa menu con hoặc nút
|
||||
10009=Mật khẩu gốc không chính xác
|
||||
10010=Tài khoản hoặc mật khẩu không chính xác, bạn có thể thử thêm {0} lần nữa
|
||||
|
||||
10011=Phòng ban cấp trên đã lựa chọn sai
|
||||
10012=Menu trên không thể là chính nó
|
||||
10013=Giao diện quyền dữ liệu, chỉ có thể là tham số kiểu Map
|
||||
10014=Vui lòng xóa phòng ban cấp dưới trước
|
||||
10015=Vui lòng xóa người dùng thuộc phòng ban trước
|
||||
10016=Triển khai thất bại, không có quy trình
|
||||
10017=Biểu đồ mô hình không chính xác, vui lòng kiểm tra
|
||||
10018=Xuất thất bại, ID mô hình là {0}
|
||||
|
||||
10019=Vui lòng tải lên tệp
|
||||
10020=Token không thể để trống
|
||||
10021=Token không hợp lệ, vui lòng đăng nhập lại
|
||||
10022=Tài khoản đã bị khóa
|
||||
10023=Vui lòng tải lên tệp ở định dạng zip, bar, bpmn, bpmn20.xml
|
||||
|
||||
10024=Tải lên tệp {0} thất bại
|
||||
10025=Gửi SMS {0} thất bại
|
||||
10026=Mẫu email không tồn tại
|
||||
|
||||
10027=Ngoại lệ dịch vụ Redis
|
||||
10028=Tác vụ hẹn giờ thất bại
|
||||
10029=Không thể chứa ký tự không hợp lệ
|
||||
|
||||
10030=Mật khẩu ít hơn {0} chữ số
|
||||
10031=Mật khẩu phải bao gồm số, chữ hoa, chữ thường và ký tự đặc biệt cùng một lúc
|
||||
10032=Ngoại lệ khi xóa dữ liệu này
|
||||
10033=Lỗi mã xác minh thiết bị
|
||||
|
||||
10034=Giá trị tham số không thể để trống
|
||||
10035=Loại tham số không thể để trống
|
||||
10036=Loại tham số không được hỗ trợ
|
||||
10037=Giá trị tham số phải là số hợp lệ
|
||||
10038=Giá trị tham số phải là true hoặc false
|
||||
10039=Giá trị tham số phải là định dạng mảng JSON hợp lệ
|
||||
10040=Giá trị tham số phải là định dạng JSON hợp lệ
|
||||
|
||||
10041=Không tìm thấy thiết bị
|
||||
10042={0}
|
||||
10043=Xóa dữ liệu thất bại
|
||||
10044=Người dùng chưa đăng nhập
|
||||
10045=Kết nối WebSocket thất bại hoặc hết thời gian chờ
|
||||
10046=Không thể lưu dấu giọng nói, vui lòng liên hệ quản trị viên
|
||||
10047=Đạt đến giới hạn gửi hàng ngày
|
||||
10048=Mật khẩu cũ không chính xác
|
||||
10049=LLM được đặt không phải là openai hoặc ollama
|
||||
10050=Không thể tạo token
|
||||
10051=Không tìm thấy tài nguyên
|
||||
10052=Không tìm thấy agent mặc định
|
||||
10053=Không tìm thấy agent
|
||||
10054=Giao diện dấu giọng nói chưa được cấu hình, vui lòng cấu hình địa chỉ giao diện dấu giọng nói (server.voice_print) trong cấu hình tham số trước
|
||||
10055=Gửi SMS thất bại
|
||||
10056=Không thể thiết lập kết nối SMS
|
||||
10057=Không thể tạo dấu giọng nói cho agent
|
||||
10058=Không thể cập nhật dấu giọng nói cho agent
|
||||
10059=Không thể xóa dấu giọng nói cho agent
|
||||
10060=Gửi quá thường xuyên, vui lòng thử lại sau {0} giây
|
||||
10061=Mã kích hoạt không thể để trống
|
||||
10062=Lỗi mã kích hoạt
|
||||
10063=Thiết bị đã được kích hoạt
|
||||
10064=Mô hình này là mô hình mặc định, vui lòng đặt mô hình khác làm mặc định trước
|
||||
10065=Thêm dữ liệu thất bại
|
||||
10066=Cập nhật dữ liệu thất bại
|
||||
10067=Lỗi mã xác minh đồ họa
|
||||
10068=Đăng ký di động không được bật, không thể sử dụng chức năng mã xác minh SMS
|
||||
10069=Tên người dùng không phải là số điện thoại di động, vui lòng nhập lại
|
||||
10070=Số điện thoại di động này đã được đăng ký
|
||||
10071=Số điện thoại di động đã nhập không được đăng ký
|
||||
10072=Hiện không cho phép đăng ký người dùng thông thường
|
||||
10073=Đăng ký di động không được bật, không thể sử dụng chức năng truy xuất mật khẩu
|
||||
10074=Định dạng số điện thoại di động đã nhập không chính xác
|
||||
10075=Mã xác minh SMS đã nhập không chính xác
|
||||
10076=Loại từ điển không tồn tại
|
||||
10077=Mã loại từ điển bị trùng lặp
|
||||
10078=Đọc tài nguyên thất bại
|
||||
10079=Mô hình LLM và nhận dạng ý định, lựa chọn tham số không khớp
|
||||
10080=Dấu giọng nói này thuộc về {0} đã đăng ký, vui lòng chọn giọng nói khác
|
||||
10081=Đã xảy ra lỗi khi xóa dấu giọng nói
|
||||
10082=Không cho phép sửa đổi, giọng nói này đã được đăng ký làm dấu giọng nói ({0})
|
||||
10083=Lỗi sửa đổi dấu giọng nói, vui lòng liên hệ quản trị viên
|
||||
10084=Lỗi địa chỉ giao diện dấu giọng nói, vui lòng vào quản lý tham số để sửa đổi địa chỉ giao diện dấu giọng nói
|
||||
10085=Dữ liệu âm thanh không thuộc về agent này
|
||||
10086=Dữ liệu âm thanh trống, vui lòng kiểm tra dữ liệu đã tải lên
|
||||
10087=Đăng ký dấu giọng nói thất bại, yêu cầu không thành công
|
||||
10088=Đăng ký dấu giọng nói thất bại, xử lý yêu cầu thất bại
|
||||
10089=Hủy dấu giọng nói thất bại, yêu cầu không thành công
|
||||
10090=Hủy dấu giọng nói thất bại, xử lý yêu cầu thất bại
|
||||
10091=Nhà cung cấp mô hình không tồn tại
|
||||
10092=LLM được cấu hình không tồn tại
|
||||
10093=Cấu hình mô hình này được tham chiếu bởi agent {0} và không thể xóa
|
||||
10094=Mô hình LLM này được tham chiếu bởi cấu hình nhận dạng ý định và không thể xóa
|
||||
10095=Thao tác máy chủ không hợp lệ
|
||||
10096=Địa chỉ WebSocket máy chủ chưa được cấu hình
|
||||
10097=Địa chỉ WebSocket mục tiêu không tồn tại
|
||||
10098=Danh sách địa chỉ WebSocket không thể để trống
|
||||
10099=Địa chỉ WebSocket không thể sử dụng localhost hoặc 127.0.0.1
|
||||
10100=Định dạng địa chỉ WebSocket không chính xác
|
||||
10101=Kiểm tra kết nối WebSocket thất bại
|
||||
10102=Địa chỉ OTA không thể để trống
|
||||
10103=Địa chỉ OTA không thể sử dụng localhost hoặc 127.0.0.1
|
||||
10104=Địa chỉ OTA phải bắt đầu bằng http hoặc https
|
||||
10105=Địa chỉ OTA phải kết thúc bằng /ota/
|
||||
10106=Truy cập giao diện OTA thất bại
|
||||
10107=Định dạng nội dung trả về giao diện OTA không chính xác
|
||||
10108=Xác thực giao diện OTA thất bại
|
||||
10109=Địa chỉ MCP không thể để trống
|
||||
10110=Địa chỉ MCP không thể sử dụng localhost hoặc 127.0.0.1
|
||||
10111=Không phải địa chỉ MCP hợp lệ
|
||||
10112=Truy cập giao diện MCP thất bại
|
||||
10113=Định dạng nội dung trả về giao diện MCP không chính xác
|
||||
10114=Xác thực giao diện MCP thất bại
|
||||
10115=Địa chỉ giao diện dấu giọng nói không thể để trống
|
||||
10116=Địa chỉ giao diện dấu giọng nói không thể sử dụng localhost hoặc 127.0.0.1
|
||||
10117=Không phải địa chỉ giao diện dấu giọng nói hợp lệ
|
||||
10118=Địa chỉ giao diện dấu giọng nói phải bắt đầu bằng http hoặc https
|
||||
10119=Truy cập giao diện dấu giọng nói thất bại
|
||||
10120=Định dạng nội dung trả về giao diện dấu giọng nói không chính xác
|
||||
10121=Xác thực giao diện dấu giọng nói thất bại
|
||||
10122=Bí mật MQTT không thể để trống
|
||||
10123=Bí mật MQTT của bạn không an toàn, cần ít nhất 8 ký tự và phải chứa cả chữ hoa và chữ thường
|
||||
10124=Bí mật MQTT của bạn không an toàn, bí mật MQTT phải chứa cả chữ hoa và chữ thường
|
||||
10125=Bí mật MQTT của bạn chứa mật khẩu yếu
|
||||
10128=Nhãn từ điển bị trùng lặp
|
||||
10129=Khóa SM2 chưa được cấu hình
|
||||
10130=Giải mã SM2 thất bại
|
||||
10131=modelType và provideCode không thể để trống
|
||||
10132=Không có quyền xem lịch sử trò chuyện của agent này
|
||||
10133=ID phiên không thể để trống
|
||||
10134=ID agent không thể để trống
|
||||
10135=Tải xuống lịch sử trò chuyện thất bại
|
||||
10136=Liên kết tải xuống đã hết hạn hoặc không hợp lệ
|
||||
10137=Liên kết tải xuống không hợp lệ
|
||||
10138=Người dùng
|
||||
10139=Agent
|
||||
10140=Tệp âm thanh không thể để trống
|
||||
10141=Chỉ hỗ trợ tệp âm thanh
|
||||
10142=Kích thước tệp âm thanh không thể vượt quá 10MB
|
||||
10143=Tải lên thất bại
|
||||
10144=Bản ghi nhân bản giọng nói không tồn tại
|
||||
10145=Thông tin tài nguyên giọng nói không thể để trống
|
||||
10146=Tên nền tảng TTS không thể để trống
|
||||
10147=ID giọng nói không thể để trống
|
||||
10148=Tài khoản chủ sở hữu không thể để trống
|
||||
10149=ID tài nguyên giọng nói cần xóa không thể để trống
|
||||
10150=Bạn không có quyền thao tác bản ghi này
|
||||
10151=Vui lòng tải lên tệp âm thanh trước
|
||||
10152=Không tìm thấy cấu hình mô hình
|
||||
10153=Không tìm thấy loại mô hình
|
||||
10154=Đào tạo thất bại: {0}
|
||||
10155=Thiếu cấu hình Huoshan Engine
|
||||
10156=Lỗi định dạng phản hồi, thiếu trường BaseResp
|
||||
10157=Yêu cầu thất bại
|
||||
10158=Nhân bản giọng nói:
|
||||
10159=ID giọng nói đã tồn tại
|
||||
10160=Lỗi định dạng ID giọng nói Huoshan Engine, phải bắt đầu bằng S_
|
||||
10161=Địa chỉ Mac đã tồn tại
|
||||
10162=Nhà cung cấp mô hình không tồn tại
|
||||
10163=Bản ghi cơ sở kiến thức không tồn tại
|
||||
10164=Không tìm thấy cấu hình RAG
|
||||
10165=Lỗi loại cấu hình RAG
|
||||
10166=Không tìm thấy cấu hình RAG mặc định
|
||||
10167=Gọi API RAG thất bại: {0}
|
||||
10168=Tải lên tệp thất bại
|
||||
10169=Không có quyền thao tác cơ sở kiến thức này
|
||||
10170=Tên cơ sở kiến thức đã tồn tại
|
||||
10171=Cấu hình RAG base_url không thể để trống
|
||||
10172=Cấu hình RAG api_key không thể để trống
|
||||
10173=Cấu hình RAG api_key không thể chứa trình giữ chỗ, vui lòng thay thế bằng khóa API thực tế
|
||||
10174=Lỗi định dạng cấu hình RAG base_url, phải bắt đầu bằng http hoặc https
|
||||
10175=Địa chỉ Mac không thể để trống
|
||||
10176=Cấu hình RAG dataset_id không thể để trống
|
||||
10177=Cấu hình RAG model_id không thể để trống
|
||||
10178=Cấu hình RAG dataset_id và model_id không thể để trống
|
||||
10179=Tên tệp không thể để trống
|
||||
10180=Nội dung tệp không thể để trống
|
||||
10181=Tên nhân bản giọng nói không thể để trống
|
||||
10182=Không tìm thấy âm thanh nhân bản giọng nói
|
||||
10183=Không tìm thấy mẫu agent mặc định
|
||||
@@ -160,11 +160,11 @@
|
||||
10151=\u8BF7\u5148\u4E0A\u4F20\u97F3\u9891\u6587\u4EF6
|
||||
10152=\u6A21\u578B\u914D\u7F6E\u672A\u627E\u5230
|
||||
10153=\u6A21\u578B\u7C7B\u578B\u672A\u627E\u5230
|
||||
10154=\u8BAD\u7EC3\u5931\u8D25
|
||||
10154=\u8BAD\u7EC3\u5931\u8D25: {0}
|
||||
10155=\u706B\u5C71\u5F15\u64CE\u7F3A\u5C11\u914D\u7F6E
|
||||
10156=\u54CD\u5E94\u683C\u5F0F\u9519\u8BEF\uFF0C\u7F3A\u5C11BaseResp\u5B57\u6BB5
|
||||
10157=\u8BF7\u6C42\u5931\u8D25
|
||||
10158=\u514B\u9686\u8272\u97F3:
|
||||
10158=\u514B\u9686\u97F3\u8272:
|
||||
10159=\u97F3\u8272ID\u5DF2\u5B58\u5728
|
||||
10160=\u706B\u5C71\u5F15\u64CE\u97F3\u8272ID\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5S_\u5F00\u5934
|
||||
10161=Mac\u5730\u5740\u5DF2\u5B58\u5728
|
||||
@@ -173,11 +173,20 @@
|
||||
10164=RAG\u914D\u7F6E\u672A\u627E\u5230
|
||||
10165=RAG\u914D\u7F6E\u7C7B\u578B\u9519\u8BEF
|
||||
10166=\u9ED8\u8BA4RAG\u914D\u7F6E\u672A\u627E\u5230
|
||||
10167=\u0052\u0041\u0047\u8c03\u7528\u5931\u8d25\uFF0C{0}
|
||||
10167=RAG\u8C03\u7528\u5931\u8D25\uFF0C{0}
|
||||
10168=\u4E0A\u4F20\u6587\u4EF6\u5931\u8D25
|
||||
10169=\u60A8\u6CA1\u6709\u6743\u9650\u64CD\u4F5C\u8BE5\u8BB0\u5F55
|
||||
10170=\u77E5\u8BC6\u5E93\u540D\u79F0\u91CD\u590D
|
||||
10171=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684base_url\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10172=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10173=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u66F4\u6362\u4E3A\u5728\u53D6\u7684API\u53C2\u6570
|
||||
10174=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684base_url\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934
|
||||
10171=RAG\u914D\u7F6E\u4F53\u7684base_url\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10172=RAG\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10173=RAG\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u66F4\u6362\u4E3A\u5728\u53D6\u7684API\u53C2\u6570
|
||||
10174=RAG\u914D\u7F6E\u4F53\u7684base_url\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934
|
||||
10175=mac\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10176=RAG\u914D\u7F6E\u4F53\u7684dataset_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10177=RAG\u914D\u7F6E\u4F53\u7684model_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10178=RAG\u914D\u7F6E\u4F53\u7684dataset_id\u548Cmodel_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10179=\u6587\u4EF6\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10180=\u6587\u4EF6\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10181=\u97F3\u8272\u514B\u9686\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10182=\u97F3\u8272\u514B\u9686\u97F3\u9891\u4E0D\u5B58\u5728
|
||||
10183=\u9ED8\u8BA4\u667A\u80FD\u4F53\u672A\u627E\u5230
|
||||
@@ -164,7 +164,7 @@
|
||||
10155=\u706B\u5C71\u5F15\u64CE\u7F3A\u5C11appid\u6216access_token
|
||||
10156=\u97FF\u61C9\u683C\u5F0F\u932F\u8AA4\uFF0C\u7F3A\u5C11BaseResp\u5B57\u6BB5
|
||||
10157=\u8ACB\u6C42\u5931\u6557
|
||||
10158=\u514B\u9686\u8A9E\u97F3:
|
||||
10158=\u514b\u9686\u97f3\u8272:
|
||||
10159=\u97F3\u8272ID\u5DF2\u5B58\u5728
|
||||
10160=\u706B\u5C71\u5F15\u64CE\u97F3\u8272ID\u683C\u5F0F\u932F\u8AA4\uFF0C\u5FC5\u9808\u4EE5S_\u958B\u982D
|
||||
10161=Mac\u5730\u5740\u5DF2\u5B58\u5728
|
||||
@@ -181,3 +181,12 @@
|
||||
10172=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10173=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684api_key\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u66F4\u6362\u4E3A\u5728\u53D6\u7684API\u53C2\u6570
|
||||
10174=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684base_url\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934
|
||||
10175=mac\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10176=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684dataset_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10177=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684model_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10178=\u0052\u0041\u0047\u914D\u7F6E\u4F53\u7684dataset_id\u548Cmodel_id\u4E0D\u80FD\u4E3A\u7A7A
|
||||
10179=\u6587\u4ef6\u540d\u7a31\u4e0d\u80fd\u70ba\u7a7a
|
||||
10180=\u6587\u4ef6\u5185\u5bb9\u4e0d\u80fd\u70ba\u7a7a
|
||||
10181=\u97f3\u8272\u514b\u9686\u540d\u7a31\u4e0d\u80fd\u70ba\u7a7a
|
||||
10182=\u97f3\u8272\u514b\u9686\u97f3\u983b\u4e0d\u5b58\u5728
|
||||
10183=\u9ed8\u8ba4\u667a\u80fd\u4f53\u672a\u627e\u5230
|
||||
@@ -0,0 +1,34 @@
|
||||
#Deutsch
|
||||
id.require=ID darf nicht leer sein
|
||||
id.null=ID muss leer sein
|
||||
|
||||
sort.number=Der Sortierwert darf nicht kleiner als 0 sein
|
||||
page.number=Der Seitenwert darf nicht kleiner als 0 sein
|
||||
limit.number=Der Limit-Wert darf nicht kleiner als 0 sein
|
||||
|
||||
sysdict.type.require=Der Wörterbuchtyp darf nicht leer sein
|
||||
sysdict.name.require=Der Wörterbuchname darf nicht leer sein
|
||||
sysdict.label.require=Wörterbuch-Label darf nicht leer sein
|
||||
|
||||
sysparams.paramcode.require=Parameter-Code darf nicht leer sein
|
||||
sysparams.paramvalue.require=Parameter-Werte dürfen nicht leer sein
|
||||
sysparams.valuetype.require=Werttyp darf nicht leer sein
|
||||
sysparams.valuetype.pattern=Werttyp muss string, number, boolean oder array sein
|
||||
|
||||
sysuser.username.require=Der Benutzername darf nicht leer sein
|
||||
sysuser.password.require=Das Passwort darf nicht leer sein
|
||||
sysuser.realname.require=Der echte Name darf nicht leer sein
|
||||
sysuser.gender.range=Geschlecht liegt im Bereich von 0 bis 2
|
||||
sysuser.email.error=Falsches E-Mail-Format
|
||||
sysuser.deptId.require=Abteilungen dürfen nicht leer sein
|
||||
sysuser.status.range=Status liegt im Bereich von 0 bis 1
|
||||
sysuser.captcha.require=Das Captcha darf nicht leer sein
|
||||
sysuser.uuid.require=Der eindeutige Identifikator darf nicht leer sein
|
||||
|
||||
timbre.languages.require=Die Sprache des Klangs darf nicht leer sein
|
||||
timbre.name.require=Der Name des Klangs darf nicht leer sein
|
||||
timbre.ttsModelId.require=Die TTS-Modell-ID des Klangs darf nicht leer sein
|
||||
timbre.ttsVoice.require=Die TTS-Stimme des Klangs darf nicht leer sein
|
||||
|
||||
ota.device.not.found=Gerät nicht gefunden
|
||||
ota.device.need.bind={0}
|
||||
@@ -0,0 +1,34 @@
|
||||
# Tiếng Việt
|
||||
id.require=ID không được để trống
|
||||
id.null=ID phải để trống
|
||||
|
||||
sort.number=Giá trị sắp xếp không thể nhỏ hơn 0
|
||||
page.number=Giá trị trang không thể nhỏ hơn 0
|
||||
limit.number=Giá trị giới hạn không thể nhỏ hơn 0
|
||||
|
||||
sysdict.type.require=Loại từ điển không được để trống
|
||||
sysdict.name.require=Tên từ điển không được để trống
|
||||
sysdict.label.require=Thẻ từ điển không được để trống
|
||||
|
||||
sysparams.paramcode.require=Mã tham số không được để trống
|
||||
sysparams.paramvalue.require=Giá trị tham số không được để trống
|
||||
sysparams.valuetype.require=Loại giá trị không được để trống
|
||||
sysparams.valuetype.pattern=Loại giá trị phải là chuỗi, số, boolean hoặc mảng
|
||||
|
||||
sysuser.username.require=Tên người dùng không được để trống
|
||||
sysuser.password.require=Mật khẩu không được để trống
|
||||
sysuser.realname.require=Tên thật không được để trống
|
||||
sysuser.gender.range=Giới tính phải từ 0 đến 2
|
||||
sysuser.email.error=Định dạng email không chính xác
|
||||
sysuser.deptId.require=Phòng ban không được để trống
|
||||
sysuser.status.range=Trạng thái phải từ 0 đến 1
|
||||
sysuser.captcha.require=Mã xác thực không được để trống
|
||||
sysuser.uuid.require=Định danh duy nhất không được để trống
|
||||
|
||||
timbre.languages.require=Ngôn ngữ của âm sắc không được để trống
|
||||
timbre.name.require=Tên âm sắc không được để trống
|
||||
timbre.ttsModelId.require=ID mô hình TTS của âm sắc không được để trống
|
||||
timbre.ttsVoice.require=Giọng TTS của âm sắc không được để trống
|
||||
|
||||
ota.device.not.found=Không tìm thấy thiết bị
|
||||
ota.device.need.bind={0}
|
||||
@@ -3,8 +3,8 @@ id.require=ID\u4E0D\u80FD\u4E3A\u7A7A
|
||||
id.null=ID\u5FC5\u987B\u4E3A\u7A7A
|
||||
|
||||
sort.number=\u6392\u5E8F\u503C\u4E0D\u80FD\u5C0F\u4E8E0
|
||||
page.number=\u9801\u6578\u4E0D\u80FD\u5C0F\u4E8E0
|
||||
limit.number=\u5217\u6578\u4E0D\u80FD\u5C0F\u4E8E0
|
||||
page.number=\u9875\u6570\u4E0D\u80FD\u5C0F\u4E8E0
|
||||
limit.number=\u5217\u6570\u4E0D\u80FD\u5C0F\u4E8E0
|
||||
|
||||
sysdict.type.require=\u5B57\u5178\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
|
||||
sysdict.name.require=\u5B57\u5178\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
@@ -25,10 +25,10 @@ sysuser.status.range=\u72B6\u6001\u53D6\u503C\u8303\u56F40~1
|
||||
sysuser.captcha.require=\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A
|
||||
sysuser.uuid.require=\u552F\u4E00\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A
|
||||
|
||||
timbre.languages.require=\u97F3\u8272\u7684\u8A9E\u8A00\u4E0D\u53EF\u4EE5\u70BA\u7A7A
|
||||
timbre.name.require=\u97F3\u8272\u7684\u540D\u7A31\u4E0D\u53EF\u4EE5\u70BA\u7A7A
|
||||
timbre.ttsModelId.require=\u97F3\u8272\u7684tts\u4E3B\u9375\u4E0D\u53EF\u4EE5\u70BA\u7A7A
|
||||
timbre.ttsVoice.require=\u97F3\u8272\u7684\u7DE8\u78BC\u4E0D\u53EF\u4EE5\u70BA\u7A7A
|
||||
timbre.languages.require=\u97F3\u8272\u7684\u8BED\u8A00\u4E0D\u80FD\u4E3A\u7A7A
|
||||
timbre.name.require=\u97F3\u8272\u7684\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
|
||||
timbre.ttsModelId.require=\u97F3\u8272\u7684tts\u4E3B\u952E\u4E0D\u80FD\u4E3A\u7A7A
|
||||
timbre.ttsVoice.require=\u97F3\u8272\u7684\u7F16\u7801\u4E0D\u80FD\u4E3A\u7A7A
|
||||
|
||||
ota.device.not.found=\u8A2D\u5099\u672A\u627E\u5230
|
||||
ota.device.not.found=\u8BBE\u5907\u672A\u627E\u5230
|
||||
ota.device.need.bind={0}
|
||||
@@ -0,0 +1,440 @@
|
||||
// Deutsch Sprachpaket
|
||||
export default {
|
||||
// TabBar
|
||||
'tabBar.home': 'Startseite',
|
||||
'tabBar.deviceConfig': 'Netzwerkkonfig',
|
||||
'tabBar.settings': 'System',
|
||||
// Einstellungsseitentitel
|
||||
'settings.title': 'Einstellungen',
|
||||
// Anmeldeseite
|
||||
'login.pageTitle': 'Anmelden',
|
||||
'login.navigationTitle': 'Anmelden',
|
||||
'login.fetchConfigError': 'Konfiguration konnte nicht abgerufen werden:',
|
||||
'login.selectLanguage': 'Sprache auswählen',
|
||||
'login.selectLanguageTip': 'Vi',
|
||||
'login.welcomeBack': 'Willkommen zurück',
|
||||
'login.pleaseLogin': 'Bitte melden Sie sich an',
|
||||
'login.enterUsername': 'Bitte Benutzernamen eingeben',
|
||||
'login.enterPassword': 'Bitte Passwort eingeben',
|
||||
'login.enterCaptcha': 'Bitte Bestätigungscode eingeben',
|
||||
'login.loginButton': 'Anmelden',
|
||||
'login.loggingIn': 'Wird angemeldet...',
|
||||
'login.noAccount': 'Registrieren',
|
||||
'login.enterPhone': 'Bitte Handynummer eingeben',
|
||||
'login.selectCountry': 'Land/Region auswählen',
|
||||
'login.confirm': 'Bestätigen',
|
||||
'login.serverSetting': 'Server-Einstellungen',
|
||||
'login.requiredUsername': 'Benutzername darf nicht leer sein',
|
||||
'login.requiredPassword': 'Passwort darf nicht leer sein',
|
||||
'login.requiredCaptcha': 'Bestätigungscode darf nicht leer sein',
|
||||
'login.requiredMobile': 'Bitte gültige Handynummer eingeben',
|
||||
'login.captchaError': 'Grafischer Bestätigungscode Fehler',
|
||||
'login.forgotPassword': 'Passwort vergessen',
|
||||
|
||||
// Registrierungsseite
|
||||
'register.pageTitle': 'Registrieren',
|
||||
'register.createAccount': 'Konto erstellen',
|
||||
'register.enterUsername': 'Bitte Benutzernamen eingeben',
|
||||
'register.enterPassword': 'Bitte Passwort eingeben',
|
||||
'register.confirmPassword': 'Bitte Passwort bestätigen',
|
||||
'register.enterPhone': 'Bitte Handynummer eingeben',
|
||||
'register.enterCode': 'Bitte Bestätigungscode eingeben',
|
||||
'register.getCode': 'Code erhalten',
|
||||
'register.agreeTerms': 'Ich habe gelesen und stimme zu',
|
||||
'register.terms': 'Nutzungsbedingungen',
|
||||
'register.privacy': 'Datenschutzrichtlinie',
|
||||
'register.registerButton': 'Registrieren',
|
||||
'register.registering': 'Wird registriert...',
|
||||
'register.haveAccount': 'Bereits ein Konto?',
|
||||
'register.loginNow': 'Jetzt anmelden',
|
||||
'register.selectCountry': 'Land/Region auswählen',
|
||||
'register.confirm': 'Bestätigen',
|
||||
'register.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet',
|
||||
|
||||
// Startseite
|
||||
'home.pageTitle': 'Startseite',
|
||||
'home.createAgent': 'Agent erstellen',
|
||||
'home.agentName': 'Agent',
|
||||
'home.modelInfo': 'Modell-Info',
|
||||
'home.lastActive': 'Zuletzt aktiv',
|
||||
'home.greeting': 'Hallo Jarvis',
|
||||
'home.subtitle': 'Lassen Sie uns',
|
||||
'home.wonderfulDay': 'einen wunderbaren Tag haben!',
|
||||
'home.emptyState': 'Keine Agenten verfügbar',
|
||||
'home.deviceManagement': 'Geräteverwaltung',
|
||||
'home.lastConversation': 'Letzte Konversation:',
|
||||
'home.delete': 'Löschen',
|
||||
'home.createFirstAgent': 'Klicken Sie auf die + Schaltfläche unten rechts, um Ihren ersten Agenten zu erstellen',
|
||||
'home.dialogTitle': 'Agent erstellen',
|
||||
'home.inputPlaceholder': 'z.B. Kundenservice-Assistent, Sprachassistent, Wissens-F&A',
|
||||
'home.createError': 'Bitte Agenten-Namen eingeben',
|
||||
'home.createNow': 'Jetzt erstellen',
|
||||
'home.justNow': 'Gerade eben',
|
||||
'home.minutesAgo': 'Minuten her',
|
||||
'home.hoursAgo': 'Stunden her',
|
||||
'home.daysAgo': 'Tage her',
|
||||
|
||||
// Agentenseite
|
||||
'agent.pageTitle': 'Agent',
|
||||
'agent.roleConfig': 'Rollenkonfiguration',
|
||||
'agent.deviceManagement': 'Geräteverwaltung',
|
||||
'agent.chatHistory': 'Chat-Verlauf',
|
||||
'agent.voiceprintManagement': 'Stimmabdruckverwaltung',
|
||||
'agent.editTitle': 'Agent bearbeiten',
|
||||
'agent.toolsTitle': 'Funktionen bearbeiten',
|
||||
'agent.voiceActivityDetection': 'Sprachaktivitätserkennung',
|
||||
'agent.speechRecognition': 'Spracherkennung',
|
||||
'agent.largeLanguageModel': 'Großes Sprachmodell',
|
||||
'agent.save': 'Speichern',
|
||||
'agent.cancel': 'Abbrechen',
|
||||
// Agenten-Bearbeitungsseite
|
||||
'agent.basicInfo': 'Grundinformationen',
|
||||
'agent.agentName': 'Agentenname',
|
||||
'agent.inputAgentName': 'Bitte Agenten-Namen eingeben',
|
||||
'agent.roleMode': 'Rollenmodus',
|
||||
'agent.roleDescription': 'Rollenbeschreibung',
|
||||
'agent.inputRoleDescription': 'Bitte Rollenbeschreibung eingeben',
|
||||
'agent.modelConfig': 'Modellkonfiguration',
|
||||
'agent.vad': 'Sprachaktivitätserkennung',
|
||||
'agent.asr': 'Spracherkennung',
|
||||
'agent.llm': 'Großes Sprachmodell',
|
||||
'agent.vllm': 'Vision-Sprachmodell',
|
||||
'agent.intent': 'Absichtserkennung',
|
||||
'agent.memory': 'Speicher',
|
||||
'agent.voiceSettings': 'Stimmeinstellungen',
|
||||
'agent.tts': 'Text-zu-Sprache',
|
||||
'agent.voiceprint': 'Agenten-Stimme',
|
||||
'agent.plugins': 'Plugins',
|
||||
'agent.editFunctions': 'Funktionen bearbeiten',
|
||||
'agent.historyMemory': 'Verlaufsspeicher',
|
||||
'agent.memoryContent': 'Speicherinhalt',
|
||||
'agent.saving': 'Wird gespeichert...',
|
||||
'agent.saveSuccess': 'Erfolgreich gespeichert',
|
||||
'agent.saveFail': 'Speichern fehlgeschlagen',
|
||||
'agent.loadFail': 'Laden fehlgeschlagen',
|
||||
'agent.pleaseInputAgentName': 'Bitte Agenten-Namen eingeben',
|
||||
'agent.pleaseInputRoleDescription': 'Bitte Rollenbeschreibung eingeben',
|
||||
'agent.pleaseSelect': 'Bitte auswählen',
|
||||
|
||||
// Chat-Verlauf Seite
|
||||
'chatHistory.getChatSessions': 'Chat-Sitzungsliste abrufen',
|
||||
'chatHistory.noSelectedAgent': 'Kein Agent ausgewählt',
|
||||
'chatHistory.getChatSessionsFailed': 'Chat-Sitzungsliste konnte nicht abgerufen werden:',
|
||||
'chatHistory.unknownTime': 'Unbekannte Zeit',
|
||||
'chatHistory.justNow': 'Gerade eben',
|
||||
'chatHistory.minutesAgo': 'Vor {minutes} Minuten',
|
||||
'chatHistory.hoursAgo': 'Vor {hours} Stunden',
|
||||
'chatHistory.daysAgo': 'Vor {days} Tagen',
|
||||
'chatHistory.conversationRecord': 'Konversationsaufzeichnung',
|
||||
'chatHistory.totalChats': 'Insgesamt {count} Chats',
|
||||
'chatHistory.loading': 'Lädt...',
|
||||
'chatHistory.noMoreData': 'Keine weiteren Daten',
|
||||
'chatHistory.noChatRecords': 'Keine Chat-Aufzeichnungen',
|
||||
'chatHistory.chatRecordsDescription': 'Konversationsaufzeichnungen mit Agenten werden hier angezeigt',
|
||||
// Chat-Verlauf Detailseite
|
||||
'chatHistory.pageTitle': 'Chat-Details',
|
||||
'chatHistory.assistantName': 'Intelligenter Assistent',
|
||||
'chatHistory.userName': 'Benutzer',
|
||||
'chatHistory.aiAssistantName': 'KI-Assistent',
|
||||
'chatHistory.loadFailed': 'Chat-Verlauf konnte nicht geladen werden',
|
||||
'chatHistory.parameterError': 'Seitenparameter Fehler',
|
||||
'chatHistory.invalidAudioId': 'Ungültige Audio-ID',
|
||||
'chatHistory.audioPlayFailed': 'Audio-Wiedergabe fehlgeschlagen',
|
||||
'chatHistory.playAudioFailed': 'Audio konnte nicht abgespielt werden',
|
||||
|
||||
// Geräteverwaltungsseite
|
||||
'device.pageTitle': 'Geräteverwaltung',
|
||||
'device.noDevices': 'Keine Geräte verfügbar',
|
||||
'device.macAddress': 'MAC-Adresse',
|
||||
'device.firmwareVersion': 'Firmware-Version',
|
||||
'device.lastConnected': 'Letzte Konversation',
|
||||
'device.otaUpdate': 'OTA-Update',
|
||||
'device.unbind': 'Entbinden',
|
||||
'device.confirmUnbind': 'Bestätigen',
|
||||
'device.bindDevice': 'Neues Gerät binden',
|
||||
'device.deviceType': 'Gerätetyp',
|
||||
'device.loading': 'Lädt...',
|
||||
'device.neverConnected': 'Nie verbunden',
|
||||
'device.justNow': 'Gerade eben',
|
||||
'device.minutesAgo': 'Vor {minutes} Minuten',
|
||||
'device.hoursAgo': 'Vor {hours} Stunden',
|
||||
'device.daysAgo': 'Vor {days} Tagen',
|
||||
'device.otaAutoUpdateEnabled': 'OTA Auto-Update aktiviert',
|
||||
'device.otaAutoUpdateDisabled': 'OTA Auto-Update deaktiviert',
|
||||
'device.operationFailed': 'Operation fehlgeschlagen, bitte erneut versuchen',
|
||||
'device.deviceUnbound': 'Gerät entbunden',
|
||||
'device.unbindFailed': 'Entbinden fehlgeschlagen, bitte erneut versuchen',
|
||||
'device.unbindDevice': 'Gerät entbinden',
|
||||
'device.confirmUnbindDevice': 'Sind Sie sicher, dass Sie Gerät "{macAddress}" entbinden möchten?',
|
||||
'device.cancel': 'Abbrechen',
|
||||
'device.noDevice': 'Kein Gerät',
|
||||
'device.pleaseSelectAgent': 'Bitte wählen Sie zuerst einen Agenten aus',
|
||||
'device.deviceBindSuccess': 'Gerät erfolgreich gebunden!',
|
||||
'device.bindFailed': 'Binden fehlgeschlagen, bitte prüfen Sie ob der Bestätigungscode korrekt ist',
|
||||
'device.enterDeviceCode': 'Bitte Geräte-Bestätigungscode eingeben',
|
||||
'device.bindNow': 'Jetzt binden',
|
||||
'device.lastConnection': 'Letzte Verbindung',
|
||||
'device.clickToBindFirstDevice': 'Klicken Sie auf die + Schaltfläche unten rechts, um Ihr erstes Gerät zu binden',
|
||||
|
||||
// Allgemein
|
||||
'common.success': 'Erfolg',
|
||||
'common.fail': 'Fehlgeschlagen',
|
||||
'common.loading': 'Lädt...',
|
||||
'common.confirm': 'Bestätigen',
|
||||
'common.cancel': 'Abbrechen',
|
||||
'common.delete': 'Löschen',
|
||||
'common.edit': 'Bearbeiten',
|
||||
'common.add': 'Hinzufügen',
|
||||
'common.pleaseSelect': 'Bitte auswählen',
|
||||
'common.unknownError': 'Unbekannter Fehler',
|
||||
'common.networkError': 'Netzwerkfehler',
|
||||
|
||||
// Passwort-Wiederherstellungsseite
|
||||
'retrievePassword.title': 'Passwort zurücksetzen',
|
||||
'retrievePassword.subtitle': 'Stellen Sie Ihr Kontopasswort über Handynummer wieder her',
|
||||
'retrievePassword.mobileRequired': 'Bitte Handynummer eingeben',
|
||||
'retrievePassword.inputCorrectMobile': 'Bitte gültige Handynummer eingeben',
|
||||
'retrievePassword.captchaRequired': 'Bitte grafischen Bestätigungscode eingeben',
|
||||
'retrievePassword.mobileCaptchaRequired': 'Bitte SMS-Bestätigungscode eingeben',
|
||||
'retrievePassword.newPasswordRequired': 'Bitte neues Passwort eingeben',
|
||||
'retrievePassword.confirmNewPasswordRequired': 'Bitte neues Passwort bestätigen',
|
||||
'retrievePassword.passwordsNotMatch': 'Passwörter stimmen nicht überein',
|
||||
'retrievePassword.mobilePlaceholder': 'Bitte Handynummer eingeben',
|
||||
'retrievePassword.captchaPlaceholder': 'Bitte grafischen Bestätigungscode eingeben',
|
||||
'retrievePassword.mobileCaptchaPlaceholder': 'Bitte SMS-Bestätigungscode eingeben',
|
||||
'retrievePassword.newPasswordPlaceholder': 'Bitte neues Passwort eingeben',
|
||||
'retrievePassword.confirmNewPasswordPlaceholder': 'Bitte neues Passwort bestätigen',
|
||||
'retrievePassword.getMobileCaptcha': 'Code erhalten',
|
||||
'retrievePassword.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet',
|
||||
'retrievePassword.passwordUpdateSuccess': 'Passwort erfolgreich zurückgesetzt',
|
||||
'retrievePassword.resetButton': 'Passwort zurücksetzen',
|
||||
'retrievePassword.goToLogin': 'Zurück zur Anmeldung',
|
||||
|
||||
// SM2-Verschlüsselungsbezogene Fehlermeldungen
|
||||
'sm2.publicKeyNotConfigured': 'SM2 öffentlicher Schlüssel nicht konfiguriert, bitte Administrator kontaktieren',
|
||||
'sm2.encryptionFailed': 'Passwortverschlüsselung fehlgeschlagen',
|
||||
'sm2.keyGenerationFailed': 'Schlüsselpaar-Generierung fehlgeschlagen',
|
||||
'sm2.invalidPublicKey': 'Ungültiges öffentliches Schlüsselformat',
|
||||
'sm2.encryptionError': 'Fehler bei der Verschlüsselung aufgetreten',
|
||||
'sm2.publicKeyRetry': 'Öffentlichen Schlüssel erneut abrufen...',
|
||||
'sm2.publicKeyRetryFailed': 'Wiederholter Abruf des öffentlichen Schlüssels fehlgeschlagen',
|
||||
|
||||
// Stimmabdruckseite
|
||||
'voiceprint.noSelectedAgent': 'Kein Agent ausgewählt',
|
||||
'voiceprint.pleaseSelectAgent': 'Bitte wählen Sie zuerst einen Agenten aus',
|
||||
'voiceprint.fetchHistoryFailed': 'Chat-Verlauf konnte nicht abgerufen werden',
|
||||
'voiceprint.clickToSelectVector': 'Klicken zum Auswählen des Stimmabdruck-Vektors',
|
||||
'voiceprint.pleaseInputName': 'Bitte Namen eingeben',
|
||||
'voiceprint.pleaseSelectVector': 'Bitte Stimmabdruck-Vektor auswählen',
|
||||
'voiceprint.addSuccess': 'Erfolgreich hinzugefügt',
|
||||
'voiceprint.addFailed': 'Hinzufügen des Sprechers fehlgeschlagen',
|
||||
'voiceprint.editSuccess': 'Erfolgreich bearbeitet',
|
||||
'voiceprint.editFailed': 'Bearbeiten des Sprechers fehlgeschlagen',
|
||||
'voiceprint.deleteConfirmMsg': 'Sind Sie sicher, dass Sie diesen Sprecher löschen möchten?',
|
||||
'voiceprint.deleteConfirmTitle': 'Löschen bestätigen',
|
||||
'voiceprint.deleteSuccess': 'Erfolgreich gelöscht',
|
||||
'voiceprint.loading': 'Lädt...',
|
||||
'voiceprint.delete': 'Löschen',
|
||||
'voiceprint.emptyTitle': 'Keine Stimmabdruck-Daten',
|
||||
'voiceprint.emptyDesc': 'Klicken Sie auf die + Schaltfläche unten rechts, um Ihren ersten Sprecher hinzuzufügen',
|
||||
'voiceprint.addSpeaker': 'Sprecher hinzufügen',
|
||||
'voiceprint.voiceVector': 'Stimmabdruck-Vektor',
|
||||
'voiceprint.name': 'Name',
|
||||
'voiceprint.description': 'Beschreibung',
|
||||
'voiceprint.pleaseInputDescription': 'Bitte Beschreibung eingeben',
|
||||
'voiceprint.cancel': 'Abbrechen',
|
||||
'voiceprint.save': 'Speichern',
|
||||
'voiceprint.editSpeaker': 'Sprecher bearbeiten',
|
||||
'voiceprint.selectVector': 'Stimmabdruck-Vektor auswählen',
|
||||
'voiceprint.voiceprintInterfaceNotConfigured': 'Stimmabdruck-Schnittstelle nicht konfiguriert',
|
||||
|
||||
// Einstellungsseite
|
||||
'settings.pageTitle': 'Einstellungen',
|
||||
'settings.navigationTitle': 'Einstellungen',
|
||||
'settings.networkSettings': 'Netzwerkeinstellungen',
|
||||
'settings.serverApiUrl': 'Server-API-URL',
|
||||
'settings.validServerUrl': 'Bitte gültige Serveradresse eingeben (beginnt mit http oder https und endet mit /xiaozhi)',
|
||||
'settings.saveSettings': 'Einstellungen speichern',
|
||||
'settings.resetDefault': 'Auf Standard zurücksetzen',
|
||||
'settings.restartApp': 'App neu starten',
|
||||
'settings.restartNow': 'Jetzt neu starten',
|
||||
'settings.restartLater': 'Später',
|
||||
// Über uns
|
||||
'settings.aboutApp': 'Über XiaoZhi Konsole',
|
||||
'settings.aboutContent': 'XiaoZhi Konsole\n\nEine plattformübergreifende mobile Management-App, erstellt mit Vue.js 3 + uni-app, bietet Geräteverwaltung, Agentenkonfiguration und andere Funktionen für xiaozhi ESP32 Smart Hardware.\n\n© 2025 xiaozhi-esp32-server {version}',
|
||||
'settings.restartSuccess': 'Gespeichert, Sie können die App später manuell neu starten',
|
||||
'settings.serverUrlSavedAndCacheCleared': 'Server-URL gespeichert und Cache geleert',
|
||||
'settings.resetToDefaultAndCacheCleared': 'Auf Standard zurückgesetzt und Cache geleert',
|
||||
'settings.resetSuccess': 'Zurücksetzen erfolgreich',
|
||||
'settings.enterServerUrl': 'Bitte Server-URL eingeben',
|
||||
'settings.clearCacheFailed': 'Cache konnte nicht geleert werden',
|
||||
'settings.cacheManagement': 'Cache-Verwaltung',
|
||||
'settings.totalCacheSize': 'Gesamte Cache-Größe',
|
||||
'settings.appDataSize': 'Gesamte App-Datengröße',
|
||||
'settings.cacheClear': 'Cache leeren',
|
||||
'settings.clearAllCache': 'Alle Cache-Daten löschen',
|
||||
'settings.clearCache': 'Cache leeren',
|
||||
'settings.modifyWillClearCache': 'Änderungen werden Cache leeren',
|
||||
'settings.appInfo': 'App-Info',
|
||||
'settings.aboutUs': 'Über uns',
|
||||
'settings.appVersion': 'App-Version & Team-Info',
|
||||
'settings.confirmClear': 'Löschen bestätigen',
|
||||
'settings.confirmClearMessage': 'Sind Sie sicher, dass Sie den gesamten Cache löschen möchten? Dies löscht alle Daten einschließlich Anmeldestatus und erfordert erneute Anmeldung.',
|
||||
'settings.cacheCleared': 'Cache erfolgreich geleert, leite zur Anmeldeseite weiter',
|
||||
'settings.languageSettings': 'Spracheinstellungen',
|
||||
'settings.language': 'Sprache',
|
||||
'settings.selectLanguage': 'Sprache auswählen',
|
||||
'settings.languageChanged': 'Sprache erfolgreich geändert',
|
||||
|
||||
// Nachrichten
|
||||
'message.loginSuccess': 'Anmeldung erfolgreich!',
|
||||
'message.loginFail': 'Anmeldung fehlgeschlagen',
|
||||
'message.registerSuccess': 'Registrierung erfolgreich',
|
||||
'message.registerFail': 'Registrierung fehlgeschlagen',
|
||||
'message.saveSuccess': 'Erfolgreich gespeichert',
|
||||
'message.saveFail': 'Speichern fehlgeschlagen',
|
||||
'message.deleteSuccess': 'Erfolgreich gelöscht',
|
||||
'message.deleteFail': 'Löschen fehlgeschlagen',
|
||||
'message.bindSuccess': 'Binden erfolgreich',
|
||||
'message.bindFail': 'Binden fehlgeschlagen',
|
||||
'message.unbindSuccess': 'Entbinden erfolgreich',
|
||||
'message.unbindFail': 'Entbinden fehlgeschlagen',
|
||||
'message.networkError': 'Netzwerkfehler, bitte Verbindung prüfen',
|
||||
'message.serverError': 'Serverfehler, bitte später erneut versuchen',
|
||||
'message.invalidAddress': 'Ungültige Adresse, bitte prüfen ob Server gestartet oder Netzwerkverbindung normal ist',
|
||||
'message.languageChanged': 'Sprache geändert',
|
||||
'message.passwordError': 'Konto oder Passwort Fehler',
|
||||
'message.phoneRegistered': 'Diese Handynummer wurde bereits registriert',
|
||||
|
||||
// Agenten-Werkzeuge Seite
|
||||
'agent.tools.pageTitle': 'Agenten-Werkzeuge',
|
||||
'agent.tools.unselected': 'Nicht ausgewählt',
|
||||
'agent.tools.selected': 'Ausgewählt',
|
||||
'agent.tools.noMorePlugins': 'Keine weiteren Plugins',
|
||||
'agent.tools.pleaseSelectPlugin': 'Bitte Plugin-Funktion auswählen',
|
||||
'agent.tools.builtInPlugins': 'Eingebaute Plugins',
|
||||
'agent.tools.mcpAccessPoint': 'MCP-Zugangspunkt',
|
||||
'agent.tools.copy': 'Kopieren',
|
||||
'agent.tools.noTools': 'Keine Werkzeuge verfügbar',
|
||||
'agent.tools.parameterConfig': 'Parameterkonfiguration',
|
||||
'agent.tools.noParamsNeeded': 'Keine Parameter benötigt',
|
||||
'agent.tools.pleaseInput': 'Bitte eingeben',
|
||||
'agent.tools.inputOneItemPerLine': 'Ein Element pro Zeile eingeben',
|
||||
'agent.tools.pleaseInputValidJson': 'Bitte gültiges JSON-Format eingeben',
|
||||
'agent.tools.enableFunction': 'Funktion aktivieren',
|
||||
'agent.tools.toggleFunction': 'Diese Funktion ein- oder ausschalten',
|
||||
'agent.tools.jsonFormatError': 'JSON-Format Fehler',
|
||||
'agent.tools.noMcpAddressToCopy': 'Keine MCP-Adresse zum Kopieren',
|
||||
'agent.tools.mcpAddressCopied': 'MCP-Adresse in Zwischenablage kopiert',
|
||||
'agent.tools.copyFailed': 'Kopieren fehlgeschlagen, bitte erneut versuchen',
|
||||
'agent.tools.defaultValue': 'Standardwert',
|
||||
'agent.tools.notSelected': 'Nicht ausgewählt',
|
||||
'agent.tools.clickToConfigure': 'Klicken zum Konfigurieren',
|
||||
'agent.tools.mcpEndpoint': 'MCP-Endpunkt',
|
||||
'agent.tools.eachLineOneItem': 'Ein Element pro Zeile eingeben',
|
||||
|
||||
// Gerätekonfigurationsseite
|
||||
'deviceConfig.pageTitle': 'Gerätekonfiguration',
|
||||
'deviceConfig.wifiConfig': 'WiFi-Konfiguration',
|
||||
'deviceConfig.ultrasonicConfig': 'Ultraschall-Konfiguration',
|
||||
'deviceConfig.selectConfigMethod': 'Konfigurationsmethode auswählen',
|
||||
'deviceConfig.networkConfig': 'Netzwerkkonfiguration',
|
||||
'deviceConfig.selectedNetwork': 'Ausgewähltes Netzwerk',
|
||||
'deviceConfig.signal': 'Signal',
|
||||
'deviceConfig.openNetwork': 'Offenes Netzwerk',
|
||||
'deviceConfig.encryptedNetwork': 'Verschlüsseltes Netzwerk',
|
||||
'deviceConfig.password': 'Passwort',
|
||||
'deviceConfig.pleaseEnterPassword': 'Bitte WiFi-Passwort eingeben',
|
||||
'deviceConfig.startConfig': 'Konfiguration starten',
|
||||
'deviceConfig.connectToXiaozhiHotspot': 'Bitte verbinden Sie sich zuerst mit dem xiaozhi Hotspot',
|
||||
'deviceConfig.detecting': 'Erkennen...',
|
||||
'deviceConfig.reDetect': 'Erneut erkennen',
|
||||
'deviceConfig.alreadyConnected': 'Mit xiaozhi Hotspot verbunden',
|
||||
'deviceConfig.refreshStatus': 'Status aktualisieren',
|
||||
'deviceConfig.wifiNetworks': 'WiFi-Netzwerke',
|
||||
'deviceConfig.selectWifiNetwork': 'WiFi-Netzwerk auswählen',
|
||||
'deviceConfig.refreshScan': 'Scan aktualisieren',
|
||||
'deviceConfig.noWifiNetworks': 'Keine WiFi-Netzwerke verfügbar',
|
||||
'deviceConfig.clickToRefreshScan': 'Bitte Scan aktualisieren klicken',
|
||||
'deviceConfig.signalStrong': 'Starkes Signal',
|
||||
'deviceConfig.signalGood': 'Gutes Signal',
|
||||
'deviceConfig.signalFair': 'Mittleres Signal',
|
||||
'deviceConfig.signalWeak': 'Schwaches Signal',
|
||||
'deviceConfig.channel': 'Kanal',
|
||||
'deviceConfig.about': 'ungefähr',
|
||||
'deviceConfig.seconds': 'Sekunden',
|
||||
'deviceConfig.generating': 'Wird generiert...',
|
||||
'deviceConfig.playing': 'Wird abgespielt...',
|
||||
'deviceConfig.generateAndPlaySoundWave': 'Schallwelle generieren und abspielen',
|
||||
'deviceConfig.playSoundWave': 'Schallwelle abspielen',
|
||||
'deviceConfig.stopPlaying': 'Abspielen stoppen',
|
||||
'deviceConfig.autoLoopPlaySoundWave': 'Schallwelle automatisch wiederholt abspielen',
|
||||
'deviceConfig.configAudioFile': 'Konfigurations-Audio-Datei',
|
||||
'deviceConfig.duration': 'Dauer',
|
||||
'deviceConfig.ultrasonicConfigInstructions': 'Ultraschall-Konfigurationsanleitung',
|
||||
'deviceConfig.ensureWifiNetworkSelectedAndPasswordEntered': 'Stellen Sie sicher, dass WiFi-Netzwerk ausgewählt und Passwort eingegeben ist',
|
||||
'deviceConfig.clickGenerateAndPlaySoundWave': 'Klicken Sie auf Schallwelle generieren und abspielen, das System kodiert Konfigurationsinformationen in Audio',
|
||||
'deviceConfig.bringPhoneCloseToXiaozhiDevice': 'Bringen Sie das Telefon in die Nähe des xiaozhi Geräts (1-2 Meter Entfernung)',
|
||||
'deviceConfig.duringAudioPlaybackXiaozhiWillReceive': 'Während der Audio-Wiedergabe empfängt xiaozhi und dekodiert Konfigurationsinformationen',
|
||||
'deviceConfig.afterConfigSuccessDeviceWillConnect': 'Nach erfolgreicher Konfiguration verbindet sich das Gerät automatisch mit dem WiFi-Netzwerk',
|
||||
'deviceConfig.usesAfskModulation': 'Verwendet AFSK-Modulationstechnologie, überträgt Daten durch 1800Hz und 1500Hz Frequenzen',
|
||||
'deviceConfig.ensureModeratePhoneVolume': 'Bitte stellen Sie sicher, dass die Telefonlautstärke moderat ist, um Umgebungsgeräuschstörungen zu vermeiden',
|
||||
'deviceConfig.generatingUltrasonicConfigAudio': 'Ultraschall-Konfigurationsaudio wird generiert',
|
||||
'deviceConfig.configData': 'Konfigurationsdaten',
|
||||
'deviceConfig.dataBytesLength': 'Datenbytes-Länge',
|
||||
'deviceConfig.bitStreamLength': 'Bitstrom-Länge',
|
||||
'deviceConfig.base64Length': 'Base64-Länge',
|
||||
'deviceConfig.audioFileTooLarge': 'Audio-Datei zu groß, bitte SSID oder Passwortlänge kürzen',
|
||||
'deviceConfig.audioGenerationSuccess': 'Audio-Generierung erfolgreich',
|
||||
'deviceConfig.samplePoints': 'Abtastpunkte',
|
||||
'deviceConfig.soundWaveGenerationSuccess': 'Schallwellen-Generierung erfolgreich',
|
||||
'deviceConfig.audioGenerationFailed': 'Audio-Generierung fehlgeschlagen',
|
||||
'deviceConfig.soundWaveGenerationFailed': 'Schallwellen-Generierung fehlgeschlagen',
|
||||
'deviceConfig.pleaseGenerateAudioFirst': 'Bitte generieren Sie zuerst Audio',
|
||||
'deviceConfig.startPlayingUltrasonicConfigAudio': 'Ultraschall-Konfigurationsaudio wird abgespielt',
|
||||
'deviceConfig.ultrasonicAudioStartedPlaying': 'Ultraschall-Audio wurde gestartet',
|
||||
'deviceConfig.startPlayingConfigSoundWave': 'Konfigurations-Schallwelle wurde gestartet',
|
||||
'deviceConfig.ultrasonicAudioPlaybackEnded': 'Ultraschall-Audio-Wiedergabe beendet',
|
||||
'deviceConfig.audioPlaybackFailed': 'Audio-Wiedergabe fehlgeschlagen',
|
||||
'deviceConfig.audioResourceBusy': 'Audio-Ressource beschäftigt, bitte später erneut versuchen',
|
||||
'deviceConfig.audioFormatNotSupported': 'Audio-Format nicht unterstützt, möglicherweise ein Data-URI-Problem',
|
||||
'deviceConfig.audioFileError': 'Audio-Datei-Fehler',
|
||||
'deviceConfig.cleaningUpAudioContext': 'Audio-Kontext wird bereinigt',
|
||||
'deviceConfig.cleaningUpAudioContextFailed': 'Audio-Kontext-Bereinigung fehlgeschlagen',
|
||||
'deviceConfig.stoppedPlayingUltrasonicAudio': 'Ultraschall-Audio-Wiedergabe gestoppt',
|
||||
'deviceConfig.stoppedPlaying': 'Wiedergabe gestoppt',
|
||||
'deviceConfig.configMethod': 'Konfigurationsmethode',
|
||||
'deviceConfig.enterWifiPassword': 'Bitte WiFi-Passwort eingeben',
|
||||
'deviceConfig.xiaozhi': 'xiaozhi',
|
||||
'deviceConfig.connectXiaozhiHotspot': 'Bitte verbinden Sie sich mit dem xiaozhi Hotspot',
|
||||
'deviceConfig.wifiScanResponse': 'WiFi-Scan-Antwort',
|
||||
'deviceConfig.scanSuccess': 'Scan erfolgreich',
|
||||
'deviceConfig.networks': 'Netzwerke',
|
||||
'deviceConfig.wifiScanFailed': 'WiFi-Scan fehlgeschlagen',
|
||||
'deviceConfig.scanFailedCheckConnection': 'Scan fehlgeschlagen, bitte Verbindung prüfen',
|
||||
'deviceConfig.checking': 'Wird geprüft',
|
||||
'deviceConfig.reCheck': 'Erneut prüfen',
|
||||
'deviceConfig.connectedXiaozhiHotspot': 'Mit xiaozhi Hotspot verbunden',
|
||||
'deviceConfig.wifiNetwork': 'WiFi-Netzwerk',
|
||||
'deviceConfig.scanning': 'Wird gescannt',
|
||||
'deviceConfig.cancel': 'Abbrechen',
|
||||
'deviceConfig.clickRefreshScan': 'Bitte Scan aktualisieren klicken',
|
||||
'deviceConfig.esp32ConnectionCheckFailed': 'ESP32-Verbindungsprüfung fehlgeschlagen',
|
||||
'deviceConfig.startWifiConfig': 'WiFi-Konfiguration wird gestartet',
|
||||
'deviceConfig.configSuccess': 'Konfiguration erfolgreich',
|
||||
'deviceConfig.deviceWillConnectTo': 'Gerät wird sich verbinden mit',
|
||||
'deviceConfig.deviceWillRestart': 'Gerät wird neu starten',
|
||||
'deviceConfig.pleaseDisconnectXiaozhiHotspot': 'Bitte trennen Sie sich vom xiaozhi Hotspot',
|
||||
'deviceConfig.configFailed': 'Konfiguration fehlgeschlagen',
|
||||
'deviceConfig.wifiConfigFailed': 'WiFi-Konfiguration fehlgeschlagen',
|
||||
'deviceConfig.pleaseCheckNetworkConnection': 'Bitte Netzwerkverbindung prüfen',
|
||||
'deviceConfig.startWifiConfigButton': 'Konfiguration starten',
|
||||
'deviceConfig.wifiConfigInstructions': 'WiFi-Konfigurationsanleitung',
|
||||
'deviceConfig.phoneConnectXiaozhiHotspot': 'Telefon mit xiaozhi Hotspot verbinden',
|
||||
'deviceConfig.selectTargetWifiNetwork': 'Ziel-WiFi-Netzwerk auswählen',
|
||||
'deviceConfig.enterWifiPasswordIfNeeded': 'WiFi-Passwort eingeben falls benötigt',
|
||||
'deviceConfig.clickStartConfigAndWait': 'Konfiguration starten klicken und warten',
|
||||
'deviceConfig.afterConfigSuccessDeviceWillRestart': 'Nach erfolgreicher Konfiguration startet Gerät automatisch neu',
|
||||
'deviceConfig.audioPlaybackError': 'Audio-Wiedergabe-Fehler',
|
||||
'deviceConfig.playbackFailed': 'Wiedergabe fehlgeschlagen',
|
||||
}
|
||||
@@ -3,15 +3,19 @@ import { useLangStore } from '@/store/lang'
|
||||
import type { Language } from '@/store/lang'
|
||||
|
||||
// 导入各个语言的翻译文件
|
||||
import zhCN from './zh_CN'
|
||||
import zh_CN from './zh_CN'
|
||||
import en from './en'
|
||||
import zhTW from './zh_TW'
|
||||
import zh_TW from './zh_TW'
|
||||
import de from './de'
|
||||
import vi from './vi'
|
||||
|
||||
// 语言包映射
|
||||
const messages = {
|
||||
zh_CN: zhCN,
|
||||
zh_CN: zh_CN,
|
||||
en,
|
||||
zh_TW: zhTW,
|
||||
zh_TW: zh_TW,
|
||||
de,
|
||||
vi,
|
||||
}
|
||||
|
||||
// 当前使用的语言
|
||||
@@ -61,10 +65,12 @@ export function getCurrentLanguage(): Language {
|
||||
}
|
||||
|
||||
// 获取支持的语言列表
|
||||
export function getSupportedLanguages(): {code: Language, name: string}[] {
|
||||
export function getSupportedLanguages(): { code: Language, name: string }[] {
|
||||
return [
|
||||
{ code: 'zh_CN', name: '简体中文' },
|
||||
{ code: 'en', name: 'English' },
|
||||
{ code: 'zh_TW', name: '繁體中文' },
|
||||
{ code: 'de', name: 'Deutsch' },
|
||||
{ code: 'vi', name: 'Tiếng Việt' },
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,440 @@
|
||||
// Gói ngôn ngữ tiếng Việt
|
||||
export default {
|
||||
// TabBar
|
||||
'tabBar.home': 'Trang chủ',
|
||||
'tabBar.deviceConfig': 'Cấu hình mạng',
|
||||
'tabBar.settings': 'Hệ thống',
|
||||
// Tiêu đề trang cài đặt
|
||||
'settings.title': 'Cài đặt',
|
||||
// Trang đăng nhập
|
||||
'login.pageTitle': 'Đăng nhập',
|
||||
'login.navigationTitle': 'Đăng nhập',
|
||||
'login.fetchConfigError': 'Không thể tải cấu hình:',
|
||||
'login.selectLanguage': 'Chọn ngôn ngữ',
|
||||
'login.selectLanguageTip': 'de',
|
||||
'login.welcomeBack': 'Chào mừng trở lại',
|
||||
'login.pleaseLogin': 'Vui lòng đăng nhập vào tài khoản của bạn',
|
||||
'login.enterUsername': 'Vui lòng nhập tên đăng nhập',
|
||||
'login.enterPassword': 'Vui lòng nhập mật khẩu',
|
||||
'login.enterCaptcha': 'Vui lòng nhập mã xác minh',
|
||||
'login.loginButton': 'Đăng nhập',
|
||||
'login.loggingIn': 'Đang đăng nhập...',
|
||||
'login.noAccount': 'Đăng ký',
|
||||
'login.enterPhone': 'Vui lòng nhập số điện thoại',
|
||||
'login.selectCountry': 'Chọn quốc gia/vùng',
|
||||
'login.confirm': 'Xác nhận',
|
||||
'login.serverSetting': 'Cài đặt máy chủ',
|
||||
'login.requiredUsername': 'Tên đăng nhập không thể để trống',
|
||||
'login.requiredPassword': 'Mật khẩu không thể để trống',
|
||||
'login.requiredCaptcha': 'Mã xác minh không thể để trống',
|
||||
'login.requiredMobile': 'Vui lòng nhập số điện thoại hợp lệ',
|
||||
'login.captchaError': 'Lỗi mã xác minh đồ họa',
|
||||
'login.forgotPassword': 'Quên mật khẩu',
|
||||
|
||||
// Trang đăng ký
|
||||
'register.pageTitle': 'Đăng ký',
|
||||
'register.createAccount': 'Tạo tài khoản',
|
||||
'register.enterUsername': 'Vui lòng nhập tên đăng nhập',
|
||||
'register.enterPassword': 'Vui lòng nhập mật khẩu',
|
||||
'register.confirmPassword': 'Vui lòng xác nhận mật khẩu',
|
||||
'register.enterPhone': 'Vui lòng nhập số điện thoại',
|
||||
'register.enterCode': 'Vui lòng nhập mã xác minh',
|
||||
'register.getCode': 'Lấy mã',
|
||||
'register.agreeTerms': 'Tôi đã đọc và đồng ý với',
|
||||
'register.terms': 'Thỏa thuận người dùng',
|
||||
'register.privacy': 'Chính sách bảo mật',
|
||||
'register.registerButton': 'Đăng ký',
|
||||
'register.registering': 'Đang đăng ký...',
|
||||
'register.haveAccount': 'Đã có tài khoản?',
|
||||
'register.loginNow': 'Đăng nhập ngay',
|
||||
'register.selectCountry': 'Chọn quốc gia/vùng',
|
||||
'register.confirm': 'Xác nhận',
|
||||
'register.captchaSendSuccess': 'Đã gửi mã xác minh thành công',
|
||||
|
||||
// Trang chủ
|
||||
'home.pageTitle': 'Trang chủ',
|
||||
'home.createAgent': 'Tạo đại lý',
|
||||
'home.agentName': 'Đại lý',
|
||||
'home.modelInfo': 'Thông tin mô hình',
|
||||
'home.lastActive': 'Hoạt động lần cuối',
|
||||
'home.greeting': 'Xin chào Jarvis',
|
||||
'home.subtitle': 'Hãy cùng có',
|
||||
'home.wonderfulDay': 'một ngày tuyệt vời!',
|
||||
'home.emptyState': 'Không có đại lý nào',
|
||||
'home.deviceManagement': 'Quản lý thiết bị',
|
||||
'home.lastConversation': 'Cuộc trò chuyện cuối:',
|
||||
'home.delete': 'Xóa',
|
||||
'home.createFirstAgent': 'Nhấp vào nút + ở góc dưới bên phải để tạo đại lý đầu tiên của bạn',
|
||||
'home.dialogTitle': 'Tạo đại lý',
|
||||
'home.inputPlaceholder': 'ví dụ: Trợ lý chăm sóc khách hàng, Trợ lý giọng nói, Hỏi đáp kiến thức',
|
||||
'home.createError': 'Vui lòng nhập tên đại lý',
|
||||
'home.createNow': 'Tạo ngay',
|
||||
'home.justNow': 'Vừa xong',
|
||||
'home.minutesAgo': 'phút trước',
|
||||
'home.hoursAgo': 'giờ trước',
|
||||
'home.daysAgo': 'ngày trước',
|
||||
|
||||
// Trang đại lý
|
||||
'agent.pageTitle': 'Đại lý',
|
||||
'agent.roleConfig': 'Cấu hình vai trò',
|
||||
'agent.deviceManagement': 'Quản lý thiết bị',
|
||||
'agent.chatHistory': 'Lịch sử trò chuyện',
|
||||
'agent.voiceprintManagement': 'Quản lý dấu giọng nói',
|
||||
'agent.editTitle': 'Chỉnh sửa đại lý',
|
||||
'agent.toolsTitle': 'Chỉnh sửa tính năng',
|
||||
'agent.voiceActivityDetection': 'Phát hiện hoạt động giọng nói',
|
||||
'agent.speechRecognition': 'Nhận dạng giọng nói',
|
||||
'agent.largeLanguageModel': 'Mô hình ngôn ngữ lớn',
|
||||
'agent.save': 'Lưu',
|
||||
'agent.cancel': 'Hủy',
|
||||
// Trang chỉnh sửa đại lý
|
||||
'agent.basicInfo': 'Thông tin cơ bản',
|
||||
'agent.agentName': 'Tên đại lý',
|
||||
'agent.inputAgentName': 'Vui lòng nhập tên đại lý',
|
||||
'agent.roleMode': 'Chế độ vai trò',
|
||||
'agent.roleDescription': 'Mô tả vai trò',
|
||||
'agent.inputRoleDescription': 'Vui lòng nhập mô tả vai trò',
|
||||
'agent.modelConfig': 'Cấu hình mô hình',
|
||||
'agent.vad': 'Phát hiện hoạt động giọng nói',
|
||||
'agent.asr': 'Nhận dạng giọng nói',
|
||||
'agent.llm': 'Mô hình ngôn ngữ lớn',
|
||||
'agent.vllm': 'Mô hình ngôn ngữ thị giác',
|
||||
'agent.intent': 'Nhận dạng ý định',
|
||||
'agent.memory': 'Bộ nhớ',
|
||||
'agent.voiceSettings': 'Cài đặt giọng nói',
|
||||
'agent.tts': 'Văn bản thành giọng nói',
|
||||
'agent.voiceprint': 'Giọng nói đại lý',
|
||||
'agent.plugins': 'Plugin',
|
||||
'agent.editFunctions': 'Chỉnh sửa tính năng',
|
||||
'agent.historyMemory': 'Bộ nhớ lịch sử',
|
||||
'agent.memoryContent': 'Nội dung bộ nhớ',
|
||||
'agent.saving': 'Đang lưu...',
|
||||
'agent.saveSuccess': 'Lưu thành công',
|
||||
'agent.saveFail': 'Lưu thất bại',
|
||||
'agent.loadFail': 'Tải thất bại',
|
||||
'agent.pleaseInputAgentName': 'Vui lòng nhập tên đại lý',
|
||||
'agent.pleaseInputRoleDescription': 'Vui lòng nhập mô tả vai trò',
|
||||
'agent.pleaseSelect': 'Vui lòng chọn',
|
||||
|
||||
// Trang lịch sử trò chuyện
|
||||
'chatHistory.getChatSessions': 'Lấy danh sách phiên trò chuyện',
|
||||
'chatHistory.noSelectedAgent': 'Chưa chọn đại lý',
|
||||
'chatHistory.getChatSessionsFailed': 'Không thể lấy danh sách phiên trò chuyện:',
|
||||
'chatHistory.unknownTime': 'Thời gian không xác định',
|
||||
'chatHistory.justNow': 'Vừa xong',
|
||||
'chatHistory.minutesAgo': '{minutes} phút trước',
|
||||
'chatHistory.hoursAgo': '{hours} giờ trước',
|
||||
'chatHistory.daysAgo': '{days} ngày trước',
|
||||
'chatHistory.conversationRecord': 'Bản ghi trò chuyện',
|
||||
'chatHistory.totalChats': 'Tổng cộng {count} cuộc trò chuyện',
|
||||
'chatHistory.loading': 'Đang tải...',
|
||||
'chatHistory.noMoreData': 'Không còn dữ liệu',
|
||||
'chatHistory.noChatRecords': 'Không có bản ghi trò chuyện',
|
||||
'chatHistory.chatRecordsDescription': 'Bản ghi trò chuyện với đại lý sẽ hiển thị ở đây',
|
||||
// Trang chi tiết lịch sử trò chuyện
|
||||
'chatHistory.pageTitle': 'Chi tiết trò chuyện',
|
||||
'chatHistory.assistantName': 'Trợ lý thông minh',
|
||||
'chatHistory.userName': 'Người dùng',
|
||||
'chatHistory.aiAssistantName': 'Trợ lý AI',
|
||||
'chatHistory.loadFailed': 'Không thể tải lịch sử trò chuyện',
|
||||
'chatHistory.parameterError': 'Lỗi tham số trang',
|
||||
'chatHistory.invalidAudioId': 'ID âm thanh không hợp lệ',
|
||||
'chatHistory.audioPlayFailed': 'Phát âm thanh thất bại',
|
||||
'chatHistory.playAudioFailed': 'Không thể phát âm thanh',
|
||||
|
||||
// Trang quản lý thiết bị
|
||||
'device.pageTitle': 'Quản lý thiết bị',
|
||||
'device.noDevices': 'Không có thiết bị nào',
|
||||
'device.macAddress': 'Địa chỉ MAC',
|
||||
'device.firmwareVersion': 'Phiên bản firmware',
|
||||
'device.lastConnected': 'Cuộc trò chuyện cuối',
|
||||
'device.otaUpdate': 'Cập nhật OTA',
|
||||
'device.unbind': 'Hủy liên kết',
|
||||
'device.confirmUnbind': 'Xác nhận',
|
||||
'device.bindDevice': 'Liên kết thiết bị mới',
|
||||
'device.deviceType': 'Loại thiết bị',
|
||||
'device.loading': 'Đang tải...',
|
||||
'device.neverConnected': 'Chưa kết nối',
|
||||
'device.justNow': 'Vừa xong',
|
||||
'device.minutesAgo': '{minutes} phút trước',
|
||||
'device.hoursAgo': '{hours} giờ trước',
|
||||
'device.daysAgo': '{days} ngày trước',
|
||||
'device.otaAutoUpdateEnabled': 'Đã bật cập nhật OTA tự động',
|
||||
'device.otaAutoUpdateDisabled': 'Đã tắt cập nhật OTA tự động',
|
||||
'device.operationFailed': 'Thao tác thất bại, vui lòng thử lại',
|
||||
'device.deviceUnbound': 'Đã hủy liên kết thiết bị',
|
||||
'device.unbindFailed': 'Hủy liên kết thất bại, vui lòng thử lại',
|
||||
'device.unbindDevice': 'Hủy liên kết thiết bị',
|
||||
'device.confirmUnbindDevice': 'Bạn có chắc chắn muốn hủy liên kết thiết bị "{macAddress}"?',
|
||||
'device.cancel': 'Hủy',
|
||||
'device.noDevice': 'Không có thiết bị',
|
||||
'device.pleaseSelectAgent': 'Vui lòng chọn một đại lý trước',
|
||||
'device.deviceBindSuccess': 'Liên kết thiết bị thành công!',
|
||||
'device.bindFailed': 'Liên kết thất bại, vui lòng kiểm tra mã xác minh có đúng không',
|
||||
'device.enterDeviceCode': 'Vui lòng nhập mã xác minh thiết bị',
|
||||
'device.bindNow': 'Liên kết ngay',
|
||||
'device.lastConnection': 'Kết nối cuối',
|
||||
'device.clickToBindFirstDevice': 'Nhấp vào nút + ở góc dưới bên phải để liên kết thiết bị đầu tiên của bạn',
|
||||
|
||||
// Chung
|
||||
'common.success': 'Thành công',
|
||||
'common.fail': 'Thất bại',
|
||||
'common.loading': 'Đang tải...',
|
||||
'common.confirm': 'Xác nhận',
|
||||
'common.cancel': 'Hủy',
|
||||
'common.delete': 'Xóa',
|
||||
'common.edit': 'Chỉnh sửa',
|
||||
'common.add': 'Thêm',
|
||||
'common.pleaseSelect': 'Vui lòng chọn',
|
||||
'common.unknownError': 'Lỗi không xác định',
|
||||
'common.networkError': 'Lỗi mạng',
|
||||
|
||||
// Trang khôi phục mật khẩu
|
||||
'retrievePassword.title': 'Đặt lại mật khẩu',
|
||||
'retrievePassword.subtitle': 'Khôi phục mật khẩu tài khoản qua số điện thoại',
|
||||
'retrievePassword.mobileRequired': 'Vui lòng nhập số điện thoại',
|
||||
'retrievePassword.inputCorrectMobile': 'Vui lòng nhập số điện thoại hợp lệ',
|
||||
'retrievePassword.captchaRequired': 'Vui lòng nhập mã xác minh đồ họa',
|
||||
'retrievePassword.mobileCaptchaRequired': 'Vui lòng nhập mã xác minh SMS',
|
||||
'retrievePassword.newPasswordRequired': 'Vui lòng nhập mật khẩu mới',
|
||||
'retrievePassword.confirmNewPasswordRequired': 'Vui lòng xác nhận mật khẩu mới',
|
||||
'retrievePassword.passwordsNotMatch': 'Mật khẩu không khớp',
|
||||
'retrievePassword.mobilePlaceholder': 'Vui lòng nhập số điện thoại',
|
||||
'retrievePassword.captchaPlaceholder': 'Vui lòng nhập mã xác minh đồ họa',
|
||||
'retrievePassword.mobileCaptchaPlaceholder': 'Vui lòng nhập mã xác minh SMS',
|
||||
'retrievePassword.newPasswordPlaceholder': 'Vui lòng nhập mật khẩu mới',
|
||||
'retrievePassword.confirmNewPasswordPlaceholder': 'Vui lòng xác nhận mật khẩu mới',
|
||||
'retrievePassword.getMobileCaptcha': 'Lấy mã',
|
||||
'retrievePassword.captchaSendSuccess': 'Đã gửi mã xác minh thành công',
|
||||
'retrievePassword.passwordUpdateSuccess': 'Đặt lại mật khẩu thành công',
|
||||
'retrievePassword.resetButton': 'Đặt lại mật khẩu',
|
||||
'retrievePassword.goToLogin': 'Quay lại đăng nhập',
|
||||
|
||||
// Thông báo lỗi liên quan đến mã hóa SM2
|
||||
'sm2.publicKeyNotConfigured': 'Khóa công khai SM2 chưa được cấu hình, vui lòng liên hệ quản trị viên',
|
||||
'sm2.encryptionFailed': 'Mã hóa mật khẩu thất bại',
|
||||
'sm2.keyGenerationFailed': 'Tạo cặp khóa thất bại',
|
||||
'sm2.invalidPublicKey': 'Định dạng khóa công khai không hợp lệ',
|
||||
'sm2.encryptionError': 'Đã xảy ra lỗi khi mã hóa',
|
||||
'sm2.publicKeyRetry': 'Đang thử lấy lại khóa công khai...',
|
||||
'sm2.publicKeyRetryFailed': 'Thử lấy lại khóa công khai thất bại',
|
||||
|
||||
// Trang dấu giọng nói
|
||||
'voiceprint.noSelectedAgent': 'Chưa chọn đại lý',
|
||||
'voiceprint.pleaseSelectAgent': 'Vui lòng chọn một đại lý trước',
|
||||
'voiceprint.fetchHistoryFailed': 'Không thể tải lịch sử trò chuyện',
|
||||
'voiceprint.clickToSelectVector': 'Nhấp để chọn vector dấu giọng nói',
|
||||
'voiceprint.pleaseInputName': 'Vui lòng nhập tên',
|
||||
'voiceprint.pleaseSelectVector': 'Vui lòng chọn vector dấu giọng nói',
|
||||
'voiceprint.addSuccess': 'Thêm thành công',
|
||||
'voiceprint.addFailed': 'Thêm người nói thất bại',
|
||||
'voiceprint.editSuccess': 'Chỉnh sửa thành công',
|
||||
'voiceprint.editFailed': 'Chỉnh sửa người nói thất bại',
|
||||
'voiceprint.deleteConfirmMsg': 'Bạn có chắc chắn muốn xóa người nói này?',
|
||||
'voiceprint.deleteConfirmTitle': 'Xác nhận xóa',
|
||||
'voiceprint.deleteSuccess': 'Xóa thành công',
|
||||
'voiceprint.loading': 'Đang tải...',
|
||||
'voiceprint.delete': 'Xóa',
|
||||
'voiceprint.emptyTitle': 'Không có dữ liệu dấu giọng nói',
|
||||
'voiceprint.emptyDesc': 'Nhấp vào nút + ở góc dưới bên phải để thêm người nói đầu tiên của bạn',
|
||||
'voiceprint.addSpeaker': 'Thêm người nói',
|
||||
'voiceprint.voiceVector': 'Vector dấu giọng nói',
|
||||
'voiceprint.name': 'Tên',
|
||||
'voiceprint.description': 'Mô tả',
|
||||
'voiceprint.pleaseInputDescription': 'Vui lòng nhập mô tả',
|
||||
'voiceprint.cancel': 'Hủy',
|
||||
'voiceprint.save': 'Lưu',
|
||||
'voiceprint.editSpeaker': 'Chỉnh sửa người nói',
|
||||
'voiceprint.selectVector': 'Chọn vector dấu giọng nói',
|
||||
'voiceprint.voiceprintInterfaceNotConfigured': 'Giao diện dấu giọng nói chưa được cấu hình',
|
||||
|
||||
// Trang cài đặt
|
||||
'settings.pageTitle': 'Cài đặt',
|
||||
'settings.navigationTitle': 'Cài đặt',
|
||||
'settings.networkSettings': 'Cài đặt mạng',
|
||||
'settings.serverApiUrl': 'URL API máy chủ',
|
||||
'settings.validServerUrl': 'Vui lòng nhập địa chỉ máy chủ hợp lệ (bắt đầu bằng http hoặc https và kết thúc bằng /xiaozhi)',
|
||||
'settings.saveSettings': 'Lưu cài đặt',
|
||||
'settings.resetDefault': 'Đặt lại mặc định',
|
||||
'settings.restartApp': 'Khởi động lại ứng dụng',
|
||||
'settings.restartNow': 'Khởi động lại ngay',
|
||||
'settings.restartLater': 'Để sau',
|
||||
// Về chúng tôi
|
||||
'settings.aboutApp': 'Về Bảng điều khiển XiaoZhi',
|
||||
'settings.aboutContent': 'Bảng điều khiển XiaoZhi\n\nỨng dụng quản lý di động đa nền tảng được xây dựng với Vue.js 3 + uni-app, cung cấp quản lý thiết bị, cấu hình đại lý và các chức năng khác cho phần cứng thông minh xiaozhi ESP32.\n\n© 2025 xiaozhi-esp32-server {version}',
|
||||
'settings.restartSuccess': 'Đã lưu, bạn có thể tự khởi động lại ứng dụng sau',
|
||||
'settings.serverUrlSavedAndCacheCleared': 'Đã lưu URL máy chủ và xóa bộ nhớ cache',
|
||||
'settings.resetToDefaultAndCacheCleared': 'Đã đặt lại mặc định và xóa bộ nhớ cache',
|
||||
'settings.resetSuccess': 'Đặt lại thành công',
|
||||
'settings.enterServerUrl': 'Vui lòng nhập URL máy chủ',
|
||||
'settings.clearCacheFailed': 'Không thể xóa bộ nhớ cache',
|
||||
'settings.cacheManagement': 'Quản lý bộ nhớ cache',
|
||||
'settings.totalCacheSize': 'Tổng kích thước bộ nhớ cache',
|
||||
'settings.appDataSize': 'Tổng kích thước dữ liệu ứng dụng',
|
||||
'settings.cacheClear': 'Xóa bộ nhớ cache',
|
||||
'settings.clearAllCache': 'Xóa tất cả dữ liệu bộ nhớ cache',
|
||||
'settings.clearCache': 'Xóa bộ nhớ cache',
|
||||
'settings.modifyWillClearCache': 'Thay đổi sẽ xóa bộ nhớ cache',
|
||||
'settings.appInfo': 'Thông tin ứng dụng',
|
||||
'settings.aboutUs': 'Về chúng tôi',
|
||||
'settings.appVersion': 'Phiên bản ứng dụng & Thông tin nhóm',
|
||||
'settings.confirmClear': 'Xác nhận xóa',
|
||||
'settings.confirmClearMessage': 'Bạn có chắc chắn muốn xóa toàn bộ bộ nhớ cache? Điều này sẽ xóa tất cả dữ liệu bao gồm trạng thái đăng nhập và yêu cầu đăng nhập lại.',
|
||||
'settings.cacheCleared': 'Đã xóa bộ nhớ cache thành công, đang chuyển hướng đến trang đăng nhập',
|
||||
'settings.languageSettings': 'Cài đặt ngôn ngữ',
|
||||
'settings.language': 'Ngôn ngữ',
|
||||
'settings.selectLanguage': 'Chọn ngôn ngữ',
|
||||
'settings.languageChanged': 'Đã thay đổi ngôn ngữ thành công',
|
||||
|
||||
// Thông báo
|
||||
'message.loginSuccess': 'Đăng nhập thành công!',
|
||||
'message.loginFail': 'Đăng nhập thất bại',
|
||||
'message.registerSuccess': 'Đăng ký thành công',
|
||||
'message.registerFail': 'Đăng ký thất bại',
|
||||
'message.saveSuccess': 'Lưu thành công',
|
||||
'message.saveFail': 'Lưu thất bại',
|
||||
'message.deleteSuccess': 'Xóa thành công',
|
||||
'message.deleteFail': 'Xóa thất bại',
|
||||
'message.bindSuccess': 'Liên kết thành công',
|
||||
'message.bindFail': 'Liên kết thất bại',
|
||||
'message.unbindSuccess': 'Hủy liên kết thành công',
|
||||
'message.unbindFail': 'Hủy liên kết thất bại',
|
||||
'message.networkError': 'Lỗi mạng, vui lòng kiểm tra kết nối',
|
||||
'message.serverError': 'Lỗi máy chủ, vui lòng thử lại sau',
|
||||
'message.invalidAddress': 'Địa chỉ không hợp lệ, vui lòng kiểm tra máy chủ đã khởi động hoặc kết nối mạng bình thường',
|
||||
'message.languageChanged': 'Đã thay đổi ngôn ngữ',
|
||||
'message.passwordError': 'Lỗi tài khoản hoặc mật khẩu',
|
||||
'message.phoneRegistered': 'Số điện thoại này đã được đăng ký',
|
||||
|
||||
// Trang công cụ đại lý
|
||||
'agent.tools.pageTitle': 'Công cụ đại lý',
|
||||
'agent.tools.unselected': 'Chưa chọn',
|
||||
'agent.tools.selected': 'Đã chọn',
|
||||
'agent.tools.noMorePlugins': 'Không còn plugin',
|
||||
'agent.tools.pleaseSelectPlugin': 'Vui lòng chọn chức năng plugin',
|
||||
'agent.tools.builtInPlugins': 'Plugin tích hợp',
|
||||
'agent.tools.mcpAccessPoint': 'Điểm truy cập MCP',
|
||||
'agent.tools.copy': 'Sao chép',
|
||||
'agent.tools.noTools': 'Không có công cụ nào',
|
||||
'agent.tools.parameterConfig': 'Cấu hình tham số',
|
||||
'agent.tools.noParamsNeeded': 'Không cần tham số',
|
||||
'agent.tools.pleaseInput': 'Vui lòng nhập',
|
||||
'agent.tools.inputOneItemPerLine': 'Nhập một mục mỗi dòng',
|
||||
'agent.tools.pleaseInputValidJson': 'Vui lòng nhập định dạng JSON hợp lệ',
|
||||
'agent.tools.enableFunction': 'Bật chức năng',
|
||||
'agent.tools.toggleFunction': 'Bật hoặc tắt chức năng này',
|
||||
'agent.tools.jsonFormatError': 'Lỗi định dạng JSON',
|
||||
'agent.tools.noMcpAddressToCopy': 'Không có địa chỉ MCP để sao chép',
|
||||
'agent.tools.mcpAddressCopied': 'Đã sao chép địa chỉ MCP vào bộ nhớ tạm',
|
||||
'agent.tools.copyFailed': 'Sao chép thất bại, vui lòng thử lại',
|
||||
'agent.tools.defaultValue': 'Giá trị mặc định',
|
||||
'agent.tools.notSelected': 'Chưa chọn',
|
||||
'agent.tools.clickToConfigure': 'Nhấp để cấu hình',
|
||||
'agent.tools.mcpEndpoint': 'Điểm cuối MCP',
|
||||
'agent.tools.eachLineOneItem': 'Nhập một mục mỗi dòng',
|
||||
|
||||
// Trang cấu hình thiết bị
|
||||
'deviceConfig.pageTitle': 'Cấu hình thiết bị',
|
||||
'deviceConfig.wifiConfig': 'Cấu hình WiFi',
|
||||
'deviceConfig.ultrasonicConfig': 'Cấu hình siêu âm',
|
||||
'deviceConfig.selectConfigMethod': 'Chọn phương pháp cấu hình',
|
||||
'deviceConfig.networkConfig': 'Cấu hình mạng',
|
||||
'deviceConfig.selectedNetwork': 'Mạng đã chọn',
|
||||
'deviceConfig.signal': 'Tín hiệu',
|
||||
'deviceConfig.openNetwork': 'Mạng mở',
|
||||
'deviceConfig.encryptedNetwork': 'Mạng mã hóa',
|
||||
'deviceConfig.password': 'Mật khẩu',
|
||||
'deviceConfig.pleaseEnterPassword': 'Vui lòng nhập mật khẩu WiFi',
|
||||
'deviceConfig.startConfig': 'Bắt đầu cấu hình',
|
||||
'deviceConfig.connectToXiaozhiHotspot': 'Vui lòng kết nối với điểm phát sóng xiaozhi trước',
|
||||
'deviceConfig.detecting': 'Đang phát hiện...',
|
||||
'deviceConfig.reDetect': 'Phát hiện lại',
|
||||
'deviceConfig.alreadyConnected': 'Đã kết nối với điểm phát sóng xiaozhi',
|
||||
'deviceConfig.refreshStatus': 'Làm mới trạng thái',
|
||||
'deviceConfig.wifiNetworks': 'Mạng WiFi',
|
||||
'deviceConfig.selectWifiNetwork': 'Chọn mạng WiFi',
|
||||
'deviceConfig.refreshScan': 'Làm mới quét',
|
||||
'deviceConfig.noWifiNetworks': 'Không có mạng WiFi nào',
|
||||
'deviceConfig.clickToRefreshScan': 'Vui lòng nhấp Làm mới quét',
|
||||
'deviceConfig.signalStrong': 'Tín hiệu mạnh',
|
||||
'deviceConfig.signalGood': 'Tín hiệu tốt',
|
||||
'deviceConfig.signalFair': 'Tín hiệu trung bình',
|
||||
'deviceConfig.signalWeak': 'Tín hiệu yếu',
|
||||
'deviceConfig.channel': 'Kênh',
|
||||
'deviceConfig.about': 'khoảng',
|
||||
'deviceConfig.seconds': 'giây',
|
||||
'deviceConfig.generating': 'Đang tạo...',
|
||||
'deviceConfig.playing': 'Đang phát...',
|
||||
'deviceConfig.generateAndPlaySoundWave': 'Tạo và phát sóng âm',
|
||||
'deviceConfig.playSoundWave': 'Phát sóng âm',
|
||||
'deviceConfig.stopPlaying': 'Dừng phát',
|
||||
'deviceConfig.autoLoopPlaySoundWave': 'Tự động lặp phát sóng âm',
|
||||
'deviceConfig.configAudioFile': 'Tệp âm thanh cấu hình',
|
||||
'deviceConfig.duration': 'Thời lượng',
|
||||
'deviceConfig.ultrasonicConfigInstructions': 'Hướng dẫn cấu hình siêu âm',
|
||||
'deviceConfig.ensureWifiNetworkSelectedAndPasswordEntered': 'Đảm bảo mạng WiFi được chọn và mật khẩu đã nhập',
|
||||
'deviceConfig.clickGenerateAndPlaySoundWave': 'Nhấp Tạo và phát sóng âm, hệ thống sẽ mã hóa thông tin cấu hình thành âm thanh',
|
||||
'deviceConfig.bringPhoneCloseToXiaozhiDevice': 'Đưa điện thoại lại gần thiết bị xiaozhi (khoảng cách 1-2 mét)',
|
||||
'deviceConfig.duringAudioPlaybackXiaozhiWillReceive': 'Trong khi phát âm thanh, xiaozhi sẽ nhận và giải mã thông tin cấu hình',
|
||||
'deviceConfig.afterConfigSuccessDeviceWillConnect': 'Sau khi cấu hình thành công, thiết bị sẽ tự động kết nối với mạng WiFi',
|
||||
'deviceConfig.usesAfskModulation': 'Sử dụng công nghệ điều chế AFSK, truyền dữ liệu qua tần số 1800Hz và 1500Hz',
|
||||
'deviceConfig.ensureModeratePhoneVolume': 'Vui lòng đảm bảo âm lượng điện thoại vừa phải để tránh nhiễu tiếng ồn môi trường',
|
||||
'deviceConfig.generatingUltrasonicConfigAudio': 'Đang tạo âm thanh cấu hình siêu âm',
|
||||
'deviceConfig.configData': 'Dữ liệu cấu hình',
|
||||
'deviceConfig.dataBytesLength': 'Độ dài byte dữ liệu',
|
||||
'deviceConfig.bitStreamLength': 'Độ dài luồng bit',
|
||||
'deviceConfig.base64Length': 'Độ dài base64',
|
||||
'deviceConfig.audioFileTooLarge': 'Tệp âm thanh quá lớn, vui lòng rút ngắn SSID hoặc độ dài mật khẩu',
|
||||
'deviceConfig.audioGenerationSuccess': 'Tạo âm thanh thành công',
|
||||
'deviceConfig.samplePoints': 'Điểm mẫu',
|
||||
'deviceConfig.soundWaveGenerationSuccess': 'Tạo sóng âm thành công',
|
||||
'deviceConfig.audioGenerationFailed': 'Tạo âm thanh thất bại',
|
||||
'deviceConfig.soundWaveGenerationFailed': 'Tạo sóng âm thất bại',
|
||||
'deviceConfig.pleaseGenerateAudioFirst': 'Vui lòng tạo âm thanh trước',
|
||||
'deviceConfig.startPlayingUltrasonicConfigAudio': 'Bắt đầu phát âm thanh cấu hình siêu âm',
|
||||
'deviceConfig.ultrasonicAudioStartedPlaying': 'Đã bắt đầu phát âm thanh siêu âm',
|
||||
'deviceConfig.startPlayingConfigSoundWave': 'Đã bắt đầu phát sóng âm cấu hình',
|
||||
'deviceConfig.ultrasonicAudioPlaybackEnded': 'Kết thúc phát âm thanh siêu âm',
|
||||
'deviceConfig.audioPlaybackFailed': 'Phát âm thanh thất bại',
|
||||
'deviceConfig.audioResourceBusy': 'Tài nguyên âm thanh bận, vui lòng thử lại sau',
|
||||
'deviceConfig.audioFormatNotSupported': 'Định dạng âm thanh không được hỗ trợ, có thể là vấn đề URI dữ liệu',
|
||||
'deviceConfig.audioFileError': 'Lỗi tệp âm thanh',
|
||||
'deviceConfig.cleaningUpAudioContext': 'Đang dọn dẹp ngữ cảnh âm thanh',
|
||||
'deviceConfig.cleaningUpAudioContextFailed': 'Không thể dọn dẹp ngữ cảnh âm thanh',
|
||||
'deviceConfig.stoppedPlayingUltrasonicAudio': 'Đã dừng phát âm thanh siêu âm',
|
||||
'deviceConfig.stoppedPlaying': 'Đã dừng phát',
|
||||
'deviceConfig.configMethod': 'Phương pháp cấu hình',
|
||||
'deviceConfig.enterWifiPassword': 'Vui lòng nhập mật khẩu WiFi',
|
||||
'deviceConfig.xiaozhi': 'xiaozhi',
|
||||
'deviceConfig.connectXiaozhiHotspot': 'Vui lòng kết nối với điểm phát sóng xiaozhi',
|
||||
'deviceConfig.wifiScanResponse': 'Phản hồi quét WiFi',
|
||||
'deviceConfig.scanSuccess': 'Quét thành công',
|
||||
'deviceConfig.networks': 'mạng',
|
||||
'deviceConfig.wifiScanFailed': 'Quét WiFi thất bại',
|
||||
'deviceConfig.scanFailedCheckConnection': 'Quét thất bại, vui lòng kiểm tra kết nối',
|
||||
'deviceConfig.checking': 'Đang kiểm tra',
|
||||
'deviceConfig.reCheck': 'Kiểm tra lại',
|
||||
'deviceConfig.connectedXiaozhiHotspot': 'Đã kết nối với điểm phát sóng xiaozhi',
|
||||
'deviceConfig.wifiNetwork': 'Mạng WiFi',
|
||||
'deviceConfig.scanning': 'Đang quét',
|
||||
'deviceConfig.cancel': 'Hủy',
|
||||
'deviceConfig.clickRefreshScan': 'Vui lòng nhấp Làm mới quét',
|
||||
'deviceConfig.esp32ConnectionCheckFailed': 'Kiểm tra kết nối ESP32 thất bại',
|
||||
'deviceConfig.startWifiConfig': 'Đang bắt đầu cấu hình WiFi',
|
||||
'deviceConfig.configSuccess': 'Cấu hình thành công',
|
||||
'deviceConfig.deviceWillConnectTo': 'Thiết bị sẽ kết nối với',
|
||||
'deviceConfig.deviceWillRestart': 'Thiết bị sẽ khởi động lại',
|
||||
'deviceConfig.pleaseDisconnectXiaozhiHotspot': 'Vui lòng ngắt kết nối khỏi điểm phát sóng xiaozhi',
|
||||
'deviceConfig.configFailed': 'Cấu hình thất bại',
|
||||
'deviceConfig.wifiConfigFailed': 'Cấu hình WiFi thất bại',
|
||||
'deviceConfig.pleaseCheckNetworkConnection': 'Vui lòng kiểm tra kết nối mạng',
|
||||
'deviceConfig.startWifiConfigButton': 'Bắt đầu cấu hình',
|
||||
'deviceConfig.wifiConfigInstructions': 'Hướng dẫn cấu hình WiFi',
|
||||
'deviceConfig.phoneConnectXiaozhiHotspot': 'Điện thoại kết nối với điểm phát sóng xiaozhi',
|
||||
'deviceConfig.selectTargetWifiNetwork': 'Chọn mạng WiFi mục tiêu',
|
||||
'deviceConfig.enterWifiPasswordIfNeeded': 'Nhập mật khẩu WiFi nếu cần',
|
||||
'deviceConfig.clickStartConfigAndWait': 'Nhấp Bắt đầu cấu hình và chờ',
|
||||
'deviceConfig.afterConfigSuccessDeviceWillRestart': 'Sau khi cấu hình thành công, thiết bị sẽ tự động khởi động lại',
|
||||
'deviceConfig.audioPlaybackError': 'Lỗi phát âm thanh',
|
||||
'deviceConfig.playbackFailed': 'Phát thất bại',
|
||||
}
|
||||
@@ -46,13 +46,9 @@ export default {
|
||||
'retrievePassword.mobileCaptchaPlaceholder': '請輸入手機驗證碼',
|
||||
'retrievePassword.newPasswordPlaceholder': '請輸入新密碼',
|
||||
'retrievePassword.confirmNewPasswordPlaceholder': '請確認新密碼',
|
||||
'retrievePassword.confirmPasswordPlaceholder': '請確認新密碼',
|
||||
'retrievePassword.captchaSendSuccess': '驗證碼發送成功',
|
||||
'retrievePassword.passwordUpdateSuccess': '密碼更新成功',
|
||||
'retrievePassword.getCaptcha': '獲取驗證碼',
|
||||
'retrievePassword.getMobileCaptcha': '獲取驗證碼',
|
||||
'retrievePassword.resend': '重新發送',
|
||||
'retrievePassword.resetPasswordButton': '重置密碼',
|
||||
'retrievePassword.captchaSendSuccess': '驗證碼發送成功',
|
||||
'retrievePassword.passwordUpdateSuccess': '密碼重置成功',
|
||||
'retrievePassword.resetButton': '重置密碼',
|
||||
'retrievePassword.goToLogin': '返回登錄',
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { ref } from 'vue'
|
||||
import { ref } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
// 支持的语言类型
|
||||
export type Language = 'zh_CN' | 'en' | 'zh_TW'
|
||||
export type Language = 'zh_CN' | 'en' | 'zh_TW' | 'de' | 'vi'
|
||||
|
||||
export interface LangStore {
|
||||
currentLang: Language
|
||||
|
||||
@@ -238,6 +238,10 @@ export default {
|
||||
return this.$t("language.zhTW");
|
||||
case "en":
|
||||
return this.$t("language.en");
|
||||
case "de":
|
||||
return this.$t("language.de");
|
||||
case "vi":
|
||||
return this.$t("language.vi");
|
||||
default:
|
||||
return this.$t("language.zhCN");
|
||||
}
|
||||
@@ -261,6 +265,14 @@ export default {
|
||||
label: this.$t("language.en"),
|
||||
value: "en",
|
||||
},
|
||||
{
|
||||
label: this.$t("language.de"),
|
||||
value: "de",
|
||||
},
|
||||
{
|
||||
label: this.$t("language.vi"),
|
||||
value: "vi",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -639,10 +639,12 @@ export default {
|
||||
'language.zhCN': '中文简体',
|
||||
'language.zhTW': '中文繁體',
|
||||
'language.en': 'English',
|
||||
'language.de': 'Deutsch',
|
||||
'language.vi': 'Tiếng Việt',
|
||||
|
||||
// Home page text
|
||||
'home.addAgent': 'Add Agent',
|
||||
'home.greeting': 'Hi Jarvis',
|
||||
'home.greeting': 'Hi XiaoZhi',
|
||||
'home.wish': "Let's have a wonderful day!",
|
||||
'home.languageModel': 'LLM',
|
||||
'home.voiceModel': 'TTS',
|
||||
@@ -992,7 +994,6 @@ export default {
|
||||
'agentTemplateManagement.templateName': 'Template Name',
|
||||
'agentTemplateManagement.action': 'Action',
|
||||
'agentTemplateManagement.createTemplate': 'Create Template',
|
||||
'templateQuickConfig.newTemplate': 'New Template',
|
||||
'agentTemplateManagement.editTemplate': 'Edit Template',
|
||||
'agentTemplateManagement.deleteTemplate': 'Delete Template',
|
||||
'agentTemplateManagement.deleteSuccess': 'Template deleted successfully',
|
||||
@@ -1011,7 +1012,6 @@ export default {
|
||||
'agentTemplateManagement.deleteFailed': 'Template deletion failed',
|
||||
'agentTemplateManagement.batchDeleteFailed': 'Template batch deletion failed',
|
||||
'agentTemplateManagement.deleteBackendError': 'Deletion failed, please check if the backend service is normal',
|
||||
'agentTemplateManagement.deleteCancelled': 'Deletion cancelled',
|
||||
|
||||
// templateQuickConfig
|
||||
'templateQuickConfig.title': 'Module Quick Configuration',
|
||||
@@ -1021,13 +1021,14 @@ export default {
|
||||
'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Please enter ntroduction',
|
||||
'templateQuickConfig.saveConfig': 'Save Configuration',
|
||||
'templateQuickConfig.resetConfig': 'Reset Configuration',
|
||||
'templateQuickConfig.configSaved': 'Configuration saved successfully',
|
||||
'templateQuickConfig.configReset': 'Configuration has been reset',
|
||||
'templateQuickConfig.saveSuccess': 'Configuration saved successfully',
|
||||
'templateQuickConfig.resetSuccess': 'Configuration reset successfully',
|
||||
'templateQuickConfig.confirmReset': 'Are you sure you want to reset the configuration?',
|
||||
'templateQuickConfig.saveFailed': 'Configuration save failed',
|
||||
'templateQuickConfig.confirm': 'Confirm',
|
||||
'templateQuickConfig.cancel': 'Cancel',
|
||||
'templateQuickConfig.templateNotFound': 'Template not found',
|
||||
'templateQuickConfig.newTemplate': 'New Template',
|
||||
'warning': 'Warning',
|
||||
'info': 'Info',
|
||||
'common.networkError': 'Network request failed',
|
||||
|
||||
@@ -3,6 +3,8 @@ import VueI18n from 'vue-i18n';
|
||||
import zhCN from './zh_CN';
|
||||
import zhTW from './zh_TW';
|
||||
import en from './en';
|
||||
import de from './de';
|
||||
import vi from './vi';
|
||||
|
||||
Vue.use(VueI18n);
|
||||
|
||||
@@ -19,6 +21,12 @@ const getDefaultLanguage = () => {
|
||||
}
|
||||
return 'zh_CN';
|
||||
}
|
||||
if (browserLang.indexOf('de') === 0) {
|
||||
return 'de';
|
||||
}
|
||||
if (browserLang.indexOf('vi') === 0) {
|
||||
return 'vi';
|
||||
}
|
||||
return 'en';
|
||||
};
|
||||
|
||||
@@ -28,7 +36,9 @@ const i18n = new VueI18n({
|
||||
messages: {
|
||||
'zh_CN': zhCN,
|
||||
'zh_TW': zhTW,
|
||||
'en': en
|
||||
'en': en,
|
||||
'de': de,
|
||||
'vi': vi
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -639,6 +639,8 @@ export default {
|
||||
'language.zhCN': '中文简体',
|
||||
'language.zhTW': '中文繁體',
|
||||
'language.en': 'English',
|
||||
'language.de': 'Deutsch',
|
||||
'language.vi': 'Tiếng Việt',
|
||||
|
||||
// 首页文本
|
||||
'home.addAgent': '添加智能体',
|
||||
@@ -991,8 +993,6 @@ export default {
|
||||
'agentTemplateManagement.title': '默认角色管理',
|
||||
'agentTemplateManagement.templateName': '模板名称',
|
||||
'agentTemplateManagement.action': '操作',
|
||||
'templateQuickConfig.saveSuccess': '配置保存成功',
|
||||
'templateQuickConfig.saveFailed': '配置保存失败',
|
||||
'agentTemplateManagement.createTemplate': '创建模板',
|
||||
'agentTemplateManagement.editTemplate': '编辑模板',
|
||||
'agentTemplateManagement.deleteTemplate': '删除模板',
|
||||
@@ -1021,13 +1021,14 @@ export default {
|
||||
'templateQuickConfig.agentSettings.systemPromptPlaceholder': '请输入角色介绍',
|
||||
'templateQuickConfig.saveConfig': '保存配置',
|
||||
'templateQuickConfig.resetConfig': '重置配置',
|
||||
'templateQuickConfig.saveSuccess': '保存成功',
|
||||
'templateQuickConfig.resetSuccess': '重置成功',
|
||||
'templateQuickConfig.confirmReset': '确定要重置配置吗?',
|
||||
'templateQuickConfig.saveFailed': '配置保存失败',
|
||||
'templateQuickConfig.confirm': '确定',
|
||||
'templateQuickConfig.cancel': '取消',
|
||||
'templateQuickConfig.templateNotFound': '未找到指定模板',
|
||||
'templateQuickConfig.newTemplate': '新模板',
|
||||
'templateQuickConfig.saveSuccess': '保存成功',
|
||||
'templateQuickConfig.resetSuccess': '重置成功',
|
||||
'warning': '警告',
|
||||
'info': '提示',
|
||||
'common.networkError': '网络请求失败',
|
||||
|
||||
@@ -639,6 +639,8 @@ export default {
|
||||
'language.zhCN': '中文简体',
|
||||
'language.zhTW': '中文繁體',
|
||||
'language.en': 'English',
|
||||
'language.de': 'Deutsch',
|
||||
'language.vi': 'Tiếng Việt',
|
||||
|
||||
// 首頁文本
|
||||
'home.addAgent': '添加智能體',
|
||||
@@ -992,6 +994,7 @@ export default {
|
||||
'agentTemplateManagement.templateName': '模板名稱',
|
||||
'agentTemplateManagement.action': '操作',
|
||||
'templateQuickConfig.saveSuccess': '配置保存成功',
|
||||
'templateQuickConfig.resetSuccess': '配置重置成功',
|
||||
'templateQuickConfig.saveFailed': '配置保存失敗',
|
||||
'agentTemplateManagement.createTemplate': '建立模板',
|
||||
'agentTemplateManagement.editTemplate': '編輯模板',
|
||||
@@ -1021,8 +1024,6 @@ export default {
|
||||
'templateQuickConfig.agentSettings.systemPromptPlaceholder': '請輸入角色介紹',
|
||||
'templateQuickConfig.saveConfig': '保存配置',
|
||||
'templateQuickConfig.resetConfig': '重置配置',
|
||||
'templateQuickConfig.configSaved': '配置保存成功',
|
||||
'templateQuickConfig.configReset': '配置已重置',
|
||||
'templateQuickConfig.confirmReset': '確定要重置配置嗎?',
|
||||
'templateQuickConfig.confirm': '確定',
|
||||
'templateQuickConfig.cancel': '取消',
|
||||
|
||||
@@ -49,6 +49,12 @@
|
||||
<el-dropdown-item @click.native="changeLanguage('en')">
|
||||
{{ $t("language.en") }}
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="changeLanguage('de')">
|
||||
{{ $t("language.de") }}
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="changeLanguage('vi')">
|
||||
{{ $t("language.vi") }}
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</div>
|
||||
@@ -177,6 +183,10 @@ export default {
|
||||
return this.$t("language.zhTW");
|
||||
case "en":
|
||||
return this.$t("language.en");
|
||||
case "de":
|
||||
return this.$t("language.de");
|
||||
case "vi":
|
||||
return this.$t("language.vi");
|
||||
default:
|
||||
return this.$t("language.zhCN");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user