Files
remoteconn-gitea/apps/miniprogram/utils/i18nCatalog.js
2026-03-21 18:57:10 +08:00

1541 lines
55 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* global module, require */
const { JA_I18N_OVERLAY, KO_I18N_OVERLAY } = require("./i18nCatalogLocaleOverlays");
function cloneCatalogValue(value) {
if (Array.isArray(value)) return value.map((item) => cloneCatalogValue(item));
if (value && typeof value === "object") {
const next = {};
Object.keys(value).forEach((key) => {
next[key] = cloneCatalogValue(value[key]);
});
return next;
}
return value;
}
function applyCatalogOverlay(base, overlay) {
if (!overlay || typeof overlay !== "object") return cloneCatalogValue(base);
if (Array.isArray(base)) {
const baseArray = Array.isArray(base) ? base : [];
const overlayArray = Array.isArray(overlay) ? overlay : [];
const length = Math.max(baseArray.length, overlayArray.length);
const next = [];
for (let index = 0; index < length; index += 1) {
if (overlayArray[index] === undefined) {
next.push(cloneCatalogValue(baseArray[index]));
continue;
}
next.push(cloneCatalogValue(overlayArray[index]));
}
return next;
}
const next = cloneCatalogValue(base);
Object.keys(overlay).forEach((key) => {
const current = next[key];
const patch = overlay[key];
if (
current &&
typeof current === "object" &&
!Array.isArray(current) &&
patch &&
typeof patch === "object" &&
!Array.isArray(patch)
) {
next[key] = applyCatalogOverlay(current, patch);
return;
}
next[key] = cloneCatalogValue(patch);
});
return next;
}
/**
* 小程序界面文案词典:
* 1. 这里只放“产品自有界面文案”,不放用户输入、远端输出等动态内容;
* 2. 页面层通过 namespace 读取,避免把整份大词典一次性塞进 setData
* 3. 词典先覆盖当前主流程页,后续新增文案继续往对应 namespace 里补。
*/
const I18N_CATALOG = {
"zh-Hans": {
common: {
statusLabels: {
idle: "空闲",
connecting: "连接中",
auth_pending: "认证中",
connected: "已连接",
reconnecting: "重连中",
disconnected: "已断开",
error: "异常",
config_required: "配置缺失"
},
runtimeStateLabels: {
connected: "已连接",
disconnected: "未连接"
},
pageIndicator: "第 {page} / {total} 页"
},
bottomNav: {
backText: "返",
pageTextLabels: {
"open-terminal-shell": "终",
"/pages/terminal/index": "终",
"/pages/connect/index": "服",
"/pages/logs/index": "志",
"/pages/records/index": "记",
"/pages/settings/index": "设",
"/pages/about/index": "关",
"/pages/plugins/index": "插",
default: "页"
},
modal: {
noTerminalTitle: "暂无可打开终端",
noTerminalContent: "请先通过服务器卡片右侧连接按钮建立会话,然后再打开终端页面。"
}
},
settings: {
navTitle: "设置",
saveStatus: {
synced: "已同步本地配置",
saving: "自动保存中...",
saved: "已自动保存"
},
tabs: {
ui: "界面",
shell: "终端",
connection: "连接",
log: "记录"
},
sections: {
languageTitle: "语言设置",
languageDesc: "切换小程序界面文案语言",
uiTitle: "界面设置",
uiDesc: "应用外观与主题模式",
shellDisplayTitle: "显示设置",
shellDisplayDesc: "终端显示和输入体验",
ttsTitle: "播报设置",
ttsDesc: "单位为字。默认总长度限制 500默认分片长度 80。",
shellBufferTitle: "终端缓冲",
shellBufferDesc: "控制在线缓冲与续接快照上限,避免过度占用内存",
connectionTitle: "连接设置",
connectionDesc: "连接行为与服务器默认参数",
aiConnectionTitle: "AI连接",
aiConnectionDesc: "设置 Codex 与 Copilot 的默认启动权限",
syncTitle: "同步配置",
syncDesc: "控制配置类数据是否同步到云端",
recordTitle: "记录设置",
recordDesc: "控制闪念与日志的保留周期",
voiceCategoryTitle: "闪念分类",
voiceCategoryDesc: "维护管理闪念分类"
},
fields: {
themeMode: "模式",
themePreset: "主题",
uiLanguage: "界面语言",
uiAccentColor: "强调色",
uiBgColor: "背景色",
uiTextColor: "文本色",
uiBtnColor: "按钮色",
shellBgColor: "终端背景色",
shellTextColor: "终端前景色",
shellAccentColor: "光标强调色",
shellFontFamily: "字体",
shellFontSize: "字号",
shellLineHeight: "行高",
unicode11: "宽字符支持",
shellActivationDebugOutline: "激活区外框",
showVoiceInputButton: "语音输入按钮",
ttsSpeakableMaxChars: "总长度限制",
ttsSegmentMaxChars: "分片长度",
shellBufferMaxEntries: "缓冲行数上限",
shellBufferMaxBytes: "缓冲字节上限",
shellBufferSnapshotMaxLines: "续接快照行数上限",
autoReconnect: "自动重连",
reconnectLimit: "重连次数上限",
backgroundSessionKeepAliveMinutes: "后台保活时长(分钟)",
defaultAuthType: "默认认证方式",
aiDefaultProvider: "默认 AI",
aiCodexSandboxMode: "Codex",
aiCopilotPermissionMode: "Copilot",
defaultPort: "默认 SSH 端口",
defaultProjectPath: "默认项目路径",
defaultTimeoutSeconds: "默认连接超时(秒)",
defaultHeartbeatSeconds: "默认心跳间隔(秒)",
syncConfigEnabled: "同步配置云端",
logRetentionDays: "记录保留天数",
voiceCategoryList: "分类列表"
},
hints: {
shellFontSizeReconnect: "修改字号后建议断开重连",
shellActivationDebugOutline: "点击激活区弹出软键盘,点击其它区域收回软键盘,方便用户操作",
showVoiceInputButton: "控制终端右下角悬浮语音按钮及展开面板是否显示",
ttsSpeakableMaxChars: "建议范围 120-1200 字。只播报回答正文,输入行和底部状态栏会被忽略;内部会自动分段以缩短首段等待时间。",
syncConfigLine1: "关闭后将暂停设置、服务器配置与闪念记录的云端同步。",
syncConfigLine2: "本地保存、终端连接与当前会话不受影响。",
voicePreviewUnicodeOn: "on",
voicePreviewUnicodeOff: "off",
terminalPreviewLine: "Unicode11: {unicodeState} | 中文 ABC 123 |_END_"
},
placeholders: {
defaultProjectPath: "例如:~/workspace",
newVoiceRecordCategory: "新增分类"
},
buttons: {
addVoiceRecordCategory: "新增",
setDefaultCategory: "设默认",
removeSelectedCategory: "删除所选"
},
labels: {
defaultBadge: "默认",
ttsSpeakableCharsUnit: "字"
},
options: {
authType: {
password: "密码",
key: "密钥"
},
aiDefaultProvider: {
codex: "Codex",
copilot: "Copilot"
},
aiCodexSandboxMode: {
readOnly: "只读",
workspaceWrite: "项目目录读写",
dangerFullAccess: "全部权限"
},
aiCopilotPermissionMode: {
default: "默认",
experimental: "实验",
allowAll: "全部权限"
},
themeMode: {
dark: "深色",
light: "浅色"
},
uiLanguage: {
"zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
en: "English",
ja: "日本語",
ko: "한국어"
},
themePresetDefaultSuffix: "(默认)",
fontFallback: "等宽默认"
},
toast: {
enterCategoryName: "请输入分类名称",
categoryExists: "分类已存在",
maxCategories: "最多 10 个分类",
fallbackCannotDelete: "未分类不能删除",
keepAtLeastOneCategory: "至少保留一个分类"
}
},
connect: {
navTitle: "服务器",
pageTitle: "我的服务器",
searchPlaceholder: "搜索服务器",
recentConnectionPrefix: "最近连接",
emptyTip: "暂无匹配服务器",
unnamedServer: "未命名服务器",
authTypeLabels: {
password: "密码",
privateKey: "私钥",
certificate: "证书"
},
textIcons: {
create: "新",
remove: "删",
selectAll: "全",
search: "搜",
copy: "复",
connect: "连"
},
swipeCopy: "复制",
swipeDelete: "删除",
modal: {
removeTitle: "删除服务器",
removeContent: "确认删除已选服务器({count} 台)吗?",
removeSingleContent: "确认删除服务器“{name}”吗?"
},
toast: {
serverNotFound: "服务器不存在",
serverToCopyNotFound: "未找到待复制服务器",
serverCopied: "服务器已复制",
serverDeleted: "服务器已删除",
clearSearchBeforeSort: "请清空搜索后再调整顺序"
},
summary: {
connectFromList: "从服务器列表发起连接",
aiFromList: "从服务器列表发起 AI 快速启动"
},
fallback: {
noConnection: "无连接",
newServerPrefix: "服务器"
},
display: {
projectPrefix: "pro"
}
},
logs: {
navTitle: "日志",
exportButton: "导出脱敏日志",
totalCount: "共 {total} 条",
empty: "暂无日志",
prev: "上一页",
next: "下一页",
toast: {
copied: "日志已复制"
}
},
records: {
navTitle: "闪念",
searchPlaceholder: "搜索闪念",
allCategories: "全部分类",
addButton: "新增",
swipeCopy: "复制",
swipeDelete: "删除",
swipeProcessed: "已处理",
swipeDiscarded: "已废弃",
empty: "暂无闪念记录",
prev: "上一页",
next: "下一页",
exportButton: "导出闪念",
editPlaceholder: "编辑闪念内容",
newRecordHint: "输入后自动保存为新闪念",
updatedAtPrefix: "最近更新 {time}",
closeEditAriaLabel: "关闭编辑窗口",
contextFallback: "未设置上下文",
exportFields: {
createdAt: "创建时间",
updatedAt: "更新时间",
server: "服务器",
category: "分类",
context: "上下文"
},
toast: {
deleted: "已删除",
copied: "已复制",
processed: "已处理",
discarded: "已废弃",
updateFailed: "更新失败",
categoryUpdated: "分类已更新",
exported: "闪念已复制"
}
},
plugins: {
navTitle: "插件",
runtimeStatePrefix: "运行时状态:",
summary: "对齐当前小程序基线 v3.0.0:启停、导入导出、命令执行、运行日志。",
sections: {
pluginList: "插件列表",
importJson: "导入插件 JSON",
runCommand: "运行命令",
runtimeLogs: "运行时日志"
},
buttons: {
enable: "启用",
disable: "禁用",
reload: "重载",
remove: "移除",
importJson: "导入",
exportJson: "导出全部(复制)"
},
empty: {
noPlugins: "暂无插件",
noCommands: "当前无可执行命令(需会话连接且插件已注册)",
noLogs: "暂无日志"
},
placeholder: {
pluginJson: '[{"manifest":...,"mainJs":"...","stylesCss":"..."}]'
},
modal: {
removeTitle: "移除插件",
removeContent: "确认移除插件 {id} 吗?"
},
toast: {
bootstrapFailed: "插件初始化失败",
pastePluginJsonFirst: "请先粘贴插件 JSON",
importSuccess: "导入成功",
importFailed: "导入失败",
exportSuccess: "插件 JSON 已复制",
exportFailed: "导出失败",
enabled: "已启用",
enableFailed: "启用失败",
disabled: "已禁用",
disableFailed: "禁用失败",
reloaded: "已重载",
reloadFailed: "重载失败",
removed: "已移除",
removeFailed: "移除失败",
commandExecuted: "命令已执行",
commandExecuteFailed: "命令执行失败"
}
},
serverSettings: {
navTitle: "服务器配置",
sections: {
basicTitle: "基础信息",
basicDesc: "用于标识并定位目标服务器",
authTitle: "认证信息",
authDesc: "按认证方式填写密码或密钥材料",
connectTitle: "连接参数",
connectDesc: "定义连接路径与工作目录",
jumpHostTitle: "跳转主机",
jumpHostDesc: "从基础信息中配置的服务器跳转至该服务器"
},
fields: {
name: "名称",
tags: "标签",
host: "主机",
port: "端口",
username: "用户名",
authType: "认证方式",
password: "密码",
privateKey: "私钥",
passphrase: "密钥口令",
certificate: "证书",
transportMode: "传输方式",
aiProjectPath: "AI工作目录",
jumpHost: "跳转主机",
jumpPort: "跳转端口",
jumpUsername: "跳转用户名"
},
options: {
authType: {
password: "密码",
privateKey: "私钥",
certificate: "证书"
}
},
placeholders: {
tags: "prod,beijing",
aiProjectPath: "~/workspace/project"
},
directoryPicker: {
openButton: "选择目录",
loading: "加载中",
cancel: "取消",
apply: "应用"
},
modal: {
socketDomainTitle: "Socket 域名未配置",
socketDomainContent: "当前网关地址不在小程序 socket 合法域名列表:{domainHint}",
socketDomainContentNoHint: "当前网关地址不在小程序 socket 合法域名列表",
connectFailedTitle: "无法连接服务器",
connectFailedContent: "{message}\n请检查主机、端口、用户名和认证信息是否正确。"
},
toast: {
opsConfigMissing: "运维配置缺失,请联系管理员",
saved: "已保存",
connectFromSettings: "从服务器配置页发起连接"
}
},
terminal: {
navTitle: "终端",
disconnectedHint: "请点击右上角“重连”开关或左上角 AI 按钮,重新连接。",
connectionAction: {
reconnect: "重连",
disconnect: "断开"
},
stateLabels: {
idle: "空闲",
connecting: "连接中",
auth_pending: "认证中",
connected: "已连接",
reconnecting: "重连中",
disconnected: "已断开",
error: "异常",
config_required: "配置缺失"
},
voice: {
recordingHint: "正在收音,松开后发送或记录闪念",
inputPlaceholder: "按住下方语音按钮开始输入"
},
aiDialog: {
title: "AI 快速启动",
hint: "启动参数已迁到 全局配置 -> 连接 -> AI连接",
currentMode: "当前模式",
launchCodex: "启动 Codex",
launchCopilot: "启动 Copilot",
close: "关闭"
},
toast: {
aiAlreadyRunning: "{provider} 正在当前会话中运行,请先退出后再重启"
},
fallback: {
noProject: "未设置项目",
unnamedServer: "未命名服务器"
},
sessionInfo: {
title: "会话信息",
nameLabel: "服务器名称",
projectLabel: "工作目录",
addressLabel: "服务器地址",
jumpTargetLabel: "跳至服务器",
sshConnectionLabel: "SSH连接",
aiConnectionLabel: "AI连接",
connectedValue: "连接",
disconnectedValue: "断开",
emptyValue: "-"
},
modal: {
socketDomainTitle: "Socket 域名未配置",
socketDomainContent: "当前网关地址不在小程序 socket 合法域名列表:{domainHint}",
socketDomainContentNoHint: "当前网关地址不在小程序 socket 合法域名列表"
},
diagnostics: {
responseAxisCardLabel: "网关响应(ms)",
networkAxisCardLabel: "网络时延(ms)",
chartMinShort: "min",
chartMaxShort: "max",
chartAvgShort: "avg",
chartStatEmpty: "--"
},
tts: {
enable: "开启语音播报",
disable: "关闭语音播报",
settingsTitle: "播报设置",
settingsDesc: "控制终端语音播报开关与总播报长度",
lengthLabel: "总播报长度",
lengthUnit: "字",
lengthHint: "只播报回答正文,不读输入行和底部状态栏。",
segmentHint: "内部会自动按更小段落顺序播报,优先缩短首段等待时间。"
},
summary: {
gatewayConnect: "小程序端发起网关连接",
sessionRestored: "会话已恢复",
sessionConnected: "会话已连接"
},
errors: {
serverNotFound: "服务器不存在",
sessionNotConnected: "会话未连接",
opsConfigMissing: "运维配置缺失,请联系管理员",
gatewayError: "网关错误",
connectionException: "连接异常",
sessionReadyTimeout: "会话就绪超时",
serverConfigIncomplete: "服务器配置不完整",
connectionFailed: "连接失败",
sessionDisconnected: "会话已断开",
waitSessionTimeout: "等待会话连接超时",
codexLaunchFailed: "Codex 启动失败",
copilotLaunchFailed: "Copilot 启动失败",
codexNotInstalled: "服务器未装codex",
codexLaunching: "Codex 正在启动中",
waitCodexTimeout: "等待 Codex 启动结果超时",
micPermissionDenied: "麦克风权限未开启,请在设置中允许录音",
micPermissionReadFailed: "读取麦克风权限失败",
recorderBusy: "录音器忙,请稍后重试",
recordCaptureFailed: "录音采集失败",
asrFailed: "语音识别失败",
asrGatewayFailed: "语音网关连接失败,请检查小程序 socket 合法域名",
asrGatewayConnectFailed: "语音网关连接失败,请检查网络或网关配置",
asrTimeout: "语音服务连接超时,请稍后重试",
clipboardEmpty: "剪贴板为空",
clipboardReadFailed: "读取剪贴板失败",
noRecordContent: "无可记录内容",
recordSaved: "已记录到闪念列表",
noSpeakableContent: "当前没有可播报内容",
contentNotSpeakable: "当前内容不适合播报",
ttsTextTooLong: "播报文本过长",
ttsTimeout: "语音生成超时,请稍后重试",
ttsUpstreamRejected: "语音服务鉴权或权限失败,请联系管理员检查 TTS 配置",
ttsSynthesizeFailed: "语音生成失败",
ttsPlayFailed: "音频播放失败,请检查网络",
ttsUnavailable: "TTS 服务未配置"
}
}
},
"zh-Hant": {
common: {
statusLabels: {
idle: "空閒",
connecting: "連線中",
auth_pending: "驗證中",
connected: "已連線",
reconnecting: "重連中",
disconnected: "已中斷",
error: "異常",
config_required: "設定缺失"
},
runtimeStateLabels: {
connected: "已連線",
disconnected: "未連線"
},
pageIndicator: "第 {page} / {total} 頁"
},
bottomNav: {
backText: "返",
pageTextLabels: {
"open-terminal-shell": "終",
"/pages/terminal/index": "終",
"/pages/connect/index": "服",
"/pages/logs/index": "誌",
"/pages/records/index": "記",
"/pages/settings/index": "設",
"/pages/about/index": "關",
"/pages/plugins/index": "插",
default: "頁"
},
modal: {
noTerminalTitle: "暫無可開啟終端",
noTerminalContent: "請先透過伺服器卡片右側的連線按鈕建立會話,之後再開啟終端頁面。"
}
},
settings: {
navTitle: "設定",
saveStatus: {
synced: "已同步本地設定",
saving: "自動儲存中...",
saved: "已自動儲存"
},
tabs: {
ui: "介面",
shell: "終端",
connection: "連線",
log: "記錄"
},
sections: {
languageTitle: "語言設定",
languageDesc: "切換小程式介面文案語言",
uiTitle: "介面設定",
uiDesc: "應用外觀與主題模式",
shellDisplayTitle: "顯示設定",
shellDisplayDesc: "終端顯示與輸入體驗",
ttsTitle: "播報設定",
ttsDesc: "單位為字。預設總長度限制 500預設分片長度 80。",
shellBufferTitle: "終端緩衝",
shellBufferDesc: "控制線上緩衝與續接快照上限,避免過度佔用記憶體",
connectionTitle: "連線設定",
connectionDesc: "連線行為與伺服器預設參數",
aiConnectionTitle: "AI 連線",
aiConnectionDesc: "設定 Codex 與 Copilot 的預設啟動權限",
syncTitle: "同步設定",
syncDesc: "控制設定類資料是否同步到雲端",
recordTitle: "記錄設定",
recordDesc: "控制閃念與日誌的保留週期",
voiceCategoryTitle: "閃念分類",
voiceCategoryDesc: "維護管理閃念分類"
},
fields: {
themeMode: "模式",
themePreset: "主題",
uiLanguage: "介面語言",
uiAccentColor: "強調色",
uiBgColor: "背景色",
uiTextColor: "文字色",
uiBtnColor: "按鈕色",
shellBgColor: "終端背景色",
shellTextColor: "終端前景色",
shellAccentColor: "游標強調色",
shellFontFamily: "字體",
shellFontSize: "字號",
shellLineHeight: "行高",
unicode11: "寬字元支援",
shellActivationDebugOutline: "啟動區外框",
showVoiceInputButton: "語音輸入按鈕",
ttsSpeakableMaxChars: "總長度限制",
ttsSegmentMaxChars: "分片長度",
shellBufferMaxEntries: "緩衝行數上限",
shellBufferMaxBytes: "緩衝位元組上限",
shellBufferSnapshotMaxLines: "續接快照行數上限",
autoReconnect: "自動重連",
reconnectLimit: "重連次數上限",
backgroundSessionKeepAliveMinutes: "背景保活時長(分鐘)",
defaultAuthType: "預設驗證方式",
aiDefaultProvider: "預設 AI",
aiCodexSandboxMode: "Codex",
aiCopilotPermissionMode: "Copilot",
defaultPort: "預設 SSH 埠",
defaultProjectPath: "預設專案路徑",
defaultTimeoutSeconds: "預設連線逾時(秒)",
defaultHeartbeatSeconds: "預設心跳間隔(秒)",
syncConfigEnabled: "同步設定到雲端",
logRetentionDays: "記錄保留天數",
voiceCategoryList: "分類清單"
},
hints: {
shellFontSizeReconnect: "修改字號後建議中斷重連",
shellActivationDebugOutline: "點啟動區會彈出軟鍵盤,其它區域會收起軟鍵盤,操作更便捷",
showVoiceInputButton: "控制終端右下角懸浮語音按鈕與展開面板是否顯示",
ttsSpeakableMaxChars: "建議範圍 120-1200 字。只播報回答正文,輸入行與底部狀態列會被忽略;內部會自動分段以縮短首段等待時間。",
syncConfigLine1: "關閉後將暫停設定、伺服器設定與閃念記錄的雲端同步。",
syncConfigLine2: "本地儲存、終端連線與目前會話不受影響。",
voicePreviewUnicodeOn: "on",
voicePreviewUnicodeOff: "off",
terminalPreviewLine: "Unicode11: {unicodeState} | 中文 ABC 123 |_END_"
},
placeholders: {
defaultProjectPath: "例如:~/workspace",
newVoiceRecordCategory: "新增分類"
},
buttons: {
addVoiceRecordCategory: "新增",
setDefaultCategory: "設為預設",
removeSelectedCategory: "刪除所選"
},
labels: {
defaultBadge: "預設",
ttsSpeakableCharsUnit: "字"
},
options: {
authType: {
password: "密碼",
key: "金鑰"
},
aiDefaultProvider: {
codex: "Codex",
copilot: "Copilot"
},
aiCodexSandboxMode: {
readOnly: "唯讀",
workspaceWrite: "專案目錄讀寫",
dangerFullAccess: "全部權限"
},
aiCopilotPermissionMode: {
default: "預設",
experimental: "實驗",
allowAll: "全部權限"
},
themeMode: {
dark: "深色",
light: "淺色"
},
uiLanguage: {
"zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
en: "English",
ja: "日本語",
ko: "한국어"
},
themePresetDefaultSuffix: "(預設)",
fontFallback: "等寬預設"
},
toast: {
enterCategoryName: "請輸入分類名稱",
categoryExists: "分類已存在",
maxCategories: "最多 10 個分類",
fallbackCannotDelete: "未分類不能刪除",
keepAtLeastOneCategory: "至少保留一個分類"
}
},
connect: {
navTitle: "伺服器",
pageTitle: "我的伺服器",
searchPlaceholder: "搜尋伺服器",
recentConnectionPrefix: "最近連線",
emptyTip: "暫無符合條件的伺服器",
unnamedServer: "未命名伺服器",
authTypeLabels: {
password: "密碼",
privateKey: "私鑰",
certificate: "憑證"
},
textIcons: {
create: "新",
remove: "刪",
selectAll: "全",
search: "搜",
copy: "複",
connect: "連"
},
swipeCopy: "複製",
swipeDelete: "刪除",
modal: {
removeTitle: "刪除伺服器",
removeContent: "確認刪除已選伺服器({count} 台)嗎?",
removeSingleContent: "確認刪除伺服器「{name}」嗎?"
},
toast: {
serverNotFound: "伺服器不存在",
serverToCopyNotFound: "未找到待複製伺服器",
serverCopied: "伺服器已複製",
serverDeleted: "伺服器已刪除",
clearSearchBeforeSort: "請先清空搜尋後再調整順序"
},
summary: {
connectFromList: "從伺服器清單發起連線",
aiFromList: "從伺服器清單發起 AI 快速啟動"
},
fallback: {
noConnection: "無連線",
newServerPrefix: "伺服器"
},
display: {
projectPrefix: "pro"
}
},
logs: {
navTitle: "日誌",
exportButton: "匯出脫敏日誌",
totalCount: "共 {total} 條",
empty: "暫無日誌",
prev: "上一頁",
next: "下一頁",
toast: {
copied: "日誌已複製"
}
},
records: {
navTitle: "閃念",
searchPlaceholder: "搜尋閃念",
allCategories: "全部分類",
addButton: "新增",
swipeCopy: "複製",
swipeDelete: "刪除",
swipeProcessed: "已處理",
swipeDiscarded: "已廢棄",
empty: "暫無閃念記錄",
prev: "上一頁",
next: "下一頁",
exportButton: "匯出閃念",
editPlaceholder: "編輯閃念內容",
newRecordHint: "輸入後自動儲存為新閃念",
updatedAtPrefix: "最近更新 {time}",
closeEditAriaLabel: "關閉編輯視窗",
contextFallback: "未設定上下文",
exportFields: {
createdAt: "建立時間",
updatedAt: "更新時間",
server: "伺服器",
category: "分類",
context: "上下文"
},
toast: {
deleted: "已刪除",
copied: "已複製",
processed: "已處理",
discarded: "已廢棄",
updateFailed: "更新失敗",
categoryUpdated: "分類已更新",
exported: "閃念已複製"
}
},
plugins: {
navTitle: "外掛",
runtimeStatePrefix: "執行時狀態:",
summary: "對齊目前小程式基線 v3.0.0:啟停、匯入匯出、命令執行與執行日誌。",
sections: {
pluginList: "外掛清單",
importJson: "匯入外掛 JSON",
runCommand: "執行命令",
runtimeLogs: "執行時日誌"
},
buttons: {
enable: "啟用",
disable: "停用",
reload: "重載",
remove: "移除",
importJson: "匯入",
exportJson: "匯出全部(複製)"
},
empty: {
noPlugins: "暫無外掛",
noCommands: "目前無可執行命令(需會話已連線且外掛已註冊)",
noLogs: "暫無日誌"
},
placeholder: {
pluginJson: '[{"manifest":...,"mainJs":"...","stylesCss":"..."}]'
},
modal: {
removeTitle: "移除外掛",
removeContent: "確認移除外掛 {id} 嗎?"
},
toast: {
bootstrapFailed: "外掛初始化失敗",
pastePluginJsonFirst: "請先貼上外掛 JSON",
importSuccess: "匯入成功",
importFailed: "匯入失敗",
exportSuccess: "外掛 JSON 已複製",
exportFailed: "匯出失敗",
enabled: "已啟用",
enableFailed: "啟用失敗",
disabled: "已停用",
disableFailed: "停用失敗",
reloaded: "已重載",
reloadFailed: "重載失敗",
removed: "已移除",
removeFailed: "移除失敗",
commandExecuted: "命令已執行",
commandExecuteFailed: "命令執行失敗"
}
},
serverSettings: {
navTitle: "伺服器設定",
sections: {
basicTitle: "基礎資訊",
basicDesc: "用於標識並定位目標伺服器",
authTitle: "驗證資訊",
authDesc: "依驗證方式填寫密碼或金鑰材料",
connectTitle: "連線參數",
connectDesc: "定義連線路徑與工作目錄",
jumpHostTitle: "跳轉主機",
jumpHostDesc: "從基礎資訊中配置的伺服器跳轉至該伺服器"
},
fields: {
name: "名稱",
tags: "標籤",
host: "主機",
port: "埠",
username: "使用者名稱",
authType: "驗證方式",
password: "密碼",
privateKey: "私鑰",
passphrase: "金鑰口令",
certificate: "憑證",
transportMode: "傳輸方式",
aiProjectPath: "AI工作目錄",
jumpHost: "跳轉主機",
jumpPort: "跳轉埠",
jumpUsername: "跳轉使用者名稱"
},
options: {
authType: {
password: "密碼",
privateKey: "私鑰",
certificate: "憑證"
}
},
placeholders: {
tags: "prod,beijing",
aiProjectPath: "~/workspace/project"
},
directoryPicker: {
openButton: "選擇目錄",
loading: "載入中",
cancel: "取消",
apply: "套用"
},
modal: {
socketDomainTitle: "Socket 網域未配置",
socketDomainContent: "目前網關地址不在小程式 socket 合法網域清單:{domainHint}",
socketDomainContentNoHint: "目前網關地址不在小程式 socket 合法網域清單",
connectFailedTitle: "無法連線到伺服器",
connectFailedContent: "{message}\n請檢查主機、埠、使用者名稱與驗證資訊是否正確。"
},
toast: {
opsConfigMissing: "運維配置缺失,請聯絡管理員",
saved: "已儲存",
connectFromSettings: "從伺服器設定頁發起連線"
}
},
terminal: {
navTitle: "終端",
disconnectedHint: "請點擊右上角「重連」開關或左上角 AI 按鈕,重新連線。",
connectionAction: {
reconnect: "重連",
disconnect: "中斷"
},
stateLabels: {
idle: "空閒",
connecting: "連線中",
auth_pending: "驗證中",
connected: "已連線",
reconnecting: "重連中",
disconnected: "已中斷",
error: "異常",
config_required: "設定缺失"
},
voice: {
recordingHint: "正在收音,鬆開後傳送或記錄閃念",
inputPlaceholder: "按住下方語音按鈕開始輸入"
},
aiDialog: {
title: "AI 快速啟動",
hint: "啟動參數已移到 全域設定 -> 連線 -> AI 連線",
currentMode: "目前模式",
launchCodex: "啟動 Codex",
launchCopilot: "啟動 Copilot",
close: "關閉"
},
toast: {
aiAlreadyRunning: "{provider} 正在目前工作階段中執行,請先退出後再重新啟動"
},
fallback: {
noProject: "未設定專案",
unnamedServer: "未命名伺服器"
},
sessionInfo: {
title: "會話資訊",
nameLabel: "伺服器名稱",
projectLabel: "工作目錄",
addressLabel: "伺服器地址",
jumpTargetLabel: "跳至伺服器",
sshConnectionLabel: "SSH連線",
aiConnectionLabel: "AI連線",
connectedValue: "連線",
disconnectedValue: "斷開",
emptyValue: "-"
},
modal: {
socketDomainTitle: "Socket 網域未配置",
socketDomainContent: "目前網關地址不在小程式 socket 合法網域清單:{domainHint}",
socketDomainContentNoHint: "目前網關地址不在小程式 socket 合法網域清單"
},
diagnostics: {
responseAxisCardLabel: "網關響應(ms)",
networkAxisCardLabel: "網路時延(ms)",
chartMinShort: "min",
chartMaxShort: "max",
chartAvgShort: "avg",
chartStatEmpty: "--"
},
tts: {
enable: "開啟語音播報",
disable: "關閉語音播報",
settingsTitle: "播報設定",
settingsDesc: "控制終端語音播報開關與總播報長度",
lengthLabel: "總播報長度",
lengthUnit: "字",
lengthHint: "只播報回答正文,不讀輸入行與底部狀態列。",
segmentHint: "內部會自動按更小段落依序播報,優先縮短首段等待時間。"
},
summary: {
gatewayConnect: "小程式端發起網關連線",
sessionRestored: "會話已恢復",
sessionConnected: "會話已連線"
},
errors: {
serverNotFound: "伺服器不存在",
sessionNotConnected: "會話未連線",
opsConfigMissing: "運維配置缺失,請聯絡管理員",
gatewayError: "網關錯誤",
connectionException: "連線異常",
sessionReadyTimeout: "會話就緒逾時",
serverConfigIncomplete: "伺服器設定不完整",
connectionFailed: "連線失敗",
sessionDisconnected: "會話已中斷",
waitSessionTimeout: "等待會話連線逾時",
codexLaunchFailed: "Codex 啟動失敗",
copilotLaunchFailed: "Copilot 啟動失敗",
codexNotInstalled: "伺服器未安裝 codex",
codexLaunching: "Codex 正在啟動中",
waitCodexTimeout: "等待 Codex 啟動結果逾時",
micPermissionDenied: "麥克風權限未開啟,請在設定中允許錄音",
micPermissionReadFailed: "讀取麥克風權限失敗",
recorderBusy: "錄音器忙碌中,請稍後重試",
recordCaptureFailed: "錄音採集失敗",
asrFailed: "語音辨識失敗",
asrGatewayFailed: "語音網關連線失敗,請檢查小程式 socket 合法網域",
asrGatewayConnectFailed: "語音網關連線失敗,請檢查網路或網關配置",
asrTimeout: "語音服務連線逾時,請稍後重試",
clipboardEmpty: "剪貼簿為空",
clipboardReadFailed: "讀取剪貼簿失敗",
noRecordContent: "沒有可記錄內容",
recordSaved: "已記錄到閃念清單",
noSpeakableContent: "目前沒有可播報內容",
contentNotSpeakable: "目前內容不適合播報",
ttsTextTooLong: "播報文字過長",
ttsTimeout: "語音生成逾時,請稍後重試",
ttsUpstreamRejected: "語音服務鑑權或權限失敗,請聯絡管理員檢查 TTS 配置",
ttsSynthesizeFailed: "語音生成失敗",
ttsPlayFailed: "音訊播放失敗,請檢查網路",
ttsUnavailable: "TTS 服務未配置"
}
}
},
en: {
common: {
statusLabels: {
idle: "Idle",
connecting: "Connecting",
auth_pending: "Authorizing",
connected: "Connected",
reconnecting: "Reconnecting",
disconnected: "Disconnected",
error: "Error",
config_required: "Config Missing"
},
runtimeStateLabels: {
connected: "Connected",
disconnected: "Disconnected"
},
pageIndicator: "Page {page} / {total}"
},
bottomNav: {
backText: "Back",
pageTextLabels: {
"open-terminal-shell": "Term",
"/pages/terminal/index": "Term",
"/pages/connect/index": "Srv",
"/pages/logs/index": "Logs",
"/pages/records/index": "Notes",
"/pages/settings/index": "Cfg",
"/pages/about/index": "About",
"/pages/plugins/index": "Plug",
default: "Page"
},
modal: {
noTerminalTitle: "No terminal to open",
noTerminalContent: "Start a session from a server card first, then open the terminal page."
}
},
settings: {
navTitle: "Settings",
saveStatus: {
synced: "Local settings synced",
saving: "Autosaving...",
saved: "Saved automatically"
},
tabs: {
ui: "UI",
shell: "Terminal",
connection: "Connection",
log: "Records"
},
sections: {
languageTitle: "Language",
languageDesc: "Switch the MiniProgram interface language",
uiTitle: "UI Settings",
uiDesc: "App appearance and theme mode",
shellDisplayTitle: "Display Settings",
shellDisplayDesc: "Terminal display and input experience",
ttsTitle: "Speech Settings",
ttsDesc: "Values are in characters. Default total limit is 500 and default segment length is 80.",
shellBufferTitle: "Terminal Buffer",
shellBufferDesc: "Control live buffer and resume snapshot limits to avoid excessive memory use",
connectionTitle: "Connection Settings",
connectionDesc: "Connection behavior and default server parameters",
aiConnectionTitle: "AI Connection",
aiConnectionDesc: "Set the default launch permissions for Codex and Copilot",
syncTitle: "Sync Settings",
syncDesc: "Control whether config data is synced to the cloud",
recordTitle: "Record Settings",
recordDesc: "Control retention for notes and logs",
voiceCategoryTitle: "Note Categories",
voiceCategoryDesc: "Manage note categories"
},
fields: {
themeMode: "Mode",
themePreset: "Theme",
uiLanguage: "UI Language",
uiAccentColor: "Accent",
uiBgColor: "Background",
uiTextColor: "Text",
uiBtnColor: "Button",
shellBgColor: "Terminal Background",
shellTextColor: "Terminal Foreground",
shellAccentColor: "Cursor Accent",
shellFontFamily: "Font",
shellFontSize: "Font Size",
shellLineHeight: "Line Height",
unicode11: "Wide Character Support",
shellActivationDebugOutline: "Activation Outline",
showVoiceInputButton: "Voice Input Button",
ttsSpeakableMaxChars: "Total length limit",
ttsSegmentMaxChars: "Segment length",
shellBufferMaxEntries: "Max Buffered Lines",
shellBufferMaxBytes: "Max Buffered Bytes",
shellBufferSnapshotMaxLines: "Resume Snapshot Lines",
autoReconnect: "Auto Reconnect",
reconnectLimit: "Reconnect Limit",
backgroundSessionKeepAliveMinutes: "Background Keepalive (min)",
defaultAuthType: "Default Auth Type",
aiDefaultProvider: "Default AI",
aiCodexSandboxMode: "Codex",
aiCopilotPermissionMode: "Copilot",
defaultPort: "Default SSH Port",
defaultProjectPath: "Default Project Path",
defaultTimeoutSeconds: "Default Timeout (s)",
defaultHeartbeatSeconds: "Default Heartbeat (s)",
syncConfigEnabled: "Sync config to cloud",
logRetentionDays: "Retention Days",
voiceCategoryList: "Category List"
},
hints: {
shellFontSizeReconnect: "Reconnect after changing font size for the cleanest result",
shellActivationDebugOutline:
"Tap the activation area to open the soft keyboard. Tapping elsewhere closes it for quicker control.",
showVoiceInputButton:
"Control whether the floating voice button and its expanded panel are shown in the lower-right corner.",
ttsSpeakableMaxChars:
"Recommended range: 120-1200 characters. Only the assistant response is spoken; input lines and the footer are skipped. Long text is split automatically to shorten the wait for the first chunk.",
syncConfigLine1: "Turning this off pauses cloud sync for settings, server profiles and notes.",
syncConfigLine2: "Local save, terminal connections and the current session are not affected.",
voicePreviewUnicodeOn: "on",
voicePreviewUnicodeOff: "off",
terminalPreviewLine: "Unicode11: {unicodeState} | CJK ABC 123 |_END_"
},
placeholders: {
defaultProjectPath: "e.g. ~/workspace",
newVoiceRecordCategory: "New category"
},
buttons: {
addVoiceRecordCategory: "Add",
setDefaultCategory: "Set Default",
removeSelectedCategory: "Delete Selected"
},
labels: {
defaultBadge: "Default",
ttsSpeakableCharsUnit: " chars"
},
options: {
authType: {
password: "Password",
key: "Key"
},
aiDefaultProvider: {
codex: "Codex",
copilot: "Copilot"
},
aiCodexSandboxMode: {
readOnly: "Read Only",
workspaceWrite: "Project RW",
dangerFullAccess: "Full Access"
},
aiCopilotPermissionMode: {
default: "Default",
experimental: "Experimental",
allowAll: "Full Access"
},
themeMode: {
dark: "Dark",
light: "Light"
},
uiLanguage: {
"zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
en: "English",
ja: "日本語",
ko: "한국어"
},
themePresetDefaultSuffix: " (Default)",
fontFallback: "Monospace Default"
},
toast: {
enterCategoryName: "Enter a category name",
categoryExists: "Category already exists",
maxCategories: "Up to 10 categories",
fallbackCannotDelete: "The fallback category cannot be deleted",
keepAtLeastOneCategory: "Keep at least one category"
}
},
connect: {
navTitle: "Servers",
pageTitle: "My Servers",
searchPlaceholder: "Search servers",
recentConnectionPrefix: "Last connected",
emptyTip: "No matching servers",
unnamedServer: "Unnamed Server",
authTypeLabels: {
password: "Password",
privateKey: "Private Key",
certificate: "Certificate"
},
textIcons: {
create: "New",
remove: "Del",
selectAll: "All",
search: "Go",
copy: "Copy",
connect: "SSH"
},
swipeCopy: "Copy",
swipeDelete: "Delete",
modal: {
removeTitle: "Delete Servers",
removeContent: "Delete the selected servers ({count})?",
removeSingleContent: "Delete server \"{name}\"?"
},
toast: {
serverNotFound: "Server not found",
serverToCopyNotFound: "Server to copy was not found",
serverCopied: "Server duplicated",
serverDeleted: "Server deleted",
clearSearchBeforeSort: "Clear the search filter before reordering"
},
summary: {
connectFromList: "Started connection from the server list",
aiFromList: "Started AI quick launch from the server list"
},
fallback: {
noConnection: "Never connected",
newServerPrefix: "server"
},
display: {
projectPrefix: "project"
}
},
logs: {
navTitle: "Logs",
exportButton: "Export Redacted Logs",
totalCount: "{total} entries",
empty: "No logs yet",
prev: "Previous",
next: "Next",
toast: {
copied: "Logs copied"
}
},
records: {
navTitle: "Notes",
searchPlaceholder: "Search notes",
allCategories: "All Categories",
addButton: "Add",
swipeCopy: "Copy",
swipeDelete: "Delete",
swipeProcessed: "Done",
swipeDiscarded: "Discarded",
empty: "No notes yet",
prev: "Previous",
next: "Next",
exportButton: "Export Notes",
editPlaceholder: "Edit note content",
newRecordHint: "Type to autosave as a new note",
updatedAtPrefix: "Updated {time}",
closeEditAriaLabel: "Close editor",
contextFallback: "No context",
exportFields: {
createdAt: "Created",
updatedAt: "Updated",
server: "Server",
category: "Category",
context: "Context"
},
toast: {
deleted: "Deleted",
copied: "Copied",
processed: "Marked done",
discarded: "Discarded",
updateFailed: "Update failed",
categoryUpdated: "Category updated",
exported: "Notes copied"
}
},
plugins: {
navTitle: "Plugins",
runtimeStatePrefix: "Runtime State: ",
summary:
"Aligned with the current MiniProgram baseline v3.0.0: lifecycle control, import/export, command execution and runtime logs.",
sections: {
pluginList: "Plugin List",
importJson: "Import Plugin JSON",
runCommand: "Run Command",
runtimeLogs: "Runtime Logs"
},
buttons: {
enable: "Enable",
disable: "Disable",
reload: "Reload",
remove: "Remove",
importJson: "Import",
exportJson: "Export All (Copy)"
},
empty: {
noPlugins: "No plugins yet",
noCommands: "No commands are available. A live session and registered plugin commands are required.",
noLogs: "No logs yet"
},
placeholder: {
pluginJson: '[{"manifest":...,"mainJs":"...","stylesCss":"..."}]'
},
modal: {
removeTitle: "Remove Plugin",
removeContent: "Remove plugin {id}?"
},
toast: {
bootstrapFailed: "Plugin bootstrap failed",
pastePluginJsonFirst: "Paste plugin JSON first",
importSuccess: "Imported",
importFailed: "Import failed",
exportSuccess: "Plugin JSON copied",
exportFailed: "Export failed",
enabled: "Enabled",
enableFailed: "Enable failed",
disabled: "Disabled",
disableFailed: "Disable failed",
reloaded: "Reloaded",
reloadFailed: "Reload failed",
removed: "Removed",
removeFailed: "Remove failed",
commandExecuted: "Command executed",
commandExecuteFailed: "Command execution failed"
}
},
serverSettings: {
navTitle: "Server Settings",
sections: {
basicTitle: "Basic Info",
basicDesc: "Identify and locate the target server",
authTitle: "Authentication",
authDesc: "Fill in the password or key material based on the auth mode",
connectTitle: "Connection",
connectDesc: "Define the connection path and working directory",
jumpHostTitle: "Jump Host",
jumpHostDesc: "Reach the target server through the configured jump host"
},
fields: {
name: "Name",
tags: "Tags",
host: "Host",
port: "Port",
username: "Username",
authType: "Auth Type",
password: "Password",
privateKey: "Private Key",
passphrase: "Passphrase",
certificate: "Certificate",
transportMode: "Transport",
aiProjectPath: "AI Working Dir",
jumpHost: "Jump Host",
jumpPort: "Jump Port",
jumpUsername: "Jump Username"
},
options: {
authType: {
password: "Password",
privateKey: "Private Key",
certificate: "Certificate"
}
},
placeholders: {
tags: "prod,beijing",
aiProjectPath: "~/workspace/project"
},
directoryPicker: {
openButton: "Choose Directory",
loading: "Loading",
cancel: "Cancel",
apply: "Apply"
},
modal: {
socketDomainTitle: "Socket Domain Not Allowed",
socketDomainContent:
"The current gateway URL is not in the MiniProgram socket allowlist: {domainHint}",
socketDomainContentNoHint: "The current gateway URL is not in the MiniProgram socket allowlist",
connectFailedTitle: "Unable to Connect",
connectFailedContent:
"{message}\nCheck whether the host, port, username and authentication details are correct."
},
toast: {
opsConfigMissing: "Ops configuration is missing. Contact the administrator.",
saved: "Saved",
connectFromSettings: "Started connection from server settings"
}
},
terminal: {
navTitle: "Terminal",
disconnectedHint:
"Use the reconnect switch in the top-right corner or the AI button in the top-left corner to reconnect.",
connectionAction: {
reconnect: "Reconnect",
disconnect: "Disconnect"
},
stateLabels: {
idle: "Idle",
connecting: "Connecting",
auth_pending: "Authorizing",
connected: "Connected",
reconnecting: "Reconnecting",
disconnected: "Disconnected",
error: "Error",
config_required: "Config Missing"
},
voice: {
recordingHint: "Recording... release to send or save as a note",
inputPlaceholder: "Hold the voice button below to start input"
},
aiDialog: {
title: "AI Quick Launch",
hint: "Launch options moved to Global Settings -> Connection -> AI Connection",
currentMode: "Current Mode",
launchCodex: "Launch Codex",
launchCopilot: "Launch Copilot",
close: "Close"
},
toast: {
aiAlreadyRunning: "{provider} is already running in this session. Exit it before relaunching"
},
fallback: {
noProject: "No Project Set",
unnamedServer: "Unnamed Server"
},
sessionInfo: {
title: "Session Info",
nameLabel: "Server Name",
projectLabel: "Working Directory",
addressLabel: "Server Address",
jumpTargetLabel: "Target Server",
sshConnectionLabel: "SSH Connection",
aiConnectionLabel: "AI Connection",
connectedValue: "Connected",
disconnectedValue: "Disconnected",
emptyValue: "-"
},
modal: {
socketDomainTitle: "Socket Domain Not Allowed",
socketDomainContent:
"The current gateway URL is not in the MiniProgram socket allowlist: {domainHint}",
socketDomainContentNoHint: "The current gateway URL is not in the MiniProgram socket allowlist"
},
diagnostics: {
responseAxisCardLabel: "Gateway RTT (ms)",
networkAxisCardLabel: "Network RTT (ms)",
chartMinShort: "min",
chartMaxShort: "max",
chartAvgShort: "avg",
chartStatEmpty: "--"
},
tts: {
enable: "Enable TTS",
disable: "Disable TTS",
settingsTitle: "Speech Settings",
settingsDesc: "Control terminal speech playback and total spoken length",
lengthLabel: "Total spoken length",
lengthUnit: " chars",
lengthHint: "Only the assistant response is read aloud. Input lines and the footer are skipped.",
segmentHint: "Long content is automatically split into smaller chunks to shorten the wait for the first chunk."
},
summary: {
gatewayConnect: "MiniProgram started a gateway connection",
sessionRestored: "Session resumed",
sessionConnected: "Session connected"
},
errors: {
serverNotFound: "Server not found",
sessionNotConnected: "Session is not connected",
opsConfigMissing: "Ops configuration is missing. Contact the administrator.",
gatewayError: "Gateway error",
connectionException: "Connection error",
sessionReadyTimeout: "Session readiness timed out",
serverConfigIncomplete: "Server configuration is incomplete",
connectionFailed: "Connection failed",
sessionDisconnected: "Session disconnected",
waitSessionTimeout: "Timed out waiting for the session connection",
codexLaunchFailed: "Codex launch failed",
copilotLaunchFailed: "Copilot launch failed",
codexNotInstalled: "codex is not installed on the server",
codexLaunching: "Codex is already launching",
waitCodexTimeout: "Timed out waiting for the Codex launch result",
micPermissionDenied: "Microphone permission is disabled. Allow recording in settings first.",
micPermissionReadFailed: "Failed to read microphone permission",
recorderBusy: "Recorder is busy. Try again later.",
recordCaptureFailed: "Audio capture failed",
asrFailed: "Speech recognition failed",
asrGatewayFailed: "Voice gateway connection failed. Check the MiniProgram socket allowlist.",
asrGatewayConnectFailed:
"Voice gateway connection failed. Check the network or gateway configuration.",
asrTimeout: "Voice service connection timed out. Try again later.",
clipboardEmpty: "Clipboard is empty",
clipboardReadFailed: "Failed to read the clipboard",
noRecordContent: "Nothing to save",
recordSaved: "Saved to notes",
noSpeakableContent: "Nothing suitable to read aloud",
contentNotSpeakable: "The current content is not suitable for speech",
ttsTextTooLong: "The speech text is too long",
ttsTimeout: "Speech generation timed out. Try again later.",
ttsUpstreamRejected: "TTS authentication or permissions failed. Ask the administrator to check the TTS configuration.",
ttsSynthesizeFailed: "Speech generation failed",
ttsPlayFailed: "Audio playback failed. Check the network.",
ttsUnavailable: "The TTS service is not configured"
}
}
}
};
I18N_CATALOG.ja = applyCatalogOverlay(I18N_CATALOG.en, JA_I18N_OVERLAY);
I18N_CATALOG.ko = applyCatalogOverlay(I18N_CATALOG.en, KO_I18N_OVERLAY);
module.exports = {
I18N_CATALOG
};