feat(i18n): add Spanish French German Russian and Portuguese
This commit is contained in:
1 parent
2ae65c16b7
commit
84edeadc2b
1616 files changed
+26418
-303
No files matched your search
@@ -33,8 +33,8 @@
|
||||
en: 372297005b57a08b
|
||||
zh: 074a635ac17e4362
|
||||
/deepseek-harness-desktop/installation-ownership:
|
||||
en: 7cbb1f9e5006bd34
|
||||
zh: 01e9e15a75a90450
|
||||
en: 160b500cdcd6a39a
|
||||
zh: 6c267f1762ec3689
|
||||
/deepseek-harness-desktop/installation-ownership/runtime-and-plugin-activation:
|
||||
en: a1a47b09f4a72ba4
|
||||
zh: 7b1cf27f0b72cf31
|
||||
@@ -45,8 +45,8 @@
|
||||
en: faf7676ba18bbf2f
|
||||
zh: f1d7b75ad348c548
|
||||
/deepseek-harness-desktop/develop/startup-onboarding:
|
||||
en: d87d51b901b72ecd
|
||||
zh: 525da1c4d56af659
|
||||
en: 67dc7ef3e293236a
|
||||
zh: 1b224db684a2d1d7
|
||||
/deepseek-harness-desktop/develop/welcome-window-appearance:
|
||||
en: 617a89aeb28131b9
|
||||
zh: 4d84bd5d86501c86
|
||||
|
||||
@@ -152,7 +152,7 @@ The product UI retains Web actions, including "Open In..." through the shared au
|
||||
|
||||
Update copy preserves the complete version, including prerelease suffixes, without adding v or V. When no update is available, the dialog title reports the result and the body shows the current version.
|
||||
|
||||
Electron chooses typed English, Chinese, or Japanese shell copy from its application locale and falls back to English. The macOS application bundle declares English, Simplified Chinese, and Japanese in `CFBundleLocalizations`, allowing macOS to match the initial application language to the user’s preferred languages. Saved Client UI language preferences still take precedence for the main interface. Windows NSIS installer resources live in one JSON file per language under `installer/locales/`; packaging generates NSIS strings and discovers the installer language list from these files. English, Simplified Chinese, and Japanese resources must have matching keys and format placeholders; `pnpm run check:i18n` validates them. The native installer test builds and exercises each configured language. Platform account pages and onboarding artwork use English for languages other than Chinese. On Windows, the main document's language updates desktop menus, recovery and update prompts. The repository Client UI i18n gate checks desktop sources.
|
||||
Electron chooses typed shell copy in the eight [shipped Client languages](../../packages/client/locale/README.md) from its application locale and falls back to English. The macOS application bundle declares all eight languages in `CFBundleLocalizations`, allowing macOS to match the initial application language to the user’s preferred languages. Saved Client UI language preferences still take precedence for the main interface. Windows NSIS installer resources live in one JSON file per language under `installer/locales/`; packaging generates NSIS strings and discovers the installer language list from these files. All shipped language resources must have matching keys, format placeholders, and command examples; `pnpm run check:i18n` validates them. The native installer test builds and exercises each configured language. Platform account pages and onboarding artwork use English for languages other than Chinese. On Windows, the main document's language updates desktop menus, recovery and update prompts. The repository Client UI i18n gate checks desktop sources.
|
||||
|
||||
Windows and macOS relay native fullscreen transitions and the state after each page load to the renderer, so overlays can adapt their caption clearance.
|
||||
|
||||
@@ -220,7 +220,7 @@ Repeated launches and `dsh://open` keep the workspace hidden until the startup c
|
||||
|
||||
Desktop checks configured model API-key references after the Host starts and before opening the workspace. With no configured key, the welcome window offers the API-key page. Save and continue writes through the existing credential service using the official DeepSeek provider's configured reference, then opens the workspace. Set up later opens the workspace without saving the draft or a completion setting; the next process launch checks credentials again. Back to sign in returns to the entry and clears the unsaved key and validation message. Buttons keep their labels and block competing actions while saving or opening the workspace. The Desktop preload marker suppresses the Web credential dialog, while retaining the Models settings page and the welcome notice.
|
||||
|
||||
The welcome window reads the shared `locale.preference` before it appears. An explicit English, Chinese, or Japanese choice wins; otherwise Desktop picks the first supported OS language and falls back to English. The main UI reads the same preference and OS language order through its isolated preload before mounting. Language changes in Settings update the shell’s current dictionary and menu; automatic selection writes no preference. The welcome window has no language selector.
|
||||
The welcome window reads the shared `locale.preference` before it appears. An explicit supported language choice wins; otherwise Desktop picks the first supported OS language and falls back to English. The main UI reads the same preference and OS language order through its isolated preload before mounting. Language changes in Settings update the shell’s current dictionary and menu; automatic selection writes no preference. The welcome window has no language selector.
|
||||
|
||||
The browser-login waiting page offers a copy-link action for the current pending authorization, a loading indicator, and cancellation. Clipboard failures leave the copy action available for retry. Copy feedback resets after two seconds; the copied state disables the link until it resets. Welcome text uses Montserrat Light with system fallbacks; large action buttons keep the system font, while text buttons use Montserrat Light. English introductory copy is 24px throughout. Chinese introductory copy is 24px with a 26px product name. Login action buttons are 240px wide with 14px labels. Authorization status headings use 20px Montserrat Regular text. The API-key page uses a 20px heading and a 14px back action, with 84px between the secondary button’s bottom edge and the window bottom.
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ Electron 拥有 `$DSH_HOME/profiles/desktop`。其 `dependencies` 包含 pnpm
|
||||
|
||||
升级文案完整展示版本号(包括预发布后缀),不额外添加 v 或 V。无可用更新时,弹窗标题显示检查结果,正文显示当前版本。
|
||||
|
||||
Electron 根据应用语言选择类型化的英文、中文或日文 shell 文案,并回退到英文。macOS 应用包通过 `CFBundleLocalizations` 声明支持英语、简体中文和日语,让 macOS 根据用户的首选语言匹配初始应用语言。主界面仍优先使用已保存的 Client UI 语言偏好。 Windows NSIS 安装器在 `installer/locales/` 下按语言保存独立 JSON 资源;打包从这些文件生成 NSIS 文案和安装器语言清单。英文、简体中文和日语资源的键与格式占位符必须一致,`pnpm run check:i18n` 负责检查。原生安装器测试逐个构建并验证配置中的语言。账户平台页面和引导插图对中文以外的语言使用英文。在 Windows 上,主文档的语言会更新桌面菜单、恢复与更新提示。仓库 Client UI i18n 检查覆盖桌面端源码。
|
||||
Electron 根据应用语言选择类型化的八种[内置 Client 语言](../../packages/client/locale/README.zh.md)的 shell 文案,并回退到英文。macOS 应用包通过 `CFBundleLocalizations` 声明支持全部八种语言,让 macOS 根据用户的首选语言匹配初始应用语言。主界面仍优先使用已保存的 Client UI 语言偏好。Windows NSIS 安装器在 `installer/locales/` 下按语言保存独立 JSON 资源;打包从这些文件生成 NSIS 文案和安装器语言清单。全部内置语言资源的键、格式占位符和命令示例必须一致,`pnpm run check:i18n` 负责检查。原生安装器测试逐个构建并验证配置中的语言。账户平台页面和引导插图对中文以外的语言使用英文。在 Windows 上,主文档的语言会更新桌面菜单、恢复与更新提示。仓库 Client UI i18n 检查覆盖桌面端源码。
|
||||
|
||||
Windows 和 macOS 会在原生全屏切换及每次页面加载后向渲染器同步全屏状态,让浮层调整顶栏避让距离。
|
||||
|
||||
@@ -220,7 +220,7 @@ API Key 输入框初始为空,并通过 `autocomplete="new-password"` 请求 C
|
||||
|
||||
Desktop 在 Host 启动后、打开工作区前检查模型 API Key 引用是否已配置。没有已配置的密钥时,欢迎窗口提供 API Key 页面。“保存并继续”通过现有凭证服务写入 DeepSeek 官方提供方配置的引用,然后打开工作区。“稍后配置”打开工作区,但不保存草稿或完成标记;下次进程启动时会重新检查凭证。“返回登录”回到入口并清空未保存的密钥和校验提示。保存或打开工作区期间,按钮保持原文案并禁用竞争操作。Desktop preload 标记使 Web 凭证弹窗不再显示,同时保留模型设置页和欢迎须知。
|
||||
|
||||
欢迎窗口在显示前读取共享的 `locale.preference`。用户明确选择的英文、中文或日文优先;否则 Desktop 按系统语言顺序匹配支持的语言,并以英文兜底。主界面在挂载前通过隔离 preload 读取同一偏好和系统语言顺序。在设置中切换语言会更新桌面壳的当前词典和菜单;自动选择不会写入偏好。欢迎窗口不提供语言切换入口。
|
||||
欢迎窗口在显示前读取共享的 `locale.preference`。用户明确选择的受支持语言优先;否则 Desktop 按系统语言顺序匹配支持的语言,并以英文兜底。主界面在挂载前通过隔离 preload 读取同一偏好和系统语言顺序。在设置中切换语言会更新桌面壳的当前词典和菜单;自动选择不会写入偏好。欢迎窗口不提供语言切换入口。
|
||||
|
||||
等待浏览器登录时,欢迎页提供当前待授权请求的链接复制入口、加载指示和取消操作;剪贴板写入失败后可以重试复制,复制结果提示在两秒后恢复;已复制状态下链接禁用,恢复后可再次点击。Welcome 文字使用 Montserrat Light 并回退到系统字体,底部大按钮保留系统字体,文字按钮使用 Montserrat Light。英文欢迎正文及产品名均为 24px,中文欢迎正文为 24px、产品名为 26px。登录操作按钮宽 240px,文字为 14px。授权状态标题使用 20px Montserrat Regular 字重。API Key 页的标题为 20px,返回操作为 14px,次级按钮底边距窗口底部 84px。
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"nsisLanguage": "GERMAN",
|
||||
"strings": {
|
||||
"INSTALLER_INSTALL": "Jetzt installieren",
|
||||
"INSTALLER_FINISH": "Fertigstellen",
|
||||
"INSTALLER_NATIVE_PROGRESS": "Installation wird vorbereitet… %d%%",
|
||||
"INSTALLER_PROGRESS_EXTRACT": "Dateien extrahieren… %d%%",
|
||||
"INSTALLER_PROGRESS_COPY": "Dateien werden installiert… %d%%",
|
||||
"INSTALLER_PROGRESS_REGISTER": "Abschluss der Installation… %d%%",
|
||||
"INSTALLER_PROGRESS_CLEAN": "Bereinigen temporärer Dateien… %d%%",
|
||||
"INSTALLER_CHOOSE_PATH": "Standort wählen",
|
||||
"INSTALLER_BROWSE": "Durchsuchen",
|
||||
"INSTALLER_LAUNCH": "Jetzt starten",
|
||||
"INSTALLER_LAUNCH_FAILED": "DeepSeek Harness konnte nicht gestartet werden. Versuchen Sie es noch einmal oder deaktivieren Sie „Jetzt starten“ und schließen Sie das Installationsprogramm.",
|
||||
"INSTALLER_UI_ERROR": "Das Installationsprogramm konnte sein Fenster nicht initialisieren. Schließen Sie es und versuchen Sie es erneut.",
|
||||
"INSTALLER_THEME_ERROR": "Verwenden Sie /THEME=auto, /THEME=light oder /THEME=dark.",
|
||||
"INSTALLER_FAILED": "Die Installation wurde nicht abgeschlossen. Schließen Sie dieses Installationsprogramm und versuchen Sie es erneut. Wenn das Problem weiterhin besteht, laden Sie das Installationsprogramm erneut herunter.",
|
||||
"INSTALLER_RUNNING": "DeepSeek Harness läuft. Beenden Sie es über die Taskleiste und versuchen Sie es erneut.",
|
||||
"INSTALLER_DIRECTORY_FAILED": "Das Installationsverzeichnis konnte nicht ersetzt werden.",
|
||||
"INSTALLER_DIRECTORY_HINT": "Überprüfen Sie den Zugriff auf das Installationsverzeichnis und schließen Sie Programme mithilfe seiner Dateien. Führen Sie dann das Installationsprogramm erneut aus. Kopieren Sie die Fehlerdetails, wenn das Problem weiterhin besteht.",
|
||||
"INSTALLER_DIRECTORY_RESTORE_HINT": "Die vorherige Installation konnte nicht wiederhergestellt werden. Behalten Sie das in den Fehlerdetails angezeigte Sicherungsverzeichnis bei und wenden Sie sich vor der erneuten Installation an den Support.",
|
||||
"INSTALLER_PATH_INVALID": "Wählen Sie einen vollständigen lokalen Ordnerpfad. Laufwerksstämme, Systemordner, Links und Sonderzeichen werden nicht unterstützt.",
|
||||
"INSTALLER_PATH_OWNERSHIP": "Wählen Sie einen leeren Ordner oder den registrierten DeepSeek Harness-Installationsordner.",
|
||||
"INSTALLER_PATH_WRITABLE": "Dieser Ort ist nicht beschreibbar. Wählen Sie einen Ordner, der für den aktuellen Benutzer verfügbar ist.",
|
||||
"INSTALLER_DISK_SPACE": "Es ist nicht genügend freier Speicherplatz vorhanden. Wählen Sie einen anderen Standort.",
|
||||
"INSTALLER_PER_USER": "Dieses Installationsprogramm unterstützt nur den aktuellen Benutzer. Deinstallieren Sie zunächst die vorhandene All-User-Installation.",
|
||||
"INSTALLER_EXTRACT_FAILED": "Die Anwendungsdateien konnten nicht extrahiert werden.",
|
||||
"INSTALLER_EXTRACT_HINT": "Möglicherweise hat die Sicherheitssoftware eine Datei blockiert oder die Festplatte ist voll. Schließen Sie dieses Installationsprogramm und versuchen Sie es erneut. Wenn es weiterhin fehlschlägt, senden Sie uns die Fehlerdetails unten.",
|
||||
"INSTALLER_EXTRACT_COPY": "Fehlerdetails kopieren",
|
||||
"INSTALLER_EXTRACT_EXPAND": "Details anzeigen",
|
||||
"INSTALLER_EXTRACT_COLLAPSE": "Details ausblenden",
|
||||
"INSTALLER_EXTRACT_SAVED": "Der vollständige Bericht wurde unter %s gespeichert",
|
||||
"INSTALLER_EXTRACT_UNSAVED": "Der vollständige Bericht konnte nicht gespeichert werden. Verwenden Sie „Fehlerdetails kopieren“, um sie beizubehalten.",
|
||||
"INSTALLER_EXTRACT_COPIED": "Fehlerdetails wurden in die Zwischenablage kopiert."
|
||||
},
|
||||
"uninstaller": {
|
||||
"welcome": "Willkommen",
|
||||
"finished": "entfernt worden"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"nsisLanguage": "SPANISH",
|
||||
"strings": {
|
||||
"INSTALLER_INSTALL": "Instalar ahora",
|
||||
"INSTALLER_FINISH": "Finalizar",
|
||||
"INSTALLER_NATIVE_PROGRESS": "Preparando la instalación… %d%%",
|
||||
"INSTALLER_PROGRESS_EXTRACT": "Extrayendo archivos… %d%%",
|
||||
"INSTALLER_PROGRESS_COPY": "Instalando archivos… %d%%",
|
||||
"INSTALLER_PROGRESS_REGISTER": "Terminando la instalación… %d%%",
|
||||
"INSTALLER_PROGRESS_CLEAN": "Limpieza de archivos temporales… %d%%",
|
||||
"INSTALLER_CHOOSE_PATH": "Elige ubicación",
|
||||
"INSTALLER_BROWSE": "Examinar",
|
||||
"INSTALLER_LAUNCH": "Lanzar ahora",
|
||||
"INSTALLER_LAUNCH_FAILED": "No se pudo iniciar DeepSeek Harness. Vuelva a intentarlo o desmarque Iniciar ahora y cierre el instalador.",
|
||||
"INSTALLER_UI_ERROR": "El instalador no pudo inicializar su ventana. Ciérralo y vuelve a intentarlo.",
|
||||
"INSTALLER_THEME_ERROR": "Utilice /THEME=auto, /THEME=light o /THEME=dark.",
|
||||
"INSTALLER_FAILED": "La instalación no terminó. Cierre este instalador y vuelva a intentarlo. Si el problema persiste, descargue el instalador nuevamente.",
|
||||
"INSTALLER_RUNNING": "DeepSeek Harness se está ejecutando. Salga de la bandeja del sistema y vuelva a intentarlo.",
|
||||
"INSTALLER_DIRECTORY_FAILED": "No se pudo reemplazar el directorio de instalación.",
|
||||
"INSTALLER_DIRECTORY_HINT": "Verifique el acceso al directorio de instalación y cierre los programas usando sus archivos, luego ejecute el instalador nuevamente. Copie los detalles del error si el problema persiste.",
|
||||
"INSTALLER_DIRECTORY_RESTORE_HINT": "No se pudo restaurar la instalación anterior. Mantenga el directorio de respaldo que se muestra en los detalles del error y comuníquese con el soporte antes de volver a instalar.",
|
||||
"INSTALLER_PATH_INVALID": "Elija una ruta de carpeta local completa. No se admiten raíces de unidades, carpetas del sistema, enlaces ni caracteres especiales.",
|
||||
"INSTALLER_PATH_OWNERSHIP": "Elija una carpeta vacía o la carpeta de instalación registrada de DeepSeek Harness.",
|
||||
"INSTALLER_PATH_WRITABLE": "Esta ubicación no se puede escribir. Elija una carpeta disponible para el usuario actual.",
|
||||
"INSTALLER_DISK_SPACE": "No hay suficiente espacio libre en disco. Elija otra ubicación.",
|
||||
"INSTALLER_PER_USER": "Este instalador solo admite el usuario actual. Primero desinstale la instalación existente para todos los usuarios.",
|
||||
"INSTALLER_EXTRACT_FAILED": "No se pudieron extraer los archivos de la aplicación.",
|
||||
"INSTALLER_EXTRACT_HINT": "Es posible que el software de seguridad haya bloqueado un archivo o que el disco esté lleno. Cierra este instalador y vuelve a intentarlo. Si sigue fallando, envíenos los detalles del error a continuación.",
|
||||
"INSTALLER_EXTRACT_COPY": "Copiar detalles del error",
|
||||
"INSTALLER_EXTRACT_EXPAND": "Mostrar detalles",
|
||||
"INSTALLER_EXTRACT_COLLAPSE": "Ocultar detalles",
|
||||
"INSTALLER_EXTRACT_SAVED": "El informe completo se guardó en %s.",
|
||||
"INSTALLER_EXTRACT_UNSAVED": "No se pudo guardar el informe completo. Utilice Copiar detalles del error para conservarlo.",
|
||||
"INSTALLER_EXTRACT_COPIED": "Los detalles del error se copiaron al portapapeles."
|
||||
},
|
||||
"uninstaller": {
|
||||
"welcome": "Bienvenido",
|
||||
"finished": "ha sido desinstalado"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"nsisLanguage": "FRENCH",
|
||||
"strings": {
|
||||
"INSTALLER_INSTALL": "Installer maintenant",
|
||||
"INSTALLER_FINISH": "Terminer",
|
||||
"INSTALLER_NATIVE_PROGRESS": "Préparation de l'installation… %d%%",
|
||||
"INSTALLER_PROGRESS_EXTRACT": "Extraction de fichiers… %d%%",
|
||||
"INSTALLER_PROGRESS_COPY": "Installation des fichiers… %d%%",
|
||||
"INSTALLER_PROGRESS_REGISTER": "Finition de l'installation… %d%%",
|
||||
"INSTALLER_PROGRESS_CLEAN": "Nettoyage des fichiers temporaires… %d%%",
|
||||
"INSTALLER_CHOOSE_PATH": "Choisissez un emplacement",
|
||||
"INSTALLER_BROWSE": "Parcourir",
|
||||
"INSTALLER_LAUNCH": "Lancez-vous maintenant",
|
||||
"INSTALLER_LAUNCH_FAILED": "DeepSeek Harness n'a pas pu être lancé. Réessayez ou désactivez Lancer maintenant et fermez le programme d'installation.",
|
||||
"INSTALLER_UI_ERROR": "Le programme d'installation n'a pas pu initialiser sa fenêtre. Fermez-le et réessayez.",
|
||||
"INSTALLER_THEME_ERROR": "Utilisez /THEME=auto, /THEME=light ou /THEME=dark.",
|
||||
"INSTALLER_FAILED": "L'installation n'est pas terminée. Fermez ce programme d'installation et réessayez. Si le problème persiste, téléchargez à nouveau le programme d'installation.",
|
||||
"INSTALLER_RUNNING": "DeepSeek Harness est en cours d'exécution. Quittez-le de la barre d'état système et réessayez.",
|
||||
"INSTALLER_DIRECTORY_FAILED": "Le répertoire d'installation n'a pas pu être remplacé.",
|
||||
"INSTALLER_DIRECTORY_HINT": "Vérifiez l'accès au répertoire d'installation et fermez les programmes à l'aide de ses fichiers, puis réexécutez le programme d'installation. Copiez les détails de l'erreur si le problème persiste.",
|
||||
"INSTALLER_DIRECTORY_RESTORE_HINT": "L'installation précédente n'a pas pu être restaurée. Conservez le répertoire de sauvegarde indiqué dans les détails de l'erreur et contactez l'assistance avant de procéder à une nouvelle installation.",
|
||||
"INSTALLER_PATH_INVALID": "Choisissez un chemin de dossier local complet. Les racines du lecteur, les dossiers système, les liens et les caractères spéciaux ne sont pas pris en charge.",
|
||||
"INSTALLER_PATH_OWNERSHIP": "Choisissez un dossier vide ou le dossier d'installation DeepSeek Harness enregistré.",
|
||||
"INSTALLER_PATH_WRITABLE": "Cet emplacement n'est pas accessible en écriture. Choisissez un dossier disponible pour l'utilisateur actuel.",
|
||||
"INSTALLER_DISK_SPACE": "Il n'y a pas assez d'espace disque libre. Choisissez un autre emplacement.",
|
||||
"INSTALLER_PER_USER": "Ce programme d'installation prend en charge uniquement l'utilisateur actuel. Désinstallez d’abord l’installation existante pour tous les utilisateurs.",
|
||||
"INSTALLER_EXTRACT_FAILED": "Les fichiers de l'application n'ont pas pu être extraits.",
|
||||
"INSTALLER_EXTRACT_HINT": "Un logiciel de sécurité a peut-être bloqué un fichier ou le disque est peut-être plein. Fermez ce programme d'installation et réessayez. Si l'échec persiste, envoyez-nous les détails de l'erreur ci-dessous.",
|
||||
"INSTALLER_EXTRACT_COPY": "Copier les détails de l'erreur",
|
||||
"INSTALLER_EXTRACT_EXPAND": "Afficher les détails",
|
||||
"INSTALLER_EXTRACT_COLLAPSE": "Masquer les détails",
|
||||
"INSTALLER_EXTRACT_SAVED": "Le rapport complet a été enregistré dans %s",
|
||||
"INSTALLER_EXTRACT_UNSAVED": "Le rapport complet n'a pas pu être enregistré. Utilisez Copier les détails de l'erreur pour le conserver.",
|
||||
"INSTALLER_EXTRACT_COPIED": "Les détails de l'erreur ont été copiés dans le presse-papiers."
|
||||
},
|
||||
"uninstaller": {
|
||||
"welcome": "Bienvenue",
|
||||
"finished": "a été supprimé"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"nsisLanguage": "PORTUGUESEBR",
|
||||
"strings": {
|
||||
"INSTALLER_INSTALL": "Instale agora",
|
||||
"INSTALLER_FINISH": "Concluir",
|
||||
"INSTALLER_NATIVE_PROGRESS": "Preparando a instalação… %d%%",
|
||||
"INSTALLER_PROGRESS_EXTRACT": "Extraindo arquivos… %d%%",
|
||||
"INSTALLER_PROGRESS_COPY": "Instalando arquivos… %d%%",
|
||||
"INSTALLER_PROGRESS_REGISTER": "Concluindo a instalação… %d%%",
|
||||
"INSTALLER_PROGRESS_CLEAN": "Limpando arquivos temporários… %d%%",
|
||||
"INSTALLER_CHOOSE_PATH": "Escolha o local",
|
||||
"INSTALLER_BROWSE": "Procurar",
|
||||
"INSTALLER_LAUNCH": "Lançar agora",
|
||||
"INSTALLER_LAUNCH_FAILED": "DeepSeek Harness não pôde ser iniciado. Tente novamente ou desmarque Iniciar agora e feche o instalador.",
|
||||
"INSTALLER_UI_ERROR": "O instalador não conseguiu inicializar sua janela. Feche-o e tente novamente.",
|
||||
"INSTALLER_THEME_ERROR": "Use /THEME=auto, /THEME=light ou /THEME=dark.",
|
||||
"INSTALLER_FAILED": "A instalação não foi concluída. Feche este instalador e tente novamente. Se o problema persistir, baixe o instalador novamente.",
|
||||
"INSTALLER_RUNNING": "DeepSeek Harness está em execução. Saia da bandeja do sistema e tente novamente.",
|
||||
"INSTALLER_DIRECTORY_FAILED": "O diretório de instalação não pôde ser substituído.",
|
||||
"INSTALLER_DIRECTORY_HINT": "Verifique o acesso ao diretório de instalação e feche os programas usando seus arquivos e execute o instalador novamente. Copie os detalhes do erro se o problema persistir.",
|
||||
"INSTALLER_DIRECTORY_RESTORE_HINT": "A instalação anterior não pôde ser restaurada. Mantenha o diretório de backup mostrado nos detalhes do erro e entre em contato com o suporte antes de instalar novamente.",
|
||||
"INSTALLER_PATH_INVALID": "Escolha um caminho completo para a pasta local. Raízes de unidade, pastas de sistema, links e caracteres especiais não são suportados.",
|
||||
"INSTALLER_PATH_OWNERSHIP": "Escolha uma pasta vazia ou a pasta de instalação DeepSeek Harness registrada.",
|
||||
"INSTALLER_PATH_WRITABLE": "Este local não é gravável. Escolha uma pasta disponível para o usuário atual.",
|
||||
"INSTALLER_DISK_SPACE": "Não há espaço livre suficiente em disco. Escolha outro local.",
|
||||
"INSTALLER_PER_USER": "Este instalador oferece suporte apenas ao usuário atual. Desinstale primeiro a instalação existente para todos os usuários.",
|
||||
"INSTALLER_EXTRACT_FAILED": "Os arquivos do aplicativo não puderam ser extraídos.",
|
||||
"INSTALLER_EXTRACT_HINT": "O software de segurança pode ter bloqueado um arquivo ou o disco pode estar cheio. Feche este instalador e tente novamente. Se continuar falhando, envie-nos os detalhes do erro abaixo.",
|
||||
"INSTALLER_EXTRACT_COPY": "Copiar detalhes do erro",
|
||||
"INSTALLER_EXTRACT_EXPAND": "Mostrar detalhes",
|
||||
"INSTALLER_EXTRACT_COLLAPSE": "Ocultar detalhes",
|
||||
"INSTALLER_EXTRACT_SAVED": "O relatório completo foi salvo em %s",
|
||||
"INSTALLER_EXTRACT_UNSAVED": "Não foi possível salvar o relatório completo. Use Copiar detalhes do erro para mantê-lo.",
|
||||
"INSTALLER_EXTRACT_COPIED": "Os detalhes do erro foram copiados para a área de transferência."
|
||||
},
|
||||
"uninstaller": {
|
||||
"welcome": "Bem-vindo",
|
||||
"finished": "foi desinstalado"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"nsisLanguage": "RUSSIAN",
|
||||
"strings": {
|
||||
"INSTALLER_INSTALL": "Установить сейчас",
|
||||
"INSTALLER_FINISH": "Готово",
|
||||
"INSTALLER_NATIVE_PROGRESS": "Подготовка установки… %d%%",
|
||||
"INSTALLER_PROGRESS_EXTRACT": "Извлечение файлов… %d%%",
|
||||
"INSTALLER_PROGRESS_COPY": "Установка файлов… %d%%",
|
||||
"INSTALLER_PROGRESS_REGISTER": "Завершение установки… %d%%",
|
||||
"INSTALLER_PROGRESS_CLEAN": "Очистка временных файлов… %d%%",
|
||||
"INSTALLER_CHOOSE_PATH": "Выберите местоположение",
|
||||
"INSTALLER_BROWSE": "Обзор",
|
||||
"INSTALLER_LAUNCH": "Запустить сейчас",
|
||||
"INSTALLER_LAUNCH_FAILED": "DeepSeek Harness не удалось запустить. Повторите попытку или снимите флажок «Запустить сейчас» и закройте программу установки.",
|
||||
"INSTALLER_UI_ERROR": "Установщику не удалось инициализировать свое окно. Закройте его и попробуйте еще раз.",
|
||||
"INSTALLER_THEME_ERROR": "Используйте /THEME=auto, /THEME=light или /THEME=dark.",
|
||||
"INSTALLER_FAILED": "Установка не завершена. Закройте этот установщик и повторите попытку. Если проблема не устранена, загрузите установщик еще раз.",
|
||||
"INSTALLER_RUNNING": "DeepSeek Harness работает. Закройте его из системного трея и повторите попытку.",
|
||||
"INSTALLER_DIRECTORY_FAILED": "Не удалось заменить каталог установки.",
|
||||
"INSTALLER_DIRECTORY_HINT": "Проверьте доступ к каталогу установки и закройте программы, использующие его файлы, затем снова запустите установщик. Скопируйте сведения об ошибке, если проблема не устранена.",
|
||||
"INSTALLER_DIRECTORY_RESTORE_HINT": "Предыдущую установку восстановить не удалось. Сохраните каталог резервной копии, указанный в сведениях об ошибке, и обратитесь в службу поддержки перед повторной установкой.",
|
||||
"INSTALLER_PATH_INVALID": "Выберите полный путь к локальной папке. Корни дисков, системные папки, ссылки и специальные символы не поддерживаются.",
|
||||
"INSTALLER_PATH_OWNERSHIP": "Выберите пустую папку или зарегистрированную папку установки DeepSeek Harness.",
|
||||
"INSTALLER_PATH_WRITABLE": "Это местоположение недоступно для записи. Выберите папку, доступную текущему пользователю.",
|
||||
"INSTALLER_DISK_SPACE": "Недостаточно свободного места на диске. Выберите другое место.",
|
||||
"INSTALLER_PER_USER": "Этот установщик поддерживает только текущего пользователя. Сначала удалите существующую установку для всех пользователей.",
|
||||
"INSTALLER_EXTRACT_FAILED": "Файлы приложения не удалось извлечь.",
|
||||
"INSTALLER_EXTRACT_HINT": "Возможно, программное обеспечение безопасности заблокировало файл или диск переполнен. Закройте этот установщик и повторите попытку. Если ошибка продолжает возникать, отправьте нам сведения об ошибке ниже.",
|
||||
"INSTALLER_EXTRACT_COPY": "Скопировать сведения об ошибке",
|
||||
"INSTALLER_EXTRACT_EXPAND": "Показать детали",
|
||||
"INSTALLER_EXTRACT_COLLAPSE": "Скрыть детали",
|
||||
"INSTALLER_EXTRACT_SAVED": "Полный отчет сохранен в %s.",
|
||||
"INSTALLER_EXTRACT_UNSAVED": "Полный отчет не удалось сохранить. Используйте Скопировать сведения об ошибке, чтобы сохранить их.",
|
||||
"INSTALLER_EXTRACT_COPIED": "Подробности об ошибке скопированы в буфер обмена."
|
||||
},
|
||||
"uninstaller": {
|
||||
"welcome": "Вас приветствует мастер удаления",
|
||||
"finished": "удалена"
|
||||
}
|
||||
}
|
||||
@@ -165,7 +165,7 @@ export function createElectronBuilderConfig(
|
||||
category: 'public.app-category.developer-tools',
|
||||
// macOS matches the application locale against this bundle, not Electron Framework resources.
|
||||
extendInfo: {
|
||||
CFBundleLocalizations: ['en', 'zh_CN', 'ja'],
|
||||
CFBundleLocalizations: ['en', 'zh_CN', 'ja', 'es', 'fr', 'de', 'ru', 'pt'],
|
||||
NSMicrophoneUsageDescription: 'DeepSeek Harness uses your microphone to transcribe speech into message drafts.',
|
||||
},
|
||||
// Ad-hoc signing keeps the modified Electron executable runnable without a Developer ID.
|
||||
|
||||
@@ -34,7 +34,7 @@ export function readInstallerLocales(directory = defaultDirectory) {
|
||||
return { id: name.slice(0, -5), nsisLanguage: resource.nsisLanguage, strings,
|
||||
uninstaller: dictionary('uninstaller' in resource ? resource.uninstaller : undefined) }
|
||||
})
|
||||
for (const id of ['en_US', 'zh_CN', 'ja_JP']) {
|
||||
for (const id of ['en_US', 'zh_CN', 'ja_JP', 'es_ES', 'fr_FR', 'de_DE', 'ru_RU', 'pt_BR']) {
|
||||
if (!locales.some(locale => locale.id === id)) throw new Error(`installer locales: missing ${id}.json`)
|
||||
}
|
||||
const english = locales.find(locale => locale.id === 'en_US')
|
||||
@@ -49,8 +49,8 @@ export function readInstallerLocales(directory = defaultDirectory) {
|
||||
const actual = locale[field]
|
||||
if (Object.keys(expected).sort().join(',') !== Object.keys(actual).sort().join(',')) throw new Error(`${locale.id}: ${field} keys differ from English`)
|
||||
for (const [key, text] of Object.entries(expected)) {
|
||||
const placeholders = (/** @type {string} */ value) => (value.match(/%.?/gu) ?? []).join(',')
|
||||
if (placeholders(text) !== placeholders(actual[key])) throw new Error(`${locale.id}: ${key} changes format placeholders`)
|
||||
const placeholders = (/** @type {string} */ value) => (value.match(/%.?|(?<![A-Za-z0-9/])\/[A-Z][A-Z_]*(?:=[\w-]+)?/gu) ?? []).join(',')
|
||||
if (placeholders(text) !== placeholders(actual[key])) throw new Error(`${locale.id}: ${key} changes format placeholders or commands`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+869
-5
@@ -1,4 +1,4 @@
|
||||
/** Typed English, Chinese, and Japanese copy owned by the Electron shell. */
|
||||
/** Typed shell copy for every shipped language owned by the Electron shell. */
|
||||
|
||||
export const en = {
|
||||
cliCommandMenu: 'Manage dsh Command…',
|
||||
@@ -517,16 +517,880 @@ export const ja = {
|
||||
mandatoryNotification: 'アプリに戻り、インストールと再起動を確認してください。',
|
||||
} satisfies Record<keyof typeof en, string>
|
||||
|
||||
/** Spanish dictionary, checked against the English keys. */
|
||||
export const es = {
|
||||
cliCommandMenu: 'Administrar el comando dsh…',
|
||||
cliCommandTitle: 'Administrar el comando dsh',
|
||||
cliCommandLocation: 'Comando de escritorio: {path}',
|
||||
cliCommandSelected: 'Comando dsh actual: {path}',
|
||||
cliCommandTarget: 'Objetivo actual del lanzador: {path}',
|
||||
cliCommandShadowed: 'Otro dsh tiene prioridad. Elimine o reordene esa instalación para usar el comando Escritorio de forma predeterminada. También puede ejecutar el comando Escritorio por su ruta completa.',
|
||||
cliCommandSelectionUnknown: 'No se pudo verificar su comando de shell. Un alias u otra instalación de dsh puede tener prioridad.',
|
||||
cliCommandInstalled: 'El comando Escritorio está instalado.',
|
||||
cliCommandNotInstalled: 'Agregue el comando Escritorio a su terminal.',
|
||||
cliCommandBroken: 'El comando de escritorio necesita reparación.',
|
||||
cliCommandInstall: 'Instalar',
|
||||
cliCommandRepair: 'Reparación',
|
||||
cliCommandRemove: 'Quitar',
|
||||
cliCommandClose: 'Cerrar',
|
||||
cliCommandSwitch: '¿Continuar con el comando Escritorio?',
|
||||
cliCommandPreserve: 'Se conservará un comando existente. Otras instalaciones y archivos de inicio del shell no se modificarán.',
|
||||
cliCommandContinue: 'Continuar',
|
||||
cliCommandInstallApp: 'Instale Desktop en su carpeta de Aplicaciones antes de administrar el comando dsh.',
|
||||
cliCommandUpdating: 'Se está instalando una actualización. Administre el comando una vez finalizada la instalación.',
|
||||
cliCommandNewTerminal: 'Abra una nueva terminal y ejecute dsh --version.',
|
||||
cliCommandRemoved: 'Se eliminó el registro de comandos de escritorio.',
|
||||
cliCommandPreviousRestored: 'El lanzador anterior ha sido restaurado.',
|
||||
cliCommandOtherKept: 'Otras instalaciones de mando se han dejado en su lugar.',
|
||||
cliCommandBackupKept: 'Se conserva un lanzador anterior en: {path}',
|
||||
cliCommandChanged: 'El comando o RUTA cambió mientras este cuadro de diálogo estaba abierto. Abra Administrar comando dsh nuevamente para revisar el estado actual.',
|
||||
cliCommandOwnershipError: 'El registro del comando o la copia de seguridad cambió. No se eliminó ningún comando no relacionado.',
|
||||
cliCommandFailed: 'El comando no se pudo actualizar. Verifique que la aplicación esté instalada y que se pueda escribir en el destino, luego vuelva a intentarlo.',
|
||||
application: 'Solicitud',
|
||||
fileMenu: 'Archivo',
|
||||
closePage: 'Cerrar página o ventana',
|
||||
aboutMenu: 'Acerca de DeepSeek Harness',
|
||||
aboutProduct: 'DeepSeek Harness',
|
||||
aboutVersion: 'Versión V{version}',
|
||||
hideApplication: 'Ocultar DeepSeek Harness',
|
||||
hideOtherApplications: 'Ocultar otros',
|
||||
showAllApplications: 'Mostrar todo',
|
||||
quitApplication: 'Salir de DeepSeek Harness',
|
||||
openApplication: 'Abrir DeepSeek Harness',
|
||||
quit: 'dejar de fumar',
|
||||
cancel: 'Cancelar',
|
||||
quitTitle: '¿Salir de DeepSeek Harness?',
|
||||
quitActiveTasks: 'Las tareas en ejecución se interrumpirán.',
|
||||
quitScheduledTasks: 'Las tareas programadas no se ejecutarán mientras la aplicación esté cerrada.',
|
||||
quitActiveAndScheduledTasks: 'Las tareas en ejecución se interrumpirán y las tareas programadas no se ejecutarán mientras la aplicación esté cerrada.',
|
||||
backgroundNoticeBody: 'Las tareas en ejecución continuarán. Puede volver a abrir la ventana desde la bandeja del sistema.',
|
||||
backgroundNoticeConfirm: 'Confirmar',
|
||||
edit: 'Editar',
|
||||
menuBar: 'Menú de aplicaciones',
|
||||
delete: 'Eliminar',
|
||||
undo: 'Deshacer',
|
||||
redo: 'Rehacer',
|
||||
cut: 'cortar',
|
||||
copy: 'Copiar',
|
||||
paste: 'Pegar',
|
||||
selectAll: 'Seleccionar todo',
|
||||
startupFailed: 'DeepSeek Harness no está disponible',
|
||||
fatalSummary: 'La aplicación no pudo iniciarse o se detuvo inesperadamente.',
|
||||
startupAddressInUse: 'Se está ejecutando otra instancia de DSH (como la web de dsh o la aplicación de escritorio). No pueden empezar al mismo tiempo. Salga de la otra instancia DSH en ejecución y luego reinicie.',
|
||||
diagnosticTruncated: '… Detalles del error acortados.',
|
||||
reportWrittenTo: 'Informe de diagnóstico: {path}',
|
||||
startupReinstallAdvice: 'Si faltan archivos de la aplicación o están dañados, ciérrela y vuelva a instalarla. Sus tareas se almacenan por separado.',
|
||||
exitApplication: 'Salir',
|
||||
restartApplication: 'Reiniciar',
|
||||
recoveryOperationFailed: 'La operación de recuperación falló',
|
||||
disableThirdPartyPlugins: 'Deshabilite los complementos de terceros, haga una copia de seguridad del parche del perfil y reinicie',
|
||||
welcomeTitle: 'DeepSeek Harness',
|
||||
welcomeBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineBefore: 'Bienvenido a ',
|
||||
welcomeTaglineBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineAfter: '',
|
||||
welcomeDescription: 'Desarrollar potencial. Explora la inteligencia.',
|
||||
welcomeAuthStarting: 'Abriendo inicio de sesión…',
|
||||
welcomeAuthWaiting: '¿El navegador no se abrió automáticamente?',
|
||||
welcomeAuthWaitingDescription: 'Copie el enlace de inicio de sesión y ábralo en su navegador para iniciar sesión.',
|
||||
welcomeAuthExchanging: 'Completando el inicio de sesión…',
|
||||
welcomeAuthExpired: 'Se agotó el tiempo de inicio de sesión',
|
||||
welcomeAuthExpiredDescription: 'Inicia sesión nuevamente para continuar',
|
||||
welcomeAuthFailed: 'No se pudo completar el inicio de sesión. Inténtelo de nuevo.',
|
||||
welcomeAuthCopyLink: 'Copiar enlace de inicio de sesión',
|
||||
welcomeAuthCopied: 'Copiado',
|
||||
welcomeAuthCopyFailed: 'No se pudo copiar. Intentar otra vez.',
|
||||
welcomeAuthCancel: 'Cancelar',
|
||||
welcomeAuthRetry: 'Iniciar sesión nuevamente',
|
||||
welcomeSignIn: 'Iniciar sesión',
|
||||
welcomeApiKey: 'Agregar clave API',
|
||||
welcomeKeyTitle: 'Agregue una clave API para comenzar',
|
||||
welcomeKeyDescription: 'Configura los modelos oficiales DeepSeek para empezar a utilizar Harness',
|
||||
welcomeKeyPlaceholder: 'Ingrese la clave API',
|
||||
welcomeKeySave: 'Guardar y continuar',
|
||||
welcomeKeyLater: 'Configurar más tarde',
|
||||
welcomeKeyBack: 'Volver para iniciar sesión',
|
||||
welcomeSessionExpired: 'Has cerrado sesión en tu cuenta, inicia sesión nuevamente.',
|
||||
welcomeKeyBlank: 'Ingrese una clave API.',
|
||||
welcomeKeyInvalid: 'Ingrese la clave API, sin comillas, espacios ni una asignación de variable de entorno.',
|
||||
welcomeKeyFailed: 'No se pudo guardar la clave API. Por favor inténtalo de nuevo.',
|
||||
welcomeContinueFailed: 'No se pudo abrir el espacio de trabajo. Por favor inténtalo de nuevo.',
|
||||
checkUpdatesMenu: 'Buscar actualizaciones...',
|
||||
reloadPageMenu: 'Recargar página',
|
||||
restartAppHostMenu: 'Reiniciar la aplicación y el host',
|
||||
updateCheckFailedTitle: 'Error en la comprobación de actualización',
|
||||
updateCheckFailed: 'No se pudo buscar actualizaciones. Inténtelo de nuevo más tarde.',
|
||||
updateDownloadFailed: 'No se pudo descargar la actualización. Por favor inténtalo de nuevo.',
|
||||
updateInstallFailed: 'No se pudo instalar la actualización. Inténtelo de nuevo más tarde.',
|
||||
updateCheckNetworkFailed: 'No se pudo buscar actualizaciones. Comprueba tu conexión y vuelve a intentarlo.',
|
||||
updateDownloadNetworkFailed: 'No se pudo descargar la actualización. Comprueba tu conexión y vuelve a intentarlo.',
|
||||
updateInstallNetworkFailed: 'No se pudo instalar la actualización. Comprueba tu conexión y vuelve a intentarlo.',
|
||||
unknownError: 'Error desconocido',
|
||||
updateCheckTitle: 'Buscar actualizaciones',
|
||||
updateCurrentDetail: 'Versión actual: {version}',
|
||||
updateCurrent: '¡Estás al día!',
|
||||
updateChecking: 'Buscando actualizaciones...',
|
||||
updateDownload: 'Descargar actualización',
|
||||
updateDownloadedTitle: 'La versión {version} está lista para instalar.',
|
||||
updateDownloadedDetail: 'La aplicación se cerrará durante la actualización y se volverá a abrir automáticamente cuando se complete.',
|
||||
updateDownloadedDetailWindows: 'La aplicación se cerrará temporalmente durante la actualización y se volverá a abrir automáticamente cuando se complete.\n\nLa actualización puede tardar algún tiempo. Espere y no vuelva a iniciar la aplicación durante la instalación.',
|
||||
updateClose: 'Cerrar',
|
||||
updateAcknowledge: 'OK',
|
||||
updateLater: 'Actualizar más tarde',
|
||||
updateDownloading: 'Descargando {percent}%…',
|
||||
updateVerifying: 'Verificando archivos de actualización...',
|
||||
updateInstalling: 'Preparándose para reiniciar…',
|
||||
updateRetry: 'Reintentar actualización',
|
||||
updateActiveTasks: 'Las tareas aún están en progreso',
|
||||
updateActiveTasksDetail: 'La actualización detendrá las tareas en curso y reiniciará la aplicación. ¿Continuar?',
|
||||
updateStopTasks: 'Detener tareas y actualizar',
|
||||
updateTasksChanged: 'Han comenzado nuevas tareas. Confirme nuevamente para detener las tareas y actualizar.',
|
||||
updateTasksUnavailable: 'El estado de la tarea no está disponible. Intente actualizar nuevamente cuando el espacio de trabajo esté listo.',
|
||||
updateFullscreenTimeout: 'No se pudo salir de la pantalla completa. Salga de la pantalla completa y luego vuelva a intentar la actualización.',
|
||||
updateStopFailed: 'No se pudieron detener las tareas de forma segura. La actualización no se ha instalado. Inténtelo de nuevo más tarde.',
|
||||
updateTechnicalDetails: 'Ver detalles técnicos',
|
||||
updateTitle: 'Actualización DeepSeek Harness',
|
||||
updateAvailable: 'Nueva versión disponible: {version}',
|
||||
updateDetail: 'Una vez que se completa la descarga, puede instalar la actualización y reiniciar la aplicación.',
|
||||
installAndRestart: 'Instalar y reiniciar',
|
||||
later: 'Más tarde',
|
||||
updateFailedTitle: 'Actualización fallida',
|
||||
mandatoryTitle: 'Actualizar para continuar',
|
||||
mandatoryDetail: 'Esta versión ya no es compatible. Actualiza para continuar. Las tareas en curso seguirán ejecutándose hasta que confirme la instalación y reinicie.',
|
||||
mandatoryUnavailable: 'No se pudieron verificar los requisitos de actualización. Inténtelo de nuevo más tarde.',
|
||||
policyLoginTitle: 'Inicie sesión en el entorno de prueba',
|
||||
policyLoginRequired: 'Inicie sesión con Feishu para verificar los requisitos de actualización para esta versión de prueba. Iniciar sesión no descargará ni instalará una actualización.',
|
||||
policyLogin: 'Iniciar sesión con Feishu',
|
||||
policyLoginFailed: 'El inicio de sesión de Feishu no se completó. Por favor inténtalo de nuevo.',
|
||||
policyLoginLoading: 'Cargando página de inicio de sesión...',
|
||||
mandatoryNoRelease: 'No se encontró ninguna actualización compatible. Verifique nuevamente o comuníquese con el soporte.',
|
||||
mandatoryRefresh: 'comprobar de nuevo',
|
||||
mandatoryPage: 'Descargar desde el sitio web oficial.',
|
||||
mandatoryCopy: 'Copiar enlace de descarga',
|
||||
mandatoryPageFailed: 'No se pudo abrir la página de descarga oficial. Copie el enlace y ábralo en su navegador.',
|
||||
mandatoryViewDownload: 'Abrir página de descarga',
|
||||
mandatoryViewPageFailed: 'No se pudo abrir la página de descarga. Por favor inténtalo de nuevo.',
|
||||
mandatoryActionFailed: 'La acción fracasó. Por favor inténtalo de nuevo. Puede utilizar la aplicación nuevamente una vez completada la actualización.',
|
||||
mandatoryReady: 'Actualización lista',
|
||||
mandatoryVersion: 'Nueva versión: {version}',
|
||||
mandatoryReadyDetail: 'La aplicación se cerrará durante la actualización y se volverá a abrir automáticamente cuando se complete.',
|
||||
mandatoryDeferred: 'Las tareas en curso seguirán ejecutándose. Complete la actualización antes de volver a utilizar la aplicación.',
|
||||
mandatoryContinue: 'Continuar actualizando',
|
||||
mandatoryInspecting: 'Comprobando tareas...',
|
||||
mandatoryStopping: 'Deteniendo tareas…',
|
||||
mandatoryRestarting: 'La aplicación se reiniciará en breve. Espere por favor.',
|
||||
mandatoryDownloadFailed: 'Los archivos de actualización no se pudieron descargar ni preparar. Vuelva a intentarlo.',
|
||||
mandatoryInstallFailed: 'La actualización no se ha instalado. Verifique las tareas nuevamente y vuelva a intentarlo.',
|
||||
mandatoryOpenHelp: '¿La página no se abrió?',
|
||||
mandatoryReopen: 'Abre la página de descarga oficial nuevamente.',
|
||||
mandatoryCopied: 'Enlace copiado',
|
||||
mandatoryCopyFailed: 'No se pudo copiar el enlace. Selecciónelo y cópielo a continuación.',
|
||||
mandatoryAddress: 'Enlace de descarga',
|
||||
mandatoryNotification: 'Regrese a la aplicación para confirmar la instalación y reiniciar.',
|
||||
} satisfies DesktopMessages
|
||||
|
||||
/** French dictionary, checked against the English keys. */
|
||||
export const fr = {
|
||||
cliCommandMenu: 'Gérer la commande dsh…',
|
||||
cliCommandTitle: 'Gérer la commande dsh',
|
||||
cliCommandLocation: 'Commande de bureau : {path}',
|
||||
cliCommandSelected: 'Commande dsh actuelle : {path}',
|
||||
cliCommandTarget: 'Cible actuelle du lanceur : {path}',
|
||||
cliCommandShadowed: 'Un autre dsh est prioritaire. Supprimez ou réorganisez cette installation pour utiliser la commande Bureau par défaut. Vous pouvez également exécuter la commande Desktop par son chemin complet.',
|
||||
cliCommandSelectionUnknown: "Votre commande shell n'a pas pu être vérifiée. Un alias ou une autre installation dsh peut être prioritaire.",
|
||||
cliCommandInstalled: 'La commande Bureau est installée.',
|
||||
cliCommandNotInstalled: 'Ajoutez la commande Bureau à votre terminal.',
|
||||
cliCommandBroken: 'La commande Bureau doit être réparée.',
|
||||
cliCommandInstall: 'Installer',
|
||||
cliCommandRepair: 'Réparation',
|
||||
cliCommandRemove: 'Supprimer',
|
||||
cliCommandClose: 'Fermer',
|
||||
cliCommandSwitch: 'Continuer avec la commande Bureau ?',
|
||||
cliCommandPreserve: 'Une commande existante sera conservée. Les autres installations et fichiers de démarrage du shell ne seront pas modifiés.',
|
||||
cliCommandContinue: 'Continuer',
|
||||
cliCommandInstallApp: 'Installez Desktop dans votre dossier Applications avant de gérer la commande dsh.',
|
||||
cliCommandUpdating: "Une mise à jour est en cours d'installation. Gérez la commande une fois l'installation terminée.",
|
||||
cliCommandNewTerminal: 'Ouvrez un nouveau terminal et exécutez dsh --version.',
|
||||
cliCommandRemoved: 'Enregistrement des commandes de bureau supprimé.',
|
||||
cliCommandPreviousRestored: 'Le lanceur précédent a été restauré.',
|
||||
cliCommandOtherKept: "D'autres installations de commandement ont été laissées en place.",
|
||||
cliCommandBackupKept: 'Un lanceur précédent est conservé à : {path}',
|
||||
cliCommandChanged: "La commande ou PATH a changé pendant que cette boîte de dialogue était ouverte. Ouvrez à nouveau la commande Gérer dsh pour vérifier l'état actuel.",
|
||||
cliCommandOwnershipError: "L'enregistrement ou la sauvegarde de la commande a été modifiée. Aucune commande sans rapport n'a été supprimée.",
|
||||
cliCommandFailed: "La commande n'a pas pu être mise à jour. Vérifiez que l'application est installée et que la destination est accessible en écriture, puis réessayez.",
|
||||
application: 'Demande',
|
||||
fileMenu: 'Fichier',
|
||||
closePage: 'Fermer la page ou la fenêtre',
|
||||
aboutMenu: 'À propos de DeepSeek Harness',
|
||||
aboutProduct: 'DeepSeek Harness',
|
||||
aboutVersion: 'VersionV{version}',
|
||||
hideApplication: 'Masquer DeepSeek Harness',
|
||||
hideOtherApplications: 'Masquer les autres',
|
||||
showAllApplications: 'Afficher tout',
|
||||
quitApplication: 'Quitter DeepSeek Harness',
|
||||
openApplication: 'Ouvrir DeepSeek Harness',
|
||||
quit: 'Quitter',
|
||||
cancel: 'Annuler',
|
||||
quitTitle: 'Quitter DeepSeek Harness ?',
|
||||
quitActiveTasks: 'Les tâches en cours seront interrompues.',
|
||||
quitScheduledTasks: "Les tâches planifiées ne s'exécuteront pas lorsque l'application est fermée.",
|
||||
quitActiveAndScheduledTasks: "Les tâches en cours d'exécution seront interrompues et les tâches planifiées ne s'exécuteront pas tant que l'application sera fermée.",
|
||||
backgroundNoticeBody: "Les tâches en cours continueront. Vous pouvez rouvrir la fenêtre à partir de la barre d'état système.",
|
||||
backgroundNoticeConfirm: 'Confirmer',
|
||||
edit: 'Modifier',
|
||||
menuBar: 'Menu des applications',
|
||||
delete: 'Supprimer',
|
||||
undo: 'Annuler',
|
||||
redo: 'Refaire',
|
||||
cut: 'Couper',
|
||||
copy: 'Copier',
|
||||
paste: 'Coller',
|
||||
selectAll: 'Sélectionner tout',
|
||||
startupFailed: "DeepSeek Harness n'est pas disponible",
|
||||
fatalSummary: "L'application n'a pas pu démarrer ou s'est arrêtée de manière inattendue.",
|
||||
startupAddressInUse: "Une autre instance DSH (telle que le Web dsh ou l'application de bureau) est en cours d'exécution. Ils ne peuvent pas démarrer en même temps. Quittez l'autre instance DSH en cours d'exécution, puis redémarrez.",
|
||||
diagnosticTruncated: '… Détails de l’erreur raccourcis.',
|
||||
reportWrittenTo: 'Rapport de diagnostic : {path}',
|
||||
startupReinstallAdvice: "Si les fichiers de l'application sont manquants ou endommagés, fermez l'application et réinstallez-la. Vos tâches sont stockées séparément.",
|
||||
exitApplication: 'Quitter',
|
||||
restartApplication: 'Redémarrer',
|
||||
recoveryOperationFailed: "L'opération de récupération a échoué",
|
||||
disableThirdPartyPlugins: 'Désactivez les plugins tiers, sauvegardez le correctif de profil et redémarrez',
|
||||
welcomeTitle: 'DeepSeek Harness',
|
||||
welcomeBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineBefore: 'Bienvenue à ',
|
||||
welcomeTaglineBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineAfter: '',
|
||||
welcomeDescription: "Développer le potentiel. Explorez l'intelligence.",
|
||||
welcomeAuthStarting: 'Ouverture de la connexion…',
|
||||
welcomeAuthWaiting: "Le navigateur ne s'est pas ouvert automatiquement ?",
|
||||
welcomeAuthWaitingDescription: 'Copiez le lien de connexion et ouvrez-le dans votre navigateur pour vous connecter.',
|
||||
welcomeAuthExchanging: 'Connexion terminée…',
|
||||
welcomeAuthExpired: 'La connexion a expiré',
|
||||
welcomeAuthExpiredDescription: 'Connectez-vous à nouveau pour continuer',
|
||||
welcomeAuthFailed: 'Impossible de terminer la connexion. Veuillez réessayer.',
|
||||
welcomeAuthCopyLink: 'Copier le lien de connexion',
|
||||
welcomeAuthCopied: 'Copié',
|
||||
welcomeAuthCopyFailed: 'Impossible de copier. Essayer à nouveau.',
|
||||
welcomeAuthCancel: 'Annuler',
|
||||
welcomeAuthRetry: 'Connectez-vous à nouveau',
|
||||
welcomeSignIn: 'Connectez-vous',
|
||||
welcomeApiKey: 'Ajouter une clé API',
|
||||
welcomeKeyTitle: 'Ajoutez une clé API pour commencer',
|
||||
welcomeKeyDescription: 'Configurez les modèles DeepSeek officiels pour commencer à utiliser Harness',
|
||||
welcomeKeyPlaceholder: 'Entrez la clé API',
|
||||
welcomeKeySave: 'Enregistrer et continuer',
|
||||
welcomeKeyLater: 'Configurer plus tard',
|
||||
welcomeKeyBack: 'Retour pour vous connecter',
|
||||
welcomeSessionExpired: 'Vous vous êtes déconnecté de votre compte, veuillez vous reconnecter.',
|
||||
welcomeKeyBlank: 'Entrez une clé API.',
|
||||
welcomeKeyInvalid: "Entrez la clé API elle-même, sans guillemets, espaces ni affectation de variable d'environnement.",
|
||||
welcomeKeyFailed: "Impossible d'enregistrer la clé API. Veuillez réessayer.",
|
||||
welcomeContinueFailed: "Impossible d'ouvrir l'espace de travail. Veuillez réessayer.",
|
||||
checkUpdatesMenu: 'Vérifiez les mises à jour…',
|
||||
reloadPageMenu: 'Recharger la page',
|
||||
restartAppHostMenu: "Redémarrez l'application et l'hôte",
|
||||
updateCheckFailedTitle: 'Échec de la vérification de la mise à jour',
|
||||
updateCheckFailed: 'Impossible de vérifier les mises à jour. Veuillez réessayer plus tard.',
|
||||
updateDownloadFailed: 'Impossible de télécharger la mise à jour. Veuillez réessayer.',
|
||||
updateInstallFailed: "Impossible d'installer la mise à jour. Veuillez réessayer plus tard.",
|
||||
updateCheckNetworkFailed: 'Impossible de vérifier les mises à jour. Vérifiez votre connexion et réessayez.',
|
||||
updateDownloadNetworkFailed: 'Impossible de télécharger la mise à jour. Vérifiez votre connexion et réessayez.',
|
||||
updateInstallNetworkFailed: "Impossible d'installer la mise à jour. Vérifiez votre connexion et réessayez.",
|
||||
unknownError: 'Erreur inconnue',
|
||||
updateCheckTitle: 'Vérifier les mises à jour',
|
||||
updateCurrentDetail: 'Version actuelle : {version}',
|
||||
updateCurrent: 'Vous êtes à jour !',
|
||||
updateChecking: 'Vérification des mises à jour…',
|
||||
updateDownload: 'Télécharger la mise à jour',
|
||||
updateDownloadedTitle: 'La version {version} est prête à installer',
|
||||
updateDownloadedDetail: "L'application se fermera pendant la mise à jour et rouvrira automatiquement une fois celle-ci terminée.",
|
||||
updateDownloadedDetailWindows: "L'application se fermera temporairement pendant la mise à jour et rouvrira automatiquement une fois celle-ci terminée.\n\nLa mise à jour peut prendre un certain temps. Veuillez patienter et ne pas relancer l'application pendant l'installation.",
|
||||
updateClose: 'Fermer',
|
||||
updateAcknowledge: 'OK',
|
||||
updateLater: 'Mettre à jour plus tard',
|
||||
updateDownloading: 'Téléchargement de {percent}%…',
|
||||
updateVerifying: 'Vérification des fichiers de mise à jour…',
|
||||
updateInstalling: 'Préparation du redémarrage…',
|
||||
updateRetry: 'Réessayez la mise à jour',
|
||||
updateActiveTasks: 'Les tâches sont toujours en cours',
|
||||
updateActiveTasksDetail: "La mise à jour arrêtera les tâches en cours et redémarrera l'application. Continuer?",
|
||||
updateStopTasks: 'Arrêter les tâches et mettre à jour',
|
||||
updateTasksChanged: 'De nouvelles tâches ont commencé. Confirmez à nouveau pour arrêter les tâches et mettre à jour.',
|
||||
updateTasksUnavailable: "L'état de la tâche n'est pas disponible. Essayez à nouveau de mettre à jour lorsque l'espace de travail est prêt.",
|
||||
updateFullscreenTimeout: 'Impossible de quitter le mode plein écran. Quittez le mode plein écran, puis réessayez la mise à jour.',
|
||||
updateStopFailed: "Impossible d'arrêter les tâches en toute sécurité. La mise à jour n'a pas été installée. Veuillez réessayer plus tard.",
|
||||
updateTechnicalDetails: 'Voir les détails techniques',
|
||||
updateTitle: 'Mise à jour DeepSeek Harness',
|
||||
updateAvailable: 'Nouvelle version disponible : {version}',
|
||||
updateDetail: "Une fois le téléchargement terminé, vous pouvez installer la mise à jour et redémarrer l'application.",
|
||||
installAndRestart: 'Installer et redémarrer',
|
||||
later: 'Plus tard',
|
||||
updateFailedTitle: 'Échec de la mise à jour',
|
||||
mandatoryTitle: 'Mettre à jour pour continuer',
|
||||
mandatoryDetail: "Cette version n'est plus prise en charge. Mettez à jour pour continuer. Les tâches en cours continueront à s'exécuter jusqu'à ce que vous confirmiez l'installation et redémarriez.",
|
||||
mandatoryUnavailable: 'Impossible de vérifier les exigences de mise à jour. Veuillez réessayer plus tard.',
|
||||
policyLoginTitle: "Connectez-vous à l'environnement de test",
|
||||
policyLoginRequired: 'Connectez-vous avec Feishu pour vérifier les exigences de mise à jour pour cette version de test. La connexion ne téléchargera ni n’installera de mise à jour.',
|
||||
policyLogin: 'Connectez-vous avec Feishu',
|
||||
policyLoginFailed: 'La connexion à Feishu n’a pas abouti. Veuillez réessayer.',
|
||||
policyLoginLoading: 'Chargement de la page de connexion…',
|
||||
mandatoryNoRelease: "Aucune mise à jour compatible n'a été trouvée. Vérifiez à nouveau ou contactez l'assistance.",
|
||||
mandatoryRefresh: 'Vérifiez à nouveau',
|
||||
mandatoryPage: 'Télécharger depuis le site officiel',
|
||||
mandatoryCopy: 'Copier le lien de téléchargement',
|
||||
mandatoryPageFailed: "Impossible d'ouvrir la page de téléchargement officielle. Copiez le lien et ouvrez-le dans votre navigateur.",
|
||||
mandatoryViewDownload: 'Ouvrir la page de téléchargement',
|
||||
mandatoryViewPageFailed: "Impossible d'ouvrir la page de téléchargement. Veuillez réessayer.",
|
||||
mandatoryActionFailed: "L'action a échoué. Veuillez réessayer. Vous pourrez réutiliser l'application une fois la mise à jour terminée.",
|
||||
mandatoryReady: 'Mise à jour prête',
|
||||
mandatoryVersion: 'Nouvelle version : {version}',
|
||||
mandatoryReadyDetail: "L'application se fermera pendant la mise à jour et rouvrira automatiquement une fois celle-ci terminée.",
|
||||
mandatoryDeferred: "Les tâches en cours continueront à s'exécuter. Terminez la mise à jour avant d'utiliser à nouveau l'application.",
|
||||
mandatoryContinue: 'Continuer la mise à jour',
|
||||
mandatoryInspecting: 'Vérification des tâches…',
|
||||
mandatoryStopping: 'Arrêt des tâches…',
|
||||
mandatoryRestarting: "L'application redémarrera sous peu. S'il vous plaît, attendez.",
|
||||
mandatoryDownloadFailed: "Les fichiers de mise à jour n'ont pas pu être téléchargés ou préparés. Veuillez réessayer.",
|
||||
mandatoryInstallFailed: "La mise à jour n'a pas été installée. Vérifiez à nouveau les tâches et réessayez.",
|
||||
mandatoryOpenHelp: "La page ne s'est pas ouverte ?",
|
||||
mandatoryReopen: 'Ouvrez à nouveau la page de téléchargement officielle',
|
||||
mandatoryCopied: 'Lien copié',
|
||||
mandatoryCopyFailed: 'Impossible de copier le lien. Sélectionnez-le et copiez-le ci-dessous.',
|
||||
mandatoryAddress: 'Lien de téléchargement',
|
||||
mandatoryNotification: "Revenez à l'application pour confirmer l'installation et redémarrer.",
|
||||
} satisfies DesktopMessages
|
||||
|
||||
/** German dictionary, checked against the English keys. */
|
||||
export const de = {
|
||||
cliCommandMenu: 'dsh-Befehl verwalten…',
|
||||
cliCommandTitle: 'Verwalten Sie den dsh-Befehl',
|
||||
cliCommandLocation: 'Desktop-Befehl: {path}',
|
||||
cliCommandSelected: 'Aktueller dsh-Befehl: {path}',
|
||||
cliCommandTarget: 'Aktuelles Launcher-Ziel: {path}',
|
||||
cliCommandShadowed: 'Ein anderer dsh hat Vorrang. Entfernen Sie diese Installation oder ordnen Sie sie neu an, um standardmäßig den Desktop-Befehl zu verwenden. Sie können den Desktop-Befehl auch über seinen vollständigen Pfad ausführen.',
|
||||
cliCommandSelectionUnknown: 'Ihr Shell-Befehl konnte nicht überprüft werden. Ein Alias oder eine andere dsh-Installation kann Vorrang haben.',
|
||||
cliCommandInstalled: 'Der Desktop-Befehl ist installiert.',
|
||||
cliCommandNotInstalled: 'Fügen Sie den Desktop-Befehl zu Ihrem Terminal hinzu.',
|
||||
cliCommandBroken: 'Der Desktop-Befehl muss repariert werden.',
|
||||
cliCommandInstall: 'Installieren',
|
||||
cliCommandRepair: 'Reparieren',
|
||||
cliCommandRemove: 'Entfernen',
|
||||
cliCommandClose: 'Schließen',
|
||||
cliCommandSwitch: 'Mit dem Desktop-Befehl fortfahren?',
|
||||
cliCommandPreserve: 'Ein vorhandener Befehl bleibt erhalten. Andere Installationen und Shell-Startdateien werden nicht geändert.',
|
||||
cliCommandContinue: 'Weiter',
|
||||
cliCommandInstallApp: 'Installieren Sie Desktop in Ihrem Anwendungsordner, bevor Sie den Befehl dsh verwalten.',
|
||||
cliCommandUpdating: 'Ein Update wird installiert. Verwalten Sie den Befehl nach Abschluss der Installation.',
|
||||
cliCommandNewTerminal: 'Öffnen Sie ein neues Terminal und führen Sie dsh --version aus.',
|
||||
cliCommandRemoved: 'Desktop-Befehlsregistrierung entfernt.',
|
||||
cliCommandPreviousRestored: 'Der vorherige Launcher wurde wiederhergestellt.',
|
||||
cliCommandOtherKept: 'Andere Befehlsinstallationen wurden beibehalten.',
|
||||
cliCommandBackupKept: 'Ein früherer Launcher ist unter folgender Adresse erhalten: {path}',
|
||||
cliCommandChanged: 'Der Befehl oder PATH hat sich geändert, während dieses Dialogfeld geöffnet war. Öffnen Sie den Befehl „dsh verwalten“ erneut, um den aktuellen Status zu überprüfen.',
|
||||
cliCommandOwnershipError: 'Die Befehlsregistrierung oder Sicherung wurde geändert. Es wurde kein nicht verwandter Befehl entfernt.',
|
||||
cliCommandFailed: 'Der Befehl konnte nicht aktualisiert werden. Überprüfen Sie, ob die Anwendung installiert ist und das Ziel beschreibbar ist, und versuchen Sie es dann erneut.',
|
||||
application: 'Bewerbung',
|
||||
fileMenu: 'Datei',
|
||||
closePage: 'Seite oder Fenster schließen',
|
||||
aboutMenu: 'Über DeepSeek Harness',
|
||||
aboutProduct: 'DeepSeek Harness',
|
||||
aboutVersion: 'Version V{version}',
|
||||
hideApplication: 'DeepSeek Harness ausblenden',
|
||||
hideOtherApplications: 'Andere ausblenden',
|
||||
showAllApplications: 'Alle anzeigen',
|
||||
quitApplication: 'Beenden Sie DeepSeek Harness',
|
||||
openApplication: 'Öffnen Sie DeepSeek Harness',
|
||||
quit: 'Hör auf',
|
||||
cancel: 'Abbrechen',
|
||||
quitTitle: 'DeepSeek Harness beenden?',
|
||||
quitActiveTasks: 'Laufende Aufgaben werden unterbrochen.',
|
||||
quitScheduledTasks: 'Geplante Aufgaben werden nicht ausgeführt, während die App geschlossen ist.',
|
||||
quitActiveAndScheduledTasks: 'Laufende Aufgaben werden unterbrochen und geplante Aufgaben werden nicht ausgeführt, während die App geschlossen ist.',
|
||||
backgroundNoticeBody: 'Laufende Aufgaben werden fortgesetzt. Sie können das Fenster über die Taskleiste erneut öffnen.',
|
||||
backgroundNoticeConfirm: 'Bestätigen',
|
||||
edit: 'Bearbeiten',
|
||||
menuBar: 'Anwendungsmenü',
|
||||
delete: 'Löschen',
|
||||
undo: 'Rückgängig machen',
|
||||
redo: 'Wiederholen',
|
||||
cut: 'Schneiden',
|
||||
copy: 'Kopieren',
|
||||
paste: 'Einfügen',
|
||||
selectAll: 'Wählen Sie „Alle“ aus',
|
||||
startupFailed: 'DeepSeek Harness ist nicht verfügbar',
|
||||
fatalSummary: 'Die Anwendung konnte nicht gestartet werden oder wurde unerwartet gestoppt.',
|
||||
startupAddressInUse: 'Eine andere DSH-Instanz (z. B. dsh Web oder die Desktop-App) wird ausgeführt. Sie können nicht gleichzeitig starten. Beenden Sie die andere laufende DSH-Instanz und starten Sie sie neu.',
|
||||
diagnosticTruncated: '… Fehlerdetails gekürzt.',
|
||||
reportWrittenTo: 'Diagnosebericht: {path}',
|
||||
startupReinstallAdvice: 'Wenn Anwendungsdateien fehlen oder beschädigt sind, schließen Sie die Anwendung und installieren Sie sie erneut. Ihre Aufgaben werden separat gespeichert.',
|
||||
exitApplication: 'Ausstieg',
|
||||
restartApplication: 'Neustart',
|
||||
recoveryOperationFailed: 'Der Wiederherstellungsvorgang ist fehlgeschlagen',
|
||||
disableThirdPartyPlugins: 'Deaktivieren Sie Plugins von Drittanbietern, sichern Sie den Profil-Patch und starten Sie neu',
|
||||
welcomeTitle: 'DeepSeek Harness',
|
||||
welcomeBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineBefore: 'Willkommen bei ',
|
||||
welcomeTaglineBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineAfter: '',
|
||||
welcomeDescription: 'Potenzial aufbauen. Entdecken Sie Intelligenz.',
|
||||
welcomeAuthStarting: 'Eröffnungsanmeldung…',
|
||||
welcomeAuthWaiting: 'Browser wurde nicht automatisch geöffnet?',
|
||||
welcomeAuthWaitingDescription: 'Kopieren Sie den Anmeldelink und öffnen Sie ihn in Ihrem Browser, um sich anzumelden.',
|
||||
welcomeAuthExchanging: 'Anmeldung wird abgeschlossen…',
|
||||
welcomeAuthExpired: 'Zeitüberschreitung bei der Anmeldung',
|
||||
welcomeAuthExpiredDescription: 'Melden Sie sich erneut an, um fortzufahren',
|
||||
welcomeAuthFailed: 'Die Anmeldung konnte nicht abgeschlossen werden. Bitte versuchen Sie es erneut.',
|
||||
welcomeAuthCopyLink: 'Anmeldelink kopieren',
|
||||
welcomeAuthCopied: 'Kopiert',
|
||||
welcomeAuthCopyFailed: 'Konnte nicht kopiert werden. Versuchen Sie es erneut.',
|
||||
welcomeAuthCancel: 'Abbrechen',
|
||||
welcomeAuthRetry: 'Melden Sie sich erneut an',
|
||||
welcomeSignIn: 'Melden Sie sich an',
|
||||
welcomeApiKey: 'Fügen Sie den API-Schlüssel hinzu',
|
||||
welcomeKeyTitle: 'Fügen Sie einen API-Schlüssel hinzu, um loszulegen',
|
||||
welcomeKeyDescription: 'Konfigurieren Sie offizielle DeepSeek-Modelle für die Verwendung von Harness',
|
||||
welcomeKeyPlaceholder: 'Geben Sie den Schlüssel API ein',
|
||||
welcomeKeySave: 'Speichern und fortfahren',
|
||||
welcomeKeyLater: 'Später einrichten',
|
||||
welcomeKeyBack: 'Zurück zur Anmeldung',
|
||||
welcomeSessionExpired: 'Sie haben sich von Ihrem Konto abgemeldet. Bitte melden Sie sich erneut an.',
|
||||
welcomeKeyBlank: 'Geben Sie einen API-Schlüssel ein.',
|
||||
welcomeKeyInvalid: 'Geben Sie den API-Schlüssel selbst ein, ohne Anführungszeichen, Leerzeichen oder eine Umgebungsvariablenzuweisung.',
|
||||
welcomeKeyFailed: 'Der Schlüssel API konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.',
|
||||
welcomeContinueFailed: 'Der Arbeitsbereich konnte nicht geöffnet werden. Bitte versuchen Sie es erneut.',
|
||||
checkUpdatesMenu: 'Nach Updates suchen…',
|
||||
reloadPageMenu: 'Seite neu laden',
|
||||
restartAppHostMenu: 'Starten Sie App und Host neu',
|
||||
updateCheckFailedTitle: 'Update-Überprüfung fehlgeschlagen',
|
||||
updateCheckFailed: 'Es konnte nicht nach Updates gesucht werden. Bitte versuchen Sie es später noch einmal.',
|
||||
updateDownloadFailed: 'Das Update konnte nicht heruntergeladen werden. Bitte versuchen Sie es erneut.',
|
||||
updateInstallFailed: 'Das Update konnte nicht installiert werden. Bitte versuchen Sie es später noch einmal.',
|
||||
updateCheckNetworkFailed: 'Es konnte nicht nach Updates gesucht werden. Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.',
|
||||
updateDownloadNetworkFailed: 'Das Update konnte nicht heruntergeladen werden. Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.',
|
||||
updateInstallNetworkFailed: 'Das Update konnte nicht installiert werden. Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.',
|
||||
unknownError: 'Unbekannter Fehler',
|
||||
updateCheckTitle: 'Suchen Sie nach Updates',
|
||||
updateCurrentDetail: 'Aktuelle Version: {version}',
|
||||
updateCurrent: 'Du bist auf dem Laufenden!',
|
||||
updateChecking: 'Suche nach Updates…',
|
||||
updateDownload: 'Update herunterladen',
|
||||
updateDownloadedTitle: 'Die Version {version} ist zur Installation bereit',
|
||||
updateDownloadedDetail: 'Die App wird während des Updates geschlossen und nach Abschluss automatisch wieder geöffnet.',
|
||||
updateDownloadedDetailWindows: 'Die App wird während des Updates vorübergehend geschlossen und nach Abschluss automatisch wieder geöffnet.\n\nDas Update kann einige Zeit dauern. Bitte warten Sie und starten Sie die App während der Installation nicht erneut.',
|
||||
updateClose: 'Schließen',
|
||||
updateAcknowledge: 'OK',
|
||||
updateLater: 'Später aktualisieren',
|
||||
updateDownloading: '{percent}% wird heruntergeladen…',
|
||||
updateVerifying: 'Aktualisierungsdateien werden überprüft…',
|
||||
updateInstalling: 'Neustart wird vorbereitet…',
|
||||
updateRetry: 'Update erneut versuchen',
|
||||
updateActiveTasks: 'Aufgaben sind noch in Bearbeitung',
|
||||
updateActiveTasksDetail: 'Durch die Aktualisierung werden die laufenden Aufgaben gestoppt und die App neu gestartet. Weitermachen?',
|
||||
updateStopTasks: 'Stoppen Sie Aufgaben und aktualisieren Sie sie',
|
||||
updateTasksChanged: 'Neue Aufgaben haben begonnen. Bestätigen Sie erneut, um die Aufgaben zu stoppen und zu aktualisieren.',
|
||||
updateTasksUnavailable: 'Der Aufgabenstatus ist nicht verfügbar. Versuchen Sie erneut, die Aktualisierung durchzuführen, wenn der Arbeitsbereich bereit ist.',
|
||||
updateFullscreenTimeout: 'Der Vollbildmodus konnte nicht beendet werden. Beenden Sie den Vollbildmodus und versuchen Sie dann erneut, das Update durchzuführen.',
|
||||
updateStopFailed: 'Die Aufgaben konnten nicht sicher gestoppt werden. Das Update wurde nicht installiert. Bitte versuchen Sie es später noch einmal.',
|
||||
updateTechnicalDetails: 'Technische Details anzeigen',
|
||||
updateTitle: 'DeepSeek Harness-Update',
|
||||
updateAvailable: 'Neue Version verfügbar: {version}',
|
||||
updateDetail: 'Sobald der Download abgeschlossen ist, können Sie das Update installieren und die App neu starten.',
|
||||
installAndRestart: 'Installieren und neu starten',
|
||||
later: 'Später',
|
||||
updateFailedTitle: 'Aktualisierung fehlgeschlagen',
|
||||
mandatoryTitle: 'Aktualisieren, um fortzufahren',
|
||||
mandatoryDetail: 'Diese Version wird nicht mehr unterstützt. Aktualisieren, um fortzufahren. Laufende Aufgaben werden so lange ausgeführt, bis Sie die Installation bestätigen und neu starten.',
|
||||
mandatoryUnavailable: 'Update-Anforderungen konnten nicht überprüft werden. Bitte versuchen Sie es später noch einmal.',
|
||||
policyLoginTitle: 'Melden Sie sich bei der Testumgebung an',
|
||||
policyLoginRequired: 'Melden Sie sich bei Feishu an, um die Update-Anforderungen für diesen Test-Build zu prüfen. Durch die Anmeldung wird kein Update heruntergeladen oder installiert.',
|
||||
policyLogin: 'Melden Sie sich mit Feishu an',
|
||||
policyLoginFailed: 'Die Feishu-Anmeldung wurde nicht abgeschlossen. Bitte versuchen Sie es erneut.',
|
||||
policyLoginLoading: 'Anmeldeseite wird geladen…',
|
||||
mandatoryNoRelease: 'Es wurde kein kompatibles Update gefunden. Überprüfen Sie es erneut oder wenden Sie sich an den Support.',
|
||||
mandatoryRefresh: 'Überprüfen Sie es noch einmal',
|
||||
mandatoryPage: 'Von der offiziellen Website herunterladen',
|
||||
mandatoryCopy: 'Download-Link kopieren',
|
||||
mandatoryPageFailed: 'Die offizielle Download-Seite konnte nicht geöffnet werden. Kopieren Sie den Link und öffnen Sie ihn in Ihrem Browser.',
|
||||
mandatoryViewDownload: 'Download-Seite öffnen',
|
||||
mandatoryViewPageFailed: 'Die Download-Seite konnte nicht geöffnet werden. Bitte versuchen Sie es erneut.',
|
||||
mandatoryActionFailed: 'Die Aktion ist fehlgeschlagen. Bitte versuchen Sie es erneut. Nach Abschluss des Updates können Sie die App wieder verwenden.',
|
||||
mandatoryReady: 'Update bereit',
|
||||
mandatoryVersion: 'Neue Version: {version}',
|
||||
mandatoryReadyDetail: 'Die App wird während des Updates geschlossen und nach Abschluss automatisch wieder geöffnet.',
|
||||
mandatoryDeferred: 'Laufende Aufgaben werden weiterhin ausgeführt. Schließen Sie das Update ab, bevor Sie die App erneut verwenden.',
|
||||
mandatoryContinue: 'Weiter aktualisieren',
|
||||
mandatoryInspecting: 'Aufgaben prüfen…',
|
||||
mandatoryStopping: 'Aufgaben stoppen…',
|
||||
mandatoryRestarting: 'Die App wird in Kürze neu gestartet. Bitte warten.',
|
||||
mandatoryDownloadFailed: 'Die Update-Dateien konnten nicht heruntergeladen oder vorbereitet werden. Bitte versuchen Sie es erneut.',
|
||||
mandatoryInstallFailed: 'Das Update wurde nicht installiert. Überprüfen Sie die Aufgaben erneut und versuchen Sie es erneut.',
|
||||
mandatoryOpenHelp: 'Seite wurde nicht geöffnet?',
|
||||
mandatoryReopen: 'Öffnen Sie die offizielle Download-Seite erneut',
|
||||
mandatoryCopied: 'Link kopiert',
|
||||
mandatoryCopyFailed: 'Der Link konnte nicht kopiert werden. Wählen Sie es aus und kopieren Sie es unten.',
|
||||
mandatoryAddress: 'Download-Link',
|
||||
mandatoryNotification: 'Kehren Sie zur Anwendung zurück, um die Installation zu bestätigen und neu zu starten.',
|
||||
} satisfies DesktopMessages
|
||||
|
||||
/** Russian dictionary, checked against the English keys. */
|
||||
export const ru = {
|
||||
cliCommandMenu: 'Управление командой dsh…',
|
||||
cliCommandTitle: 'Управление командой dsh',
|
||||
cliCommandLocation: 'Команда рабочего стола: {path}',
|
||||
cliCommandSelected: 'Текущая команда dsh: {path}.',
|
||||
cliCommandTarget: 'Текущая цель лаунчера: {path}',
|
||||
cliCommandShadowed: 'Другой dsh имеет приоритет. Удалите или измените порядок установки, чтобы использовать команду «Рабочий стол» по умолчанию. Вы также можете запустить команду «Рабочий стол» по ее полному пути.',
|
||||
cliCommandSelectionUnknown: 'Не удалось проверить вашу команду оболочки. Псевдоним или другая установка dsh может иметь приоритет.',
|
||||
cliCommandInstalled: 'Команда «Рабочий стол» установлена.',
|
||||
cliCommandNotInstalled: 'Добавьте команду «Рабочий стол» в свой терминал.',
|
||||
cliCommandBroken: 'Команда Desktop требует ремонта.',
|
||||
cliCommandInstall: 'Установить',
|
||||
cliCommandRepair: 'Ремонт',
|
||||
cliCommandRemove: 'Удалить',
|
||||
cliCommandClose: 'Закрыть',
|
||||
cliCommandSwitch: 'Продолжить команду «Рабочий стол»?',
|
||||
cliCommandPreserve: 'Существующая команда будет сохранена. Другие установки и файлы запуска оболочки не будут изменены.',
|
||||
cliCommandContinue: 'Продолжить',
|
||||
cliCommandInstallApp: 'Установите Desktop в папку «Приложения», прежде чем управлять командой dsh.',
|
||||
cliCommandUpdating: 'Идет установка обновления. Управляйте командой после завершения установки.',
|
||||
cliCommandNewTerminal: 'Откройте новый терминал и запустите dsh --version.',
|
||||
cliCommandRemoved: 'Регистрация команд рабочего стола удалена.',
|
||||
cliCommandPreviousRestored: 'Предыдущий лаунчер восстановлен.',
|
||||
cliCommandOtherKept: 'Остальные командные установки остались на месте.',
|
||||
cliCommandBackupKept: 'Предыдущий лаунчер сохранился по адресу: {path}.',
|
||||
cliCommandChanged: 'Команда или PATH изменилась, пока это диалоговое окно было открыто. Откройте команду «Управление dsh» еще раз, чтобы просмотреть текущее состояние.',
|
||||
cliCommandOwnershipError: 'Регистрация команд или резервное копирование изменены. Ни одна несвязанная команда не была удалена.',
|
||||
cliCommandFailed: 'Не удалось обновить команду. Убедитесь, что приложение установлено и место назначения доступно для записи, затем повторите попытку.',
|
||||
application: 'Приложение',
|
||||
fileMenu: 'Файл',
|
||||
closePage: 'Закрыть страницу или окно',
|
||||
aboutMenu: 'О DeepSeek Harness',
|
||||
aboutProduct: 'DeepSeek Harness',
|
||||
aboutVersion: 'Версия V{version}',
|
||||
hideApplication: 'Скрыть DeepSeek Harness',
|
||||
hideOtherApplications: 'Скрыть других',
|
||||
showAllApplications: 'Показать все',
|
||||
quitApplication: 'Выйти из DeepSeek Harness',
|
||||
openApplication: 'Открыть DeepSeek Harness',
|
||||
quit: 'Выйти',
|
||||
cancel: 'Отмена',
|
||||
quitTitle: 'Выйти из DeepSeek Harness?',
|
||||
quitActiveTasks: 'Выполнение задач будет прервано.',
|
||||
quitScheduledTasks: 'Запланированные задачи не будут выполняться, пока приложение закрыто.',
|
||||
quitActiveAndScheduledTasks: 'Выполнение задач будет прервано, а запланированные задачи не будут выполняться, пока приложение закрыто.',
|
||||
backgroundNoticeBody: 'Выполнение задач продолжится. Вы можете снова открыть окно из системного трея.',
|
||||
backgroundNoticeConfirm: 'Подтвердить',
|
||||
edit: 'Редактировать',
|
||||
menuBar: 'Меню приложения',
|
||||
delete: 'Удалить',
|
||||
undo: 'Отменить',
|
||||
redo: 'Повторить',
|
||||
cut: 'Вырезать',
|
||||
copy: 'Копировать',
|
||||
paste: 'Вставить',
|
||||
selectAll: 'Выбрать все',
|
||||
startupFailed: 'DeepSeek Harness недоступен.',
|
||||
fatalSummary: 'Приложение не могло запуститься или неожиданно остановилось.',
|
||||
startupAddressInUse: 'Другой экземпляр DSH (например, веб-приложение dsh или настольное приложение) запущен. Они не могут начаться одновременно. Закройте другой работающий экземпляр DSH, а затем перезапустите.',
|
||||
diagnosticTruncated: '… Подробности об ошибках сокращены.',
|
||||
reportWrittenTo: 'Диагностический отчет: {path}',
|
||||
startupReinstallAdvice: 'Если файлы приложения отсутствуют или повреждены, закройте приложение и переустановите его. Ваши задачи хранятся отдельно.',
|
||||
exitApplication: 'Выход',
|
||||
restartApplication: 'Перезапустить',
|
||||
recoveryOperationFailed: 'Операция восстановления не удалась',
|
||||
disableThirdPartyPlugins: 'Отключите сторонние плагины, создайте резервную копию патча профиля и перезапустите.',
|
||||
welcomeTitle: 'DeepSeek Harness',
|
||||
welcomeBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineBefore: 'Добро пожаловать в ',
|
||||
welcomeTaglineBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineAfter: '',
|
||||
welcomeDescription: 'Развивайте потенциал. Исследуйте интеллект.',
|
||||
welcomeAuthStarting: 'Открытие входа в систему…',
|
||||
welcomeAuthWaiting: 'Браузер не открылся автоматически?',
|
||||
welcomeAuthWaitingDescription: 'Скопируйте ссылку для входа и откройте ее в браузере, чтобы войти.',
|
||||
welcomeAuthExchanging: 'Завершение входа…',
|
||||
welcomeAuthExpired: 'Время входа в систему истекло',
|
||||
welcomeAuthExpiredDescription: 'Войдите еще раз, чтобы продолжить',
|
||||
welcomeAuthFailed: 'Не удалось завершить вход. Повторите попытку.',
|
||||
welcomeAuthCopyLink: 'Скопировать ссылку для входа',
|
||||
welcomeAuthCopied: 'Скопировано',
|
||||
welcomeAuthCopyFailed: 'Не удалось скопировать. Попробуйте еще раз.',
|
||||
welcomeAuthCancel: 'Отмена',
|
||||
welcomeAuthRetry: 'Войдите снова',
|
||||
welcomeSignIn: 'Войти',
|
||||
welcomeApiKey: 'Добавить ключ API',
|
||||
welcomeKeyTitle: 'Добавьте ключ API, чтобы начать работу.',
|
||||
welcomeKeyDescription: 'Настройте официальные модели DeepSeek, чтобы начать использовать Harness.',
|
||||
welcomeKeyPlaceholder: 'Введите ключ API',
|
||||
welcomeKeySave: 'Сохранить и продолжить',
|
||||
welcomeKeyLater: 'Настроить позже',
|
||||
welcomeKeyBack: 'Вернуться для входа в систему',
|
||||
welcomeSessionExpired: 'Вы вышли из своей учетной записи, пожалуйста, войдите снова.',
|
||||
welcomeKeyBlank: 'Введите ключ API.',
|
||||
welcomeKeyInvalid: 'Введите сам ключ API без кавычек, пробелов и присвоения переменной среды.',
|
||||
welcomeKeyFailed: 'Не удалось сохранить ключ API. Пожалуйста, попробуйте еще раз.',
|
||||
welcomeContinueFailed: 'Не удалось открыть рабочую область. Пожалуйста, попробуйте еще раз.',
|
||||
checkUpdatesMenu: 'Проверить наличие обновлений…',
|
||||
reloadPageMenu: 'Обновить страницу',
|
||||
restartAppHostMenu: 'Перезапустите приложение и хост.',
|
||||
updateCheckFailedTitle: 'Проверка обновления не удалась',
|
||||
updateCheckFailed: 'Не удалось проверить наличие обновлений. Пожалуйста, повторите попытку позже.',
|
||||
updateDownloadFailed: 'Не удалось загрузить обновление. Пожалуйста, попробуйте еще раз.',
|
||||
updateInstallFailed: 'Не удалось установить обновление. Пожалуйста, повторите попытку позже.',
|
||||
updateCheckNetworkFailed: 'Не удалось проверить наличие обновлений. Проверьте подключение и повторите попытку.',
|
||||
updateDownloadNetworkFailed: 'Не удалось загрузить обновление. Проверьте подключение и повторите попытку.',
|
||||
updateInstallNetworkFailed: 'Не удалось установить обновление. Проверьте подключение и повторите попытку.',
|
||||
unknownError: 'Неизвестная ошибка',
|
||||
updateCheckTitle: 'Проверьте наличие обновлений',
|
||||
updateCurrentDetail: 'Текущая версия: {version}.',
|
||||
updateCurrent: 'Вы в курсе!',
|
||||
updateChecking: 'Проверка обновлений…',
|
||||
updateDownload: 'Скачать обновление',
|
||||
updateDownloadedTitle: 'Версия {version} готова к установке.',
|
||||
updateDownloadedDetail: 'Приложение закроется во время обновления и автоматически откроется после его завершения.',
|
||||
updateDownloadedDetailWindows: 'Приложение временно закроется во время обновления и автоматически откроется после его завершения.\n\nОбновление может занять некоторое время. Пожалуйста, подождите и не запускайте приложение снова во время установки.',
|
||||
updateClose: 'Закрыть',
|
||||
updateAcknowledge: 'OK',
|
||||
updateLater: 'Обновить позже',
|
||||
updateDownloading: 'Загрузка {percent}%…',
|
||||
updateVerifying: 'Проверка файлов обновлений…',
|
||||
updateInstalling: 'Подготовка к перезапуску…',
|
||||
updateRetry: 'Повторить обновление',
|
||||
updateActiveTasks: 'Задачи еще выполняются',
|
||||
updateActiveTasksDetail: 'Обновление остановит выполняемые задачи и перезапустит приложение. Продолжать?',
|
||||
updateStopTasks: 'Остановить задачи и обновить',
|
||||
updateTasksChanged: 'Начались новые задачи. Подтвердите еще раз, чтобы остановить выполнение задач и выполнить обновление.',
|
||||
updateTasksUnavailable: 'Статус задачи недоступен. Попробуйте обновить еще раз, когда рабочая область будет готова.',
|
||||
updateFullscreenTimeout: 'Не удалось выйти из полноэкранного режима. Выйдите из полноэкранного режима и повторите попытку обновления.',
|
||||
updateStopFailed: 'Не удалось безопасно остановить задачи. Обновление не установлено. Пожалуйста, повторите попытку позже.',
|
||||
updateTechnicalDetails: 'Посмотреть технические подробности',
|
||||
updateTitle: 'DeepSeek Harness Обновление',
|
||||
updateAvailable: 'Доступна новая версия: {version}.',
|
||||
updateDetail: 'После завершения загрузки вы можете установить обновление и перезапустить приложение.',
|
||||
installAndRestart: 'Установить и перезапустить',
|
||||
later: 'Позже',
|
||||
updateFailedTitle: 'Обновление не выполнено',
|
||||
mandatoryTitle: 'Обновите, чтобы продолжить',
|
||||
mandatoryDetail: 'Эта версия больше не поддерживается. Обновите, чтобы продолжить. Выполняемые задачи будут продолжать выполняться до тех пор, пока вы не подтвердите установку и не перезапустите.',
|
||||
mandatoryUnavailable: 'Не удалось проверить требования к обновлению. Пожалуйста, повторите попытку позже.',
|
||||
policyLoginTitle: 'Войдите в тестовую среду',
|
||||
policyLoginRequired: 'Войдите в систему с помощью Feishu, чтобы проверить требования к обновлению для этой тестовой сборки. При входе в систему обновление не загружается и не устанавливается.',
|
||||
policyLogin: 'Войти через Feishu',
|
||||
policyLoginFailed: 'Вход в Feishu не завершен. Пожалуйста, попробуйте еще раз.',
|
||||
policyLoginLoading: 'Загрузка страницы входа…',
|
||||
mandatoryNoRelease: 'Совместимое обновление не найдено. Проверьте еще раз или обратитесь в службу поддержки.',
|
||||
mandatoryRefresh: 'Проверьте еще раз',
|
||||
mandatoryPage: 'Скачать с официального сайта',
|
||||
mandatoryCopy: 'Скопировать ссылку для скачивания',
|
||||
mandatoryPageFailed: 'Не удалось открыть официальную страницу загрузки. Скопируйте ссылку и откройте ее в браузере.',
|
||||
mandatoryViewDownload: 'Открыть страницу загрузки',
|
||||
mandatoryViewPageFailed: 'Не удалось открыть страницу загрузки. Пожалуйста, попробуйте еще раз.',
|
||||
mandatoryActionFailed: 'Акция провалилась. Пожалуйста, попробуйте еще раз. Вы сможете снова использовать приложение после завершения обновления.',
|
||||
mandatoryReady: 'Обновление готово',
|
||||
mandatoryVersion: 'Новая версия: {version}',
|
||||
mandatoryReadyDetail: 'Приложение закроется во время обновления и автоматически откроется после его завершения.',
|
||||
mandatoryDeferred: 'Выполняемые задачи будут продолжать выполняться. Завершите обновление, прежде чем снова использовать приложение.',
|
||||
mandatoryContinue: 'Продолжить обновление',
|
||||
mandatoryInspecting: 'Проверка задач…',
|
||||
mandatoryStopping: 'Остановка задач…',
|
||||
mandatoryRestarting: 'Приложение вскоре перезапустится. Пожалуйста, подождите.',
|
||||
mandatoryDownloadFailed: 'Файлы обновления не удалось загрузить или подготовить. Пожалуйста, повторите попытку.',
|
||||
mandatoryInstallFailed: 'Обновление не установлено. Проверьте задачи еще раз и повторите попытку.',
|
||||
mandatoryOpenHelp: 'Страница не открылась?',
|
||||
mandatoryReopen: 'Откройте официальную страницу загрузки еще раз.',
|
||||
mandatoryCopied: 'Ссылка скопирована',
|
||||
mandatoryCopyFailed: 'Не удалось скопировать ссылку. Выделите и скопируйте его ниже.',
|
||||
mandatoryAddress: 'Ссылка для скачивания',
|
||||
mandatoryNotification: 'Вернитесь в приложение, чтобы подтвердить установку и перезапустить.',
|
||||
} satisfies DesktopMessages
|
||||
|
||||
/** Portuguese dictionary, checked against the English keys. */
|
||||
export const pt = {
|
||||
cliCommandMenu: 'Gerenciar comando dsh…',
|
||||
cliCommandTitle: 'Gerenciar comando dsh',
|
||||
cliCommandLocation: 'Comando da área de trabalho: {path}',
|
||||
cliCommandSelected: 'Comando dsh atual: {path}',
|
||||
cliCommandTarget: 'Alvo atual do iniciador: {path}',
|
||||
cliCommandShadowed: 'Outro dsh tem precedência. Remova ou reordene essa instalação para usar o comando Desktop por padrão. Você também pode executar o comando Desktop pelo caminho completo.',
|
||||
cliCommandSelectionUnknown: 'Seu comando shell não pôde ser verificado. Um alias ou outra instalação do dsh pode ter precedência.',
|
||||
cliCommandInstalled: 'O comando Desktop está instalado.',
|
||||
cliCommandNotInstalled: 'Adicione o comando Desktop ao seu terminal.',
|
||||
cliCommandBroken: 'O comando Desktop precisa de reparo.',
|
||||
cliCommandInstall: 'Instalar',
|
||||
cliCommandRepair: 'Reparar',
|
||||
cliCommandRemove: 'Remover',
|
||||
cliCommandClose: 'Fechar',
|
||||
cliCommandSwitch: 'Continuar com o comando Desktop?',
|
||||
cliCommandPreserve: 'Um comando existente será preservado. Outras instalações e arquivos de inicialização do shell não serão alterados.',
|
||||
cliCommandContinue: 'Continuar',
|
||||
cliCommandInstallApp: 'Instale o Desktop na pasta Aplicativos antes de gerenciar o comando dsh.',
|
||||
cliCommandUpdating: 'Uma atualização está sendo instalada. Gerencie o comando após a conclusão da instalação.',
|
||||
cliCommandNewTerminal: 'Abra um novo terminal e execute dsh --version.',
|
||||
cliCommandRemoved: 'Registro de comando da área de trabalho removido.',
|
||||
cliCommandPreviousRestored: 'O inicializador anterior foi restaurado.',
|
||||
cliCommandOtherKept: 'Outras instalações de comando foram mantidas.',
|
||||
cliCommandBackupKept: 'Um inicializador anterior é preservado em: {path}',
|
||||
cliCommandChanged: 'O comando ou PATH foi alterado enquanto esta caixa de diálogo estava aberta. Abra o comando Gerenciar dsh novamente para revisar o estado atual.',
|
||||
cliCommandOwnershipError: 'O registro ou backup do comando foi alterado. Nenhum comando não relacionado foi removido.',
|
||||
cliCommandFailed: 'O comando não pôde ser atualizado. Verifique se o aplicativo está instalado e se o destino é gravável e tente novamente.',
|
||||
application: 'Aplicação',
|
||||
fileMenu: 'Arquivo',
|
||||
closePage: 'Fechar página ou janela',
|
||||
aboutMenu: 'Sobre DeepSeek Harness',
|
||||
aboutProduct: 'DeepSeek Harness',
|
||||
aboutVersion: 'Versão V{version}',
|
||||
hideApplication: 'Ocultar DeepSeek Harness',
|
||||
hideOtherApplications: 'Ocultar outros',
|
||||
showAllApplications: 'Mostrar tudo',
|
||||
quitApplication: 'Sair de DeepSeek Harness',
|
||||
openApplication: 'Abra DeepSeek Harness',
|
||||
quit: 'Sair',
|
||||
cancel: 'Cancelar',
|
||||
quitTitle: 'Sair de DeepSeek Harness?',
|
||||
quitActiveTasks: 'As tarefas em execução serão interrompidas.',
|
||||
quitScheduledTasks: 'As tarefas agendadas não serão executadas enquanto o aplicativo estiver fechado.',
|
||||
quitActiveAndScheduledTasks: 'As tarefas em execução serão interrompidas e as tarefas agendadas não serão executadas enquanto o aplicativo estiver fechado.',
|
||||
backgroundNoticeBody: 'As tarefas em execução continuarão. Você pode reabrir a janela na bandeja do sistema.',
|
||||
backgroundNoticeConfirm: 'Confirmar',
|
||||
edit: 'Editar',
|
||||
menuBar: 'Menu de aplicativos',
|
||||
delete: 'Excluir',
|
||||
undo: 'Desfazer',
|
||||
redo: 'Refazer',
|
||||
cut: 'Cortar',
|
||||
copy: 'Copiar',
|
||||
paste: 'Colar',
|
||||
selectAll: 'Selecionar tudo',
|
||||
startupFailed: 'DeepSeek Harness não está disponível',
|
||||
fatalSummary: 'O aplicativo não pôde ser iniciado ou parou inesperadamente.',
|
||||
startupAddressInUse: 'Outra instância DSH (como dsh web ou aplicativo de desktop) está em execução. Eles não podem começar ao mesmo tempo. Saia da outra instância DSH em execução e reinicie.',
|
||||
diagnosticTruncated: '… Detalhes do erro reduzidos.',
|
||||
reportWrittenTo: 'Relatório de diagnóstico: {path}',
|
||||
startupReinstallAdvice: 'Se os arquivos do aplicativo estiverem ausentes ou danificados, feche o aplicativo e reinstale-o. Suas tarefas são armazenadas separadamente.',
|
||||
exitApplication: 'Sair',
|
||||
restartApplication: 'Reiniciar',
|
||||
recoveryOperationFailed: 'A operação de recuperação falhou',
|
||||
disableThirdPartyPlugins: 'Desative plug-ins de terceiros, faça backup do patch do perfil e reinicie',
|
||||
welcomeTitle: 'DeepSeek Harness',
|
||||
welcomeBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineBefore: 'Bem-vindo ao ',
|
||||
welcomeTaglineBrand: 'DeepSeek Harness',
|
||||
welcomeTaglineAfter: '',
|
||||
welcomeDescription: 'Construir potencial. Explore a inteligência.',
|
||||
welcomeAuthStarting: 'Abrindo login…',
|
||||
welcomeAuthWaiting: 'O navegador não abriu automaticamente?',
|
||||
welcomeAuthWaitingDescription: 'Copie o link de login e abra-o em seu navegador para fazer login.',
|
||||
welcomeAuthExchanging: 'Concluindo login…',
|
||||
welcomeAuthExpired: 'O tempo limite de login expirou',
|
||||
welcomeAuthExpiredDescription: 'Faça login novamente para continuar',
|
||||
welcomeAuthFailed: 'Não foi possível concluir o login. Tente novamente.',
|
||||
welcomeAuthCopyLink: 'Copiar link de login',
|
||||
welcomeAuthCopied: 'Copiado',
|
||||
welcomeAuthCopyFailed: 'Não foi possível copiar. Tente novamente.',
|
||||
welcomeAuthCancel: 'Cancelar',
|
||||
welcomeAuthRetry: 'Faça login novamente',
|
||||
welcomeSignIn: 'Faça login',
|
||||
welcomeApiKey: 'Adicionar chave API',
|
||||
welcomeKeyTitle: 'Adicione uma chave API para começar',
|
||||
welcomeKeyDescription: 'Configure modelos DeepSeek oficiais para começar a usar o Harness',
|
||||
welcomeKeyPlaceholder: 'Insira a tecla API',
|
||||
welcomeKeySave: 'Salvar e continuar',
|
||||
welcomeKeyLater: 'Configurar mais tarde',
|
||||
welcomeKeyBack: 'Voltar para fazer login',
|
||||
welcomeSessionExpired: 'Você saiu da sua conta, faça login novamente.',
|
||||
welcomeKeyBlank: 'Insira uma chave API.',
|
||||
welcomeKeyInvalid: 'Insira a própria chave API, sem aspas, espaços ou atribuição de variável de ambiente.',
|
||||
welcomeKeyFailed: 'Não foi possível salvar a chave API. Por favor, tente novamente.',
|
||||
welcomeContinueFailed: 'Não foi possível abrir o espaço de trabalho. Por favor, tente novamente.',
|
||||
checkUpdatesMenu: 'Verifique se há atualizações…',
|
||||
reloadPageMenu: 'Recarregar página',
|
||||
restartAppHostMenu: 'Reinicie o aplicativo e o host',
|
||||
updateCheckFailedTitle: 'Falha na verificação de atualização',
|
||||
updateCheckFailed: 'Não foi possível verificar se há atualizações. Por favor, tente novamente mais tarde.',
|
||||
updateDownloadFailed: 'Não foi possível baixar a atualização. Por favor, tente novamente.',
|
||||
updateInstallFailed: 'Não foi possível instalar a atualização. Por favor, tente novamente mais tarde.',
|
||||
updateCheckNetworkFailed: 'Não foi possível verificar se há atualizações. Verifique sua conexão e tente novamente.',
|
||||
updateDownloadNetworkFailed: 'Não foi possível baixar a atualização. Verifique sua conexão e tente novamente.',
|
||||
updateInstallNetworkFailed: 'Não foi possível instalar a atualização. Verifique sua conexão e tente novamente.',
|
||||
unknownError: 'Erro desconhecido',
|
||||
updateCheckTitle: 'Verifique se há atualizações',
|
||||
updateCurrentDetail: 'Versão atual: {version}',
|
||||
updateCurrent: 'Você está atualizado!',
|
||||
updateChecking: 'Verificando atualizações…',
|
||||
updateDownload: 'Baixar atualização',
|
||||
updateDownloadedTitle: 'A versão {version} está pronta para instalação',
|
||||
updateDownloadedDetail: 'O aplicativo será fechado durante a atualização e reaberto automaticamente quando for concluída.',
|
||||
updateDownloadedDetailWindows: 'O aplicativo será fechado temporariamente durante a atualização e reaberto automaticamente quando for concluída.\n\nA atualização pode levar algum tempo. Aguarde e não inicie o aplicativo novamente durante a instalação.',
|
||||
updateClose: 'Fechar',
|
||||
updateAcknowledge: 'OK',
|
||||
updateLater: 'Atualizar mais tarde',
|
||||
updateDownloading: 'Baixando {percent}%…',
|
||||
updateVerifying: 'Verificando arquivos de atualização…',
|
||||
updateInstalling: 'Preparando para reiniciar…',
|
||||
updateRetry: 'Tentar atualizar novamente',
|
||||
updateActiveTasks: 'As tarefas ainda estão em andamento',
|
||||
updateActiveTasksDetail: 'A atualização interromperá as tarefas em andamento e reiniciará o aplicativo. Continuar?',
|
||||
updateStopTasks: 'Pare tarefas e atualize',
|
||||
updateTasksChanged: 'Novas tarefas foram iniciadas. Confirme novamente para interromper as tarefas e atualizar.',
|
||||
updateTasksUnavailable: 'O status da tarefa não está disponível. Tente atualizar novamente quando o espaço de trabalho estiver pronto.',
|
||||
updateFullscreenTimeout: 'Não foi possível sair da tela cheia. Saia da tela inteira e tente atualizar novamente.',
|
||||
updateStopFailed: 'Não foi possível interromper as tarefas com segurança. A atualização não foi instalada. Por favor, tente novamente mais tarde.',
|
||||
updateTechnicalDetails: 'Ver detalhes técnicos',
|
||||
updateTitle: 'DeepSeek Harness Atualização',
|
||||
updateAvailable: 'Nova versão disponível: {version}',
|
||||
updateDetail: 'Assim que o download for concluído, você pode instalar a atualização e reiniciar o aplicativo.',
|
||||
installAndRestart: 'Instalar e reiniciar',
|
||||
later: 'Mais tarde',
|
||||
updateFailedTitle: 'Falha na atualização',
|
||||
mandatoryTitle: 'Atualizar para continuar',
|
||||
mandatoryDetail: 'Esta versão não é mais suportada. Atualize para continuar. As tarefas em andamento continuarão em execução até você confirmar a instalação e reiniciar.',
|
||||
mandatoryUnavailable: 'Não foi possível verificar os requisitos de atualização. Por favor, tente novamente mais tarde.',
|
||||
policyLoginTitle: 'Faça login no ambiente de teste',
|
||||
policyLoginRequired: 'Faça login com Feishu para verificar os requisitos de atualização para esta versão de teste. O login não baixará nem instalará uma atualização.',
|
||||
policyLogin: 'Faça login com Feishu',
|
||||
policyLoginFailed: 'O login do Feishu não foi concluído. Por favor, tente novamente.',
|
||||
policyLoginLoading: 'Carregando página de login…',
|
||||
mandatoryNoRelease: 'Nenhuma atualização compatível foi encontrada. Verifique novamente ou entre em contato com o suporte.',
|
||||
mandatoryRefresh: 'Verifique novamente',
|
||||
mandatoryPage: 'Baixe do site oficial',
|
||||
mandatoryCopy: 'Copiar link de download',
|
||||
mandatoryPageFailed: 'Não foi possível abrir a página oficial de download. Copie o link e abra-o no seu navegador.',
|
||||
mandatoryViewDownload: 'Abrir página de download',
|
||||
mandatoryViewPageFailed: 'Não foi possível abrir a página de download. Por favor, tente novamente.',
|
||||
mandatoryActionFailed: 'A ação falhou. Por favor, tente novamente. Você poderá usar o aplicativo novamente após a conclusão da atualização.',
|
||||
mandatoryReady: 'Atualização pronta',
|
||||
mandatoryVersion: 'Nova versão: {version}',
|
||||
mandatoryReadyDetail: 'O aplicativo será fechado durante a atualização e reaberto automaticamente quando for concluída.',
|
||||
mandatoryDeferred: 'As tarefas em andamento continuarão em execução. Conclua a atualização antes de usar o aplicativo novamente.',
|
||||
mandatoryContinue: 'Continuar atualização',
|
||||
mandatoryInspecting: 'Verificando tarefas…',
|
||||
mandatoryStopping: 'Parando tarefas…',
|
||||
mandatoryRestarting: 'O aplicativo será reiniciado em breve. Por favor, aguarde.',
|
||||
mandatoryDownloadFailed: 'Os arquivos de atualização não puderam ser baixados ou preparados. Por favor, tente novamente.',
|
||||
mandatoryInstallFailed: 'A atualização não foi instalada. Verifique as tarefas novamente e tente novamente.',
|
||||
mandatoryOpenHelp: 'A página não abriu?',
|
||||
mandatoryReopen: 'Abra a página oficial de download novamente',
|
||||
mandatoryCopied: 'Link copiado',
|
||||
mandatoryCopyFailed: 'Não foi possível copiar o link. Selecione e copie abaixo.',
|
||||
mandatoryAddress: 'Baixar link',
|
||||
mandatoryNotification: 'Retorne ao aplicativo para confirmar a instalação e reinicie.',
|
||||
} satisfies DesktopMessages
|
||||
|
||||
/** Locale payload exposed to the Desktop-owned renderer. */
|
||||
export interface DesktopLocale {
|
||||
readonly id: 'en' | 'zh-CN' | 'ja'
|
||||
readonly id: 'en' | 'zh-CN' | 'ja' | 'es' | 'fr' | 'de' | 'ru' | 'pt'
|
||||
readonly messages: DesktopMessages
|
||||
}
|
||||
|
||||
/** Resolve Electron's locale to one shipped Desktop dictionary. */
|
||||
export function resolveDesktopLocale(locale: string): DesktopLocale {
|
||||
const primary = locale.toLowerCase().split('-')[0]
|
||||
if (primary === 'ja') return { id: 'ja', messages: ja }
|
||||
const dictionaries = { ja, es, fr, de, ru, pt }
|
||||
if (primary !== undefined && Object.hasOwn(dictionaries, primary)) {
|
||||
const id = primary as keyof typeof dictionaries
|
||||
return { id, messages: dictionaries[id] }
|
||||
}
|
||||
return primary === 'zh'
|
||||
? { id: 'zh-CN', messages: zh }
|
||||
: { id: 'en', messages: en }
|
||||
@@ -540,10 +1404,10 @@ export function resolveDesktopLocale(locale: string): DesktopLocale {
|
||||
*/
|
||||
export function resolveDesktopStartupLocale(preference: string | null, languages: readonly string[]): DesktopLocale {
|
||||
const selected = preference?.toLowerCase()
|
||||
if (selected === 'zh' || selected === 'en' || selected === 'ja') return resolveDesktopLocale(selected)
|
||||
if (selected !== undefined && ['zh', 'en', 'ja', 'es', 'fr', 'de', 'ru', 'pt'].includes(selected)) return resolveDesktopLocale(selected)
|
||||
for (const language of languages) {
|
||||
const primary = language.toLowerCase().split('-')[0]
|
||||
if (primary === 'zh' || primary === 'en' || primary === 'ja') return resolveDesktopLocale(primary)
|
||||
if (primary !== undefined && ['zh', 'en', 'ja', 'es', 'fr', 'de', 'ru', 'pt'].includes(primary)) return resolveDesktopLocale(primary)
|
||||
}
|
||||
return resolveDesktopLocale('en')
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import { readInstallerLocales, renderInstallerStrings } from '../scripts/install
|
||||
function fixture(): string {
|
||||
const directory = mkdtempSync(join(tmpdir(), 'dsh-installer-locales-'))
|
||||
onTestFinished(() => { rmSync(directory, { recursive: true, force: true }) })
|
||||
for (const id of ['en_US', 'zh_CN', 'ja_JP']) {
|
||||
for (const id of ['en_US', 'zh_CN', 'ja_JP', 'es_ES', 'fr_FR', 'de_DE', 'ru_RU', 'pt_BR']) {
|
||||
writeFileSync(join(directory, `${id}.json`), readFileSync(new URL(`../installer/locales/${id}.json`, import.meta.url)))
|
||||
}
|
||||
return directory
|
||||
@@ -16,17 +16,17 @@ function fixture(): string {
|
||||
|
||||
it('generates Japanese NSIS strings from the same files that select packaged languages', () => {
|
||||
const locales = readInstallerLocales()
|
||||
expect(locales.map(locale => locale.id)).toEqual(['en_US', 'ja_JP', 'zh_CN'])
|
||||
expect(locales.map(locale => locale.id)).toEqual(['de_DE', 'en_US', 'es_ES', 'fr_FR', 'ja_JP', 'pt_BR', 'ru_RU', 'zh_CN'])
|
||||
const source = renderInstallerStrings(locales)
|
||||
expect(source).toContain('LangString INSTALLER_INSTALL ${LANG_JAPANESE} "今すぐインストール"')
|
||||
expect(source).toContain('LangString INSTALLER_NATIVE_PROGRESS ${LANG_JAPANESE} "インストールを準備しています… %d%%"')
|
||||
expect(source).toContain('!ifdef LANG_JAPANESE\n')
|
||||
expect(source.match(/^LangString /gmu)).toHaveLength(93)
|
||||
expect(source.match(/^LangString /gmu)).toHaveLength(248)
|
||||
const japanese = locales.filter(locale => locale.id === 'ja_JP')
|
||||
expect(renderInstallerStrings(japanese)).not.toContain('${LANG_ENGLISH}')
|
||||
})
|
||||
|
||||
it.each(['en_US', 'zh_CN', 'ja_JP'])('rejects a missing %s configuration', (id) => {
|
||||
it.each(['en_US', 'zh_CN', 'ja_JP', 'es_ES', 'fr_FR', 'de_DE', 'ru_RU', 'pt_BR'])('rejects a missing %s configuration', (id) => {
|
||||
const directory = fixture()
|
||||
rmSync(join(directory, `${id}.json`))
|
||||
expect(() => readInstallerLocales(directory)).toThrow(`missing ${id}.json`)
|
||||
@@ -39,6 +39,7 @@ it.each([
|
||||
['changed placeholder', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%s%%' }, 'format placeholders'],
|
||||
['missing percent escape', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%d%' }, 'format placeholders'],
|
||||
['extra format specifier', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%d%% %q' }, 'format placeholders'],
|
||||
['translated command', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.strings.INSTALLER_THEME_ERROR = 'Use /THEME=claro.' }, 'format placeholders'],
|
||||
['duplicate language', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.nsisLanguage = 'ENGLISH' }, 'duplicate NSIS language'],
|
||||
['invalid compiler token', (resource: ReturnType<typeof readInstallerLocales>[number]) => { resource.nsisLanguage = 'JA\n!error' }, 'invalid NSIS language'],
|
||||
])('rejects %s', (_name, mutate, diagnostic) => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { en, formatDesktopMessage, resolveDesktopLocale, resolveDesktopStartupLocale, ja, zh } from '../src/locale.ts'
|
||||
import { en, formatDesktopMessage, resolveDesktopLocale, resolveDesktopStartupLocale, ja, zh, es, fr, de, ru, pt } from '../src/locale.ts'
|
||||
|
||||
describe('desktop locale dictionaries', () => {
|
||||
it('ships the same key set in English, Chinese, and Japanese', () => {
|
||||
@@ -8,7 +8,21 @@ describe('desktop locale dictionaries', () => {
|
||||
expect(resolveDesktopLocale('JA-jp')).toEqual({ id: 'ja', messages: ja })
|
||||
expect(resolveDesktopLocale('zh-Hans-CN').messages).toEqual(zh)
|
||||
expect(resolveDesktopLocale('en-US').messages).toEqual(en)
|
||||
expect(resolveDesktopLocale('fr-FR').messages).toEqual(en)
|
||||
expect(resolveDesktopLocale('it-IT').messages).toEqual(en)
|
||||
})
|
||||
|
||||
it.each([
|
||||
['es', 'es-MX', es], ['fr', 'fr-CA', fr], ['de', 'de-DE', de],
|
||||
['ru', 'ru-RU', ru], ['pt', 'pt-BR', pt],
|
||||
] as const)('resolves %s, preserves placeholders, and honors saved preferences', (id, tag, messages) => {
|
||||
expect(resolveDesktopLocale(tag.toUpperCase())).toEqual({ id, messages })
|
||||
expect(resolveDesktopStartupLocale(id, ['zh-CN']).id).toBe(id)
|
||||
expect(resolveDesktopStartupLocale(null, ['it-IT', tag, 'en-US']).id).toBe(id)
|
||||
expect(Object.keys(messages)).toEqual(Object.keys(en))
|
||||
for (const key of Object.keys(en) as (keyof typeof en)[]) {
|
||||
const placeholders = (text: string): string[] => (text.match(/\{\w+\}/gu) ?? []).sort()
|
||||
expect(placeholders(messages[key]), key).toEqual(placeholders(en[key]))
|
||||
}
|
||||
})
|
||||
|
||||
it('formats named values without consuming unknown placeholders', () => {
|
||||
|
||||
@@ -51,7 +51,7 @@ describe('desktop macOS release signature', () => {
|
||||
expect(config.protocols).toEqual([{ name: 'DeepSeek Harness', schemes: ['dsh'] }])
|
||||
expect(portablePath(config.directories.output)).toContain('/.desktop-build/targets/mac-arm64/artifacts')
|
||||
expect(config.mac.extendInfo.NSMicrophoneUsageDescription).toContain('microphone')
|
||||
expect(config.mac.extendInfo.CFBundleLocalizations).toEqual(['en', 'zh_CN', 'ja'])
|
||||
expect(config.mac.extendInfo.CFBundleLocalizations).toEqual(['en', 'zh_CN', 'ja', 'es', 'fr', 'de', 'ru', 'pt'])
|
||||
expect(config.mac.entitlementsInherit).toBe(config.mac.entitlements)
|
||||
const entitlements = readFileSync(config.mac.entitlements, 'utf8')
|
||||
for (const key of ['com.apple.security.cs.allow-jit', 'com.apple.security.cs.allow-unsigned-executable-memory',
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/** Shipped language selection, metadata and narrow settings through the assembled Web profile. */
|
||||
import { readFile } from 'node:fs/promises'
|
||||
import { join } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { chromium, type Browser } from 'playwright'
|
||||
import { expect, it, onTestFailed, onTestFinished } from 'vitest'
|
||||
import { acknowledgeReloadConnectionLoss, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts'
|
||||
import { saveFailureShot } from './support.ts'
|
||||
|
||||
const languages = [
|
||||
['es', 'es-MX', 'Menú de cuenta', 'Configuración', 'Complementos', 'Idioma', 'Español'],
|
||||
['fr', 'fr-CA', 'Menu du compte', 'Paramètres', 'Plugins', 'Langue', 'Français'],
|
||||
['de', 'de-DE', 'Kontomenü', 'Einstellungen', 'Plugins', 'Sprache', 'Deutsch'],
|
||||
['ru', 'ru-RU', 'Меню аккаунта', 'Настройки', 'Плагины', 'Язык', 'Русский'],
|
||||
['pt', 'pt-BR', 'Menu da conta', 'Configurações', 'Plug-ins', 'Idioma', 'Português'],
|
||||
] as const
|
||||
|
||||
it.each(languages)('selects %s from the browser, localizes metadata and persists an explicit choice', async (id, tag, accountMenu, settings, plugins, language, label) => {
|
||||
const resources: { scaffold?: WebScaffold; browser?: Browser } = {}
|
||||
onTestFinished(async () => {
|
||||
try { await resources.browser?.close() } finally { await resources.scaffold?.close() }
|
||||
})
|
||||
const scaffold = await launchWebScaffold()
|
||||
resources.scaffold = scaffold
|
||||
const browser = await chromium.launch()
|
||||
resources.browser = browser
|
||||
const page = await browser.newPage({ locale: tag, viewport: { width: 1440, height: 960 } })
|
||||
const tripwire = watchConsole(page)
|
||||
onTestFailed(() => saveFailureShot(page, `additional-locale-${id}`))
|
||||
await page.goto(scaffold.authenticatedUrl)
|
||||
await expect.poll(() => page.evaluate(() => document.documentElement.lang)).toBe(id)
|
||||
await page.getByRole('button', { name: plugins, exact: true }).click()
|
||||
const panel = page.locator('[data-plugin-panel]')
|
||||
const metadata = JSON.parse(await readFile(new URL(`../../../packages/experimental/auto-review/locale/${id}.json`, import.meta.url), 'utf8')) as { meta: { title: string; description: string } }
|
||||
await panel.getByText(metadata.meta.title, { exact: true }).waitFor()
|
||||
await panel.getByText(metadata.meta.description, { exact: true }).waitFor()
|
||||
await compareOrRefreshGolden(fileURLToPath(new URL(`./expected/additional-locales/${id}.expected.md`, import.meta.url)),
|
||||
await captureStableAria(page, `[data-plugin-panel] li:has-text(${JSON.stringify(metadata.meta.title)})`, scaffold.workspaceCwd), webSnapshotMode())
|
||||
await page.getByRole('button', { name: accountMenu, exact: true }).click()
|
||||
await page.getByRole('menuitem', { name: settings, exact: true }).click()
|
||||
const dialog = page.getByRole('dialog', { name: settings, exact: true })
|
||||
await dialog.getByText(language, { exact: true }).waitFor()
|
||||
await dialog.getByRole('button', { name: label, exact: true }).waitFor()
|
||||
await page.setViewportSize({ width: 390, height: 844 })
|
||||
await expect.poll(() => dialog.evaluate((element) => {
|
||||
const content = element.lastElementChild!
|
||||
return { panel: element.scrollWidth <= element.clientWidth + 1, content: content.scrollWidth <= content.clientWidth + 1 }
|
||||
})).toEqual({ panel: true, content: true })
|
||||
await dialog.getByRole('button', { name: label, exact: true }).click()
|
||||
await page.getByRole('menuitem', { name: 'English', exact: true }).click()
|
||||
await expect.poll(() => readFile(join(scaffold.harnessHome, 'profiles', 'scaffold', 'cordis.patch.yml'), 'utf8')).toContain('preference: en')
|
||||
const warningsBeforeReload = tripwire.warnings.length
|
||||
await page.reload()
|
||||
acknowledgeReloadConnectionLoss(tripwire, warningsBeforeReload)
|
||||
await expect.poll(() => page.evaluate(() => document.documentElement.lang)).toBe('en')
|
||||
expect(tripwire.warnings).toEqual([])
|
||||
expect(tripwire.pageErrors).toEqual([])
|
||||
})
|
||||
@@ -21,7 +21,7 @@ describe.skipIf(MODE === 'record')('web e2e: native and Client locale preference
|
||||
let page: Page
|
||||
let tripwire: ReturnType<typeof watchConsole>
|
||||
const reported: string[] = []
|
||||
let languages = ['fr-FR', 'zh-CN', 'en-US']
|
||||
let languages = ['it-IT', 'zh-CN', 'en-US']
|
||||
|
||||
beforeAll(async () => {
|
||||
scaffold = await launchWebScaffold()
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
- listitem:
|
||||
- button "Siehe Automatische Autorisierungsüberprüfung": Automatische Autorisierungsüberprüfung
|
||||
- text: Experimentell Fügen Sie einen Auto review-Berechtigungsmodus hinzu, der das Modell verwendet, um die Autorisierung vor jedem Toolaufruf zu bewerten.
|
||||
- status
|
||||
- switch "Aktivieren Sie Automatische Autorisierungsüberprüfung"
|
||||
@@ -0,0 +1,5 @@
|
||||
- listitem:
|
||||
- button "Ver Revisión de autorización automática": Revisión de autorización automática
|
||||
- text: Experimental Agregue un modo de permiso Auto review que utilice el modelo para evaluar la autorización antes de cada llamada a la herramienta.
|
||||
- status
|
||||
- switch "Habilitar Revisión de autorización automática"
|
||||
@@ -0,0 +1,5 @@
|
||||
- listitem:
|
||||
- button "Voir Examen des autorisations automatiques": Examen des autorisations automatiques
|
||||
- text: Expérimental Ajoutez un mode d'autorisation Auto review qui utilise le modèle pour évaluer l'autorisation avant chaque appel d'outil.
|
||||
- status
|
||||
- switch "Activer Examen des autorisations automatiques"
|
||||
@@ -0,0 +1,5 @@
|
||||
- listitem:
|
||||
- button "Ver Revisão de autorização automática": Revisão de autorização automática
|
||||
- text: Experimental Adicione um modo de permissão Auto review que usa o modelo para avaliar a autorização antes de cada chamada de ferramenta.
|
||||
- status
|
||||
- switch "Ativar Revisão de autorização automática"
|
||||
@@ -0,0 +1,5 @@
|
||||
- listitem:
|
||||
- button "Посмотреть Проверка автоматической авторизации": Проверка автоматической авторизации
|
||||
- text: Экспериментальный Добавьте режим разрешений Auto review, который использует модель для оценки авторизации перед каждым вызовом инструмента.
|
||||
- status
|
||||
- switch "Включить Проверка автоматической авторизации"
|
||||
@@ -24,6 +24,7 @@
|
||||
// cannot see both sides of the cordis Context merges).
|
||||
"exclude": [
|
||||
"tests/japanese-plugin-metadata.e2e.ts",
|
||||
"tests/additional-locales.e2e.ts",
|
||||
"tests/rich-text-quotes.e2e.ts",
|
||||
"tests/hover-input.e2e.ts",
|
||||
"tests/collapse-timing.e2e.ts",
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
en: 0894bd9f35430753
|
||||
zh: 2d28090e71134edd
|
||||
/cookbook-adding-a-workspace-package/5-add-optional-plugin-display-metadata:
|
||||
en: 1238eaea376391d1
|
||||
zh: c7e606f95d8980bf
|
||||
en: 3725e456d5cddfde
|
||||
zh: e847b8bb65e0a1ea
|
||||
/cookbook-adding-a-workspace-package/6-verify:
|
||||
en: 80c7fb90b1175aae
|
||||
zh: 2ba37962dbc57299
|
||||
@@ -136,7 +136,7 @@ Merge these entries into `package.json`, retaining existing runtime exports and
|
||||
}
|
||||
```
|
||||
|
||||
Keep language files together in `locale/`, with `en.json` as the discovery entry. Fields are optional; present values must be non-empty strings. English `meta.title` and `meta.description` use sentence case: capitalize only the first word, proper nouns, and product names, as in `Git worktrees` ([rule](../../.agents/skills/dsh-prose-standard/SKILL.md#required-coverage-by-prose-location)). At runtime, missing files or fields permit fallback, while malformed JSON or invalid fields produce a per-plugin diagnostic. First-party packages and plugin templates must provide `ja.json` covering every field present in `en.json` or optional `zh.json`, preserving placeholders; detail paths may point to the existing English document. Subpath resources under `locale/<subpath>/` follow the same checks. English descriptions explain user-visible behavior and end with sentence punctuation. Run `pnpm run check:i18n` to verify JSON metadata and UI dictionary completeness; the JSON checks also run in `check:all`, CI static checks, and hygiene.
|
||||
Keep language files together in `locale/`, with `en.json` as the discovery entry. Fields are optional; present values must be non-empty strings. English `meta.title` and `meta.description` use sentence case: capitalize only the first word, proper nouns, and product names, as in `Git worktrees` ([rule](../../.agents/skills/dsh-prose-standard/SKILL.md#required-coverage-by-prose-location)). At runtime, missing files or fields permit fallback, while malformed JSON or invalid fields produce a per-plugin diagnostic. First-party packages and plugin templates must provide `ja.json`, `es.json`, `fr.json`, `de.json`, `ru.json`, and `pt.json` covering every field present in `en.json` or optional `zh.json`, preserving placeholders, slash commands, and API field names; detail paths may point to the existing English document. Subpath resources under `locale/<subpath>/` follow the same checks. English descriptions explain user-visible behavior and end with sentence punctuation. Run `pnpm run check:i18n` to verify JSON metadata and UI dictionary completeness; the JSON checks also run in `check:all`, CI static checks, and hygiene.
|
||||
|
||||
Fields fall back independently before view-specific name formatting, using the existing locale language chain first:
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ Append-only, prefix-stable, replacing, or independent behavior, including the ex
|
||||
}
|
||||
```
|
||||
|
||||
语言文件统一放在 `locale/`,并保留 `en.json` 作为发现入口。字段可选,填写时必须是非空字符串。英文 `meta.title` 和 `meta.description` 使用 sentence case:只大写首个单词、专有名词和产品名,例如 `Git worktrees`([rule](../../.agents/skills/dsh-prose-standard/SKILL.md#required-coverage-by-prose-location))。运行时文件或字段缺失时允许回退,JSON 损坏或字段无效时显示单插件诊断。仓库内的包和插件模板必须提供 `ja.json`,覆盖 `en.json` 或可选 `zh.json` 中的全部字段并保留占位符;详情路径可指向现有英文文档。`locale/<subpath>/` 下的子路径资源使用相同检查。英文描述面向产品用户说明可见行为,并以句末标点结束。运行 `pnpm run check:i18n` 检查 JSON 元数据和 UI 字典完整性;JSON 检查也接入 `check:all`、CI 静态检查和 hygiene。
|
||||
语言文件统一放在 `locale/`,并保留 `en.json` 作为发现入口。字段可选,填写时必须是非空字符串。英文 `meta.title` 和 `meta.description` 使用 sentence case:只大写首个单词、专有名词和产品名,例如 `Git worktrees`([rule](../../.agents/skills/dsh-prose-standard/SKILL.md#required-coverage-by-prose-location))。运行时文件或字段缺失时允许回退,JSON 损坏或字段无效时显示单插件诊断。仓库内的包和插件模板必须提供 `ja.json`、`es.json`、`fr.json`、`de.json`、`ru.json` 和 `pt.json`,覆盖 `en.json` 或可选 `zh.json` 中的全部字段并保留占位符、斜杠命令和 API 字段名;详情路径可指向现有英文文档。`locale/<subpath>/` 下的子路径资源使用相同检查。英文描述面向产品用户说明可见行为,并以句末标点结束。运行 `pnpm run check:i18n` 检查 JSON 元数据和 UI 字典完整性;JSON 检查也接入 `check:all`、CI 静态检查和 hygiene。
|
||||
|
||||
各字段先独立回退,再按页面规则格式化技术名称;回退优先经过现有 locale 语言链:
|
||||
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
# After editing either side, bring the other along and re-record with:
|
||||
# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-rc.2/built-in-japanese/guide.md
|
||||
/:
|
||||
en: 383326881143f69b
|
||||
zh: cd7ff0e2b97f9c2f
|
||||
/japanese-is-a-built-in-language:
|
||||
en: f97bae63a42a3627
|
||||
zh: cec418f8bf6ac168
|
||||
/japanese-is-a-built-in-language/change:
|
||||
en: feb1f2d1cafdcfe0
|
||||
zh: 94d527865ec108bb
|
||||
/japanese-is-a-built-in-language/migration:
|
||||
en: ced2c2baad9124b4
|
||||
zh: 7b0b5b0e345994b8
|
||||
en: cfd1ffd2cd268220
|
||||
zh: 2ed03b1063f3319d
|
||||
/built-in-languages-replace-duplicate-language-packs:
|
||||
en: 5855b69ac12a5f50
|
||||
zh: a81de3239837f1c4
|
||||
/built-in-languages-replace-duplicate-language-packs/change:
|
||||
en: 665e68d784661f15
|
||||
zh: 2fff6fcfceea7994
|
||||
/built-in-languages-replace-duplicate-language-packs/migration:
|
||||
en: 6f77e0b507e09ca7
|
||||
zh: 59e0c71780f06e9e
|
||||
@@ -1,18 +1,18 @@
|
||||
---
|
||||
kind: upgrade-guide
|
||||
description: "Built-in Japanese registrations conflict with third-party Japanese language packs."
|
||||
description: "Built-in language registrations conflict with third-party language packs using the same ids."
|
||||
---
|
||||
|
||||
# Japanese is a built-in language
|
||||
# Built-in languages replace duplicate language packs
|
||||
|
||||
English | [中文](guide.zh.md)
|
||||
|
||||
## Change
|
||||
|
||||
The locale plugin registers the `ja` language and Japanese dictionaries for `common` and `settings.locale`. Third-party language packs following the previous Japanese README example now fail with an already-registered language or dictionary error.
|
||||
The locale plugin registers `ja`, `es`, `fr`, `de`, `ru`, and `pt`, with dictionaries for `common`, `settings.locale`, and the built-in UI plugins. Third-party language packs using these ids now fail with an already-registered language or dictionary error, including packs based on the earlier Japanese or French README examples.
|
||||
|
||||
## Migration
|
||||
|
||||
1. In the language pack's client entry, remove `ctx.locale.addLanguage({ id: 'ja', ... })` and registrations for `common` and `settings.locale` under `ja`. Remove other Japanese dictionary registrations whose namespaces are now supplied by built-in plugins; keep translations for namespaces owned by your own plugins.
|
||||
2. If the pack represents a distinct language variant, register a separate BCP 47-style id, such as `ja-JP`, for both the definition and its dictionaries instead of `ja`.
|
||||
1. In the language pack's client entry, remove `ctx.locale.addLanguage(...)` for these ids and dictionary registrations in namespaces supplied by built-in plugins. Keep translations for namespaces owned by your own plugins.
|
||||
2. If the pack represents a distinct language variant, register a separate BCP 47-style id, such as `fr-CA`, for both the definition and its dictionaries instead of the built-in id.
|
||||
3. Reload the application with the pack enabled. Confirm it starts without duplicate-registration errors and that selecting the intended language displays its translations.
|
||||
@@ -1,18 +1,18 @@
|
||||
---
|
||||
kind: upgrade-guide
|
||||
description: "内置日语注册会与第三方日语语言包冲突。"
|
||||
description: "内置语言注册会与使用相同 id 的第三方语言包冲突。"
|
||||
---
|
||||
|
||||
# 日语成为内置语言
|
||||
# 内置语言取代重复的语言包
|
||||
|
||||
[English](guide.md) | 中文
|
||||
|
||||
## 变更
|
||||
|
||||
locale 插件注册 `ja` 语言,以及 `common` 和 `settings.locale` 的日文字典。按此前 README 日语示例编写的第三方语言包会因语言或字典已注册而加载失败。
|
||||
locale 插件注册 `ja`、`es`、`fr`、`de`、`ru` 和 `pt`,并提供 `common`、`settings.locale` 以及内置 UI 插件的字典。使用这些 id 的第三方语言包会因语言或字典已注册而加载失败,包括按此前 README 日语或法语示例编写的语言包。
|
||||
|
||||
## 迁移
|
||||
|
||||
1. 在语言包的 client 入口中,删除 `ctx.locale.addLanguage({ id: 'ja', ... })`,以及 `common` 和 `settings.locale` 下的 `ja` 注册。删除其他已由内置插件提供的命名空间的日语字典注册;保留自己插件所拥有命名空间的翻译。
|
||||
2. 如果语言包代表不同的语言变体,为语言定义及其字典注册独立的 BCP 47 风格 id,例如 `ja-JP`,代替 `ja`。
|
||||
1. 在语言包的 client 入口中,删除这些 id 的 `ctx.locale.addLanguage(...)`,以及内置插件已提供的命名空间下的字典注册。保留自己插件所拥有命名空间的翻译。
|
||||
2. 如果语言包代表不同的语言变体,为语言定义及其字典注册独立的 BCP 47 风格 id,例如 `fr-CA`,代替内置 id。
|
||||
3. 启用语言包并重新加载应用。确认启动时没有重复注册错误,且选择目标语言后显示对应译文。
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ACP-Server",
|
||||
"description": "Führen Sie Agenten zur Automatisierung über JSON-RPC über Standardeingabe und -ausgabe aus."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "servidor ACP",
|
||||
"description": "Ejecute agentes a través de JSON-RPC a través de entrada y salida estándar para automatización."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Serveur ACP",
|
||||
"description": "Exécutez les agents via JSON-RPC via une entrée et une sortie standard pour l'automatisation."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ACP servidor",
|
||||
"description": "Execute agentes por meio de JSON-RPC em entradas e saídas padrão para automação."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ACP сервер",
|
||||
"description": "Запускайте агенты через JSON-RPC через стандартный ввод и вывод для автоматизации."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Benutzeroberfläche für den Kontobetrieb",
|
||||
"description": "Bieten Sie authentifizierten Clients Kontoverwaltungsfunktionen."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interfaz de operación de cuenta",
|
||||
"description": "Proporcionar capacidades de operación de cuentas a clientes autenticados."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface d'opération de compte",
|
||||
"description": "Fournir des capacités d’exploitation de compte aux clients authentifiés."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de operação da conta",
|
||||
"description": "Fornece recursos de operação de conta para clientes autenticados."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Интерфейс работы со счетом",
|
||||
"description": "Предоставьте возможности управления учетной записью аутентифицированным клиентам."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Remote-Call-Gateway",
|
||||
"description": "Empfangen Sie den Schnittstellenaufruf des Clients und verteilen Sie ihn an den entsprechenden Dienst."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "puerta de enlace de llamada remota",
|
||||
"description": "Recibir la llamada de interfaz del cliente y distribuirla al servicio correspondiente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "passerelle d'appel à distance",
|
||||
"description": "Recevez l'appel d'interface du client et distribuez-le au service correspondant."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "gateway de chamada remota",
|
||||
"description": "Receba a chamada de interface do cliente e distribua-a ao serviço correspondente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "шлюз удаленных вызовов",
|
||||
"description": "Получите вызов интерфейса клиента и передайте его соответствующему сервису."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Schnittstelle zur Beobachtung von Hintergrundaufgaben",
|
||||
"description": "Stellen Sie dem Kunden kontinuierlich den Status und die Ausgabe von Hintergrundaufgaben zur Verfügung."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interfaz de observación de tareas en segundo plano",
|
||||
"description": "Proporcionar continuamente el estado y la salida de las tareas en segundo plano al cliente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface d'observation des tâches en arrière-plan",
|
||||
"description": "Fournir en permanence l'état et la sortie des tâches en arrière-plan au client."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de observação de tarefas em segundo plano",
|
||||
"description": "Fornece continuamente o status e a saída de tarefas em segundo plano ao cliente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Интерфейс наблюдения за фоновыми задачами",
|
||||
"description": "Постоянно предоставляйте клиенту статус и вывод фоновых задач."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Fernzugriffskontrolle",
|
||||
"description": "Steuern Sie, mit welchen Methoden Nicht-Eigentümer-Verbindungen auf Berechtigungs-Snapshots für jede Verbindung zugreifen und diese beibehalten können."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "control de acceso remoto",
|
||||
"description": "Controle a qué métodos pueden acceder las conexiones que no son propietarios y retener instantáneas de permisos para cada conexión."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Contrôle d'accès à distance",
|
||||
"description": "Contrôlez les méthodes auxquelles les connexions non propriétaires peuvent accéder et conserver les instantanés d'autorisation pour chaque connexion."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Controle de acesso remoto",
|
||||
"description": "Controle quais métodos as conexões não proprietárias podem acessar e reter instantâneos de permissão para cada conexão."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Управление удаленным доступом",
|
||||
"description": "Контролируйте, какие методы соединения, не являющиеся владельцами, могут получать доступ и сохранять снимки разрешений для каждого соединения."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Zusammenfassung des Kunden API",
|
||||
"description": "Fasst die Serverfunktionen zusammen, die Clients durch Anwendungen zur Verfügung stehen."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Resumen del cliente API",
|
||||
"description": "Resume las capacidades del servidor abiertas a los clientes por las aplicaciones."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Récapitulatif du client API",
|
||||
"description": "Résume les fonctionnalités du serveur ouvertes aux clients par les applications."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Resumo do cliente API",
|
||||
"description": "Resume os recursos do servidor abertos aos clientes pelos aplicativos."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Сводная информация о клиенте API",
|
||||
"description": "Обобщает возможности сервера, открытые для клиентов приложениями."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Sitzungssteuerungsschnittstelle",
|
||||
"description": "Bietet Clients Funktionen zum Lesen von Sitzungen, zur Laufsteuerung und zur Statusaktualisierung."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interfaz de control de sesión",
|
||||
"description": "Proporciona capacidades de lectura de sesiones, control de ejecución y actualización de estado a los clientes."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interface de contrôle de session",
|
||||
"description": "Fournit des fonctionnalités de lecture de session, de contrôle d’exécution et de mise à jour de statut aux clients."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interface de controle de sessão",
|
||||
"description": "Fornece leitura de sessão, controle de execução e recursos de atualização de status aos clientes."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "интерфейс управления сеансом",
|
||||
"description": "Предоставляет клиентам возможности чтения сеанса, управления запуском и обновления статуса."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lese- und Schreibschnittstelle einrichten",
|
||||
"description": "Bieten Sie dem Kunden die Möglichkeit, verschiedene Einstellungen zu lesen und zu ändern."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Configurar la interfaz de lectura y escritura",
|
||||
"description": "Proporcionar al cliente la capacidad de leer y modificar varias configuraciones."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Configurer l'interface de lecture et d'écriture",
|
||||
"description": "Offrir au client la possibilité de lire et de modifier divers paramètres."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Configurar interface de leitura e gravação",
|
||||
"description": "Forneça ao cliente a capacidade de ler e modificar várias configurações."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Настройка интерфейса чтения и записи",
|
||||
"description": "Предоставьте клиенту возможность читать и изменять различные настройки."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Terminal-Steuerungsschnittstelle",
|
||||
"description": "Bietet Clients die Möglichkeit, Sitzungsterminals zu erstellen, einzugeben, zu lesen und wiederherzustellen."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interfaz de control terminal",
|
||||
"description": "Proporciona a los clientes la capacidad de crear, ingresar, leer y restaurar terminales de sesión."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interface de contrôle des terminaux",
|
||||
"description": "Fournit aux clients la possibilité de créer, saisir, lire et restaurer des terminaux de session."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "interface de controle de terminal",
|
||||
"description": "Fornece aos clientes a capacidade de criar, inserir, ler e restaurar terminais de sessão."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "интерфейс управления терминалом",
|
||||
"description": "Предоставляет клиентам возможность создавать, вводить, читать и восстанавливать сеансовые терминалы."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Schnittstelle zur Arbeitsbereichssteuerung",
|
||||
"description": "Bietet Clients Arbeitsbereichsvorgänge und einen Status, der bei erneuter Verbindung wiederhergestellt werden kann."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interfaz de control del espacio de trabajo",
|
||||
"description": "Proporciona a los clientes operaciones en el espacio de trabajo y un estado que se puede restaurar tras la reconexión."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de contrôle de l'espace de travail",
|
||||
"description": "Fournit aux clients des opérations d’espace de travail et un état qui peut être restauré lors de la reconnexion."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de controle do espaço de trabalho",
|
||||
"description": "Fornece aos clientes operações de espaço de trabalho e um estado que pode ser restaurado após a reconexão."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Интерфейс управления рабочей областью",
|
||||
"description": "Предоставляет клиентам операции в рабочей области и состояние, которое можно восстановить при повторном подключении."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Workspace-Dateischnittstelle",
|
||||
"description": "Bietet das Lesen von Arbeitsbereichsdateien, das Auflisten von Verzeichnissen und die Aktualisierung von Dateiinformationen."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interfaz de archivos del espacio de trabajo",
|
||||
"description": "Proporciona lectura de archivos del espacio de trabajo, listado de directorios y actualizaciones de información de archivos."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de fichier de l'espace de travail",
|
||||
"description": "Fournit la lecture des fichiers de l'espace de travail, la liste des répertoires et les mises à jour des informations sur les fichiers."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Interface de arquivo do espaço de trabalho",
|
||||
"description": "Fornece leitura de arquivos do espaço de trabalho, listagem de diretórios e atualizações de informações de arquivos."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Файловый интерфейс рабочей области",
|
||||
"description": "Обеспечивает чтение файлов рабочей области, список каталогов и обновление информации о файлах."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lokaler Anhangsspeicher",
|
||||
"description": "Speichern Sie Anhänge wie Bilder in der Sitzung und lesen Sie sie entsprechend der Inhaltskennung."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Almacenamiento de archivos adjuntos locales",
|
||||
"description": "Guarde archivos adjuntos como imágenes de la sesión y léalos según el identificador de contenido."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Stockage local des pièces jointes",
|
||||
"description": "Enregistrez les pièces jointes telles que les images dans la session et lisez-les en fonction de l'identifiant du contenu."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Armazenamento local de anexos",
|
||||
"description": "Salve anexos como fotos na sessão e leia-os de acordo com o identificador de conteúdo."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Локальное хранилище вложений",
|
||||
"description": "Сохраняйте вложения, например изображения, в сеансе и читайте их в соответствии с идентификатором контента."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Plug-in-Konfigurationseditor",
|
||||
"description": "Speichern Sie die Plug-in-Konfiguration und übernehmen Sie Änderungen auf die aktuell ausgeführte Konfiguration."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Editor de configuración de complementos",
|
||||
"description": "Guarde la configuración del complemento y aplique los cambios a la configuración en ejecución actual."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Éditeur de configuration de plug-in",
|
||||
"description": "Enregistrez la configuration du plug-in et appliquez les modifications à la configuration en cours d'exécution."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Editor de configuração de plug-ins",
|
||||
"description": "Salve a configuração do plug-in e aplique as alterações à configuração em execução atual."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Редактор конфигурации плагина",
|
||||
"description": "Сохраните конфигурацию плагина и примените изменения к текущей работающей конфигурации."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Hmr",
|
||||
"description": "Laden Sie den Plugin-Code und die Konfiguration neu, während die App ausgeführt wird."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "hmr",
|
||||
"description": "Vuelva a cargar el código y la configuración del complemento mientras la aplicación se está ejecutando."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "hum",
|
||||
"description": "Rechargez le code et la configuration du plugin pendant que l'application est en cours d'exécution."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "hum",
|
||||
"description": "Recarregue o código e a configuração do plugin enquanto o aplicativo estiver em execução."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "хмр",
|
||||
"description": "Перезагрузите код и конфигурацию плагина во время работы приложения."
|
||||
}
|
||||
}
|
||||
@@ -7,16 +7,16 @@ export const OFFICIAL_ON_DEMAND_CATALOG: readonly OfficialBundleCatalogEntry[] =
|
||||
{
|
||||
packageName: '@deepseek-ai/dsh-subagent-claude-code',
|
||||
meta: {
|
||||
title: { 'en': 'Claude Code subagent', 'ja': 'Claude Code \u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8', 'zh': 'Claude Code \u5B50\u667A\u80FD\u4F53' },
|
||||
description: { 'en': 'Delegate one task to Claude Code using its native authentication and settings.', 'ja': 'Claude Code \u306E\u30CD\u30A4\u30C6\u30A3\u30D6\u306E\u8A8D\u8A3C\u3068\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u5358\u72EC\u306E\u30BF\u30B9\u30AF\u3092\u59D4\u6D3E\u3057\u307E\u3059\u3002', 'zh': '\u4F7F\u7528 Claude Code \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' },
|
||||
title: { 'de': 'Claude Code-Subagent', 'en': 'Claude Code subagent', 'es': 'Subagente Claude Code', 'fr': 'Sous-agent Claude Code', 'ja': 'Claude Code \u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8', 'pt': 'Claude Code subagente', 'ru': '\u0421\u0443\u0431\u0430\u0433\u0435\u043D\u0442 Claude Code', 'zh': 'Claude Code \u5B50\u667A\u80FD\u4F53' },
|
||||
description: { 'de': 'Delegieren Sie eine Aufgabe an Claude Code, indem Sie dessen native Authentifizierung und Einstellungen verwenden.', 'en': 'Delegate one task to Claude Code using its native authentication and settings.', 'es': 'Delegue una tarea a Claude Code utilizando su autenticaci\u00F3n y configuraci\u00F3n nativas.', 'fr': 'D\u00E9l\u00E9guez une t\u00E2che \u00E0 Claude Code \u00E0 l\u2019aide de son authentification et de ses param\u00E8tres natifs.', 'ja': 'Claude Code \u306E\u30CD\u30A4\u30C6\u30A3\u30D6\u306E\u8A8D\u8A3C\u3068\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u5358\u72EC\u306E\u30BF\u30B9\u30AF\u3092\u59D4\u6D3E\u3057\u307E\u3059\u3002', 'pt': 'Delegue uma tarefa a Claude Code usando sua autentica\u00E7\u00E3o e configura\u00E7\u00F5es nativas.', 'ru': '\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0439\u0442\u0435 \u043E\u0434\u043D\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 Claude Code, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u0435\u0433\u043E \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0443\u044E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438.', 'zh': '\u4F7F\u7528 Claude Code \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' },
|
||||
icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSIxNC45ODkzIiB5PSIxNS4xODc3IiB3aWR0aD0iMTIuMjM2NSIgaGVpZ2h0PSIxMi4yMzY1IiByeD0iMiIgZmlsbD0idXJsKCNkc2hfcGx1Z2luX2FydF9SMGEpIiBmaWxsLW9wYWNpdHk9IjAuOCI+PC9yZWN0PjxyZWN0IHg9IjguODcxMDkiIHk9IjkuMDY5NyIgd2lkdGg9IjEyLjIzNjUiIGhlaWdodD0iMTIuMjM2NSIgcng9IjIiIGZpbGw9InVybCgjZHNoX3BsdWdpbl9hcnRfUjBiKSIgZmlsbC1vcGFjaXR5PSIwLjgiPjwvcmVjdD48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYSIgeDE9IjIxLjEwNzUiIHkxPSIxNS4xODc3IiB4Mj0iMjEuMTA3NSIgeTI9IjI3LjQyNDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjNDVFN0E0Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDU5MDlEIj48L3N0b3A+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYiIgeDE9IjE0Ljk4OTQiIHkxPSI5LjA2OTciIHgyPSIxNC45ODk0IiB5Mj0iMjEuMzA2MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2OUI5RkYiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMjRERTIiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4K',
|
||||
},
|
||||
},
|
||||
{
|
||||
packageName: '@deepseek-ai/dsh-subagent-codex',
|
||||
meta: {
|
||||
title: { 'en': 'Codex subagent', 'ja': 'Codex \u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8', 'zh': 'Codex \u5B50\u667A\u80FD\u4F53' },
|
||||
description: { 'en': 'Delegate one task to Codex using its native authentication and settings.', 'ja': 'Codex \u306E\u30CD\u30A4\u30C6\u30A3\u30D6\u306E\u8A8D\u8A3C\u3068\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u5358\u72EC\u306E\u30BF\u30B9\u30AF\u3092\u59D4\u6D3E\u3057\u307E\u3059\u3002', 'zh': '\u4F7F\u7528 Codex \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' },
|
||||
title: { 'de': 'Codex-Subagent', 'en': 'Codex subagent', 'es': 'Subagente Codex', 'fr': 'Sous-agent Codex', 'ja': 'Codex \u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8', 'pt': 'Codex subagente', 'ru': '\u0421\u0443\u0431\u0430\u0433\u0435\u043D\u0442 Codex', 'zh': 'Codex \u5B50\u667A\u80FD\u4F53' },
|
||||
description: { 'de': 'Delegieren Sie eine Aufgabe an Codex, indem Sie dessen native Authentifizierung und Einstellungen verwenden.', 'en': 'Delegate one task to Codex using its native authentication and settings.', 'es': 'Delegue una tarea a Codex utilizando su autenticaci\u00F3n y configuraci\u00F3n nativas.', 'fr': 'D\u00E9l\u00E9guez une t\u00E2che \u00E0 Codex \u00E0 l\u2019aide de son authentification et de ses param\u00E8tres natifs.', 'ja': 'Codex \u306E\u30CD\u30A4\u30C6\u30A3\u30D6\u306E\u8A8D\u8A3C\u3068\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u5358\u72EC\u306E\u30BF\u30B9\u30AF\u3092\u59D4\u6D3E\u3057\u307E\u3059\u3002', 'pt': 'Delegue uma tarefa a Codex usando sua autentica\u00E7\u00E3o e configura\u00E7\u00F5es nativas.', 'ru': '\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0439\u0442\u0435 \u043E\u0434\u043D\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 Codex, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u0435\u0433\u043E \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0443\u044E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438.', 'zh': '\u4F7F\u7528 Codex \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' },
|
||||
icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSIxNC45ODkzIiB5PSIxNS4xODc3IiB3aWR0aD0iMTIuMjM2NSIgaGVpZ2h0PSIxMi4yMzY1IiByeD0iMiIgZmlsbD0idXJsKCNkc2hfcGx1Z2luX2FydF9SMGEpIiBmaWxsLW9wYWNpdHk9IjAuOCI+PC9yZWN0PjxyZWN0IHg9IjguODcxMDkiIHk9IjkuMDY5NyIgd2lkdGg9IjEyLjIzNjUiIGhlaWdodD0iMTIuMjM2NSIgcng9IjIiIGZpbGw9InVybCgjZHNoX3BsdWdpbl9hcnRfUjBiKSIgZmlsbC1vcGFjaXR5PSIwLjgiPjwvcmVjdD48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYSIgeDE9IjIxLjEwNzUiIHkxPSIxNS4xODc3IiB4Mj0iMjEuMTA3NSIgeTI9IjI3LjQyNDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjNDVFN0E0Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDU5MDlEIj48L3N0b3A+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYiIgeDE9IjE0Ljk4OTQiIHkxPSI5LjA2OTciIHgyPSIxNC45ODk0IiB5Mj0iMjEuMzA2MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2OUI5RkYiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMjRERTIiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4K',
|
||||
},
|
||||
},
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Plug-in-Verwaltungsdienst",
|
||||
"description": "Verwalten Sie Plug-Ins und Plug-In-Pakete in der aktuell ausgeführten Konfiguration und unterstützen Sie Installation, Entfernung, Starten und Stoppen."
|
||||
}
|
||||
}
|
||||
Loaded 100 of 1616 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user