From b115e0a5740fa8a477369afb7fc1a6c00414f543 Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Sun, 19 Jan 2025 23:22:15 -0500 Subject: [PATCH] Feature: i18n (#70) * chore: add @inlang/paraglide-sveltekit to @kksh/ui * feat: add i18n to desktop * fix: add shrink-0 class to mode-toggle button for consistent styling * feat: add i18n to settings, not working yet * feat: i18 working * feat: add i18n for about * feat: migrate all goto to use i18n.resolveRoute * feat: finish translating settings to chinese * feat: add Chinese i18n for troubleshooters * feat: add russian translation (by AI) * format: run prettier * format * chore: update .prettierignore to exclude src/lib/paraglide/** --- .changeset/config.json | 3 +- .github/workflows/ninja_i18n.yml | 23 + CONTRIBUTING.md | 5 + apps/cli/CHANGELOG.md | 6 - apps/cli/bun.lockb | Bin 0 -> 3124 bytes apps/cli/package.json | 2 +- apps/cli/src/commands/verify.ts | 44 +- apps/desktop/.prettierignore | 3 +- apps/desktop/messages/en.json | 81 ++ apps/desktop/messages/ru.json | 81 ++ apps/desktop/messages/zh.json | 81 ++ apps/desktop/package.json | 8 +- apps/desktop/project.inlang/.gitignore | 1 + apps/desktop/project.inlang/project_id | 1 + apps/desktop/project.inlang/settings.json | 15 + apps/desktop/src/app.html | 2 +- apps/desktop/src/hooks.server.ts | 6 + apps/desktop/src/hooks.ts | 4 + apps/desktop/src/lib/cmds/builtin.ts | 35 +- apps/desktop/src/lib/cmds/ext.ts | 27 +- .../standalone/general-settings.svelte | 60 +- .../standalone/settings/AddDevExtForm.svelte | 25 +- .../standalone/settings/DevExtPathForm.svelte | 15 +- .../install-npm-package-name-form.svelte | 3 +- .../settings/install-tarball-url-form.svelte | 6 +- apps/desktop/src/lib/constants.ts | 6 + apps/desktop/src/lib/i18n.ts | 17 + apps/desktop/src/lib/stores/appConfig.ts | 8 +- apps/desktop/src/lib/utils/deeplink.ts | 3 +- apps/desktop/src/lib/utils/key.ts | 3 +- apps/desktop/src/lib/utils/route.ts | 3 +- apps/desktop/src/routes/+layout.svelte | 14 +- apps/desktop/src/routes/app/+layout.svelte | 8 +- apps/desktop/src/routes/app/+page.svelte | 24 +- .../src/routes/app/auth/confirm/+page.svelte | 5 +- .../store/[identifier]/+error.svelte | 5 +- .../extension/store/[identifier]/+page.svelte | 5 +- .../app/extension/ui-iframe/+page.svelte | 3 +- .../routes/app/extension/ui-iframe/+page.ts | 7 +- .../app/extension/ui-worker/+page.svelte | 3 +- .../routes/app/extension/ui-worker/+page.ts | 17 +- .../routes/app/help/onboarding/+page.svelte | 3 +- .../src/routes/app/settings/+page.svelte | 2 + .../routes/app/settings/about/+page.svelte | 20 +- .../settings/add-dev-extension/+page.svelte | 6 +- .../app/settings/extensions/+page.svelte | 15 +- .../settings/set-dev-ext-path/+page.svelte | 5 +- .../src/routes/app/settings/sidebar.svelte | 29 +- .../extension-loading/+page.svelte | 18 +- .../extension-window/+page.svelte | 7 +- .../routes/app/troubleshooters/sidebar.svelte | 18 +- apps/desktop/vite.config.js | 3 +- .../permissions/autogenerated/reference.md | 2 - packages/types/src/appConfig.ts | 2 + packages/ui/package.json | 1 + .../common/DialogImageCarousel.svelte | 2 +- .../src/components/theme/mode-toggle.svelte | 2 +- pnpm-lock.yaml | 959 +++++++++++++++++- 58 files changed, 1516 insertions(+), 246 deletions(-) create mode 100644 .github/workflows/ninja_i18n.yml create mode 100755 apps/cli/bun.lockb create mode 100644 apps/desktop/messages/en.json create mode 100644 apps/desktop/messages/ru.json create mode 100644 apps/desktop/messages/zh.json create mode 100644 apps/desktop/project.inlang/.gitignore create mode 100644 apps/desktop/project.inlang/project_id create mode 100644 apps/desktop/project.inlang/settings.json create mode 100644 apps/desktop/src/hooks.server.ts create mode 100644 apps/desktop/src/hooks.ts create mode 100644 apps/desktop/src/lib/i18n.ts diff --git a/.changeset/config.json b/.changeset/config.json index 1a0bb03..e3e1b7f 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -14,7 +14,6 @@ "@kksh/utils", "@kksh/extension", "@kksh/schema", - "@kksh/supabase", - "@kksh/ui" + "@kksh/supabase" ] } diff --git a/.github/workflows/ninja_i18n.yml b/.github/workflows/ninja_i18n.yml new file mode 100644 index 0000000..c0ed059 --- /dev/null +++ b/.github/workflows/ninja_i18n.yml @@ -0,0 +1,23 @@ + +name: Ninja i18n action + +on: pull_request_target + +# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings +permissions: + pull-requests: write # Necessary to comment on PRs + issues: read # Necessary to read issue comments + contents: read # Necessary to access the repo content + +jobs: + ninja-i18n: + name: Ninja i18n - GitHub Lint Action + runs-on: ubuntu-latest + + steps: + - name: Run Ninja i18n + # @main ensures that the latest version of the action is used + uses: opral/ninja-i18n-action@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7b5214..ec27d75 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,3 +43,8 @@ pnpm --filter @kksh/desktop tauri dev cd apps/desktop pnpm tauri dev ``` + +## i188n + +If you are willing to help with the translation, please use translations in json files in `apps/desktop/messages`. +Use `en.json` as a reference. diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index c1fada5..68709f0 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,11 +1,5 @@ # kksh -## 0.0.30 - -### Patch Changes - -- Add version check to cli, check if package.json and jsr.json have different versions - ## 0.0.29 ### Patch Changes diff --git a/apps/cli/bun.lockb b/apps/cli/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..56bb31cc4e2ccff86b0a258c0b2ca20dc81f6221 GIT binary patch literal 3124 zcmY#Z)GsYA(of3F(@)JSQ%EY!;{sycoc!eMw9K4T-L(9o+{6;yG6OCq1_lP+m76wh zott!HgVKTQnr^)*li%F)lWSTowKP=$}Dgpv_2*tpGMmIqD*)RnR$vK%| zF)knp#0{Q6niEJ*1JXdl8g2t=9w6Nd6$esabx&6)$s|17s(gw~bFa5S1R8H zUMo%1kLp$1YHP`vZ*%Nb;H=$?PtT~FpLHp7zG{Pxc57-9Bgg;>04NkdKm>?Qf$jpC z2f}PXObmeO4+1K-M$#`xjAo!3nEr)8wiQr6$Q{7&Vc-K|VgOA4bD&~Jpng^$Ed|6N zniv4nuL1P52~a;MhCzCv5l_$vnEni)ejBL$ApI-^bs`ji%m87a5e&>wHpmPR9~KWF z8pMYuG$5NiegF9XfefN10Gh|h05KQYXqFu_xO&aQFJy`dlodN0=BT-@eE!ZnRqr_W zX-S*NbB9V+T;b-Op0#&z+R;kg?Pc1$e9Im*co>N}HOa+)_@tI&fMhN#oI%cJN$>Al z7A{o&O>*_NoV6dmTrlda(9tvPugVT$R#&OM|6G`Lp@;XDrWZRhlfQ0fI4Ev?W5(*q zp3jdq9ID~IHZNZb$y`u)!vM?1lZT&Q$xN^>JyxOZ$aHLi|E{2oSM1HZQZo{JL}uM7 zS#rqiLUFy_>XHn_K!c-<6Au^L_0PyOVYZvbT3#5XJqyWP6FOr^e^E!L`PoTL2 z1z_P0qsei{06L!>=MI#f4bZaa2$bfsDK1LZ%gie-NzBR7gVnftAw{XFb_zxY3dNaK zsrhL-3MLAPIhpBs`Dvg!5(NJJhX4>8lny^Y4dj4Uw_G-*#zuBPeK<@2#TTf20Oe&+ zyo2(H1ypYck!HZkSCBa%{V=mYbO+Q7J77f)0$euHMrN_47C>K_!QEtt?kh;W4y&gH z7~@R!4D<}ZqTm`IR?~AZKU2onPAbQ1@Ra|2h@ir;66o;(&E(IveY6y z*NT$VqP)bM;F6-uymUJSLqs50zyqPAI2ml_f!`uai>6Ev0X4`#V*K|O+q{!4+*MLs zoLU4lE%vfPV^Es+j~HMig4#tb7N%zyEBOBXfVyA~v?2zk0bqC=;tcMR%7WD54C@Co@w$j%xN=?r!E-9+i%PYvuD%Q&{O4mmy($@tk)dhvLnO;eH6^H{i z0grCD8mMNldax0O<{&emrk58(8F~3Bsd$V-QUx>+q*xachlVB~(@OJFGLth2Itp1C z&=_Q{E;!;%L52}_MtLz%cX_ccIDr|0g9IFRkodx*9}xvW0}vdb<)(UIk3bXIprZf= CnMEc5 literal 0 HcmV?d00001 diff --git a/apps/cli/package.json b/apps/cli/package.json index e4f8c3d..b6b84c3 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "kksh", "module": "dist/cli.js", - "version": "0.0.30", + "version": "0.0.29", "type": "module", "bin": { "kksh": "./dist/cli.js", diff --git a/apps/cli/src/commands/verify.ts b/apps/cli/src/commands/verify.ts index 7a98182..9853018 100644 --- a/apps/cli/src/commands/verify.ts +++ b/apps/cli/src/commands/verify.ts @@ -32,45 +32,6 @@ export function verifyTemplateUiCommand(projectRoot: string, cmd: TemplateUiCmd) return true } -export function verifyVersion(projectPath: string): boolean { - const pkgJsonPath = path.join(projectPath, "package.json") - const jsrJsonPath = path.join(projectPath, "jsr.json") - const denoJsonPath = path.join(projectPath, "deno.json") - const versions = { npm: undefined, jsr: undefined, deno: undefined } - - const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")) - versions.npm = pkgJson.version - if (fs.existsSync(jsrJsonPath)) { - const jsrJson = JSON.parse(fs.readFileSync(jsrJsonPath, "utf-8")) - versions.jsr = jsrJson.version - } - if (fs.existsSync(denoJsonPath)) { - const denoJson = JSON.parse(fs.readFileSync(denoJsonPath, "utf-8")) - versions.deno = denoJson.version - } - if (!versions.npm) { - logger.error(`version is not set in package.json`) - return false - } - if (fs.existsSync(jsrJsonPath) && fs.existsSync(denoJsonPath)) { - logger.error(`Both jsr.json and deno.json are present, only one is allowed`) - return false - } - if (versions.jsr && versions.jsr !== versions.npm) { - logger.error( - `jsr.json version ${versions.jsr} does not match package.json version ${versions.npm}` - ) - return false - } - if (versions.deno && versions.deno !== versions.npm) { - logger.error( - `deno.json version ${versions.deno} does not match package.json version ${versions.npm}` - ) - return false - } - return true -} - export function verifySingleProject(projectPath: string): boolean { logger.info(`Verifying project at ${projectPath}`) const pkgJsonPath = path.join(projectPath, "package.json") @@ -91,7 +52,7 @@ export function verifySingleProject(projectPath: string): boolean { logger.info(`name`, pkg.name) logger.info(`version`, pkg.version) logger.info(`identifier`, pkg.kunkun.identifier) - if (!pkg.files?.length) { + if (pkg.files.length === 0) { logger.warn( `"files" field is empty, it is recommended to include only the necessary files, e.g. dist` ) @@ -105,9 +66,6 @@ export function verifySingleProject(projectPath: string): boolean { pkg.kunkun.identifier = folderName // } } - if (!verifyVersion(projectPath)) { - return false - } for (const cmd of pkg.kunkun.customUiCmds ?? []) { if (!verifyCustomUiCommand(projectPath, cmd)) { return false diff --git a/apps/desktop/.prettierignore b/apps/desktop/.prettierignore index 4f1c01d..b094ded 100644 --- a/apps/desktop/.prettierignore +++ b/apps/desktop/.prettierignore @@ -1 +1,2 @@ -src-tauri \ No newline at end of file +src-tauri +src/lib/paraglide/** \ No newline at end of file diff --git a/apps/desktop/messages/en.json b/apps/desktop/messages/en.json new file mode 100644 index 0000000..18e680c --- /dev/null +++ b/apps/desktop/messages/en.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "app_name": "KunKun", + "secondary_app_name": "KunKun", + + "common_edit": "Edit", + "common_clear": "Clear", + "common_check": "Check", + "common_install": "Install", + + "home_command_input_placeholder": "Type a command or search...", + "home_command_input_dropdown_quit": "Quit", + "home_command_input_dropdown_developer_title": "Developer", + "home_command_input_dropdown_close_window": "Close Window", + "home_command_input_dropdown_toggle_devtools": "Toggle Devtools", + "home_command_input_dropdown_reload_window": "Reload Window", + "home_command_input_dropdown_toggle_dev_extension_hmr": "Toggle Dev Extension HMR", + + "command_group_heading_dev_ext": "Dev Extensions", + "command_group_heading_ext": "Extensions", + "command_group_heading_quick_links": "Quick Links", + + "settings_menu_settings": "Settings", + "settings_menu_general": "General", + "settings_menu_developer": "Developer", + "settings_menu_extensions": "Extensions", + "settings_menu_set_dev_ext": "Set Dev Extension", + "settings_menu_add_dev_ext": "Add Dev Extension", + "settings_menu_about": "About", + + "settings_general_launch_at_login": "Launch at Login", + "settings_general_hotkey": "Hotkey", + "settings_general_menu_bar_icon": "Menu Bar Icon", + "settings_general_hide_on_blur": "Hide On Blur", + "settings_general_extension_auto_upgrade": "Extension Auto Upgrade", + "settings_general_dev_extension_hmr": "Dev Extension HMR", + "settings_general_join_beta_updates": "Join Beta Updates", + "settings_general_developer_mode": "Developer Mode", + "settings_general_language": "Language", + + "settings_about_version": "Version", + "settings_about_author": "Author", + "settings_about_source_code": "Source Code", + "settings_about_extensions_source_code": "Extensions Source Code", + "settings_about_check_for_updates": "Check for Updates", + + "settings_set_dev_ext_title": "Set Dev Extension Path", + "settings_set_dev_ext_description": "This is where your extensions will be installed.", + "settings_set_dev_ext_enter_path": "Enter Path", + + "settings_extensions_title": "Your Extensions", + "settings_extensions_table_col_name": "Name", + "settings_extensions_table_col_identifier": "Identifier", + "settings_extensions_table_col_type": "Type", + "settings_extensions_table_col_version": "Version", + "settings_extensions_table_col_uninstall": "Uninstall", + + "settings_add_dev_ext_title": "Add Dev Extension", + "settings_add_dev_ext_description": "There are 4 options to install an extension in developer mode. Either load it from your local tarball file, a tarball remote URL, npm package name or load from a remote URL.", + "settings_add_dev_ext_install_from_ext_folders": "Install from Extension Folders", + "settings_add_dev_ext_install_from_ext_files": "Install from Extension Tarball File", + "settings_add_dev_ext_drag_and_drop": "Drag and Drop", + "settings_add_dev_ext_drag_and_drop2": "Extension Folder or Tarball", + "settings_add_dev_ext_install_tarball_from_url": "Install Tarball From URL", + + "troubleshooters_sidebar_title": "Troubleshooters", + "troubleshooters_sidebar_extension_loading_title": "Extension Loading", + "troubleshooters_sidebar_extension_window_title": "Extension Window", + "troubleshooters_sidebar_mdns_debugger_title": "MDNS Debugger", + + "troubleshooters_extension_window_title": "Extension Window Troubleshooter", + "troubleshooters_extension_window_refresh_every_second": "Refresh Every Second", + "troubleshooters_extension_window_refresh": "Refresh", + "troubleshooters_extension_window_refreshed": "Refreshed {count} times", + + "troubleshooters_extension_loading_title": "Extension Loading Troubleshooter", + "troubleshooters_extension_loading_table_col_identifier": "Identifier", + "troubleshooters_extension_loading_table_col_path": "Path", + "troubleshooters_extension_loading_table_col_error": "Error" +} diff --git a/apps/desktop/messages/ru.json b/apps/desktop/messages/ru.json new file mode 100644 index 0000000..a22a89a --- /dev/null +++ b/apps/desktop/messages/ru.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "app_name": "KunKun", + "secondary_app_name": "KunKun", + + "common_edit": "Редактировать", + "common_clear": "Очистить", + "common_check": "Проверить", + "common_install": "Установить", + + "home_command_input_placeholder": "Введите команду или поиск...", + "home_command_input_dropdown_quit": "Выйти", + "home_command_input_dropdown_developer_title": "Разработчик", + "home_command_input_dropdown_close_window": "Закрыть окно", + "home_command_input_dropdown_toggle_devtools": "Переключить Devtools", + "home_command_input_dropdown_reload_window": "Перезагрузить окно", + "home_command_input_dropdown_toggle_dev_extension_hmr": "Переключить HMR", + + "command_group_heading_dev_ext": "Разработчики", + "command_group_heading_ext": "Расширения", + "command_group_heading_quick_links": "Быстрые ссылки", + + "settings_menu_settings": "Настройки", + "settings_menu_general": "Общие", + "settings_menu_developer": "Разработчик", + "settings_menu_extensions": "Расширения", + "settings_menu_set_dev_ext": "Установить расширение", + "settings_menu_add_dev_ext": "Добавить расширение", + "settings_menu_about": "О программе", + + "settings_general_launch_at_login": "Запуск при входе", + "settings_general_hotkey": "Горячая клавиша", + "settings_general_menu_bar_icon": "Иконка в меню", + "settings_general_hide_on_blur": "Скрыть при потере фокуса", + "settings_general_extension_auto_upgrade": "Автообновление расширений", + "settings_general_dev_extension_hmr": "HMR", + "settings_general_join_beta_updates": "Присоединиться к бета-версиям", + "settings_general_developer_mode": "Режим разработчика", + "settings_general_language": "Язык", + + "settings_about_version": "Версия", + "settings_about_author": "Автор", + "settings_about_source_code": "Исходный код", + "settings_about_extensions_source_code": "Исходный код расширений", + "settings_about_check_for_updates": "Проверить на наличие обновлений", + + "settings_set_dev_ext_title": "Установить путь к расширению", + "settings_set_dev_ext_description": "Это место, где будут установлены ваши расширения.", + "settings_set_dev_ext_enter_path": "Введите путь", + + "settings_extensions_title": "Ваши расширения", + "settings_extensions_table_col_name": "Название", + "settings_extensions_table_col_identifier": "Идентификатор", + "settings_extensions_table_col_type": "Тип", + "settings_extensions_table_col_version": "Версия", + "settings_extensions_table_col_uninstall": "Удалить", + + "settings_add_dev_ext_title": "Добавить расширение", + "settings_add_dev_ext_description": "Есть 4 способа установить расширение в режиме разработчика. Либо загрузите его из вашего локального файла tarball, URL-адреса tarball, npm-пакета или URL-адреса.", + "settings_add_dev_ext_install_from_ext_folders": "Установить из папки расширений", + "settings_add_dev_ext_install_from_ext_files": "Установить из файла tarball", + "settings_add_dev_ext_drag_and_drop": "Перетащите и отпустите", + "settings_add_dev_ext_drag_and_drop2": "Папка расширений или файл tarball", + "settings_add_dev_ext_install_tarball_from_url": "Установить tarball из URL", + + "troubleshooters_sidebar_title": "Troubleshooters", + "troubleshooters_sidebar_extension_loading_title": "Загрузка расширения", + "troubleshooters_sidebar_extension_window_title": "Окно расширения", + "troubleshooters_sidebar_mdns_debugger_title": "MDNS Debugger", + + "troubleshooters_extension_window_title": "Troubleshooter расширения", + "troubleshooters_extension_window_refresh_every_second": "Обновлять каждую секунду", + "troubleshooters_extension_window_refresh": "Обновить", + "troubleshooters_extension_window_refreshed": "Обновлено {count} раз", + + "troubleshooters_extension_loading_title": "Troubleshooter загрузки расширения", + "troubleshooters_extension_loading_table_col_identifier": "Идентификатор", + "troubleshooters_extension_loading_table_col_path": "Путь", + "troubleshooters_extension_loading_table_col_error": "Ошибка" +} diff --git a/apps/desktop/messages/zh.json b/apps/desktop/messages/zh.json new file mode 100644 index 0000000..4010365 --- /dev/null +++ b/apps/desktop/messages/zh.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "app_name": "KunKun", + "secondary_app_name": "鲲鲲", + + "common_edit": "编辑", + "common_clear": "清除", + "common_check": "检查", + "common_install": "安装", + + "home_command_input_placeholder": "输入命令或搜索...", + "home_command_input_dropdown_quit": "退出", + "home_command_input_dropdown_developer_title": "开发者", + "home_command_input_dropdown_close_window": "关闭窗口", + "home_command_input_dropdown_toggle_devtools": "切换开发者工具", + "home_command_input_dropdown_reload_window": "重新加载窗口", + "home_command_input_dropdown_toggle_dev_extension_hmr": "切换开发插件 HMR", + + "command_group_heading_dev_ext": "开发插件", + "command_group_heading_ext": "插件", + "command_group_heading_quick_links": "快捷链接", + + "settings_menu_settings": "设置", + "settings_menu_general": "通用", + "settings_menu_developer": "开发者", + "settings_menu_extensions": "插件", + "settings_menu_set_dev_ext": "设置开发插件", + "settings_menu_add_dev_ext": "添加开发插件", + "settings_menu_about": "关于", + + "settings_general_launch_at_login": "开机启动", + "settings_general_hotkey": "快捷键", + "settings_general_menu_bar_icon": "菜单栏图标", + "settings_general_hide_on_blur": "隐藏在后台", + "settings_general_extension_auto_upgrade": "自动更新插件", + "settings_general_dev_extension_hmr": "开发模式", + "settings_general_join_beta_updates": "加入 Beta 更新", + "settings_general_developer_mode": "开发者模式", + "settings_general_language": "语言", + + "settings_about_version": "版本", + "settings_about_author": "作者", + "settings_about_source_code": "源代码", + "settings_about_extensions_source_code": "插件源代码", + "settings_about_check_for_updates": "检查更新", + + "settings_set_dev_ext_title": "设置开发插件安装路径", + "settings_set_dev_ext_description": "这是你的开发插件将被安装的地方。", + "settings_set_dev_ext_enter_path": "输入路径", + + "settings_extensions_title": "你的插件", + "settings_extensions_table_col_name": "名称", + "settings_extensions_table_col_identifier": "标识符", + "settings_extensions_table_col_type": "类型", + "settings_extensions_table_col_version": "版本", + "settings_extensions_table_col_uninstall": "卸载", + + "settings_add_dev_ext_title": "添加开发插件", + "settings_add_dev_ext_description": "有四种方法可以在开发模式下安装插件。 从本地 tarball 文件、tarball 远程 URL、npm 包名称或远程 URL 加载。", + "settings_add_dev_ext_install_from_ext_folders": "从插件文件夹安装", + "settings_add_dev_ext_install_from_ext_files": "从插件 tarball 文件安装", + "settings_add_dev_ext_drag_and_drop": "拖放", + "settings_add_dev_ext_drag_and_drop2": "插件文件夹或 tarball", + "settings_add_dev_ext_install_tarball_from_url": "从 tarball URL 安装", + + "troubleshooters_sidebar_title": "故障排除器", + "troubleshooters_sidebar_extension_loading_title": "插件加载", + "troubleshooters_sidebar_extension_window_title": "插件窗口", + "troubleshooters_sidebar_mdns_debugger_title": "MDNS 调试器", + + "troubleshooters_extension_window_title": "插件窗口故障排除器", + "troubleshooters_extension_window_refresh_every_second": "每秒刷新", + "troubleshooters_extension_window_refresh": "刷新", + "troubleshooters_extension_window_refreshed": "已刷新 {count} 次", + + "troubleshooters_extension_loading_title": "插件加载故障排除器", + "troubleshooters_extension_loading_table_col_identifier": "标识符", + "troubleshooters_extension_loading_table_col_path": "路径", + "troubleshooters_extension_loading_table_col_error": "错误" +} diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 0b5c89c..d444be4 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@kksh/desktop", - "version": "0.1.16", + "version": "0.1.17", "description": "", "type": "module", "scripts": { @@ -35,7 +35,8 @@ "sveltekit-superforms": "^2.22.1", "tauri-plugin-clipboard-api": "^2.1.11", "tauri-plugin-user-input-api": "workspace:*", - "uuid": "^11.0.3" + "uuid": "^11.0.3", + "@inlang/paraglide-sveltekit": "0.15.5" }, "devDependencies": { "@eslint/js": "^9.18.0", @@ -68,6 +69,7 @@ "tslib": "^2.8.1", "typescript": "^5.6.3", "typescript-eslint": "^8.20.0", - "vite": "^6.0.3" + "vite": "^6.0.3", + "@inlang/paraglide-js": "1.11.8" } } diff --git a/apps/desktop/project.inlang/.gitignore b/apps/desktop/project.inlang/.gitignore new file mode 100644 index 0000000..5e46596 --- /dev/null +++ b/apps/desktop/project.inlang/.gitignore @@ -0,0 +1 @@ +cache \ No newline at end of file diff --git a/apps/desktop/project.inlang/project_id b/apps/desktop/project.inlang/project_id new file mode 100644 index 0000000..fe891a1 --- /dev/null +++ b/apps/desktop/project.inlang/project_id @@ -0,0 +1 @@ +9800f324a732adb2ed22a4b600a0025820caaba8c4d886b0949b04616bba4726 \ No newline at end of file diff --git a/apps/desktop/project.inlang/settings.json b/apps/desktop/project.inlang/settings.json new file mode 100644 index 0000000..fd2da1b --- /dev/null +++ b/apps/desktop/project.inlang/settings.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "sourceLanguageTag": "en", + "languageTags": ["en", "zh", "ru"], + "modules": [ + "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@latest/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@latest/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@latest/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@latest/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@latest/dist/index.js" + ], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{languageTag}.json" + } +} diff --git a/apps/desktop/src/app.html b/apps/desktop/src/app.html index 971a944..dd0dff8 100644 --- a/apps/desktop/src/app.html +++ b/apps/desktop/src/app.html @@ -1,5 +1,5 @@ - + diff --git a/apps/desktop/src/hooks.server.ts b/apps/desktop/src/hooks.server.ts new file mode 100644 index 0000000..27abba0 --- /dev/null +++ b/apps/desktop/src/hooks.server.ts @@ -0,0 +1,6 @@ +// file initialized by the Paraglide-SvelteKit CLI - Feel free to edit it +import { sequence } from "@sveltejs/kit/hooks" +import { i18n } from "$lib/i18n" + +// add your own hooks as part of the sequence here +export const handle = sequence(i18n.handle()) diff --git a/apps/desktop/src/hooks.ts b/apps/desktop/src/hooks.ts new file mode 100644 index 0000000..dac0351 --- /dev/null +++ b/apps/desktop/src/hooks.ts @@ -0,0 +1,4 @@ +// file initialized by the Paraglide-SvelteKit CLI - Feel free to edit it +import { i18n } from "$lib/i18n" + +export const reroute = i18n.reroute() diff --git a/apps/desktop/src/lib/cmds/builtin.ts b/apps/desktop/src/lib/cmds/builtin.ts index 68f1337..0defe20 100644 --- a/apps/desktop/src/lib/cmds/builtin.ts +++ b/apps/desktop/src/lib/cmds/builtin.ts @@ -1,3 +1,4 @@ +import { i18n } from "@/i18n" import { appConfig, appState, auth, extensions } from "@/stores" import { checkUpdateAndInstall } from "@/utils/updater" import { setTransparentTitlebar } from "@kksh/api/commands" @@ -25,7 +26,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "Go to Extension Store", function: async () => { appState.clearSearchTerm() - goto("/app/extension/store") + goto(i18n.resolveRoute("/app/extension/store")) } }, { @@ -36,7 +37,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ }, description: "", function: async () => { - goto("/app/auth") + goto(i18n.resolveRoute("/app/auth")) } }, { @@ -98,7 +99,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ }, description: "", function: async () => { - goto("/app/extension/file-transfer") + goto(i18n.resolveRoute("/app/extension/file-transfer")) appState.clearSearchTerm() } }, @@ -112,7 +113,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/settings/add-dev-extension") + goto(i18n.resolveRoute("/app/settings/add-dev-extension")) } }, { @@ -137,7 +138,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ function: async () => { // const appStateStore = useAppStateStore() appState.clearSearchTerm() - goto("/app/settings/set-dev-ext-path") + goto(i18n.resolveRoute("/app/settings/set-dev-ext-path")) } }, { @@ -149,7 +150,6 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - // goto("/app/window-troubleshooter") const winLabel = `main:extension-window-troubleshooter-${uuidv4()}` console.log(winLabel) new WebviewWindow(winLabel, { @@ -168,7 +168,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/help/deno-install") + goto(i18n.resolveRoute("/app/help/deno-install")) }, keywords: ["help", "deno", "install"] }, @@ -181,7 +181,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/help/ffmpeg-install") + goto(i18n.resolveRoute("/app/help/ffmpeg-install")) }, keywords: ["help", "ffmpeg", "install"] }, @@ -194,7 +194,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/help/brew-install") + goto(i18n.resolveRoute("/app/help/brew-install")) }, keywords: ["help", "brew", "install", "homebrew"] }, @@ -207,7 +207,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/help/onboarding") + goto(i18n.resolveRoute("/app/help/onboarding")) }, flags: { dev: true, @@ -223,7 +223,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/extension/permission-inspector") + goto(i18n.resolveRoute("/app/extension/permission-inspector")) }, keywords: ["extension"] }, @@ -236,7 +236,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "", function: async () => { appState.clearSearchTerm() - goto("/app/troubleshooters/extension-loading") + goto(i18n.resolveRoute("/app/troubleshooters/extension-loading")) }, keywords: ["extension", "troubleshooter"] }, @@ -249,7 +249,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "Create a Quicklink", function: async () => { appState.clearSearchTerm() - goto("/app/extension/create-quick-link") + goto(i18n.resolveRoute("/app/extension/create-quick-link")) } }, { @@ -261,7 +261,6 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "Display the current key", function: async () => { appState.clearSearchTerm() - // goto("/app/extension/key-displayer") const label = `main:extension:key-displayer-${uuidv4()}` new WebviewWindow(label, { url: "/app/extension/key-displayer", @@ -284,7 +283,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ }, description: "Open Settings", function: async () => { - goto("/app/settings") + goto(i18n.resolveRoute("/app/settings")) appState.clearSearchTerm() } }, @@ -344,7 +343,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ }, description: "Dance", function: async () => { - goto("/app/dance") + goto(i18n.resolveRoute("/app/dance")) } }, { @@ -385,7 +384,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ description: "Clipboard History", function: async () => { appState.clearSearchTerm() - goto("/app/extension/clipboard") + goto(i18n.resolveRoute("/app/extension/clipboard")) } }, { @@ -422,7 +421,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ }, description: "MDNS Debugger", function: async () => { - goto("/app/troubleshooters/mdns-debugger") + goto(i18n.resolveRoute("/app/troubleshooters/mdns-debugger")) }, flags: { developer: true diff --git a/apps/desktop/src/lib/cmds/ext.ts b/apps/desktop/src/lib/cmds/ext.ts index f391074..1906017 100644 --- a/apps/desktop/src/lib/cmds/ext.ts +++ b/apps/desktop/src/lib/cmds/ext.ts @@ -1,3 +1,4 @@ +import { i18n } from "@/i18n" import { appState } from "@/stores" import { winExtMap } from "@/stores/winExtMap" import { trimSlash } from "@/utils/url" @@ -7,6 +8,7 @@ import { HeadlessWorkerExtension } from "@kksh/api/headless" import { CustomUiCmd, ExtPackageJsonExtra, HeadlessCmd, TemplateUiCmd } from "@kksh/api/models" import { constructJarvisServerAPIWithPermissions, type IApp } from "@kksh/api/ui" import { launchNewExtWindow, loadExtensionManifestFromDisk } from "@kksh/extension" +import type { IKunkunFullServerAPI } from "@kunkunapi/src/api/server" import { convertFileSrc } from "@tauri-apps/api/core" import * as path from "@tauri-apps/api/path" import * as fs from "@tauri-apps/plugin-fs" @@ -38,7 +40,7 @@ export async function onTemplateUiCmdSelect( } else { return winExtMap .registerExtensionWithWindow({ windowLabel: "main", extPath: ext.extPath }) - .then(() => goto(url)) + .then(() => goto(i18n.resolveRoute(url))) } } @@ -65,16 +67,19 @@ export async function onHeadlessCmdSelect( loadedExt.kunkun.permissions, loadedExt.extPath ) - serverAPI.iframeUi = undefined - serverAPI.workerUi = undefined - serverAPI.db = new db.JarvisExtDB(extInfoInDB.extId) - serverAPI.kv = new db.KV(extInfoInDB.extId) - serverAPI.app = { - language: () => Promise.resolve("en") - } satisfies IApp + const serverAPI2 = { + ...serverAPI, + iframeUi: undefined, + workerUi: undefined, + db: new db.JarvisExtDB(extInfoInDB.extId), + kv: new db.KV(extInfoInDB.extId), + app: { + language: () => Promise.resolve("en") + } satisfies IApp + } const io = new WorkerParentIO(worker) - const rpc = new RPCChannel(io, { - expose: serverAPI + const rpc = new RPCChannel(io, { + expose: serverAPI2 }) const workerAPI = rpc.getAPI() await workerAPI.load() @@ -124,7 +129,7 @@ export async function onCustomUiCmdSelect( const newUrl = `http://${addr}` url2 = `/app/extension/ui-iframe?url=${encodeURIComponent(newUrl)}&extPath=${encodeURIComponent(ext.extPath)}` } - goto(url2) + goto(i18n.resolveRoute(url2)) } appState.clearSearchTerm() } diff --git a/apps/desktop/src/lib/components/standalone/general-settings.svelte b/apps/desktop/src/lib/components/standalone/general-settings.svelte index fdcae90..7978c44 100644 --- a/apps/desktop/src/lib/components/standalone/general-settings.svelte +++ b/apps/desktop/src/lib/components/standalone/general-settings.svelte @@ -1,43 +1,85 @@
  • - Launch at Login + {m.settings_general_launch_at_login()}
  • - Hotkey + {m.settings_general_hotkey()}
  • - Menu Bar Icon + {m.settings_general_menu_bar_icon()}
  • - Hide On Blur + {m.settings_general_hide_on_blur()}
  • - Extension Auto Upgrade + {m.settings_general_extension_auto_upgrade()}
  • - Dev Extension HMR + {m.settings_general_dev_extension_hmr()}
  • - Join Beta Updates + {m.settings_general_join_beta_updates()}
  • - Developer Mode + {m.settings_general_developer_mode()}
  • +
  • + {m.settings_general_language()} + + + + {triggerContent} + + + + {m.settings_general_language()} + {#each languages as lang} + { + appConfig.setLanguage(lang.value) + switchToLanguage(lang.value as AvailableLanguageTag) + }} + value={lang.value} + label={lang.label}>{lang.label} + {/each} + + + +