diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml index ad36e6494c..79e0844b03 100644 --- a/apps/desktop/README.i18n.yaml +++ b/apps/desktop/README.i18n.yaml @@ -33,8 +33,8 @@ en: 372297005b57a08b zh: 074a635ac17e4362 /deepseek-harness-desktop/installation-ownership: - en: b3cf09d7c901d727 - zh: 2ec34045a201d8e9 + en: ae0384d699f55cea + zh: ffb879b1d4b08bae /deepseek-harness-desktop/installation-ownership/runtime-and-plugin-activation: en: a1a47b09f4a72ba4 zh: 7b1cf27f0b72cf31 diff --git a/apps/desktop/README.md b/apps/desktop/README.md index b48f281820..64d9383f82 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -150,7 +150,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. 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 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. Windows and macOS relay native fullscreen transitions and the state after each page load to the renderer, so overlays can adapt their caption clearance. diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md index 2cd7db2ae2..c01ee79e40 100644 --- a/apps/desktop/README.zh.md +++ b/apps/desktop/README.zh.md @@ -150,7 +150,7 @@ Electron 拥有 `$DSH_HOME/profiles/desktop`。其 `dependencies` 包含 pnpm 升级文案完整展示版本号(包括预发布后缀),不额外添加 v 或 V。无可用更新时,弹窗标题显示检查结果,正文显示当前版本。 -Electron 根据应用语言选择类型化的英文、中文或日文 shell 文案,并回退到英文。macOS 应用包通过 `CFBundleLocalizations` 声明支持英语、简体中文和日语,让 macOS 根据用户的首选语言匹配初始应用语言。主界面仍优先使用已保存的 Client UI 语言偏好。在 Windows 上,主文档的语言会更新桌面菜单、恢复与更新提示。仓库 Client UI i18n 检查覆盖桌面端源码。 +Electron 根据应用语言选择类型化的英文、中文或日文 shell 文案,并回退到英文。macOS 应用包通过 `CFBundleLocalizations` 声明支持英语、简体中文和日语,让 macOS 根据用户的首选语言匹配初始应用语言。主界面仍优先使用已保存的 Client UI 语言偏好。 Windows NSIS 安装器在 `installer/locales/` 下按语言保存独立 JSON 资源;打包从这些文件生成 NSIS 文案和安装器语言清单。英文、简体中文和日语资源的键与格式占位符必须一致,`pnpm run check:i18n` 负责检查。原生安装器测试逐个构建并验证配置中的语言。账户平台页面和引导插图对中文以外的语言使用英文。在 Windows 上,主文档的语言会更新桌面菜单、恢复与更新提示。仓库 Client UI i18n 检查覆盖桌面端源码。 Windows 和 macOS 会在原生全屏切换及每次页面加载后向渲染器同步全屏状态,让浮层调整顶栏避让距离。 diff --git a/apps/desktop/electron-builder.config.d.mts b/apps/desktop/electron-builder.config.d.mts index 45e90a4ae4..2973a6eacc 100644 --- a/apps/desktop/electron-builder.config.d.mts +++ b/apps/desktop/electron-builder.config.d.mts @@ -53,7 +53,7 @@ export interface DesktopElectronBuilderConfig { readonly perMachine: false readonly allowElevation: false readonly allowToChangeInstallationDirectory: false - readonly installerLanguages: readonly ['en_US', 'zh_CN'] + readonly installerLanguages: readonly string[] } readonly beforeBuild: () => Promise readonly beforePack: (context: BeforePackContext) => Promise diff --git a/apps/desktop/installer/locales/en_US.json b/apps/desktop/installer/locales/en_US.json new file mode 100644 index 0000000000..f522ad9b6d --- /dev/null +++ b/apps/desktop/installer/locales/en_US.json @@ -0,0 +1,40 @@ +{ + "nsisLanguage": "ENGLISH", + "strings": { + "INSTALLER_INSTALL": "Install now", + "INSTALLER_FINISH": "Finish", + "INSTALLER_NATIVE_PROGRESS": "Preparing installation… %d%%", + "INSTALLER_PROGRESS_EXTRACT": "Extracting files… %d%%", + "INSTALLER_PROGRESS_COPY": "Installing files… %d%%", + "INSTALLER_PROGRESS_REGISTER": "Finishing installation… %d%%", + "INSTALLER_PROGRESS_CLEAN": "Cleaning temporary files… %d%%", + "INSTALLER_CHOOSE_PATH": "Choose location", + "INSTALLER_BROWSE": "Browse", + "INSTALLER_LAUNCH": "Launch now", + "INSTALLER_LAUNCH_FAILED": "DeepSeek Harness could not be launched. Retry, or clear Launch now and close the installer.", + "INSTALLER_UI_ERROR": "The installer could not initialize its window. Close it and try again.", + "INSTALLER_THEME_ERROR": "Use /THEME=auto, /THEME=light or /THEME=dark.", + "INSTALLER_FAILED": "Installation did not finish. Close this installer and retry. If the problem persists, download the installer again.", + "INSTALLER_RUNNING": "DeepSeek Harness is running. Quit it from the system tray and try again.", + "INSTALLER_DIRECTORY_FAILED": "The installation directory could not be replaced.", + "INSTALLER_DIRECTORY_HINT": "Check access to the installation directory and close programs using its files, then run the installer again. Copy the error details if the problem persists.", + "INSTALLER_DIRECTORY_RESTORE_HINT": "The previous installation could not be restored. Keep the backup directory shown in the error details and contact support before installing again.", + "INSTALLER_PATH_INVALID": "Choose a full local folder path. Drive roots, system folders, links and special characters are not supported.", + "INSTALLER_PATH_OWNERSHIP": "Choose an empty folder or the registered DeepSeek Harness installation folder.", + "INSTALLER_PATH_WRITABLE": "This location is not writable. Choose a folder available to the current user.", + "INSTALLER_DISK_SPACE": "There is not enough free disk space. Choose another location.", + "INSTALLER_PER_USER": "This installer supports the current user only. Uninstall the existing all-users installation first.", + "INSTALLER_EXTRACT_FAILED": "The application files could not be extracted.", + "INSTALLER_EXTRACT_HINT": "Security software may have blocked a file, or the disk may be full. Close this installer and try again. If it keeps failing, send us the error details below.", + "INSTALLER_EXTRACT_COPY": "Copy error details", + "INSTALLER_EXTRACT_EXPAND": "Show details", + "INSTALLER_EXTRACT_COLLAPSE": "Hide details", + "INSTALLER_EXTRACT_SAVED": "The full report was saved to %s", + "INSTALLER_EXTRACT_UNSAVED": "The full report could not be saved. Use Copy error details to keep it.", + "INSTALLER_EXTRACT_COPIED": "Error details were copied to the clipboard." + }, + "uninstaller": { + "welcome": "Welcome", + "finished": "has been uninstalled" + } +} diff --git a/apps/desktop/installer/locales/ja_JP.json b/apps/desktop/installer/locales/ja_JP.json new file mode 100644 index 0000000000..ee614789c5 --- /dev/null +++ b/apps/desktop/installer/locales/ja_JP.json @@ -0,0 +1,40 @@ +{ + "nsisLanguage": "JAPANESE", + "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": "アンインストールされました" + } +} diff --git a/apps/desktop/installer/locales/zh_CN.json b/apps/desktop/installer/locales/zh_CN.json new file mode 100644 index 0000000000..e3f40f13be --- /dev/null +++ b/apps/desktop/installer/locales/zh_CN.json @@ -0,0 +1,40 @@ +{ + "nsisLanguage": "SIMPCHINESE", + "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": "已从你" + } +} diff --git a/apps/desktop/installer/strings.nsh b/apps/desktop/installer/strings.nsh deleted file mode 100644 index a1ac41b418..0000000000 --- a/apps/desktop/installer/strings.nsh +++ /dev/null @@ -1,63 +0,0 @@ -; NSIS owns installer localization independently of the Electron application locale. -LangString INSTALLER_INSTALL ${LANG_ENGLISH} "Install now" -LangString INSTALLER_INSTALL ${LANG_SIMPCHINESE} "立即安装" -LangString INSTALLER_FINISH ${LANG_ENGLISH} "Finish" -LangString INSTALLER_FINISH ${LANG_SIMPCHINESE} "完成" -LangString INSTALLER_NATIVE_PROGRESS ${LANG_ENGLISH} "Preparing installation… %d%%" -LangString INSTALLER_NATIVE_PROGRESS ${LANG_SIMPCHINESE} "正在准备安装… %d%%" -LangString INSTALLER_PROGRESS_EXTRACT ${LANG_ENGLISH} "Extracting files… %d%%" -LangString INSTALLER_PROGRESS_EXTRACT ${LANG_SIMPCHINESE} "正在解压文件… %d%%" -LangString INSTALLER_PROGRESS_COPY ${LANG_ENGLISH} "Installing files… %d%%" -LangString INSTALLER_PROGRESS_COPY ${LANG_SIMPCHINESE} "正在安装文件… %d%%" -LangString INSTALLER_PROGRESS_REGISTER ${LANG_ENGLISH} "Finishing installation… %d%%" -LangString INSTALLER_PROGRESS_REGISTER ${LANG_SIMPCHINESE} "正在完成安装… %d%%" -LangString INSTALLER_PROGRESS_CLEAN ${LANG_ENGLISH} "Cleaning temporary files… %d%%" -LangString INSTALLER_PROGRESS_CLEAN ${LANG_SIMPCHINESE} "正在清理临时文件… %d%%" -LangString INSTALLER_CHOOSE_PATH ${LANG_ENGLISH} "Choose location" -LangString INSTALLER_CHOOSE_PATH ${LANG_SIMPCHINESE} "选择安装位置" -LangString INSTALLER_BROWSE ${LANG_ENGLISH} "Browse" -LangString INSTALLER_BROWSE ${LANG_SIMPCHINESE} "选择" -LangString INSTALLER_LAUNCH ${LANG_ENGLISH} "Launch now" -LangString INSTALLER_LAUNCH ${LANG_SIMPCHINESE} "立即启动" -LangString INSTALLER_LAUNCH_FAILED ${LANG_ENGLISH} "DeepSeek Harness could not be launched. Retry, or clear Launch now and close the installer." -LangString INSTALLER_LAUNCH_FAILED ${LANG_SIMPCHINESE} "无法启动 DeepSeek Harness。请重试,或取消勾选立即启动后关闭安装程序。" -LangString INSTALLER_UI_ERROR ${LANG_ENGLISH} "The installer could not initialize its window. Close it and try again." -LangString INSTALLER_UI_ERROR ${LANG_SIMPCHINESE} "无法初始化安装窗口,请关闭后重试。" -LangString INSTALLER_THEME_ERROR ${LANG_ENGLISH} "Use /THEME=auto, /THEME=light or /THEME=dark." -LangString INSTALLER_THEME_ERROR ${LANG_SIMPCHINESE} "主题参数须为 /THEME=auto、/THEME=light 或 /THEME=dark。" -LangString INSTALLER_FAILED ${LANG_ENGLISH} "Installation did not finish. Close this installer and retry. If the problem persists, download the installer again." -LangString INSTALLER_FAILED ${LANG_SIMPCHINESE} "安装未完成,请关闭安装程序后重试。如仍然失败,请重新下载安装包。" -LangString INSTALLER_RUNNING ${LANG_ENGLISH} "DeepSeek Harness is running. Quit it from the system tray and try again." -LangString INSTALLER_RUNNING ${LANG_SIMPCHINESE} "DeepSeek Harness 正在运行,请先在系统托盘中退出应用后重试。" -LangString INSTALLER_DIRECTORY_FAILED ${LANG_ENGLISH} "The installation directory could not be replaced." -LangString INSTALLER_DIRECTORY_FAILED ${LANG_SIMPCHINESE} "无法替换安装目录。" -LangString INSTALLER_DIRECTORY_HINT ${LANG_ENGLISH} "Check access to the installation directory and close programs using its files, then run the installer again. Copy the error details if the problem persists." -LangString INSTALLER_DIRECTORY_HINT ${LANG_SIMPCHINESE} "请检查安装目录的访问权限,关闭占用其中内容的程序后重新运行安装器。如仍失败,请复制错误详情。" -LangString INSTALLER_DIRECTORY_RESTORE_HINT ${LANG_ENGLISH} "The previous installation could not be restored. Keep the backup directory shown in the error details and contact support before installing again." -LangString INSTALLER_DIRECTORY_RESTORE_HINT ${LANG_SIMPCHINESE} "未能恢复原安装目录。请保留错误详情中列出的备份目录,联系支持人员后再安装。" -LangString INSTALLER_PATH_INVALID ${LANG_ENGLISH} "Choose a full local folder path. Drive roots, system folders, links and special characters are not supported." -LangString INSTALLER_PATH_INVALID ${LANG_SIMPCHINESE} "请选择本地磁盘上的完整文件夹路径,不能使用磁盘根目录、系统目录、链接目录或包含特殊字符的路径。" -LangString INSTALLER_PATH_OWNERSHIP ${LANG_ENGLISH} "Choose an empty folder or the registered DeepSeek Harness installation folder." -LangString INSTALLER_PATH_OWNERSHIP ${LANG_SIMPCHINESE} "请选择空文件夹,或 DeepSeek Harness 原来的安装目录。" -LangString INSTALLER_PATH_WRITABLE ${LANG_ENGLISH} "This location is not writable. Choose a folder available to the current user." -LangString INSTALLER_PATH_WRITABLE ${LANG_SIMPCHINESE} "无法写入此位置。请选择当前用户可写入的文件夹;安装程序不会申请管理员权限。" -LangString INSTALLER_DISK_SPACE ${LANG_ENGLISH} "There is not enough free disk space. Choose another location." -LangString INSTALLER_DISK_SPACE ${LANG_SIMPCHINESE} "此磁盘的可用空间不足,请选择其他位置。" -LangString INSTALLER_PER_USER ${LANG_ENGLISH} "This installer supports the current user only. Uninstall the existing all-users installation first." -LangString INSTALLER_PER_USER ${LANG_SIMPCHINESE} "此安装程序仅支持当前用户。请先卸载已有的所有用户安装版本。" -LangString INSTALLER_EXTRACT_FAILED ${LANG_ENGLISH} "The application files could not be extracted." -LangString INSTALLER_EXTRACT_FAILED ${LANG_SIMPCHINESE} "无法解压应用程序文件。" -LangString INSTALLER_EXTRACT_HINT ${LANG_ENGLISH} "Security software may have blocked a file, or the disk may be full. Close this installer and try again. If it keeps failing, send us the error details below." -LangString INSTALLER_EXTRACT_HINT ${LANG_SIMPCHINESE} "可能是安全软件拦截了文件,或磁盘空间不足。请关闭安装程序后重试;如仍然失败,请将下方错误信息发送给我们。" -LangString INSTALLER_EXTRACT_COPY ${LANG_ENGLISH} "Copy error details" -LangString INSTALLER_EXTRACT_COPY ${LANG_SIMPCHINESE} "复制错误信息" -LangString INSTALLER_EXTRACT_EXPAND ${LANG_ENGLISH} "Show details" -LangString INSTALLER_EXTRACT_EXPAND ${LANG_SIMPCHINESE} "显示详情" -LangString INSTALLER_EXTRACT_COLLAPSE ${LANG_ENGLISH} "Hide details" -LangString INSTALLER_EXTRACT_COLLAPSE ${LANG_SIMPCHINESE} "隐藏详情" -LangString INSTALLER_EXTRACT_SAVED ${LANG_ENGLISH} "The full report was saved to %s" -LangString INSTALLER_EXTRACT_SAVED ${LANG_SIMPCHINESE} "完整错误报告已保存到 %s" -LangString INSTALLER_EXTRACT_UNSAVED ${LANG_ENGLISH} "The full report could not be saved. Use Copy error details to keep it." -LangString INSTALLER_EXTRACT_UNSAVED ${LANG_SIMPCHINESE} "无法保存完整错误报告,请使用“复制错误信息”保留。" -LangString INSTALLER_EXTRACT_COPIED ${LANG_ENGLISH} "Error details were copied to the clipboard." -LangString INSTALLER_EXTRACT_COPIED ${LANG_SIMPCHINESE} "错误信息已复制到剪贴板。" diff --git a/apps/desktop/scripts/electron-builder-config.mjs b/apps/desktop/scripts/electron-builder-config.mjs index 7f225bebf7..4444b68ae1 100644 --- a/apps/desktop/scripts/electron-builder-config.mjs +++ b/apps/desktop/scripts/electron-builder-config.mjs @@ -1,7 +1,8 @@ +import { readInstallerLocales, renderInstallerStrings } from './installer-locales.mjs' import { officePackageDirectories } from '../../../scripts/libreoffice-packages.mjs' import { X509Certificate } from 'node:crypto' import { readFileSync } from 'node:fs' -import { readFile } from 'node:fs/promises' +import { readFile, writeFile } from 'node:fs/promises' import { join, relative, sep } from 'node:path' import { fileURLToPath } from 'node:url' import { execFile } from 'node:child_process' @@ -129,6 +130,7 @@ export function createElectronBuilderConfig( '-OutputDirectory', join(buildPaths.root, 'installer-ui')], { env: scrubWindowsSigningEnvironment(env), windowsHide: true, }) + await writeFile(join(buildPaths.root, 'installer-ui', 'strings.nsh'), renderInstallerStrings(readInstallerLocales()), 'utf8') if (windowsSigner !== undefined) { await windowsSigner({ path: join(buildPaths.root, 'installer-ui', 'window-frame.dll'), hash: 'sha256', isNest: false }) } @@ -262,7 +264,7 @@ export function createElectronBuilderConfig( perMachine: false, allowElevation: false, allowToChangeInstallationDirectory: false, - installerLanguages: ['en_US', 'zh_CN'], + installerLanguages: readInstallerLocales().map(locale => locale.id), differentialPackage: true, }, detectUpdateChannel: false, diff --git a/apps/desktop/scripts/installer-locales.d.mts b/apps/desktop/scripts/installer-locales.d.mts new file mode 100644 index 0000000000..1cb1b8ad93 --- /dev/null +++ b/apps/desktop/scripts/installer-locales.d.mts @@ -0,0 +1,25 @@ +/** One installer language's compiler identifier, UI strings and NSIS Modern UI test expectations. */ +export interface InstallerLocale { + /** electron-builder language and resource filename without its suffix. */ + id: string + /** NSIS LANG_ constant suffix. */ + nsisLanguage: string + /** Custom installer messages, with Windows printf placeholders preserved. */ + strings: Record + /** Substrings of the upstream Modern UI uninstaller's welcome and finished pages. */ + uninstaller: Record +} + +/** + * Read complete per-language JSON resources and reject inconsistent keys or placeholders. + * @param directory - Resource directory, defaulting to Desktop installer/locales. + * @returns Validated resources, ordered by filename. + */ +export function readInstallerLocales(directory?: string): InstallerLocale[] + +/** + * Generate NSIS LangString declarations from validated resources. + * @param locales - All configured languages or one isolated native-test language. + * @returns UTF-8 NSIS source with literal text escaped. + */ +export function renderInstallerStrings(locales: InstallerLocale[]): string diff --git a/apps/desktop/scripts/installer-locales.mjs b/apps/desktop/scripts/installer-locales.mjs new file mode 100644 index 0000000000..f9f9b55138 --- /dev/null +++ b/apps/desktop/scripts/installer-locales.mjs @@ -0,0 +1,75 @@ +/** Per-language JSON resources shared by NSIS packaging, native UI tests and the i18n check. */ +import { readFileSync, readdirSync } from 'node:fs' +import { fileURLToPath } from 'node:url' + +const defaultDirectory = fileURLToPath(new URL('../installer/locales/', import.meta.url)) + +/** + * Read and validate installer translations before generating compiler input. + * @param {string} directory - Directory containing one JSON file per installer language. + * @returns {{id: string, nsisLanguage: string, strings: Record, uninstaller: Record}[]} Complete language resources. + */ +export function readInstallerLocales(directory = defaultDirectory) { + const locales = readdirSync(directory).filter(name => name.endsWith('.json')).sort().map(name => { + if (!/^[a-z]{2}_[A-Z]{2}\.json$/u.test(name)) throw new Error(`${name}: invalid installer language filename`) + /** @type {unknown} */ + const resource = JSON.parse(readFileSync(`${directory}/${name}`, 'utf8')) + if (typeof resource !== 'object' || resource === null || !('nsisLanguage' in resource) + || typeof resource.nsisLanguage !== 'string' || !/^[A-Z]+$/u.test(resource.nsisLanguage)) { + throw new Error(`${name}: invalid NSIS language identifier`) + } + /** @param {unknown} value - Parsed JSON dictionary. @returns {Record} Nonempty text values. */ + const dictionary = (value) => { + if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error(`${name}: expected text dictionary`) + /** @type {Record} */ + const result = {} + for (const [key, text] of Object.entries(value)) { + if (typeof text !== 'string' || text.trim() === '') throw new Error(`${name}: ${key} must be nonempty text`) + result[key] = text + } + return result + } + const strings = dictionary('strings' in resource ? resource.strings : undefined) + if (Object.keys(strings).some(key => !/^INSTALLER_[A-Z_]+$/u.test(key))) throw new Error(`${name}: invalid installer string key`) + 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']) { + if (!locales.some(locale => locale.id === id)) throw new Error(`installer locales: missing ${id}.json`) + } + const english = locales.find(locale => locale.id === 'en_US') + if (!english || Object.keys(english.strings).length === 0) throw new Error('installer locales: missing English strings') + if (Object.keys(english.uninstaller).sort().join(',') !== 'finished,welcome') throw new Error('installer locales: expected uninstaller welcome and finished text') + const languages = new Set() + for (const locale of locales) { + if (languages.has(locale.nsisLanguage)) throw new Error(`${locale.id}: duplicate NSIS language ${locale.nsisLanguage}`) + languages.add(locale.nsisLanguage) + for (const field of ['strings', 'uninstaller']) { + const expected = english[field] + 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`) + } + } + } + return locales +} + +/** + * Generate guarded NSIS LangString declarations from validated JSON resources. + * @param {ReturnType} locales - Resources for all languages or one isolated native-test build. + * @returns {string} UTF-8 NSIS source, with literal dollar signs, quotes and line breaks escaped. + */ +export function renderInstallerStrings(locales) { + const escape = (/** @type {string} */ text) => text.replace(/\$|"|\r|\n/gu, character => ({ '$': '$$', '"': '$\\"', '\r': '$\\r', '\n': '$\\n' })[character]) + return '; Generated from installer/locales/*.json.\n' + locales.map(locale => + `!ifdef LANG_${locale.nsisLanguage}\n` + Object.entries(locale.strings).map(([key, text]) => + `LangString ${key} \${LANG_${locale.nsisLanguage}} "${escape(text)}"\n`).join('') + '!endif\n').join('') +} + +if (import.meta.main) { + const locales = readInstallerLocales() + console.log(`verify-installer-locales: ${locales.length} languages have matching keys and format placeholders.`) +} diff --git a/apps/desktop/scripts/installer.nsh b/apps/desktop/scripts/installer.nsh index 5961c071ba..43c6a4c7d7 100644 --- a/apps/desktop/scripts/installer.nsh +++ b/apps/desktop/scripts/installer.nsh @@ -9,7 +9,7 @@ ManifestDPIAware true !endif !macro customHeader - !define /ifndef INSTALLER_STRINGS_FILE "${INSTALLER_SOURCE_DIR}\strings.nsh" + !define /ifndef INSTALLER_STRINGS_FILE "${INSTALLER_BUILD_DIR}\strings.nsh" !include "${INSTALLER_STRINGS_FILE}" !ifdef BUILD_UNINSTALLER BrandingText " " diff --git a/apps/desktop/scripts/test-windows-installer.mjs b/apps/desktop/scripts/test-windows-installer.mjs index 27c6381a95..1cb7a5aae6 100644 --- a/apps/desktop/scripts/test-windows-installer.mjs +++ b/apps/desktop/scripts/test-windows-installer.mjs @@ -1,4 +1,5 @@ /** Builds an isolated native payload through the production NSIS configuration and exercises its UI. */ +import { readInstallerLocales, renderInstallerStrings } from './installer-locales.mjs' import { execFile } from 'node:child_process' import { randomUUID } from 'node:crypto' import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises' @@ -107,8 +108,8 @@ SectionEnd const compiler = await getMakeNsisPath() await execute(compiler.path, ['/V2', payloadSource], { ...childOptions, env: { ...childOptions.env, ...compiler.env } }) if (sign) await sign({ path: join(payload, `${productName}.exe`), hash: 'sha256', isNest: false }) - const sourceStrings = await readFile(join(appRoot, 'installer', 'strings.nsh'), 'utf8') - for (const language of ['en_US', 'zh_CN']) { + for (const locale of readInstallerLocales()) { + const language = locale.id const config = createElectronBuilderConfig() if (sign) { config.win.forceCodeSigning = true @@ -117,9 +118,7 @@ SectionEnd const languageOutput = join(output, language) await mkdir(languageOutput) const strings = join(languageOutput, 'strings.nsh') - const languageId = language === 'en_US' ? 'ENGLISH' : 'SIMPCHINESE' - await writeFile(strings, sourceStrings.split('\n').filter((line) => - !line.startsWith('LangString ') || line.includes(`\${LANG_${languageId}}`)).join('\n')) + await writeFile(strings, renderInstallerStrings([locale]), 'utf8') const include = join(languageOutput, 'include.nsh') await writeFile(include, `!define INSTALLER_BUILD_DIR "${join(output, 'ui')}"\n!define INSTALLER_STRINGS_FILE "${strings}"\n!include "${join(appRoot, 'scripts', 'installer.nsh')}"\n`) await build({ projectDir: appRoot, prepackaged: payload, targets: Platform.WINDOWS.createTarget(['nsis'], Arch.x64), publish: 'never', @@ -132,7 +131,7 @@ SectionEnd join(appRoot, 'tests', uninstallOnly ? 'windows-uninstall-smoke.ps1' : 'windows-installer-smoke.ps1'), '-Installer', join(languageOutput, 'installer-test.exe'), '-ProductName', productName, '-RegistryKey', guid, '-OutputDirectory', languageOutput, - ...uninstallOnly ? ['-Language', languageId, '-PackageName', packageName] : []], childOptions) + '-Language', language, ...uninstallOnly ? ['-PackageName', packageName] : []], childOptions) process.stdout.write(`${language}\n${result.stdout}`) } succeeded = true diff --git a/apps/desktop/tests/installer-locales.spec.ts b/apps/desktop/tests/installer-locales.spec.ts new file mode 100644 index 0000000000..4dea51a414 --- /dev/null +++ b/apps/desktop/tests/installer-locales.spec.ts @@ -0,0 +1,56 @@ +/** Per-language installer resources feed both the packaging language list and the NSIS compiler. */ +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { expect, it, onTestFinished } from 'vitest' +import { readInstallerLocales, renderInstallerStrings } from '../scripts/installer-locales.mjs' + +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']) { + writeFileSync(join(directory, `${id}.json`), readFileSync(new URL(`../installer/locales/${id}.json`, import.meta.url))) + } + return directory +} + +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']) + 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) + 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) => { + const directory = fixture() + rmSync(join(directory, `${id}.json`)) + expect(() => readInstallerLocales(directory)).toThrow(`missing ${id}.json`) +}) + +it.each([ + ['missing key', (resource: ReturnType[number]) => { delete resource.strings.INSTALLER_INSTALL }, 'keys differ'], + ['extra key', (resource: ReturnType[number]) => { resource.strings.INSTALLER_EXTRA = 'extra' }, 'keys differ'], + ['empty text', (resource: ReturnType[number]) => { resource.strings.INSTALLER_INSTALL = '' }, 'nonempty text'], + ['changed placeholder', (resource: ReturnType[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%s%%' }, 'format placeholders'], + ['missing percent escape', (resource: ReturnType[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%d%' }, 'format placeholders'], + ['extra format specifier', (resource: ReturnType[number]) => { resource.strings.INSTALLER_NATIVE_PROGRESS = '%d%% %q' }, 'format placeholders'], + ['duplicate language', (resource: ReturnType[number]) => { resource.nsisLanguage = 'ENGLISH' }, 'duplicate NSIS language'], + ['invalid compiler token', (resource: ReturnType[number]) => { resource.nsisLanguage = 'JA\n!error' }, 'invalid NSIS language'], +])('rejects %s', (_name, mutate, diagnostic) => { + const directory = fixture() + const resource = readInstallerLocales(directory).find(locale => locale.id === 'ja_JP')! + mutate(resource) + writeFileSync(join(directory, 'ja_JP.json'), JSON.stringify(resource)) + expect(() => readInstallerLocales(directory)).toThrow(diagnostic) +}) + +it('escapes literal NSIS syntax without changing translated text', () => { + const locale = readInstallerLocales()[0]! + expect(renderInstallerStrings([{ ...locale, strings: { INSTALLER_INSTALL: '"$name"\nnext\rline' } }])) + .toContain('"$\\"$$name$\\"$\\nnext$\\rline"') +}) diff --git a/apps/desktop/tests/installer-packaging.spec.ts b/apps/desktop/tests/installer-packaging.spec.ts index d971bb262d..57da6058df 100644 --- a/apps/desktop/tests/installer-packaging.spec.ts +++ b/apps/desktop/tests/installer-packaging.spec.ts @@ -5,13 +5,17 @@ import { AppInfo, Packager } from 'app-builder-lib' import { expandMacro } from 'app-builder-lib/out/util/macroExpander.js' import { describe, expect, it, vi } from 'vitest' -const { execute } = vi.hoisted(() => ({ execute: vi.fn(async () => undefined) })) +const { execute, write } = vi.hoisted(() => ({ execute: vi.fn(async () => undefined), write: vi.fn(async () => undefined) })) vi.mock('node:child_process', async (importOriginal) => { const original = await importOriginal() const { promisify } = await import('node:util') return { ...original, execFile: Object.assign(vi.fn(), { [promisify.custom]: execute }) } }) +vi.mock('node:fs/promises', async importOriginal => ({ + ...await importOriginal(), writeFile: write, +})) + describe('installer preparation preserves application dependencies', () => { it.each(['win32', 'darwin'] as const)('rejects a missing production policy before signing on %s', async (platform) => { const { createElectronBuilderConfig } = await import('../scripts/electron-builder-config.mjs') @@ -22,6 +26,7 @@ describe('installer preparation preserves application dependencies', () => { }) it.each(['win32', 'darwin'] as const)('preserves installer metadata and dependency ownership on %s', async (platform) => { execute.mockClear() + write.mockClear() const env = { DSH_DESKTOP_APP_ID: 'com.example.installer', DSH_DESKTOP_MANDATORY_UPDATE_TEST_ORIGIN: 'https://policy.example.com', @@ -49,6 +54,7 @@ describe('installer preparation preserves application dependencies', () => { expect(appInfo.copyright).toBe(`Copyright © ${new Date().getFullYear()} DeepSeek Harness`) if (platform === 'win32') { expect(expandMacro(config.nsis.uninstallDisplayName, null, appInfo, {}, false)).toBe('DeepSeek Harness') + expect(config.nsis.installerLanguages).toEqual(['en_US', 'ja_JP', 'zh_CN']) } const aboutIcon = config.extraResources.find(resource => resource.to === 'icon.png') expect(aboutIcon).toBeDefined() @@ -71,6 +77,11 @@ describe('installer preparation preserves application dependencies', () => { await packager.installAppDependencies(process.platform === 'win32' ? Platform.LINUX : Platform.WINDOWS, Arch.x64) expect(packager.areNodeModulesHandledExternally).toBe(false) expect(execute).toHaveBeenCalledTimes(platform === 'win32' ? 1 : 0) + expect(write).toHaveBeenCalledTimes(platform === 'win32' ? 1 : 0) + if (platform === 'win32') { + expect(write).toHaveBeenCalledWith(expect.stringMatching(/installer-ui[\\/]strings\.nsh$/u), + expect.stringContaining('LangString INSTALLER_INSTALL ${LANG_JAPANESE}'), 'utf8') + } } finally { vi.unstubAllEnvs() vi.restoreAllMocks() diff --git a/apps/desktop/tests/windows-installer-smoke.ps1 b/apps/desktop/tests/windows-installer-smoke.ps1 index 796f885bb4..ea917263b9 100644 --- a/apps/desktop/tests/windows-installer-smoke.ps1 +++ b/apps/desktop/tests/windows-installer-smoke.ps1 @@ -2,7 +2,7 @@ [CmdletBinding()] param([Parameter(Mandatory)][string]$Installer, [Parameter(Mandatory)][string]$ProductName, [Parameter(Mandatory)][string]$RegistryKey, - [Parameter(Mandatory)][string]$OutputDirectory) + [Parameter(Mandatory)][string]$OutputDirectory, [Parameter(Mandatory)][string]$Language) $ErrorActionPreference = 'Stop' . (Join-Path $PSScriptRoot 'windows-installer-ui.ps1') Add-Type -AssemblyName UIAutomationClient, UIAutomationTypes @@ -14,12 +14,8 @@ $uninstaller = Join-Path $installPath ('Uninstall ' + $ProductName + '.exe') $processes = [Collections.Generic.List[Diagnostics.Process]]::new() $results = [Collections.Generic.List[string]]::new() $expected = Get-Content (Join-Path $PSScriptRoot 'expected/windows-installer.json') -Raw | ConvertFrom-Json -$localizedCopy = @{ ENGLISH = @{}; SIMPCHINESE = @{} } -Get-Content (Join-Path $PSScriptRoot '../installer/strings.nsh') -Encoding UTF8 | ForEach-Object { - if ($_ -match '^LangString (INSTALLER_\w+) \$\{LANG_(ENGLISH|SIMPCHINESE)\} "(.*)"$') { - $localizedCopy[$Matches[2]][$Matches[1]] = $Matches[3] - } -} +$resource = Get-Content (Join-Path $PSScriptRoot "../installer/locales/$Language.json") -Encoding UTF8 -Raw | ConvertFrom-Json +$localizedCopy = @{ $Language = $resource.strings } function Wait-Control([Diagnostics.Process]$Process, [string]$Text, [switch]$Dialog) { $timer = [Diagnostics.Stopwatch]::StartNew() do { diff --git a/apps/desktop/tests/windows-uninstall-smoke.ps1 b/apps/desktop/tests/windows-uninstall-smoke.ps1 index 556dace4da..dad594f7c3 100644 --- a/apps/desktop/tests/windows-uninstall-smoke.ps1 +++ b/apps/desktop/tests/windows-uninstall-smoke.ps1 @@ -4,6 +4,7 @@ param([Parameter(Mandatory)][string]$Installer, [Parameter(Mandatory)][string]$P [Parameter(Mandatory)][string]$RegistryKey, [Parameter(Mandatory)][string]$OutputDirectory, [Parameter(Mandatory)][string]$Language, [Parameter(Mandatory)][string]$PackageName) $ErrorActionPreference = 'Stop' +$copy = (Get-Content (Join-Path $PSScriptRoot "../installer/locales/$Language.json") -Encoding UTF8 -Raw | ConvertFrom-Json).uninstaller $OutputDirectory = [IO.Path]::GetFullPath($OutputDirectory) . (Join-Path $PSScriptRoot 'windows-installer-ui.ps1') [InstallerCapture]::Initialize() @@ -69,12 +70,12 @@ try { if ($mode -eq 'home-inside') { $env:DSH_HOME = Join-Path $userDataPath 'home' } else { Remove-Item Env:DSH_HOME -ErrorAction SilentlyContinue } $process = Start-Process -FilePath $uninstaller -ArgumentList $arguments -PassThru -WindowStyle ($(if ($mode -eq 'interactive') { 'Normal' } else { 'Hidden' })) if ($mode -eq 'interactive') { - $welcomeText = if ($Language -eq 'ENGLISH') { 'Welcome' } else { -join [char[]]@(0x6B22, 0x8FCE) } + $welcomeText = $copy.welcome $welcome = Wait-Text $welcomeText $window = [InstallerCapture]::TopLevel($welcome) [void][InstallerCapture]::SaveNative($window, (Join-Path $OutputDirectory 'uninstall-welcome.png'), $false) [InstallerCapture]::Click([InstallerCapture]::GetDlgItem($window, 1)) - $finishedText = if ($Language -eq 'ENGLISH') { 'has been uninstalled' } else { -join [char[]]@(0x5DF2, 0x4ECE, 0x4F60) } + $finishedText = $copy.finished [void](Wait-Text $finishedText) [InstallerCapture]::Click([InstallerCapture]::GetDlgItem($window, 1)) } diff --git a/apps/web/tests/desktop-locale.e2e.ts b/apps/web/tests/desktop-locale.e2e.ts index 71590956e9..cc43d697f1 100644 --- a/apps/web/tests/desktop-locale.e2e.ts +++ b/apps/web/tests/desktop-locale.e2e.ts @@ -103,14 +103,17 @@ describe.skipIf(MODE === 'record')('web e2e: native and Client locale preference await jaDialog.getByRole('button', { name: '日本語', exact: true }).waitFor() await expect.poll(() => reported).toEqual(['ja']) expect(await page.evaluate(() => document.documentElement.lang)).toBe('ja') + await page.setViewportSize({ width: 390, height: 844 }) const overflows = (): Promise => jaDialog.evaluate((dialog) => { - const containers = [dialog, ...dialog.querySelectorAll('*')] + // The narrow navigation strip scrolls horizontally by design; inspect the panel and section content. + const options = dialog.lastElementChild! + const containers = [dialog, options, ...options.querySelectorAll('*')] .filter(element => element === dialog || ['auto', 'scroll'].includes(getComputedStyle(element).overflowX)) return containers.filter(element => element.clientWidth > 0 && element.scrollWidth > element.clientWidth + 1).length }) await expect.poll(overflows).toBe(0) await jaDialog.evaluate((dialog) => { - const options = dialog.querySelector('nav')!.nextElementSibling!.lastElementChild! + const options = dialog.lastElementChild! const probe = document.createElement('div') probe.dataset.localeOverflowProbe = '' probe.style.width = '2000px' diff --git a/apps/web/tests/expected/cot-translation-paid/paid-choices.expected.md b/apps/web/tests/expected/cot-translation-paid/paid-choices.expected.md index 52a6f4effb..a141beff7b 100644 --- a/apps/web/tests/expected/cot-translation-paid/paid-choices.expected.md +++ b/apps/web/tests/expected/cot-translation-paid/paid-choices.expected.md @@ -76,10 +76,11 @@ - text: 共 2 个 · 2 运行中 - list: - listitem: - - text: "@deepseek-ai/dsh-experimental-translator Machine translation with reusable Session results" + - text: 翻译服务 提供机器翻译,并复用会话中已保存的翻译结果。 - code: translator + - code: "@deepseek-ai/dsh-experimental-translator" - text: 运行中 - - switch "启用组件 @deepseek-ai/dsh-experimental-translator" [checked] + - switch "启用组件 翻译服务" [checked] - listitem: - text: 思考过程机器翻译 将展开的思考内容机器翻译为其他语言。 - code: cot-translation diff --git a/apps/web/tests/expected/cot-translation/preferences.expected.md b/apps/web/tests/expected/cot-translation/preferences.expected.md index 9e63c22442..6404a2d8bc 100644 --- a/apps/web/tests/expected/cot-translation/preferences.expected.md +++ b/apps/web/tests/expected/cot-translation/preferences.expected.md @@ -73,10 +73,11 @@ - text: 共 2 个 · 2 运行中 - list: - listitem: - - text: "@deepseek-ai/dsh-experimental-translator Machine translation with reusable Session results" + - text: 翻译服务 提供机器翻译,并复用会话中已保存的翻译结果。 - code: translator + - code: "@deepseek-ai/dsh-experimental-translator" - text: 运行中 - - switch "启用组件 @deepseek-ai/dsh-experimental-translator" [checked] + - switch "启用组件 翻译服务" [checked] - listitem: - text: 思考过程机器翻译 将展开的思考内容机器翻译为其他语言。 - code: cot-translation diff --git a/apps/web/tests/expected/japanese-plugin-metadata/card.expected.md b/apps/web/tests/expected/japanese-plugin-metadata/card.expected.md new file mode 100644 index 0000000000..0fa58e0c23 --- /dev/null +++ b/apps/web/tests/expected/japanese-plugin-metadata/card.expected.md @@ -0,0 +1,5 @@ +- listitem: + - button "自動認可レビューを表示": 自動認可レビュー + - text: 実験的 各ツール呼び出しの前にモデルが認可を判断する、自動認可レビュー権限モードを提供します。 + - status + - switch "自動認可レビューを有効化" diff --git a/apps/web/tests/japanese-plugin-metadata.e2e.ts b/apps/web/tests/japanese-plugin-metadata.e2e.ts new file mode 100644 index 0000000000..fb56add4f1 --- /dev/null +++ b/apps/web/tests/japanese-plugin-metadata.e2e.ts @@ -0,0 +1,32 @@ +/** Japanese package resources reach the real plugin manager through Host metadata and Client locale resolution. */ +import { fileURLToPath } from 'node:url' +import { chromium, type Browser } from 'playwright' +import { expect, it, onTestFailed, onTestFinished } from 'vitest' +import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts' +import { saveFailureShot } from './support.ts' + +it('displays Japanese plugin titles and descriptions from package metadata', async () => { + 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: 'ja-JP', viewport: { width: 1440, height: 960 } }) + const tripwire = watchConsole(page) + onTestFailed(() => saveFailureShot(page, 'japanese-plugin-metadata')) + await page.goto(scaffold.authenticatedUrl) + await page.getByRole('button', { name: 'プラグイン', exact: true }).click() + const panel = page.locator('[data-plugin-panel]') + const title = panel.getByRole('button', { name: '自動認可レビューを表示', exact: true }) + await title.waitFor() + const card = title.locator('xpath=ancestor::li') + await card.getByText('各ツール呼び出しの前にモデルが認可を判断する、自動認可レビュー権限モードを提供します。', { exact: true }).waitFor() + const expected = fileURLToPath(new URL('./expected/japanese-plugin-metadata/card.expected.md', import.meta.url)) + await compareOrRefreshGolden(expected, + await captureStableAria(page, '[data-plugin-panel] li:has(button[aria-label="自動認可レビューを表示"])', scaffold.workspaceCwd), webSnapshotMode()) + expect(tripwire.warnings).toEqual([]) + expect(tripwire.pageErrors).toEqual([]) +}) diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 5937dffb0e..1647c9c331 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -23,6 +23,7 @@ // this client-registered project must not also hold them (one program // cannot see both sides of the cordis Context merges). "exclude": [ + "tests/japanese-plugin-metadata.e2e.ts", "tests/rich-text-quotes.e2e.ts", "tests/hover-input.e2e.ts", "tests/collapse-timing.e2e.ts", diff --git a/docs/cookbook/adding-a-package.i18n.yaml b/docs/cookbook/adding-a-package.i18n.yaml index de5eb1d67b..2f95205489 100644 --- a/docs/cookbook/adding-a-package.i18n.yaml +++ b/docs/cookbook/adding-a-package.i18n.yaml @@ -21,8 +21,8 @@ en: 0894bd9f35430753 zh: 2d28090e71134edd /cookbook-adding-a-workspace-package/5-add-optional-plugin-display-metadata: - en: cb799f5d561dd917 - zh: 7739af36ef8ffb3f + en: 1238eaea376391d1 + zh: c7e606f95d8980bf /cookbook-adding-a-workspace-package/6-verify: en: 80c7fb90b1175aae zh: 2ba37962dbc57299 diff --git a/docs/cookbook/adding-a-package.md b/docs/cookbook/adding-a-package.md index d5dc6454a8..2950932479 100644 --- a/docs/cookbook/adding-a-package.md +++ b/docs/cookbook/adding-a-package.md @@ -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)). Missing files or fields permit fallback, while malformed JSON or invalid fields produce a per-plugin diagnostic. +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//` 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: diff --git a/docs/cookbook/adding-a-package.zh.md b/docs/cookbook/adding-a-package.zh.md index 4ef55c443a..6ab95ce3b3 100644 --- a/docs/cookbook/adding-a-package.zh.md +++ b/docs/cookbook/adding-a-package.zh.md @@ -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 损坏或字段无效时显示单插件诊断。 +语言文件统一放在 `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//` 下的子路径资源使用相同检查。英文描述面向产品用户说明可见行为,并以句末标点结束。运行 `pnpm run check:i18n` 检查 JSON 元数据和 UI 字典完整性;JSON 检查也接入 `check:all`、CI 静态检查和 hygiene。 各字段先独立回退,再按页面规则格式化技术名称;回退优先经过现有 locale 语言链: diff --git a/package.json b/package.json index 47fe01320e..cf59063403 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,9 @@ "verify-package-dependencies": "tsx scripts/verify-package-dependencies.ts", "verify-npm-install-layout": "tsx scripts/verify-npm-install-layout.ts", "verify-client-packages": "tsx scripts/verify-client-packages.ts", + "check:i18n": "tsx scripts/run-gates.ts i18n", + "verify-installer-locales": "node apps/desktop/scripts/installer-locales.mjs", + "verify-locale-metadata": "tsx scripts/verify-locale-metadata.ts", "verify-client-ui-i18n": "tsx scripts/verify-client-ui-i18n.ts", "verify-client-route-resolution": "tsx scripts/verify-client-route-resolution.ts", "verify-no-bare-dispatcher": "tsx scripts/verify-no-bare-dispatcher.ts", diff --git a/packages/acp/acp/locale/en.json b/packages/acp/acp/locale/en.json new file mode 100644 index 0000000000..25540ee89e --- /dev/null +++ b/packages/acp/acp/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP server", + "description": "Run agents through JSON-RPC over standard input and output for automation." + } +} diff --git a/packages/acp/acp/locale/ja.json b/packages/acp/acp/locale/ja.json new file mode 100644 index 0000000000..1c72f6b070 --- /dev/null +++ b/packages/acp/acp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP サーバー", + "description": "JSON-RPC の標準入出力でエージェントを操作する、自動化専用の ACP サーバーです。" + } +} diff --git a/packages/acp/acp/locale/zh.json b/packages/acp/acp/locale/zh.json new file mode 100644 index 0000000000..0bbafae706 --- /dev/null +++ b/packages/acp/acp/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP 服务", + "description": "通过 JSON-RPC 标准输入输出驱动智能体,仅供自动化使用。" + } +} diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 791d834e43..a41bc2ec1f 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/api/account-controller/locale/ja.json b/packages/api/account-controller/locale/ja.json new file mode 100644 index 0000000000..7ffcd54dda --- /dev/null +++ b/packages/api/account-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "アカウント操作 API", + "description": "認証済みクライアントにアカウント操作機能を提供します。" + } +} diff --git a/packages/api/gateway/locale/ja.json b/packages/api/gateway/locale/ja.json new file mode 100644 index 0000000000..ae75c9ec8d --- /dev/null +++ b/packages/api/gateway/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "リモート呼び出しゲートウェイ", + "description": "クライアントからの API 呼び出しを受け取り、対応するサービスに転送します。" + } +} diff --git a/packages/api/job-controller/locale/ja.json b/packages/api/job-controller/locale/ja.json new file mode 100644 index 0000000000..58ebbdc52d --- /dev/null +++ b/packages/api/job-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "バックグラウンドタスク監視 API", + "description": "バックグラウンドタスクの状態と出力をクライアントに継続して提供します。" + } +} diff --git a/packages/api/remote-access/locale/en.json b/packages/api/remote-access/locale/en.json new file mode 100644 index 0000000000..c1f4dd693d --- /dev/null +++ b/packages/api/remote-access/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Remote access control", + "description": "Control which methods non-owner connections can access and retain permission snapshots for each connection." + } +} diff --git a/packages/api/remote-access/locale/ja.json b/packages/api/remote-access/locale/ja.json new file mode 100644 index 0000000000..b9973a570d --- /dev/null +++ b/packages/api/remote-access/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "リモートアクセス制御", + "description": "所有者以外の接続にメソッド単位のリモートアクセス制御と接続ごとの権限スナップショットを提供します。" + } +} diff --git a/packages/api/remote-access/locale/zh.json b/packages/api/remote-access/locale/zh.json new file mode 100644 index 0000000000..6993164ed5 --- /dev/null +++ b/packages/api/remote-access/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "远程访问控制", + "description": "为非所有者连接提供方法级远程访问控制和各连接的权限快照。" + } +} diff --git a/packages/api/remote-access/package.json b/packages/api/remote-access/package.json index 92529d65f0..bcc911aee9 100644 --- a/packages/api/remote-access/package.json +++ b/packages/api/remote-access/package.json @@ -35,6 +35,7 @@ "default": "./lib/typert.remote-client.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "dsh": { @@ -54,6 +55,7 @@ "watch": "tsdown --watch" }, "files": [ + "locale/*.json", "lib/index.js", "lib/client.js", "lib/types/**/*.js", diff --git a/packages/api/remotes/locale/ja.json b/packages/api/remotes/locale/ja.json new file mode 100644 index 0000000000..e056d27da6 --- /dev/null +++ b/packages/api/remotes/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "クライアント API 一覧", + "description": "アプリがクライアントに公開するサーバー機能をまとめます。" + } +} diff --git a/packages/api/session-controller/locale/ja.json b/packages/api/session-controller/locale/ja.json new file mode 100644 index 0000000000..d544936282 --- /dev/null +++ b/packages/api/session-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション制御 API", + "description": "セッションの読み取り、実行制御、状態更新をクライアントに提供します。" + } +} diff --git a/packages/api/settings-controller/locale/ja.json b/packages/api/settings-controller/locale/ja.json new file mode 100644 index 0000000000..fdfd677b69 --- /dev/null +++ b/packages/api/settings-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "設定読み書き API", + "description": "各種設定の読み取りと変更をクライアントに提供します。" + } +} diff --git a/packages/api/terminal-controller/locale/ja.json b/packages/api/terminal-controller/locale/ja.json new file mode 100644 index 0000000000..3d43b1153b --- /dev/null +++ b/packages/api/terminal-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ターミナル制御 API", + "description": "セッションのターミナルの作成、入力、読み取り、復元をクライアントに提供します。" + } +} diff --git a/packages/api/workspace-controller/locale/ja.json b/packages/api/workspace-controller/locale/ja.json new file mode 100644 index 0000000000..58942ab8cb --- /dev/null +++ b/packages/api/workspace-controller/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース制御 API", + "description": "ワークスペース操作と、再接続後に復元できる状態をクライアントに提供します。" + } +} diff --git a/packages/api/workspace-files/locale/ja.json b/packages/api/workspace-files/locale/ja.json new file mode 100644 index 0000000000..f0ce58e299 --- /dev/null +++ b/packages/api/workspace-files/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペースファイル API", + "description": "ワークスペース内のファイルの読み取り、ディレクトリ一覧、ファイル情報の更新を提供します。" + } +} diff --git a/packages/attachment/attachment-local/locale/ja.json b/packages/attachment/attachment-local/locale/ja.json new file mode 100644 index 0000000000..c0d8452c20 --- /dev/null +++ b/packages/attachment/attachment-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル添付ファイル保存", + "description": "セッション内の画像などの添付ファイルを保存し、コンテンツ ID で読み取ります。" + } +} diff --git a/packages/boot/app-boot/src/official-bundles.generated.ts b/packages/boot/app-boot/src/official-bundles.generated.ts index 1fffe43c5e..cb993e2d24 100644 --- a/packages/boot/app-boot/src/official-bundles.generated.ts +++ b/packages/boot/app-boot/src/official-bundles.generated.ts @@ -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', 'zh': 'Claude Code \u5B50\u667A\u80FD\u4F53' }, - description: { 'en': 'Delegate one task to Claude Code using its native authentication and settings.', 'zh': '\u4F7F\u7528 Claude Code \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' }, + 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' }, icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSIxNC45ODkzIiB5PSIxNS4xODc3IiB3aWR0aD0iMTIuMjM2NSIgaGVpZ2h0PSIxMi4yMzY1IiByeD0iMiIgZmlsbD0idXJsKCNkc2hfcGx1Z2luX2FydF9SMGEpIiBmaWxsLW9wYWNpdHk9IjAuOCI+PC9yZWN0PjxyZWN0IHg9IjguODcxMDkiIHk9IjkuMDY5NyIgd2lkdGg9IjEyLjIzNjUiIGhlaWdodD0iMTIuMjM2NSIgcng9IjIiIGZpbGw9InVybCgjZHNoX3BsdWdpbl9hcnRfUjBiKSIgZmlsbC1vcGFjaXR5PSIwLjgiPjwvcmVjdD48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYSIgeDE9IjIxLjEwNzUiIHkxPSIxNS4xODc3IiB4Mj0iMjEuMTA3NSIgeTI9IjI3LjQyNDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjNDVFN0E0Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDU5MDlEIj48L3N0b3A+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYiIgeDE9IjE0Ljk4OTQiIHkxPSI5LjA2OTciIHgyPSIxNC45ODk0IiB5Mj0iMjEuMzA2MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2OUI5RkYiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMjRERTIiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4K', }, }, { packageName: '@deepseek-ai/dsh-subagent-codex', meta: { - title: { 'en': 'Codex subagent', 'zh': 'Codex \u5B50\u667A\u80FD\u4F53' }, - description: { 'en': 'Delegate one task to Codex using its native authentication and settings.', 'zh': '\u4F7F\u7528 Codex \u539F\u751F\u8BA4\u8BC1\u548C\u8BBE\u7F6E\u59D4\u6D3E\u5355\u4E2A\u4EFB\u52A1\u3002' }, + 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' }, icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSIxNC45ODkzIiB5PSIxNS4xODc3IiB3aWR0aD0iMTIuMjM2NSIgaGVpZ2h0PSIxMi4yMzY1IiByeD0iMiIgZmlsbD0idXJsKCNkc2hfcGx1Z2luX2FydF9SMGEpIiBmaWxsLW9wYWNpdHk9IjAuOCI+PC9yZWN0PjxyZWN0IHg9IjguODcxMDkiIHk9IjkuMDY5NyIgd2lkdGg9IjEyLjIzNjUiIGhlaWdodD0iMTIuMjM2NSIgcng9IjIiIGZpbGw9InVybCgjZHNoX3BsdWdpbl9hcnRfUjBiKSIgZmlsbC1vcGFjaXR5PSIwLjgiPjwvcmVjdD48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYSIgeDE9IjIxLjEwNzUiIHkxPSIxNS4xODc3IiB4Mj0iMjEuMTA3NSIgeTI9IjI3LjQyNDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjNDVFN0E0Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDU5MDlEIj48L3N0b3A+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImRzaF9wbHVnaW5fYXJ0X1IwYiIgeDE9IjE0Ljk4OTQiIHkxPSI5LjA2OTciIHgyPSIxNC45ODk0IiB5Mj0iMjEuMzA2MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2OUI5RkYiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMjRERTIiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4K', }, }, diff --git a/packages/boot/config-editor/locale/ja.json b/packages/boot/config-editor/locale/ja.json new file mode 100644 index 0000000000..98ce00f39c --- /dev/null +++ b/packages/boot/config-editor/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン設定編集", + "description": "プラグイン設定を保存し、変更を現在の実行設定に適用します。" + } +} diff --git a/packages/boot/hmr/locale/ja.json b/packages/boot/hmr/locale/ja.json new file mode 100644 index 0000000000..4b8d181949 --- /dev/null +++ b/packages/boot/hmr/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグインホットリロード", + "description": "アプリの実行中にプラグインのコードと設定を再読み込みします。" + } +} diff --git a/packages/boot/plugin-manager/locale/ja.json b/packages/boot/plugin-manager/locale/ja.json new file mode 100644 index 0000000000..4d13a06aa4 --- /dev/null +++ b/packages/boot/plugin-manager/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン管理サービス", + "description": "現在の実行設定にあるプラグインとパッケージを管理し、インストール、削除、有効化、無効化を行います。" + } +} diff --git a/packages/boot/plugin-manager/locale/tools/ja.json b/packages/boot/plugin-manager/locale/tools/ja.json new file mode 100644 index 0000000000..836f03de7b --- /dev/null +++ b/packages/boot/plugin-manager/locale/tools/ja.json @@ -0,0 +1,5 @@ +{ + "meta": { + "title": "プラグイン管理ツール" + } +} diff --git a/packages/boot/plugin-market/locale/en.json b/packages/boot/plugin-market/locale/en.json new file mode 100644 index 0000000000..5baedc3f0f --- /dev/null +++ b/packages/boot/plugin-market/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Plugin market indexes", + "description": "Manage configured market indexes for plugin discovery and the plugin_market tool." + } +} diff --git a/packages/boot/plugin-market/locale/ja.json b/packages/boot/plugin-market/locale/ja.json new file mode 100644 index 0000000000..150534a797 --- /dev/null +++ b/packages/boot/plugin-market/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグインマーケットのインデックス", + "description": "プラグイン検索ページと plugin_market ツールで使う、設定済みのマーケットのインデックスを管理します。" + } +} diff --git a/packages/boot/plugin-market/locale/zh.json b/packages/boot/plugin-market/locale/zh.json new file mode 100644 index 0000000000..5113c07601 --- /dev/null +++ b/packages/boot/plugin-market/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "插件市场索引", + "description": "为插件发现页面和 plugin_market 工具管理已配置的市场索引。" + } +} diff --git a/packages/boot/plugin-market/package.json b/packages/boot/plugin-market/package.json index b10dc50c84..c4ed435d1a 100644 --- a/packages/boot/plugin-market/package.json +++ b/packages/boot/plugin-market/package.json @@ -35,9 +35,11 @@ "default": "./lib/typert.remote-client.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/worker.cjs", "lib/types/**/*.js", diff --git a/packages/browser-use/browser-use/locale/en.json b/packages/browser-use/browser-use/locale/en.json new file mode 100644 index 0000000000..fb0661bfcc --- /dev/null +++ b/packages/browser-use/browser-use/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Browser provider registry", + "description": "Register browser automation providers by name, with one provider per name." + } +} diff --git a/packages/browser-use/browser-use/locale/ja.json b/packages/browser-use/browser-use/locale/ja.json new file mode 100644 index 0000000000..c73fe239c7 --- /dev/null +++ b/packages/browser-use/browser-use/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ブラウザ提供元レジストリ", + "description": "名前ごとに排他的なブラウザ操作の提供元を登録します。" + } +} diff --git a/packages/browser-use/browser-use/locale/zh.json b/packages/browser-use/browser-use/locale/zh.json new file mode 100644 index 0000000000..cf64929a96 --- /dev/null +++ b/packages/browser-use/browser-use/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "浏览器服务注册", + "description": "按名称注册独占的浏览器操作提供方。" + } +} diff --git a/packages/browser-use/browser-use/package.json b/packages/browser-use/browser-use/package.json index 9ca8203092..ec5aa9392c 100644 --- a/packages/browser-use/browser-use/package.json +++ b/packages/browser-use/browser-use/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./brand": { "types": "./lib/types/brand.d.ts", @@ -26,6 +27,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.js", "lib/types/**/*.d.ts" diff --git a/packages/bundle/acp-app/locale/en.json b/packages/bundle/acp-app/locale/en.json new file mode 100644 index 0000000000..8de14398c9 --- /dev/null +++ b/packages/bundle/acp-app/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP profile", + "description": "Provide automation-only ACP communication and process lifecycle management over dsh-base." + } +} diff --git a/packages/bundle/acp-app/locale/ja.json b/packages/bundle/acp-app/locale/ja.json new file mode 100644 index 0000000000..c7c4dddca4 --- /dev/null +++ b/packages/bundle/acp-app/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP プロファイル", + "description": "dsh-base 上で自動化専用の ACP 通信とプロセスのライフサイクルを提供します。" + } +} diff --git a/packages/bundle/acp-app/locale/zh.json b/packages/bundle/acp-app/locale/zh.json new file mode 100644 index 0000000000..b6e8c68267 --- /dev/null +++ b/packages/bundle/acp-app/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP 运行配置", + "description": "在 dsh-base 上提供自动化专用的 ACP 通信与进程生命周期。" + } +} diff --git a/packages/bundle/acp-app/package.json b/packages/bundle/acp-app/package.json index 752eeca7fa..86dc1bc2c5 100644 --- a/packages/bundle/acp-app/package.json +++ b/packages/bundle/acp-app/package.json @@ -20,9 +20,11 @@ }, "./cordis.patch.yml": "./cordis.patch.yml", "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "cordis.patch.yml", "lib/types/**/*.d.ts" diff --git a/packages/bundle/headless/locale/en.json b/packages/bundle/headless/locale/en.json new file mode 100644 index 0000000000..8d393f6587 --- /dev/null +++ b/packages/bundle/headless/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Headless profile", + "description": "Run a single task directly with the core Agent/Session runner over dsh-base, without a Host, HTTP, or browser layer." + } +} diff --git a/packages/bundle/headless/locale/ja.json b/packages/bundle/headless/locale/ja.json new file mode 100644 index 0000000000..969cad80f8 --- /dev/null +++ b/packages/bundle/headless/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ヘッドレスプロファイル", + "description": "dsh-base 上でコアの Agent/Session ランナーを直接使用して単一タスクを実行し、Host、HTTP、ブラウザのレイヤーを含みません。" + } +} diff --git a/packages/bundle/headless/locale/zh.json b/packages/bundle/headless/locale/zh.json new file mode 100644 index 0000000000..b8ac8ba1f1 --- /dev/null +++ b/packages/bundle/headless/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "无界面运行配置", + "description": "在 dsh-base 上直接使用核心 Agent/Session 执行单次任务,不包含 Host、HTTP 或浏览器层。" + } +} diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 2247beae8e..cf07060097 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -24,9 +24,11 @@ }, "./cordis.patch.yml": "./cordis.patch.yml", "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/startup.js", "cordis.patch.yml", diff --git a/packages/bundle/sdk-app/locale/en.json b/packages/bundle/sdk-app/locale/en.json new file mode 100644 index 0000000000..8cdffe0ac7 --- /dev/null +++ b/packages/bundle/sdk-app/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK profile", + "description": "Provide JSON-RPC over standard input and output and manage the process lifecycle over dsh-base." + } +} diff --git a/packages/bundle/sdk-app/locale/ja.json b/packages/bundle/sdk-app/locale/ja.json new file mode 100644 index 0000000000..5a031b72c4 --- /dev/null +++ b/packages/bundle/sdk-app/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK プロファイル", + "description": "dsh-base 上で標準入出力の JSON-RPC とプロセスのライフサイクル管理を提供します。" + } +} diff --git a/packages/bundle/sdk-app/locale/zh.json b/packages/bundle/sdk-app/locale/zh.json new file mode 100644 index 0000000000..cf1e7a7abc --- /dev/null +++ b/packages/bundle/sdk-app/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK 运行配置", + "description": "在 dsh-base 上提供标准输入输出 JSON-RPC 与进程生命周期管理。" + } +} diff --git a/packages/bundle/sdk-app/package.json b/packages/bundle/sdk-app/package.json index b1473dbe19..ee90ed6fb4 100644 --- a/packages/bundle/sdk-app/package.json +++ b/packages/bundle/sdk-app/package.json @@ -20,9 +20,11 @@ }, "./cordis.patch.yml": "./cordis.patch.yml", "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "cordis.patch.yml", "lib/types/**/*.d.ts" diff --git a/packages/bundle/web-app/locale/ja.json b/packages/bundle/web-app/locale/ja.json new file mode 100644 index 0000000000..5832162037 --- /dev/null +++ b/packages/bundle/web-app/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web アプリ実行サポート", + "description": "フロントエンドのページリソースを提供し、Web アプリに必要な実行設定を接続します。" + } +} diff --git a/packages/bundle/web-app/locale/startup/ja.json b/packages/bundle/web-app/locale/startup/ja.json new file mode 100644 index 0000000000..b920e8bcf5 --- /dev/null +++ b/packages/bundle/web-app/locale/startup/ja.json @@ -0,0 +1,5 @@ +{ + "meta": { + "title": "Web 起動設定" + } +} diff --git a/packages/client/connection/locale/ja.json b/packages/client/connection/locale/ja.json new file mode 100644 index 0000000000..c8a58e1dd1 --- /dev/null +++ b/packages/client/connection/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "クライアント接続", + "description": "認証済みクライアントとの通信を確立し、接続のライフサイクルを管理します。" + } +} diff --git a/packages/client/file-upload/locale/ja.json b/packages/client/file-upload/locale/ja.json new file mode 100644 index 0000000000..98cb69bae0 --- /dev/null +++ b/packages/client/file-upload/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイルアップロード", + "description": "ブラウザ内のファイルを現在のセッションにアップロードし、メッセージやツールで使用できるようにします。" + } +} diff --git a/packages/client/hmr/locale/ja.json b/packages/client/hmr/locale/ja.json new file mode 100644 index 0000000000..50aa6e71ef --- /dev/null +++ b/packages/client/hmr/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web クライアントホット更新", + "description": "ブラウザ内のプラグインを同期し、コードの再ビルド後に関連する UI を更新します。" + } +} diff --git a/packages/client/locale/locale/ja.json b/packages/client/locale/locale/ja.json new file mode 100644 index 0000000000..682eb30601 --- /dev/null +++ b/packages/client/locale/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "表示言語", + "description": "表示言語の設定と各プラグインの翻訳文を管理します。" + } +} diff --git a/packages/client/modules/locale/ja.json b/packages/client/modules/locale/ja.json new file mode 100644 index 0000000000..d6935d5900 --- /dev/null +++ b/packages/client/modules/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "クライアントモジュール読み込み", + "description": "ブラウザのプラグインモジュールと読み込み依存関係を管理します。" + } +} diff --git a/packages/client/product-analytics/locale/ja.json b/packages/client/product-analytics/locale/ja.json new file mode 100644 index 0000000000..280fc6ced3 --- /dev/null +++ b/packages/client/product-analytics/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "デスクトップ利用統計", + "description": "デスクトップの指定された操作イベントを収集し、製品の統計サービスに送信します。" + } +} diff --git a/packages/client/resources/locale/ja.json b/packages/client/resources/locale/ja.json new file mode 100644 index 0000000000..05deefd46f --- /dev/null +++ b/packages/client/resources/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "クライアントリソースサービス", + "description": "ファイルなどのリソースアドレスを、UI が読み取れるコンテンツに解決します。" + } +} diff --git a/packages/client/shortcuts/locale/ja.json b/packages/client/shortcuts/locale/ja.json new file mode 100644 index 0000000000..bf9612d70c --- /dev/null +++ b/packages/client/shortcuts/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ショートカットサービス", + "description": "アプリのショートカットを登録し、キー操作を対応する機能に振り分けます。" + } +} diff --git a/packages/client/ui-agent-preset/locale/ja.json b/packages/client/ui-agent-preset/locale/ja.json new file mode 100644 index 0000000000..6a121a29bd --- /dev/null +++ b/packages/client/ui-agent-preset/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェントプリセット UI", + "description": "現在および新規セッションのエージェントプリセットを選択し、使用するプラグインを編集します。" + } +} diff --git a/packages/client/ui-approval/locale/ja.json b/packages/client/ui-approval/locale/ja.json new file mode 100644 index 0000000000..5ef04937bc --- /dev/null +++ b/packages/client/ui-approval/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "操作承認 UI", + "description": "承認待ちの操作を表示し、ユーザーの選択を実行中のタスクに返します。" + } +} diff --git a/packages/client/ui-attachment/locale/ja.json b/packages/client/ui-attachment/locale/ja.json new file mode 100644 index 0000000000..424a9374ce --- /dev/null +++ b/packages/client/ui-attachment/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "添付ファイル表示", + "description": "メッセージ入力、会話、実行記録に添付ファイルと画像を表示します。" + } +} diff --git a/packages/client/ui-brand-official/locale/ja.json b/packages/client/ui-brand-official/locale/ja.json new file mode 100644 index 0000000000..284a138bce --- /dev/null +++ b/packages/client/ui-brand-official/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek ブランド表示", + "description": "アプリのサイドバーなどに公式ブランドの要素を表示します。" + } +} diff --git a/packages/client/ui-chat/locale/ja.json b/packages/client/ui-chat/locale/ja.json new file mode 100644 index 0000000000..fa28ca688f --- /dev/null +++ b/packages/client/ui-chat/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "チャット表示", + "description": "チャットメッセージ、ツールの内容、関連する詳細を描画します。" + } +} diff --git a/packages/client/ui-commands/locale/ja.json b/packages/client/ui-commands/locale/ja.json new file mode 100644 index 0000000000..8fed66b6fd --- /dev/null +++ b/packages/client/ui-commands/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コマンド選択 UI", + "description": "入力欄にスラッシュコマンドのメニューと関連する操作 UI を提供します。" + } +} diff --git a/packages/client/ui-conversation/locale/ja.json b/packages/client/ui-conversation/locale/ja.json new file mode 100644 index 0000000000..fdd774d0f9 --- /dev/null +++ b/packages/client/ui-conversation/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "会話 UI フレームワーク", + "description": "会話内容、入力欄、メッセージキュー、ビューのナビゲーションを構成します。" + } +} diff --git a/packages/client/ui-conversation/src/client/locales.ts b/packages/client/ui-conversation/src/client/locales.ts index 36edb38e56..cde0c51e72 100644 --- a/packages/client/ui-conversation/src/client/locales.ts +++ b/packages/client/ui-conversation/src/client/locales.ts @@ -1096,9 +1096,9 @@ export const ja = { 'tool.title.glob': 'Glob', 'tool.title.webSearch': '検索', 'tool.title.webFetch': '取得', - 'tool.autoReviewRejected': '自動レビューにより拒否されました', + 'tool.autoReviewRejected': '自動認可レビューにより拒否されました', 'tool.autoReviewNotExecuted': 'ツールは実行されませんでした。理由: {reason}', - 'tool.autoReviewReasonFallback': '自動レビューがこの操作を承認しませんでした', + 'tool.autoReviewReasonFallback': '自動認可レビューがこの操作を承認しませんでした', 'diff.collapseAria': '差分を折りたたむ', 'diff.expandAria': '差分の残り{count}行を表示', 'diff.expandRest': '… 残り{count}行', diff --git a/packages/client/ui-deepseek-model-label-1017/locale/en.json b/packages/client/ui-deepseek-model-label-1017/locale/en.json new file mode 100644 index 0000000000..b4906f27c6 --- /dev/null +++ b/packages/client/ui-deepseek-model-label-1017/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek 1017 model badge", + "description": "Add a temporary 1017 release badge to official DeepSeek Flash model names." + } +} diff --git a/packages/client/ui-deepseek-model-label-1017/locale/ja.json b/packages/client/ui-deepseek-model-label-1017/locale/ja.json new file mode 100644 index 0000000000..3a11249af3 --- /dev/null +++ b/packages/client/ui-deepseek-model-label-1017/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek 1017 モデルバッジ", + "description": "公式 DeepSeek Flash モデルの名前に、一時的な 1017 リリースバッジを表示します。" + } +} diff --git a/packages/client/ui-deepseek-model-label-1017/locale/zh.json b/packages/client/ui-deepseek-model-label-1017/locale/zh.json new file mode 100644 index 0000000000..a8464157af --- /dev/null +++ b/packages/client/ui-deepseek-model-label-1017/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek 1017 模型标记", + "description": "为官方 DeepSeek Flash 模型名称添加临时的 1017 版本标记。" + } +} diff --git a/packages/client/ui-deepseek-model-label-1017/package.json b/packages/client/ui-deepseek-model-label-1017/package.json index e029de87fd..4a44b82db6 100644 --- a/packages/client/ui-deepseek-model-label-1017/package.json +++ b/packages/client/ui-deepseek-model-label-1017/package.json @@ -23,8 +23,8 @@ "default": "./lib/client.js" }, "./src/*": "./src/*", - "./package.json": "./package.json", - "./locale/*.json": "./locale/*.json" + "./locale/*.json": "./locale/*.json", + "./package.json": "./package.json" }, "dsh": { "client": { diff --git a/packages/client/ui-deliverables/locale/ja.json b/packages/client/ui-deliverables/locale/ja.json new file mode 100644 index 0000000000..15bb5cd7e6 --- /dev/null +++ b/packages/client/ui-deliverables/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイル変更と成果物の表示", + "description": "変更されたファイル、内容の比較、成果物ファイルへの入口を表示します。" + } +} diff --git a/packages/client/ui-directory-picker-browse/locale/ja.json b/packages/client/ui-directory-picker-browse/locale/ja.json new file mode 100644 index 0000000000..1e654b55ed --- /dev/null +++ b/packages/client/ui-directory-picker-browse/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "アプリ内ディレクトリ選択 UI", + "description": "アプリ内でワークスペースのディレクトリを参照、作成、選択します。" + } +} diff --git a/packages/client/ui-directory-picker-native/locale/ja.json b/packages/client/ui-directory-picker-native/locale/ja.json new file mode 100644 index 0000000000..e4ab3af037 --- /dev/null +++ b/packages/client/ui-directory-picker-native/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "システムディレクトリ選択 UI", + "description": "ワークスペースの選択操作をシステムのディレクトリ選択ダイアログに接続します。" + } +} diff --git a/packages/client/ui-entry-customization/locale/ja.json b/packages/client/ui-entry-customization/locale/ja.json new file mode 100644 index 0000000000..b1a0b30128 --- /dev/null +++ b/packages/client/ui-entry-customization/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "UI カスタマイズ", + "description": "左サイドバー、会話ビュー、右サイドバーのプラグイン項目をカスタマイズし、新しいプラグインをすばやく作成します。" + } +} diff --git a/packages/client/ui-goal/locale/ja.json b/packages/client/ui-goal/locale/ja.json new file mode 100644 index 0000000000..fd28df331a --- /dev/null +++ b/packages/client/ui-goal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション目標バー", + "description": "入力欄の上に現在のセッションの目標と状態を表示します。" + } +} diff --git a/packages/client/ui-input-trigger/locale/ja.json b/packages/client/ui-input-trigger/locale/ja.json new file mode 100644 index 0000000000..4a8f8af80f --- /dev/null +++ b/packages/client/ui-input-trigger/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "入力候補サービス", + "description": "入力中の / と @ を認識し、対応する候補を表示して選択できます。" + } +} diff --git a/packages/client/ui-jobs/locale/ja.json b/packages/client/ui-jobs/locale/ja.json new file mode 100644 index 0000000000..29c5699949 --- /dev/null +++ b/packages/client/ui-jobs/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "バックグラウンドタスク UI", + "description": "セッション内でバックグラウンドタスクの一覧、状態、リアルタイム出力を確認します。" + } +} diff --git a/packages/client/ui-layout/locale/ja.json b/packages/client/ui-layout/locale/ja.json new file mode 100644 index 0000000000..4b56f91718 --- /dev/null +++ b/packages/client/ui-layout/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "アプリレイアウト", + "description": "ナビゲーション、会話、サイドパネルを構成し、ドラッグによるレイアウト調整を提供します。" + } +} diff --git a/packages/client/ui-message-feedback/locale/ja.json b/packages/client/ui-message-feedback/locale/ja.json new file mode 100644 index 0000000000..22260213e1 --- /dev/null +++ b/packages/client/ui-message-feedback/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "メッセージフィードバック UI", + "description": "回答の評価ボタンとセッションのフィードバックダイアログを提供します。" + } +} diff --git a/packages/client/ui-model-selection/locale/ja.json b/packages/client/ui-model-selection/locale/ja.json new file mode 100644 index 0000000000..e0bc4f6b8a --- /dev/null +++ b/packages/client/ui-model-selection/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "モデル選択 UI", + "description": "利用可能なモデルを確認し、現在のセッションで使用するモデルを切り替えます。" + } +} diff --git a/packages/client/ui-open-in-app/locale/ja.json b/packages/client/ui-open-in-app/locale/ja.json new file mode 100644 index 0000000000..55c6f40aaa --- /dev/null +++ b/packages/client/ui-open-in-app/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "外部アプリで開く UI", + "description": "セッションと文書プレビューに「別のアプリで開く」操作を提供します。" + } +} diff --git a/packages/client/ui-permission-presets/locale/ja.json b/packages/client/ui-permission-presets/locale/ja.json new file mode 100644 index 0000000000..21031f2ac0 --- /dev/null +++ b/packages/client/ui-permission-presets/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "権限モード UI", + "description": "新規セッションのデフォルト権限を設定し、現在のセッションの権限モードを切り替えます。" + } +} diff --git a/packages/client/ui-permission-presets/src/client/locales.ts b/packages/client/ui-permission-presets/src/client/locales.ts index 0c3b2ed852..792c1d5605 100644 --- a/packages/client/ui-permission-presets/src/client/locales.ts +++ b/packages/client/ui-permission-presets/src/client/locales.ts @@ -111,11 +111,11 @@ export const accessJa = { 'confirm.acknowledge': 'リスクを理解し、続行します', 'confirm.cancel': 'キャンセル', 'confirm.enable': 'フルアクセスを有効にする', - 'auto.label': '自動レビュー', + 'auto.label': '自動認可レビュー', 'auto.badge': 'EXP', 'auto.description': 'すべてのネイティブツール呼び出しと PTC 内部呼び出しを実験的な同一モデルでレビューしたうえで、サンドボックスなしで実行します。', - 'auto.confirm.title': '自動レビュー(実験的)を有効にしますか?', - 'auto.confirm.description': '自動レビューはサンドボックスなしで実行されます。ネイティブツール呼び出しと PTC 内部呼び出しのたびに、現在のエージェントと同じモデルが許可可否をレビューし、拒否された呼び出しはあなたが承認または却下します。この機能は実験的であり、操作を誤って許可・拒否する可能性があり、追加のトークンを消費します。', + 'auto.confirm.title': '自動認可レビュー(実験的)を有効にしますか?', + 'auto.confirm.description': '自動認可レビューはサンドボックスなしで実行されます。ネイティブツール呼び出しと PTC 内部呼び出しのたびに、現在のエージェントと同じモデルが許可可否をレビューし、拒否された呼び出しはあなたが承認または却下します。この機能は実験的であり、操作を誤って許可・拒否する可能性があり、追加のトークンを消費します。', 'auto.confirm.acknowledge': 'これらのリスクを理解し、続行します', - 'auto.confirm.enable': '自動レビューを有効にする', + 'auto.confirm.enable': '自動認可レビューを有効にする', } satisfies Record diff --git a/packages/client/ui-plan/locale/ja.json b/packages/client/ui-plan/locale/ja.json new file mode 100644 index 0000000000..94dfa7c3a2 --- /dev/null +++ b/packages/client/ui-plan/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "計画レビュー UI", + "description": "計画モードの操作、計画カード、Markdown プレビューを表示します。" + } +} diff --git a/packages/client/ui-plugin-manager/locale/ja.json b/packages/client/ui-plugin-manager/locale/ja.json new file mode 100644 index 0000000000..dea565954e --- /dev/null +++ b/packages/client/ui-plugin-manager/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン管理 UI", + "description": "プラグインパッケージの確認、インストール、有効化、無効化、再試行を行います。" + } +} diff --git a/packages/client/ui-plugin-market/locale/en.json b/packages/client/ui-plugin-market/locale/en.json new file mode 100644 index 0000000000..2c72ab4cec --- /dev/null +++ b/packages/client/ui-plugin-market/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Plugin discovery", + "description": "Browse configured plugin market indexes and install their packages." + } +} diff --git a/packages/client/ui-plugin-market/locale/ja.json b/packages/client/ui-plugin-market/locale/ja.json new file mode 100644 index 0000000000..7411851543 --- /dev/null +++ b/packages/client/ui-plugin-market/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン検索 UI", + "description": "設定済みのプラグインマーケットのインデックスを参照し、プラグインパッケージをインストールします。" + } +} diff --git a/packages/client/ui-plugin-market/locale/zh.json b/packages/client/ui-plugin-market/locale/zh.json new file mode 100644 index 0000000000..4e9e89725f --- /dev/null +++ b/packages/client/ui-plugin-market/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "插件发现界面", + "description": "浏览已配置的插件市场索引,并安装其中的插件包。" + } +} diff --git a/packages/client/ui-plugin-market/package.json b/packages/client/ui-plugin-market/package.json index 383f71c19f..30883a8c70 100644 --- a/packages/client/ui-plugin-market/package.json +++ b/packages/client/ui-plugin-market/package.json @@ -23,6 +23,7 @@ "default": "./lib/client.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "dsh": { @@ -63,6 +64,7 @@ "react-dom": "^18.2.0" }, "files": [ + "locale/*.json", "lib/index.js", "lib/client.js", "lib/types/**/*.d.ts" diff --git a/packages/client/ui-reference/locale/ja.json b/packages/client/ui-reference/locale/ja.json new file mode 100644 index 0000000000..83ba96030f --- /dev/null +++ b/packages/client/ui-reference/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイルとセッション参照 UI", + "description": "入力欄で @ を使ってファイルや他のセッションを参照します。" + } +} diff --git a/packages/client/ui-renderer/locale/ja.json b/packages/client/ui-renderer/locale/ja.json new file mode 100644 index 0000000000..2cc8634c4a --- /dev/null +++ b/packages/client/ui-renderer/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "UI レンダリング", + "description": "各プラグインが提供する UI コンポーネントをアプリに組み込みます。" + } +} diff --git a/packages/client/ui-schedule/locale/ja.json b/packages/client/ui-schedule/locale/ja.json new file mode 100644 index 0000000000..735a198e21 --- /dev/null +++ b/packages/client/ui-schedule/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "タスク UI", + "description": "サイドバーの自動化タスクページと、セッション内のタスクカードやリマインダーを提供します。" + } +} diff --git a/packages/client/ui-secret-mask/locale/ja.json b/packages/client/ui-secret-mask/locale/ja.json new file mode 100644 index 0000000000..2274520f65 --- /dev/null +++ b/packages/client/ui-secret-mask/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "認証情報マスキング", + "description": "送信済みメッセージ内の認識可能なキー、トークン、パスワードを隠します。" + } +} diff --git a/packages/client/ui-session/locale/ja.json b/packages/client/ui-session/locale/ja.json new file mode 100644 index 0000000000..e6c5b345c4 --- /dev/null +++ b/packages/client/ui-session/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション UI 接続", + "description": "セッションの制御と状態を React の UI コンポーネントに接続します。" + } +} diff --git a/packages/client/ui-settings-account/locale/ja.json b/packages/client/ui-settings-account/locale/ja.json new file mode 100644 index 0000000000..0d1008ff33 --- /dev/null +++ b/packages/client/ui-settings-account/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "アカウント設定 UI", + "description": "DeepSeek のログインを管理し、プラットフォームの請求ページを開きます。" + } +} diff --git a/packages/client/ui-settings-agent-loop/locale/ja.json b/packages/client/ui-settings-agent-loop/locale/ja.json new file mode 100644 index 0000000000..6fcf2de33f --- /dev/null +++ b/packages/client/ui-settings-agent-loop/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェント実行設定", + "description": "同時に実行するツール呼び出しの上限を設定します。" + } +} diff --git a/packages/client/ui-settings-general/locale/ja.json b/packages/client/ui-settings-general/locale/ja.json new file mode 100644 index 0000000000..2bf000b8df --- /dev/null +++ b/packages/client/ui-settings-general/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "一般設定と初回案内", + "description": "一般設定、設定ウィンドウの文言、初回利用時の案内を提供します。" + } +} diff --git a/packages/client/ui-settings-models/locale/ja.json b/packages/client/ui-settings-models/locale/ja.json new file mode 100644 index 0000000000..ba9b7434fb --- /dev/null +++ b/packages/client/ui-settings-models/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "モデル設定 UI", + "description": "モデルサービスと接続設定を管理し、関連する案内を提供します。" + } +} diff --git a/packages/client/ui-settings-plugin-inventory/locale/ja.json b/packages/client/ui-settings-plugin-inventory/locale/ja.json new file mode 100644 index 0000000000..8c90e7eb4b --- /dev/null +++ b/packages/client/ui-settings-plugin-inventory/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "組み込みプラグイン一覧 UI", + "description": "設定でグローバルプラグインと各エージェントプリセットのプラグインを確認します。" + } +} diff --git a/packages/client/ui-settings-plugins/locale/ja.json b/packages/client/ui-settings-plugins/locale/ja.json new file mode 100644 index 0000000000..e25c087ef7 --- /dev/null +++ b/packages/client/ui-settings-plugins/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "組み込みプラグイン設定", + "description": "設定内の組み込みプラグイン項目と機能タブを提供します。" + } +} diff --git a/packages/client/ui-settings-session-log/locale/ja.json b/packages/client/ui-settings-session-log/locale/ja.json new file mode 100644 index 0000000000..99350baaca --- /dev/null +++ b/packages/client/ui-settings-session-log/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションログ送信設定", + "description": "DeepSeek 公式モデル API のリクエストと共にセッションログを送信するかを設定します。" + } +} diff --git a/packages/client/ui-settings-shell/locale/ja.json b/packages/client/ui-settings-shell/locale/ja.json new file mode 100644 index 0000000000..a5c27de3b0 --- /dev/null +++ b/packages/client/ui-settings-shell/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コマンド実行設定", + "description": "コマンド実行のタイムアウトと出力長の上限を設定します。" + } +} diff --git a/packages/client/ui-settings-subagent/locale/ja.json b/packages/client/ui-settings-subagent/locale/ja.json new file mode 100644 index 0000000000..98de869882 --- /dev/null +++ b/packages/client/ui-settings-subagent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サブエージェント設定", + "description": "委派の深さ、同時実行数、選択可能なモデルを設定します。" + } +} diff --git a/packages/client/ui-settings-web-search/locale/ja.json b/packages/client/ui-settings-web-search/locale/ja.json new file mode 100644 index 0000000000..d97e381a6e --- /dev/null +++ b/packages/client/ui-settings-web-search/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web 検索設定", + "description": "DeepSeek Web 検索のキー、サービスアドレス、リクエスト予算を設定します。" + } +} diff --git a/packages/client/ui-settings/locale/ja.json b/packages/client/ui-settings/locale/ja.json new file mode 100644 index 0000000000..6348a6de68 --- /dev/null +++ b/packages/client/ui-settings/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "設定 UI フレームワーク", + "description": "設定ページの基本フォームとプラグインの拡張箇所を提供します。" + } +} diff --git a/packages/client/ui-shortcuts/locale/ja.json b/packages/client/ui-shortcuts/locale/ja.json new file mode 100644 index 0000000000..6e10d77a10 --- /dev/null +++ b/packages/client/ui-shortcuts/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ショートカット設定 UI", + "description": "キーボードショートカットを確認、入力、変更します。" + } +} diff --git a/packages/client/ui-sidebar-browser/locale/ja.json b/packages/client/ui-sidebar-browser/locale/ja.json new file mode 100644 index 0000000000..23714cd0b8 --- /dev/null +++ b/packages/client/ui-sidebar-browser/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ブラウザパネル", + "description": "右パネルで Web ページを開いて閲覧します。" + } +} diff --git a/packages/client/ui-sidebar-documentpreview/locale/ja.json b/packages/client/ui-sidebar-documentpreview/locale/ja.json new file mode 100644 index 0000000000..85c730f2f3 --- /dev/null +++ b/packages/client/ui-sidebar-documentpreview/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "文書プレビューパネル", + "description": "右パネルで文書、表計算、コード、画像、Web ページなどをプレビューします。" + } +} diff --git a/packages/client/ui-sidebar-files/locale/ja.json b/packages/client/ui-sidebar-files/locale/ja.json new file mode 100644 index 0000000000..4d1750141a --- /dev/null +++ b/packages/client/ui-sidebar-files/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイルパネル", + "description": "ワークスペースのディレクトリを参照し、右パネルでファイルを開きます。" + } +} diff --git a/packages/client/ui-sidebar-right/locale/ja.json b/packages/client/ui-sidebar-right/locale/ja.json new file mode 100644 index 0000000000..22ac5d2c89 --- /dev/null +++ b/packages/client/ui-sidebar-right/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "右パネル", + "description": "右パネルの開閉状態、内容、ナビゲーションを管理します。" + } +} diff --git a/packages/client/ui-sidebar-terminal/locale/ja.json b/packages/client/ui-sidebar-terminal/locale/ja.json new file mode 100644 index 0000000000..8952fcfe14 --- /dev/null +++ b/packages/client/ui-sidebar-terminal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ターミナルパネル", + "description": "右パネルで対話型のコマンドターミナルを使用します。" + } +} diff --git a/packages/client/ui-sidebar/locale/ja.json b/packages/client/ui-sidebar/locale/ja.json new file mode 100644 index 0000000000..d06bafaeea --- /dev/null +++ b/packages/client/ui-sidebar/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションサイドバー", + "description": "セッション一覧を表示し、検索、グループ分け、状態の表示を提供します。" + } +} diff --git a/packages/client/ui-skill/locale/ja.json b/packages/client/ui-skill/locale/ja.json new file mode 100644 index 0000000000..cc3a083894 --- /dev/null +++ b/packages/client/ui-skill/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "スキル参照と表示", + "description": "セッションでスキルの参照と呼び出しの表示を提供します。" + } +} diff --git a/packages/client/ui-subagent/locale/ja.json b/packages/client/ui-subagent/locale/ja.json new file mode 100644 index 0000000000..9978c9472d --- /dev/null +++ b/packages/client/ui-subagent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サブエージェントセッション UI", + "description": "サブエージェントのセッションを確認、移動し、会話の継続や @ 参照を利用できます。" + } +} diff --git a/packages/client/ui-theme/locale/ja.json b/packages/client/ui-theme/locale/ja.json new file mode 100644 index 0000000000..e9f30a9b6c --- /dev/null +++ b/packages/client/ui-theme/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "UI テーマ", + "description": "ライト、ダーク、システムに従うテーマ設定を提供します。" + } +} diff --git a/packages/client/ui-tool/locale/ja.json b/packages/client/ui-tool/locale/ja.json new file mode 100644 index 0000000000..d1ade4a13e --- /dev/null +++ b/packages/client/ui-tool/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール呼び出し表示", + "description": "ツール呼び出しの過程、入れ子関係、各ツールの結果 UI を表示します。" + } +} diff --git a/packages/client/ui-trajectory/locale/ja.json b/packages/client/ui-trajectory/locale/ja.json new file mode 100644 index 0000000000..d2cc199c83 --- /dev/null +++ b/packages/client/ui-trajectory/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "実行履歴", + "description": "メッセージ、ツール呼び出し、所要時間、Token などの実行記録をターンごとに確認します。" + } +} diff --git a/packages/client/ui-user-questions/locale/ja.json b/packages/client/ui-user-questions/locale/ja.json new file mode 100644 index 0000000000..8bdf93ce89 --- /dev/null +++ b/packages/client/ui-user-questions/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ユーザーへの質問 UI", + "description": "セッション内で AI の質問と計画のレビュー依頼を表示し、ユーザーの回答を収集します。" + } +} diff --git a/packages/client/ui-workflow-run/locale/ja.json b/packages/client/ui-workflow-run/locale/ja.json new file mode 100644 index 0000000000..fde27c7374 --- /dev/null +++ b/packages/client/ui-workflow-run/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークフロー実行表示", + "description": "セッションでワークフローの実行記録とメンバーの詳細を表示します。" + } +} diff --git a/packages/client/ui-workspace/locale/ja.json b/packages/client/ui-workspace/locale/ja.json new file mode 100644 index 0000000000..931553fb4e --- /dev/null +++ b/packages/client/ui-workspace/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース選択 UI", + "description": "サイドバーと新規セッションページでワークスペースを選択します。" + } +} diff --git a/packages/compaction/command-compact/locale/ja.json b/packages/compaction/command-compact/locale/ja.json new file mode 100644 index 0000000000..83510c3841 --- /dev/null +++ b/packages/compaction/command-compact/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンテキスト圧縮コマンド", + "description": "コマンドで現在のセッションのコンテキストを手動圧縮できます。" + } +} diff --git a/packages/compaction/compaction-basic/locale/ja.json b/packages/compaction/compaction-basic/locale/ja.json new file mode 100644 index 0000000000..c3a8f2b526 --- /dev/null +++ b/packages/compaction/compaction-basic/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンテキスト圧縮", + "description": "コンテキストがしきい値に達すると、モデルを使用して履歴を要約します。" + } +} diff --git a/packages/compaction/compaction-image-offload/locale/ja.json b/packages/compaction/compaction-image-offload/locale/ja.json new file mode 100644 index 0000000000..ff6da3e7c9 --- /dev/null +++ b/packages/compaction/compaction-image-offload/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "履歴画像の退避", + "description": "モデルの画像予算を超えた履歴画像を添付ファイル参照に置き換え、リクエストを再試行します。" + } +} diff --git a/packages/compaction/compaction-tool-result-pruner/locale/ja.json b/packages/compaction/compaction-tool-result-pruner/locale/ja.json new file mode 100644 index 0000000000..de2d7be938 --- /dev/null +++ b/packages/compaction/compaction-tool-result-pruner/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール結果の短縮", + "description": "コンテキストの余裕が少ない場合、長いツール出力の先頭と末尾を残して短縮します。" + } +} diff --git a/packages/computer-use/computer-use/locale/en.json b/packages/computer-use/computer-use/locale/en.json new file mode 100644 index 0000000000..a41caa4b2f --- /dev/null +++ b/packages/computer-use/computer-use/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Computer provider registry", + "description": "Register Computer Use providers by name, with one provider per name." + } +} diff --git a/packages/computer-use/computer-use/locale/ja.json b/packages/computer-use/computer-use/locale/ja.json new file mode 100644 index 0000000000..0f9b4a2532 --- /dev/null +++ b/packages/computer-use/computer-use/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンピュータ操作の提供元レジストリ", + "description": "名前ごとに排他的なコンピュータ操作の提供元を登録します。" + } +} diff --git a/packages/computer-use/computer-use/locale/zh.json b/packages/computer-use/computer-use/locale/zh.json new file mode 100644 index 0000000000..6fd5b93b4c --- /dev/null +++ b/packages/computer-use/computer-use/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "电脑操作服务注册", + "description": "按名称注册独占的电脑操作提供方。" + } +} diff --git a/packages/computer-use/computer-use/package.json b/packages/computer-use/computer-use/package.json index fdb380a3cd..eb8ed07713 100644 --- a/packages/computer-use/computer-use/package.json +++ b/packages/computer-use/computer-use/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./brand": { "types": "./lib/types/brand.d.ts", @@ -26,6 +27,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.js", "lib/types/**/*.d.ts" diff --git a/packages/context/agent-instructions/locale/ja.json b/packages/context/agent-instructions/locale/ja.json new file mode 100644 index 0000000000..518faca069 --- /dev/null +++ b/packages/context/agent-instructions/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース指示の読み込み", + "description": "AGENTS.md や CLAUDE.md などを読み取り、ワークスペースの規則を AI に提供します。" + } +} diff --git a/packages/context/file-reference-local/locale/ja.json b/packages/context/file-reference-local/locale/ja.json new file mode 100644 index 0000000000..2d098e0333 --- /dev/null +++ b/packages/context/file-reference-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカルファイル参照", + "description": "ローカルファイルの検索と参照を提供します。" + } +} diff --git a/packages/context/harness-dev-context/locale/en.json b/packages/context/harness-dev-context/locale/en.json new file mode 100644 index 0000000000..34337f0631 --- /dev/null +++ b/packages/context/harness-dev-context/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Harness development context", + "description": "Give the model the Harness source directory and Web URL without changing its system prompt." + } +} diff --git a/packages/context/harness-dev-context/locale/ja.json b/packages/context/harness-dev-context/locale/ja.json new file mode 100644 index 0000000000..e8571cdcc3 --- /dev/null +++ b/packages/context/harness-dev-context/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Harness 開発コンテキスト", + "description": "Harness のソースディレクトリと Web URL をモデルに伝えます。それらを理由にシステムプロンプトを変更しません。" + } +} diff --git a/packages/context/harness-dev-context/locale/zh.json b/packages/context/harness-dev-context/locale/zh.json new file mode 100644 index 0000000000..de16e00848 --- /dev/null +++ b/packages/context/harness-dev-context/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Harness 开发上下文", + "description": "向模型提供 Harness 源码目录与 Web 地址,不因此改变系统提示词。" + } +} diff --git a/packages/context/harness-dev-context/package.json b/packages/context/harness-dev-context/package.json index 1d55f1f6f1..0b960e82c2 100644 --- a/packages/context/harness-dev-context/package.json +++ b/packages/context/harness-dev-context/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/context/session-reference/locale/ja.json b/packages/context/session-reference/locale/ja.json new file mode 100644 index 0000000000..134bde79fb --- /dev/null +++ b/packages/context/session-reference/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション間参照", + "description": "他のセッションの内容を読み取り専用スナップショットとして AI に提供します。" + } +} diff --git a/packages/context/time-context/locale/ja.json b/packages/context/time-context/locale/ja.json new file mode 100644 index 0000000000..7023d2fefe --- /dev/null +++ b/packages/context/time-context/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "時間情報", + "description": "各ステップで現在時刻、ブラウザのタイムゾーン、前のメッセージからの経過時間をモデルに伝えます。" + } +} diff --git a/packages/context/tmux-context/locale/en.json b/packages/context/tmux-context/locale/en.json new file mode 100644 index 0000000000..b85cc2e4a3 --- /dev/null +++ b/packages/context/tmux-context/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "tmux context", + "description": "Save tmux pane and window locations for each step when needed." + } +} diff --git a/packages/context/tmux-context/locale/ja.json b/packages/context/tmux-context/locale/ja.json new file mode 100644 index 0000000000..4e74b36052 --- /dev/null +++ b/packages/context/tmux-context/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "tmux コンテキスト", + "description": "必要に応じて、各ステップの tmux ペインとウィンドウの位置情報を保存します。" + } +} diff --git a/packages/context/tmux-context/locale/zh.json b/packages/context/tmux-context/locale/zh.json new file mode 100644 index 0000000000..a97522b009 --- /dev/null +++ b/packages/context/tmux-context/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "tmux 上下文", + "description": "按需保存每一步的 tmux 窗格与窗口位置信息。" + } +} diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 5f110a5b98..c9f4d6f312 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/core/agent-default-model/locale/ja.json b/packages/core/agent-default-model/locale/ja.json new file mode 100644 index 0000000000..efedecd8f2 --- /dev/null +++ b/packages/core/agent-default-model/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "デフォルトモデル", + "description": "新しいエージェントのデフォルトモデルを指定します。" + } +} diff --git a/packages/core/agent-loop/locale/ja.json b/packages/core/agent-loop/locale/ja.json new file mode 100644 index 0000000000..4e2e89fa9e --- /dev/null +++ b/packages/core/agent-loop/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェント実行ループ", + "description": "モデルリクエスト、ツール呼び出し、後続ステップを調整し、エージェントのタスクを進めます。" + } +} diff --git a/packages/core/agent-tool-presentation/locale/ja.json b/packages/core/agent-tool-presentation/locale/ja.json new file mode 100644 index 0000000000..187a5653b6 --- /dev/null +++ b/packages/core/agent-tool-presentation/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール呼び出し方式", + "description": "エージェントがネイティブツールと PTC コードのどちらでツールを呼び出すかを選択します。" + } +} diff --git a/packages/core/agent/locale/ja.json b/packages/core/agent/locale/ja.json new file mode 100644 index 0000000000..e0e5a4ca07 --- /dev/null +++ b/packages/core/agent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェント管理", + "description": "エージェントのインスタンス、実行コンテキスト、イベントを管理します。" + } +} diff --git a/packages/core/session/locale/ja.json b/packages/core/session/locale/ja.json new file mode 100644 index 0000000000..acdd9324af --- /dev/null +++ b/packages/core/session/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション記録", + "description": "セッション内のメッセージ、ツール呼び出し、実行イベントを記録します。" + } +} diff --git a/packages/core/system-prompt/locale/ja.json b/packages/core/system-prompt/locale/ja.json new file mode 100644 index 0000000000..a26bf0fbcd --- /dev/null +++ b/packages/core/system-prompt/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "システムプロンプト構成", + "description": "各プラグインが提供するシステムプロンプトをまとめます。" + } +} diff --git a/packages/core/tools/locale/ja.json b/packages/core/tools/locale/ja.json new file mode 100644 index 0000000000..05cc9baf12 --- /dev/null +++ b/packages/core/tools/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール登録と実行", + "description": "利用可能なツールとその呼び出しの実行を管理します。" + } +} diff --git a/packages/credentials/authorization/locale/ja.json b/packages/credentials/authorization/locale/ja.json new file mode 100644 index 0000000000..9b523320f2 --- /dev/null +++ b/packages/credentials/authorization/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "認可フローサービス", + "description": "ユーザーの参加が必要なログインや認証情報の認可フローを構成します。" + } +} diff --git a/packages/credentials/credentials-local/locale/ja.json b/packages/credentials/credentials-local/locale/ja.json new file mode 100644 index 0000000000..e1de3bac30 --- /dev/null +++ b/packages/credentials/credentials-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル認証情報保存", + "description": "API キーなどの認証情報を保存し、環境変数とローカル認証情報ファイルから優先順位に従って読み取ります。" + } +} diff --git a/packages/credentials/deepseek-account-platform/locale/ja.json b/packages/credentials/deepseek-account-platform/locale/ja.json new file mode 100644 index 0000000000..1409b20137 --- /dev/null +++ b/packages/credentials/deepseek-account-platform/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek アカウントログイン", + "description": "ブラウザで DeepSeek アカウントへのログイン認可を行います。" + } +} diff --git a/packages/deliverables/deliverable-file-references/locale/en.json b/packages/deliverables/deliverable-file-references/locale/en.json new file mode 100644 index 0000000000..4c0399cc09 --- /dev/null +++ b/packages/deliverables/deliverable-file-references/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Deliverable file references", + "description": "Provide shared model guidance for file links and deliverables across application environments." + } +} diff --git a/packages/deliverables/deliverable-file-references/locale/ja.json b/packages/deliverables/deliverable-file-references/locale/ja.json new file mode 100644 index 0000000000..cfc16f7c94 --- /dev/null +++ b/packages/deliverables/deliverable-file-references/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "成果物ファイル参照", + "description": "各実行環境に共通するファイルリンクと成果物のモデル向けガイドを提供します。" + } +} diff --git a/packages/deliverables/deliverable-file-references/locale/zh.json b/packages/deliverables/deliverable-file-references/locale/zh.json new file mode 100644 index 0000000000..3bc78c063b --- /dev/null +++ b/packages/deliverables/deliverable-file-references/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "交付文件引用", + "description": "为不同运行端提供文件链接与交付内容的共享模型指引。" + } +} diff --git a/packages/deliverables/deliverable-file-references/package.json b/packages/deliverables/deliverable-file-references/package.json index 237e9bd02f..12ef353746 100644 --- a/packages/deliverables/deliverable-file-references/package.json +++ b/packages/deliverables/deliverable-file-references/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/deliverables/tool-present/locale/ja.json b/packages/deliverables/tool-present/locale/ja.json new file mode 100644 index 0000000000..7a4076575d --- /dev/null +++ b/packages/deliverables/tool-present/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "成果物提示ツール", + "description": "AI がワークスペース内のファイルを今回のターンの成果物として明示できます。" + } +} diff --git a/packages/deliverables/workspace-changes/locale/ja.json b/packages/deliverables/workspace-changes/locale/ja.json new file mode 100644 index 0000000000..a3ad678fae --- /dev/null +++ b/packages/deliverables/workspace-changes/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース変更記録", + "description": "ターンごとのファイル変更を記録し、ファイル単位で比較できます。" + } +} diff --git a/packages/document/office-to-pdf/locale/ja.json b/packages/document/office-to-pdf/locale/ja.json new file mode 100644 index 0000000000..f7bdc334ae --- /dev/null +++ b/packages/document/office-to-pdf/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Office から PDF への変換", + "description": "Word、Excel、PowerPoint などの文書をプレビュー用の PDF に変換します。" + } +} diff --git a/packages/experimental/agent-team-profile/locale/ja.json b/packages/experimental/agent-team-profile/locale/ja.json new file mode 100644 index 0000000000..68a53c025c --- /dev/null +++ b/packages/experimental/agent-team-profile/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "エージェントチーム", + "description": "チーム連携、チームツール、メンバー一覧、共有タスクボードを有効にします。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/agent-team/locale/ja.json b/packages/experimental/agent-team/locale/ja.json new file mode 100644 index 0000000000..39434439e3 --- /dev/null +++ b/packages/experimental/agent-team/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "チーム連携", + "description": "チームメンバー、メンバー間メッセージ、共有タスクを管理します。" + } +} diff --git a/packages/experimental/api-speech-to-text/locale/ja.json b/packages/experimental/api-speech-to-text/locale/ja.json new file mode 100644 index 0000000000..3b67116da8 --- /dev/null +++ b/packages/experimental/api-speech-to-text/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "音声文字起こし API", + "description": "ブラウザ向けの録音文字起こし API を提供します。" + } +} diff --git a/packages/experimental/auto-review/README.i18n.yaml b/packages/experimental/auto-review/README.i18n.yaml index 6c79ff2673..f045208cdf 100644 --- a/packages/experimental/auto-review/README.i18n.yaml +++ b/packages/experimental/auto-review/README.i18n.yaml @@ -27,8 +27,8 @@ en: 68fbe81265de3d55 zh: ad41f2353ba94a07 /deepseek-ai-dsh-experimental-auto-review/understand-the-implementation: - en: 8c6a6ec4e7b7fe07 - zh: 41629c4af6977d1f + en: 0d76e9a60573ee84 + zh: 3297ae0898852b7d /deepseek-ai-dsh-experimental-auto-review/further-exploration: en: 8b81d32ea370ecd3 zh: dc53ff4da78232ac diff --git a/packages/experimental/auto-review/README.md b/packages/experimental/auto-review/README.md index 357f816578..dc961fff6d 100644 --- a/packages/experimental/auto-review/README.md +++ b/packages/experimental/auto-review/README.md @@ -75,7 +75,7 @@ A final denial uses the ordinary tool card. The collapsed row identifies Auto re
Implementation internals — click to expand -[`cordis.patch.yml`](cordis.patch.yml) inserts the package itself as the `auto-review` row. [`src/index.ts`](src/index.ts) requires the approval, LLM, permission, Session, and tools services, then installs the preset contribution and prepended pre-execute listener in one effect. After the review settles, a denial reads the Session's approval policy: under `never` it is final; under `ask` the listener delegates to later pre-execute listeners and returns the tools pipeline's `ask` decision only when they allow the call, so a later denial, cancellation, or `ask` (with its own reason) takes precedence. The `ask` decision carries an English audited reason and localized prompt text that keeps the raw reviewer reason. The [permission owner](../../interaction/permission-presets/README.md) supplies the current identity and process catalog; Auto uses Full access's sandbox value with the `ask` approval policy and does not change tool definitions. +[`cordis.patch.yml`](cordis.patch.yml) inserts the package itself as the `auto-review` row. [`src/index.ts`](src/index.ts) requires the approval, LLM, permission, Session, and tools services, then installs the preset contribution and prepended pre-execute listener in one effect. After the review settles, a denial reads the Session's approval policy: under `never` it is final; under `ask` the listener delegates to later pre-execute listeners and returns the tools pipeline's `ask` decision only when they allow the call, so a later denial, cancellation, or `ask` (with its own reason) takes precedence. The `ask` decision carries an English audited reason and locale-owned English, Chinese, and Japanese prompt text from `src/locales.ts` that keeps the raw reviewer reason. The [permission owner](../../interaction/permission-presets/README.md) supplies the current identity and process catalog; Auto uses Full access's sandbox value with the `ask` approval policy and does not change tool definitions. The reviewer sends the fixed policy as its system prompt, then one user message for the cwd-only environment, one per retained Session item in surface order, and the pending call last. Project instructions appear where they entered the surface, with the constraint role. A `tool-schema` item precedes the first call that used each reviewed schema; the integration remembers each reviewed call's schema for the live Session so that later reviews repeat it at the same position. Native schema comes from the latest request header. A PTC binding freezes its schema and carries it through the scheduler into transient execution metadata; start and settle events never serialize description or parameters. Main-agent `system/message` nodes, assistant text and reasoning, and tool results are excluded. The outer review input is a frozen `RequestUserInput` without durable identity or source; retained history keeps its original source attribution in the review text. [The decision record](../../../.agents/notes/implemented/feature/2026-08-28-auto-review.md) owns authority, lifecycle, and child-inheritance rationale. diff --git a/packages/experimental/auto-review/README.zh.md b/packages/experimental/auto-review/README.zh.md index 8bcc8b385a..5b49175cc9 100644 --- a/packages/experimental/auto-review/README.zh.md +++ b/packages/experimental/auto-review/README.zh.md @@ -75,7 +75,7 @@ Auto 在每个受支持调用的 body 执行前审查一次,包括每个已开
实现内部机制——点击展开 -[`cordis.patch.yml`](cordis.patch.yml)把本包自身插入为 `auto-review` 行。[`src/index.ts`](src/index.ts)要求 approval、LLM、permission、Session 与 tools 服务,然后在同一个 effect 中安装 preset contribution 和置前的 pre-execute listener。Review 结束后,拒绝会读取 Session 的审批策略:`never` 下为最终拒绝;`ask` 下 listener 先交给后续 pre-execute listener,只有它们放行调用时才返回 tools 流水线的 `ask` 决定,因此后续的拒绝、取消或 `ask`(带自己的理由)优先。`ask` 决定携带英文审计理由,以及保留原始 reviewer 理由的本地化提示文本。[权限 owner](../../interaction/permission-presets/README.zh.md)提供当前身份和进程目录;Auto 使用 Full access 的沙箱值与 `ask` 审批策略,不改变工具定义。 +[`cordis.patch.yml`](cordis.patch.yml)把本包自身插入为 `auto-review` 行。[`src/index.ts`](src/index.ts)要求 approval、LLM、permission、Session 与 tools 服务,然后在同一个 effect 中安装 preset contribution 和置前的 pre-execute listener。Review 结束后,拒绝会读取 Session 的审批策略:`never` 下为最终拒绝;`ask` 下 listener 先交给后续 pre-execute listener,只有它们放行调用时才返回 tools 流水线的 `ask` 决定,因此后续的拒绝、取消或 `ask`(带自己的理由)优先。`ask` 决定携带英文审计理由,以及由 `src/locales.ts` 提供且保留原始 reviewer 理由的中英日提示文本。[权限 owner](../../interaction/permission-presets/README.zh.md)提供当前身份和进程目录;Auto 使用 Full access 的沙箱值与 `ask` 审批策略,不改变工具定义。 Reviewer 以固定策略作为 system prompt,随后依次发送:一条仅含 cwd 的环境 user 消息、按 surface 顺序每个保留 Session 条目一条消息,最后是待审调用。项目指令出现在其进入 surface 的位置,并带约束角色。首次使用某个已审 schema 的调用之前有一条 `tool-schema` 条目;integration 为存活 Session 记住每次已审调用的 schema,使后续评审在同一位置重复它。原生 schema 来自最新 request header。PTC binding 冻结其 schema,经由调度器传入临时执行元数据;开始与结算事件都不序列化描述或参数 schema。主 agent 的 `system/message` 节点、assistant 正文与 reasoning、tool results 全部排除。外层评审输入是冻结的 `RequestUserInput`,不含持久身份或来源;保留历史在评审文本中仍携带原始来源。[决策记录](../../../.agents/notes/implemented/feature/2026-08-28-auto-review.zh.md)拥有权威、生命周期与 child 继承的理由。 diff --git a/packages/experimental/auto-review/locale/ja.json b/packages/experimental/auto-review/locale/ja.json new file mode 100644 index 0000000000..cbe474b367 --- /dev/null +++ b/packages/experimental/auto-review/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "自動認可レビュー", + "description": "各ツール呼び出しの前にモデルが認可を判断する、自動認可レビュー権限モードを提供します。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/auto-review/src/index.ts b/packages/experimental/auto-review/src/index.ts index 4654588fa8..de2134ffd4 100644 --- a/packages/experimental/auto-review/src/index.ts +++ b/packages/experimental/auto-review/src/index.ts @@ -32,6 +32,7 @@ import { type PreToolDecision, type ToolExecution, } from '@deepseek-ai/dsh-tools' +import { deniedDisplayReason } from './locales.ts' /** Structured error name persisted for every final reviewer denial. */ const AUTO_REVIEW_DENIED_ERROR_NAME = 'AutoReviewDeniedError' @@ -703,9 +704,7 @@ function askUser(exec: ToolExecution, reason?: string): PreToolDecision { return { kind: 'ask', reason: reason === undefined ? denial : `${denial}: ${reason}`, - displayReason: reason === undefined - ? { en: 'Auto review denied this call.', zh: 'Auto review 拒绝了此调用。' } - : { en: `Auto review denied this call: ${reason}`, zh: `Auto review 拒绝了此调用:${reason}` }, + displayReason: deniedDisplayReason(reason), } } diff --git a/packages/experimental/auto-review/src/locales.ts b/packages/experimental/auto-review/src/locales.ts new file mode 100644 index 0000000000..4a4dc5deff --- /dev/null +++ b/packages/experimental/auto-review/src/locales.ts @@ -0,0 +1,30 @@ +/** Locale-owned approval text; reviewer reasons remain verbatim in every language. */ + +/** English approval messages. */ +export const en = { + denied: 'Auto review denied this call.', + deniedWithReason: (reason: string): string => `Auto review denied this call: ${reason}`, +} + +/** Chinese approval messages. */ +export const zh = { + denied: 'Auto review 拒绝了此调用。', + deniedWithReason: (reason: string): string => `Auto review 拒绝了此调用:${reason}`, +} satisfies typeof en + +/** Japanese approval messages. */ +export const ja = { + denied: '自動認可レビューがこの呼び出しを拒否しました。', + deniedWithReason: (reason: string): string => `自動認可レビューがこの呼び出しを拒否しました:${reason}`, +} satisfies typeof en + +/** + * Build all display translations without translating the reviewer's raw reason. + * @param reason - optional reviewer explanation. + * @returns text for the Client's localized-text resolver. + */ +export function deniedDisplayReason(reason?: string): Record<'en' | 'zh' | 'ja', string> { + return reason === undefined + ? { en: en.denied, zh: zh.denied, ja: ja.denied } + : { en: en.deniedWithReason(reason), zh: zh.deniedWithReason(reason), ja: ja.deniedWithReason(reason) } +} diff --git a/packages/experimental/auto-review/tests/auto-review.spec.ts b/packages/experimental/auto-review/tests/auto-review.spec.ts index c7369313d4..1d9136362e 100644 --- a/packages/experimental/auto-review/tests/auto-review.spec.ts +++ b/packages/experimental/auto-review/tests/auto-review.spec.ts @@ -967,8 +967,9 @@ describe('native review request', () => { ? 'Auto review denied tool "probe"' : `Auto review denied tool "probe": ${item.expectedReason}`) expect(displayReasons.at(-1)).toEqual(item.expectedReason === undefined - ? { en: 'Auto review denied this call.', zh: 'Auto review 拒绝了此调用。' } - : { en: `Auto review denied this call: ${item.expectedReason}`, zh: `Auto review 拒绝了此调用:${item.expectedReason}` }) + ? { en: 'Auto review denied this call.', zh: 'Auto review 拒绝了此调用。', ja: '自動認可レビューがこの呼び出しを拒否しました。' } + : { en: `Auto review denied this call: ${item.expectedReason}`, zh: `Auto review 拒绝了此调用:${item.expectedReason}`, + ja: `自動認可レビューがこの呼び出しを拒否しました:${item.expectedReason}` }) } expect(probe.runs()).toBe(2) diff --git a/packages/experimental/badge-skill-bundle/locale/ja.json b/packages/experimental/badge-skill-bundle/locale/ja.json new file mode 100644 index 0000000000..ff6dc5e361 --- /dev/null +++ b/packages/experimental/badge-skill-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "DSH バッジスキル", + "description": "エージェントが文書や PR などの成果物に「powered by dsh」バッジを追加できます。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/browser-use-chrome-devtools-mcp/locale/ja.json b/packages/experimental/browser-use-chrome-devtools-mcp/locale/ja.json new file mode 100644 index 0000000000..950f7c5400 --- /dev/null +++ b/packages/experimental/browser-use-chrome-devtools-mcp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ブラウザ操作(Chrome DevTools)", + "description": "モデルが Chrome DevTools MCP を介し、新しく起動した Chrome で Web ページを調査、操作できます。" + } +} diff --git a/packages/experimental/browser-use-playwright-mcp/locale/ja.json b/packages/experimental/browser-use-playwright-mcp/locale/ja.json new file mode 100644 index 0000000000..16b74bfa08 --- /dev/null +++ b/packages/experimental/browser-use-playwright-mcp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ブラウザ操作(Playwright)", + "description": "モデルが Playwright MCP を介し、新しく起動した Chromium で Web ページを閲覧、操作できます。" + } +} diff --git a/packages/experimental/browser-use-stagehand-native/locale/en.json b/packages/experimental/browser-use-stagehand-native/locale/en.json new file mode 100644 index 0000000000..c1f1dcc846 --- /dev/null +++ b/packages/experimental/browser-use-stagehand-native/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Stagehand browser tools", + "description": "Provide experimental Stagehand browser tools using a separately configured native model." + } +} diff --git a/packages/experimental/browser-use-stagehand-native/locale/ja.json b/packages/experimental/browser-use-stagehand-native/locale/ja.json new file mode 100644 index 0000000000..227731ad6a --- /dev/null +++ b/packages/experimental/browser-use-stagehand-native/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Stagehand ブラウザツール", + "description": "別途設定したネイティブモデルを使う、実験的な Stagehand ブラウザツールを提供します。" + } +} diff --git a/packages/experimental/browser-use-stagehand-native/locale/zh.json b/packages/experimental/browser-use-stagehand-native/locale/zh.json new file mode 100644 index 0000000000..f569a9b341 --- /dev/null +++ b/packages/experimental/browser-use-stagehand-native/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Stagehand 浏览器工具", + "description": "使用单独配置的原生模型提供实验性的 Stagehand 浏览器工具。" + } +} diff --git a/packages/experimental/browser-use-stagehand-native/package.json b/packages/experimental/browser-use-stagehand-native/package.json index 17146b2d56..9066afb30d 100644 --- a/packages/experimental/browser-use-stagehand-native/package.json +++ b/packages/experimental/browser-use-stagehand-native/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./worker": { "types": "./lib/types/worker.d.ts", @@ -26,6 +27,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/worker.js", "lib/types/**/*.d.ts" diff --git a/packages/experimental/claude-code-mods/locale/en.json b/packages/experimental/claude-code-mods/locale/en.json new file mode 100644 index 0000000000..2fb907f7a7 --- /dev/null +++ b/packages/experimental/claude-code-mods/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code mods", + "description": "Load Claude Code extensions and run their hooks through Harness extension points." + } +} diff --git a/packages/experimental/claude-code-mods/locale/ja.json b/packages/experimental/claude-code-mods/locale/ja.json new file mode 100644 index 0000000000..aed189675f --- /dev/null +++ b/packages/experimental/claude-code-mods/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code mods", + "description": "Claude Code の拡張モジュールを読み込み、Harness の拡張ポイントでフックチェーンを実行します。" + } +} diff --git a/packages/experimental/claude-code-mods/locale/zh.json b/packages/experimental/claude-code-mods/locale/zh.json new file mode 100644 index 0000000000..e03838bc7d --- /dev/null +++ b/packages/experimental/claude-code-mods/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code 扩展桥接", + "description": "加载 Claude Code 扩展模块,并在 Harness 扩展点运行其钩子链。" + } +} diff --git a/packages/experimental/claude-code-mods/package.json b/packages/experimental/claude-code-mods/package.json index cbf2d43624..bca0d2a63f 100644 --- a/packages/experimental/claude-code-mods/package.json +++ b/packages/experimental/claude-code-mods/package.json @@ -36,9 +36,11 @@ }, "./examples/*": "./examples/*", "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.js", "lib/types/**/*.d.ts", diff --git a/packages/experimental/client-ui-agent-team/locale/ja.json b/packages/experimental/client-ui-agent-team/locale/ja.json new file mode 100644 index 0000000000..1ce3af7d22 --- /dev/null +++ b/packages/experimental/client-ui-agent-team/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "チームパネル", + "description": "チームメンバーと共有タスクを確認し、メンバーのセッションに移動します。" + } +} diff --git a/packages/experimental/client-ui-claude-code-mods/locale/en.json b/packages/experimental/client-ui-claude-code-mods/locale/en.json new file mode 100644 index 0000000000..cdec4e5ef8 --- /dev/null +++ b/packages/experimental/client-ui-claude-code-mods/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code mods interface", + "description": "Display each session's extension tree above the input box and send button actions to the extension service." + } +} diff --git a/packages/experimental/client-ui-claude-code-mods/locale/ja.json b/packages/experimental/client-ui-claude-code-mods/locale/ja.json new file mode 100644 index 0000000000..214e0cb56e --- /dev/null +++ b/packages/experimental/client-ui-claude-code-mods/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code mods UI", + "description": "入力欄の上に各セッションの拡張ツリーを表示し、ボタン操作をブリッジサービスに送信します。" + } +} diff --git a/packages/experimental/client-ui-claude-code-mods/locale/zh.json b/packages/experimental/client-ui-claude-code-mods/locale/zh.json new file mode 100644 index 0000000000..777d85598c --- /dev/null +++ b/packages/experimental/client-ui-claude-code-mods/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code 扩展界面", + "description": "在输入框上方展示各会话的扩展树,并向桥接服务发送按钮操作。" + } +} diff --git a/packages/experimental/client-ui-claude-code-mods/package.json b/packages/experimental/client-ui-claude-code-mods/package.json index d1bf7b0535..89b0ac8619 100644 --- a/packages/experimental/client-ui-claude-code-mods/package.json +++ b/packages/experimental/client-ui-claude-code-mods/package.json @@ -23,6 +23,7 @@ "default": "./lib/client.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "dsh": { @@ -42,6 +43,7 @@ "watch": "tsdown --watch" }, "files": [ + "locale/*.json", "lib/index.js", "lib/client.js", "lib/types/**/*.d.ts" diff --git a/packages/experimental/client-ui-cot-translation/locale/ja.json b/packages/experimental/client-ui-cot-translation/locale/ja.json new file mode 100644 index 0000000000..988cdf4ffb --- /dev/null +++ b/packages/experimental/client-ui-cot-translation/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "思考内容の機械翻訳", + "description": "展開した思考内容を他の言語に機械翻訳します。" + } +} diff --git a/packages/experimental/client-ui-voice-input/locale/ja.json b/packages/experimental/client-ui-voice-input/locale/ja.json new file mode 100644 index 0000000000..f3f1f506a8 --- /dev/null +++ b/packages/experimental/client-ui-voice-input/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "録音入力", + "description": "音声を録音し、認識結果を会話の下書きに入力します。編集してから送信できます。" + } +} diff --git a/packages/experimental/computer-use-cua-driver-mcp/locale/ja.json b/packages/experimental/computer-use-cua-driver-mcp/locale/ja.json new file mode 100644 index 0000000000..58e64d7256 --- /dev/null +++ b/packages/experimental/computer-use-cua-driver-mcp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンピュータ操作(Cua Driver MCP)", + "description": "モデルが別途インストールした cua-driver 実行ファイルを通じてデスクトップを操作できます。" + } +} diff --git a/packages/experimental/computer-use-cua-driver-native/locale/ja.json b/packages/experimental/computer-use-cua-driver-native/locale/ja.json new file mode 100644 index 0000000000..569aa3b68c --- /dev/null +++ b/packages/experimental/computer-use-cua-driver-native/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンピュータ操作(Cua Driver)", + "description": "モデルが組み込みの Cua Driver ランタイムでデスクトップを操作できます。dsh を起動するアプリへのデスクトップ権限が必要です。" + } +} diff --git a/packages/experimental/cot-translation-bundle/locale/en.json b/packages/experimental/cot-translation-bundle/locale/en.json index 519553ec38..389beaed1e 100644 --- a/packages/experimental/cot-translation-bundle/locale/en.json +++ b/packages/experimental/cot-translation-bundle/locale/en.json @@ -1,7 +1,7 @@ { "meta": { "title": "Machine translation of reasoning", - "description": "Machine translation of expanded reasoning; source text is sent to the selected service", + "description": "Machine translation of expanded reasoning; source text is sent to the selected service.", "detail": "docs/DETAIL.md" } } diff --git a/packages/experimental/cot-translation-bundle/locale/ja.json b/packages/experimental/cot-translation-bundle/locale/ja.json new file mode 100644 index 0000000000..cd12d0fa9f --- /dev/null +++ b/packages/experimental/cot-translation-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "思考内容の機械翻訳", + "description": "展開した思考内容を機械翻訳します。原文は選択したサービスに送信されます。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/cua-bundle/locale/ja.json b/packages/experimental/cua-bundle/locale/ja.json new file mode 100644 index 0000000000..77044c629b --- /dev/null +++ b/packages/experimental/cua-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "Computer Use", + "description": "現在は macOS のみ対応し、Windows 対応は開発中です。既存および新規の PTC セッションに Computer Use を読み込みます。PTC モードに切り替え、アクセシビリティと画面収録の権限を許可して使用してください。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/cua-macos/locale/en.json b/packages/experimental/cua-macos/locale/en.json new file mode 100644 index 0000000000..6a630ed54a --- /dev/null +++ b/packages/experimental/cua-macos/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "macOS Computer Use provider", + "description": "Provide native macOS applications and windows for the shared Computer Use service." + } +} diff --git a/packages/experimental/cua-macos/locale/ja.json b/packages/experimental/cua-macos/locale/ja.json new file mode 100644 index 0000000000..f99dcde772 --- /dev/null +++ b/packages/experimental/cua-macos/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "macOS Computer Useバックエンド", + "description": "共通のComputer Useサービスに macOS ネイティブのアプリとウィンドウのオブジェクトを提供します。" + } +} diff --git a/packages/experimental/cua-macos/locale/zh.json b/packages/experimental/cua-macos/locale/zh.json new file mode 100644 index 0000000000..b1b18a7181 --- /dev/null +++ b/packages/experimental/cua-macos/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "macOS Computer Use后端", + "description": "为共享Computer Use服务提供 macOS 原生应用与窗口对象。" + } +} diff --git a/packages/experimental/cua-macos/package.json b/packages/experimental/cua-macos/package.json index a2cfd494dd..3818f35f99 100644 --- a/packages/experimental/cua-macos/package.json +++ b/packages/experimental/cua-macos/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "native/bin", "native/Package.swift", diff --git a/packages/experimental/cua/README.i18n.yaml b/packages/experimental/cua/README.i18n.yaml index 248c8ef69f..4dee3658d2 100644 --- a/packages/experimental/cua/README.i18n.yaml +++ b/packages/experimental/cua/README.i18n.yaml @@ -12,8 +12,8 @@ en: f4d9cc48587d62a2 zh: d1bac6c1fe7eb29e /deepseek-ai-dsh-cua/table-of-contents: - en: 400de8528e57cf00 - zh: 1eb88c23eb4b511f + en: 5db4d4fea25493b9 + zh: 65ab64fc24eb0d09 /deepseek-ai-dsh-cua/use-this-package: en: 4b4000d5eafc9256 zh: 4eeae251ec7c8ec4 diff --git a/packages/experimental/cua/README.md b/packages/experimental/cua/README.md index 4b332f0d18..d7130d7c6f 100644 --- a/packages/experimental/cua/README.md +++ b/packages/experimental/cua/README.md @@ -20,7 +20,7 @@ Inspect applications, retain window objects across PTC calls, and send actions t - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work) - [Dev Note](#dev-note) -Application consent uses the fixed approval presentation of User Questions and remains independent of the session tool-approval policy. Native icons accompany the prompt and permission-page observations, but remain outside saved identities and model results. System checks, saved grants and refusals, and icons use separate queries so each result can appear without waiting for the others. +Application consent supplies English, Chinese, and Japanese display text from `src/locales.ts`. It uses the fixed approval presentation of User Questions and remains independent of the session tool-approval policy. Native icons accompany the prompt and permission-page observations, but remain outside saved identities and model results. System checks, saved grants and refusals, and icons use separate queries so each result can appear without waiting for the others. ----- diff --git a/packages/experimental/cua/README.zh.md b/packages/experimental/cua/README.zh.md index fb280ebcf7..c2507fc3e7 100644 --- a/packages/experimental/cua/README.zh.md +++ b/packages/experimental/cua/README.zh.md @@ -20,7 +20,7 @@ kind: "package-reference" - [已知限制与后续工作](#known-limitations-and-deferred-work) - [开发备注](#dev-note) -应用授权使用 User Questions 的固定审批呈现,仍独立于会话的工具审批策略。本机图标用于授权提示和权限页展示,不进入保存的身份信息或模型结果。系统权限、持久授权与拒绝记录、图标分别查询,各项结果返回后即可显示。 +应用授权从 `src/locales.ts` 提供中英日展示文案。它使用 User Questions 的固定审批呈现,仍独立于会话的工具审批策略。本机图标用于授权提示和权限页展示,不进入保存的身份信息或模型结果。系统权限、持久授权与拒绝记录、图标分别查询,各项结果返回后即可显示。 ----- diff --git a/packages/experimental/cua/locale/en.json b/packages/experimental/cua/locale/en.json new file mode 100644 index 0000000000..698e4dfa41 --- /dev/null +++ b/packages/experimental/cua/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Computer Use service", + "description": "Manage application access, permissions, and logged tool execution for Computer Use." + } +} diff --git a/packages/experimental/cua/locale/ja.json b/packages/experimental/cua/locale/ja.json new file mode 100644 index 0000000000..7c5496d111 --- /dev/null +++ b/packages/experimental/cua/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Computer Useサービス", + "description": "Computer Useのアプリオブジェクト、認可、ログに記録されるツール実行を管理します。" + } +} diff --git a/packages/experimental/cua/locale/zh.json b/packages/experimental/cua/locale/zh.json new file mode 100644 index 0000000000..30da26aa7c --- /dev/null +++ b/packages/experimental/cua/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Computer Use服务", + "description": "管理Computer Use的应用对象、授权和带日志的工具执行。" + } +} diff --git a/packages/experimental/cua/package.json b/packages/experimental/cua/package.json index b30d00b670..39e2233e09 100644 --- a/packages/experimental/cua/package.json +++ b/packages/experimental/cua/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./api": { "types": "./lib/types/api.d.ts", @@ -54,6 +55,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/client.js", "lib/remote-types.js", diff --git a/packages/experimental/cua/src/application-access.ts b/packages/experimental/cua/src/application-access.ts index e5a957b97d..22cdb74e74 100644 --- a/packages/experimental/cua/src/application-access.ts +++ b/packages/experimental/cua/src/application-access.ts @@ -3,6 +3,7 @@ import type { Context } from '@deepseek-ai/cordis' import type { Agent } from '@deepseek-ai/dsh-agent' import { UserQuestionError, type AskUserQuestionAnswer } from '@deepseek-ai/dsh-user-questions' import { z } from 'zod' +import { applicationAccessDisplay } from './locales.ts' import { NativeError, type NativeClient } from './native-client.ts' import type { CuaAppHandle } from './types.ts' import type { CuaApplicationGrant, CuaApplicationId } from './application-types.ts' @@ -152,13 +153,7 @@ export class ApplicationAccess { kind: 'approval', approve: 'Allow for this session', reject: 'Deny', ...(identity.persistable && this.options.save ? { always: 'Always allow' } : {}), subject: { name: identity.name, ...(icon === undefined ? {} : { icon }) }, - display: { - question: { en: 'Allow computer use to launch, read, capture and control this application?', - zh: '允许 Computer Use 启动、读取、截图和控制此应用吗?' }, - detail: { en: 'Session access lasts until DSH restarts or computer use is disabled.', - zh: '会话授权在 DSH 重启或关闭 Computer Use 后失效。' }, - approve: { en: 'Allow for this session', zh: '本会话允许' }, - }, + display: applicationAccessDisplay, } }] }) } catch (error) { if (error instanceof UserQuestionError && error.code === 'ASK_CANCELLED') { diff --git a/packages/experimental/cua/src/locales.ts b/packages/experimental/cua/src/locales.ts new file mode 100644 index 0000000000..391f77c445 --- /dev/null +++ b/packages/experimental/cua/src/locales.ts @@ -0,0 +1,29 @@ +/** Locale-owned application-access approval messages. */ + +/** English application-access messages. */ +export const en = { + question: 'Allow computer use to launch, read, capture and control this application?', + detail: 'Session access lasts until DSH restarts or computer use is disabled.', + approve: 'Allow for this session', +} + +/** Chinese application-access messages. */ +export const zh = { + question: '允许 Computer Use 启动、读取、截图和控制此应用吗?', + detail: '会话授权在 DSH 重启或关闭 Computer Use 后失效。', + approve: '本会话允许', +} satisfies typeof en + +/** Japanese application-access messages. */ +export const ja = { + question: 'Computer Use によるこのアプリの起動、読み取り、画面キャプチャ、操作を許可しますか?', + detail: 'セッションの許可は DSH の再起動または Computer Use の無効化まで有効です。', + approve: 'このセッションで許可', +} satisfies typeof en + +/** Display translations resolved by the Client; wire choices stay unchanged. */ +export const applicationAccessDisplay = { + question: { en: en.question, zh: zh.question, ja: ja.question }, + detail: { en: en.detail, zh: zh.detail, ja: ja.detail }, + approve: { en: en.approve, zh: zh.approve, ja: ja.approve }, +} diff --git a/packages/experimental/cua/tests/application-access.spec.ts b/packages/experimental/cua/tests/application-access.spec.ts index ac98ad3fdb..946ca78f8c 100644 --- a/packages/experimental/cua/tests/application-access.spec.ts +++ b/packages/experimental/cua/tests/application-access.spec.ts @@ -80,10 +80,12 @@ it.each([ intent: { kind: 'approval', approve: 'Allow for this session', reject: 'Deny', subject: { name: 'Test application' }, display: { question: { en: 'Allow computer use to launch, read, capture and control this application?', - zh: '允许 Computer Use 启动、读取、截图和控制此应用吗?' }, + zh: '允许 Computer Use 启动、读取、截图和控制此应用吗?', + ja: 'Computer Use によるこのアプリの起動、読み取り、画面キャプチャ、操作を許可しますか?' }, detail: { en: 'Session access lasts until DSH restarts or computer use is disabled.', - zh: '会话授权在 DSH 重启或关闭 Computer Use 后失效。' }, - approve: { en: 'Allow for this session', zh: '本会话允许' }, + zh: '会话授权在 DSH 重启或关闭 Computer Use 后失效。', + ja: 'セッションの許可は DSH の再起動または Computer Use の無効化まで有効です。' }, + approve: { en: 'Allow for this session', zh: '本会话允许', ja: 'このセッションで許可' }, }, }, }) diff --git a/packages/experimental/hooks-claude-code/locale/en.json b/packages/experimental/hooks-claude-code/locale/en.json new file mode 100644 index 0000000000..fc6e291794 --- /dev/null +++ b/packages/experimental/hooks-claude-code/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code hooks", + "description": "Run hooks from Claude Code hooks.json or settings at Harness interception points." + } +} diff --git a/packages/experimental/hooks-claude-code/locale/ja.json b/packages/experimental/hooks-claude-code/locale/ja.json new file mode 100644 index 0000000000..44f51f70a5 --- /dev/null +++ b/packages/experimental/hooks-claude-code/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code フック", + "description": "Harness のインターセプトポイントで、Claude Code の hooks.json または settings に設定されたフックを実行します。" + } +} diff --git a/packages/experimental/hooks-claude-code/locale/zh.json b/packages/experimental/hooks-claude-code/locale/zh.json new file mode 100644 index 0000000000..c4e0b01c71 --- /dev/null +++ b/packages/experimental/hooks-claude-code/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code 钩子", + "description": "在 Harness 拦截点执行 Claude Code hooks.json 或 settings 中配置的钩子。" + } +} diff --git a/packages/experimental/hooks-claude-code/package.json b/packages/experimental/hooks-claude-code/package.json index e6f2c522f4..0d412e036c 100644 --- a/packages/experimental/hooks-claude-code/package.json +++ b/packages/experimental/hooks-claude-code/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/experimental/hooks-codex/locale/en.json b/packages/experimental/hooks-codex/locale/en.json new file mode 100644 index 0000000000..232d96f616 --- /dev/null +++ b/packages/experimental/hooks-codex/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Codex hooks", + "description": "Run hooks from Codex hooks.json at Harness interception points." + } +} diff --git a/packages/experimental/hooks-codex/locale/ja.json b/packages/experimental/hooks-codex/locale/ja.json new file mode 100644 index 0000000000..c2f628465c --- /dev/null +++ b/packages/experimental/hooks-codex/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Codex フック", + "description": "Harness のインターセプトポイントで、Codex の hooks.json に設定されたフックを実行します。" + } +} diff --git a/packages/experimental/hooks-codex/locale/zh.json b/packages/experimental/hooks-codex/locale/zh.json new file mode 100644 index 0000000000..e067d2cb79 --- /dev/null +++ b/packages/experimental/hooks-codex/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Codex 钩子", + "description": "在 Harness 拦截点执行 Codex hooks.json 中配置的钩子。" + } +} diff --git a/packages/experimental/hooks-codex/package.json b/packages/experimental/hooks-codex/package.json index b07e186907..c576d5fe7d 100644 --- a/packages/experimental/hooks-codex/package.json +++ b/packages/experimental/hooks-codex/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/experimental/inspector-profile/locale/ja.json b/packages/experimental/inspector-profile/locale/ja.json new file mode 100644 index 0000000000..8ebc821cb1 --- /dev/null +++ b/packages/experimental/inspector-profile/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "開発者ツール", + "description": "セッションの生データ、グループ化されたチャットメッセージ、NodeJS バックエンドを確認、デバッグします。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/inspector/locale/ja.json b/packages/experimental/inspector/locale/ja.json new file mode 100644 index 0000000000..cd643172ec --- /dev/null +++ b/packages/experimental/inspector/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "NodeJS インスペクター", + "description": "Ctrl/Cmd+Shift+. を押すと、開発やデバッグ用の Chrome DevTools を下部パネルに開きます。" + } +} diff --git a/packages/experimental/plugin-market-bundle/locale/en.json b/packages/experimental/plugin-market-bundle/locale/en.json index 71ef0d6072..99c473c02c 100644 --- a/packages/experimental/plugin-market-bundle/locale/en.json +++ b/packages/experimental/plugin-market-bundle/locale/en.json @@ -1,7 +1,7 @@ { "meta": { "title": "Custom plugin markets", - "description": "Adds a Discover tab to Plugins for browsing and installing bundles from plugin market indexes you add", + "description": "Adds a Discover tab to Plugins for browsing and installing bundles from plugin market indexes you add.", "detail": "docs/DETAIL.md" } } diff --git a/packages/experimental/plugin-market-bundle/locale/ja.json b/packages/experimental/plugin-market-bundle/locale/ja.json new file mode 100644 index 0000000000..e3dd3f2710 --- /dev/null +++ b/packages/experimental/plugin-market-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "カスタムプラグインマーケット", + "description": "プラグインページに「見つける」タブを追加し、登録したマーケットのインデックスからプラグインを参照、インストールします。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/ptc-runtime-python/locale/en.json b/packages/experimental/ptc-runtime-python/locale/en.json new file mode 100644 index 0000000000..2d517eeff8 --- /dev/null +++ b/packages/experimental/ptc-runtime-python/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Python PTC runtime", + "description": "Run programmatic tool-calling code in CPython subprocesses." + } +} diff --git a/packages/experimental/ptc-runtime-python/locale/ja.json b/packages/experimental/ptc-runtime-python/locale/ja.json new file mode 100644 index 0000000000..4c513ee6b1 --- /dev/null +++ b/packages/experimental/ptc-runtime-python/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Python PTC ランタイム", + "description": "CPython の子プロセスでプログラムによるツール呼び出しのコードを実行します。" + } +} diff --git a/packages/experimental/ptc-runtime-python/locale/zh.json b/packages/experimental/ptc-runtime-python/locale/zh.json new file mode 100644 index 0000000000..be2d2e2a95 --- /dev/null +++ b/packages/experimental/ptc-runtime-python/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Python PTC 运行时", + "description": "在 CPython 子进程中执行程序化工具调用代码。" + } +} diff --git a/packages/experimental/ptc-runtime-python/package.json b/packages/experimental/ptc-runtime-python/package.json index 51adf344af..d1a55c60e2 100644 --- a/packages/experimental/ptc-runtime-python/package.json +++ b/packages/experimental/ptc-runtime-python/package.json @@ -15,9 +15,11 @@ "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "py/**/*.py", "lib/types/**/*.d.ts" diff --git a/packages/experimental/ralph-bundle/locale/ja.json b/packages/experimental/ralph-bundle/locale/ja.json new file mode 100644 index 0000000000..27e804ced1 --- /dev/null +++ b/packages/experimental/ralph-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "Ralph ループ", + "description": "ユーザーが明示的に依頼した繰り返し作業を、新しいエージェントで実行します。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/session-inspector/locale/ja.json b/packages/experimental/session-inspector/locale/ja.json new file mode 100644 index 0000000000..d36d381ea8 --- /dev/null +++ b/packages/experimental/session-inspector/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションデータ検査", + "description": "セッションのサイドバーで、現在のセッションの生データとグループ化されたチャットメッセージの分析を有効にします。" + } +} diff --git a/packages/experimental/session-search/locale/ja.json b/packages/experimental/session-search/locale/ja.json new file mode 100644 index 0000000000..20c3565ab7 --- /dev/null +++ b/packages/experimental/session-search/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "セッション検索", + "description": "現在のワークスペースの過去のセッションを検索、読み取りするツールをエージェントに提供します。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/session-title-all-prompts-llm/locale/en.json b/packages/experimental/session-title-all-prompts-llm/locale/en.json new file mode 100644 index 0000000000..e3678c162f --- /dev/null +++ b/packages/experimental/session-title-all-prompts-llm/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "All-message session titles", + "description": "Generate session titles from all user messages in the session." + } +} diff --git a/packages/experimental/session-title-all-prompts-llm/locale/ja.json b/packages/experimental/session-title-all-prompts-llm/locale/ja.json new file mode 100644 index 0000000000..bfabae50de --- /dev/null +++ b/packages/experimental/session-title-all-prompts-llm/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "全メッセージからセッションタイトル生成", + "description": "セッション内のすべてのユーザーメッセージからタイトルを生成します。" + } +} diff --git a/packages/experimental/session-title-all-prompts-llm/locale/zh.json b/packages/experimental/session-title-all-prompts-llm/locale/zh.json new file mode 100644 index 0000000000..fefc7223b0 --- /dev/null +++ b/packages/experimental/session-title-all-prompts-llm/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "全部消息生成标题", + "description": "使用会话中的全部用户消息生成标题。" + } +} diff --git a/packages/experimental/session-title-all-prompts-llm/package.json b/packages/experimental/session-title-all-prompts-llm/package.json index 5eb1eb8ecb..6548114056 100644 --- a/packages/experimental/session-title-all-prompts-llm/package.json +++ b/packages/experimental/session-title-all-prompts-llm/package.json @@ -18,9 +18,10 @@ "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, - "files": ["lib/index.js", "lib/types/**/*.d.ts"], + "files": ["locale/*.json", "lib/index.js", "lib/types/**/*.d.ts"], "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-llm": "workspace:*", diff --git a/packages/experimental/session-titles-bundle/locale/ja.json b/packages/experimental/session-titles-bundle/locale/ja.json new file mode 100644 index 0000000000..7c99e8fa45 --- /dev/null +++ b/packages/experimental/session-titles-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "会話に追従するタイトル", + "description": "ユーザーから新しい指示を受け取ると、セッションのタイトルを更新します。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/skill-badge/locale/ja.json b/packages/experimental/skill-badge/locale/ja.json new file mode 100644 index 0000000000..36d8d7838b --- /dev/null +++ b/packages/experimental/skill-badge/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DSH", + "description": "公式の powered-by-DSH バッジスキルを提供します。" + } +} diff --git a/packages/experimental/speech-to-text-sensevoice/locale/ja.json b/packages/experimental/speech-to-text-sensevoice/locale/ja.json new file mode 100644 index 0000000000..15bdf12b02 --- /dev/null +++ b/packages/experimental/speech-to-text-sensevoice/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SenseVoice ローカル音声認識", + "description": "ローカルの SenseVoice を使用して録音を文字に起こします。" + } +} diff --git a/packages/experimental/speech-to-text/locale/ja.json b/packages/experimental/speech-to-text/locale/ja.json new file mode 100644 index 0000000000..293c4e0d42 --- /dev/null +++ b/packages/experimental/speech-to-text/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "音声認識", + "description": "音声文字起こしサービスを管理し、認識サービスを選択します。" + } +} diff --git a/packages/experimental/subagent-oar/locale/ja.json b/packages/experimental/subagent-oar/locale/ja.json new file mode 100644 index 0000000000..a6b65a1540 --- /dev/null +++ b/packages/experimental/subagent-oar/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "OAR サブエージェント", + "description": "OAR を通じてインストール済みのコーディングエージェントにタスクを委派します。Codex と Claude Code の設定を提供します。" + } +} diff --git a/packages/experimental/terminal-bundle/locale/ja.json b/packages/experimental/terminal-bundle/locale/ja.json new file mode 100644 index 0000000000..c0c91259d5 --- /dev/null +++ b/packages/experimental/terminal-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "永続ターミナル", + "description": "複数のツール呼び出しの間もシェルプロセスを実行し続けます。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/tool-agent-team/locale/ja.json b/packages/experimental/tool-agent-team/locale/ja.json new file mode 100644 index 0000000000..7e742597af --- /dev/null +++ b/packages/experimental/tool-agent-team/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "チームツール", + "description": "メンバーの連携、メッセージ交換、共有タスク管理のツールをエージェントに提供します。" + } +} diff --git a/packages/experimental/tool-ralph/locale/ja.json b/packages/experimental/tool-ralph/locale/ja.json new file mode 100644 index 0000000000..c016d6e957 --- /dev/null +++ b/packages/experimental/tool-ralph/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Ralph 反復ツール", + "description": "同じ目標に対してターンごとに新しいサブエージェントを実行し、前のターンの簡単な報告を引き継ぎます。" + } +} diff --git a/packages/experimental/tool-session-query/locale/en.json b/packages/experimental/tool-session-query/locale/en.json new file mode 100644 index 0000000000..74fbb6c35c --- /dev/null +++ b/packages/experimental/tool-session-query/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Session history tools", + "description": "Search session history and read trajectories and events according to workspace permissions." + } +} diff --git a/packages/experimental/tool-session-query/locale/ja.json b/packages/experimental/tool-session-query/locale/ja.json new file mode 100644 index 0000000000..ee76b8ba39 --- /dev/null +++ b/packages/experimental/tool-session-query/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション履歴ツール", + "description": "ワークスペースの権限に従ってセッション履歴を検索し、実行履歴とイベントを読み取ります。" + } +} diff --git a/packages/experimental/tool-session-query/locale/zh.json b/packages/experimental/tool-session-query/locale/zh.json new file mode 100644 index 0000000000..d0b53d9c9b --- /dev/null +++ b/packages/experimental/tool-session-query/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "会话历史工具", + "description": "按工作区权限搜索会话历史,并读取轨迹和事件。" + } +} diff --git a/packages/experimental/tool-session-query/package.json b/packages/experimental/tool-session-query/package.json index ad22c3f239..224345839f 100644 --- a/packages/experimental/tool-session-query/package.json +++ b/packages/experimental/tool-session-query/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/experimental/tool-subagent-oar/locale/ja.json b/packages/experimental/tool-subagent-oar/locale/ja.json new file mode 100644 index 0000000000..42dde0747b --- /dev/null +++ b/packages/experimental/tool-subagent-oar/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "OAR サブエージェントツール", + "description": "独立したタスクごとに、設定済みの外部エージェントを選択します。" + } +} diff --git a/packages/experimental/tool-terminal/locale/en.json b/packages/experimental/tool-terminal/locale/en.json new file mode 100644 index 0000000000..6e7e530cbc --- /dev/null +++ b/packages/experimental/tool-terminal/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Persistent terminal tools", + "description": "Provide six persistent PTY tools with isolated session ownership and background task integration." + } +} diff --git a/packages/experimental/tool-terminal/locale/ja.json b/packages/experimental/tool-terminal/locale/ja.json new file mode 100644 index 0000000000..f37e8e5a00 --- /dev/null +++ b/packages/experimental/tool-terminal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "永続ターミナルツール", + "description": "6 つの永続 PTY ツールを提供し、セッションの所有権を分離してバックグラウンドタスクと連携します。" + } +} diff --git a/packages/experimental/tool-terminal/locale/zh.json b/packages/experimental/tool-terminal/locale/zh.json new file mode 100644 index 0000000000..5ee95bb288 --- /dev/null +++ b/packages/experimental/tool-terminal/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "持久终端工具", + "description": "提供六个持久 PTY 工具,隔离会话所有权并集成后台任务。" + } +} diff --git a/packages/experimental/tool-terminal/package.json b/packages/experimental/tool-terminal/package.json index 63f187fbcf..de91769fe7 100644 --- a/packages/experimental/tool-terminal/package.json +++ b/packages/experimental/tool-terminal/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/experimental/tool-worktree/locale/ja.json b/packages/experimental/tool-worktree/locale/ja.json new file mode 100644 index 0000000000..6038b91ac8 --- /dev/null +++ b/packages/experimental/tool-worktree/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "Git ワークツリー", + "description": "エージェントが新しい Git ブランチとワークツリーを作成し、そこで作業を続けられます。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/translator/locale/en.json b/packages/experimental/translator/locale/en.json new file mode 100644 index 0000000000..81862cf2a0 --- /dev/null +++ b/packages/experimental/translator/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Translation service", + "description": "Translate text and reuse translations saved in the session." + } +} diff --git a/packages/experimental/translator/locale/ja.json b/packages/experimental/translator/locale/ja.json new file mode 100644 index 0000000000..6a6a4f054d --- /dev/null +++ b/packages/experimental/translator/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "翻訳サービス", + "description": "機械翻訳を提供し、セッションに保存された翻訳結果を再利用します。" + } +} diff --git a/packages/experimental/translator/locale/zh.json b/packages/experimental/translator/locale/zh.json new file mode 100644 index 0000000000..24b4fb6b87 --- /dev/null +++ b/packages/experimental/translator/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "翻译服务", + "description": "提供机器翻译,并复用会话中已保存的翻译结果。" + } +} diff --git a/packages/experimental/translator/package.json b/packages/experimental/translator/package.json index 54e8928505..a0c494438c 100644 --- a/packages/experimental/translator/package.json +++ b/packages/experimental/translator/package.json @@ -23,9 +23,11 @@ "types": "./lib/types/types.d.ts", "default": "./lib/types/types.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.js", "lib/types/**/*.d.ts" diff --git a/packages/experimental/voice-input-bundle/locale/en.json b/packages/experimental/voice-input-bundle/locale/en.json index cfa2a70585..a88375bd63 100644 --- a/packages/experimental/voice-input-bundle/locale/en.json +++ b/packages/experimental/voice-input-bundle/locale/en.json @@ -1,7 +1,7 @@ { "meta": { "title": "Voice input", - "description": "Transcribe recordings locally with SenseVoice; first use requires installing dependencies", + "description": "Transcribe recordings locally with SenseVoice; first use requires installing dependencies.", "detail": "docs/DETAIL.md" } } diff --git a/packages/experimental/voice-input-bundle/locale/ja.json b/packages/experimental/voice-input-bundle/locale/ja.json new file mode 100644 index 0000000000..b5d9ea6c48 --- /dev/null +++ b/packages/experimental/voice-input-bundle/locale/ja.json @@ -0,0 +1,7 @@ +{ + "meta": { + "title": "音声入力", + "description": "ローカルの SenseVoice で録音を文字に起こします。初回利用時には依存関係のインストールが必要です。", + "detail": "docs/DETAIL.md" + } +} diff --git a/packages/experimental/webhook-github/locale/en.json b/packages/experimental/webhook-github/locale/en.json new file mode 100644 index 0000000000..3fc2a6a50c --- /dev/null +++ b/packages/experimental/webhook-github/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "GitHub webhooks", + "description": "Verify signed GitHub HTTP webhooks and forward them to the Webhook service." + } +} diff --git a/packages/experimental/webhook-github/locale/ja.json b/packages/experimental/webhook-github/locale/ja.json new file mode 100644 index 0000000000..6cf46b79ee --- /dev/null +++ b/packages/experimental/webhook-github/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "GitHub Webhook", + "description": "GitHub HTTP Webhook の署名を検証し、Webhook ランタイムに転送します。" + } +} diff --git a/packages/experimental/webhook-github/locale/zh.json b/packages/experimental/webhook-github/locale/zh.json new file mode 100644 index 0000000000..ab2cf1d665 --- /dev/null +++ b/packages/experimental/webhook-github/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "GitHub Webhook", + "description": "验证签名的 GitHub HTTP Webhook,并转发给 Webhook 运行时。" + } +} diff --git a/packages/experimental/webhook-github/package.json b/packages/experimental/webhook-github/package.json index de1a30afe8..c7519316ec 100644 --- a/packages/experimental/webhook-github/package.json +++ b/packages/experimental/webhook-github/package.json @@ -23,10 +23,12 @@ "default": "./lib/types/types.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./examples/*": "./examples/*" }, "files": [ + "locale/*.json", "lib/index.js", "examples/github-review/cordis.yml", "examples/github-review/github-ready-review-rule.mjs", diff --git a/packages/experimental/webhook/locale/en.json b/packages/experimental/webhook/locale/en.json new file mode 100644 index 0000000000..464b75e099 --- /dev/null +++ b/packages/experimental/webhook/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Webhook runtime", + "description": "Create Harness sessions in a workspace through Webhook rules without waiting for completion." + } +} diff --git a/packages/experimental/webhook/locale/ja.json b/packages/experimental/webhook/locale/ja.json new file mode 100644 index 0000000000..7583a600ea --- /dev/null +++ b/packages/experimental/webhook/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Webhook ランタイム", + "description": "応答を待たない Webhook ルールに従い、ワークスペースに属する Harness セッションを作成します。" + } +} diff --git a/packages/experimental/webhook/locale/zh.json b/packages/experimental/webhook/locale/zh.json new file mode 100644 index 0000000000..c0fde5ca1a --- /dev/null +++ b/packages/experimental/webhook/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Webhook 运行时", + "description": "以发送后不等待的规则创建基于工作区的 Harness 会话。" + } +} diff --git a/packages/experimental/webhook/package.json b/packages/experimental/webhook/package.json index d912cf485a..2cdb485633 100644 --- a/packages/experimental/webhook/package.json +++ b/packages/experimental/webhook/package.json @@ -23,9 +23,11 @@ "default": "./lib/types/types.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.js", "lib/types/**/*.d.ts" diff --git a/packages/experimental/worktree/locale/en.json b/packages/experimental/worktree/locale/en.json new file mode 100644 index 0000000000..b05367c81e --- /dev/null +++ b/packages/experimental/worktree/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Worktree service", + "description": "Create named Git worktrees and change the current session's working directory." + } +} diff --git a/packages/experimental/worktree/locale/ja.json b/packages/experimental/worktree/locale/ja.json new file mode 100644 index 0000000000..f2a6574fc2 --- /dev/null +++ b/packages/experimental/worktree/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークツリーサービス", + "description": "名前付きの Git ワークツリーを作成し、呼び出し元セッションの作業ディレクトリを変更します。" + } +} diff --git a/packages/experimental/worktree/locale/zh.json b/packages/experimental/worktree/locale/zh.json new file mode 100644 index 0000000000..5518a9b689 --- /dev/null +++ b/packages/experimental/worktree/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "工作树服务", + "description": "创建命名的 Git 工作树,并切换当前会话的工作目录。" + } +} diff --git a/packages/experimental/worktree/package.json b/packages/experimental/worktree/package.json index af616f10b2..a5907e7480 100644 --- a/packages/experimental/worktree/package.json +++ b/packages/experimental/worktree/package.json @@ -14,9 +14,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/extensions/cordis-client-runner/locale/ja.json b/packages/extensions/cordis-client-runner/locale/ja.json new file mode 100644 index 0000000000..facedfb4fc --- /dev/null +++ b/packages/extensions/cordis-client-runner/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "動的プラグインブラウザランナー", + "description": "一時的な動的プラグインのブラウザ側を読み込み、実行します。" + } +} diff --git a/packages/extensions/cordis-host-runner/locale/ja.json b/packages/extensions/cordis-host-runner/locale/ja.json new file mode 100644 index 0000000000..62178e5b13 --- /dev/null +++ b/packages/extensions/cordis-host-runner/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "動的プラグインサーバーランナー", + "description": "一時的な動的プラグインの定義を管理し、サーバー側を実行します。" + } +} diff --git a/packages/extensions/tool-cordis/locale/host/ja.json b/packages/extensions/tool-cordis/locale/host/ja.json new file mode 100644 index 0000000000..69a35dcab8 --- /dev/null +++ b/packages/extensions/tool-cordis/locale/host/ja.json @@ -0,0 +1,5 @@ +{ + "meta": { + "title": "プラグイン API 検査サービス" + } +} diff --git a/packages/extensions/tool-cordis/locale/ja.json b/packages/extensions/tool-cordis/locale/ja.json new file mode 100644 index 0000000000..4b6c8c201b --- /dev/null +++ b/packages/extensions/tool-cordis/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン API 検索ツール", + "description": "プラグインの開発前に、AI がサーバーとブラウザの利用可能な API を調べられます。" + } +} diff --git a/packages/extensions/ui-cordis/locale/ja.json b/packages/extensions/ui-cordis/locale/ja.json new file mode 100644 index 0000000000..3c624161c4 --- /dev/null +++ b/packages/extensions/ui-cordis/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "動的プラグイン実行カード", + "description": "動的プラグインの定義を表示し、実行と停止の操作を提供します。" + } +} diff --git a/packages/feedback/command-feedback/locale/ja.json b/packages/feedback/command-feedback/locale/ja.json new file mode 100644 index 0000000000..b8734e3000 --- /dev/null +++ b/packages/feedback/command-feedback/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションフィードバックコマンド", + "description": "/feedback などを通じて、セッションに対するユーザーの評価を記録します。" + } +} diff --git a/packages/feedback/message-feedback/locale/ja.json b/packages/feedback/message-feedback/locale/ja.json new file mode 100644 index 0000000000..011b9494b8 --- /dev/null +++ b/packages/feedback/message-feedback/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "メッセージフィードバック記録", + "description": "アシスタントの回答に対する肯定・否定の評価と追加の意見を記録します。" + } +} diff --git a/packages/fs/fs-local/locale/en.json b/packages/fs/fs-local/locale/en.json new file mode 100644 index 0000000000..a3022206c6 --- /dev/null +++ b/packages/fs/fs-local/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Local filesystem", + "description": "Access files through the local filesystem." + } +} diff --git a/packages/fs/fs-local/locale/ja.json b/packages/fs/fs-local/locale/ja.json new file mode 100644 index 0000000000..40917083a7 --- /dev/null +++ b/packages/fs/fs-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカルファイルシステム", + "description": "ローカルファイルシステムでファイルアクセスサービスを実装します。" + } +} diff --git a/packages/fs/fs-local/locale/zh.json b/packages/fs/fs-local/locale/zh.json new file mode 100644 index 0000000000..734128349d --- /dev/null +++ b/packages/fs/fs-local/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "本地文件系统", + "description": "使用本地文件系统实现文件访问服务。" + } +} diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index f4cf08b014..0ba553b271 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/fs/fs-observation-policy/locale/ja.json b/packages/fs/fs-observation-policy/locale/ja.json new file mode 100644 index 0000000000..b5f1dbd993 --- /dev/null +++ b/packages/fs/fs-observation-policy/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイル編集保護", + "description": "AI に編集前のファイル読み取りを要求し、ファイルが変化した場合は内容を再確認させます。" + } +} diff --git a/packages/fs/fs-sandbox/locale/ja.json b/packages/fs/fs-sandbox/locale/ja.json new file mode 100644 index 0000000000..81ce3815e6 --- /dev/null +++ b/packages/fs/fs-sandbox/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイルサンドボックスアクセス", + "description": "現在の権限モードに従って、ファイルの書き込みと編集を制限します。" + } +} diff --git a/packages/fs/tool-fs-search/locale/ja.json b/packages/fs/tool-fs-search/locale/ja.json new file mode 100644 index 0000000000..f22c5ddcbb --- /dev/null +++ b/packages/fs/tool-fs-search/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイル検索ツール", + "description": "AI がファイル名やテキスト内容でローカルファイルを検索できます。" + } +} diff --git a/packages/fs/tool-fs/locale/ja.json b/packages/fs/tool-fs/locale/ja.json new file mode 100644 index 0000000000..d3fc22498a --- /dev/null +++ b/packages/fs/tool-fs/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ファイル読み書きツール", + "description": "AI が作業ファイルを読み取り、作成、編集できます。" + } +} diff --git a/packages/fs/tool-str-replace-editor/locale/en.json b/packages/fs/tool-str-replace-editor/locale/en.json new file mode 100644 index 0000000000..238d8aa7b6 --- /dev/null +++ b/packages/fs/tool-str-replace-editor/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Text editor tools", + "description": "View, create, replace, and insert text through the filesystem service." + } +} diff --git a/packages/fs/tool-str-replace-editor/locale/ja.json b/packages/fs/tool-str-replace-editor/locale/ja.json new file mode 100644 index 0000000000..35a19015b6 --- /dev/null +++ b/packages/fs/tool-str-replace-editor/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "テキスト編集ツール", + "description": "ファイルシステムサービスを通じて、表示、作成、文字列置換、行単位の挿入ツールを提供します。" + } +} diff --git a/packages/fs/tool-str-replace-editor/locale/zh.json b/packages/fs/tool-str-replace-editor/locale/zh.json new file mode 100644 index 0000000000..3e148641fc --- /dev/null +++ b/packages/fs/tool-str-replace-editor/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "文本编辑工具", + "description": "通过文件系统服务提供查看、创建、原文替换和按行插入工具。" + } +} diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index 7c9c660bc0..e08559cebc 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -18,9 +18,11 @@ "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/goal/command-goal/locale/ja.json b/packages/goal/command-goal/locale/ja.json new file mode 100644 index 0000000000..80dad4fd44 --- /dev/null +++ b/packages/goal/command-goal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "目標管理コマンド", + "description": "ユーザーのコマンドで現在のセッションの目標を設定、管理します。" + } +} diff --git a/packages/goal/goal-round-driver/locale/ja.json b/packages/goal/goal-round-driver/locale/ja.json new file mode 100644 index 0000000000..7e4c756d19 --- /dev/null +++ b/packages/goal/goal-round-driver/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "目標の自動継続", + "description": "条件と予算が許す範囲で、AI が現在のセッションの目標を引き続き進められるようにします。" + } +} diff --git a/packages/goal/goal/locale/ja.json b/packages/goal/goal/locale/ja.json new file mode 100644 index 0000000000..e718e74ae5 --- /dev/null +++ b/packages/goal/goal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション目標サービス", + "description": "セッションの目標を記録し、その状態とライフサイクルを管理します。" + } +} diff --git a/packages/goal/tool-goal/locale/ja.json b/packages/goal/tool-goal/locale/ja.json new file mode 100644 index 0000000000..94c686c0ea --- /dev/null +++ b/packages/goal/tool-goal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "目標管理ツール", + "description": "AI が現在のセッションの目標を設定、確認、更新できます。" + } +} diff --git a/packages/guard/repeat-tool-reminder/locale/ja.json b/packages/guard/repeat-tool-reminder/locale/ja.json new file mode 100644 index 0000000000..9ef62adde4 --- /dev/null +++ b/packages/guard/repeat-tool-reminder/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール呼び出しの繰り返し通知", + "description": "AI が同じツール呼び出しを繰り返した場合に、方法の調整を促します。" + } +} diff --git a/packages/guard/timeout-policy/locale/ja.json b/packages/guard/timeout-policy/locale/ja.json new file mode 100644 index 0000000000..89d67d5884 --- /dev/null +++ b/packages/guard/timeout-policy/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール呼び出しタイムアウト制御", + "description": "ツールごとの制限時間に従ってキャンセルを通知し、タイムアウト結果を返します。" + } +} diff --git a/packages/host/directory-picker-auto/locale/ja.json b/packages/host/directory-picker-auto/locale/ja.json new file mode 100644 index 0000000000..124b822855 --- /dev/null +++ b/packages/host/directory-picker-auto/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ディレクトリ選択方式の切り替え", + "description": "実行環境に応じてシステムのディレクトリ選択ダイアログかアプリ内参照を選びます。" + } +} diff --git a/packages/host/directory-picker-browse/locale/ja.json b/packages/host/directory-picker-browse/locale/ja.json new file mode 100644 index 0000000000..5d0b43c6ed --- /dev/null +++ b/packages/host/directory-picker-browse/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "アプリ内ディレクトリ参照サービス", + "description": "アプリ内でディレクトリを選択できるよう、ローカルディレクトリの一覧と作成機能を提供します。" + } +} diff --git a/packages/host/directory-picker-native/locale/ja.json b/packages/host/directory-picker-native/locale/ja.json new file mode 100644 index 0000000000..abc2016375 --- /dev/null +++ b/packages/host/directory-picker-native/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "システムディレクトリ選択サービス", + "description": "OS のディレクトリ選択ダイアログを呼び出します。" + } +} diff --git a/packages/host/frontend-static/locale/en.json b/packages/host/frontend-static/locale/en.json new file mode 100644 index 0000000000..4a41a346a3 --- /dev/null +++ b/packages/host/frontend-static/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Static frontend server", + "description": "Serve the Web application's entry page and static files, reject paths outside their directory, and return 404 for missing resources." + } +} diff --git a/packages/host/frontend-static/locale/ja.json b/packages/host/frontend-static/locale/ja.json new file mode 100644 index 0000000000..7ed675cb87 --- /dev/null +++ b/packages/host/frontend-static/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "静的フロントエンドサーバー", + "description": "Web SPA の入口と静的リソースを配信し、ディレクトリ外へのアクセスを拒否し、存在しないリソースには 404 を返します。" + } +} diff --git a/packages/host/frontend-static/locale/zh.json b/packages/host/frontend-static/locale/zh.json new file mode 100644 index 0000000000..1ff31b407d --- /dev/null +++ b/packages/host/frontend-static/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "前端静态资源服务", + "description": "提供 Web 单页应用的入口与静态资源,拒绝路径越界并为缺失资源返回 404。" + } +} diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 1830819b09..516a6d59fd 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/host/open-in-app/locale/ja.json b/packages/host/open-in-app/locale/ja.json new file mode 100644 index 0000000000..bb6eb51a09 --- /dev/null +++ b/packages/host/open-in-app/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "外部アプリで開くサービス", + "description": "利用可能なローカルアプリを探し、選択したアプリでファイルやワークスペースを開きます。" + } +} diff --git a/packages/host/plugin-inventory/locale/ja.json b/packages/host/plugin-inventory/locale/ja.json new file mode 100644 index 0000000000..2767714e82 --- /dev/null +++ b/packages/host/plugin-inventory/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "プラグイン一覧サービス", + "description": "現在のプラグイン項目、設定上の有効状態、実行状態の読み取り専用一覧を提供します。" + } +} diff --git a/packages/host/product-telemetry-otel/locale/ja.json b/packages/host/product-telemetry-otel/locale/ja.json new file mode 100644 index 0000000000..20f6d102ad --- /dev/null +++ b/packages/host/product-telemetry-otel/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "製品利用イベント送信", + "description": "OpenTelemetry を通じて、指定された製品利用イベントを設定済みのサービスに送信します。" + } +} diff --git a/packages/host/webserver/locale/ja.json b/packages/host/webserver/locale/ja.json new file mode 100644 index 0000000000..35c1b9dfd1 --- /dev/null +++ b/packages/host/webserver/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web サービス", + "description": "Web ページと API ルートを登録し、HTTP サービスを提供します。" + } +} diff --git a/packages/interaction/commands/locale/ja.json b/packages/interaction/commands/locale/ja.json new file mode 100644 index 0000000000..b757ce7f5d --- /dev/null +++ b/packages/interaction/commands/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ユーザーコマンドサービス", + "description": "プラグインが提供するユーザーコマンドを登録、管理します。" + } +} diff --git a/packages/interaction/permission-presets/locale/ja.json b/packages/interaction/permission-presets/locale/ja.json new file mode 100644 index 0000000000..08c22bf3fe --- /dev/null +++ b/packages/interaction/permission-presets/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "権限モードサービス", + "description": "ユーザーが選択する権限モードを管理し、対応するサンドボックスと承認ポリシーを統一します。" + } +} diff --git a/packages/interaction/tool-ask-user/locale/ja.json b/packages/interaction/tool-ask-user/locale/ja.json new file mode 100644 index 0000000000..9c45b2a110 --- /dev/null +++ b/packages/interaction/tool-ask-user/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ユーザーへの質問ツール", + "description": "情報の補足や選択が必要な場合に、AI がユーザーに質問できます。" + } +} diff --git a/packages/interaction/user-approval/locale/ja.json b/packages/interaction/user-approval/locale/ja.json new file mode 100644 index 0000000000..527b202ffc --- /dev/null +++ b/packages/interaction/user-approval/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ユーザー承認サービス", + "description": "操作の許可をユーザーに求め、今回の承認結果を返します。" + } +} diff --git a/packages/interaction/user-questions/locale/ja.json b/packages/interaction/user-questions/locale/ja.json new file mode 100644 index 0000000000..aacfd10eb5 --- /dev/null +++ b/packages/interaction/user-questions/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ユーザー質問サービス", + "description": "実行中の AI がユーザーに質問し、回答を待つことができます。" + } +} diff --git a/packages/jobs/jobs-local/locale/ja.json b/packages/jobs/jobs-local/locale/ja.json new file mode 100644 index 0000000000..f2410e7c98 --- /dev/null +++ b/packages/jobs/jobs-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカルバックグラウンドタスク", + "description": "現在のプロセスのバックグラウンドタスクと、その実行状態を管理します。" + } +} diff --git a/packages/jobs/tool-jobs/locale/ja.json b/packages/jobs/tool-jobs/locale/ja.json new file mode 100644 index 0000000000..7934c05ff0 --- /dev/null +++ b/packages/jobs/tool-jobs/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "バックグラウンドタスクツール", + "description": "AI がバックグラウンドタスクを確認し、出力を読み取り、タスクを停止できます。" + } +} diff --git a/packages/llm/deepseek-llm-api-extensions/locale/ja.json b/packages/llm/deepseek-llm-api-extensions/locale/ja.json new file mode 100644 index 0000000000..6e76e16edc --- /dev/null +++ b/packages/llm/deepseek-llm-api-extensions/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek API 拡張", + "description": "他のプラグインが DeepSeek モデルのリクエストに拡張フィールドを追加できます。" + } +} diff --git a/packages/llm/llm-deepseek-account/locale/ja.json b/packages/llm/llm-deepseek-account/locale/ja.json new file mode 100644 index 0000000000..5f464bda5f --- /dev/null +++ b/packages/llm/llm-deepseek-account/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek アカウントモデル接続", + "description": "ログイン済みの DeepSeek アカウントでモデルサービスに接続します。" + } +} diff --git a/packages/llm/llm-deepseek-api-key/locale/ja.json b/packages/llm/llm-deepseek-api-key/locale/ja.json new file mode 100644 index 0000000000..7ffae81116 --- /dev/null +++ b/packages/llm/llm-deepseek-api-key/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek API キー接続", + "description": "API キーを使用して DeepSeek モデルサービスに接続します。" + } +} diff --git a/packages/llm/llm-pi-ai/locale/ja.json b/packages/llm/llm-pi-ai/locale/ja.json new file mode 100644 index 0000000000..e7370ee2dd --- /dev/null +++ b/packages/llm/llm-pi-ai/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "pi-ai モデルアダプター", + "description": "pi-ai を通じて DeepSeek Harness に DeepSeek モデルを接続する、dsh-llm-deepseek の設計検証用実装です。" + } +} diff --git a/packages/llm/llm-retry/locale/ja.json b/packages/llm/llm-retry/locale/ja.json new file mode 100644 index 0000000000..35939aaaa4 --- /dev/null +++ b/packages/llm/llm-retry/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "モデルリクエスト再試行", + "description": "モデル提供元のポリシーに従って、失敗したリクエストを再試行します。" + } +} diff --git a/packages/llm/llm/locale/ja.json b/packages/llm/llm/locale/ja.json new file mode 100644 index 0000000000..43c540f11f --- /dev/null +++ b/packages/llm/llm/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "モデル呼び出しサービス", + "description": "異なるモデルを呼び出すための共通インターフェースを提供します。" + } +} diff --git a/packages/llm/plugin-package-inventory-deepseek/locale/ja.json b/packages/llm/plugin-package-inventory-deepseek/locale/ja.json new file mode 100644 index 0000000000..5caedea075 --- /dev/null +++ b/packages/llm/plugin-package-inventory-deepseek/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek プラグイン一覧送信", + "description": "公式モデル API のリクエストと共に、現在有効なプラグインパッケージの一覧を送信します。" + } +} diff --git a/packages/llm/token-meter/locale/ja.json b/packages/llm/token-meter/locale/ja.json new file mode 100644 index 0000000000..c58887ffca --- /dev/null +++ b/packages/llm/token-meter/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Token 計測", + "description": "モデルのコンテキストの Token 使用量を見積もり、圧縮などの予算判断に使用します。" + } +} diff --git a/packages/lsp/lsp-stdio/locale/en.json b/packages/lsp/lsp-stdio/locale/en.json new file mode 100644 index 0000000000..f3d86d7623 --- /dev/null +++ b/packages/lsp/lsp-stdio/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Stdio language server provider", + "description": "Connect to language servers through subprocesses and JSON-RPC, open files as needed, and run code queries." + } +} diff --git a/packages/lsp/lsp-stdio/locale/ja.json b/packages/lsp/lsp-stdio/locale/ja.json new file mode 100644 index 0000000000..2fb9954214 --- /dev/null +++ b/packages/lsp/lsp-stdio/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "標準入出力の言語サーバー提供元", + "description": "子プロセスと JSON-RPC で言語サーバーに接続し、必要に応じてファイルを開いてコードを照会します。" + } +} diff --git a/packages/lsp/lsp-stdio/locale/zh.json b/packages/lsp/lsp-stdio/locale/zh.json new file mode 100644 index 0000000000..cce30ad883 --- /dev/null +++ b/packages/lsp/lsp-stdio/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "标准输入输出语言服务器", + "description": "通过子进程和 JSON-RPC 连接语言服务器,按需打开文件并执行代码查询。" + } +} diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index 24f18ecffe..446dbd765b 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/lsp/lsp/locale/en.json b/packages/lsp/lsp/locale/en.json new file mode 100644 index 0000000000..bbd90e3f94 --- /dev/null +++ b/packages/lsp/lsp/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Language server service", + "description": "Register language servers for definition, reference, implementation, and hover queries with consistent errors." + } +} diff --git a/packages/lsp/lsp/locale/ja.json b/packages/lsp/lsp/locale/ja.json new file mode 100644 index 0000000000..367678be2e --- /dev/null +++ b/packages/lsp/lsp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "言語サーバーサービス", + "description": "言語サーバーを登録し、定義、参照、実装、ホバーの照会とエラーを統一します。" + } +} diff --git a/packages/lsp/lsp/locale/zh.json b/packages/lsp/lsp/locale/zh.json new file mode 100644 index 0000000000..8ff0e58b31 --- /dev/null +++ b/packages/lsp/lsp/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "语言服务注册", + "description": "注册语言服务器,统一定义、引用、实现和悬停查询及错误。" + } +} diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index 3b3bbdac4e..765e310c94 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/lsp/tool-lsp/locale/en.json b/packages/lsp/tool-lsp/locale/en.json new file mode 100644 index 0000000000..f3219f891c --- /dev/null +++ b/packages/lsp/tool-lsp/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Language server tools", + "description": "Query definitions, references, implementations, and hover information using one-based UTF-16 cursor positions and bounded results." + } +} diff --git a/packages/lsp/tool-lsp/locale/ja.json b/packages/lsp/tool-lsp/locale/ja.json new file mode 100644 index 0000000000..7bb0b90d7f --- /dev/null +++ b/packages/lsp/tool-lsp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "言語サーバーツール", + "description": "定義、参照、実装、ホバーの照会を提供します。1 から始まる UTF-16 カーソル座標を使用し、返される位置の数を制限します。" + } +} diff --git a/packages/lsp/tool-lsp/locale/zh.json b/packages/lsp/tool-lsp/locale/zh.json new file mode 100644 index 0000000000..2840c0d6d3 --- /dev/null +++ b/packages/lsp/tool-lsp/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "语言服务器工具", + "description": "提供定义、引用、实现和悬停查询,使用从 1 开始的 UTF-16 光标坐标并限制返回位置数量。" + } +} diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index 7568b62b7f..43e0c36271 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/mcp/mcp-client/locale/en.json b/packages/mcp/mcp-client/locale/en.json new file mode 100644 index 0000000000..1ef1b105a6 --- /dev/null +++ b/packages/mcp/mcp-client/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "MCP client", + "description": "Connect to MCP servers and make their tools available in Harness." + } +} diff --git a/packages/mcp/mcp-client/locale/ja.json b/packages/mcp/mcp-client/locale/ja.json new file mode 100644 index 0000000000..40c6b89630 --- /dev/null +++ b/packages/mcp/mcp-client/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "MCP クライアント", + "description": "MCP サーバーに接続し、そのツールを Harness に登録します。" + } +} diff --git a/packages/mcp/mcp-client/locale/zh.json b/packages/mcp/mcp-client/locale/zh.json new file mode 100644 index 0000000000..10cda0a468 --- /dev/null +++ b/packages/mcp/mcp-client/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "MCP 客户端", + "description": "连接 MCP 服务器,并将其工具注册到 Harness。" + } +} diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index cf8a906654..45a7c5f782 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/mcp/mcp-resources/locale/ja.json b/packages/mcp/mcp-resources/locale/ja.json new file mode 100644 index 0000000000..2d3a8db3ab --- /dev/null +++ b/packages/mcp/mcp-resources/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "MCP リソースアクセス", + "description": "AI が接続済み MCP サービスのリソースを発見し、読み取れます。" + } +} diff --git a/packages/plan/plan-mode/locale/ja.json b/packages/plan/plan-mode/locale/ja.json new file mode 100644 index 0000000000..11f4ac6630 --- /dev/null +++ b/packages/plan/plan-mode/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "計画モード", + "description": "AI が先に計画を作成し、ユーザーがレビューしてから実行に切り替えます。" + } +} diff --git a/packages/preset/agent-preset-registry/locale/ja.json b/packages/preset/agent-preset-registry/locale/ja.json new file mode 100644 index 0000000000..d68f24f15e --- /dev/null +++ b/packages/preset/agent-preset-registry/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェントプリセット管理", + "description": "エージェントプリセットを登録し、その構成への変更を保存します。" + } +} diff --git a/packages/preset/agent-preset/locale/ja.json b/packages/preset/agent-preset/locale/ja.json new file mode 100644 index 0000000000..bcbbf36e35 --- /dev/null +++ b/packages/preset/agent-preset/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェントプリセット定義", + "description": "エージェントプリセットと、それが使用するプラグイン構成を宣言します。" + } +} diff --git a/packages/preset/agent-preset/skills/cordis-plugin-development/SKILL.md b/packages/preset/agent-preset/skills/cordis-plugin-development/SKILL.md index 938798a374..8a3fd8cf62 100644 --- a/packages/preset/agent-preset/skills/cordis-plugin-development/SKILL.md +++ b/packages/preset/agent-preset/skills/cordis-plugin-development/SKILL.md @@ -43,8 +43,8 @@ The files below live in this skill's base directory, which the `skill` tool repo | Web UI: Client manifest, module loader, slot registration | `references/ui-plugin.md` | | Connecting an MCP server through a configuration-only bundle | `references/mcp-bundle.md` | | Page/panel design checks and verification without browser control | `references/verification.md` | -| UI plugin template, including display resources | `templates/decoration/package.json`, `templates/decoration/cordis.patch.yml`, `templates/decoration/index.js`, `templates/decoration/client.js`, `templates/decoration/locale/en.json`, `templates/decoration/icon.svg` | -| MCP bundle template, including display resources | `templates/mcp/package.json`, `templates/mcp/cordis.patch.yml`, `templates/mcp/locale/en.json`, `templates/mcp/icon.svg` | +| UI plugin template, including display resources | `templates/decoration/package.json`, `templates/decoration/cordis.patch.yml`, `templates/decoration/index.js`, `templates/decoration/client.js`, `templates/decoration/locale/en.json`, `templates/decoration/locale/ja.json`, `templates/decoration/icon.svg` | +| MCP bundle template, including display resources | `templates/mcp/package.json`, `templates/mcp/cordis.patch.yml`, `templates/mcp/locale/en.json`, `templates/mcp/locale/ja.json`, `templates/mcp/icon.svg` | | Loader patch dialect and the list of installable plugin packages | the `cordis-composition-reference` skill | | Choosing extension points, contexts, and state mechanisms for upgrade stability and performance | `references/practices.md` | | Sharing application operations between UI actions and agent tools | `references/user-actions.md` | diff --git a/packages/preset/agent-preset/skills/cordis-plugin-development/templates/decoration/locale/ja.json b/packages/preset/agent-preset/skills/cordis-plugin-development/templates/decoration/locale/ja.json new file mode 100644 index 0000000000..fe2b3bf845 --- /dev/null +++ b/packages/preset/agent-preset/skills/cordis-plugin-development/templates/decoration/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "入力欄の装飾", + "description": "メッセージ入力欄の下に青い円を表示します。" + } +} diff --git a/packages/preset/agent-preset/skills/cordis-plugin-development/templates/mcp/locale/ja.json b/packages/preset/agent-preset/skills/cordis-plugin-development/templates/mcp/locale/ja.json new file mode 100644 index 0000000000..a91e3615ff --- /dev/null +++ b/packages/preset/agent-preset/skills/cordis-plugin-development/templates/mcp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "MCP 接続デモ", + "description": "リモート MCP サーバーに接続し、そのツールをエージェントが使用できるようにします。" + } +} diff --git a/packages/preset/persona/locale/ja.json b/packages/preset/persona/locale/ja.json new file mode 100644 index 0000000000..017b262baa --- /dev/null +++ b/packages/preset/persona/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "エージェントの役割設定", + "description": "構成に定義された役割と行動指示を現在のエージェントに提供します。" + } +} diff --git a/packages/ptc-runtime/ptc-runtime-node/locale/ja.json b/packages/ptc-runtime/ptc-runtime-node/locale/ja.json new file mode 100644 index 0000000000..3be03f52b7 --- /dev/null +++ b/packages/ptc-runtime/ptc-runtime-node/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Node PTC ランタイム", + "description": "サンドボックス内の Node プロセスで、ツール呼び出し用のコードを実行します。" + } +} diff --git a/packages/sandbox/sandbox-local/locale/ja.json b/packages/sandbox/sandbox-local/locale/ja.json new file mode 100644 index 0000000000..80faf4f871 --- /dev/null +++ b/packages/sandbox/sandbox-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカルプロセスサンドボックス", + "description": "OS に応じたプロセス分離を提供し、コマンドのアクセス範囲を制限します。" + } +} diff --git a/packages/sandbox/sandbox-policy/locale/ja.json b/packages/sandbox/sandbox-policy/locale/ja.json new file mode 100644 index 0000000000..4e7d207228 --- /dev/null +++ b/packages/sandbox/sandbox-policy/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サンドボックス権限ポリシー", + "description": "現在のセッションの権限モードとワークスペースに基づき、各操作の制限を決定します。" + } +} diff --git a/packages/sandbox/sandbox/README.i18n.yaml b/packages/sandbox/sandbox/README.i18n.yaml index 5746581d9d..ffd7e69baf 100644 --- a/packages/sandbox/sandbox/README.i18n.yaml +++ b/packages/sandbox/sandbox/README.i18n.yaml @@ -27,8 +27,8 @@ en: aabe9791ece99ec1 zh: 1dbc86eabb3a5548 /deepseek-ai-dsh-sandbox/use-this-package/denied-calls-and-escalation: - en: 92cf42bad65d112c - zh: 60fa2cb7e9c4c556 + en: 3960c33a1e322cf9 + zh: 4d85c962067fe7a1 /deepseek-ai-dsh-sandbox/use-this-package/fail-closed-behavior: en: 6bf240632a7a6bf5 zh: ebf414f5cf435875 diff --git a/packages/sandbox/sandbox/README.md b/packages/sandbox/sandbox/README.md index cb708a63c6..7014cc4730 100644 --- a/packages/sandbox/sandbox/README.md +++ b/packages/sandbox/sandbox/README.md @@ -63,7 +63,7 @@ Enforcement is reported per call: `full` means the backend governs every promise ### Denied calls and escalation -When a confined call is denied, the operation reports a denial marker naming the mode — `[sandbox: file access denied under mode]` — and, when the composition advertises escalation, an escalation hint. The model may retry the exact call once with `sandbox_permissions` (the narrowest wider mode that suffices) plus a `justification`; the approval service obtains consent for the operation. The request retains its audit reason and supplies English and Chinese presentation copy with the model's justification unchanged. Missing translations follow the locale service's fallback chain, ultimately English; requesters own their translated presentation text. A wider mode requires approval and applies to that one call only. Repeating the call's effective mode succeeds without approval; narrower targets remain invalid. +When a confined call is denied, the operation reports a denial marker naming the mode — `[sandbox: file access denied under mode]` — and, when the composition advertises escalation, an escalation hint. The model may retry the exact call once with `sandbox_permissions` (the narrowest wider mode that suffices) plus a `justification`; the approval service obtains consent for the operation. The request retains its audit reason and supplies English, Chinese, and Japanese presentation copy from `src/locales.ts`, with the model's justification unchanged. Missing translations follow the locale service's fallback chain, ultimately English; requesters own their translated presentation text. A wider mode requires approval and applies to that one call only. Repeating the call's effective mode succeeds without approval; narrower targets remain invalid. ### Fail-closed behavior diff --git a/packages/sandbox/sandbox/README.zh.md b/packages/sandbox/sandbox/README.zh.md index 3922a182fd..bc94b7f090 100644 --- a/packages/sandbox/sandbox/README.zh.md +++ b/packages/sandbox/sandbox/README.zh.md @@ -63,7 +63,7 @@ kind: "package-reference" ### 被拒绝的调用与升权 -受限调用被拒绝时,操作会报告指明模式的拒绝标记——`[sandbox: file access denied under mode]`——组合声明升权能力时还会给出升权提示。模型可以用 `sandbox_permissions`(足以放行的最窄更宽模式)加 `justification` 重试一次完全相同的调用;审批服务为操作取得同意。请求保留审计原因,同时提供英文和中文展示文案,模型给出的理由保持原样。缺失的译文遵循语言服务的回退链,最终回退到英文;请求方负责自己的展示译文。更宽的模式需要审批,且只作用于该次调用。重复指定调用的生效模式无需审批即可成功;更窄的目标仍然无效。 +受限调用被拒绝时,操作会报告指明模式的拒绝标记——`[sandbox: file access denied under mode]`——组合声明升权能力时还会给出升权提示。模型可以用 `sandbox_permissions`(足以放行的最窄更宽模式)加 `justification` 重试一次完全相同的调用;审批服务为操作取得同意。请求保留审计原因,同时从 `src/locales.ts` 提供英文、中文和日文展示文案,模型给出的理由保持原样。缺失的译文遵循语言服务的回退链,最终回退到英文;请求方负责自己的展示译文。更宽的模式需要审批,且只作用于该次调用。重复指定调用的生效模式无需审批即可成功;更窄的目标仍然无效。 ### 故障关闭行为 diff --git a/packages/sandbox/sandbox/src/escalation.ts b/packages/sandbox/sandbox/src/escalation.ts index 9e01fcbe41..c912fdd080 100644 --- a/packages/sandbox/sandbox/src/escalation.ts +++ b/packages/sandbox/sandbox/src/escalation.ts @@ -17,6 +17,7 @@ */ import { assertNever } from '@deepseek-ai/dsh-util-values' +import { escalationDisplayReason } from './locales.ts' import type { SandboxMode } from './index.ts' /** @@ -190,10 +191,7 @@ export async function approveEscalation(request: EscalationRequest, approv toolName: approval.toolName, callId: approval.callId, reason: `escalate sandbox to ${mode}: ${justification}`, - displayReason: { - en: `Allow this operation with ${mode} permissions: ${justification}`, - zh: `允许本次操作使用 ${mode} 权限:${justification}`, - }, + displayReason: escalationDisplayReason(mode, justification), ...approval.signal ? { signal: approval.signal } : {}, }) switch (outcome) { diff --git a/packages/sandbox/sandbox/src/locales.ts b/packages/sandbox/sandbox/src/locales.ts new file mode 100644 index 0000000000..30fc56d32d --- /dev/null +++ b/packages/sandbox/sandbox/src/locales.ts @@ -0,0 +1,26 @@ +/** Locale-owned sandbox approval text; audit inputs remain verbatim. */ + +/** English escalation messages. */ +export const en = { + escalation: (mode: string, justification: string): string => `Allow this operation with ${mode} permissions: ${justification}`, +} + +/** Chinese escalation messages. */ +export const zh = { + escalation: (mode: string, justification: string): string => `允许本次操作使用 ${mode} 权限:${justification}`, +} satisfies typeof en + +/** Japanese escalation messages. */ +export const ja = { + escalation: (mode: string, justification: string): string => `${mode} 権限でこの操作を許可します:${justification}`, +} satisfies typeof en + +/** + * Build translations for the existing Client localized-text resolver. + * @param mode - requested sandbox mode. + * @param justification - raw model justification, preserved in every translation. + * @returns localized approval text. + */ +export function escalationDisplayReason(mode: string, justification: string): Record<'en' | 'zh' | 'ja', string> { + return { en: en.escalation(mode, justification), zh: zh.escalation(mode, justification), ja: ja.escalation(mode, justification) } +} diff --git a/packages/sandbox/sandbox/tests/escalation.spec.ts b/packages/sandbox/sandbox/tests/escalation.spec.ts index 0223dc0a31..987ac0105b 100644 --- a/packages/sandbox/sandbox/tests/escalation.spec.ts +++ b/packages/sandbox/sandbox/tests/escalation.spec.ts @@ -89,6 +89,7 @@ describe('approveEscalation', () => { displayReason: { en: 'Allow this operation with workspace-write permissions: the user asked to write in the workspace', zh: '允许本次操作使用 workspace-write 权限:the user asked to write in the workspace', + ja: 'workspace-write 権限でこの操作を許可します:the user asked to write in the workspace', }, }) }) diff --git a/packages/schedule/schedule/locale/ja.json b/packages/schedule/schedule/locale/ja.json new file mode 100644 index 0000000000..e0e2384714 --- /dev/null +++ b/packages/schedule/schedule/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "タスクスケジュール", + "description": "自動化タスクを保存して予定時刻に元のセッションで実行し、管理用ツールをエージェントに提供します。" + } +} diff --git a/packages/schedule/tool-schedule/locale/en.json b/packages/schedule/tool-schedule/locale/en.json new file mode 100644 index 0000000000..b10c1b0a89 --- /dev/null +++ b/packages/schedule/tool-schedule/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Scheduling tools", + "description": "Create, view, update, and delete automated tasks." + } +} diff --git a/packages/schedule/tool-schedule/locale/ja.json b/packages/schedule/tool-schedule/locale/ja.json new file mode 100644 index 0000000000..79322b185c --- /dev/null +++ b/packages/schedule/tool-schedule/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "スケジュールツール", + "description": "自動化タスクの作成、確認、更新、削除ツールを提供します。" + } +} diff --git a/packages/schedule/tool-schedule/locale/zh.json b/packages/schedule/tool-schedule/locale/zh.json new file mode 100644 index 0000000000..64636f1760 --- /dev/null +++ b/packages/schedule/tool-schedule/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "任务调度工具", + "description": "提供自动化任务的创建、查看、修改和删除工具。" + } +} diff --git a/packages/schedule/tool-schedule/package.json b/packages/schedule/tool-schedule/package.json index 6bdfe97f37..86da15600c 100644 --- a/packages/schedule/tool-schedule/package.json +++ b/packages/schedule/tool-schedule/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/sdk/server/locale/en.json b/packages/sdk/server/locale/en.json new file mode 100644 index 0000000000..09ceefd919 --- /dev/null +++ b/packages/sdk/server/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK server", + "description": "Serve SDK clients in separate processes through JSON-RPC over standard input and output." + } +} diff --git a/packages/sdk/server/locale/ja.json b/packages/sdk/server/locale/ja.json new file mode 100644 index 0000000000..c44d933fef --- /dev/null +++ b/packages/sdk/server/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK サーバー", + "description": "標準入出力の JSON-RPC で、別プロセスの SDK クライアントにサービスを提供します。" + } +} diff --git a/packages/sdk/server/locale/zh.json b/packages/sdk/server/locale/zh.json new file mode 100644 index 0000000000..dba5cb75d6 --- /dev/null +++ b/packages/sdk/server/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SDK 服务", + "description": "通过标准输入输出 JSON-RPC 为独立进程中的 SDK 客户端提供服务。" + } +} diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index e5bbf5a9ee..e6c5c39ca4 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/session-query/session-log-export/locale/ja.json b/packages/session-query/session-log-export/locale/ja.json new file mode 100644 index 0000000000..a7953f86fb --- /dev/null +++ b/packages/session-query/session-log-export/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションログエクスポート", + "description": "セッションログのエクスポートコマンドとダウンロード機能を提供します。" + } +} diff --git a/packages/session-query/session-query-sqlite/locale/ja.json b/packages/session-query/session-query-sqlite/locale/ja.json new file mode 100644 index 0000000000..1774042413 --- /dev/null +++ b/packages/session-query/session-query-sqlite/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション検索と照会", + "description": "セッション記録を照会し、設定で有効な場合には SQLite 全文検索を提供します。" + } +} diff --git a/packages/session/message-quotes/locale/en.json b/packages/session/message-quotes/locale/en.json new file mode 100644 index 0000000000..dd73eca27a --- /dev/null +++ b/packages/session/message-quotes/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Message quotes", + "description": "Quote selected text and display it as a Markdown block quote." + } +} diff --git a/packages/session/message-quotes/locale/ja.json b/packages/session/message-quotes/locale/ja.json new file mode 100644 index 0000000000..02a0474244 --- /dev/null +++ b/packages/session/message-quotes/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "メッセージ引用", + "description": "選択したテキストを引用し、Markdown の引用ブロックとして表示します。" + } +} diff --git a/packages/session/message-quotes/locale/zh.json b/packages/session/message-quotes/locale/zh.json new file mode 100644 index 0000000000..e739f21ccf --- /dev/null +++ b/packages/session/message-quotes/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "消息引用", + "description": "引用选中的文本,并用 Markdown 引用块展示。" + } +} diff --git a/packages/session/message-quotes/package.json b/packages/session/message-quotes/package.json index b2422e910f..de027bd934 100644 --- a/packages/session/message-quotes/package.json +++ b/packages/session/message-quotes/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./client": { "types": "./lib/types/client/index.d.ts", @@ -26,6 +27,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/client.js", "lib/types/**/*.d.ts" diff --git a/packages/session/message-quotes/src/client/locales.ts b/packages/session/message-quotes/src/client/locales.ts index a712197cd5..fab1fbc782 100644 --- a/packages/session/message-quotes/src/client/locales.ts +++ b/packages/session/message-quotes/src/client/locales.ts @@ -17,6 +17,6 @@ export const en: Record = { } /** Japanese dictionary. */ -export const ja: Record = { +export const ja = { 'quote.add': 'テキストを引用', -} +} satisfies Record diff --git a/packages/session/session-checkpoint-policy/locale/ja.json b/packages/session/session-checkpoint-policy/locale/ja.json new file mode 100644 index 0000000000..072c453c18 --- /dev/null +++ b/packages/session/session-checkpoint-policy/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションチェックポイント", + "description": "モデルリクエストや外部に影響する可能性があるツール操作の前に、セッション記録を保存します。" + } +} diff --git a/packages/session/session-log-deepseek/locale/ja.json b/packages/session/session-log-deepseek/locale/ja.json new file mode 100644 index 0000000000..55012f7e7a --- /dev/null +++ b/packages/session/session-log-deepseek/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek セッションログ送信", + "description": "有効にすると、公式モデル API のリクエストと共にセッションログを DeepSeek に送信します。" + } +} diff --git a/packages/session/session-persistence-jsonl/locale/ja.json b/packages/session/session-persistence-jsonl/locale/ja.json new file mode 100644 index 0000000000..e5e6cf7c0d --- /dev/null +++ b/packages/session/session-persistence-jsonl/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションログ永続保存", + "description": "セッションログをローカルの JSONL ファイルに保存し、後から復元、読み取りできるようにします。" + } +} diff --git a/packages/session/session-projection-cache/locale/ja.json b/packages/session/session-projection-cache/locale/ja.json new file mode 100644 index 0000000000..4ee6f8ad20 --- /dev/null +++ b/packages/session/session-projection-cache/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション状態キャッシュ", + "description": "セッションログから生成した状態をキャッシュし、セッション一覧などからすばやく読み取れるようにします。" + } +} diff --git a/packages/session/session-projection/locale/ja.json b/packages/session/session-projection/locale/ja.json new file mode 100644 index 0000000000..c90b7a3bd2 --- /dev/null +++ b/packages/session/session-projection/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション状態集約", + "description": "セッションログからタイトルや状態などの情報を生成し、他の機能が読み取れるようにします。" + } +} diff --git a/packages/session/session-stats/locale/ja.json b/packages/session/session-stats/locale/ja.json new file mode 100644 index 0000000000..73004c390a --- /dev/null +++ b/packages/session/session-stats/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション統計", + "description": "セッションの対話回数や所要時間などの統計をまとめます。" + } +} diff --git a/packages/session/session-telemetry-otel/locale/ja.json b/packages/session/session-telemetry-otel/locale/ja.json new file mode 100644 index 0000000000..da8afe4ce7 --- /dev/null +++ b/packages/session/session-telemetry-otel/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "フィードバック用セッションログ送信", + "description": "フィードバックの認可ポリシーに従い、OpenTelemetry を通じて関連するセッションログを送信します。" + } +} diff --git a/packages/session/session-title-first-prompt-llm/locale/ja.json b/packages/session/session-title-first-prompt-llm/locale/ja.json new file mode 100644 index 0000000000..e83737a63c --- /dev/null +++ b/packages/session/session-title-first-prompt-llm/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "最初のメッセージからタイトル生成", + "description": "セッションの最初のメッセージに基づいて、モデルがタイトルを生成します。" + } +} diff --git a/packages/session/session-title/locale/ja.json b/packages/session/session-title/locale/ja.json new file mode 100644 index 0000000000..ed623362c3 --- /dev/null +++ b/packages/session/session-title/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションタイトルサービス", + "description": "セッションタイトルを保存、読み取りし、タイトルの生成方法を管理します。" + } +} diff --git a/packages/session/session-turn-outline/locale/ja.json b/packages/session/session-turn-outline/locale/ja.json new file mode 100644 index 0000000000..e268a8b914 --- /dev/null +++ b/packages/session/session-turn-outline/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッションターン目次", + "description": "セッションのターン目次を生成し、過去のやり取りの検索と移動を提供します。" + } +} diff --git a/packages/session/tool-working-directory/locale/en.json b/packages/session/tool-working-directory/locale/en.json new file mode 100644 index 0000000000..e36e12288c --- /dev/null +++ b/packages/session/tool-working-directory/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Working directory tools", + "description": "Read and change the current session's working directory." + } +} diff --git a/packages/session/tool-working-directory/locale/ja.json b/packages/session/tool-working-directory/locale/ja.json new file mode 100644 index 0000000000..c52f9760b3 --- /dev/null +++ b/packages/session/tool-working-directory/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "作業ディレクトリツール", + "description": "現在のセッションの作業ディレクトリを読み取り、変更します。" + } +} diff --git a/packages/session/tool-working-directory/locale/zh.json b/packages/session/tool-working-directory/locale/zh.json new file mode 100644 index 0000000000..2d8865eb23 --- /dev/null +++ b/packages/session/tool-working-directory/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "工作目录工具", + "description": "读取和修改当前会话的工作目录。" + } +} diff --git a/packages/session/tool-working-directory/package.json b/packages/session/tool-working-directory/package.json index f3484d5a56..3d66a5cc8e 100644 --- a/packages/session/tool-working-directory/package.json +++ b/packages/session/tool-working-directory/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/session/working-directory/locale/en.json b/packages/session/working-directory/locale/en.json new file mode 100644 index 0000000000..52294d6032 --- /dev/null +++ b/packages/session/working-directory/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Session working directories", + "description": "Manage session working directories, save directory changes, and provide the model with working-directory context." + } +} diff --git a/packages/session/working-directory/locale/ja.json b/packages/session/working-directory/locale/ja.json new file mode 100644 index 0000000000..ea4d800038 --- /dev/null +++ b/packages/session/working-directory/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "セッション作業ディレクトリ", + "description": "セッションの作業ディレクトリを管理し、ディレクトリの変更を保存してモデルにコンテキストを提供します。" + } +} diff --git a/packages/session/working-directory/locale/zh.json b/packages/session/working-directory/locale/zh.json new file mode 100644 index 0000000000..5c58d9c57a --- /dev/null +++ b/packages/session/working-directory/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "会话工作目录", + "description": "管理会话工作目录,保存目录变更并向模型提供上下文。" + } +} diff --git a/packages/session/working-directory/package.json b/packages/session/working-directory/package.json index 4304bbe41c..21b477829f 100644 --- a/packages/session/working-directory/package.json +++ b/packages/session/working-directory/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/settings/settings/locale/ja.json b/packages/settings/settings/locale/ja.json new file mode 100644 index 0000000000..88c5a8970e --- /dev/null +++ b/packages/settings/settings/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "設定サービス", + "description": "他のプラグインに共通のユーザー設定インターフェースを提供します。" + } +} diff --git a/packages/shell/bash-local/locale/en.json b/packages/shell/bash-local/locale/en.json new file mode 100644 index 0000000000..a9f0e1a52e --- /dev/null +++ b/packages/shell/bash-local/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Local Bash execution", + "description": "Run Bash commands in local subprocesses." + } +} diff --git a/packages/shell/bash-local/locale/ja.json b/packages/shell/bash-local/locale/ja.json new file mode 100644 index 0000000000..d37389d228 --- /dev/null +++ b/packages/shell/bash-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル Bash 実行", + "description": "ローカルの子プロセスで Bash コマンドを実行します。" + } +} diff --git a/packages/shell/bash-local/locale/zh.json b/packages/shell/bash-local/locale/zh.json new file mode 100644 index 0000000000..15d43393b5 --- /dev/null +++ b/packages/shell/bash-local/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "本地 Bash 执行", + "description": "通过本地子进程执行 Bash 命令。" + } +} diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index 879575f4c6..1c997fe433 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/shell/bash-sandbox/locale/ja.json b/packages/shell/bash-sandbox/locale/ja.json new file mode 100644 index 0000000000..d1544c3c56 --- /dev/null +++ b/packages/shell/bash-sandbox/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Bash サンドボックス実行", + "description": "現在のサンドボックス権限の範囲内で Bash コマンドを実行します。" + } +} diff --git a/packages/shell/pwsh-local/locale/en.json b/packages/shell/pwsh-local/locale/en.json new file mode 100644 index 0000000000..658a74fa41 --- /dev/null +++ b/packages/shell/pwsh-local/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Local PowerShell execution", + "description": "Run commands through local PowerShell." + } +} diff --git a/packages/shell/pwsh-local/locale/ja.json b/packages/shell/pwsh-local/locale/ja.json new file mode 100644 index 0000000000..582059ef82 --- /dev/null +++ b/packages/shell/pwsh-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル PowerShell 実行", + "description": "ローカルの PowerShell でコマンド実行サービスを実装します。" + } +} diff --git a/packages/shell/pwsh-local/locale/zh.json b/packages/shell/pwsh-local/locale/zh.json new file mode 100644 index 0000000000..94a9eaae4a --- /dev/null +++ b/packages/shell/pwsh-local/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "本地 PowerShell 执行", + "description": "使用本地 PowerShell 实现命令执行服务。" + } +} diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 94d751a16b..94cad3ea71 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/shell/pwsh-sandbox/locale/ja.json b/packages/shell/pwsh-sandbox/locale/ja.json new file mode 100644 index 0000000000..ff7e339dfc --- /dev/null +++ b/packages/shell/pwsh-sandbox/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "PowerShell サンドボックス実行", + "description": "現在のサンドボックス権限の範囲内で PowerShell コマンドを実行します。" + } +} diff --git a/packages/shell/shell-env/locale/ja.json b/packages/shell/shell-env/locale/ja.json new file mode 100644 index 0000000000..556a72ddcf --- /dev/null +++ b/packages/shell/shell-env/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コマンド環境変数", + "description": "コマンド実行ツールに DSH の共通環境変数を提供します。" + } +} diff --git a/packages/shell/tool-bash-persistent/locale/ja.json b/packages/shell/tool-bash-persistent/locale/ja.json new file mode 100644 index 0000000000..2b320b1b22 --- /dev/null +++ b/packages/shell/tool-bash-persistent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "永続 Bash ツール", + "description": "AI が状態を保持する Bash セッションでコマンドを連続して実行できます。" + } +} diff --git a/packages/shell/tool-bash/locale/ja.json b/packages/shell/tool-bash/locale/ja.json new file mode 100644 index 0000000000..7931e02ed1 --- /dev/null +++ b/packages/shell/tool-bash/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Bash コマンドツール", + "description": "AI が Bash コマンドを実行できます。設定に従いバックグラウンド実行と権限申請を管理します。" + } +} diff --git a/packages/shell/tool-pwsh-persistent/locale/ja.json b/packages/shell/tool-pwsh-persistent/locale/ja.json new file mode 100644 index 0000000000..859d69b5d7 --- /dev/null +++ b/packages/shell/tool-pwsh-persistent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "永続 PowerShell ツール", + "description": "AI が状態を保持する PowerShell セッションでコマンドを連続して実行できます。" + } +} diff --git a/packages/shell/tool-pwsh/locale/ja.json b/packages/shell/tool-pwsh/locale/ja.json new file mode 100644 index 0000000000..62ff877ef3 --- /dev/null +++ b/packages/shell/tool-pwsh/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "PowerShell コマンドツール", + "description": "AI が PowerShell コマンドを実行できます。" + } +} diff --git a/packages/skill/skill-filesystem/locale/ja.json b/packages/skill/skill-filesystem/locale/ja.json new file mode 100644 index 0000000000..c64b960c2e --- /dev/null +++ b/packages/skill/skill-filesystem/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカルスキル読み込み", + "description": "ローカルディレクトリからスキルを発見して読み取ります。" + } +} diff --git a/packages/skill/skill-office/locale/en.json b/packages/skill/skill-office/locale/en.json new file mode 100644 index 0000000000..1ae1f03a36 --- /dev/null +++ b/packages/skill/skill-office/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Office skills", + "description": "Provide built-in Word, PowerPoint, and Excel workflows and LibreOffice Kit operations." + } +} diff --git a/packages/skill/skill-office/locale/ja.json b/packages/skill/skill-office/locale/ja.json new file mode 100644 index 0000000000..4b108c204c --- /dev/null +++ b/packages/skill/skill-office/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Office スキル", + "description": "Word、PowerPoint、Excel の組み込みワークフローと LibreOffice Kit の操作を提供します。" + } +} diff --git a/packages/skill/skill-office/locale/zh.json b/packages/skill/skill-office/locale/zh.json new file mode 100644 index 0000000000..d9f6715956 --- /dev/null +++ b/packages/skill/skill-office/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Office 技能", + "description": "提供 Word、PowerPoint、Excel 的内置工作流和 LibreOffice Kit 操作。" + } +} diff --git a/packages/skill/skill-office/package.json b/packages/skill/skill-office/package.json index f768d1f6f2..ee9378138e 100644 --- a/packages/skill/skill-office/package.json +++ b/packages/skill/skill-office/package.json @@ -18,9 +18,11 @@ "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "assets", "lib/types/**/*.d.ts" diff --git a/packages/skill/skill/locale/ja.json b/packages/skill/skill/locale/ja.json new file mode 100644 index 0000000000..698d001418 --- /dev/null +++ b/packages/skill/skill/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "スキル登録サービス", + "description": "異なる提供元のスキルを集約し、AI が検索、利用できるようにします。" + } +} diff --git a/packages/skill/tool-skill/locale/ja.json b/packages/skill/tool-skill/locale/ja.json new file mode 100644 index 0000000000..cad48ee4ca --- /dev/null +++ b/packages/skill/tool-skill/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "スキル読み込みツール", + "description": "AI が必要に応じてスキルの説明を読み込めます。" + } +} diff --git a/packages/skill/tool-workspace-dependencies/locale/en.json b/packages/skill/tool-workspace-dependencies/locale/en.json new file mode 100644 index 0000000000..7de2e8689c --- /dev/null +++ b/packages/skill/tool-workspace-dependencies/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Workspace dependencies", + "description": "Provide absolute paths to the bundled Python, Node.js, and pnpm runtimes." + } +} diff --git a/packages/skill/tool-workspace-dependencies/locale/ja.json b/packages/skill/tool-workspace-dependencies/locale/ja.json new file mode 100644 index 0000000000..9d360eb07c --- /dev/null +++ b/packages/skill/tool-workspace-dependencies/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース依存関係", + "description": "組み込みの Python、Node.js、pnpm の絶対パスを提供します。" + } +} diff --git a/packages/skill/tool-workspace-dependencies/locale/zh.json b/packages/skill/tool-workspace-dependencies/locale/zh.json new file mode 100644 index 0000000000..35c90d2010 --- /dev/null +++ b/packages/skill/tool-workspace-dependencies/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "工作区依赖", + "description": "提供内置 Python、Node.js 和 pnpm 的绝对路径。" + } +} diff --git a/packages/skill/tool-workspace-dependencies/package.json b/packages/skill/tool-workspace-dependencies/package.json index cf887c2df4..47194e0b1f 100644 --- a/packages/skill/tool-workspace-dependencies/package.json +++ b/packages/skill/tool-workspace-dependencies/package.json @@ -18,9 +18,11 @@ "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/spill/spill-local/locale/ja.json b/packages/spill/spill-local/locale/ja.json new file mode 100644 index 0000000000..9fac4cdbe7 --- /dev/null +++ b/packages/spill/spill-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル長文結果保存", + "description": "長すぎるツール結果をセッション専用のローカルファイルに保存します。" + } +} diff --git a/packages/spill/spill-policy/locale/ja.json b/packages/spill/spill-policy/locale/ja.json new file mode 100644 index 0000000000..60c1bd07f5 --- /dev/null +++ b/packages/spill/spill-policy/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ツール結果の長さ制御", + "description": "コンテキストに直接入れるツール結果の長さを制限し、完全な結果を読み取るパスを保持します。" + } +} diff --git a/packages/ssh/fs-ssh/locale/en.json b/packages/ssh/fs-ssh/locale/en.json new file mode 100644 index 0000000000..7c2a0f4b9b --- /dev/null +++ b/packages/ssh/fs-ssh/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH filesystem", + "description": "Access remote files through the shared POSIX SSH helper." + } +} diff --git a/packages/ssh/fs-ssh/locale/ja.json b/packages/ssh/fs-ssh/locale/ja.json new file mode 100644 index 0000000000..faea1d1f99 --- /dev/null +++ b/packages/ssh/fs-ssh/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH ファイルシステム", + "description": "共通の POSIX SSH ヘルパーを通じてリモートファイルシステムにアクセスします。" + } +} diff --git a/packages/ssh/fs-ssh/locale/zh.json b/packages/ssh/fs-ssh/locale/zh.json new file mode 100644 index 0000000000..3a4e80fae9 --- /dev/null +++ b/packages/ssh/fs-ssh/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 文件系统", + "description": "通过共享的 POSIX SSH 辅助程序访问远程文件系统。" + } +} diff --git a/packages/ssh/fs-ssh/package.json b/packages/ssh/fs-ssh/package.json index 8d3f4bdc2c..ce1421105f 100644 --- a/packages/ssh/fs-ssh/package.json +++ b/packages/ssh/fs-ssh/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/ssh/sandbox-ssh/locale/en.json b/packages/ssh/sandbox-ssh/locale/en.json new file mode 100644 index 0000000000..393ecd6063 --- /dev/null +++ b/packages/ssh/sandbox-ssh/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH process sandbox", + "description": "Build sandbox commands for remote POSIX processes through the shared SSH helper." + } +} diff --git a/packages/ssh/sandbox-ssh/locale/ja.json b/packages/ssh/sandbox-ssh/locale/ja.json new file mode 100644 index 0000000000..194d01cd74 --- /dev/null +++ b/packages/ssh/sandbox-ssh/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH プロセスサンドボックス", + "description": "共通の SSH ヘルパーを通じて、リモートの POSIX プロセス用サンドボックスコマンドを構成します。" + } +} diff --git a/packages/ssh/sandbox-ssh/locale/zh.json b/packages/ssh/sandbox-ssh/locale/zh.json new file mode 100644 index 0000000000..4b2a375d45 --- /dev/null +++ b/packages/ssh/sandbox-ssh/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 进程沙箱", + "description": "通过共享的 SSH 辅助程序,为远程 POSIX 进程构造沙箱命令。" + } +} diff --git a/packages/ssh/sandbox-ssh/package.json b/packages/ssh/sandbox-ssh/package.json index b0592af156..61d10ca94c 100644 --- a/packages/ssh/sandbox-ssh/package.json +++ b/packages/ssh/sandbox-ssh/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/ssh/ssh/locale/en.json b/packages/ssh/ssh/locale/en.json new file mode 100644 index 0000000000..ac0e2e9d3d --- /dev/null +++ b/packages/ssh/ssh/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH connections", + "description": "Share OpenSSH connections and versioned POSIX remote helpers." + } +} diff --git a/packages/ssh/ssh/locale/ja.json b/packages/ssh/ssh/locale/ja.json new file mode 100644 index 0000000000..e098be89e0 --- /dev/null +++ b/packages/ssh/ssh/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 接続", + "description": "OpenSSH 接続とバージョン管理された POSIX リモートヘルパーを共有します。" + } +} diff --git a/packages/ssh/ssh/locale/zh.json b/packages/ssh/ssh/locale/zh.json new file mode 100644 index 0000000000..ab4bdd6249 --- /dev/null +++ b/packages/ssh/ssh/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 连接", + "description": "共享 OpenSSH 连接和带版本的 POSIX 远程辅助程序。" + } +} diff --git a/packages/ssh/ssh/package.json b/packages/ssh/ssh/package.json index 4453a1f0e6..5303105d18 100644 --- a/packages/ssh/ssh/package.json +++ b/packages/ssh/ssh/package.json @@ -19,6 +19,7 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json", "./helper": { "types": "./lib/types/helper-entry.d.ts", @@ -34,6 +35,7 @@ } }, "files": [ + "locale/*.json", "lib/index.js", "lib/helper.js", "lib/protocol.js", diff --git a/packages/ssh/subprocess-ssh/locale/en.json b/packages/ssh/subprocess-ssh/locale/en.json new file mode 100644 index 0000000000..635e852b7f --- /dev/null +++ b/packages/ssh/subprocess-ssh/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH subprocesses", + "description": "Provide subprocesses and terminals through the shared POSIX SSH helper." + } +} diff --git a/packages/ssh/subprocess-ssh/locale/ja.json b/packages/ssh/subprocess-ssh/locale/ja.json new file mode 100644 index 0000000000..17fd80f706 --- /dev/null +++ b/packages/ssh/subprocess-ssh/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 子プロセス", + "description": "共通の POSIX SSH ヘルパーを通じて、子プロセスとターミナルを提供します。" + } +} diff --git a/packages/ssh/subprocess-ssh/locale/zh.json b/packages/ssh/subprocess-ssh/locale/zh.json new file mode 100644 index 0000000000..1ec2e22e55 --- /dev/null +++ b/packages/ssh/subprocess-ssh/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SSH 子进程", + "description": "通过共享的 POSIX SSH 辅助程序提供子进程和终端。" + } +} diff --git a/packages/ssh/subprocess-ssh/package.json b/packages/ssh/subprocess-ssh/package.json index bcef06c19a..ff675fe8b1 100644 --- a/packages/ssh/subprocess-ssh/package.json +++ b/packages/ssh/subprocess-ssh/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/storage/storage-domain/locale/ja.json b/packages/storage/storage-domain/locale/ja.json new file mode 100644 index 0000000000..04aa62689b --- /dev/null +++ b/packages/storage/storage-domain/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "構造化データ保存", + "description": "データ構造に従ってキーと値を検証、保存し、変更を他のプラグインに通知します。" + } +} diff --git a/packages/storage/storage-json/locale/ja.json b/packages/storage/storage-json/locale/ja.json new file mode 100644 index 0000000000..01ddaf958b --- /dev/null +++ b/packages/storage/storage-json/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "JSON ファイル保存", + "description": "キーと値のデータをローカルの JSON ファイルに保存します。" + } +} diff --git a/packages/storage/storage-sqlite/locale/en.json b/packages/storage/storage-sqlite/locale/en.json new file mode 100644 index 0000000000..630c5d1bc7 --- /dev/null +++ b/packages/storage/storage-sqlite/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SQLite storage", + "description": "Store Harness key-value data in SQLite." + } +} diff --git a/packages/storage/storage-sqlite/locale/ja.json b/packages/storage/storage-sqlite/locale/ja.json new file mode 100644 index 0000000000..1131a16b56 --- /dev/null +++ b/packages/storage/storage-sqlite/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SQLite ストレージ", + "description": "Harness のストレージサービスに SQLite のキーと値の保存バックエンドを提供します。" + } +} diff --git a/packages/storage/storage-sqlite/locale/zh.json b/packages/storage/storage-sqlite/locale/zh.json new file mode 100644 index 0000000000..a5642fd08a --- /dev/null +++ b/packages/storage/storage-sqlite/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "SQLite 存储", + "description": "为 Harness 存储服务提供 SQLite 键值存储后端。" + } +} diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 2619dfed7a..f479ad3ee9 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/storage/storage/locale/ja.json b/packages/storage/storage/locale/ja.json new file mode 100644 index 0000000000..08e5b04731 --- /dev/null +++ b/packages/storage/storage/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "データ保存サービス", + "description": "プラグインが使用する保存バックエンドとデータへのアクセス方法を統一して管理します。" + } +} diff --git a/packages/subagent/subagent-acp/locale/en.json b/packages/subagent/subagent-acp/locale/en.json new file mode 100644 index 0000000000..7471096997 --- /dev/null +++ b/packages/subagent/subagent-acp/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP subagent backend", + "description": "Run external agents in subprocesses through ACP." + } +} diff --git a/packages/subagent/subagent-acp/locale/ja.json b/packages/subagent/subagent-acp/locale/ja.json new file mode 100644 index 0000000000..a0c1dce5f2 --- /dev/null +++ b/packages/subagent/subagent-acp/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP サブエージェントバックエンド", + "description": "子プロセスで ACP プロトコルを使って外部エージェントを操作します。" + } +} diff --git a/packages/subagent/subagent-acp/locale/zh.json b/packages/subagent/subagent-acp/locale/zh.json new file mode 100644 index 0000000000..5dbf68b68f --- /dev/null +++ b/packages/subagent/subagent-acp/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ACP 子智能体后端", + "description": "在子进程中通过 ACP 协议驱动外部智能体。" + } +} diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index c02bf57694..b960bf5087 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/subagent/subagent-claude-code/locale/ja.json b/packages/subagent/subagent-claude-code/locale/ja.json new file mode 100644 index 0000000000..5bb20fc61a --- /dev/null +++ b/packages/subagent/subagent-claude-code/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Claude Code サブエージェント", + "description": "Claude Code のネイティブの認証と設定を使用して、単独のタスクを委派します。" + } +} diff --git a/packages/subagent/subagent-codex/locale/ja.json b/packages/subagent/subagent-codex/locale/ja.json new file mode 100644 index 0000000000..5682e53865 --- /dev/null +++ b/packages/subagent/subagent-codex/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Codex サブエージェント", + "description": "Codex のネイティブの認証と設定を使用して、単独のタスクを委派します。" + } +} diff --git a/packages/subagent/subagent-dsh-sdk/locale/en.json b/packages/subagent/subagent-dsh-sdk/locale/en.json new file mode 100644 index 0000000000..421c2f8c97 --- /dev/null +++ b/packages/subagent/subagent-dsh-sdk/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DSH SDK subagent backend", + "description": "Run Harness in a subprocess through the TypeScript SDK and JSON-RPC over standard input and output." + } +} diff --git a/packages/subagent/subagent-dsh-sdk/locale/ja.json b/packages/subagent/subagent-dsh-sdk/locale/ja.json new file mode 100644 index 0000000000..d011f47d7e --- /dev/null +++ b/packages/subagent/subagent-dsh-sdk/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DSH SDK サブエージェントバックエンド", + "description": "TypeScript SDK と標準入出力の JSON-RPC で、子プロセス内の Harness を操作します。" + } +} diff --git a/packages/subagent/subagent-dsh-sdk/locale/zh.json b/packages/subagent/subagent-dsh-sdk/locale/zh.json new file mode 100644 index 0000000000..b27386f83c --- /dev/null +++ b/packages/subagent/subagent-dsh-sdk/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DSH SDK 子智能体后端", + "description": "通过 TypeScript SDK 和标准输入输出 JSON-RPC 驱动子进程中的 Harness。" + } +} diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 0c2773415e..f9634a95a9 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/subagent/subagent-fork-in-process/locale/ja.json b/packages/subagent/subagent-fork-in-process/locale/ja.json new file mode 100644 index 0000000000..dfc495814f --- /dev/null +++ b/packages/subagent/subagent-fork-in-process/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "コンテキスト継承サブエージェント", + "description": "親セッションの履歴の一部を使用して、サブエージェントを作成します。" + } +} diff --git a/packages/subagent/subagent-spawn-in-process/locale/ja.json b/packages/subagent/subagent-spawn-in-process/locale/ja.json new file mode 100644 index 0000000000..f9c2f64ec4 --- /dev/null +++ b/packages/subagent/subagent-spawn-in-process/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "新規サブエージェントバックエンド", + "description": "現在のプロセス内に新しいサブエージェントを作成し、独立したタスクを実行します。" + } +} diff --git a/packages/subagent/subagent/locale/ja.json b/packages/subagent/subagent/locale/ja.json new file mode 100644 index 0000000000..ca408fdd66 --- /dev/null +++ b/packages/subagent/subagent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サブエージェントサービス", + "description": "サブエージェントのバックエンドを管理し、タスク委派用の共通インターフェースを提供します。" + } +} diff --git a/packages/subagent/tool-subagent-control/locale/ja.json b/packages/subagent/tool-subagent-control/locale/ja.json new file mode 100644 index 0000000000..755616ac36 --- /dev/null +++ b/packages/subagent/tool-subagent-control/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サブエージェント制御ツール", + "description": "AI がサブエージェントにメッセージを送信し、その実行を中断できます。" + } +} diff --git a/packages/subagent/tool-subagent/locale/ja.json b/packages/subagent/tool-subagent/locale/ja.json new file mode 100644 index 0000000000..707fd98f2a --- /dev/null +++ b/packages/subagent/tool-subagent/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "サブエージェント委派ツール", + "description": "AI がタスクをサブエージェントに渡し、実行結果を取得できます。" + } +} diff --git a/packages/subagent/tool-subagent/locale/model-selection-settings/ja.json b/packages/subagent/tool-subagent/locale/model-selection-settings/ja.json new file mode 100644 index 0000000000..6e3b580a73 --- /dev/null +++ b/packages/subagent/tool-subagent/locale/model-selection-settings/ja.json @@ -0,0 +1,5 @@ +{ + "meta": { + "title": "サブエージェントのモデル選択設定" + } +} diff --git a/packages/subprocess/subprocess-local/locale/ja.json b/packages/subprocess/subprocess-local/locale/ja.json new file mode 100644 index 0000000000..edc4ffe78a --- /dev/null +++ b/packages/subprocess/subprocess-local/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ローカル子プロセス", + "description": "他のプラグインにローカルプロセスの起動と管理機能を提供します。" + } +} diff --git a/packages/telemetry/otel/locale/ja.json b/packages/telemetry/otel/locale/ja.json new file mode 100644 index 0000000000..b7657ec777 --- /dev/null +++ b/packages/telemetry/otel/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "OpenTelemetry 送信サービス", + "description": "製品イベントとセッションログのための独立したデータ送信経路を提供します。" + } +} diff --git a/packages/terminal/terminal-bash/locale/ja.json b/packages/terminal/terminal-bash/locale/ja.json new file mode 100644 index 0000000000..b04b78a322 --- /dev/null +++ b/packages/terminal/terminal-bash/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "永続 Shell バックエンド", + "description": "複数の呼び出しをまたいで状態を保持する Shell ターミナルを提供します。" + } +} diff --git a/packages/terminal/terminal/locale/ja.json b/packages/terminal/terminal/locale/ja.json new file mode 100644 index 0000000000..f59f8fd6af --- /dev/null +++ b/packages/terminal/terminal/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "永続ターミナルサービス", + "description": "継続して操作できるターミナルセッションと、その入力、出力、クリーンアップを管理します。" + } +} diff --git a/packages/todo/tool-todo/locale/ja.json b/packages/todo/tool-todo/locale/ja.json new file mode 100644 index 0000000000..3b1326b525 --- /dev/null +++ b/packages/todo/tool-todo/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "タスク一覧ツール", + "description": "AI が作業のタスク一覧を作成、更新できます。" + } +} diff --git a/packages/typert/loader/locale/ja.json b/packages/typert/loader/locale/ja.json new file mode 100644 index 0000000000..d3eb1164b0 --- /dev/null +++ b/packages/typert/loader/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Typert 型読み込み", + "description": "プラグインが生成した型情報を読み込み、実行時の照会と呼び出しに使用します。" + } +} diff --git a/packages/typert/registry/locale/ja.json b/packages/typert/registry/locale/ja.json new file mode 100644 index 0000000000..1059196785 --- /dev/null +++ b/packages/typert/registry/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Typert 型レジストリ", + "description": "プラグインに実行時の型情報とリモート呼び出し定義を提供します。" + } +} diff --git a/packages/web/tool-web/locale/ja.json b/packages/web/tool-web/locale/ja.json new file mode 100644 index 0000000000..157e5248a3 --- /dev/null +++ b/packages/web/tool-web/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web 検索と読み取りツール", + "description": "AI が Web ページを検索し、その内容を読み取れます。" + } +} diff --git a/packages/web/web-deepseek-api/locale/ja.json b/packages/web/web-deepseek-api/locale/ja.json new file mode 100644 index 0000000000..b6a8eee210 --- /dev/null +++ b/packages/web/web-deepseek-api/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek Web 検索・取得 API", + "description": "DeepSeek Search API で Web ページを検索し、Fetch API で本文を取得します。" + } +} diff --git a/packages/web/web-fetch-http/locale/ja.json b/packages/web/web-fetch-http/locale/ja.json new file mode 100644 index 0000000000..7187cfcad7 --- /dev/null +++ b/packages/web/web-fetch-http/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "公開 Web ページ取得", + "description": "ログイン不要の HTTP または HTTPS の Web ページを読み取ります。" + } +} diff --git a/packages/web/web-search-deepseek/locale/ja.json b/packages/web/web-search-deepseek/locale/ja.json new file mode 100644 index 0000000000..69a8c5eb6d --- /dev/null +++ b/packages/web/web-search-deepseek/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "DeepSeek Web 検索", + "description": "DeepSeek を通じて Web 検索結果を提供します。" + } +} diff --git a/packages/web/web-search-exa/locale/en.json b/packages/web/web-search-exa/locale/en.json new file mode 100644 index 0000000000..aaf280f917 --- /dev/null +++ b/packages/web/web-search-exa/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Exa web search", + "description": "Search the Web through Exa." + } +} diff --git a/packages/web/web-search-exa/locale/ja.json b/packages/web/web-search-exa/locale/ja.json new file mode 100644 index 0000000000..7895b56cff --- /dev/null +++ b/packages/web/web-search-exa/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Exa Web 検索", + "description": "Exa を通じて Web 検索を提供します。" + } +} diff --git a/packages/web/web-search-exa/locale/zh.json b/packages/web/web-search-exa/locale/zh.json new file mode 100644 index 0000000000..76d864d659 --- /dev/null +++ b/packages/web/web-search-exa/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Exa 网页搜索", + "description": "通过 Exa 提供网页搜索。" + } +} diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 3cff162143..760907d6d3 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/web/web-search-perplexity/locale/en.json b/packages/web/web-search-perplexity/locale/en.json new file mode 100644 index 0000000000..08e111e12b --- /dev/null +++ b/packages/web/web-search-perplexity/locale/en.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Perplexity web search", + "description": "Search the Web through Perplexity." + } +} diff --git a/packages/web/web-search-perplexity/locale/ja.json b/packages/web/web-search-perplexity/locale/ja.json new file mode 100644 index 0000000000..c0d8cdc4f2 --- /dev/null +++ b/packages/web/web-search-perplexity/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Perplexity Web 検索", + "description": "Perplexity を通じて Web 検索を提供します。" + } +} diff --git a/packages/web/web-search-perplexity/locale/zh.json b/packages/web/web-search-perplexity/locale/zh.json new file mode 100644 index 0000000000..40affd5b09 --- /dev/null +++ b/packages/web/web-search-perplexity/locale/zh.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Perplexity 网页搜索", + "description": "通过 Perplexity 提供网页搜索。" + } +} diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index b36d677adf..45d9f912b6 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -19,9 +19,11 @@ "default": "./lib/index.js" }, "./src/*": "./src/*", + "./locale/*.json": "./locale/*.json", "./package.json": "./package.json" }, "files": [ + "locale/*.json", "lib/index.js", "lib/types/**/*.d.ts" ], diff --git a/packages/web/web/locale/ja.json b/packages/web/web/locale/ja.json new file mode 100644 index 0000000000..be6f2c42ea --- /dev/null +++ b/packages/web/web/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "Web アクセスサービス", + "description": "Web 検索とコンテンツ取得の提供元を統一して管理します。" + } +} diff --git a/packages/workflow/tool-workflow/locale/ja.json b/packages/workflow/tool-workflow/locale/ja.json new file mode 100644 index 0000000000..10872544ef --- /dev/null +++ b/packages/workflow/tool-workflow/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークフローツール", + "description": "AI が JavaScript スクリプトを作成、実行し、複数のツール操作を組み合わせられます。" + } +} diff --git a/packages/workflow/workflow-ptc/locale/ja.json b/packages/workflow/workflow-ptc/locale/ja.json new file mode 100644 index 0000000000..55c370933f --- /dev/null +++ b/packages/workflow/workflow-ptc/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークフロー実行エンジン", + "description": "共有 PTC ランタイムを使用して、ワークフローのコードを実行します。" + } +} diff --git a/packages/workspace/workspace/locale/ja.json b/packages/workspace/workspace/locale/ja.json new file mode 100644 index 0000000000..4f9bdd37cc --- /dev/null +++ b/packages/workspace/workspace/locale/ja.json @@ -0,0 +1,6 @@ +{ + "meta": { + "title": "ワークスペース管理", + "description": "ワークスペース情報を保存し、ワークスペースとセッションの関連付けを管理します。" + } +} diff --git a/scripts/gen-official-bundle-catalog.spec.ts b/scripts/gen-official-bundle-catalog.spec.ts index 54da13d7c3..8333010a18 100644 --- a/scripts/gen-official-bundle-catalog.spec.ts +++ b/scripts/gen-official-bundle-catalog.spec.ts @@ -31,6 +31,7 @@ function fixture(): string { write(root, `${dir}/icon.svg`, '') write(root, `${dir}/locale/en.json`, { meta: { title: 'Native agent', description: 'Delegate a task.' } }) write(root, `${dir}/locale/zh.json`, { meta: { title: '原生智能体', description: '委派任务。' } }) + write(root, `${dir}/locale/ja.json`, { meta: { title: 'ネイティブエージェント', description: 'タスクを委派します。' } }) } write(root, output, '') return root @@ -49,7 +50,8 @@ describe('Official bundle catalog generation', () => { const entries = generateOfficialBundleCatalog(fixture()) expect(entries.map(entry => entry.packageName)).toEqual(ON_DEMAND_BUNDLES) expect(entries[0]?.meta).toEqual({ - title: { en: 'Native agent', zh: '原生智能体' }, description: { en: 'Delegate a task.', zh: '委派任务。' }, + title: { en: 'Native agent', zh: '原生智能体', ja: 'ネイティブエージェント' }, + description: { en: 'Delegate a task.', zh: '委派任务。', ja: 'タスクを委派します。' }, icon: `data:image/svg+xml;base64,${Buffer.from('').toString('base64')}`, }) expect(renderOfficialBundleCatalog(entries)).not.toContain('1.2.3') @@ -79,14 +81,14 @@ describe('Official bundle catalog generation', () => { expect(() => generateOfficialBundleCatalog(root, [ON_DEMAND_BUNDLES[0]!, ON_DEMAND_BUNDLES[0]!])).toThrow('distinct package names') }) - it.each(['icon', 'en', 'zh'])('rejects missing %s metadata', (resource) => { + it.each(['icon', 'en', 'zh', 'ja'])('rejects missing %s metadata', (resource) => { const root = fixture() const dir = directory(ON_DEMAND_BUNDLES[0]!) rmSync(join(root, dir, resource === 'icon' ? 'icon.svg' : `locale/${resource}.json`)) expect(() => generateOfficialBundleCatalog(root)).toThrow() }) - it.each(['en', 'zh'])('requires explicit %s fields instead of metadata fallback text', (language) => { + it.each(['en', 'zh', 'ja'])('requires explicit %s fields instead of metadata fallback text', (language) => { const root = fixture() write(root, `${directory(ON_DEMAND_BUNDLES[0]!)}/locale/${language}.json`, { meta: { description: 'Only a description.' } }) expect(() => generateOfficialBundleCatalog(root)).toThrow(`explicit ${language} title and description`) diff --git a/scripts/gen-official-bundle-catalog.ts b/scripts/gen-official-bundle-catalog.ts index 25e08f48c6..0698049145 100644 --- a/scripts/gen-official-bundle-catalog.ts +++ b/scripts/gen-official-bundle-catalog.ts @@ -49,7 +49,7 @@ export function generateOfficialBundleCatalog(root: string, names: readonly stri throw new Error(`${packageName}: Official catalog entries must be public DSH bundle packages`) } const parentURL = pathToFileURL(resolve(root, entry.path)).href - for (const language of ['en', 'zh']) { + for (const language of ['en', 'zh', 'ja']) { const file = resolvePluginResource(`${packageName}/locale/${language}.json`, parentURL) const dictionary = JSON.parse(readFileSync(file, 'utf8')) as { meta?: { title?: unknown; description?: unknown } } if (typeof dictionary.meta?.title !== 'string' || dictionary.meta.title.trim() === '' @@ -63,7 +63,7 @@ export function generateOfficialBundleCatalog(root: string, names: readonly stri throw new Error(`${packageName}: Official catalog entries require an icon and localized title and description`) } for (const value of [meta.title, meta.description]) { - for (const language of ['en', 'zh']) { + for (const language of ['en', 'zh', 'ja']) { if (typeof value[language] !== 'string' || value[language].trim() === '') { throw new Error(`${packageName}: Official metadata requires ${language} text`) } diff --git a/scripts/run-gates.spec.ts b/scripts/run-gates.spec.ts index 0f4b4d4a47..87dcd44d4f 100644 --- a/scripts/run-gates.spec.ts +++ b/scripts/run-gates.spec.ts @@ -370,12 +370,22 @@ describe('gate graph validation', () => { expect(ids).toEqual([ 'rescope-vendor', 'publint', 'constraints', 'default-product-isolation', 'product-use', 'official-bundle-catalog', 'provider-data', 'package-dependencies', 'application-entrypoints', 'dsh-package-licenses', 'node-next-types', - 'optional-dependency-imports', 'client-packages', 'client-ui-i18n', 'client-route-resolution', 'no-bare-dispatcher', + 'optional-dependency-imports', 'client-packages', 'installer-locales', 'locale-metadata', 'client-ui-i18n', 'client-route-resolution', 'no-bare-dispatcher', 'plugin-record-callers', 'no-unknown-casts', 'no-top-level-await', 'cordis-config', 'runtime-closure', ]) }) + it('includes JSON resource checks in local and CI aggregates', () => { + for (const mode of ['i18n', 'check-all', 'ci-static', 'hygiene'] as const) { + const ids = withPnpmEntrypoint(() => gatesForMode(mode).map(gate => gate.id)) + expect(ids).toEqual(expect.arrayContaining(['installer-locales', 'locale-metadata'])) + if (mode !== 'i18n') expect(ids).not.toContain('locale-dictionaries') + } + expect(withPnpmEntrypoint(() => gatesForMode('i18n').map(gate => gate.id))) + .toEqual(['installer-locales', 'locale-metadata', 'locale-dictionaries']) + }) + it('caps the local hygiene aggregate at eight workers', () => { const ids = withPnpmEntrypoint(() => gatesForMode('hygiene').map(subject => subject.id)) diff --git a/scripts/run-gates.ts b/scripts/run-gates.ts index 3474561272..5392190939 100644 --- a/scripts/run-gates.ts +++ b/scripts/run-gates.ts @@ -35,6 +35,7 @@ export type Mode = | 'hygiene' | 'doc-sync' | 'doc-quick' + | 'i18n' type GateResultStatus = 'passed' | 'failed' | 'skipped' type GateState = 'pending' | 'running' | GateResultStatus @@ -169,11 +170,12 @@ function parseMode(raw: string | undefined): Mode { case 'check-all': case 'hygiene': case 'doc-sync': + case 'i18n': case 'doc-quick': return raw default: throw new Error( - `run-gates: expected mode ci-primary | ci-linux-primary | ci-static | ci-lint-contracts-ready | ci-coverage | ci-unit | ci-bench | ci-snapshot | ci-artifacts | ci-consumers | ci-windows-blocking | ci-windows-complete | ci-windows-observational-ready | node-compat | check-all | hygiene | doc-sync | doc-quick, got ${JSON.stringify(raw)}.`, + `run-gates: expected mode ci-primary | ci-linux-primary | ci-static | ci-lint-contracts-ready | ci-coverage | ci-unit | ci-bench | ci-snapshot | ci-artifacts | ci-consumers | ci-windows-blocking | ci-windows-complete | ci-windows-observational-ready | node-compat | check-all | hygiene | doc-sync | doc-quick | i18n, got ${JSON.stringify(raw)}.`, ) } } @@ -363,6 +365,8 @@ export function gatesForMode(selected: Mode): Gate[] { return docSyncLeafGates() case 'doc-quick': return docQuickLeafGates() + case 'i18n': + return i18nGates(true) } } @@ -385,12 +389,21 @@ function ciSharedStaticGates(): Gate[] { ] } +function i18nGates(includeDictionaries: boolean): Gate[] { + return [ + pnpmScript('installer-locales', 'verify-installer-locales', { label: 'Windows installer locales' }), + pnpmScript('locale-metadata', 'verify-locale-metadata', { label: 'Japanese plugin metadata' }), + ...includeDictionaries ? [pnpmExec('locale-dictionaries', ['vitest', 'run', 'scripts/locale-dictionary-parity.spec.ts'], { label: 'locale dictionaries' })] : [], + ] +} + function sharedHygieneGates(): Gate[] { return [ pnpmScript('optional-dependency-imports', 'verify-optional-dependency-imports', { label: 'optional dependency imports', }), pnpmScript('client-packages', 'verify-client-packages', { label: 'client packages' }), + ...i18nGates(false), pnpmScript('client-ui-i18n', 'verify-client-ui-i18n', { label: 'client UI i18n' }), pnpmScript('client-route-resolution', 'verify-client-route-resolution', { label: 'client route resolution' }), pnpmScript('no-bare-dispatcher', 'verify-no-bare-dispatcher', { label: 'proxy-aware dispatchers' }), diff --git a/scripts/verify-locale-metadata.spec.ts b/scripts/verify-locale-metadata.spec.ts new file mode 100644 index 0000000000..9a4dc45187 --- /dev/null +++ b/scripts/verify-locale-metadata.spec.ts @@ -0,0 +1,121 @@ +/** Metadata coverage rejects missing translations through the same checker used by CI. */ +import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, expect, it } from 'vitest' +import { localeMetadataProblems } from './verify-locale-metadata.ts' + +const roots: string[] = [] +afterEach(() => { for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true }) }) + +function fixture(ja: unknown = { meta: { title: '名前 {name}', description: '説明' } }): string { + const root = mkdtempSync(join(tmpdir(), 'dsh-locale-meta-')) + roots.push(root) + const directory = join(root, 'packages/demo/plugin/locale') + mkdirSync(directory, { recursive: true }) + writeFileSync(join(directory, 'en.json'), JSON.stringify({ meta: { title: 'Name {name}' } })) + writeFileSync(join(directory, 'zh.json'), JSON.stringify({ meta: { title: '名称 {name}', description: '描述' } })) + writeFileSync(join(directory, 'ja.json'), JSON.stringify(ja)) + return root +} + +it('accepts Japanese fields from the union of English and Chinese metadata', () => { + expect(localeMetadataProblems(fixture())).toEqual([]) +}) + +it('rejects missing Japanese files, including newly added packages', () => { + const root = fixture() + rmSync(join(root, 'packages/demo/plugin/locale/ja.json')) + expect(localeMetadataProblems(root).join('\n')).toContain('ja.json') +}) + +it.each([ + [{ meta: { title: '名前 {name}' } }, 'missing meta.description'], + [{ meta: { title: '名前 {other}', description: '説明' } }, 'changes placeholders'], + [{ meta: { title: '', description: '説明' } }, 'expected non-empty text'], + [{ meta: { title: '名前 {name}', description: '説明', extra: '余分' } }, 'unexpected meta.extra'], +])('rejects incomplete or inconsistent Japanese metadata', (ja, diagnostic) => { + expect(localeMetadataProblems(fixture(ja)).join('\n')).toContain(diagnostic) +}) + +it('checks referenced detail documents', () => { + const root = fixture() + const directory = join(root, 'packages/demo/plugin/locale') + const meta = { title: 'Name {name}', description: 'Description.', detail: 'docs/DETAIL.md' } + for (const language of ['en', 'zh', 'ja']) writeFileSync(join(directory, `${language}.json`), JSON.stringify({ meta })) + expect(localeMetadataProblems(root).join('\n')).toContain('missing detail resource') + mkdirSync(join(directory, '../docs')) + writeFileSync(join(directory, '../docs/DETAIL.md'), '# Detail\n') + expect(localeMetadataProblems(root)).toEqual([]) +}) + +it('does not mistake package.json in the locale service package for a translation', () => { + const root = fixture() + const directory = join(root, 'packages/client/locale') + mkdirSync(directory, { recursive: true }) + writeFileSync(join(directory, 'package.json'), '{"name":"locale"}') + mkdirSync(join(directory, 'src')) + writeFileSync(join(directory, 'src/index.ts'), 'export {}') + expect(localeMetadataProblems(root)).toEqual([]) +}) + +it('rejects an empty discovery', () => { + const root = mkdtempSync(join(tmpdir(), 'dsh-locale-empty-')) + roots.push(root) + expect(localeMetadataProblems(root)).toEqual(['no package locale metadata found']) +}) + +it('rejects loadable plugins without any locale directory', () => { + const root = fixture() + const directory = join(root, 'packages/demo/new-plugin') + mkdirSync(join(directory, 'src'), { recursive: true }) + writeFileSync(join(directory, 'package.json'), JSON.stringify({ name: '@deepseek-ai/dsh-new-plugin' })) + writeFileSync(join(directory, 'src/index.ts'), 'export function apply() {}') + expect(localeMetadataProblems(root).join('\n')).toContain('new-plugin/locale') +}) + +it('checks nested subpath locale resources and package-relative detail files', () => { + const root = fixture() + const directory = join(root, 'packages/demo/plugin/locale/tools') + mkdirSync(directory) + for (const language of ['en', 'zh']) writeFileSync(join(directory, `${language}.json`), JSON.stringify({ meta: { title: 'Tools', detail: 'docs/TOOLS.md' } })) + mkdirSync(join(root, 'packages/demo/plugin/docs')) + writeFileSync(join(root, 'packages/demo/plugin/docs/TOOLS.md'), '# Tools\n') + expect(localeMetadataProblems(root).join('\n')).toContain('locale/tools') + expect(localeMetadataProblems(root).join('\n')).toContain('ja.json') + writeFileSync(join(directory, 'ja.json'), JSON.stringify({ meta: { title: 'ツール', detail: 'docs/TOOLS.md' } })) + expect(localeMetadataProblems(root)).toEqual([]) +}) + +it.each(['../../other/README.md', 'docs\\DETAIL.md', 'docs/DETAIL.txt', '/README.md'])('rejects runtime-invalid detail path %s', (detail) => { + const root = fixture({ meta: { title: '名前 {name}', description: '説明', detail } }) + expect(localeMetadataProblems(root).join('\n')).toMatch(/must (?:be a relative path|name a Markdown file)/u) +}) + +it('requires sentence punctuation for English descriptions', () => { + const root = fixture() + const file = join(root, 'packages/demo/plugin/locale/en.json') + writeFileSync(file, JSON.stringify({ meta: { title: 'Name {name}', description: 'Description' } })) + expect(localeMetadataProblems(root).join('\n')).toContain('sentence punctuation') + writeFileSync(file, JSON.stringify({ meta: { title: 'Name {name}', description: 'Description.' } })) + expect(localeMetadataProblems(root)).toEqual([]) +}) + +it('permits missing Chinese resources for loadable plugins', () => { + const root = fixture({ meta: { title: '名前 {name}' } }) + const directory = join(root, 'packages/demo/plugin') + mkdirSync(join(directory, 'src')) + writeFileSync(join(directory, 'src/index.ts'), 'export function apply() {}') + writeFileSync(join(directory, 'package.json'), JSON.stringify({ name: '@deepseek-ai/dsh-demo' })) + rmSync(join(directory, 'locale/zh.json')) + expect(localeMetadataProblems(root)).toEqual([]) +}) + +it('excludes packages formally classified as test helpers', () => { + const root = fixture() + const directory = join(root, 'packages/test-support/llm-replay') + mkdirSync(join(directory, 'src'), { recursive: true }) + writeFileSync(join(directory, 'src/index.ts'), 'export function apply() {}') + writeFileSync(join(directory, 'package.json'), JSON.stringify({ name: '@deepseek-ai/dsh-llm-replay' })) + expect(localeMetadataProblems(root)).toEqual([]) +}) diff --git a/scripts/verify-locale-metadata.ts b/scripts/verify-locale-metadata.ts new file mode 100644 index 0000000000..027cb31fb4 --- /dev/null +++ b/scripts/verify-locale-metadata.ts @@ -0,0 +1,72 @@ +/** Check Japanese coverage of package metadata and plugin templates without loading plugins. */ +import { existsSync, globSync, readFileSync } from 'node:fs' +import { basename, posix, join, resolve } from 'node:path' +import { detailPath } from '../packages/util/plugin-detail/src/document.ts' +import { PRODUCT_PACKAGE_POLICY } from './product-package-policy.ts' +import { collectConfigCatalog } from './gen-config-catalog.ts' + +/** Flatten metadata strings and reject values that cannot be translated. */ +function strings(value: unknown, key = ''): Record { + if (typeof value === 'string' && value.trim() !== '') return { [key]: value } + if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error(`${key}: expected non-empty text`) + return Object.fromEntries(Object.entries(value).flatMap(([name, child]) => Object.entries(strings(child, key ? `${key}.${name}` : name)))) +} + +/** + * Compare Japanese metadata with every field supplied by English or Chinese. + * @param root - repository or fixture root. + * @returns actionable missing-file, field, placeholder and resource diagnostics. + */ +export function localeMetadataProblems(root: string): string[] { + const directories = new Set(globSync('packages/**/locale/**/*.json', { + cwd: root, exclude: ['packages/**/node_modules/**', 'packages/**/lib/**', 'packages/**/tests/**'], + }).map(file => file.replaceAll('\\', '/')).filter(file => ['en.json', 'zh.json', 'ja.json'].includes(basename(file))).map(file => posix.dirname(file))) + for (const entry of collectConfigCatalog(root)) { + const dir = entry.dir.replaceAll('\\', '/') + if (PRODUCT_PACKAGE_POLICY[dir]?.category === 'test') continue + if (entry.kind !== 'config' && entry.kind !== 'no-config') continue + const directory = `${dir}/locale` + directories.add(directory) + } + const problems: string[] = [] + if (directories.size === 0) return ['no package locale metadata found'] + for (const directory of [...directories].sort()) { + try { + const read = (language: string): Record => { + const file = join(root, directory, `${language}.json`) + const value: unknown = JSON.parse(readFileSync(file, 'utf8')) + const dictionary = strings(value) + const detail = detailPath(dictionary['meta.detail'], `${directory}/${language}.json: meta.detail`) + const packageDir = directory.slice(0, directory.lastIndexOf('/locale')) + if (detail !== undefined && !existsSync(resolve(root, packageDir, detail))) { + throw new Error(`missing detail resource ${detail}`) + } + return dictionary + } + const en = read('en') + const zh = existsSync(join(root, directory, 'zh.json')) ? read('zh') : {} + const description = en['meta.description'] + if (description !== undefined && !/[.!?]$/u.test(description)) problems.push(`${directory}/en.json: meta.description must end with sentence punctuation`) + const ja = read('ja') + const expected = { ...zh, ...en } + for (const key of new Set([...Object.keys(expected), ...Object.keys(ja)])) { + if (ja[key] === undefined) problems.push(`${directory}/ja.json: missing ${key}`) + else if (expected[key] === undefined) problems.push(`${directory}/ja.json: unexpected ${key}`) + else { + const placeholders = (text: string): string => (text.match(/\{\w+\}/gu) ?? []).sort().join(',') + if (placeholders(ja[key]) !== placeholders(expected[key])) problems.push(`${directory}/ja.json: ${key} changes placeholders`) + } + } + } catch (error) { + problems.push(`${directory}: ${error instanceof Error ? error.message : String(error)}`) + } + } + return problems +} + +if (import.meta.filename === resolve(process.argv[1] ?? '')) { + const problems = localeMetadataProblems(resolve(import.meta.dirname, '..')) + for (const problem of problems) console.error(problem) + if (problems.length > 0) process.exitCode = 1 + else console.log('verify-locale-metadata: all package and template metadata has complete Japanese translations.') +} diff --git a/tsconfig.host.json b/tsconfig.host.json index 59d6095913..4e2644f78d 100644 --- a/tsconfig.host.json +++ b/tsconfig.host.json @@ -8,6 +8,7 @@ "rewriteRelativeImportExtensions": false }, "include": [ + "apps/web/tests/japanese-plugin-metadata.e2e.ts", "apps/web/tests/rich-text-quotes.e2e.ts", "apps/web/tests/hover-input.e2e.ts", "apps/web/tests/collapse-timing.e2e.ts",