@neurocode-ai/desktop 1.18.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/README.md +19 -0
- package/electron-builder.config.test.ts +48 -0
- package/electron-builder.config.ts +146 -0
- package/electron.vite.config.ts +106 -0
- package/icons/README.md +14 -0
- package/icons/beta/128x128.png +0 -0
- package/icons/beta/128x128@2x.png +0 -0
- package/icons/beta/32x32.png +0 -0
- package/icons/beta/64x64.png +0 -0
- package/icons/beta/Square107x107Logo.png +0 -0
- package/icons/beta/Square142x142Logo.png +0 -0
- package/icons/beta/Square150x150Logo.png +0 -0
- package/icons/beta/Square284x284Logo.png +0 -0
- package/icons/beta/Square30x30Logo.png +0 -0
- package/icons/beta/Square310x310Logo.png +0 -0
- package/icons/beta/Square44x44Logo.png +0 -0
- package/icons/beta/Square71x71Logo.png +0 -0
- package/icons/beta/Square89x89Logo.png +0 -0
- package/icons/beta/StoreLogo.png +0 -0
- package/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/values/ic_launcher_background.xml +4 -0
- package/icons/beta/dock.png +0 -0
- package/icons/beta/icon.icns +0 -0
- package/icons/beta/icon.ico +0 -0
- package/icons/beta/icon.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/beta/ios/AppIcon-512@2x.png +0 -0
- package/icons/beta/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/beta/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/beta/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/beta/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/beta/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/icons/dev/128x128.png +0 -0
- package/icons/dev/128x128@2x.png +0 -0
- package/icons/dev/32x32.png +0 -0
- package/icons/dev/64x64.png +0 -0
- package/icons/dev/Square107x107Logo.png +0 -0
- package/icons/dev/Square142x142Logo.png +0 -0
- package/icons/dev/Square150x150Logo.png +0 -0
- package/icons/dev/Square284x284Logo.png +0 -0
- package/icons/dev/Square30x30Logo.png +0 -0
- package/icons/dev/Square310x310Logo.png +0 -0
- package/icons/dev/Square44x44Logo.png +0 -0
- package/icons/dev/Square71x71Logo.png +0 -0
- package/icons/dev/Square89x89Logo.png +0 -0
- package/icons/dev/StoreLogo.png +0 -0
- package/icons/dev/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/values/ic_launcher_background.xml +4 -0
- package/icons/dev/dock.png +0 -0
- package/icons/dev/icon.icns +0 -0
- package/icons/dev/icon.ico +0 -0
- package/icons/dev/icon.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/dev/ios/AppIcon-512@2x.png +0 -0
- package/icons/dev/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/dev/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/dev/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/dev/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/dev/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/icons/prod/128x128.png +0 -0
- package/icons/prod/128x128@2x.png +0 -0
- package/icons/prod/32x32.png +0 -0
- package/icons/prod/64x64.png +0 -0
- package/icons/prod/Square107x107Logo.png +0 -0
- package/icons/prod/Square142x142Logo.png +0 -0
- package/icons/prod/Square150x150Logo.png +0 -0
- package/icons/prod/Square284x284Logo.png +0 -0
- package/icons/prod/Square30x30Logo.png +0 -0
- package/icons/prod/Square310x310Logo.png +0 -0
- package/icons/prod/Square44x44Logo.png +0 -0
- package/icons/prod/Square71x71Logo.png +0 -0
- package/icons/prod/Square89x89Logo.png +0 -0
- package/icons/prod/StoreLogo.png +0 -0
- package/icons/prod/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/values/ic_launcher_background.xml +4 -0
- package/icons/prod/dock.png +0 -0
- package/icons/prod/icon.icns +0 -0
- package/icons/prod/icon.ico +0 -0
- package/icons/prod/icon.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/prod/ios/AppIcon-512@2x.png +0 -0
- package/icons/prod/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/prod/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/prod/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/prod/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/prod/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/package.json +75 -0
- package/resources/entitlements.plist +18 -0
- package/resources/linux/opencode-desktop.desktop +10 -0
- package/scripts/copy-bundles.ts +12 -0
- package/scripts/copy-icons.ts +12 -0
- package/scripts/copy-metainfo.ts +47 -0
- package/scripts/finalize-latest-json.ts +219 -0
- package/scripts/finalize-latest-yml.ts +124 -0
- package/scripts/prebuild.ts +10 -0
- package/scripts/predev.ts +5 -0
- package/scripts/prepare.ts +9 -0
- package/scripts/utils.ts +77 -0
- package/src/main/apps.ts +136 -0
- package/src/main/attachment-picker.test.ts +87 -0
- package/src/main/attachment-picker.ts +56 -0
- package/src/main/constants.ts +7 -0
- package/src/main/debug.ts +95 -0
- package/src/main/desktop-menu-actions.ts +84 -0
- package/src/main/env.d.ts +19 -0
- package/src/main/index.test.ts +37 -0
- package/src/main/index.ts +399 -0
- package/src/main/initialization.ts +6 -0
- package/src/main/install-state.test.ts +19 -0
- package/src/main/install-state.ts +8 -0
- package/src/main/ipc.ts +274 -0
- package/src/main/logging.ts +205 -0
- package/src/main/markdown.ts +16 -0
- package/src/main/menu.ts +67 -0
- package/src/main/migrate.ts +91 -0
- package/src/main/onboarding.ts +45 -0
- package/src/main/server.ts +238 -0
- package/src/main/shell-env.test.ts +50 -0
- package/src/main/shell-env.ts +101 -0
- package/src/main/sidecar.ts +157 -0
- package/src/main/store-cleanup.test.ts +93 -0
- package/src/main/store-cleanup.ts +94 -0
- package/src/main/store-keys.ts +7 -0
- package/src/main/store.ts +35 -0
- package/src/main/unresponsive.ts +70 -0
- package/src/main/updater-controller.test.ts +111 -0
- package/src/main/updater-controller.ts +97 -0
- package/src/main/updater-subscriptions.test.ts +16 -0
- package/src/main/updater-subscriptions.ts +20 -0
- package/src/main/updater.ts +85 -0
- package/src/main/window-registry.test.ts +91 -0
- package/src/main/window-registry.ts +47 -0
- package/src/main/window-state.ts +29 -0
- package/src/main/windows.ts +496 -0
- package/src/main/wsl/ipc.ts +103 -0
- package/src/main/wsl/policy.ts +33 -0
- package/src/main/wsl/runtime.ts +400 -0
- package/src/main/wsl/servers.test.ts +231 -0
- package/src/main/wsl/servers.ts +521 -0
- package/src/main/wsl/sidecar.ts +129 -0
- package/src/main/wsl/startup.ts +31 -0
- package/src/preload/index.ts +128 -0
- package/src/preload/types.ts +109 -0
- package/src/renderer/cli.ts +12 -0
- package/src/renderer/env.d.ts +10 -0
- package/src/renderer/html.test.ts +62 -0
- package/src/renderer/i18n/ar.ts +26 -0
- package/src/renderer/i18n/br.ts +27 -0
- package/src/renderer/i18n/bs.ts +28 -0
- package/src/renderer/i18n/da.ts +28 -0
- package/src/renderer/i18n/de.ts +28 -0
- package/src/renderer/i18n/en.ts +27 -0
- package/src/renderer/i18n/es.ts +27 -0
- package/src/renderer/i18n/fr.ts +28 -0
- package/src/renderer/i18n/index.ts +194 -0
- package/src/renderer/i18n/ja.ts +28 -0
- package/src/renderer/i18n/ko.ts +27 -0
- package/src/renderer/i18n/no.ts +28 -0
- package/src/renderer/i18n/pl.ts +28 -0
- package/src/renderer/i18n/ru.ts +27 -0
- package/src/renderer/i18n/uk.ts +28 -0
- package/src/renderer/i18n/zh.ts +26 -0
- package/src/renderer/i18n/zht.ts +26 -0
- package/src/renderer/index.html +21 -0
- package/src/renderer/index.tsx +464 -0
- package/src/renderer/initialization.test.ts +73 -0
- package/src/renderer/initialization.ts +22 -0
- package/src/renderer/onboarding.tsx +53 -0
- package/src/renderer/styles.css +0 -0
- package/src/renderer/webview-zoom.ts +138 -0
- package/src/renderer/wsl/connections.test.ts +43 -0
- package/src/renderer/wsl/connections.ts +28 -0
- package/sst-env.d.ts +10 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as i18n from "@solid-primitives/i18n"
|
|
2
|
+
|
|
3
|
+
import { dict as desktopEn } from "./en"
|
|
4
|
+
import { dict as desktopZh } from "./zh"
|
|
5
|
+
import { dict as desktopZht } from "./zht"
|
|
6
|
+
import { dict as desktopKo } from "./ko"
|
|
7
|
+
import { dict as desktopDe } from "./de"
|
|
8
|
+
import { dict as desktopEs } from "./es"
|
|
9
|
+
import { dict as desktopFr } from "./fr"
|
|
10
|
+
import { dict as desktopDa } from "./da"
|
|
11
|
+
import { dict as desktopJa } from "./ja"
|
|
12
|
+
import { dict as desktopPl } from "./pl"
|
|
13
|
+
import { dict as desktopRu } from "./ru"
|
|
14
|
+
import { dict as desktopUk } from "./uk"
|
|
15
|
+
import { dict as desktopAr } from "./ar"
|
|
16
|
+
import { dict as desktopNo } from "./no"
|
|
17
|
+
import { dict as desktopBr } from "./br"
|
|
18
|
+
import { dict as desktopBs } from "./bs"
|
|
19
|
+
|
|
20
|
+
import { dict as appEn } from "../../../../app/src/i18n/en"
|
|
21
|
+
import { dict as appZh } from "../../../../app/src/i18n/zh"
|
|
22
|
+
import { dict as appZht } from "../../../../app/src/i18n/zht"
|
|
23
|
+
import { dict as appKo } from "../../../../app/src/i18n/ko"
|
|
24
|
+
import { dict as appDe } from "../../../../app/src/i18n/de"
|
|
25
|
+
import { dict as appEs } from "../../../../app/src/i18n/es"
|
|
26
|
+
import { dict as appFr } from "../../../../app/src/i18n/fr"
|
|
27
|
+
import { dict as appDa } from "../../../../app/src/i18n/da"
|
|
28
|
+
import { dict as appJa } from "../../../../app/src/i18n/ja"
|
|
29
|
+
import { dict as appPl } from "../../../../app/src/i18n/pl"
|
|
30
|
+
import { dict as appRu } from "../../../../app/src/i18n/ru"
|
|
31
|
+
import { dict as appUk } from "../../../../app/src/i18n/uk"
|
|
32
|
+
import { dict as appAr } from "../../../../app/src/i18n/ar"
|
|
33
|
+
import { dict as appNo } from "../../../../app/src/i18n/no"
|
|
34
|
+
import { dict as appBr } from "../../../../app/src/i18n/br"
|
|
35
|
+
import { dict as appBs } from "../../../../app/src/i18n/bs"
|
|
36
|
+
|
|
37
|
+
export type Locale =
|
|
38
|
+
| "en"
|
|
39
|
+
| "zh"
|
|
40
|
+
| "zht"
|
|
41
|
+
| "ko"
|
|
42
|
+
| "de"
|
|
43
|
+
| "es"
|
|
44
|
+
| "fr"
|
|
45
|
+
| "da"
|
|
46
|
+
| "ja"
|
|
47
|
+
| "pl"
|
|
48
|
+
| "ru"
|
|
49
|
+
| "uk"
|
|
50
|
+
| "ar"
|
|
51
|
+
| "no"
|
|
52
|
+
| "br"
|
|
53
|
+
| "bs"
|
|
54
|
+
|
|
55
|
+
type RawDictionary = typeof appEn & typeof desktopEn
|
|
56
|
+
type Dictionary = i18n.Flatten<RawDictionary>
|
|
57
|
+
|
|
58
|
+
const LOCALES: readonly Locale[] = [
|
|
59
|
+
"en",
|
|
60
|
+
"zh",
|
|
61
|
+
"zht",
|
|
62
|
+
"ko",
|
|
63
|
+
"de",
|
|
64
|
+
"es",
|
|
65
|
+
"fr",
|
|
66
|
+
"da",
|
|
67
|
+
"ja",
|
|
68
|
+
"pl",
|
|
69
|
+
"ru",
|
|
70
|
+
"uk",
|
|
71
|
+
"bs",
|
|
72
|
+
"ar",
|
|
73
|
+
"no",
|
|
74
|
+
"br",
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
function detectLocale(): Locale {
|
|
78
|
+
if (typeof navigator !== "object") return "en"
|
|
79
|
+
|
|
80
|
+
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
|
|
81
|
+
for (const language of languages) {
|
|
82
|
+
if (!language) continue
|
|
83
|
+
if (language.toLowerCase().startsWith("en")) return "en"
|
|
84
|
+
if (language.toLowerCase().startsWith("zh")) {
|
|
85
|
+
if (language.toLowerCase().includes("hant")) return "zht"
|
|
86
|
+
return "zh"
|
|
87
|
+
}
|
|
88
|
+
if (language.toLowerCase().startsWith("ko")) return "ko"
|
|
89
|
+
if (language.toLowerCase().startsWith("de")) return "de"
|
|
90
|
+
if (language.toLowerCase().startsWith("es")) return "es"
|
|
91
|
+
if (language.toLowerCase().startsWith("fr")) return "fr"
|
|
92
|
+
if (language.toLowerCase().startsWith("da")) return "da"
|
|
93
|
+
if (language.toLowerCase().startsWith("ja")) return "ja"
|
|
94
|
+
if (language.toLowerCase().startsWith("pl")) return "pl"
|
|
95
|
+
if (language.toLowerCase().startsWith("ru")) return "ru"
|
|
96
|
+
if (language.toLowerCase().startsWith("uk")) return "uk"
|
|
97
|
+
if (language.toLowerCase().startsWith("ar")) return "ar"
|
|
98
|
+
if (
|
|
99
|
+
language.toLowerCase().startsWith("no") ||
|
|
100
|
+
language.toLowerCase().startsWith("nb") ||
|
|
101
|
+
language.toLowerCase().startsWith("nn")
|
|
102
|
+
)
|
|
103
|
+
return "no"
|
|
104
|
+
if (language.toLowerCase().startsWith("pt")) return "br"
|
|
105
|
+
if (language.toLowerCase().startsWith("bs")) return "bs"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return "en"
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function parseLocale(value: unknown): Locale | null {
|
|
112
|
+
if (!value) return null
|
|
113
|
+
if (typeof value !== "string") return null
|
|
114
|
+
if ((LOCALES as readonly string[]).includes(value)) return value as Locale
|
|
115
|
+
return null
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function parseRecord(value: unknown) {
|
|
119
|
+
if (!value || typeof value !== "object") return null
|
|
120
|
+
if (Array.isArray(value)) return null
|
|
121
|
+
return value as Record<string, unknown>
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function parseStored(value: unknown) {
|
|
125
|
+
if (typeof value !== "string") return value
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(value) as unknown
|
|
128
|
+
} catch {
|
|
129
|
+
return value
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function pickLocale(value: unknown): Locale | null {
|
|
134
|
+
const direct = parseLocale(value)
|
|
135
|
+
if (direct) return direct
|
|
136
|
+
|
|
137
|
+
const record = parseRecord(value)
|
|
138
|
+
if (!record) return null
|
|
139
|
+
|
|
140
|
+
return parseLocale(record.locale)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const base = i18n.flatten({ ...appEn, ...desktopEn })
|
|
144
|
+
|
|
145
|
+
function build(locale: Locale): Dictionary {
|
|
146
|
+
if (locale === "en") return base
|
|
147
|
+
if (locale === "zh") return { ...base, ...i18n.flatten(appZh), ...i18n.flatten(desktopZh) }
|
|
148
|
+
if (locale === "zht") return { ...base, ...i18n.flatten(appZht), ...i18n.flatten(desktopZht) }
|
|
149
|
+
if (locale === "de") return { ...base, ...i18n.flatten(appDe), ...i18n.flatten(desktopDe) }
|
|
150
|
+
if (locale === "es") return { ...base, ...i18n.flatten(appEs), ...i18n.flatten(desktopEs) }
|
|
151
|
+
if (locale === "fr") return { ...base, ...i18n.flatten(appFr), ...i18n.flatten(desktopFr) }
|
|
152
|
+
if (locale === "da") return { ...base, ...i18n.flatten(appDa), ...i18n.flatten(desktopDa) }
|
|
153
|
+
if (locale === "ja") return { ...base, ...i18n.flatten(appJa), ...i18n.flatten(desktopJa) }
|
|
154
|
+
if (locale === "pl") return { ...base, ...i18n.flatten(appPl), ...i18n.flatten(desktopPl) }
|
|
155
|
+
if (locale === "ru") return { ...base, ...i18n.flatten(appRu), ...i18n.flatten(desktopRu) }
|
|
156
|
+
if (locale === "uk") return { ...base, ...i18n.flatten(appUk), ...i18n.flatten(desktopUk) }
|
|
157
|
+
if (locale === "ar") return { ...base, ...i18n.flatten(appAr), ...i18n.flatten(desktopAr) }
|
|
158
|
+
if (locale === "no") return { ...base, ...i18n.flatten(appNo), ...i18n.flatten(desktopNo) }
|
|
159
|
+
if (locale === "br") return { ...base, ...i18n.flatten(appBr), ...i18n.flatten(desktopBr) }
|
|
160
|
+
if (locale === "bs") return { ...base, ...i18n.flatten(appBs), ...i18n.flatten(desktopBs) }
|
|
161
|
+
return { ...base, ...i18n.flatten(appKo), ...i18n.flatten(desktopKo) }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const state = {
|
|
165
|
+
locale: detectLocale(),
|
|
166
|
+
dict: base as Dictionary,
|
|
167
|
+
init: undefined as Promise<Locale> | undefined,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
state.dict = build(state.locale)
|
|
171
|
+
|
|
172
|
+
const translate = i18n.translator(() => state.dict, i18n.resolveTemplate)
|
|
173
|
+
|
|
174
|
+
export function t(key: keyof Dictionary, params?: Record<string, string | number>) {
|
|
175
|
+
return translate(key, params)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function initI18n(): Promise<Locale> {
|
|
179
|
+
const cached = state.init
|
|
180
|
+
if (cached) return cached
|
|
181
|
+
|
|
182
|
+
const promise = (async () => {
|
|
183
|
+
const raw = await window.api.storeGet("NeuroCode.global.dat", "language").catch(() => null)
|
|
184
|
+
const value = parseStored(raw)
|
|
185
|
+
const next = pickLocale(value) ?? state.locale
|
|
186
|
+
|
|
187
|
+
state.locale = next
|
|
188
|
+
state.dict = build(next)
|
|
189
|
+
return next
|
|
190
|
+
})().catch(() => state.locale)
|
|
191
|
+
|
|
192
|
+
state.init = promise
|
|
193
|
+
return promise
|
|
194
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "アップデートを確認...",
|
|
3
|
+
"desktop.menu.installCli": "CLI をインストール...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Webview を再読み込み",
|
|
5
|
+
"desktop.menu.restart": "再起動",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "フォルダーを選択",
|
|
8
|
+
"desktop.dialog.chooseFile": "ファイルを選択",
|
|
9
|
+
"desktop.dialog.saveFile": "ファイルを保存",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "アップデートの確認に失敗しました",
|
|
12
|
+
"desktop.updater.checkFailed.message": "アップデートを確認できませんでした",
|
|
13
|
+
"desktop.updater.none.title": "利用可能なアップデートはありません",
|
|
14
|
+
"desktop.updater.none.message": "すでに最新バージョンの NeuroCode を使用しています",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "アップデートに失敗しました",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "アップデートをダウンロードできませんでした",
|
|
17
|
+
"desktop.updater.downloaded.title": "アップデートをダウンロードしました",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"NeuroCode のバージョン {{version}} がダウンロードされました。インストールして再起動しますか?",
|
|
20
|
+
"desktop.updater.installFailed.title": "アップデートに失敗しました",
|
|
21
|
+
"desktop.updater.installFailed.message": "アップデートをインストールできませんでした",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI をインストールしました",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI を {{path}} にインストールしました\n\nターミナルを再起動して 'NeuroCode' コマンドを使用してください。",
|
|
26
|
+
"desktop.cli.failed.title": "インストールに失敗しました",
|
|
27
|
+
"desktop.cli.failed.message": "CLI のインストールに失敗しました: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "업데이트 확인...",
|
|
3
|
+
"desktop.menu.installCli": "CLI 설치...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Webview 새로고침",
|
|
5
|
+
"desktop.menu.restart": "다시 시작",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "폴더 선택",
|
|
8
|
+
"desktop.dialog.chooseFile": "파일 선택",
|
|
9
|
+
"desktop.dialog.saveFile": "파일 저장",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "업데이트 확인 실패",
|
|
12
|
+
"desktop.updater.checkFailed.message": "업데이트를 확인하지 못했습니다",
|
|
13
|
+
"desktop.updater.none.title": "사용 가능한 업데이트 없음",
|
|
14
|
+
"desktop.updater.none.message": "이미 최신 버전의 NeuroCode를 사용하고 있습니다",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "업데이트 실패",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "업데이트를 다운로드하지 못했습니다",
|
|
17
|
+
"desktop.updater.downloaded.title": "업데이트 다운로드 완료",
|
|
18
|
+
"desktop.updater.downloaded.prompt": "NeuroCode {{version}} 버전을 다운로드했습니다. 설치하고 다시 실행할까요?",
|
|
19
|
+
"desktop.updater.installFailed.title": "업데이트 실패",
|
|
20
|
+
"desktop.updater.installFailed.message": "업데이트를 설치하지 못했습니다",
|
|
21
|
+
|
|
22
|
+
"desktop.cli.installed.title": "CLI 설치됨",
|
|
23
|
+
"desktop.cli.installed.message":
|
|
24
|
+
"CLI가 {{path}}에 설치되었습니다\n\n터미널을 다시 시작하여 'NeuroCode' 명령을 사용하세요.",
|
|
25
|
+
"desktop.cli.failed.title": "설치 실패",
|
|
26
|
+
"desktop.cli.failed.message": "CLI 설치 실패: {{error}}",
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Se etter oppdateringer...",
|
|
3
|
+
"desktop.menu.installCli": "Installer CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Last inn Webview på nytt",
|
|
5
|
+
"desktop.menu.restart": "Start på nytt",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Velg en mappe",
|
|
8
|
+
"desktop.dialog.chooseFile": "Velg en fil",
|
|
9
|
+
"desktop.dialog.saveFile": "Lagre fil",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Oppdateringssjekk mislyktes",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Kunne ikke se etter oppdateringer",
|
|
13
|
+
"desktop.updater.none.title": "Ingen oppdatering tilgjengelig",
|
|
14
|
+
"desktop.updater.none.message": "Du bruker allerede den nyeste versjonen av NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Oppdatering mislyktes",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Kunne ikke laste ned oppdateringen",
|
|
17
|
+
"desktop.updater.downloaded.title": "Oppdatering lastet ned",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Versjon {{version}} av NeuroCode er lastet ned. Vil du installere den og starte på nytt?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Oppdatering mislyktes",
|
|
21
|
+
"desktop.updater.installFailed.message": "Kunne ikke installere oppdateringen",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI installert",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI installert til {{path}}\n\nStart terminalen på nytt for å bruke 'NeuroCode'-kommandoen.",
|
|
26
|
+
"desktop.cli.failed.title": "Installasjon mislyktes",
|
|
27
|
+
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Sprawdź aktualizacje...",
|
|
3
|
+
"desktop.menu.installCli": "Zainstaluj CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Przeładuj Webview",
|
|
5
|
+
"desktop.menu.restart": "Restartuj",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Wybierz folder",
|
|
8
|
+
"desktop.dialog.chooseFile": "Wybierz plik",
|
|
9
|
+
"desktop.dialog.saveFile": "Zapisz plik",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Nie udało się sprawdzić aktualizacji",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Nie udało się sprawdzić aktualizacji",
|
|
13
|
+
"desktop.updater.none.title": "Brak dostępnych aktualizacji",
|
|
14
|
+
"desktop.updater.none.message": "Korzystasz już z najnowszej wersji NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Aktualizacja nie powiodła się",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Nie udało się pobrać aktualizacji",
|
|
17
|
+
"desktop.updater.downloaded.title": "Aktualizacja pobrana",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Pobrano wersję {{version}} NeuroCode. Czy chcesz ją zainstalować i uruchomić ponownie?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Aktualizacja nie powiodła się",
|
|
21
|
+
"desktop.updater.installFailed.message": "Nie udało się zainstalować aktualizacji",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI zainstalowane",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI zainstalowane w {{path}}\n\nUruchom ponownie terminal, aby użyć polecenia 'NeuroCode'.",
|
|
26
|
+
"desktop.cli.failed.title": "Instalacja nie powiodła się",
|
|
27
|
+
"desktop.cli.failed.message": "Nie udało się zainstalować CLI: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Проверить обновления...",
|
|
3
|
+
"desktop.menu.installCli": "Установить CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Перезагрузить Webview",
|
|
5
|
+
"desktop.menu.restart": "Перезапустить",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Выберите папку",
|
|
8
|
+
"desktop.dialog.chooseFile": "Выберите файл",
|
|
9
|
+
"desktop.dialog.saveFile": "Сохранить файл",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Не удалось проверить обновления",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Не удалось проверить обновления",
|
|
13
|
+
"desktop.updater.none.title": "Обновлений нет",
|
|
14
|
+
"desktop.updater.none.message": "Вы уже используете последнюю версию NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Обновление не удалось",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Не удалось скачать обновление",
|
|
17
|
+
"desktop.updater.downloaded.title": "Обновление загружено",
|
|
18
|
+
"desktop.updater.downloaded.prompt": "Версия NeuroCode {{version}} загружена. Хотите установить и перезапустить?",
|
|
19
|
+
"desktop.updater.installFailed.title": "Обновление не удалось",
|
|
20
|
+
"desktop.updater.installFailed.message": "Не удалось установить обновление",
|
|
21
|
+
|
|
22
|
+
"desktop.cli.installed.title": "CLI установлен",
|
|
23
|
+
"desktop.cli.installed.message":
|
|
24
|
+
"CLI установлен в {{path}}\n\nПерезапустите терминал, чтобы использовать команду 'NeuroCode'.",
|
|
25
|
+
"desktop.cli.failed.title": "Ошибка установки",
|
|
26
|
+
"desktop.cli.failed.message": "Не удалось установить CLI: {{error}}",
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Перевірити оновлення...",
|
|
3
|
+
"desktop.menu.installCli": "Встановити CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Перезавантажити Webview",
|
|
5
|
+
"desktop.menu.restart": "Перезапустити",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Виберіть теку",
|
|
8
|
+
"desktop.dialog.chooseFile": "Виберіть файл",
|
|
9
|
+
"desktop.dialog.saveFile": "Зберегти файл",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Не вдалося перевірити оновлення",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Не вдалося перевірити наявність оновлень",
|
|
13
|
+
"desktop.updater.none.title": "Немає доступних оновлень",
|
|
14
|
+
"desktop.updater.none.message": "Ви вже використовуєте найновішу версію NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Помилка оновлення",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Не вдалося завантажити оновлення",
|
|
17
|
+
"desktop.updater.downloaded.title": "Оновлення завантажено",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Версію {{version}} NeuroCode завантажено. Бажаєте встановити її та перезапустити?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Помилка оновлення",
|
|
21
|
+
"desktop.updater.installFailed.message": "Не вдалося встановити оновлення",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI встановлено",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI встановлено до {{path}}\n\nПерезапустіть термінал, щоб використовувати команду 'NeuroCode'.",
|
|
26
|
+
"desktop.cli.failed.title": "Не вдалося встановити",
|
|
27
|
+
"desktop.cli.failed.message": "Не вдалося встановити CLI: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "检查更新...",
|
|
3
|
+
"desktop.menu.installCli": "安装 CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "重新加载 Webview",
|
|
5
|
+
"desktop.menu.restart": "重启",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "选择文件夹",
|
|
8
|
+
"desktop.dialog.chooseFile": "选择文件",
|
|
9
|
+
"desktop.dialog.saveFile": "保存文件",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "检查更新失败",
|
|
12
|
+
"desktop.updater.checkFailed.message": "无法检查更新",
|
|
13
|
+
"desktop.updater.none.title": "没有可用更新",
|
|
14
|
+
"desktop.updater.none.message": "你已经在使用最新版本的 NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "更新失败",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "无法下载更新",
|
|
17
|
+
"desktop.updater.downloaded.title": "更新已下载",
|
|
18
|
+
"desktop.updater.downloaded.prompt": "已下载 NeuroCode {{version}} 版本,是否安装并重启?",
|
|
19
|
+
"desktop.updater.installFailed.title": "更新失败",
|
|
20
|
+
"desktop.updater.installFailed.message": "无法安装更新",
|
|
21
|
+
|
|
22
|
+
"desktop.cli.installed.title": "CLI 已安装",
|
|
23
|
+
"desktop.cli.installed.message": "CLI 已安装到 {{path}}\n\n重启终端以使用 'NeuroCode' 命令。",
|
|
24
|
+
"desktop.cli.failed.title": "安装失败",
|
|
25
|
+
"desktop.cli.failed.message": "无法安装 CLI: {{error}}",
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "檢查更新...",
|
|
3
|
+
"desktop.menu.installCli": "安裝 CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "重新載入 Webview",
|
|
5
|
+
"desktop.menu.restart": "重新啟動",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "選擇資料夾",
|
|
8
|
+
"desktop.dialog.chooseFile": "選擇檔案",
|
|
9
|
+
"desktop.dialog.saveFile": "儲存檔案",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "檢查更新失敗",
|
|
12
|
+
"desktop.updater.checkFailed.message": "無法檢查更新",
|
|
13
|
+
"desktop.updater.none.title": "沒有可用更新",
|
|
14
|
+
"desktop.updater.none.message": "你已在使用最新版的 NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "更新失敗",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "無法下載更新",
|
|
17
|
+
"desktop.updater.downloaded.title": "更新已下載",
|
|
18
|
+
"desktop.updater.downloaded.prompt": "已下載 NeuroCode {{version}} 版本,是否安裝並重新啟動?",
|
|
19
|
+
"desktop.updater.installFailed.title": "更新失敗",
|
|
20
|
+
"desktop.updater.installFailed.message": "無法安裝更新",
|
|
21
|
+
|
|
22
|
+
"desktop.cli.installed.title": "CLI 已安裝",
|
|
23
|
+
"desktop.cli.installed.message": "CLI 已安裝到 {{path}}\n\n重新啟動終端機以使用 'NeuroCode' 命令。",
|
|
24
|
+
"desktop.cli.failed.title": "安裝失敗",
|
|
25
|
+
"desktop.cli.failed.message": "無法安裝 CLI: {{error}}",
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" style="background-color: var(--background-base)">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>OpenCode</title>
|
|
7
|
+
<link rel="icon" type="image/png" href="./favicon-96x96-v3.png" sizes="96x96" />
|
|
8
|
+
<link rel="icon" type="image/svg+xml" href="./favicon-v3.svg" />
|
|
9
|
+
<link rel="shortcut icon" href="./favicon-v3.ico" />
|
|
10
|
+
<link rel="apple-touch-icon" sizes="180x180" href="./apple-touch-icon-v3.png" />
|
|
11
|
+
<meta name="theme-color" content="#F8F7F7" />
|
|
12
|
+
<meta property="og:image" content="./social-share.png" />
|
|
13
|
+
<meta property="twitter:image" content="./social-share.png" />
|
|
14
|
+
<script id="oc-theme-preload-script" src="./oc-theme-preload.js"></script>
|
|
15
|
+
</head>
|
|
16
|
+
<body class="antialiased overscroll-none text-12-regular overflow-hidden">
|
|
17
|
+
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
18
|
+
<div id="root" class="flex flex-col h-dvh"></div>
|
|
19
|
+
<script src="./index.tsx" type="module"></script>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|