From d7ca7c453d821ad099bf79b463969419041279cb Mon Sep 17 00:00:00 2001 From: wj-xiao Date: Fri, 10 Jan 2025 10:31:38 +0800 Subject: [PATCH] update version to 2.1.4 - changing password will modify both the web user and the system root user - refactor menu bar - add oled automatic sleep - support setting GOMEMLIMIT, and automatically enabled when tailscale is logged in - some other bug fixes and optimizations --- server/common/cgo.go | 12 +- server/dl_lib/libkvm.so | Bin 1571129 -> 1571153 bytes server/go.mod | 8 +- server/go.sum | 9 + server/include/kvm_vision.h | 3 + server/main.go | 4 + server/proto/application.go | 4 - server/proto/auth.go | 4 + server/proto/network.go | 28 +- server/proto/vm.go | 19 + server/router/auth.go | 4 +- server/router/network.go | 17 +- server/router/vm.go | 6 + server/service/auth/login.go | 17 +- server/service/auth/password.go | 90 +- server/service/auth/wifi.go | 46 - server/service/hid/reset.go | 3 + server/service/network/service.go | 34 + server/service/network/tailscale.go | 322 ----- server/service/network/tailscale/account.go | 68 + server/service/network/tailscale/cli.go | 120 ++ server/service/network/tailscale/install.go | 97 ++ server/service/network/tailscale/status.go | 88 ++ server/service/network/wifi.go | 34 + server/service/network/wol.go | 72 +- server/service/stream/h264/h264.go | 5 +- server/service/vm/memory.go | 58 + server/service/vm/oled.go | 72 + server/service/vm/script.go | 3 +- server/service/vm/terminal.go | 19 +- server/{service/auth => utils}/account.go | 30 +- server/utils/memory.go | 77 ++ web/.env.development | 2 +- web/package.json | 56 +- web/pnpm-lock.yaml | 1154 ++++++++--------- web/src/api/auth.ts | 12 +- web/src/api/network.ts | 25 +- web/src/api/vm.ts | 24 + web/src/assets/images/tailscale.svg | 11 + web/src/components/icons/tailscale.tsx | 5 + web/src/i18n/locales/cz.ts | 193 ++- web/src/i18n/locales/da.ts | 193 ++- web/src/i18n/locales/de.ts | 199 +-- web/src/i18n/locales/en.ts | 195 ++- web/src/i18n/locales/es.ts | 196 ++- web/src/i18n/locales/fr.ts | 193 ++- web/src/i18n/locales/hu.ts | 194 ++- web/src/i18n/locales/id.ts | 192 ++- web/src/i18n/locales/it.ts | 193 ++- web/src/i18n/locales/ja.ts | 193 ++- web/src/i18n/locales/ko.ts | 191 ++- web/src/i18n/locales/nb.ts | 349 ++--- web/src/i18n/locales/nl.ts | 192 ++- web/src/i18n/locales/pl.ts | 185 ++- web/src/i18n/locales/ru.ts | 195 +-- web/src/i18n/locales/uk.ts | 193 ++- web/src/i18n/locales/vi.ts | 193 ++- web/src/i18n/locales/zh.ts | 192 ++- web/src/i18n/locales/zh_tw.ts | 199 +-- web/src/jotai/settings.ts | 4 +- web/src/lib/localstorage.ts | 17 +- web/src/pages/auth/login/tips.tsx | 39 +- web/src/pages/auth/password/index.tsx | 15 +- web/src/pages/desktop/index.tsx | 7 +- web/src/pages/desktop/keyboard/mappings.ts | 4 +- .../desktop/keyboard/virtual-keyboard.tsx | 8 +- .../pages/desktop/keyboard/virtual-keys.ts | 4 +- .../pages/desktop/menu-phone/image/images.tsx | 147 --- .../pages/desktop/menu-phone/image/index.tsx | 56 - .../pages/desktop/menu-phone/image/tips.tsx | 81 -- web/src/pages/desktop/menu-phone/index.tsx | 51 - web/src/pages/desktop/menu-phone/keyboard.tsx | 19 - web/src/pages/desktop/menu-phone/mouse.tsx | 153 --- web/src/pages/desktop/menu-phone/power.tsx | 112 -- .../desktop/menu-phone/screen/constants.ts | 13 - .../pages/desktop/menu-phone/screen/fps.tsx | 113 -- .../menu-phone/screen/frame-detect.tsx | 53 - .../pages/desktop/menu-phone/screen/index.tsx | 75 -- .../desktop/menu-phone/screen/quality.tsx | 65 - .../desktop/menu-phone/screen/resolution.tsx | 76 -- .../desktop/menu-phone/screen/video-mode.tsx | 55 - .../pages/desktop/menu-phone/script/index.tsx | 205 --- .../pages/desktop/menu-phone/script/run.tsx | 63 - .../desktop/menu-phone/settings/about.tsx | 121 -- .../desktop/menu-phone/settings/index.tsx | 67 - .../desktop/menu-phone/settings/language.tsx | 44 - .../desktop/menu-phone/settings/logout.tsx | 23 - .../desktop/menu-phone/settings/password.tsx | 20 - .../menu-phone/settings/tailscale/device.tsx | 121 -- .../menu-phone/settings/tailscale/index.tsx | 93 -- .../menu-phone/settings/tailscale/install.tsx | 82 -- .../menu-phone/settings/tailscale/login.tsx | 80 -- .../desktop/menu-phone/settings/update.tsx | 174 --- .../menu-phone/settings/virtual-devices.tsx | 65 - .../desktop/menu-phone/settings/wifi.tsx | 14 - web/src/pages/desktop/menu-phone/storage.tsx | 164 --- .../desktop/menu-phone/terminal/index.tsx | 39 - .../desktop/menu-phone/terminal/nanokvm.tsx | 25 - .../menu-phone/terminal/serial-port.tsx | 114 -- .../{fullscreen.tsx => fullscreen/index.tsx} | 6 +- web/src/pages/desktop/menu/image/images.tsx | 42 +- web/src/pages/desktop/menu/image/index.tsx | 9 +- web/src/pages/desktop/menu/index.tsx | 53 +- web/src/pages/desktop/menu/keyboard/index.tsx | 3 +- web/src/pages/desktop/menu/keyboard/paste.tsx | 2 +- .../menu/keyboard/virtual-keyboard.tsx | 2 +- .../menu/{mouse.tsx => mouse/index.tsx} | 16 +- .../menu/{power.tsx => power/index.tsx} | 17 +- web/src/pages/desktop/menu/screen/fps.tsx | 15 +- web/src/pages/desktop/menu/screen/index.tsx | 5 +- web/src/pages/desktop/menu/screen/quality.tsx | 6 +- .../pages/desktop/menu/screen/resolution.tsx | 6 +- .../pages/desktop/menu/screen/video-mode.tsx | 6 +- web/src/pages/desktop/menu/script/index.tsx | 14 +- web/src/pages/desktop/menu/settings/about.tsx | 121 -- .../desktop/menu/settings/about/community.tsx | 51 + .../desktop/menu/settings/about/index.tsx | 21 + .../menu/settings/about/information.tsx | 84 ++ .../desktop/menu/settings/account/index.tsx | 63 + .../menu/settings/appearance/index.tsx | 21 + .../menu/settings/appearance/language.tsx | 42 + .../menu/settings/appearance/menu-bar.tsx | 56 + .../desktop/menu/settings/device/index.tsx | 27 + .../desktop/menu/settings/device/memory.tsx | 77 ++ .../desktop/menu/settings/device/oled.tsx | 77 ++ .../settings/{ => device}/virtual-devices.tsx | 33 +- .../desktop/menu/settings/device/wifi.tsx | 45 + web/src/pages/desktop/menu/settings/index.tsx | 177 ++- .../pages/desktop/menu/settings/language.tsx | 44 - .../pages/desktop/menu/settings/logout.tsx | 23 - .../pages/desktop/menu/settings/password.tsx | 20 - .../menu/settings/tailscale/device.tsx | 101 +- .../desktop/menu/settings/tailscale/index.tsx | 95 +- .../menu/settings/tailscale/install.tsx | 103 +- .../desktop/menu/settings/tailscale/login.tsx | 38 +- .../pages/desktop/menu/settings/update.tsx | 174 --- .../desktop/menu/settings/update/index.tsx | 119 ++ web/src/pages/desktop/menu/settings/wifi.tsx | 14 - web/src/pages/desktop/menu/terminal/index.tsx | 3 +- .../pages/desktop/menu/terminal/nanokvm.tsx | 2 +- .../desktop/menu/terminal/serial-port.tsx | 2 +- web/src/pages/desktop/menu/wol.tsx | 159 --- .../wol.tsx => menu/wol/index.tsx} | 14 +- web/src/pages/desktop/mouse/relative.tsx | 1 + web/src/pages/desktop/notification.tsx | 9 +- web/src/pages/desktop/screen/h264.tsx | 21 +- web/src/pages/desktop/screen/mjpeg.tsx | 2 +- web/src/pages/terminal/index.tsx | 3 +- web/src/pages/terminal/login.tsx | 3 +- web/src/pages/{auth => }/wifi/index.tsx | 31 +- web/src/router.tsx | 2 +- 151 files changed, 5207 insertions(+), 6046 deletions(-) delete mode 100644 server/service/auth/wifi.go delete mode 100644 server/service/network/tailscale.go create mode 100644 server/service/network/tailscale/account.go create mode 100644 server/service/network/tailscale/cli.go create mode 100644 server/service/network/tailscale/install.go create mode 100644 server/service/network/tailscale/status.go create mode 100644 server/service/vm/memory.go create mode 100644 server/service/vm/oled.go rename server/{service/auth => utils}/account.go (72%) create mode 100644 server/utils/memory.go create mode 100644 web/src/assets/images/tailscale.svg create mode 100644 web/src/components/icons/tailscale.tsx delete mode 100644 web/src/pages/desktop/menu-phone/image/images.tsx delete mode 100644 web/src/pages/desktop/menu-phone/image/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/image/tips.tsx delete mode 100644 web/src/pages/desktop/menu-phone/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/keyboard.tsx delete mode 100644 web/src/pages/desktop/menu-phone/mouse.tsx delete mode 100644 web/src/pages/desktop/menu-phone/power.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/constants.ts delete mode 100644 web/src/pages/desktop/menu-phone/screen/fps.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/frame-detect.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/quality.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/resolution.tsx delete mode 100644 web/src/pages/desktop/menu-phone/screen/video-mode.tsx delete mode 100644 web/src/pages/desktop/menu-phone/script/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/script/run.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/about.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/language.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/logout.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/password.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/tailscale/device.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/tailscale/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/tailscale/install.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/tailscale/login.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/update.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/virtual-devices.tsx delete mode 100644 web/src/pages/desktop/menu-phone/settings/wifi.tsx delete mode 100644 web/src/pages/desktop/menu-phone/storage.tsx delete mode 100644 web/src/pages/desktop/menu-phone/terminal/index.tsx delete mode 100644 web/src/pages/desktop/menu-phone/terminal/nanokvm.tsx delete mode 100644 web/src/pages/desktop/menu-phone/terminal/serial-port.tsx rename web/src/pages/desktop/menu/{fullscreen.tsx => fullscreen/index.tsx} (76%) rename web/src/pages/desktop/menu/{mouse.tsx => mouse/index.tsx} (86%) rename web/src/pages/desktop/menu/{power.tsx => power/index.tsx} (78%) delete mode 100644 web/src/pages/desktop/menu/settings/about.tsx create mode 100644 web/src/pages/desktop/menu/settings/about/community.tsx create mode 100644 web/src/pages/desktop/menu/settings/about/index.tsx create mode 100644 web/src/pages/desktop/menu/settings/about/information.tsx create mode 100644 web/src/pages/desktop/menu/settings/account/index.tsx create mode 100644 web/src/pages/desktop/menu/settings/appearance/index.tsx create mode 100644 web/src/pages/desktop/menu/settings/appearance/language.tsx create mode 100644 web/src/pages/desktop/menu/settings/appearance/menu-bar.tsx create mode 100644 web/src/pages/desktop/menu/settings/device/index.tsx create mode 100644 web/src/pages/desktop/menu/settings/device/memory.tsx create mode 100644 web/src/pages/desktop/menu/settings/device/oled.tsx rename web/src/pages/desktop/menu/settings/{ => device}/virtual-devices.tsx (57%) create mode 100644 web/src/pages/desktop/menu/settings/device/wifi.tsx delete mode 100644 web/src/pages/desktop/menu/settings/language.tsx delete mode 100644 web/src/pages/desktop/menu/settings/logout.tsx delete mode 100644 web/src/pages/desktop/menu/settings/password.tsx delete mode 100644 web/src/pages/desktop/menu/settings/update.tsx create mode 100644 web/src/pages/desktop/menu/settings/update/index.tsx delete mode 100644 web/src/pages/desktop/menu/settings/wifi.tsx delete mode 100644 web/src/pages/desktop/menu/wol.tsx rename web/src/pages/desktop/{menu-phone/wol.tsx => menu/wol/index.tsx} (88%) rename web/src/pages/{auth => }/wifi/index.tsx (78%) diff --git a/server/common/cgo.go b/server/common/cgo.go index 4e0a6a1..efffd69 100644 --- a/server/common/cgo.go +++ b/server/common/cgo.go @@ -112,15 +112,15 @@ func (k *KvmVision) ReadH264SPS() ([]byte, int) { dataSize C.uint32_t ) - result := C.kvmv_get_sps_frame(&kvmData, &dataSize) + result := int(C.kvmv_get_sps_frame(&kvmData, &dataSize)) if result < 0 { log.Errorf("failed to read sps: %v", result) - return nil, int(result) + return nil, result } data := C.GoBytes(unsafe.Pointer(kvmData), C.int(dataSize)) - return data, int(result) + return data, result } func (k *KvmVision) ReadH264PPS() ([]byte, int) { @@ -129,14 +129,14 @@ func (k *KvmVision) ReadH264PPS() ([]byte, int) { dataSize C.uint32_t ) - result := C.kvmv_get_pps_frame(&kvmData, &dataSize) + result := int(C.kvmv_get_pps_frame(&kvmData, &dataSize)) if result < 0 { log.Errorf("failed to read pps: %v", result) - return nil, int(result) + return nil, result } data := C.GoBytes(unsafe.Pointer(kvmData), C.int(dataSize)) - return data, int(result) + return data, result } func (k *KvmVision) Close() { diff --git a/server/dl_lib/libkvm.so b/server/dl_lib/libkvm.so index 47b7611c9b119cbd67bd8c866079fe6eb5de3a00..68045f9db4f1ff7591da10afa4e702db0133a278 100644 GIT binary patch delta 330903 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

EC}qjxRjrc*|cn&T`#Fm||QZ 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 MLl-Ce5Hn&zKNC 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 diff --git a/server/go.mod b/server/go.mod index cc3a566..7637c82 100644 --- a/server/go.mod +++ b/server/go.mod @@ -14,7 +14,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/viper v1.19.0 github.com/unrolled/secure v1.15.0 - golang.org/x/crypto v0.28.0 + golang.org/x/crypto v0.31.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -70,9 +70,9 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/server/go.sum b/server/go.sum index a34a695..9f44074 100644 --- a/server/go.sum +++ b/server/go.sum @@ -158,19 +158,28 @@ golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/server/include/kvm_vision.h b/server/include/kvm_vision.h index b8b97e0..2fa2a25 100644 --- a/server/include/kvm_vision.h +++ b/server/include/kvm_vision.h @@ -1,3 +1,5 @@ + + #ifndef KVM_VISION_H_ #define KVM_VISION_H_ @@ -51,6 +53,7 @@ int free_kvmv_data(uint8_t ** _pp_kvm_data); void free_all_kvmv_data(); void set_h264_gop(uint8_t _gop); void kvmv_deinit(); +uint8_t kvmv_hdmi_control(uint8_t _en); #ifdef __cplusplus } diff --git a/server/main.go b/server/main.go index 97d87df..4dbdee7 100644 --- a/server/main.go +++ b/server/main.go @@ -6,6 +6,7 @@ import ( "NanoKVM-Server/logger" "NanoKVM-Server/middleware" "NanoKVM-Server/router" + "NanoKVM-Server/utils" "fmt" "os" "os/signal" @@ -32,8 +33,11 @@ func main() { func initialize() { logger.Init() + _ = common.GetScreen() _ = common.GetKvmVision() + + utils.InitGoMemLimit() } func run(r *gin.Engine) { diff --git a/server/proto/application.go b/server/proto/application.go index f2fa841..7161e4e 100644 --- a/server/proto/application.go +++ b/server/proto/application.go @@ -4,7 +4,3 @@ type GetVersionRsp struct { Current string `json:"current"` Latest string `json:"latest"` } - -type GetLibRsp struct { - Exist bool `json:"exist"` -} diff --git a/server/proto/auth.go b/server/proto/auth.go index 61ec69f..6c4f28c 100644 --- a/server/proto/auth.go +++ b/server/proto/auth.go @@ -9,6 +9,10 @@ type LoginRsp struct { Token string `json:"token"` } +type GetAccountRsp struct { + Username string `json:"username"` +} + type ChangePasswordReq struct { Username string `json:"username" validate:"required"` Password string `json:"password" validate:"required"` diff --git a/server/proto/network.go b/server/proto/network.go index a8b3eb2..336346f 100644 --- a/server/proto/network.go +++ b/server/proto/network.go @@ -12,24 +12,24 @@ type DeleteMacReq struct { Mac string `form:"mac" validate:"required"` } +type TailscaleState string + +const ( + TailscaleNotInstall TailscaleState = "notInstall" + TailscaleNotLogin TailscaleState = "notLogin" + TailscaleStopped TailscaleState = "stopped" + TailscaleRunning TailscaleState = "running" +) + type GetTailscaleStatusRsp struct { - Status string `json:"status"` // notInstall | notLogin | stopped | running - Name string `json:"name"` - IP string `json:"ip"` - Account string `json:"account"` -} - -type UpdateTailscaleStatusReq struct { - Command string // up | down -} - -type UpdateTailscaleStatusRsp struct { - Status string `json:"status"` // stopped | running + State TailscaleState `json:"state"` + Name string `json:"name"` + IP string `json:"ip"` + Account string `json:"account"` } type LoginTailscaleRsp struct { - Status string `json:"status"` - Url string `json:"url"` + Url string `json:"url"` } type GetWifiRsp struct { diff --git a/server/proto/vm.go b/server/proto/vm.go index 14b76eb..72d0d87 100644 --- a/server/proto/vm.go +++ b/server/proto/vm.go @@ -56,3 +56,22 @@ type UpdateVirtualDeviceReq struct { type UpdateVirtualDeviceRsp struct { On bool `json:"on"` } + +type SetMemoryLimitReq struct { + Enabled bool `json:"enabled"` + Limit int64 `json:"limit"` +} + +type GetMemoryLimitRsp struct { + Enabled bool `json:"enabled"` + Limit int64 `json:"limit"` +} + +type SetOledReq struct { + Sleep int `json:"sleep"` +} + +type GetOLEDRsp struct { + Exist bool `json:"exist"` + Sleep int `json:"sleep"` +} diff --git a/server/router/auth.go b/server/router/auth.go index e19044e..5115a92 100644 --- a/server/router/auth.go +++ b/server/router/auth.go @@ -10,11 +10,11 @@ import ( func authRouter(r *gin.Engine) { service := auth.NewService() - r.POST("/api/auth/login", service.Login) // login - r.POST("/api/auth/wifi", service.ConnectWifi) // connect Wi-Fi + r.POST("/api/auth/login", service.Login) // login api := r.Group("/api").Use(middleware.CheckToken()) api.GET("/auth/password", service.IsPasswordUpdated) // is password updated + api.GET("/auth/account", service.GetAccount) // get account api.POST("/auth/password", service.ChangePassword) // change password } diff --git a/server/router/network.go b/server/router/network.go index 8807c1f..667ad5e 100644 --- a/server/router/network.go +++ b/server/router/network.go @@ -9,17 +9,22 @@ import ( func networkRouter(r *gin.Engine) { service := network.NewService() + + r.POST("/api/network/wifi", service.ConnectWifi) // connect Wi-Fi + api := r.Group("/api").Use(middleware.CheckToken()) api.POST("/network/wol", service.WakeOnLAN) // wake on lan api.GET("/network/wol/mac", service.GetMac) // get mac list api.DELETE("/network/wol/mac", service.DeleteMac) // delete mac - api.POST("/network/tailscale/install", service.InstallTailscale) // install tailscale - api.GET("/network/tailscale/status", service.GetTailscaleStatus) // get tailscale status - api.POST("/network/tailscale/status", service.UpdateTailscaleStatus) // update tailscale status - api.POST("/network/tailscale/login", service.LoginTailscale) // tailscale login - api.POST("/network/tailscale/logout", service.LogoutTailscale) // tailscale logout + api.POST("/network/tailscale/install", service.TsInstall) // install tailscale + api.POST("/network/tailscale/uninstall", service.TsUninstall) // uninstall tailscale + api.GET("/network/tailscale/status", service.GetTsStatus) // get tailscale status + api.POST("/network/tailscale/up", service.TsUp) // run tailscale up + api.POST("/network/tailscale/down", service.TsDown) // run tailscale down + api.POST("/network/tailscale/login", service.TsLogin) // tailscale login + api.POST("/network/tailscale/logout", service.TsLogout) // tailscale logout - api.GET("/network/wifi", service.GetWifi) // get wifi information + api.GET("/network/wifi", service.GetWifi) // get Wi-Fi information } diff --git a/server/router/vm.go b/server/router/vm.go index 7efc101..38adda4 100644 --- a/server/router/vm.go +++ b/server/router/vm.go @@ -26,4 +26,10 @@ func vmRouter(r *gin.Engine) { api.GET("/vm/device/virtual", service.GetVirtualDevice) // get virtual device api.POST("/vm/device/virtual", service.UpdateVirtualDevice) // update virtual device + + api.GET("/vm/memory/limit", service.GetMemoryLimit) // get memory limit + api.POST("/vm/memory/limit", service.SetMemoryLimit) // set memory limit + + api.GET("/vm/oled", service.GetOLED) // get OLED configuration + api.POST("/vm/oled", service.SetOLED) // set OLED configuration } diff --git a/server/service/auth/login.go b/server/service/auth/login.go index 29da0d5..7814359 100644 --- a/server/service/auth/login.go +++ b/server/service/auth/login.go @@ -41,7 +41,7 @@ func (s *Service) Login(c *gin.Context) { return } - account, err := getAccount() + account, err := utils.GetAccount() if err != nil { rsp.ErrRsp(c, -3, "get account failed") return @@ -65,6 +65,21 @@ func (s *Service) Login(c *gin.Context) { log.Debugf("login success, username: %s", req.Username) } +func (s *Service) GetAccount(c *gin.Context) { + var rsp proto.Response + + account, err := utils.GetAccount() + if err != nil { + rsp.ErrRsp(c, -1, "get account failed") + return + } + + rsp.OkRspWithData(c, &proto.GetAccountRsp{ + Username: account.Username, + }) + log.Debugf("get account successful") +} + func isLibExist() bool { libPath := fmt.Sprintf("/kvmapp/kvm_system/dl_lib/libmaixcam_lib.so") _, err := os.Stat(libPath) diff --git a/server/service/auth/password.go b/server/service/auth/password.go index a12179f..98ff20b 100644 --- a/server/service/auth/password.go +++ b/server/service/auth/password.go @@ -2,6 +2,11 @@ package auth import ( "NanoKVM-Server/proto" + "NanoKVM-Server/utils" + "io" + "os" + "os/exec" + "time" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" @@ -16,8 +21,23 @@ func (s *Service) ChangePassword(c *gin.Context) { return } - if err := setAccount(req.Username, req.Password); err != nil { - rsp.ErrRsp(c, -2, "change password failed") + err := utils.SetAccount(req.Username, req.Password) + if err != nil { + rsp.ErrRsp(c, -2, "failed to save password") + return + } + + account, err := utils.GetAccount() + if err != nil { + rsp.ErrRsp(c, -3, "failed to get password") + return + } + + // change root password + err = changeRootPassword(account.Password) + if err != nil { + _ = utils.DelAccount() + rsp.ErrRsp(c, -4, "failed to change password") return } @@ -28,18 +48,68 @@ func (s *Service) ChangePassword(c *gin.Context) { func (s *Service) IsPasswordUpdated(c *gin.Context) { var rsp proto.Response - account, err := getAccount() - if err != nil { - rsp.ErrRsp(c, -1, "failed to get password") - } + isUpdated := false - isUpdated := true - if account == nil || account.Password == "admin" { - isUpdated = false + if utils.IsAccountExist() { + account, err := utils.GetAccount() + if err != nil { + rsp.ErrRsp(c, -1, "failed to get password") + return + } + + if account != nil && account.Password != "admin" { + isUpdated = true + } } rsp.OkRspWithData(c, &proto.IsPasswordUpdatedRsp{ IsUpdated: isUpdated, }) - log.Debugf("get password success") + log.Debugf("is password updated: %t", isUpdated) +} + +func changeRootPassword(password string) error { + err := passwd(password) + if err != nil { + log.Errorf("failed to change root password: %s", err) + return err + } + + log.Debugf("change root password successful.") + return nil +} + +func passwd(password string) error { + cmd := exec.Command("passwd", "root") + + stdin, err := cmd.StdinPipe() + if err != nil { + return err + } + defer func() { + _ = stdin.Close() + }() + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err = cmd.Start(); err != nil { + return err + } + + if _, err = io.WriteString(stdin, password+"\n"); err != nil { + return err + } + + time.Sleep(100 * time.Millisecond) + + if _, err = io.WriteString(stdin, password+"\n"); err != nil { + return err + } + + if err = cmd.Wait(); err != nil { + return err + } + + return nil } diff --git a/server/service/auth/wifi.go b/server/service/auth/wifi.go deleted file mode 100644 index 3c80510..0000000 --- a/server/service/auth/wifi.go +++ /dev/null @@ -1,46 +0,0 @@ -package auth - -import ( - "NanoKVM-Server/proto" - "os" - - "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" -) - -const ( - WiFiSSID = "/etc/kvm/wifi.ssid" - WiFiPasswd = "/etc/kvm/wifi.pass" - WiFiConnect = "/kvmapp/kvm/wifi_try_connect" -) - -func (s *Service) ConnectWifi(c *gin.Context) { - var req proto.ConnectWifiReq - var rsp proto.Response - - if err := proto.ParseFormRequest(c, &req); err != nil { - rsp.ErrRsp(c, -1, "invalid parameters") - return - } - - if err := os.WriteFile(WiFiSSID, []byte(req.Ssid), 0o644); err != nil { - log.Errorf("failed to save wifi ssid: %s", err) - rsp.ErrRsp(c, -2, "failed to save wifi") - return - } - - if err := os.WriteFile(WiFiPasswd, []byte(req.Password), 0o644); err != nil { - log.Errorf("failed to save wifi password: %s", err) - rsp.ErrRsp(c, -3, "failed to save wifi") - return - } - - if err := os.WriteFile(WiFiConnect, nil, 0o644); err != nil { - log.Errorf("failed to connect wifi: %s", err) - rsp.ErrRsp(c, -4, "failed to connect wifi") - return - } - - rsp.OkRsp(c) - log.Debugf("set wifi successfully: %s", req.Ssid) -} diff --git a/server/service/hid/reset.go b/server/service/hid/reset.go index 703448f..b876442 100644 --- a/server/service/hid/reset.go +++ b/server/service/hid/reset.go @@ -3,6 +3,7 @@ package hid import ( "NanoKVM-Server/proto" "os" + "time" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" @@ -43,6 +44,8 @@ func (s *Service) Reset(c *gin.Context) { } _ = f.Close() + time.Sleep(1 * time.Second) + devices, err := os.ReadDir("/sys/class/udc/") if err != nil { log.Errorf("read udc directory failed: %s", err) diff --git a/server/service/network/service.go b/server/service/network/service.go index 6b02b6b..2676f43 100644 --- a/server/service/network/service.go +++ b/server/service/network/service.go @@ -1,7 +1,41 @@ package network +import ( + "NanoKVM-Server/service/network/tailscale" + + "github.com/gin-gonic/gin" +) + type Service struct{} func NewService() *Service { return &Service{} } + +func (s *Service) TsInstall(c *gin.Context) { + tailscale.Install(c) +} + +func (s *Service) TsUninstall(c *gin.Context) { + tailscale.Uninstall(c) +} + +func (s *Service) GetTsStatus(c *gin.Context) { + tailscale.GetStatus(c) +} + +func (s *Service) TsUp(c *gin.Context) { + tailscale.Up(c) +} + +func (s *Service) TsDown(c *gin.Context) { + tailscale.Down(c) +} + +func (s *Service) TsLogin(c *gin.Context) { + tailscale.Login(c) +} + +func (s *Service) TsLogout(c *gin.Context) { + tailscale.Logout(c) +} diff --git a/server/service/network/tailscale.go b/server/service/network/tailscale.go deleted file mode 100644 index deef33e..0000000 --- a/server/service/network/tailscale.go +++ /dev/null @@ -1,322 +0,0 @@ -package network - -import ( - "bufio" - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "os" - "os/exec" - "regexp" - "strings" - - "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" - - "NanoKVM-Server/proto" - "NanoKVM-Server/utils" -) - -const ( - tailscalePath = "/usr/bin/tailscale" - tailscaledPath = "/usr/sbin/tailscaled" - - backendStateRunning = "Running" - backendStateNeedsLogin = "NeedsLogin" - backendStateStopped = "Stopped" - - responseStateRunning = "running" - responseStateNeedsLogin = "notLogin" - responseStateStopped = "stopped" - responseStateNotInstalled = "notInstall" -) - -var backendToResponseStates = map[string]string{ - backendStateRunning: responseStateRunning, - backendStateNeedsLogin: responseStateNeedsLogin, - backendStateStopped: responseStateStopped, -} - -func stateToJson(state string) string { - if resp, ok := backendToResponseStates[state]; ok { - return resp - } - return "" -} - -type TailscaleStatus struct { - BackendState string `json:"BackendState"` - - Self struct { - HostName string `json:"HostName"` - TailscaleIPs []string `json:"TailscaleIPs"` - } `json:"Self"` - - CurrentTailnet struct { - Name string `json:"Name"` - } `json:"CurrentTailnet"` -} - -func (s *Service) InstallTailscale(c *gin.Context) { - var rsp proto.Response - - if exist := isTailscaleExist(); exist { - rsp.OkRsp(c) - return - } - - const ( - downloadUrl = "https://cdn.sipeed.com/nanokvm/resources/tailscale_riscv64.zip" - workspace = "/root/.tailscale" - ) - - var ( - zipFile = fmt.Sprintf("%s/tailscale_riscv64.zip", workspace) - tailscale = fmt.Sprintf("%s/tailscale_riscv64/tailscale", workspace) - tailscaled = fmt.Sprintf("%s/tailscale_riscv64/tailscaled", workspace) - ) - - // download - _ = os.MkdirAll(workspace, 0o755) - defer func() { - _ = os.RemoveAll(workspace) - }() - - req, err := http.NewRequest("GET", downloadUrl, nil) - if err != nil { - log.Errorf("failed to create new request: %s", err) - rsp.ErrRsp(c, -1, "request failed") - return - } - - err = utils.Download(req, zipFile) - if err != nil { - log.Errorf("download failed: %s", err) - rsp.ErrRsp(c, -2, "download failed") - return - } - - // install - err = utils.Unzip(zipFile, workspace) - if err != nil { - log.Errorf("unzip failed: %s", err) - rsp.ErrRsp(c, -3, "unzip failed") - return - } - - err = utils.MoveFile(tailscale, tailscalePath) - if err != nil { - log.Errorf("rename %s failed: %s", tailscale, err) - } - err = utils.MoveFile(tailscaled, tailscaledPath) - if err != nil { - log.Errorf("rename %s failed: %s", tailscaled, err) - } - - _ = runTailscale() - - rsp.OkRsp(c) - log.Debugf("install tailscaled success") -} - -func (s *Service) LoginTailscale(c *gin.Context) { - var rsp proto.Response - - status, err := getTailscaleStatus() - if err != nil { - _ = runTailscale() - status, err = getTailscaleStatus() - } - - if err != nil { - rsp.ErrRsp(c, -1, "tailscale unknown status") - return - } - - if status.BackendState == backendStateRunning { - rsp.OkRspWithData(c, &proto.LoginTailscaleRsp{ - Status: responseStateRunning, - }) - return - } - - cmd := exec.Command("sh", "-c", "tailscale login --timeout=10m") - stderr, err := cmd.StderrPipe() - if err != nil { - rsp.ErrRsp(c, -2, "tailscale login failed") - return - } - - defer func() { - _ = stderr.Close() - }() - - go func() { - _ = cmd.Run() - }() - - url := parseLoginUrl(stderr) - rsp.OkRspWithData(c, &proto.LoginTailscaleRsp{ - Status: responseStateNeedsLogin, - Url: url, - }) - log.Debugf("tailscale login url: %s", url) -} - -func (s *Service) LogoutTailscale(c *gin.Context) { - var rsp proto.Response - - cmd := exec.Command("sh", "-c", "tailscale logout") - err := cmd.Run() - if err != nil { - rsp.ErrRsp(c, -2, "tailscale logout failed") - return - } - - rsp.OkRsp(c) - log.Debugf("tailscale logout success") -} - -func (s *Service) GetTailscaleStatus(c *gin.Context) { - var rsp proto.Response - var data proto.GetTailscaleStatusRsp - - if exist := isTailscaleExist(); !exist { - data.Status = responseStateNotInstalled - rsp.OkRspWithData(c, data) - return - } - - status, err := getTailscaleStatus() - if err != nil { - data.Status = responseStateNeedsLogin - rsp.OkRspWithData(c, data) - return - } - - data.Status = stateToJson(status.BackendState) - if data.Status == "" { - rsp.ErrRsp(c, -1, "unknown state") - return - } - - for _, tailscaleIp := range status.Self.TailscaleIPs { - ip := net.ParseIP(tailscaleIp) - if ip != nil && ip.To4() != nil { - data.IP = ip.String() - } - } - - data.Name = status.Self.HostName - data.Account = status.CurrentTailnet.Name - - rsp.OkRspWithData(c, data) - log.Debugf("tailscale status: %s", data.Status) -} - -func (s *Service) UpdateTailscaleStatus(c *gin.Context) { - var req proto.UpdateTailscaleStatusReq - var rsp proto.Response - - if err := proto.ParseFormRequest(c, &req); err != nil { - rsp.ErrRsp(c, -1, "invalid arguments") - return - } - - command := fmt.Sprintf("tailscale %s", req.Command) - err := exec.Command("sh", "-c", command).Run() - if err != nil { - msg := fmt.Sprintf("tailscale %s failed", req.Command) - rsp.ErrRsp(c, -2, msg) - return - } - - status, err := getTailscaleStatus() - if err != nil { - rsp.ErrRsp(c, -3, "get tailscale status failed") - return - } - - data := &proto.UpdateTailscaleStatusRsp{} - - switch status.BackendState { - case backendStateRunning: - data.Status = responseStateRunning - case backendStateStopped: - data.Status = responseStateStopped - default: - rsp.ErrRsp(c, -4, "unknown tailscale status") - return - } - - rsp.OkRspWithData(c, data) - log.Debugf("tailscale %s success", req.Command) -} - -func isTailscaleExist() bool { - _, err1 := os.Stat(tailscalePath) - _, err2 := os.Stat(tailscaledPath) - - return err1 == nil && err2 == nil -} - -func runTailscale() error { - for _, filePath := range []string{tailscalePath, tailscaledPath} { - if err := utils.EnsurePermission(filePath, 0o100); err != nil { - return err - } - } - - err := exec.Command("sh", "-c", "/etc/init.d/S98tailscaled start").Run() - if err != nil { - return err - } - - return nil -} - -func getTailscaleStatus() (TailscaleStatus, error) { - var status TailscaleStatus - - command := "tailscale status --json" - cmd := exec.Command("sh", "-c", command) - output, err := cmd.CombinedOutput() - if err != nil { - log.Debugf("get tailscale status failed: %s", err) - return status, err - } - - // delete warning message - if str := string(output); !strings.HasPrefix(str, "{") { - index := strings.Index(str, "{") - if index != -1 { - output = []byte(str[index:]) - } - } - - err = json.Unmarshal(output, &status) - if err != nil { - log.Debugf("unmarshal tailscale status failed: %s", err) - return status, err - } - - return status, nil -} - -func parseLoginUrl(r io.Reader) string { - reader := bufio.NewReader(r) - for { - line, err := reader.ReadString('\n') - if err != nil { - log.Errorf("reading line failed: %s", err) - return "" - } - - if strings.Contains(line, "https") { - reg := regexp.MustCompile(`\s+`) - return reg.ReplaceAllString(line, "") - } - } -} diff --git a/server/service/network/tailscale/account.go b/server/service/network/tailscale/account.go new file mode 100644 index 0000000..beb6cc1 --- /dev/null +++ b/server/service/network/tailscale/account.go @@ -0,0 +1,68 @@ +package tailscale + +import ( + "NanoKVM-Server/proto" + "NanoKVM-Server/utils" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func Login(c *gin.Context) { + var rsp proto.Response + + // check tailscale status + cli := NewCli() + status, err := cli.Status() + if err != nil { + _ = cli.Start() + status, err = cli.Status() + } + + if err != nil { + log.Errorf("failed to get tailscale status: %s", err) + rsp.ErrRsp(c, -1, "unknown status") + return + } + + if status.BackendState == "Running" { + rsp.OkRspWithData(c, &proto.LoginTailscaleRsp{}) + return + } + + // get login url + url, err := cli.Login() + if err != nil { + log.Errorf("failed to run tailscale login: %s", err) + rsp.ErrRsp(c, -2, "login failed") + return + } + + // set GOMEMLIMIT = 50M + if !utils.IsGoMemLimitExist() { + _ = utils.SetGoMemLimit(50) + } + + rsp.OkRspWithData(c, &proto.LoginTailscaleRsp{ + Url: url, + }) + + log.Debugf("tailscale login url: %s", url) +} + +func Logout(c *gin.Context) { + var rsp proto.Response + + err := NewCli().Logout() + if err != nil { + rsp.ErrRsp(c, -1, "logout failed") + log.Errorf("failed to run tailscale logout: %s", err) + return + } + + // delete GOMEMLIMIT + _ = utils.DelGoMemLimit() + + rsp.OkRsp(c) + log.Debugf("tailscale logout successfully") +} diff --git a/server/service/network/tailscale/cli.go b/server/service/network/tailscale/cli.go new file mode 100644 index 0000000..f43201e --- /dev/null +++ b/server/service/network/tailscale/cli.go @@ -0,0 +1,120 @@ +package tailscale + +import ( + "NanoKVM-Server/utils" + "bufio" + "encoding/json" + "errors" + "os/exec" + "regexp" + "strings" +) + +type Cli struct{} + +type TsStatus struct { + BackendState string `json:"BackendState"` + + Self struct { + HostName string `json:"HostName"` + TailscaleIPs []string `json:"TailscaleIPs"` + } `json:"Self"` + + CurrentTailnet struct { + Name string `json:"Name"` + } `json:"CurrentTailnet"` +} + +func NewCli() *Cli { + return &Cli{} +} + +func (c *Cli) Start() error { + for _, filePath := range []string{TailscalePath, TailscaledPath} { + if err := utils.EnsurePermission(filePath, 0o100); err != nil { + return err + } + } + + command := "/etc/init.d/S98tailscaled start" + return exec.Command("sh", "-c", command).Run() +} + +func (c *Cli) Stop() error { + command := "/etc/init.d/S98tailscaled stop" + return exec.Command("sh", "-c", command).Run() +} + +func (c *Cli) Up() error { + command := "tailscale up" + return exec.Command("sh", "-c", command).Run() +} + +func (c *Cli) Down() error { + command := "tailscale down" + return exec.Command("sh", "-c", command).Run() +} + +func (c *Cli) Status() (*TsStatus, error) { + command := "tailscale status --json" + cmd := exec.Command("sh", "-c", command) + + output, err := cmd.CombinedOutput() + if err != nil { + return nil, err + } + + // output is not in standard json format + if outputStr := string(output); !strings.HasPrefix(outputStr, "{") { + index := strings.Index(outputStr, "{") + if index == -1 { + return nil, errors.New("unknown output") + } + + output = []byte(outputStr[index:]) + } + + var status TsStatus + err = json.Unmarshal(output, &status) + if err != nil { + return nil, err + } + + return &status, nil +} + +func (c *Cli) Login() (string, error) { + command := "tailscale login --timeout=10m" + cmd := exec.Command("sh", "-c", command) + + stderr, err := cmd.StderrPipe() + if err != nil { + return "", err + } + defer func() { + _ = stderr.Close() + }() + + go func() { + _ = cmd.Run() + }() + + reader := bufio.NewReader(stderr) + for { + line, err := reader.ReadString('\n') + if err != nil { + return "", err + } + + if strings.Contains(line, "https") { + reg := regexp.MustCompile(`\s+`) + url := reg.ReplaceAllString(line, "") + return url, nil + } + } +} + +func (c *Cli) Logout() error { + command := "tailscale logout" + return exec.Command("sh", "-c", command).Run() +} diff --git a/server/service/network/tailscale/install.go b/server/service/network/tailscale/install.go new file mode 100644 index 0000000..4174b7b --- /dev/null +++ b/server/service/network/tailscale/install.go @@ -0,0 +1,97 @@ +package tailscale + +import ( + "NanoKVM-Server/proto" + "NanoKVM-Server/utils" + "fmt" + "net/http" + "os" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +const ( + DownloadUrl = "https://cdn.sipeed.com/nanokvm/resources/tailscale_riscv64.zip" + Workspace = "/root/.tailscale" + + TailscalePath = "/usr/bin/tailscale" + TailscaledPath = "/usr/sbin/tailscaled" +) + +func Install(c *gin.Context) { + var rsp proto.Response + + if IsInstalled() { + rsp.OkRsp(c) + return + } + + _ = os.MkdirAll(Workspace, 0o755) + defer func() { + _ = os.RemoveAll(Workspace) + }() + + // download + req, err := http.NewRequest("GET", DownloadUrl, nil) + if err != nil { + rsp.ErrRsp(c, -1, "request failed") + log.Errorf("failed to create request: %s", err) + return + } + + zipPath := fmt.Sprintf("%s/tailscale_riscv64.zip", Workspace) + err = utils.Download(req, zipPath) + if err != nil { + rsp.ErrRsp(c, -2, "download failed") + log.Errorf("failed to download tailscale: %s", err) + return + } + + // install + err = utils.Unzip(zipPath, Workspace) + if err != nil { + rsp.ErrRsp(c, -3, "unzip failed") + log.Errorf("failed to unzip tailscale: %s", err) + return + } + + tailscalePath := fmt.Sprintf("%s/tailscale_riscv64/tailscale", Workspace) + err = utils.MoveFile(tailscalePath, TailscalePath) + if err != nil { + rsp.ErrRsp(c, -4, "install failed") + log.Errorf("failed to move tailscale: %s", err) + return + } + + tailscaledPath := fmt.Sprintf("%s/tailscale_riscv64/tailscaled", Workspace) + err = utils.MoveFile(tailscaledPath, TailscaledPath) + if err != nil { + rsp.ErrRsp(c, -5, "install failed") + log.Errorf("failed to move tailscaled: %s", err) + return + } + + rsp.OkRsp(c) + log.Debugf("install tailscale successfully") +} + +func Uninstall(c *gin.Context) { + var rsp proto.Response + + _ = NewCli().Stop() + _ = utils.DelGoMemLimit() + + _ = os.Remove(TailscalePath) + _ = os.Remove(TailscaledPath) + + rsp.OkRsp(c) + log.Debugf("uninstall tailscale successfully") +} + +func IsInstalled() bool { + _, err1 := os.Stat(TailscalePath) + _, err2 := os.Stat(TailscaledPath) + + return err1 == nil && err2 == nil +} diff --git a/server/service/network/tailscale/status.go b/server/service/network/tailscale/status.go new file mode 100644 index 0000000..ccde8be --- /dev/null +++ b/server/service/network/tailscale/status.go @@ -0,0 +1,88 @@ +package tailscale + +import ( + "NanoKVM-Server/proto" + "net" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +var StateMap = map[string]proto.TailscaleState{ + "NeedsLogin": proto.TailscaleNotLogin, + "Running": proto.TailscaleRunning, + "Stopped": proto.TailscaleStopped, +} + +func GetStatus(c *gin.Context) { + var rsp proto.Response + + if !IsInstalled() { + rsp.OkRspWithData(c, &proto.GetTailscaleStatusRsp{ + State: proto.TailscaleNotInstall, + }) + return + } + + status, err := NewCli().Status() + if err != nil { + log.Debugf("failed to get tailscale status: %s", err) + rsp.OkRspWithData(c, &proto.GetTailscaleStatusRsp{ + State: proto.TailscaleNotLogin, + }) + return + } + + state, ok := StateMap[status.BackendState] + if !ok { + log.Errorf("unknown tailscale state: %s", status.BackendState) + rsp.ErrRsp(c, -1, "unknown state") + return + } + + ipv4 := "" + for _, tailscaleIp := range status.Self.TailscaleIPs { + ip := net.ParseIP(tailscaleIp) + if ip != nil && ip.To4() != nil { + ipv4 = ip.String() + } + } + + data := proto.GetTailscaleStatusRsp{ + State: state, + IP: ipv4, + Name: status.Self.HostName, + Account: status.CurrentTailnet.Name, + } + + rsp.OkRspWithData(c, &data) + log.Debugf("get tailscale status successfully") +} + +func Up(c *gin.Context) { + var rsp proto.Response + + err := NewCli().Up() + if err != nil { + rsp.ErrRsp(c, -1, "tailscale up failed") + log.Errorf("failed to run tailscale up: %s", err) + return + } + + rsp.OkRsp(c) + log.Debugf("run tailscale up successfully") +} + +func Down(c *gin.Context) { + var rsp proto.Response + + err := NewCli().Down() + if err != nil { + rsp.ErrRsp(c, -1, "tailscale down failed") + log.Errorf("failed to run tailscale down: %s", err) + return + } + + rsp.OkRsp(c) + log.Debugf("run tailscale down successfully") +} diff --git a/server/service/network/wifi.go b/server/service/network/wifi.go index f8af2f1..b2b2eb1 100644 --- a/server/service/network/wifi.go +++ b/server/service/network/wifi.go @@ -11,6 +11,9 @@ import ( const ( WiFiExistFile = "/etc/kvm/wifi_exist" + WiFiSSID = "/etc/kvm/wifi.ssid" + WiFiPasswd = "/etc/kvm/wifi.pass" + WiFiConnect = "/kvmapp/kvm/wifi_try_connect" WiFiStateFile = "/kvmapp/kvm/wifi_state" ) @@ -39,3 +42,34 @@ func (s *Service) GetWifi(c *gin.Context) { rsp.OkRspWithData(c, data) log.Debugf("get wifi state: %s", state) } + +func (s *Service) ConnectWifi(c *gin.Context) { + var req proto.ConnectWifiReq + var rsp proto.Response + + if err := proto.ParseFormRequest(c, &req); err != nil { + rsp.ErrRsp(c, -1, "invalid parameters") + return + } + + if err := os.WriteFile(WiFiSSID, []byte(req.Ssid), 0o644); err != nil { + log.Errorf("failed to save wifi ssid: %s", err) + rsp.ErrRsp(c, -2, "failed to save wifi") + return + } + + if err := os.WriteFile(WiFiPasswd, []byte(req.Password), 0o644); err != nil { + log.Errorf("failed to save wifi password: %s", err) + rsp.ErrRsp(c, -3, "failed to save wifi") + return + } + + if err := os.WriteFile(WiFiConnect, nil, 0o644); err != nil { + log.Errorf("failed to connect wifi: %s", err) + rsp.ErrRsp(c, -4, "failed to connect wifi") + return + } + + rsp.OkRsp(c) + log.Debugf("set wifi successfully: %s", req.Ssid) +} diff --git a/server/service/network/wol.go b/server/service/network/wol.go index c526422..62c94a7 100644 --- a/server/service/network/wol.go +++ b/server/service/network/wol.go @@ -5,6 +5,7 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "strings" "github.com/gin-gonic/gin" @@ -14,7 +15,7 @@ import ( ) const ( - WolHistory = "/etc/kvm/cache/wol" + WolMacFile = "/etc/kvm/cache/wol" ) func (s *Service) WakeOnLAN(c *gin.Context) { @@ -26,34 +27,39 @@ func (s *Service) WakeOnLAN(c *gin.Context) { return } - command := fmt.Sprintf("ether-wake %s", req.Mac) + mac, err := parseMAC(req.Mac) + if err != nil { + rsp.ErrRsp(c, -2, "invalid MAC address") + return + } + + command := fmt.Sprintf("ether-wake %s", mac) cmd := exec.Command("sh", "-c", command) output, err := cmd.CombinedOutput() if err != nil { - log.Errorf("wake on lan failed: %s", err) - rsp.ErrRsp(c, -2, string(output)) + log.Errorf("failed to wake on lan: %s", err) + rsp.ErrRsp(c, -3, string(output)) return } - go saveMac(req.Mac) + go saveMac(mac) rsp.OkRsp(c) - log.Debugf("wake on lan %s success", req.Mac) + log.Debugf("wake on lan: %s", mac) } func (s *Service) GetMac(c *gin.Context) { var rsp proto.Response - content, err := os.ReadFile(WolHistory) + content, err := os.ReadFile(WolMacFile) if err != nil { rsp.ErrRsp(c, -2, "open file error") return } - macs := strings.Split(string(content), "\n") data := &proto.GetMacRsp{ - Macs: macs, + Macs: strings.Split(string(content), "\n"), } rsp.OkRspWithData(c, data) @@ -68,9 +74,9 @@ func (s *Service) DeleteMac(c *gin.Context) { return } - content, err := os.ReadFile(WolHistory) + content, err := os.ReadFile(WolMacFile) if err != nil { - log.Errorf("open %s failed: %s", WolHistory, err) + log.Errorf("failed to open %s: %s", WolMacFile, err) rsp.ErrRsp(c, -2, "read failed") return } @@ -85,15 +91,41 @@ func (s *Service) DeleteMac(c *gin.Context) { } data := strings.Join(newMacs, "\n") - err = os.WriteFile(WolHistory, []byte(data), 0o644) + err = os.WriteFile(WolMacFile, []byte(data), 0o644) if err != nil { - log.Errorf("write %s failed: %s", WolHistory, err) + log.Errorf("failed to write %s: %s", WolMacFile, err) rsp.ErrRsp(c, -3, "write failed") return } rsp.OkRsp(c) - log.Debugf("delete mac %s success", req.Mac) + log.Debugf("delete wol mac: %s", req.Mac) +} + +func parseMAC(mac string) (string, error) { + mac = strings.ToUpper(strings.TrimSpace(mac)) + + mac = strings.ReplaceAll(mac, "-", "") + mac = strings.ReplaceAll(mac, ":", "") + mac = strings.ReplaceAll(mac, ".", "") + + matched, err := regexp.MatchString("^[0-9A-F]{12}$", mac) + if err != nil { + return "", err + } + if !matched { + return "", fmt.Errorf("invalid MAC address: %s", mac) + } + + var result strings.Builder + for i := 0; i < 12; i += 2 { + if i > 0 { + result.WriteString(":") + } + result.WriteString(mac[i : i+2]) + } + + return result.String(), nil } func saveMac(mac string) { @@ -101,15 +133,15 @@ func saveMac(mac string) { return } - err := os.MkdirAll(filepath.Dir(WolHistory), 0o644) + err := os.MkdirAll(filepath.Dir(WolMacFile), 0o644) if err != nil { - log.Errorf("create dir failed: %s", err) + log.Errorf("failed to create dir: %s", err) return } - file, err := os.OpenFile(WolHistory, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) + file, err := os.OpenFile(WolMacFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { - log.Errorf("open %s failed: %s", WolHistory, err) + log.Errorf("failed to open %s: %s", WolMacFile, err) return } defer func() { @@ -119,13 +151,13 @@ func saveMac(mac string) { content := fmt.Sprintf("%s\n", mac) _, err = file.WriteString(content) if err != nil { - log.Errorf("write %s failed: %s", WolHistory, err) + log.Errorf("failed to write %s: %s", WolMacFile, err) return } } func isMacExist(mac string) bool { - content, err := os.ReadFile(WolHistory) + content, err := os.ReadFile(WolMacFile) if err != nil { return false } diff --git a/server/service/stream/h264/h264.go b/server/service/stream/h264/h264.go index f7f571b..12aa481 100644 --- a/server/service/stream/h264/h264.go +++ b/server/service/stream/h264/h264.go @@ -37,7 +37,10 @@ func Connect(c *gin.Context) { config := webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ { - URLs: []string{"stun:stun.l.google.com:19302"}, + URLs: []string{ + "stun:stun.l.google.com:19302", + "stun:turn.cloudflare.com:3478", + }, }, }, } diff --git a/server/service/vm/memory.go b/server/service/vm/memory.go new file mode 100644 index 0000000..fd350f5 --- /dev/null +++ b/server/service/vm/memory.go @@ -0,0 +1,58 @@ +package vm + +import ( + "NanoKVM-Server/proto" + "NanoKVM-Server/utils" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func (s *Service) SetMemoryLimit(c *gin.Context) { + var req proto.SetMemoryLimitReq + var rsp proto.Response + + err := proto.ParseFormRequest(c, &req) + if err != nil { + rsp.ErrRsp(c, -1, "invalid arguments") + return + } + + if req.Enabled { + err = utils.SetGoMemLimit(req.Limit) + } else { + err = utils.DelGoMemLimit() + } + + if err != nil { + rsp.ErrRsp(c, -2, "failed to set memory limit") + return + } + + rsp.OkRsp(c) + log.Debug("set memory limit successful, enabled: %t, limit: %s", req.Enabled, req.Limit) +} + +func (s *Service) GetMemoryLimit(c *gin.Context) { + var rsp proto.Response + + exist := utils.IsGoMemLimitExist() + if !exist { + rsp.OkRspWithData(c, &proto.GetMemoryLimitRsp{ + Enabled: false, + Limit: 0, + }) + return + } + + limit, err := utils.GetGoMemLimit() + if err != nil { + rsp.ErrRsp(c, -1, "failed to get memory limit") + return + } + + rsp.OkRspWithData(c, &proto.GetMemoryLimitRsp{ + Enabled: true, + Limit: limit, + }) +} diff --git a/server/service/vm/oled.go b/server/service/vm/oled.go new file mode 100644 index 0000000..495e60f --- /dev/null +++ b/server/service/vm/oled.go @@ -0,0 +1,72 @@ +package vm + +import ( + "NanoKVM-Server/proto" + "fmt" + "os" + "strconv" + "strings" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +const ( + OLEDExistFile = "/etc/kvm/oled_exist" + OLEDSleepFile = "/etc/kvm/oled_sleep" +) + +func (s *Service) SetOLED(c *gin.Context) { + var req proto.SetOledReq + var rsp proto.Response + + if err := proto.ParseFormRequest(c, &req); err != nil { + rsp.ErrRsp(c, -1, "invalid arguments") + return + } + + data := []byte(fmt.Sprintf("%d", req.Sleep)) + err := os.WriteFile(OLEDSleepFile, data, 0o644) + if err != nil { + rsp.ErrRsp(c, -2, "failed to write data") + return + } + + rsp.OkRsp(c) + log.Debugf("set OLED sleep: %d", req.Sleep) +} + +func (s *Service) GetOLED(c *gin.Context) { + var rsp proto.Response + + if _, err := os.Stat(OLEDExistFile); err != nil { + rsp.OkRspWithData(c, &proto.GetOLEDRsp{ + Exist: false, + Sleep: 0, + }) + return + } + + data, err := os.ReadFile(OLEDSleepFile) + if err != nil { + rsp.OkRspWithData(c, &proto.GetOLEDRsp{ + Exist: true, + Sleep: 0, + }) + return + } + + content := strings.TrimSpace(string(data)) + sleep, err := strconv.Atoi(content) + if err != nil { + log.Errorf("failed to parse OLED: %s", err) + rsp.ErrRsp(c, -1, "failed to parse OLED config") + return + } + + rsp.OkRspWithData(c, &proto.GetOLEDRsp{ + Exist: true, + Sleep: sleep, + }) + log.Debugf("get OLED config successful, sleep %d", sleep) +} diff --git a/server/service/vm/script.go b/server/service/vm/script.go index 9606e8a..d16e3ee 100644 --- a/server/service/vm/script.go +++ b/server/service/vm/script.go @@ -32,7 +32,6 @@ func (s *Service) GetScripts(c *gin.Context) { return nil }) if err != nil { - log.Errorf("get scripts failed: %s", err) rsp.ErrRsp(c, -1, "get scripts failed") return } @@ -41,7 +40,7 @@ func (s *Service) GetScripts(c *gin.Context) { Files: files, }) - log.Debugf("get scripts success") + log.Debugf("get scripts total %d", len(files)) } func (s *Service) UploadScript(c *gin.Context) { diff --git a/server/service/vm/terminal.go b/server/service/vm/terminal.go index fbf22cf..14775ed 100644 --- a/server/service/vm/terminal.go +++ b/server/service/vm/terminal.go @@ -213,6 +213,23 @@ func (s *SshClient) bridgeWSAndSSH() { <-s.closeSig } +func getRootPassword() string { + if !utils.IsAccountExist() { + return "root" + } + + account, err := utils.GetAccount() + if err != nil { + return "root" + } + + if account == nil || account.Password == "" { + return "root" + } + + return account.Password +} + func (s *Service) Terminal(c *gin.Context) { user := c.Query("u") if user == "" { @@ -221,7 +238,7 @@ func (s *Service) Terminal(c *gin.Context) { password, _ := utils.Decrypt(c.Query("t")) if password == "" { - password = "root" + password = getRootPassword() } upgrader.CheckOrigin = func(r *http.Request) bool { diff --git a/server/service/auth/account.go b/server/utils/account.go similarity index 72% rename from server/service/auth/account.go rename to server/utils/account.go index 6969cbb..80d84f3 100644 --- a/server/service/auth/account.go +++ b/server/utils/account.go @@ -1,4 +1,4 @@ -package auth +package utils import ( "encoding/json" @@ -7,8 +7,6 @@ import ( "path/filepath" log "github.com/sirupsen/logrus" - - "NanoKVM-Server/utils" ) const AccountFile = "/etc/kvm/pwd" @@ -18,7 +16,18 @@ type Account struct { Password string `json:"password"` } -func getAccount() (*Account, error) { +func IsAccountExist() bool { + if _, err := os.Stat(AccountFile); err != nil { + if errors.Is(err, os.ErrNotExist) { + return false + } + return false + } + + return true +} + +func GetAccount() (*Account, error) { // use default account if _, err := os.Stat(AccountFile); err != nil { if errors.Is(err, os.ErrNotExist) { @@ -43,7 +52,7 @@ func getAccount() (*Account, error) { return nil, err } - password, err := utils.DecodeDecrypt(account.Password) + password, err := DecodeDecrypt(account.Password) if err != nil { return nil, err } @@ -53,7 +62,7 @@ func getAccount() (*Account, error) { return &account, nil } -func setAccount(username string, password string) error { +func SetAccount(username string, password string) error { account, err := json.Marshal(&Account{ Username: username, Password: password, @@ -77,3 +86,12 @@ func setAccount(username string, password string) error { return nil } + +func DelAccount() error { + if err := os.Remove(AccountFile); err != nil { + log.Errorf("failed to delete password: %s", err) + return err + } + + return nil +} diff --git a/server/utils/memory.go b/server/utils/memory.go new file mode 100644 index 0000000..56c8047 --- /dev/null +++ b/server/utils/memory.go @@ -0,0 +1,77 @@ +package utils + +import ( + "fmt" + "os" + "runtime/debug" + "strconv" + "strings" + + log "github.com/sirupsen/logrus" +) + +const GoMemLimitFile = "/etc/kvm/GOMEMLIMIT" + +func InitGoMemLimit() { + if !IsGoMemLimitExist() { + return + } + + limit, err := GetGoMemLimit() + if err != nil { + return + } + + debug.SetMemoryLimit(limit * 1024 * 1024) + log.Debugf("set GOMEMLIMIT to %d MB", limit) +} + +func SetGoMemLimit(limit int64) error { + memoryLimit := max(limit, 50) + debug.SetMemoryLimit(memoryLimit * 1024 * 1024) + + log.Debugf("set GOMEMLIMIT to %d MB", limit) + + data := []byte(fmt.Sprintf("%d", limit)) + err := os.WriteFile(GoMemLimitFile, data, 0o644) + if err != nil { + log.Errorf("failed to write GOMEMLIMIT: %s", err) + return err + } + + return nil +} + +func GetGoMemLimit() (int64, error) { + data, err := os.ReadFile(GoMemLimitFile) + if err != nil { + log.Errorf("failed to read GOMEMLIMIT: %s", err) + return 0, err + } + + content := strings.TrimSpace(string(data)) + limit, err := strconv.ParseInt(content, 10, 64) + if err != nil { + log.Errorf("failed to parse GOMEMLIMIT: %s", err) + return 0, err + } + + return limit, nil +} + +func DelGoMemLimit() error { + debug.SetMemoryLimit(1024 * 1024 * 1024) + + err := os.Remove(GoMemLimitFile) + if err != nil { + log.Errorf("failed to delete GOMEMLIMIT: %s", err) + return err + } + + return nil +} + +func IsGoMemLimitExist() bool { + _, err := os.Stat(GoMemLimitFile) + return err == nil +} diff --git a/web/.env.development b/web/.env.development index 260fc4b..0755dc5 100644 --- a/web/.env.development +++ b/web/.env.development @@ -1,3 +1,3 @@ -VITE_SERVER_IP=192.168.1.1 +VITE_SERVER_IP=192.168.0.65 VITE_SERVER_PORT=80 VITE_WITH_CREDENTIALS=false diff --git a/web/package.json b/web/package.json index 130e803..85b8ca3 100644 --- a/web/package.json +++ b/web/package.json @@ -11,54 +11,54 @@ "preview": "vite preview" }, "dependencies": { - "@ant-design/icons": "^5.3.7", + "@ant-design/icons": "^5.5.1", "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", - "antd": "^5.19.2", - "axios": "^1.7.4", + "antd": "^5.21.6", + "axios": "^1.7.7", "clsx": "^2.1.1", "crypto-js": "^4.2.0", - "i18next": "^23.11.5", - "jotai": "^2.9.0", + "i18next": "^23.16.4", + "jotai": "^2.10.1", "js-cookie": "^3.0.5", - "lucide-react": "^0.408.0", + "lucide-react": "^0.469.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-error-boundary": "^4.0.13", + "react-error-boundary": "^4.1.2", "react-helmet-async": "^2.0.5", - "react-i18next": "^14.1.2", + "react-i18next": "^14.1.3", "react-responsive": "^10.0.0", - "react-router-dom": "^6.23.1", - "react-simple-keyboard": "^3.7.124", + "react-router-dom": "^6.27.0", + "react-simple-keyboard": "^3.8.19", "semver": "^7.6.3", - "vaul": "^0.9.1", + "vaul": "^0.9.9", "websocket": "^1.0.35" }, "devDependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "@ianvs/prettier-plugin-sort-imports": "^4.3.1", "@types/crypto-js": "^4.2.2", "@types/js-cookie": "^3.0.6", - "@types/react": "^18.3.2", - "@types/react-dom": "^18.3.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/semver": "^7.5.8", "@types/websocket": "^1.0.10", - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", + "@typescript-eslint/eslint-plugin": "^8.19.1", + "@typescript-eslint/parser": "^8.19.1", + "@vitejs/plugin-react": "^4.3.3", + "autoprefixer": "^10.4.20", + "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.16", "msw": "^2.6.0", - "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.14", - "tailwindcss": "^3.4.13", - "typescript": "^5.4.5", - "vite": "^5.4.8", + "postcss": "^8.4.47", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.9", + "tailwindcss": "^3.4.14", + "typescript": "^5.6.3", + "vite": "^5.4.10", "vite-tsconfig-paths": "^4.3.2" }, "msw": { diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 059b1de..d3fc618 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@ant-design/icons': - specifier: ^5.3.7 - version: 5.5.1(react-dom@18.3.1)(react@18.3.1) + specifier: ^5.5.1 + version: 5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@xterm/addon-attach': specifier: ^0.11.0 version: 0.11.0(@xterm/xterm@5.5.0) @@ -21,10 +21,10 @@ importers: specifier: ^5.5.0 version: 5.5.0 antd: - specifier: ^5.19.2 - version: 5.21.6(react-dom@18.3.1)(react@18.3.1) + specifier: ^5.21.6 + version: 5.21.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: ^1.7.4 + specifier: ^1.7.7 version: 1.7.7 clsx: specifier: ^2.1.1 @@ -33,17 +33,17 @@ importers: specifier: ^4.2.0 version: 4.2.0 i18next: - specifier: ^23.11.5 + specifier: ^23.16.4 version: 23.16.4 jotai: - specifier: ^2.9.0 + specifier: ^2.10.1 version: 2.10.1(@types/react@18.3.12)(react@18.3.1) js-cookie: specifier: ^3.0.5 version: 3.0.5 lucide-react: - specifier: ^0.408.0 - version: 0.408.0(react@18.3.1) + specifier: ^0.469.0 + version: 0.469.0(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -51,36 +51,36 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-error-boundary: - specifier: ^4.0.13 + specifier: ^4.1.2 version: 4.1.2(react@18.3.1) react-helmet-async: specifier: ^2.0.5 version: 2.0.5(react@18.3.1) react-i18next: - specifier: ^14.1.2 - version: 14.1.3(i18next@23.16.4)(react-dom@18.3.1)(react@18.3.1) + specifier: ^14.1.3 + version: 14.1.3(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-responsive: specifier: ^10.0.0 version: 10.0.0(react@18.3.1) react-router-dom: - specifier: ^6.23.1 - version: 6.27.0(react-dom@18.3.1)(react@18.3.1) + specifier: ^6.27.0 + version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-simple-keyboard: - specifier: ^3.7.124 - version: 3.8.19(react-dom@18.3.1)(react@18.3.1) + specifier: ^3.8.19 + version: 3.8.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) semver: specifier: ^7.6.3 version: 7.6.3 vaul: - specifier: ^0.9.1 - version: 0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.9.9 + version: 0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) websocket: specifier: ^1.0.35 version: 1.0.35 devDependencies: '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.2.1 - version: 4.3.1(prettier@3.3.3) + specifier: ^4.3.1 + version: 4.3.1(prettier@3.4.2) '@types/crypto-js': specifier: ^4.2.2 version: 4.2.2 @@ -88,10 +88,10 @@ importers: specifier: ^3.0.6 version: 3.0.6 '@types/react': - specifier: ^18.3.2 + specifier: ^18.3.12 version: 18.3.12 '@types/react-dom': - specifier: ^18.3.0 + specifier: ^18.3.1 version: 18.3.1 '@types/semver': specifier: ^7.5.8 @@ -100,56 +100,56 @@ importers: specifier: ^1.0.10 version: 1.0.10 '@typescript-eslint/eslint-plugin': - specifier: ^7.10.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.6.3) + specifier: ^8.19.1 + version: 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/parser': - specifier: ^7.10.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.6.3) + specifier: ^8.19.1 + version: 8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.3.3(vite@5.4.10) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) autoprefixer: - specifier: ^10.4.19 + specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) eslint: - specifier: ^8.57.0 - version: 8.57.1 + specifier: ^9.17.0 + version: 9.17.0(jiti@1.21.6) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + version: 9.1.0(eslint@9.17.0(jiti@1.21.6)) eslint-plugin-react: - specifier: ^7.34.1 - version: 7.37.2(eslint@8.57.1) + specifier: ^7.37.2 + version: 7.37.2(eslint@9.17.0(jiti@1.21.6)) eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.1) + specifier: ^5.1.0 + version: 5.1.0(eslint@9.17.0(jiti@1.21.6)) eslint-plugin-react-refresh: - specifier: ^0.4.7 - version: 0.4.14(eslint@8.57.1) + specifier: ^0.4.16 + version: 0.4.16(eslint@9.17.0(jiti@1.21.6)) msw: specifier: ^2.6.0 version: 2.6.0(@types/node@22.9.0)(typescript@5.6.3) postcss: - specifier: ^8.4.38 + specifier: ^8.4.47 version: 8.4.47 prettier: - specifier: ^3.2.5 - version: 3.3.3 + specifier: ^3.4.2 + version: 3.4.2 prettier-plugin-tailwindcss: - specifier: ^0.5.14 - version: 0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3) + specifier: ^0.6.9 + version: 0.6.9(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.4.2))(prettier@3.4.2) tailwindcss: - specifier: ^3.4.13 + specifier: ^3.4.14 version: 3.4.14 typescript: - specifier: ^5.4.5 + specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 + specifier: ^5.4.10 version: 5.4.10(@types/node@22.9.0) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.6.3)(vite@5.4.10) + version: 4.3.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) packages: @@ -445,26 +445,49 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} '@ianvs/prettier-plugin-sort-imports@4.3.1': resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} @@ -881,6 +904,9 @@ packages: '@types/js-cookie@3.0.6': resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@22.9.0': resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} @@ -905,66 +931,52 @@ packages: '@types/websocket@1.0.10': resolution: {integrity: sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.19.1': + resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.19.1': + resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.19.1': + resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.19.1': + resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.19.1': + resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.19.1': + resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.19.1': + resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@8.19.1': + resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react@4.3.3': resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} @@ -1052,10 +1064,6 @@ packages: array-tree-filter@2.1.0: resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -1188,8 +1196,8 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypto-js@4.2.0: @@ -1263,10 +1271,6 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1274,10 +1278,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1351,16 +1351,16 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.14: - resolution: {integrity: sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==} + eslint-plugin-react-refresh@0.4.16: + resolution: {integrity: sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==} peerDependencies: - eslint: '>=7' + eslint: '>=8.40' eslint-plugin-react@7.37.2: resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} @@ -1368,27 +1368,35 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -1428,9 +1436,9 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1440,9 +1448,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -1470,9 +1478,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1520,26 +1525,18 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -1603,13 +1600,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -1690,10 +1680,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -1833,8 +1819,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.408.0: - resolution: {integrity: sha512-8kETAAeWmOvtGIr7HPHm51DXoxlfkNncQ5FZWXR+abX8saQwMYXANWIkUstaYtcKSo/imOe/q+tVFA8ANzdSVA==} + lucide-react@0.469.0: + resolution: {integrity: sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1891,8 +1877,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1949,9 +1935,6 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1978,10 +1961,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1996,10 +1975,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2064,8 +2039,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.5.14: - resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + prettier-plugin-tailwindcss@0.6.9: + resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -2079,6 +2054,7 @@ packages: prettier-plugin-import-sort: '*' prettier-plugin-jsdoc: '*' prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' prettier-plugin-organize-attributes: '*' prettier-plugin-organize-imports: '*' prettier-plugin-sort-imports: '*' @@ -2105,6 +2081,8 @@ packages: optional: true prettier-plugin-marko: optional: true + prettier-plugin-multiline-arrays: + optional: true prettier-plugin-organize-attributes: optional: true prettier-plugin-organize-imports: @@ -2116,8 +2094,8 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -2512,11 +2490,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rollup@4.24.4: resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2578,10 +2551,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2655,9 +2624,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2680,11 +2646,11 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} - engines: {node: '>=16'} + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -2706,10 +2672,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -2883,9 +2845,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2931,22 +2890,22 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/cssinjs-utils@1.1.1(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs-utils@1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@babel/runtime': 7.26.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ant-design/cssinjs@1.21.1(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs@1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 csstype: 3.1.3 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) stylis: 4.3.4 @@ -2957,13 +2916,13 @@ snapshots: '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.5.1(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/icons@5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -3178,19 +3137,31 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.6))': dependencies: - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.19.1': + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.3.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -3199,28 +3170,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.17.0': {} - '@humanwhocodes/config-array@0.13.0': + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.4': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} - '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': + '@humanwhocodes/retry@0.4.1': {} + + '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.4.2)': dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.2 '@babel/parser': 7.26.2 '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 - prettier: 3.3.3 + prettier: 3.4.2 semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -3314,139 +3292,154 @@ snapshots: '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 - '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': + '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 react: 18.3.1 - - '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@types/react': 18.3.12 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 '@rc-component/async-validator@5.0.4': dependencies: '@babel/runtime': 7.26.0 - '@rc-component/color-picker@2.0.1(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/fast-color': 2.0.6 '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -3454,48 +3447,48 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/tour@1.15.1(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.3(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/trigger@2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -3584,6 +3577,8 @@ snapshots: '@types/js-cookie@3.0.6': {} + '@types/json-schema@7.0.15': {} + '@types/node@22.9.0': dependencies: undici-types: 6.19.8 @@ -3609,86 +3604,84 @@ snapshots: dependencies: '@types/node': 22.9.0 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/type-utils': 8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.19.1 + eslint: 9.17.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.6.3) + ts-api-utils: 2.0.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.19.1 debug: 4.3.7 - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.18.0': + '@typescript-eslint/scope-manager@8.19.1': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.6.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 - eslint: 8.57.1 - ts-api-utils: 1.4.0(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.6) + ts-api-utils: 2.0.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.19.1': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.19.1(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 debug: 4.3.7 - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.6.3) + ts-api-utils: 2.0.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) - eslint: 8.57.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.6) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.19.1': dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.19.1 + eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.0': {} - - '@vitejs/plugin-react@4.3.3(vite@5.4.10)': + '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.9.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) @@ -3736,55 +3729,55 @@ snapshots: ansi-styles@6.2.1: {} - antd@5.21.6(react-dom@18.3.1)(react@18.3.1): + antd@5.21.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1)(react@18.3.1) - '@ant-design/cssinjs-utils': 1.1.1(react-dom@18.3.1)(react@18.3.1) - '@ant-design/icons': 5.5.1(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) '@babel/runtime': 7.26.0 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 2.0.1(react-dom@18.3.1)(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/tour': 1.15.1(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.13 - rc-cascader: 3.28.2(react-dom@18.3.1)(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1)(react@18.3.1) - rc-collapse: 3.8.0(react-dom@18.3.1)(react@18.3.1) - rc-dialog: 9.6.0(react-dom@18.3.1)(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1)(react@18.3.1) - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-field-form: 2.4.0(react-dom@18.3.1)(react@18.3.1) - rc-image: 7.11.0(react-dom@18.3.1)(react@18.3.1) - rc-input: 1.6.3(react-dom@18.3.1)(react@18.3.1) - rc-input-number: 9.2.0(react-dom@18.3.1)(react@18.3.1) - rc-mentions: 2.16.1(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-notification: 5.6.2(react-dom@18.3.1)(react@18.3.1) - rc-pagination: 4.3.0(react-dom@18.3.1)(react@18.3.1) - rc-picker: 4.6.15(dayjs@1.11.13)(react-dom@18.3.1)(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) - rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-segmented: 2.5.0(react-dom@18.3.1)(react@18.3.1) - rc-select: 14.15.2(react-dom@18.3.1)(react@18.3.1) - rc-slider: 11.1.7(react-dom@18.3.1)(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) - rc-table: 7.47.5(react-dom@18.3.1)(react@18.3.1) - rc-tabs: 15.3.0(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1)(react@18.3.1) - rc-tooltip: 6.2.1(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1)(react@18.3.1) - rc-tree-select: 5.23.0(react-dom@18.3.1)(react@18.3.1) - rc-upload: 4.8.1(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-cascader: 3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-image: 7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-notification: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 4.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.6.15(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.47.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-upload: 4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -3825,8 +3818,6 @@ snapshots: array-tree-filter@2.1.0: {} - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 @@ -3988,7 +3979,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -4055,20 +4046,12 @@ snapshots: didyoumean@1.2.2: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dlv@1.1.3: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - eastasianwidth@0.2.0: {} electron-to-chromium@1.5.51: {} @@ -4218,19 +4201,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.57.1): + eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@1.21.6)): dependencies: - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.6)): dependencies: - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) - eslint-plugin-react-refresh@0.4.14(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.16(eslint@9.17.0(jiti@1.21.6)): dependencies: - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) - eslint-plugin-react@7.37.2(eslint@8.57.1): + eslint-plugin-react@7.37.2(eslint@9.17.0(jiti@1.21.6)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4238,7 +4221,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 8.57.1 + eslint: 9.17.0(jiti@1.21.6) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4252,53 +4235,53 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-scope@7.2.2: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint-visitor-keys@4.2.0: {} + + eslint@9.17.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.7 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color @@ -4309,11 +4292,11 @@ snapshots: event-emitter: 0.3.5 type: 2.7.3 - espree@9.6.1: + espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.0 esquery@1.6.0: dependencies: @@ -4354,9 +4337,9 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -4367,11 +4350,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.1: {} @@ -4383,7 +4365,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data@4.0.1: @@ -4394,8 +4376,6 @@ snapshots: fraction.js@4.3.7: {} - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -4447,35 +4427,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.0.1 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globrex@0.1.2: {} gopd@1.0.1: @@ -4527,13 +4487,6 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -4608,8 +4561,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -4667,7 +4618,7 @@ snapshots: jiti@1.21.6: {} jotai@2.10.1(@types/react@18.3.12)(react@18.3.1): - dependencies: + optionalDependencies: '@types/react': 18.3.12 react: 18.3.1 @@ -4731,7 +4682,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.408.0(react@18.3.1): + lucide-react@0.469.0(react@18.3.1): dependencies: react: 18.3.1 @@ -4785,8 +4736,9 @@ snapshots: path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 type-fest: 4.26.1 - typescript: 5.6.3 yargs: 17.7.2 + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - '@types/node' @@ -4798,7 +4750,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -4846,10 +4798,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4877,8 +4825,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -4890,8 +4836,6 @@ snapshots: path-to-regexp@6.3.0: {} - path-type@4.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4917,8 +4861,9 @@ snapshots: postcss-load-config@4.0.2(postcss@8.4.47): dependencies: lilconfig: 3.1.2 - postcss: 8.4.47 yaml: 2.6.0 + optionalDependencies: + postcss: 8.4.47 postcss-nested@6.2.0(postcss@8.4.47): dependencies: @@ -4934,18 +4879,19 @@ snapshots: postcss@8.4.47: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3): + prettier-plugin-tailwindcss@0.6.9(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.4.2))(prettier@3.4.2): dependencies: - '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.3.3) - prettier: 3.3.3 + prettier: 3.4.2 + optionalDependencies: + '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.4.2) - prettier@3.3.3: {} + prettier@3.4.2: {} prop-types@15.8.1: dependencies: @@ -4963,321 +4909,322 @@ snapshots: queue-microtask@1.2.3: {} - rc-cascader@3.28.2(react-dom@18.3.1)(react@18.3.1): + rc-cascader@3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): + rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-collapse@3.8.0(react-dom@18.3.1)(react@18.3.1): + rc-collapse@3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dialog@9.6.0(react-dom@18.3.1)(react@18.3.1): + rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): + rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): + rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-field-form@2.4.0(react-dom@18.3.1)(react@18.3.1): + rc-field-form@2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 '@rc-component/async-validator': 5.0.4 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-image@7.11.0(react-dom@18.3.1)(react@18.3.1): + rc-image@7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-dialog: 9.6.0(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input-number@9.2.0(react-dom@18.3.1)(react@18.3.1): + rc-input-number@9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input@1.6.3(react-dom@18.3.1)(react@18.3.1): + rc-input@1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-mentions@2.16.1(react-dom@18.3.1)(react@18.3.1): + rc-mentions@2.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.15.1(react-dom@18.3.1)(react@18.3.1): + rc-menu@9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.3(react-dom@18.3.1)(react@18.3.1): + rc-motion@2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-notification@5.6.2(react-dom@18.3.1)(react@18.3.1): + rc-notification@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): + rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@4.3.0(react-dom@18.3.1)(react@18.3.1): + rc-pagination@4.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-picker@4.6.15(dayjs@1.11.13)(react-dom@18.3.1)(react@18.3.1): + rc-picker@4.6.15(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: dayjs: 1.11.13 - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): + rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): + rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): + rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.5.0(react-dom@18.3.1)(react@18.3.1): + rc-segmented@2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-select@14.15.2(react-dom@18.3.1)(react@18.3.1): + rc-select@14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.15.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-slider@11.1.7(react-dom@18.3.1)(react@18.3.1): + rc-slider@11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): + rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): + rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-table@7.47.5(react-dom@18.3.1)(react@18.3.1): + rc-table@7.47.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.15.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tabs@15.3.0(react-dom@18.3.1)(react@18.3.1): + rc-tabs@15.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-textarea@1.8.2(react-dom@18.3.1)(react@18.3.1): + rc-textarea@1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tooltip@6.2.1(react-dom@18.3.1)(react@18.3.1): + rc-tooltip@6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree-select@5.23.0(react-dom@18.3.1)(react@18.3.1): + rc-tree-select@5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree@5.9.0(react-dom@18.3.1)(react@18.3.1): + rc-tree@5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.15.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-upload@4.8.1(react-dom@18.3.1)(react@18.3.1): + rc-upload@4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): + rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - rc-virtual-list@3.15.0(react-dom@18.3.1)(react@18.3.1): + rc-virtual-list@3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5301,12 +5248,13 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - react-i18next@14.1.3(i18next@23.16.4)(react-dom@18.3.1)(react@18.3.1): + react-i18next@14.1.3(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 html-parse-stringify: 3.0.1 i18next: 23.16.4 react: 18.3.1 + optionalDependencies: react-dom: 18.3.1(react@18.3.1) react-is@16.13.1: {} @@ -5317,20 +5265,22 @@ snapshots: react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1): dependencies: - '@types/react': 18.3.12 react: 18.3.1 react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1): dependencies: - '@types/react': 18.3.12 react: 18.3.1 react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) tslib: 2.8.1 use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 react-responsive@10.0.0(react@18.3.1): dependencies: @@ -5340,7 +5290,7 @@ snapshots: react: 18.3.1 shallow-equal: 3.1.0 - react-router-dom@6.27.0(react-dom@18.3.1)(react@18.3.1): + react-router-dom@6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.20.0 react: 18.3.1 @@ -5352,18 +5302,19 @@ snapshots: '@remix-run/router': 1.20.0 react: 18.3.1 - react-simple-keyboard@3.8.19(react-dom@18.3.1)(react@18.3.1): + react-simple-keyboard@3.8.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1): dependencies: - '@types/react': 18.3.12 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 react@18.3.1: dependencies: @@ -5418,10 +5369,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rollup@4.24.4: dependencies: '@types/estree': 1.0.6 @@ -5510,8 +5457,6 @@ snapshots: signal-exit@4.1.0: {} - slash@3.0.0: {} - source-map-js@1.2.1: {} statuses@2.0.1: {} @@ -5626,8 +5571,6 @@ snapshots: transitivePeerDependencies: - ts-node - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5651,14 +5594,14 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - ts-api-utils@1.4.0(typescript@5.6.3): + ts-api-utils@2.0.0(typescript@5.6.3): dependencies: typescript: 5.6.3 ts-interface-checker@0.1.13: {} tsconfck@3.1.4(typescript@5.6.3): - dependencies: + optionalDependencies: typescript: 5.6.3 tslib@2.8.1: {} @@ -5667,8 +5610,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@4.26.1: {} @@ -5741,16 +5682,18 @@ snapshots: use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1): dependencies: - '@types/react': 18.3.12 react: 18.3.1 tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1): dependencies: - '@types/react': 18.3.12 detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 utf-8-validate@5.0.10: dependencies: @@ -5758,20 +5701,21 @@ snapshots: util-deprecate@1.0.2: {} - vaul@0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1): + vaul@0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@5.4.10): + vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - supports-color @@ -5779,11 +5723,11 @@ snapshots: vite@5.4.10(@types/node@22.9.0): dependencies: - '@types/node': 22.9.0 esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.4 optionalDependencies: + '@types/node': 22.9.0 fsevents: 2.3.3 void-elements@3.1.0: {} @@ -5861,8 +5805,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - y18n@5.0.8: {} yaeti@0.0.6: {} diff --git a/web/src/api/auth.ts b/web/src/api/auth.ts index b0320f0..0741cb6 100644 --- a/web/src/api/auth.ts +++ b/web/src/api/auth.ts @@ -8,6 +8,10 @@ export function login(username: string, password: string) { return http.post('/api/auth/login', data); } +export function getAccount() { + return http.get('/api/auth/account'); +} + export function changePassword(username: string, password: string) { const data = { username, @@ -19,11 +23,3 @@ export function changePassword(username: string, password: string) { export function isPasswordUpdated() { return http.get('/api/auth/password'); } - -export function connectWifi(ssid: string, password: string) { - const data = { - ssid, - password - }; - return http.post('/api/auth/wifi', data); -} diff --git a/web/src/api/network.ts b/web/src/api/network.ts index e1b410e..9a094fc 100644 --- a/web/src/api/network.ts +++ b/web/src/api/network.ts @@ -26,14 +26,24 @@ export function installTailscale() { return http.post('/api/network/tailscale/install'); } +// uninstall tailscale +export function uninstallTailscale() { + return http.post('/api/network/tailscale/uninstall'); +} + // get tailscale status export function getTailscaleStatus() { return http.get('/api/network/tailscale/status'); } -// update tailscale status -export function updateTailscaleStatus(command: 'up' | 'down') { - return http.post('/api/network/tailscale/status', { command }); +// run tailscale up +export function upTailscale() { + return http.post('/api/network/tailscale/up'); +} + +// run tailscale down +export function downTailscale() { + return http.post('/api/network/tailscale/down'); } // login tailscale @@ -50,3 +60,12 @@ export function logoutTailscale() { export function getWiFi() { return http.get('/api/network/wifi'); } + +// connect wifi +export function connectWifi(ssid: string, password: string) { + const data = { + ssid, + password + }; + return http.post('/api/network/wifi', data); +} diff --git a/web/src/api/vm.ts b/web/src/api/vm.ts index 9d9ef26..b984b6d 100644 --- a/web/src/api/vm.ts +++ b/web/src/api/vm.ts @@ -27,3 +27,27 @@ export function updateScreen(type: string, value: number) { }; return http.post('/api/vm/screen', data); } + +// get memory limit +export function getMemoryLimit() { + return http.get('/api/vm/memory/limit'); +} + +// set memory limit +export function setMemoryLimit(enabled: boolean, limit: number) { + const data = { + enabled, + limit + }; + return http.post('/api/vm/memory/limit', data); +} + +// get OLED configuration +export function getOLED() { + return http.get('/api/vm/oled'); +} + +// set OLED configuration +export function setOLED(sleep: number) { + return http.post('/api/vm/oled', { sleep }); +} diff --git a/web/src/assets/images/tailscale.svg b/web/src/assets/images/tailscale.svg new file mode 100644 index 0000000..968323b --- /dev/null +++ b/web/src/assets/images/tailscale.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/web/src/components/icons/tailscale.tsx b/web/src/components/icons/tailscale.tsx new file mode 100644 index 0000000..28dcec1 --- /dev/null +++ b/web/src/components/icons/tailscale.tsx @@ -0,0 +1,5 @@ +import icon from '@/assets/images/tailscale.svg'; + +export const Tailscale = () => { + return tailscale; +}; diff --git a/web/src/i18n/locales/cz.ts b/web/src/i18n/locales/cz.ts index 9e56646..5616199 100644 --- a/web/src/i18n/locales/cz.ts +++ b/web/src/i18n/locales/cz.ts @@ -1,25 +1,11 @@ const cz = { translation: { - language: 'Jazyk', - changePassword: 'Změnit heslo', - logout: 'Odhlásit se', - settings: 'Nastavení', - showMouse: 'Zobrazit kurzor myši', - hideMouse: 'Skrýt kurzor myši', - power: 'Napájení', - reset: 'Resetovat', - powerShort: 'Napájení (krátký stisk)', - powerLong: 'Napájení (dlouhý stisk)', - hddLed: 'HDD LED', - checkLibFailed: 'Nepodařilo se zkontrolovat runtime knihovnu, zkuste to prosím znovu', - updateLibFailed: 'Nepodařilo se aktualizovat runtime knihovnu, zkuste to prosím znovu', - updatingLib: 'Aktualizuji runtime knihovnu. Po dokončení aktualizace prosím obnovte stránku.', - checkForUpdate: 'Zkontrolovat aktualizaci', head: { desktop: 'Vzdálená plocha', login: 'Přihlášení', changePassword: 'Změna hesla', - terminal: 'Terminál' + terminal: 'Terminál', + wifi: 'Wi-Fi' }, auth: { login: 'Přihlášení', @@ -39,14 +25,28 @@ const cz = { illegalUsername: 'Uživatelské jméno obsahuje nepovolené znaky', illegalPassword: 'Heslo obsahuje nepovolené znaky', forgetPassword: 'Zapomenuté heslo', - resetPassword: 'Resetovat heslo', - reset1: 'Pokud jste zapomněli heslo, postupujte podle následujících kroků pro reset:', - reset2: '1. Přihlaste se k zařízení NanoKVM pomocí SSH;', - reset3: '2. Smažte soubor v zařízení: ', - reset4: '3. Přihlaste se pomocí výchozího účtu: ', ok: 'OK', cancel: 'Zrušit', - loginButtonText: 'Přihlášení' + loginButtonText: 'Přihlášení', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Režim videa', @@ -132,60 +132,113 @@ const cz = { confirm: 'OK' }, wol: { + title: 'Wake-on-LAN', sending: 'Odesílání příkazu...', sent: 'Příkaz odeslán', input: 'Zadejte prosím MAC adresu', ok: 'OK' }, - about: { - title: 'O NanoKVM', - information: 'Informace', - ip: 'IP', - mdns: 'mDNS', - application: 'Verze aplikace', - image: 'Verze obrazu', - deviceKey: 'Klíč zařízení', - queryFailed: 'Dotaz se nezdařil', - community: 'Komunita' + power: { + title: 'Napájení', + reset: 'Resetovat', + power: 'Napájení', + powerShort: 'Napájení (krátký stisk)', + powerLong: 'Napájení (dlouhý stisk)' }, - update: { - title: 'Zkontrolovat aktualizaci', - queryFailed: 'Nepodařilo se získat verzi', - updateFailed: 'Aktualizace se nezdařila. Zkuste to prosím znovu.', - isLatest: 'Máte nejnovější verzi.', - available: 'Je dostupná aktualizace. Opravdu chcete aktualizovat?', - updating: 'Aktualizace zahájena. Prosím čekejte...', - confirm: 'Potvrdit', - cancel: 'Zrušit' - }, - virtualDevice: { - network: 'Virtuální síť', - disk: 'Virtuální disk' - }, - tailscale: { - loading: 'Načítání...', - notInstall: 'Tailscale nebyl nalezen! Prosím nainstalujte.', - install: 'Nainstalovat', - installing: 'Instalace probíhá', - failed: 'Instalace se nezdařila', - retry: 'Obnovte stránku a zkuste to znovu. Nebo zkuste instalaci manuálně', - download: 'Stáhnout', - package: 'instalační balíček', - unzip: 'a rozbalit ho', - upTailscale: 'Nahrajte Tailscale do adresáře NanoKVM /usr/bin/', - upTailscaled: 'Nahrajte Tailscaled do adresáře NanoKVM /usr/sbin/', - refresh: 'Obnovit stránku', - notLogin: - 'Zařízení nebylo dosud spárováno. Přihlaste se prosím a spárujte toto zařízení s vaším účtem.', - urlPeriod: 'Tento odkaz je platný po dobu 10 minut', - login: 'Přihlášení', - loginSuccess: 'Přihlášení úspěšné', - enable: 'Povolit Tailscale', - deviceName: 'Název zařízení', - deviceIP: 'IP zařízení', - account: 'Účet', - logout: 'Odhlásit se', - logout2: 'Opravdu se chcete odhlásit?' + settings: { + title: 'Nastavení', + about: { + title: 'O NanoKVM', + information: 'Informace', + ip: 'IP', + mdns: 'mDNS', + application: 'Verze aplikace', + applicationTip: 'NanoKVM web application version', + image: 'Verze obrazu', + imageTip: 'NanoKVM system image version', + deviceKey: 'Klíč zařízení', + community: 'Komunita' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Jazyk', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Načítání...', + notInstall: 'Tailscale nebyl nalezen! Prosím nainstalujte.', + install: 'Nainstalovat', + installing: 'Instalace probíhá', + failed: 'Instalace se nezdařila', + retry: 'Obnovte stránku a zkuste to znovu. Nebo zkuste instalaci manuálně', + download: 'Stáhnout', + package: 'instalační balíček', + unzip: 'a rozbalit ho', + upTailscale: 'Nahrajte Tailscale do adresáře NanoKVM /usr/bin/', + upTailscaled: 'Nahrajte Tailscaled do adresáře NanoKVM /usr/sbin/', + refresh: 'Obnovit stránku', + notLogin: + 'Zařízení nebylo dosud spárováno. Přihlaste se prosím a spárujte toto zařízení s vaším účtem.', + urlPeriod: 'Tento odkaz je platný po dobu 10 minut', + login: 'Přihlášení', + loginSuccess: 'Přihlášení úspěšné', + enable: 'Povolit Tailscale', + deviceName: 'Název zařízení', + deviceIP: 'IP zařízení', + account: 'Účet', + logout: 'Odhlásit se', + logout2: 'Opravdu se chcete odhlásit?' + }, + update: { + title: 'Zkontrolovat aktualizaci', + queryFailed: 'Nepodařilo se získat verzi', + updateFailed: 'Aktualizace se nezdařila. Zkuste to prosím znovu.', + isLatest: 'Máte nejnovější verzi.', + available: 'Je dostupná aktualizace. Opravdu chcete aktualizovat?', + updating: 'Aktualizace zahájena. Prosím čekejte...', + confirm: 'Potvrdit', + cancel: 'Zrušit' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/da.ts b/web/src/i18n/locales/da.ts index fa3cb6f..c941151 100644 --- a/web/src/i18n/locales/da.ts +++ b/web/src/i18n/locales/da.ts @@ -1,25 +1,11 @@ const da = { translation: { - language: 'Sprog', - changePassword: 'Skift adgangskode', - logout: 'Log ud', - settings: 'Indstillinger', - showMouse: 'Vis mus', - hideMouse: 'Skjul mus', - power: 'Tænd/sluk-knap', - reset: 'Nulstillingsknap', - powerShort: 'Tænd/sluk-knap (kort tryk)', - powerLong: 'Tænd/sluk-knap (langt tryk)', - hddLed: 'HDD lysdiode', - checkLibFailed: 'Kunne ikke kontrollere runtime-biblioteket. Prøv igen', - updateLibFailed: 'Kunne ikke opdatere runtime-biblioteket. Prøv igen', - updatingLib: 'Opdaterer runtime-biblioteket. Opdater siden efter opdateringen.', - checkForUpdate: 'Kontroller for opdatering', head: { desktop: 'Fjernskrivebord', login: 'Log ind', changePassword: 'Skift adgangskode', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Log ind', @@ -38,14 +24,28 @@ const da = { illegalUsername: 'brugernavn indeholder ugyldige tegn', illegalPassword: 'adgangskode indeholder ugyldige tegn', forgetPassword: 'Glem adgangskode', - resetPassword: 'Nulstil adgangskode', - reset1: 'Hvis du har glemt adgangskoden, kan du følge disse trin for at nulstille den:', - reset2: '1. Log ind på din NanoKVM via SSH.', - reset3: '2. Slet filen på enheden: ', - reset4: '3. Brug standardkontoen til at logge ind: ', ok: 'OK', cancel: 'Annuller', - loginButtonText: 'Log ind' + loginButtonText: 'Log ind', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Videotilstand', @@ -130,60 +130,113 @@ const da = { confirm: 'OK' }, wol: { + title: 'Wake-on-LAN', sending: 'Sender Wake-on-LAN magic packet', sent: 'Wake-on-LAN magic packet sendt', input: 'Angiv MAC-adresse', ok: 'OK' }, - about: { - title: 'Om NanoKVM', - information: 'Information', - ip: 'IP', - mdns: 'mDNS', - application: 'Program version', - image: 'Firmware version', - deviceKey: 'Enhedsnøgle', - queryFailed: 'Forespørgsel mislykkedes', - community: 'Fællesskab' + power: { + title: 'Tænd/sluk-knap', + reset: 'Nulstillingsknap', + power: 'Tænd/sluk-knap', + powerShort: 'Tænd/sluk-knap (kort tryk)', + powerLong: 'Tænd/sluk-knap (langt tryk)' }, - update: { - title: 'Kontroller for opdatering', - queryFailed: 'Opdateringskontrol mislykkedes', - updateFailed: 'Opdatering fejlede. Prøv igen.', - isLatest: 'Du har allerede den nyeste version.', - available: 'En opdatering er tilgængelig. Vil du installere den?', - updating: 'Opdatering i gang. Vent venligst...', - confirm: 'Bekræft', - cancel: 'Annuller' - }, - virtualDevice: { - network: 'Virtuelt netværk', - disk: 'Virtuel disk' - }, - tailscale: { - loading: 'Indlæser...', - notInstall: 'Tailscale ikke fundet! Installer det for at fuldføre opsætningen.', - install: 'Installer', - installing: 'Installerer', - failed: 'Installation mislykkedes', - retry: 'Opdater siden og prøv igen. Ellers prøv at installere manuelt.', - download: 'Download', - package: 'installationspakken', - unzip: 'og udpak den', - upTailscale: 'Upload tailscale til følgende mappe på enheden: /usr/bin/', - upTailscaled: 'Upload tailscaled til følgende mappe på enheden: /usr/sbin/', - refresh: 'Opdater sides', - notLogin: - 'Enheden er ikke tilknyttet en Tailscale-konto endnu. Log ind for at fuldføre tilknytningen til din konto.', - urlPeriod: 'Denne URL er gyldig i 10 minutter', - login: 'Log ind', - loginSuccess: 'Log ind lykkedes', - enable: 'Aktiver Tailscale', - deviceName: 'Enhedens navn', - deviceIP: 'Enhedens IP', - account: 'Konto', - logout: 'Log ud', - logout2: 'Er du sikker på at du vil logge ud?' + settings: { + title: 'Settings', + about: { + title: 'Om NanoKVM', + information: 'Information', + ip: 'IP', + mdns: 'mDNS', + application: 'Program version', + applicationTip: 'NanoKVM web application version', + image: 'Firmware version', + imageTip: 'NanoKVM system image version', + deviceKey: 'Enhedsnøgle', + community: 'Fællesskab' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Indlæser...', + notInstall: 'Tailscale ikke fundet! Installer det for at fuldføre opsætningen.', + install: 'Installer', + installing: 'Installerer', + failed: 'Installation mislykkedes', + retry: 'Opdater siden og prøv igen. Ellers prøv at installere manuelt.', + download: 'Download', + package: 'installationspakken', + unzip: 'og udpak den', + upTailscale: 'Upload tailscale til følgende mappe på enheden: /usr/bin/', + upTailscaled: 'Upload tailscaled til følgende mappe på enheden: /usr/sbin/', + refresh: 'Opdater sides', + notLogin: + 'Enheden er ikke tilknyttet en Tailscale-konto endnu. Log ind for at fuldføre tilknytningen til din konto.', + urlPeriod: 'Denne URL er gyldig i 10 minutter', + login: 'Log ind', + loginSuccess: 'Log ind lykkedes', + enable: 'Aktiver Tailscale', + deviceName: 'Enhedens navn', + deviceIP: 'Enhedens IP', + account: 'Konto', + logout: 'Log ud', + logout2: 'Er du sikker på at du vil logge ud?' + }, + update: { + title: 'Kontroller for opdatering', + queryFailed: 'Opdateringskontrol mislykkedes', + updateFailed: 'Opdatering fejlede. Prøv igen.', + isLatest: 'Du har allerede den nyeste version.', + available: 'En opdatering er tilgængelig. Vil du installere den?', + updating: 'Opdatering i gang. Vent venligst...', + confirm: 'Bekræft', + cancel: 'Annuller' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/de.ts b/web/src/i18n/locales/de.ts index a631e4f..a628022 100644 --- a/web/src/i18n/locales/de.ts +++ b/web/src/i18n/locales/de.ts @@ -1,26 +1,11 @@ const de = { translation: { - language: 'Sprache', - changePassword: 'Passwort ändern', - logout: 'Ausloggen', - settings: 'Einstellungen', - showMouse: 'Mauszeiger anzeigen', - hideMouse: 'Mauszeiger verstecken', - power: 'Einschalten', - reset: 'Neustart', - powerShort: 'Einschalten (Kurzes Drücken)', - powerLong: 'Einschalten (Langes Drücken)', - hddLed: 'Festplatten-LED', - checkLibFailed: 'Überprüfung der Laufzeitbibliothek fehlgeschlagen, bitte erneut versuchen.', - updateLibFailed: - 'Aktualisierung der Laufzeitbibliothek fehlgeschlagen, bitte erneut versuchen.', - updatingLib: 'Aktualiserung der Laufzeitbibliothek. Bitte nach dem Update die Seite neu laden.', - checkForUpdate: 'Nach Update suchen', head: { desktop: 'Entfernter Desktop', login: 'Einloggen', changePassword: 'Passwort ändern', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Einloggen', @@ -40,15 +25,28 @@ const de = { illegalUsername: 'Benutzername beinhaltet ungültige Zeichen', illegalPassword: 'Passwort beinhaltet ungültige Zeichen', forgetPassword: 'Passwort vergessen', - resetPassword: 'Password zurücksetzen', - reset1: - 'Falls sie das Passwort vergessen haben, führen sie folgende Schritte durch um dieses zurückzusetzen:', - reset2: '1. In das NanoKVM via SSH einloggen;', - reset3: '2. Die Datei auf dem Gerät löschen: ', - reset4: '3. Den Standardaccount zum Einloggen benutzen: ', ok: 'Ok', cancel: 'Abbrechen', - loginButtonText: 'Einloggen' + loginButtonText: 'Einloggen', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Videomodus', @@ -134,62 +132,115 @@ const de = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Befehl senden...', sent: 'Befehl gesendet', input: 'Bitte die MAC eingeben', ok: 'Ok' }, - about: { - title: 'Über NanoKVM', - information: 'Information', - ip: 'IP', - mdns: 'mDNS', - application: 'Versionsnummer', - image: 'Image Version', - deviceKey: 'Geräte-Key', - queryFailed: 'Anfrage gescheitert', - community: 'Community' + power: { + title: 'Einschalten', + reset: 'Neustart', + power: 'Einschalten', + powerShort: 'Einschalten (Kurzes Drücken)', + powerLong: 'Einschalten (Langes Drücken)' }, - update: { - title: 'Nach neuem Update suchen', - queryFailed: 'Versionsnummer konnte nicht erkannt werden', - updateFailed: 'Update gescheitert. Bitte versuchen sie es erneut.', - isLatest: 'Die aktuelle Version ist bereits installiert.', - available: - 'Ein Update ist verfügbar. Sind sie sicher, dass sie diese Version aktualisieren möchten?', - updating: 'Update wird gestartet. Bitte warten...', - confirm: 'Bestätigen', - cancel: 'Abbrechen' - }, - virtualDevice: { - network: 'Virtuelles Netzwerk', - disk: 'Virtuelle Festplatte' - }, - tailscale: { - loading: 'Lade...', - notInstall: 'Tailscale wurde nicht gefunden! Bitte installieren.', - install: 'Installieren', - installing: 'Installation wird durchgeführt', - failed: 'Installation gescheitert', - retry: - 'Bitte neu laden und noch einmal versuchen. Oder versuchen sie Tailscale manuell zu installieren', - download: 'Laden sie das', - package: 'Installationspaket', - unzip: 'und entpacken sie es manuell', - upTailscale: 'Hochladen von tailscale in das NanoKVM Verzeichnis /usr/bin/', - upTailscaled: 'Hochladen von tailscaled in das NanoKVM Verzeichnis /usr/sbin/', - refresh: 'Die aktuelle Seite neu laden', - notLogin: - 'Diese Geräte ist bisher noch nicht verknüpft. Bitte loggen sie sich in ihr Konto ein und verknüpfen sie dieses Gerät mit diesem.', - urlPeriod: 'Diese URL ist für 10 Minuten gültig', - login: 'Einloggen', - loginSuccess: 'Das Einloggen war erfolgreich', - enable: 'Tailscale aktivieren', - deviceName: 'Name des Geräts', - deviceIP: 'Geräte-IP', - account: 'Benutzerkonto', - logout: 'Ausloggen', - logout2: 'Wollen Sie sich wirklich ausloggen?' + settings: { + title: 'Settings', + about: { + title: 'Über NanoKVM', + information: 'Information', + ip: 'IP', + mdns: 'mDNS', + application: 'Versionsnummer', + applicationTip: 'NanoKVM web application version', + image: 'Image Version', + imageTip: 'NanoKVM system image version', + deviceKey: 'Geräte-Key', + community: 'Community' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Lade...', + notInstall: 'Tailscale wurde nicht gefunden! Bitte installieren.', + install: 'Installieren', + installing: 'Installation wird durchgeführt', + failed: 'Installation gescheitert', + retry: + 'Bitte neu laden und noch einmal versuchen. Oder versuchen sie Tailscale manuell zu installieren', + download: 'Laden sie das', + package: 'Installationspaket', + unzip: 'und entpacken sie es manuell', + upTailscale: 'Hochladen von tailscale in das NanoKVM Verzeichnis /usr/bin/', + upTailscaled: 'Hochladen von tailscaled in das NanoKVM Verzeichnis /usr/sbin/', + refresh: 'Die aktuelle Seite neu laden', + notLogin: + 'Diese Geräte ist bisher noch nicht verknüpft. Bitte loggen sie sich in ihr Konto ein und verknüpfen sie dieses Gerät mit diesem.', + urlPeriod: 'Diese URL ist für 10 Minuten gültig', + login: 'Einloggen', + loginSuccess: 'Das Einloggen war erfolgreich', + enable: 'Tailscale aktivieren', + deviceName: 'Name des Geräts', + deviceIP: 'Geräte-IP', + account: 'Benutzerkonto', + logout: 'Ausloggen', + logout2: 'Wollen Sie sich wirklich ausloggen?' + }, + update: { + title: 'Nach neuem Update suchen', + queryFailed: 'Versionsnummer konnte nicht erkannt werden', + updateFailed: 'Update gescheitert. Bitte versuchen sie es erneut.', + isLatest: 'Die aktuelle Version ist bereits installiert.', + available: + 'Ein Update ist verfügbar. Sind sie sicher, dass sie diese Version aktualisieren möchten?', + updating: 'Update wird gestartet. Bitte warten...', + confirm: 'Bestätigen', + cancel: 'Abbrechen' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/en.ts b/web/src/i18n/locales/en.ts index 440dc09..f7e1a19 100644 --- a/web/src/i18n/locales/en.ts +++ b/web/src/i18n/locales/en.ts @@ -1,25 +1,11 @@ const en = { translation: { - language: 'Language', - changePassword: 'Change Password', - logout: 'Logout', - settings: 'Settings', - showMouse: 'Show mouse', - hideMouse: 'Hide mouse', - power: 'Power', - reset: 'Reset', - powerShort: 'Power (short click)', - powerLong: 'Power (long click)', - hddLed: 'HDD LED', - checkLibFailed: 'Failed to check runtime library, please try again', - updateLibFailed: 'Failed to update runtime library, please try again', - updatingLib: 'Updating runtime library. Please refresh the page after updating.', - checkForUpdate: 'Check for Update', head: { desktop: 'Remote Desktop', login: 'Login', changePassword: 'Change Password', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Login', @@ -32,19 +18,33 @@ const en = { invalidUser: 'Invalid username or password', error: 'Unexpected error', changePassword: 'Change Password', - changePasswordDesc: 'For the security of your device, please modify the web login password.', + changePasswordDesc: 'For the security of your device, please change the password!', differentPassword: 'Passwords do not match', illegalUsername: 'Username contains illegal characters', illegalPassword: 'Password contains illegal characters', forgetPassword: 'Forgot Password', - resetPassword: 'Reset Password', - reset1: 'If you have forgotten the password, please follow the steps to reset it:', - reset2: '1. Login to the NanoKVM device via SSH;', - reset3: '2. Delete the file in the device: ', - reset4: '3. Use the default account to login: ', ok: 'Ok', cancel: 'Cancel', loginButtonText: 'Login', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Video Mode', @@ -84,7 +84,7 @@ const en = { resetHid: 'Reset HID' }, image: { - title: 'Images', + title: 'Image', loading: 'Loading...', empty: 'Nothing Found', mountFailed: 'Mount Failed', @@ -129,60 +129,113 @@ const en = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Sending command...', sent: 'Command sent', input: 'Please enter the MAC', ok: 'Ok' }, - about: { - title: 'About NanoKVM', - information: 'Information', - ip: 'IP', - mdns: 'mDNS', - application: 'Application Version', - image: 'Image Version', - deviceKey: 'Device Key', - queryFailed: 'Query failed', - community: 'Community' + power: { + title: 'Power', + reset: 'Reset', + power: 'Power', + powerShort: 'Power (short click)', + powerLong: 'Power (long click)' }, - update: { - title: 'Check for Update', - queryFailed: 'Get version failed', - updateFailed: 'Update failed. Please retry.', - isLatest: 'You already have the latest version.', - available: 'An update is available. Are you sure to update?', - updating: 'Update started. Please wait...', - confirm: 'Confirm', - cancel: 'Cancel' - }, - virtualDevice: { - network: 'Virtual Network', - disk: 'Virtual Disk' - }, - tailscale: { - loading: 'Loading...', - notInstall: 'Tailscale not found! Please install.', - install: 'Install', - installing: 'Installing', - failed: 'Install failed', - retry: 'Please refresh and try again. Or try to install manually', - download: 'Download the', - package: 'installation package', - unzip: 'and unzip it', - upTailscale: 'Upload tailscale to NanoKVM directory /usr/bin/', - upTailscaled: 'Upload tailscaled to NanoKVM directory /usr/sbin/', - refresh: 'Refresh current page', - notLogin: - 'The device has not been bound yet. Please login and bind this device to your account.', - urlPeriod: 'This url is valid for 10 minutes', - login: 'Login', - loginSuccess: 'Login Success', - enable: 'Enable Tailscale', - deviceName: 'Device Name', - deviceIP: 'Device IP', - account: 'Account', - logout: 'Logout', - logout2: 'Sure to logout?' + settings: { + title: 'Settings', + about: { + title: 'About NanoKVM', + information: 'Information', + ip: 'IP', + mdns: 'mDNS', + application: 'Application Version', + applicationTip: 'NanoKVM web application version', + image: 'Image Version', + imageTip: 'NanoKVM system image version', + deviceKey: 'Device Key', + community: 'Community' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Loading...', + notInstall: 'Tailscale not found! Please install.', + install: 'Install', + installing: 'Installing', + failed: 'Install failed', + retry: 'Please refresh and try again. Or try to install manually', + download: 'Download the', + package: 'installation package', + unzip: 'and unzip it', + upTailscale: 'Upload tailscale to NanoKVM directory /usr/bin/', + upTailscaled: 'Upload tailscaled to NanoKVM directory /usr/sbin/', + refresh: 'Refresh current page', + notLogin: + 'The device has not been bound yet. Please login and bind this device to your account.', + urlPeriod: 'This url is valid for 10 minutes', + login: 'Login', + loginSuccess: 'Login Success', + enable: 'Enable Tailscale', + deviceName: 'Device Name', + deviceIP: 'Device IP', + account: 'Account', + logout: 'Logout', + logout2: 'Sure to logout?' + }, + update: { + title: 'Check for Updates', + queryFailed: 'Get version failed', + updateFailed: 'Update failed. Please retry.', + isLatest: 'You already have the latest version.', + available: 'An update is available. Are you sure to update?', + updating: 'Update started. Please wait...', + confirm: 'Confirm', + cancel: 'Cancel' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/es.ts b/web/src/i18n/locales/es.ts index 971719b..fdd8afc 100644 --- a/web/src/i18n/locales/es.ts +++ b/web/src/i18n/locales/es.ts @@ -1,25 +1,11 @@ const en = { translation: { - language: 'Idioma', - changePassword: 'Cambiar contraseña', - logout: 'Cerrar sesión', - settings: 'Ajustes', - showMouse: 'Mostrar ratón', - hideMouse: 'Ocultar ratón', - power: 'Encender / Apagar', - reset: 'Reiniciar', - powerShort: 'Encender / Apagar (pulsación corta)', - powerLong: 'Encender / Apagar (pulsación larga)', - hddLed: 'LED HDD', - checkLibFailed: 'Error al comprobar la aplicación. Por favor, vuelve a intentarlo.', - updateLibFailed: 'Error al comprobar la aplicación. Por favor, vuelve a intentarlo.', - updatingLib: 'Actualizando aplicación. Por favor, recarga la página después de actualizar.', - checkForUpdate: 'Comprobar actualizaciones', head: { desktop: 'Escritorio remoto', login: 'Inicio de sesión', changePassword: 'Cambiar contraseña', - terminal: 'Consola' + terminal: 'Consola', + wifi: 'Wi-Fi' }, auth: { login: 'Iniciar sesión', @@ -39,15 +25,28 @@ const en = { illegalUsername: 'El usuario contiene caracteres no permitidos', illegalPassword: 'La contraseña contiene caracteres no permitidos', forgetPassword: 'Contraseña olvidada', - resetPassword: 'Reiniciar contraseña', - reset1: - 'Si has olvidado tu contraseña, por favor, sigue los siguientes pasos para recuperarla:', - reset2: '1. Inicia sesión en el dispositivo NanoKVM a través de SSH', - reset3: '2. Elimina este archivo en el dispositivo: ', - reset4: '3. Utiliza la cuenta por defecto para iniciar sesión: ', ok: 'Aceptar', cancel: 'Cancelar', - loginButtonText: 'Iniciar sesión' + loginButtonText: 'Iniciar sesión', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Modo de vídeo', @@ -133,61 +132,114 @@ const en = { confirm: 'Confirmar' }, wol: { + title: 'Wake-on-LAN', sending: 'Enviando comando...', sent: 'Comando enviado', input: 'Por favor, introduce la dirección MAC', ok: 'Vale' }, - about: { - title: 'Sobre NanoKVM', - information: 'Información', - ip: 'IP', - mdns: 'mDNS', - application: 'Versión de la aplicación', - image: 'Versión de la imagen', - deviceKey: 'Clave del dispositivo', - queryFailed: 'Consulta fallida', - community: 'Comunidad' + power: { + title: 'Encender / Apagar', + reset: 'Reiniciar', + power: 'Encender / Apagar', + powerShort: 'Encender / Apagar (pulsación corta)', + powerLong: 'Encender / Apagar (pulsación larga)' }, - update: { - title: 'Buscar actualizaciones', - queryFailed: 'Error al obtener la versión', - updateFailed: 'La actualización falló. Por favor, inténtalo de nuevo.', - isLatest: 'Ya tienes la última versión.', - available: 'Hay una actualización disponible. ¿Estás seguro de que quieres actualizar?', - updating: 'Actualización iniciada. Por favor, espera...', - confirm: 'Confirmar', - cancel: 'Cancelar' - }, - virtualDevice: { - network: 'Red Virtual', - disk: 'Disco Virtual' - }, - tailscale: { - loading: 'Cargando...', - notInstall: '¡Tailscale no encontrado! Por favor, instálalo.', - install: 'Instalar', - installing: 'Instalando', - failed: 'La instalación falló', - retry: - 'Por favor, actualiza la página e inténtalo de nuevo. O intenta instalarlo manualmente', - download: 'Descargar el', - package: 'paquete de instalación', - unzip: 'y descomprimirlo', - upTailscale: 'Sube tailscale al directorio /usr/bin/ del NanoKVM', - upTailscaled: 'Sube tailscaled al directorio /usr/sbin/ del NanoKVM', - refresh: 'Actualizar la página actual', - notLogin: - 'El dispositivo aún no ha sido vinculado. Por favor, inicia sesión y vincula este dispositivo a tu cuenta.', - urlPeriod: 'Esta URL es válida por 10 minutos', - login: 'Iniciar sesión', - loginSuccess: 'Inicio de sesión exitoso', - enable: 'Habilitar Tailscale', - deviceName: 'Nombre del dispositivo', - deviceIP: 'IP del dispositivo', - account: 'Cuenta', - logout: 'Cerrar sesión', - logout2: '¿Seguro que quieres cerrar sesión?' + settings: { + title: 'Settings', + about: { + title: 'Sobre NanoKVM', + information: 'Información', + ip: 'IP', + mdns: 'mDNS', + application: 'Versión de la aplicación', + applicationTip: 'NanoKVM web application version', + image: 'Versión de la imagen', + imageTip: 'NanoKVM system image version', + deviceKey: 'Clave del dispositivo', + community: 'Comunidad' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Cargando...', + notInstall: '¡Tailscale no encontrado! Por favor, instálalo.', + install: 'Instalar', + installing: 'Instalando', + failed: 'La instalación falló', + retry: + 'Por favor, actualiza la página e inténtalo de nuevo. O intenta instalarlo manualmente', + download: 'Descargar el', + package: 'paquete de instalación', + unzip: 'y descomprimirlo', + upTailscale: 'Sube tailscale al directorio /usr/bin/ del NanoKVM', + upTailscaled: 'Sube tailscaled al directorio /usr/sbin/ del NanoKVM', + refresh: 'Actualizar la página actual', + notLogin: + 'El dispositivo aún no ha sido vinculado. Por favor, inicia sesión y vincula este dispositivo a tu cuenta.', + urlPeriod: 'Esta URL es válida por 10 minutos', + login: 'Iniciar sesión', + loginSuccess: 'Inicio de sesión exitoso', + enable: 'Habilitar Tailscale', + deviceName: 'Nombre del dispositivo', + deviceIP: 'IP del dispositivo', + account: 'Cuenta', + logout: 'Cerrar sesión', + logout2: '¿Seguro que quieres cerrar sesión?' + }, + update: { + title: 'Buscar actualizaciones', + queryFailed: 'Error al obtener la versión', + updateFailed: 'La actualización falló. Por favor, inténtalo de nuevo.', + isLatest: 'Ya tienes la última versión.', + available: 'Hay una actualización disponible. ¿Estás seguro de que quieres actualizar?', + updating: 'Actualización iniciada. Por favor, espera...', + confirm: 'Confirmar', + cancel: 'Cancelar' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/fr.ts b/web/src/i18n/locales/fr.ts index 9609022..b8b14ff 100644 --- a/web/src/i18n/locales/fr.ts +++ b/web/src/i18n/locales/fr.ts @@ -1,26 +1,11 @@ const fr = { translation: { - language: 'Langue', - changePassword: 'Changer le mot de passe', - logout: 'Déconnexion', - settings: 'Réglages', - showMouse: 'Afficher la souris', - hideMouse: 'Masquer la souris', - power: 'Power', - reset: 'Reset', - powerShort: 'Power (appui court)', - powerLong: 'Power (appui long)', - hddLed: 'HDD LED', - checkLibFailed: "Impossible de vérifier la bibliothèque d'exécution, veuillez réessayer", - updateLibFailed: "Impossible de mettre à jour la bibliothèque d'exécution, veuillez réessayer", - updatingLib: - "Mise à jour de la bibliothèque d'exécution. Veuillez rafraîchir la page après la mise à jour.", - checkForUpdate: 'Chercher des mises à jour', head: { desktop: 'Bureau à distance', login: 'Connexion', changePassword: 'Changer le mot de passe', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Connexion', @@ -40,15 +25,28 @@ const fr = { illegalUsername: "Le nom d'utilisateur contient des caractères illégaux", illegalPassword: 'Le mot de passe contient des caractères illégaux', forgetPassword: 'Mot de passe oublié', - resetPassword: 'Réinitialiser le mot de passe', - reset1: - 'Si vous avez oublié le mot de passe, veuillez suivre les étapes pour le réinitialiser:', - reset2: "1. Connectez-vous à l'appareil NanoKVM via SSH;", - reset3: "2. Supprimez le fichier de l'appareil: ", - reset4: '3. Utilisez le compte par défaut pour vous connecter: ', ok: 'Se connecter', cancel: 'Annuler', - loginButtonText: 'Connexion' + loginButtonText: 'Connexion', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Mode vidéo', @@ -134,59 +132,112 @@ const fr = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Envoi de la commande...', sent: 'Commande envoyée', input: "Veuillez entrer l'adresse MAC", ok: 'Ok' }, - about: { - title: 'A propos de NanoKVM', - information: 'Informations', - ip: 'IP', - mdns: 'mDNS', - application: "Version de l'application", - image: "Version de l'image", - deviceKey: "Clé de l'appareil", - queryFailed: 'Echec de la requête', - community: 'Communauté' + power: { + title: 'Power', + reset: 'Reset', + power: 'Power', + powerShort: 'Power (appui court)', + powerLong: 'Power (appui long)' }, - update: { - title: 'Vérifier les mises à jour', - queryFailed: 'Impossible de vérifier les mises à jour. Veuillez réessayer.', - updateFailed: 'Mis à jour échouée. Veuillez réessayer.', - isLatest: 'Vous avez déjà la dernière version.', - available: 'Une mise à jour est disponible. Voulez-vous vraiment mettre à jour?', - updating: 'Mise à jour en cours. Veuillez patienter...', - confirm: 'Confirmer', - cancel: 'Annuler' - }, - virtualDevice: { - network: 'carte réseau virtuelle', - disk: 'disque virtuel' - }, - tailscale: { - loading: 'Chargement...', - notInstall: "Tailscale non trouvé! Veuillez l'installer.", - install: 'Installer', - installing: 'Installation', - failed: 'Installation échouée', - retry: "Veuillez rafraîchir et réessayer. Ou essayez d'installer manuellement", - download: 'Télécharger le', - package: 'installation package', - unzip: 'et décompressez-le', - upTailscale: 'Téléverser tailscale dans le répertoire NanoKVM /usr/sbin/', - upTailscaled: 'Téléverser tailscaled dans le répertoire NanoKVM /usr/sbin/', - refresh: 'Rafraîchir la page courante', - notLogin: "L'appareil n'est pas relié. Connectez-vous et liez cet appareil à votre compte.", - urlPeriod: "L'URL est valide pendant 10 minutes", - login: 'Connexion', - loginSuccess: 'Connexion réussie', - enable: 'Démarrer Tailscale', - deviceName: "Nom de l'appareil", - deviceIP: "IP de l'appareil", - account: 'Compte', - logout: 'Déconnexion', - logout2: 'Voulez-vous vous déconnecter?' + settings: { + title: 'Settings', + about: { + title: 'A propos de NanoKVM', + information: 'Informations', + ip: 'IP', + mdns: 'mDNS', + application: "Version de l'application", + applicationTip: 'NanoKVM web application version', + image: "Version de l'image", + imageTip: 'NanoKVM system image version', + deviceKey: "Clé de l'appareil", + community: 'Communauté' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Chargement...', + notInstall: "Tailscale non trouvé! Veuillez l'installer.", + install: 'Installer', + installing: 'Installation', + failed: 'Installation échouée', + retry: "Veuillez rafraîchir et réessayer. Ou essayez d'installer manuellement", + download: 'Télécharger le', + package: 'installation package', + unzip: 'et décompressez-le', + upTailscale: 'Téléverser tailscale dans le répertoire NanoKVM /usr/sbin/', + upTailscaled: 'Téléverser tailscaled dans le répertoire NanoKVM /usr/sbin/', + refresh: 'Rafraîchir la page courante', + notLogin: "L'appareil n'est pas relié. Connectez-vous et liez cet appareil à votre compte.", + urlPeriod: "L'URL est valide pendant 10 minutes", + login: 'Connexion', + loginSuccess: 'Connexion réussie', + enable: 'Démarrer Tailscale', + deviceName: "Nom de l'appareil", + deviceIP: "IP de l'appareil", + account: 'Compte', + logout: 'Déconnexion', + logout2: 'Voulez-vous vous déconnecter?' + }, + update: { + title: 'Vérifier les mises à jour', + queryFailed: 'Impossible de vérifier les mises à jour. Veuillez réessayer.', + updateFailed: 'Mis à jour échouée. Veuillez réessayer.', + isLatest: 'Vous avez déjà la dernière version.', + available: 'Une mise à jour est disponible. Voulez-vous vraiment mettre à jour?', + updating: 'Mise à jour en cours. Veuillez patienter...', + confirm: 'Confirmer', + cancel: 'Annuler' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/hu.ts b/web/src/i18n/locales/hu.ts index a27f299..062072e 100644 --- a/web/src/i18n/locales/hu.ts +++ b/web/src/i18n/locales/hu.ts @@ -1,26 +1,11 @@ const hu = { translation: { - language: 'Nyelv', - changePassword: 'Jelszó megváltoztatása', - logout: 'Kijelentkezés', - settings: 'Beállítások', - showMouse: 'Egér mutatása', - hideMouse: 'Egér elrejtése', - power: 'Bekapcsolás', - reset: 'Újraindítás', - powerShort: 'Bekapcsolás (rövid kattintás)', - powerLong: 'Bekapcsolás (hosszú kattintás)', - hddLed: 'HDD LED', - checkLibFailed: 'Nem sikerült ellenőrizni a futási könyvtárat, próbálja újra', - updateLibFailed: 'Nem sikerült frissíteni a futási könyvtárat, próbálja újra', - updatingLib: - 'A futási könyvtár frissítése folyamatban. Kérem, frissítse az oldalt a frissítés után.', - checkForUpdate: 'Frissítés keresése', head: { desktop: 'Távoli Asztal', login: 'Bejelentkezés', changePassword: 'Jelszó megváltoztatása', - terminal: 'Terminál' + terminal: 'Terminál', + wifi: 'Wi-Fi' }, auth: { login: 'Bejelentkezés', @@ -40,14 +25,28 @@ const hu = { illegalUsername: 'A felhasználónév illegális karaktereket tartalmaz', illegalPassword: 'A jelszó illegális karaktereket tartalmaz', forgetPassword: 'Jelszó-emlékeztető', - resetPassword: 'Jelszó alaphelyzetbe állítása', - reset1: 'Ha elfelejtette a jelszót, kövesse az alábbi lépéseket:', - reset2: '1. Jelentkezzen be a NanoKVM eszközre SSH-n keresztül;', - reset3: '2. Törölje a fájlt az eszközről:', - reset4: '3. Használja az alapértelmezett fiókot a bejelentkezéshez:', ok: 'Ok', cancel: 'Mégse', - loginButtonText: 'Bejelentkezés' + loginButtonText: 'Bejelentkezés', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Videó mód', @@ -133,60 +132,113 @@ const hu = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Parancs küldése...', sent: 'Parancs elküldve', input: 'Adja meg a MAC címet', ok: 'Ok' }, - about: { - title: 'NanoKVM Névjegy', - information: 'Információ', - ip: 'IP', - mdns: 'mDNS', - application: 'Alkalmazás verzió', - image: 'Képfájl verzió', - deviceKey: 'Eszköz kulcs', - queryFailed: 'Lekérdezés sikertelen', - community: 'Közösség' + power: { + title: 'Bekapcsolás', + power: 'Bekapcsolás', + reset: 'Újraindítás', + powerShort: 'Bekapcsolás (rövid kattintás)', + powerLong: 'Bekapcsolás (hosszú kattintás)' }, - update: { - title: 'Frissítés keresése', - queryFailed: 'Verzió lekérdezése sikertelen', - updateFailed: 'Frissítés sikertelen. Kérem, próbálja újra.', - isLatest: 'Ön már a legfrissebb verziót használja.', - available: 'Frissítés elérhető. Biztos, hogy frissít?', - updating: 'Frissítés elkezdődött. Kérem várjon...', - confirm: 'Megerősítés', - cancel: 'Mégse' - }, - virtualDevice: { - network: 'Virtuális hálózat', - disk: 'Virtuális lemez' - }, - tailscale: { - loading: 'Betöltés...', - notInstall: 'Tailscale nem található! Kérem, telepítse.', - install: 'Telepítés', - installing: 'Telepítés folyamatban', - failed: 'Telepítés sikertelen', - retry: 'Frissítse az oldalt, majd próbálja újra. Vagy próbálja meg manuálisan telepíteni.', - download: 'Letöltés a', - package: 'telepítési csomag', - unzip: 'és kicsomagolás', - upTailscale: 'Töltsön fel tailscale-t a NanoKVM /usr/bin/ könyvtárába', - upTailscaled: 'Töltsön fel tailscaled-t a NanoKVM /usr/sbin/ könyvtárába', - refresh: 'Frissítse az aktuális oldalt', - notLogin: - 'Az eszköz még nincs kötve. Kérem, jelentkezzen be és kösse az eszközt a fiókjához.', - urlPeriod: 'Ez az url 10 percig érvényes', - login: 'Bejelentkezés', - loginSuccess: 'Sikeres bejelentkezés', - enable: 'Tailscale engedélyezése', - deviceName: 'Eszköz neve', - deviceIP: 'Eszköz IP', - account: 'Fiók', - logout: 'Kijelentkezés', - logout2: 'Biztos, hogy kijelentkezik?' + settings: { + title: 'Settings', + about: { + title: 'NanoKVM Névjegy', + information: 'Információ', + ip: 'IP', + mdns: 'mDNS', + application: 'Alkalmazás verzió', + applicationTip: 'NanoKVM web application version', + image: 'Képfájl verzió', + imageTip: 'NanoKVM system image version', + deviceKey: 'Eszköz kulcs', + community: 'Közösség' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Betöltés...', + notInstall: 'Tailscale nem található! Kérem, telepítse.', + install: 'Telepítés', + installing: 'Telepítés folyamatban', + failed: 'Telepítés sikertelen', + retry: 'Frissítse az oldalt, majd próbálja újra. Vagy próbálja meg manuálisan telepíteni.', + download: 'Letöltés a', + package: 'telepítési csomag', + unzip: 'és kicsomagolás', + upTailscale: 'Töltsön fel tailscale-t a NanoKVM /usr/bin/ könyvtárába', + upTailscaled: 'Töltsön fel tailscaled-t a NanoKVM /usr/sbin/ könyvtárába', + refresh: 'Frissítse az aktuális oldalt', + notLogin: + 'Az eszköz még nincs kötve. Kérem, jelentkezzen be és kösse az eszközt a fiókjához.', + urlPeriod: 'Ez az url 10 percig érvényes', + login: 'Bejelentkezés', + loginSuccess: 'Sikeres bejelentkezés', + enable: 'Tailscale engedélyezése', + deviceName: 'Eszköz neve', + deviceIP: 'Eszköz IP', + account: 'Fiók', + logout: 'Kijelentkezés', + logout2: 'Biztos, hogy kijelentkezik?' + }, + update: { + title: 'Frissítés keresése', + queryFailed: 'Verzió lekérdezése sikertelen', + updateFailed: 'Frissítés sikertelen. Kérem, próbálja újra.', + isLatest: 'Ön már a legfrissebb verziót használja.', + available: 'Frissítés elérhető. Biztos, hogy frissít?', + updating: 'Frissítés elkezdődött. Kérem várjon...', + confirm: 'Megerősítés', + cancel: 'Mégse' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/id.ts b/web/src/i18n/locales/id.ts index d550bde..cd8c780 100644 --- a/web/src/i18n/locales/id.ts +++ b/web/src/i18n/locales/id.ts @@ -1,25 +1,11 @@ const id = { translation: { - language: 'Bahasa', - changePassword: 'Ubah Sandi', - logout: 'Keluar', - settings: 'Pengaturan', - showMouse: 'Tampilkan tetikus', - hideMouse: 'Sembunyikan tetikus', - power: 'Daya', - reset: 'Mulai Ulang', - powerShort: 'Data (tekan sebentar)', - powerLong: 'Power (tekan lama)', - hddLed: 'HDD LED', - checkLibFailed: 'Gagal memeriksa runtime library, coba lagi nanti', - updateLibFailed: 'Gagal memperbarui runtime library, mohon coba lagi', - updatingLib: 'Memperbarui runtime library. Silahkan segarkan halaman setelah memperbarui.', - checkForUpdate: 'Periksa pembaruan', head: { desktop: 'Remote Desktop', login: 'Masuk', changePassword: 'Ubah Sandi', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Masuk', @@ -38,14 +24,28 @@ const id = { illegalUsername: 'ada karakter ilegal pada nama user', illegalPassword: 'ada karakter ilegal pada sandi', forgetPassword: 'Lupa Sandi', - resetPassword: 'Atur ulang Sandi', - reset1: 'Jika lupa sandi, ikuti langkah berikut untuk mengatur ulang:', - reset2: '1. Masuk ke perangkat NanoKVM melalui SSH;', - reset3: '2. Hapus arsip di dalam perangkat: ', - reset4: '3. Gunakan akun awal untuk masuk: ', ok: 'Ok', cancel: 'Batalkan', - loginButtonText: 'Masuk' + loginButtonText: 'Masuk', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Mode Video', @@ -131,59 +131,113 @@ const id = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Kirim perintah...', sent: 'Perintah terkirim', input: 'Silahkan masukkan MAC', ok: 'Ok' }, - about: { - title: 'Tentang NanoKVM', - information: 'Informasi', - ip: 'IP', - mdns: 'mDNS', - application: 'Versi Aplikasi', - image: 'Version Gambar', - deviceKey: 'Kunci Perangkat', - queryFailed: 'Kueri gagal', - community: 'Komunitas' + power: { + title: 'Daya', + reset: 'Mulai Ulang', + power: 'Daya', + powerShort: 'Data (tekan sebentar)', + powerLong: 'Power (tekan lama)' }, - update: { - title: 'Periksa pembaruan', - queryFailed: 'Gagal mendapatkan versi', - updateFailed: 'Gagal memperbarui, tolong coba lagi.', - isLatest: 'Kamu sudah menggunakan versi terbaru.', - available: 'Ada pembaruan baru. apa kamu mau memperbarui?', - updating: 'Pembaruan dimulai. Silahkan tunggu...', - confirm: 'Konfirmasi', - cancel: 'Batalkan' - }, - virtualDevice: { - network: 'Jaringan Virtual', - disk: 'Disk Virtual' - }, - tailscale: { - loading: 'Memuat...', - notInstall: 'Tailscale tidak ditemukan! Silahkan pasang.', - install: 'Memasang', - installing: 'Memasangkan', - failed: 'Gagal memasangkan', - retry: 'Harap segarkan dan coba lagi. Atau coba instal secara manual', - download: 'Mengunduh', - package: 'paket instalasi', - unzip: 'dan unzip itu', - upTailscale: 'Unggah tailscale ke direktori NanoKVM /usr/bin/', - upTailscaled: 'Unggah tailscaled ke direktori NanoKVM /usr/sbin/', - refresh: 'Segarkan halaman ini', - notLogin: 'Perangkat belum ditautkan. Silakan masuk dan tautkan perangkat ini ke akun Anda.', - urlPeriod: 'Url ini berlaku selama 10 menit', - login: 'Masuk', - loginSuccess: 'Berhasil masuk', - enable: 'Aktifkan Tailscale', - deviceName: 'Nama Perangkat', - deviceIP: 'IP Perangkat', - account: 'Akun', - logout: 'Keluar', - logout2: 'Yakin untuk keluar?' + settings: { + title: 'Settings', + about: { + title: 'Tentang NanoKVM', + information: 'Informasi', + ip: 'IP', + mdns: 'mDNS', + application: 'Versi Aplikasi', + applicationTip: 'NanoKVM web application version', + image: 'Version Gambar', + imageTip: 'NanoKVM system image version', + deviceKey: 'Kunci Perangkat', + community: 'Komunitas' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Memuat...', + notInstall: 'Tailscale tidak ditemukan! Silahkan pasang.', + install: 'Memasang', + installing: 'Memasangkan', + failed: 'Gagal memasangkan', + retry: 'Harap segarkan dan coba lagi. Atau coba instal secara manual', + download: 'Mengunduh', + package: 'paket instalasi', + unzip: 'dan unzip itu', + upTailscale: 'Unggah tailscale ke direktori NanoKVM /usr/bin/', + upTailscaled: 'Unggah tailscaled ke direktori NanoKVM /usr/sbin/', + refresh: 'Segarkan halaman ini', + notLogin: + 'Perangkat belum ditautkan. Silakan masuk dan tautkan perangkat ini ke akun Anda.', + urlPeriod: 'Url ini berlaku selama 10 menit', + login: 'Masuk', + loginSuccess: 'Berhasil masuk', + enable: 'Aktifkan Tailscale', + deviceName: 'Nama Perangkat', + deviceIP: 'IP Perangkat', + account: 'Akun', + logout: 'Keluar', + logout2: 'Yakin untuk keluar?' + }, + update: { + title: 'Periksa pembaruan', + queryFailed: 'Gagal mendapatkan versi', + updateFailed: 'Gagal memperbarui, tolong coba lagi.', + isLatest: 'Kamu sudah menggunakan versi terbaru.', + available: 'Ada pembaruan baru. apa kamu mau memperbarui?', + updating: 'Pembaruan dimulai. Silahkan tunggu...', + confirm: 'Konfirmasi', + cancel: 'Batalkan' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/it.ts b/web/src/i18n/locales/it.ts index d0dad42..6a7a63c 100644 --- a/web/src/i18n/locales/it.ts +++ b/web/src/i18n/locales/it.ts @@ -1,25 +1,11 @@ const it = { translation: { - language: 'Lingua', - changePassword: 'Cambia Password', - logout: 'Disconnetti', - settings: 'Impostazioni', - showMouse: 'Mostra mouse', - hideMouse: 'Nascondi mouse', - power: 'Accensione', - reset: 'Reimposta', - powerShort: 'Accensione (clic breve)', - powerLong: 'Accensione (clic lungo)', - hddLed: 'LED HDD', - checkLibFailed: 'Impossibile verificare la libreria runtime, riprova', - updateLibFailed: 'Impossibile aggiornare la libreria runtime, riprova', - updatingLib: "Aggiornamento libreria runtime. Aggiorna la pagina dopo l'aggiornamento.", - checkForUpdate: 'Controlla Aggiornamenti', head: { desktop: 'Desktop Remoto', login: 'Accesso', changePassword: 'Cambia Password', - terminal: 'Terminale' + terminal: 'Terminale', + wifi: 'Wi-Fi' }, auth: { login: 'Accesso', @@ -39,14 +25,28 @@ const it = { illegalUsername: 'Il nome utente contiene caratteri non validi', illegalPassword: 'La password contiene caratteri non validi', forgetPassword: 'Hai dimenticato la password', - resetPassword: 'Reimposta Password', - reset1: 'Se hai dimenticato la password, segui questi passaggi per reimpostarla:', - reset2: '1. Accedi al dispositivo NanoKVM tramite SSH;', - reset3: '2. Elimina il file nel dispositivo: ', - reset4: "3. Usa l'account predefinito per accedere: ", ok: 'Ok', cancel: 'Annulla', - loginButtonText: 'Accedi' + loginButtonText: 'Accedi', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Modalità video', @@ -132,60 +132,113 @@ const it = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Invio comando...', sent: 'Comando inviato', input: 'Inserisci il MAC', ok: 'Ok' }, - about: { - title: 'Informazioni su NanoKVM', - information: 'Informazioni', - ip: 'IP', - mdns: 'mDNS', - application: 'Versione Applicazione', - image: 'Versione Immagine', - deviceKey: 'Chiave Dispositivo', - queryFailed: 'Query fallita', - community: 'Comunità' + power: { + title: 'Accensione', + reset: 'Reimposta', + power: 'Accensione', + powerShort: 'Accensione (clic breve)', + powerLong: 'Accensione (clic lungo)' }, - update: { - title: 'Controlla Aggiornamenti', - queryFailed: 'Impossibile ottenere la versione', - updateFailed: 'Aggiornamento fallito. Riprova.', - isLatest: 'Hai già la versione più recente.', - available: 'Un aggiornamento è disponibile. Sei sicuro di voler aggiornare?', - updating: 'Aggiornamento avviato. Attendere prego...', - confirm: 'Conferma', - cancel: 'Annulla' - }, - virtualDevice: { - network: 'Rete Virtuale', - usb: 'Disk Virtuale' - }, - tailscale: { - loading: 'Caricamento...', - notInstall: 'Tailscale non trovato! Per favore, installa.', - install: 'Installa', - installing: 'Installazione in corso', - failed: 'Installazione fallita', - retry: 'Riprova aggiornando la pagina o installa manualmente', - download: 'Scarica il', - package: 'pacchetto di installazione', - unzip: 'e decomprimilo', - upTailscale: 'Carica tailscale nella directory /usr/bin/ del NanoKVM', - upTailscaled: 'Carica tailscaled nella directory /usr/sbin/ del NanoKVM', - refresh: 'Aggiorna la pagina corrente', - notLogin: - 'Il dispositivo non è ancora stato associato. Effettua il login e associa questo dispositivo al tuo account.', - urlPeriod: 'Questo URL è valido per 10 minuti', - login: 'Accedi', - loginSuccess: 'Accesso riuscito', - enable: 'Abilita Tailscale', - deviceName: 'Nome Dispositivo', - deviceIP: 'IP Dispositivo', - account: 'Account', - logout: 'Disconnetti', - logout2: 'Sei sicuro di voler uscire?' + settings: { + title: 'Settings', + about: { + title: 'Informazioni su NanoKVM', + information: 'Informazioni', + ip: 'IP', + mdns: 'mDNS', + application: 'Versione Applicazione', + applicationTip: 'NanoKVM web application version', + image: 'Versione Immagine', + imageTip: 'NanoKVM system image version', + deviceKey: 'Chiave Dispositivo', + community: 'Comunità' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Caricamento...', + notInstall: 'Tailscale non trovato! Per favore, installa.', + install: 'Installa', + installing: 'Installazione in corso', + failed: 'Installazione fallita', + retry: 'Riprova aggiornando la pagina o installa manualmente', + download: 'Scarica il', + package: 'pacchetto di installazione', + unzip: 'e decomprimilo', + upTailscale: 'Carica tailscale nella directory /usr/bin/ del NanoKVM', + upTailscaled: 'Carica tailscaled nella directory /usr/sbin/ del NanoKVM', + refresh: 'Aggiorna la pagina corrente', + notLogin: + 'Il dispositivo non è ancora stato associato. Effettua il login e associa questo dispositivo al tuo account.', + urlPeriod: 'Questo URL è valido per 10 minuti', + login: 'Accedi', + loginSuccess: 'Accesso riuscito', + enable: 'Abilita Tailscale', + deviceName: 'Nome Dispositivo', + deviceIP: 'IP Dispositivo', + account: 'Account', + logout: 'Disconnetti', + logout2: 'Sei sicuro di voler uscire?' + }, + update: { + title: 'Controlla Aggiornamenti', + queryFailed: 'Impossibile ottenere la versione', + updateFailed: 'Aggiornamento fallito. Riprova.', + isLatest: 'Hai già la versione più recente.', + available: 'Un aggiornamento è disponibile. Sei sicuro di voler aggiornare?', + updating: 'Aggiornamento avviato. Attendere prego...', + confirm: 'Conferma', + cancel: 'Annulla' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/ja.ts b/web/src/i18n/locales/ja.ts index 9ad81a2..16bccf2 100644 --- a/web/src/i18n/locales/ja.ts +++ b/web/src/i18n/locales/ja.ts @@ -1,25 +1,11 @@ const ja = { translation: { - language: '言語', - changePassword: 'パスワード変更', - logout: 'ログアウト', - settings: '設定', - showMouse: 'マウスを表示', - hideMouse: 'マウスを非表示', - power: '電源', - reset: 'リセット', - powerShort: '電源(短いクリック)', - powerLong: '電源(長いクリック)', - hddLed: 'HDD LED', - checkLibFailed: 'ランタイムライブラリのチェックに失敗しました。再試行してください。', - updateLibFailed: 'ランタイムライブラリの更新に失敗しました。再試行してください。', - updatingLib: 'ランタイムライブラリを更新中です。更新後にページをリフレッシュしてください。', - checkForUpdate: 'アップデートの確認', head: { desktop: 'リモートデスクトップ', login: 'ログイン', changePassword: 'パスワード変更', - terminal: 'ターミナル' + terminal: 'ターミナル', + wifi: 'Wi-Fi' }, auth: { login: 'ログイン', @@ -39,14 +25,28 @@ const ja = { illegalUsername: 'ユーザー名に不正な文字が含まれています', illegalPassword: 'パスワードに不正な文字が含まれています', forgetPassword: 'パスワードを忘れた', - resetPassword: 'パスワードリセット', - reset1: 'パスワードを忘れた場合は、以下の手順に従ってリセットしてください:', - reset2: '1. SSHを介してNanoKVMデバイスにログインします。', - reset3: '2. デバイス内のファイルを削除します:', - reset4: '3. デフォルトのアカウントでログインします:', ok: 'OK', cancel: 'キャンセル', - loginButtonText: 'ログイン' + loginButtonText: 'ログイン', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'ビデオモード', @@ -132,60 +132,113 @@ const ja = { confirm: 'OK' }, wol: { + title: 'Wake-on-LAN', sending: 'コマンドを送信中...', sent: 'コマンドを送信しました', input: 'MACを入力してください', ok: 'OK' }, - about: { - title: 'NanoKVMについて', - information: '情報', - ip: 'IP', - mdns: 'mDNS', - application: 'アプリケーションバージョン', - image: 'イメージバージョン', - firmware: 'ファームウェアバージョン', - deviceKey: 'デバイスキー', - queryFailed: 'クエリに失敗しました', - community: 'コミュニティ' + power: { + title: '電源', + reset: 'リセット', + power: '電源', + powerShort: '電源(短いクリック)', + powerLong: '電源(長いクリック)' }, - update: { - title: 'アップデートの確認', - queryFailed: 'バージョンの取得に失敗しました', - updateFailed: '更新に失敗しました。再試行してください。', - isLatest: '最新のバージョンを既に持っています。', - available: 'アップデートが利用可能です。更新してもよろしいですか?', - updating: '更新を開始しました。お待ちください...', - confirm: '確認', - cancel: 'キャンセル' - }, - virtualDevice: { - network: '仮想ネットワーク', - disk: '仮想ディスク' - }, - tailscale: { - loading: '読み込み中...', - notInstall: 'Tailscaleが見つかりません!インストールしてください。', - install: 'インストール', - installing: 'インストール中', - failed: 'インストールに失敗しました', - retry: 'ページをリフレッシュして再試行してください。または手動でインストールしてください', - download: 'インストールパッケージをダウンロードして', - package: '解凍してください', - upTailscale: 'tailscaleをNanoKVMのディレクトリ/usr/bin/にアップロードしてください', - upTailscaled: 'tailscaledをNanoKVMのディレクトリ/usr/sbin/にアップロードしてください', - refresh: '現在のページをリフレッシュします', - notLogin: - 'デバイスはまだバインドされていません。ログインしてこのデバイスをアカウントにバインドしてください。', - urlPeriod: 'このURLは10分間有効です', - login: 'ログイン', - loginSuccess: 'ログイン成功', - enable: 'Tailscaleを有効化', - deviceName: 'デバイス名', - deviceIP: 'デバイスIP', - account: 'アカウント', - logout: 'ログアウト', - logout2: 'ログアウトしてもよろしいですか?' + settings: { + title: 'Settings', + about: { + title: 'NanoKVMについて', + information: '情報', + ip: 'IP', + mdns: 'mDNS', + application: 'アプリケーションバージョン', + applicationTip: 'NanoKVM web application version', + image: 'イメージバージョン', + imageTip: 'NanoKVM system image version', + firmware: 'ファームウェアバージョン', + deviceKey: 'デバイスキー', + community: 'コミュニティ' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: '読み込み中...', + notInstall: 'Tailscaleが見つかりません!インストールしてください。', + install: 'インストール', + installing: 'インストール中', + failed: 'インストールに失敗しました', + retry: 'ページをリフレッシュして再試行してください。または手動でインストールしてください', + download: 'インストールパッケージをダウンロードして', + package: '解凍してください', + upTailscale: 'tailscaleをNanoKVMのディレクトリ/usr/bin/にアップロードしてください', + upTailscaled: 'tailscaledをNanoKVMのディレクトリ/usr/sbin/にアップロードしてください', + refresh: '現在のページをリフレッシュします', + notLogin: + 'デバイスはまだバインドされていません。ログインしてこのデバイスをアカウントにバインドしてください。', + urlPeriod: 'このURLは10分間有効です', + login: 'ログイン', + loginSuccess: 'ログイン成功', + enable: 'Tailscaleを有効化', + deviceName: 'デバイス名', + deviceIP: 'デバイスIP', + account: 'アカウント', + logout: 'ログアウト', + logout2: 'ログアウトしてもよろしいですか?' + }, + update: { + title: 'アップデートの確認', + queryFailed: 'バージョンの取得に失敗しました', + updateFailed: '更新に失敗しました。再試行してください。', + isLatest: '最新のバージョンを既に持っています。', + available: 'アップデートが利用可能です。更新してもよろしいですか?', + updating: '更新を開始しました。お待ちください...', + confirm: '確認', + cancel: 'キャンセル' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/ko.ts b/web/src/i18n/locales/ko.ts index 3814fb9..9a106b8 100644 --- a/web/src/i18n/locales/ko.ts +++ b/web/src/i18n/locales/ko.ts @@ -1,25 +1,11 @@ const ko = { translation: { - language: '언어', - changePassword: '비밀번호 변경', - logout: '로그아웃', - settings: '설정', - showMouse: '마우스 보이기', - hideMouse: '마우스 숨기기', - power: '전원', - reset: '리셋', - powerShort: '전원 (짧게 누르기)', - powerLong: '전원 (길게 누르기)', - hddLed: 'HDD LED', - checkLibFailed: '런타임 라이브러리를 체크하는데 실패했습니다. 다시 시도해주세요.', - updateLibFailed: '런타임 라이브러리를 업데이트하는데 실패했습니다. 다시 시도해주세요.', - updatingLib: '런타임 라이브러리를 업데이트 하는 중입니다. 업데이트 완료 후 새로고침 해주세요.', - checkForUpdate: '업데이트 체크하기', head: { desktop: '원격 데스크톱', login: '로그인', changePassword: '비밀번호 변경', - terminal: '터미널' + terminal: '터미널', + wifi: 'Wi-Fi' }, auth: { login: '로그인', @@ -38,14 +24,28 @@ const ko = { illegalUsername: '유저 이름에 사용할 수 없는 문자가 있습니다.', illegalPassword: '비밀번호에 사용할 수 없는 문자가 있습니다.', forgetPassword: '비밀번호 분실', - resetPassword: '비밀번호 초기화', - reset1: '비밀번호를 분실하신 경우, 아래 순서로 리셋하세요.:', - reset2: '1. NanoKVM 기기에 SSH를 통해 로그인 합니다.;', - reset3: '2. 기기내 파일을 제거합니다.: ', - reset4: '3. 기본 계정으로 로그인 합니다.: ', ok: '확인', cancel: '취소', - loginButtonText: '로그인' + loginButtonText: '로그인', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: '비디오 모드', @@ -130,59 +130,112 @@ const ko = { confirm: '확인' }, wol: { + title: 'Wake-on-LAN', sending: '패킷 전송 중...', sent: '패킷 전송 완료', input: 'MAC주소를 입력하세요.', ok: '확인' }, - about: { - title: 'NanoKVM 정보', - information: '정보', - ip: 'IP', - mdns: 'mDNS', - application: '펌웨어 버전', - image: '이미지 버전', - deviceKey: '장치 키', - queryFailed: '불러오기 실패', - community: '커뮤니티' + power: { + title: '전원', + reset: '리셋', + power: '전원', + powerShort: '전원 (짧게 누르기)', + powerLong: '전원 (길게 누르기)' }, - update: { - title: '업데이트 확인 중', - queryFailed: '버전 확인 실패', - updateFailed: '업데이트 실패, 재시도하세요.', - isLatest: '이미 최신 버전입니다.', - available: '업데이트가 가능합니다. 정말로 업데이트 할까요?', - updating: '업데이트 시작. 잠시 기다려주세요...', - confirm: '확인', - cancel: '취소' - }, - virtualDevice: { - network: '가상 네트워크 카드', - disk: '가상 디스크' - }, - tailscale: { - loading: 'Loading...', - notInstall: 'Tailscale이 없습니다. 설치해주세요.', - install: '설치', - installing: '설치중', - failed: '설치 실패', - retry: '새로고침하고 다시 시도하거나, 수동으로 설치하세요', - download: '다운로드 중 :', - package: '패키지 설치', - unzip: '압축 해제', - upTailscale: 'tailscale을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/bin/', - upTailscaled: 'tailscaled을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/sbin/', - refresh: '현재 페이지 새로고침', - notLogin: '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', - urlPeriod: '이 주소는 10분간 유효합니다.', - login: '로그인', - loginSuccess: '로그인 성공', - enable: 'Tailscale 활성화', - deviceName: '장치 이름', - deviceIP: '장치 IP', - account: '계정', - logout: '로그아웃', - logout2: '정말로 로그아웃 합니까?' + settings: { + title: 'Settings', + about: { + title: 'NanoKVM 정보', + information: '정보', + ip: 'IP', + mdns: 'mDNS', + application: '펌웨어 버전', + applicationTip: 'NanoKVM web application version', + image: '이미지 버전', + imageTip: 'NanoKVM system image version', + deviceKey: '장치 키', + community: '커뮤니티' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Loading...', + notInstall: 'Tailscale이 없습니다. 설치해주세요.', + install: '설치', + installing: '설치중', + failed: '설치 실패', + retry: '새로고침하고 다시 시도하거나, 수동으로 설치하세요', + download: '다운로드 중 :', + package: '패키지 설치', + unzip: '압축 해제', + upTailscale: 'tailscale을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/bin/', + upTailscaled: 'tailscaled을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/sbin/', + refresh: '현재 페이지 새로고침', + notLogin: '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', + urlPeriod: '이 주소는 10분간 유효합니다.', + login: '로그인', + loginSuccess: '로그인 성공', + enable: 'Tailscale 활성화', + deviceName: '장치 이름', + deviceIP: '장치 IP', + account: '계정', + logout: '로그아웃', + logout2: '정말로 로그아웃 합니까?' + }, + update: { + title: '업데이트 확인 중', + queryFailed: '버전 확인 실패', + updateFailed: '업데이트 실패, 재시도하세요.', + isLatest: '이미 최신 버전입니다.', + available: '업데이트가 가능합니다. 정말로 업데이트 할까요?', + updating: '업데이트 시작. 잠시 기다려주세요...', + confirm: '확인', + cancel: '취소' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/nb.ts b/web/src/i18n/locales/nb.ts index 91b94a6..648601a 100644 --- a/web/src/i18n/locales/nb.ts +++ b/web/src/i18n/locales/nb.ts @@ -1,165 +1,202 @@ const nb = { - translation: { - language: 'Språk', + translation: { + head: { + desktop: 'Eksternt skrivebord', + login: 'Logg inn', changePassword: 'Endre passord', - logout: 'Logg ut', - settings: 'Innstillinger', - showMouse: 'Vis peker', - hideMouse: 'Skjul peker', - power: 'På-knapp', + terminal: 'Terminal', + wifi: 'Wi-Fi' + }, + auth: { + login: 'Logg inn', + placeholderUsername: 'Brukernavn', + placeholderPassword: 'Passord', + placeholderPassword2: 'Oppgi passord igjen', + noEmptyUsername: 'Brukernavn påkrevd', + noEmptyPassword: 'Passord påkrevd', + noAccount: + 'Kunne ikke hente brukerinformasjon. Vennligst last inn siden på nytt eller gjenopprett passord', + invalidUser: 'Ugyldig brukernavn eller passord', + error: 'Uventet feil', + changePassword: 'Endre passord', + changePasswordDesc: + 'For sikkerheten til enheten, vennligst endre passordet ditt for web-innlogging.', + differentPassword: 'Passordene er ikke like', + illegalUsername: 'Brukernavn inneholder tegn som ikke er tillat', + illegalPassword: 'Passord inneholder tegn som ikke er tillat', + forgetPassword: 'Glemt passord', + ok: 'Ok', + cancel: 'Avbryt', + loginButtonText: 'Logg inn', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' + }, + screen: { + video: 'Video-kodek', + resolution: 'Oppløsning', + auto: 'Automatisk', + autoTips: + 'Skjermriving eller peker-forskyvning kan oppstå ved enkelte oppløsninger. Prøv å justere den eksterne vertens oppløsning eller skru av automatisk modus.', + fps: 'FPS', + customizeFps: 'Tilpass', + quality: 'Kvalitet', + qualityLossless: 'Tapsfri', + qualityHigh: 'Høy', + qualityMedium: 'Medium', + qualityLow: 'Lav', + frameDetect: 'Bildefrekvensoppdagelse', + frameDetectTip: + 'Kalkuler forskjellen mellom bilder. Stopper overføring av video når det ikke oppdages forskjell på den eksterne vertens skjerm.' + }, + keyboard: { + paste: 'Lim inn', + tips: 'Kun vanlige tegn på tastatur er støttet', + placeholder: 'Vennligst angi teksten du vil lime inn', + submit: 'Lim inn', + virtual: 'Åpne tastatur' + }, + mouse: { + default: 'Vanlig', + pointer: 'Hånd', + cell: 'Celle', + text: 'Tekst', + grab: 'Grip', + hide: 'Skjul', + mode: 'Modus', + absolute: 'Absolutt', + relative: 'Relativ', + requestPointer: 'Bruker relativ modus. Vennligsk klikk på skrivebordet for vise musepeker.', + resetHid: 'Gjenopprett HID' + }, + image: { + title: 'Bilder', + loading: 'Laster...', + empty: 'Ingen funnet', + mountFailed: 'Montering feilet', + mountDesc: + 'På noen systemer er det nødvendig å koble fra den virtuelle disken på den eksterne verten før man kan montere arkivfilen.', + tips: { + title: 'Hvordan laste opp', + usb1: 'Koble til NanoKVM-enheten til din datamaskin med USB.', + usb2: 'Sikre at den virtuelle disken er montert (Innstillinger - Virtuell disk).', + usb3: 'Åpne den virtuelle disken på datamaskinen din og kopier arkivfilen til rot-mappen på den virtuelle disken.', + scp1: 'Sikre at NanoKVM-enheten og datamaskinen din er tilkoblet det samme lokale nettverket.', + scp2: 'Åpne en terminal på datamaskinen din og bruk SCP-kommandoen til å laste opp arkivfilen til mappen /data på NanoKVM-enheten.', + scp3: 'Eksempel: scp sti-til-din-arkivfil root@din-nanokvm-ip:/data', + tfCard: 'TF-kort', + tf1: 'Denne metoden er støttet på datamskiner med Linux', + tf2: 'Ta TF-kortet ut av NanoKVM-enheten (hvis du har FULL-versjonen, demonter kabinettet først).', + tf3: 'Sett inn TF-kortet i en kortleser og koble den til datamaskinen din.', + tf4: 'Kopiér arkivfilen til mappen /data på TF-kortet.', + tf5: 'Sett inn TF-kortet i NanoKVM-enheten.' + } + }, + script: { + title: 'Skript', + upload: 'Last opp', + run: 'Kjør', + runBackground: 'Kjør i bakgrunnen', + runFailed: 'Kjøring feilet', + attention: 'Merknad', + delDesc: 'Er du sikker på at du vil slette denne filen?', + confirm: 'Ja', + cancel: 'Nei', + delete: 'Slett', + close: 'Lukk' + }, + terminal: { + title: 'Terminal', + nanokvm: 'NanoKVM', + serial: 'Seriell port', + serialPort: 'Seriell port', + serialPortPlaceholder: 'Vennligst angi den serielle porten', + baudrate: 'Baud-rate', + confirm: 'Ok' + }, + wol: { + title: 'Wake-on-LAN', + sending: 'Sender kommando...', + sent: 'Kommando sendt', + input: 'Vennligst angi MAC-adressen', + ok: 'Ok' + }, + power: { + title: 'På-knapp', reset: 'Reset-knapp', + power: 'På-knapp', powerShort: 'På-knapp (kort trykk)', - powerLong: 'På-knapp (langt trykk)', - hddLed: 'Disk-aktivitet', - checkLibFailed: 'Kunne ikke sjekke runtime-bibliotek. Prøv igjen.', - updateLibFailed: 'Kunne ikke oppdatere runtime-bibliotek. Prøv igjen.', - updatingLib: 'Oppdaterer runtime-bibliotek. Vennligst last inn siden på nytt etter oppdatering.', - checkForUpdate: 'Se etter oppdatering', - head: { - desktop: 'Eksternt skrivebord', - login: 'Logg inn', - changePassword: 'Endre passord', - terminal: 'Terminal' - }, - auth: { - login: 'Logg inn', - placeholderUsername: 'Brukernavn', - placeholderPassword: 'Passord', - placeholderPassword2: 'Oppgi passord igjen', - noEmptyUsername: 'Brukernavn påkrevd', - noEmptyPassword: 'Passord påkrevd', - noAccount: 'Kunne ikke hente brukerinformasjon. Vennligst last inn siden på nytt eller gjenopprett passord', - invalidUser: 'Ugyldig brukernavn eller passord', - error: 'Uventet feil', - changePassword: 'Endre passord', - changePasswordDesc: 'For sikkerheten til enheten, vennligst endre passordet ditt for web-innlogging.', - differentPassword: 'Passordene er ikke like', - illegalUsername: 'Brukernavn inneholder tegn som ikke er tillat', - illegalPassword: 'Passord inneholder tegn som ikke er tillat', - forgetPassword: 'Glemt passord', - resetPassword: 'Gjenopprett passord', - reset1: 'Hvis du har glemt passordet ditt, vennligst følg disse trinnene for å gjenopprette det:', - reset2: '1. Logg inn på NanoKVM-enheten med SSH', - reset3: '2. Slett filen på enheten: ', - reset4: '3. Bruk standardkontoen til å logge inn: ', - ok: 'Ok', - cancel: 'Avbryt', - loginButtonText: 'Logg inn', - }, - screen: { - video: 'Video-kodek', - resolution: 'Oppløsning', - auto: 'Automatisk', - autoTips: - "Skjermriving eller peker-forskyvning kan oppstå ved enkelte oppløsninger. Prøv å justere den eksterne vertens oppløsning eller skru av automatisk modus.", - fps: 'FPS', - customizeFps: 'Tilpass', - quality: 'Kvalitet', - qualityLossless: 'Tapsfri', - qualityHigh: 'Høy', - qualityMedium: 'Medium', - qualityLow: 'Lav', - frameDetect: 'Bildefrekvensoppdagelse', - frameDetectTip: - "Kalkuler forskjellen mellom bilder. Stopper overføring av video når det ikke oppdages forskjell på den eksterne vertens skjerm." - }, - keyboard: { - paste: 'Lim inn', - tips: 'Kun vanlige tegn på tastatur er støttet', - placeholder: 'Vennligst angi teksten du vil lime inn', - submit: 'Lim inn', - virtual: 'Åpne tastatur' - }, - mouse: { - default: 'Vanlig', - pointer: 'Hånd', - cell: 'Celle', - text: 'Tekst', - grab: 'Grip', - hide: 'Skjul', - mode: 'Modus', - absolute: 'Absolutt', - relative: 'Relativ', - requestPointer: 'Bruker relativ modus. Vennligsk klikk på skrivebordet for vise musepeker.', - resetHid: 'Gjenopprett HID' - }, - image: { - title: 'Bilder', - loading: 'Laster...', - empty: 'Ingen funnet', - mountFailed: 'Montering feilet', - mountDesc: - "På noen systemer er det nødvendig å koble fra den virtuelle disken på den eksterne verten før man kan montere arkivfilen.", - tips: { - title: 'Hvordan laste opp', - usb1: 'Koble til NanoKVM-enheten til din datamaskin med USB.', - usb2: 'Sikre at den virtuelle disken er montert (Innstillinger - Virtuell disk).', - usb3: 'Åpne den virtuelle disken på datamaskinen din og kopier arkivfilen til rot-mappen på den virtuelle disken.', - scp1: 'Sikre at NanoKVM-enheten og datamaskinen din er tilkoblet det samme lokale nettverket.', - scp2: 'Åpne en terminal på datamaskinen din og bruk SCP-kommandoen til å laste opp arkivfilen til mappen /data på NanoKVM-enheten.', - scp3: 'Eksempel: scp sti-til-din-arkivfil root@din-nanokvm-ip:/data', - tfCard: 'TF-kort', - tf1: 'Denne metoden er støttet på datamskiner med Linux', - tf2: 'Ta TF-kortet ut av NanoKVM-enheten (hvis du har FULL-versjonen, demonter kabinettet først).', - tf3: 'Sett inn TF-kortet i en kortleser og koble den til datamaskinen din.', - tf4: 'Kopiér arkivfilen til mappen /data på TF-kortet.', - tf5: 'Sett inn TF-kortet i NanoKVM-enheten.' - } - }, - script: { - title: 'Skript', - upload: 'Last opp', - run: 'Kjør', - runBackground: 'Kjør i bakgrunnen', - runFailed: 'Kjøring feilet', - attention: 'Merknad', - delDesc: 'Er du sikker på at du vil slette denne filen?', - confirm: 'Ja', - cancel: 'Nei', - delete: 'Slett', - close: 'Lukk' - }, - terminal: { - title: 'Terminal', - nanokvm: 'NanoKVM', - serial: 'Seriell port', - serialPort: 'Seriell port', - serialPortPlaceholder: 'Vennligst angi den serielle porten', - baudrate: 'Baud-rate', - confirm: 'Ok' - }, - wol: { - sending: 'Sender kommando...', - sent: 'Kommando sendt', - input: 'Vennligst angi MAC-adressen', - ok: 'Ok' - }, + powerLong: 'På-knapp (langt trykk)' + }, + settings: { + title: 'Settings', about: { title: 'Om NanoKVM', information: 'Informasjon', ip: 'IP', mdns: 'mDNS', application: 'Applikasjonsversjon', + applicationTip: 'NanoKVM web application version', image: 'Arkivfil-versjon', + imageTip: 'NanoKVM system image version', deviceKey: 'Enhetsnøkkel', - queryFailed: 'Spørring feilet', community: 'Fellesskap' }, - update: { - title: 'Se etter oppdatering', - queryFailed: 'Kunne ikke hente versjon', - updateFailed: 'En feil oppstod under oppdatering. Vennligst forsøk igjen.', - isLatest: 'Du har siste versjon allerede.', - available: 'En oppdatering er tilgjengelig. Er du sikker på at du ønsker å oppdatere?', - updating: 'Oppdatering har startet. Vennligst vent...', - confirm: 'Oppdater', - cancel: 'Avbryt' + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' }, - virtualDevice: { - network: 'Virtuelt nettverk', - disk: 'Virtuell disk' + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } }, tailscale: { + title: 'Tailscale', loading: 'Laster...', notInstall: 'Tailscale er ikke funnet! Vennligst installer.', install: 'Installér', @@ -183,8 +220,26 @@ const nb = { account: 'Konto', logout: 'Logg ut', logout2: 'Er du sikker på at du ønsker å logge ut?' + }, + update: { + title: 'Se etter oppdatering', + queryFailed: 'Kunne ikke hente versjon', + updateFailed: 'En feil oppstod under oppdatering. Vennligst forsøk igjen.', + isLatest: 'Du har siste versjon allerede.', + available: 'En oppdatering er tilgjengelig. Er du sikker på at du ønsker å oppdatere?', + updating: 'Oppdatering har startet. Vennligst vent...', + confirm: 'Oppdater', + cancel: 'Avbryt' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' } } - }; + } +}; - export default nb; +export default nb; diff --git a/web/src/i18n/locales/nl.ts b/web/src/i18n/locales/nl.ts index 6eec402..60e7d3b 100644 --- a/web/src/i18n/locales/nl.ts +++ b/web/src/i18n/locales/nl.ts @@ -1,25 +1,11 @@ const nl = { translation: { - language: 'Taal', - changePassword: 'Wachtwoord wijzigen', - logout: 'Uitloggen', - settings: 'Instellingen', - showMouse: 'Muis tonen', - hideMouse: 'Muis verbergen', - power: 'Aan/uit', - reset: 'Resetten', - powerShort: 'Aan/uit (kort indrukken)', - powerLong: 'Aan/uit (lang indrukken)', - hddLed: 'HDD LED', - checkLibFailed: 'Controleren van runtime bibliotheek mislukt, probeer het opnieuw', - updateLibFailed: 'Bijwerken van runtime bibliotheek mislukt, probeer het opnieuw', - updatingLib: 'Runtime bibliotheek wordt bijgewerkt. Vernieuw de pagina na het bijwerken.', - checkForUpdate: 'Controleren op updates', head: { desktop: 'Extern bureaublad', login: 'Inloggen', changePassword: 'Wachtwoord wijzigen', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Inloggen', @@ -39,14 +25,28 @@ const nl = { illegalUsername: 'Gebruikersnaam bevat ongeldige tekens', illegalPassword: 'Wachtwoord bevat ongeldige tekens', forgetPassword: 'Wachtwoord vergeten', - resetPassword: 'Wachtwoord resetten', - reset1: 'Als u uw wachtwoord bent vergeten, volg dan deze stappen om het te resetten:', - reset2: '1. Log in op het NanoKVM-apparaat via SSH;', - reset3: '2. Verwijder het bestand in het apparaat: ', - reset4: '3. Gebruik het standaardaccount om in te loggen: ', ok: 'Ok', cancel: 'Annuleren', - loginButtonText: 'Inloggen' + loginButtonText: 'Inloggen', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Videomodus', @@ -132,59 +132,113 @@ const nl = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Commando wordt verzonden...', sent: 'Commando verzonden', input: 'Voer het MAC-adres in', ok: 'Ok' }, - about: { - title: 'Over NanoKVM', - information: 'Informatie', - ip: 'IP', - mdns: 'mDNS', - application: 'Applicatie versie', - image: 'Image versie', - deviceKey: 'Apparaat sleutel', - queryFailed: 'Opvragen mislukt', - community: 'Community' + power: { + title: 'Aan/uit', + reset: 'Resetten', + power: 'Aan/uit', + powerShort: 'Aan/uit (kort indrukken)', + powerLong: 'Aan/uit (lang indrukken)' }, - update: { - title: 'Controleren op updates', - queryFailed: 'Ophalen versie mislukt', - updateFailed: 'Update mislukt. Probeer het opnieuw.', - isLatest: 'U heeft al de nieuwste versie.', - available: 'Er is een update beschikbaar. Weet u zeker dat u wilt updaten?', - updating: 'Update gestart. Even geduld a.u.b...', - confirm: 'Bevestigen', - cancel: 'Annuleren' - }, - virtualDevice: { - network: 'Virtueel netwerk', - disk: 'Virtuele schijf' - }, - tailscale: { - loading: 'Laden...', - notInstall: 'Tailscale niet gevonden! Installeer a.u.b.', - install: 'Installeren', - installing: 'Installeren', - failed: 'Installatie mislukt', - retry: 'Vernieuw en probeer opnieuw. Of probeer handmatig te installeren', - download: 'Download het', - package: 'installatiepakket', - unzip: 'en pak het uit', - upTailscale: 'Upload tailscale naar NanoKVM directory /usr/bin/', - upTailscaled: 'Upload tailscaled naar NanoKVM directory /usr/sbin/', - refresh: 'Vernieuw huidige pagina', - notLogin: 'Het apparaat is nog niet gekoppeld. Log in en koppel dit apparaat aan uw account.', - urlPeriod: 'Deze url is 10 minuten geldig', - login: 'Inloggen', - loginSuccess: 'Inloggen gelukt', - enable: 'Tailscale inschakelen', - deviceName: 'Apparaatnaam', - deviceIP: 'Apparaat IP', - account: 'Account', - logout: 'Uitloggen', - logout2: 'Weet u zeker dat u wilt uitloggen?' + settings: { + title: 'Settings', + about: { + title: 'Over NanoKVM', + information: 'Informatie', + ip: 'IP', + mdns: 'mDNS', + application: 'Applicatie versie', + applicationTip: 'NanoKVM web application version', + image: 'Image versie', + imageTip: 'NanoKVM system image version', + deviceKey: 'Apparaat sleutel', + community: 'Community' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Laden...', + notInstall: 'Tailscale niet gevonden! Installeer a.u.b.', + install: 'Installeren', + installing: 'Installeren', + failed: 'Installatie mislukt', + retry: 'Vernieuw en probeer opnieuw. Of probeer handmatig te installeren', + download: 'Download het', + package: 'installatiepakket', + unzip: 'en pak het uit', + upTailscale: 'Upload tailscale naar NanoKVM directory /usr/bin/', + upTailscaled: 'Upload tailscaled naar NanoKVM directory /usr/sbin/', + refresh: 'Vernieuw huidige pagina', + notLogin: + 'Het apparaat is nog niet gekoppeld. Log in en koppel dit apparaat aan uw account.', + urlPeriod: 'Deze url is 10 minuten geldig', + login: 'Inloggen', + loginSuccess: 'Inloggen gelukt', + enable: 'Tailscale inschakelen', + deviceName: 'Apparaatnaam', + deviceIP: 'Apparaat IP', + account: 'Account', + logout: 'Uitloggen', + logout2: 'Weet u zeker dat u wilt uitloggen?' + }, + update: { + title: 'Controleren op updates', + queryFailed: 'Ophalen versie mislukt', + updateFailed: 'Update mislukt. Probeer het opnieuw.', + isLatest: 'U heeft al de nieuwste versie.', + available: 'Er is een update beschikbaar. Weet u zeker dat u wilt updaten?', + updating: 'Update gestart. Even geduld a.u.b...', + confirm: 'Bevestigen', + cancel: 'Annuleren' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/pl.ts b/web/src/i18n/locales/pl.ts index d20a39c..add8dde 100644 --- a/web/src/i18n/locales/pl.ts +++ b/web/src/i18n/locales/pl.ts @@ -1,25 +1,11 @@ const pl = { translation: { - language: 'Język', - changePassword: 'Zmień hasło', - logout: 'Wyloguj', - settings: 'Ustawienia', - showMouse: 'Pokaż myszkę', - hideMouse: 'Ukryj myszkę', - power: 'Zasilanie', - reset: 'Reset', - powerShort: 'Zasilanie (krótkie kliknięcie)', - powerLong: 'Zasilanie (długie kliknięcie)', - hddLed: 'HDD LED', - checkLibFailed: 'Nie udało się sprawdzić biblioteki uruchomieniowej, spróbuj ponownie', - updateLibFailed: 'Nie udało się zaktualizować biblioteki uruchomieniowej, spróbuj ponownie', - updatingLib: 'Aktualizowanie biblioteki uruchomieniowej. Odśwież stronę po aktualizacji.', - checkForUpdate: 'Aktualizacja systemu', head: { desktop: 'Zdalny pulpit', login: 'Login', changePassword: 'Zmień Hasło', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Login', @@ -39,14 +25,20 @@ const pl = { illegalUsername: 'nazwa użytkownika zawiera niedozwolone znaki', illegalPassword: 'hasło zawiera niedozwolone znaki', forgetPassword: 'Zapomiałeś hasła?', - resetPassword: 'Zmień hasło', - reset1: 'Jeśli zapomniałeś hasła, postępuj zgodnie z instrukcjami, aby je zresetować:', - reset2: '1. Zaloguj się do urządzenia NanoKVM przez SSH:', - reset3: '2. Usuń ten plik z urządzenia: ', - reset4: '3. Użyj domyślnego login aby zalogować: ', ok: 'Ok', cancel: 'Anuluj', - loginButtonText: 'Zaloguj się' + loginButtonText: 'Zaloguj się', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } }, screen: { video: 'Tryb wideo', @@ -131,60 +123,113 @@ const pl = { confirm: 'Ok' }, wol: { + title: 'Wake-on-LAN', sending: 'Wysyłanie komendy...', sent: 'Komenda wysłana', input: 'Wprowadź numer adresu MAC', ok: 'Ok' }, - about: { - title: 'NanoKVM - informacje', - information: 'Informacje o systemie', - ip: 'IP', - mdns: 'mDNS', - application: 'Wersja oprogramowania', - image: 'Wersja obrazu', - deviceKey: 'Klucz urządzenia', - queryFailed: 'Zapytanie nie powiodło się', - community: 'Społeczność' + power: { + title: 'Zasilanie', + reset: 'Reset', + power: 'Zasilanie', + powerShort: 'Zasilanie (krótkie kliknięcie)', + powerLong: 'Zasilanie (długie kliknięcie)' }, - update: { - title: 'Sprawdź aktualizacje', - queryFailed: 'Uzyskanie wersji nie powiodło się', - updateFailed: 'Aktualizacja nie powiodła się. Spróbuj ponownie.', - isLatest: 'Oprogramowanie jest aktualne.', - available: 'Aktualizacja jest dostępna. Czy na pewno chcesz dokonać aktualizacji?', - updating: 'Aktualizacja rozpoczęta. Proszę czekać...', - confirm: 'Potwierdź', - cancel: 'Anuluj' - }, - virtualDevice: { - network: 'Sieć wirtualna', - usb: 'Dysk wirtualny' - }, - tailscale: { - loading: 'Ładowanie...', - notInstall: 'Nie znaleziono Tailscale! Proszę zainstalować.', - install: 'Instaluj', - installing: 'Instalowanie', - failed: 'Instalowanie nie powiodło się', - retry: 'Odśwież stronę i spróbuj ponownie, albo spróbuj zainstalować manualnie.', - download: 'Pobierz', - package: 'pakiet instalacyjny', - unzip: 'i wypakuj pliki', - upTailscale: 'Prześlij tailscale do NanoKVM w katalogu /usr/bin/', - upTailscaled: 'Prześlij tailscaled do NanoKVM w katalogu /usr/sbin/', - refresh: 'Odśwież obecną stronę', - notLogin: - 'Urządzenie nie zostało jeszcze powiązane. Zaloguj się i powiąż to urządzenie ze swoim kontem.', - urlPeriod: 'Ten URL jest ważny przez 10 minut', - login: 'Zaloguj', - loginSuccess: 'Zalogowanie pomyślne', - enable: 'Włącz Tailscale', - deviceName: 'Nazwa urządzenia', - deviceIP: 'Adres IP urządzenia', - account: 'Konto', - logout: 'Wyloguj', - logout2: 'Chcesz się wylogować?' + settings: { + title: 'Settings', + about: { + title: 'NanoKVM - informacje', + information: 'Informacje o systemie', + ip: 'IP', + mdns: 'mDNS', + application: 'Wersja oprogramowania', + applicationTip: 'NanoKVM web application version', + image: 'Wersja obrazu', + imageTip: 'NanoKVM system image version', + deviceKey: 'Klucz urządzenia', + community: 'Społeczność' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Ładowanie...', + notInstall: 'Nie znaleziono Tailscale! Proszę zainstalować.', + install: 'Instaluj', + installing: 'Instalowanie', + failed: 'Instalowanie nie powiodło się', + retry: 'Odśwież stronę i spróbuj ponownie, albo spróbuj zainstalować manualnie.', + download: 'Pobierz', + package: 'pakiet instalacyjny', + unzip: 'i wypakuj pliki', + upTailscale: 'Prześlij tailscale do NanoKVM w katalogu /usr/bin/', + upTailscaled: 'Prześlij tailscaled do NanoKVM w katalogu /usr/sbin/', + refresh: 'Odśwież obecną stronę', + notLogin: + 'Urządzenie nie zostało jeszcze powiązane. Zaloguj się i powiąż to urządzenie ze swoim kontem.', + urlPeriod: 'Ten URL jest ważny przez 10 minut', + login: 'Zaloguj', + loginSuccess: 'Zalogowanie pomyślne', + enable: 'Włącz Tailscale', + deviceName: 'Nazwa urządzenia', + deviceIP: 'Adres IP urządzenia', + account: 'Konto', + logout: 'Wyloguj', + logout2: 'Chcesz się wylogować?' + }, + update: { + title: 'Sprawdź aktualizacje', + queryFailed: 'Uzyskanie wersji nie powiodło się', + updateFailed: 'Aktualizacja nie powiodła się. Spróbuj ponownie.', + isLatest: 'Oprogramowanie jest aktualne.', + available: 'Aktualizacja jest dostępna. Czy na pewno chcesz dokonać aktualizacji?', + updating: 'Aktualizacja rozpoczęta. Proszę czekać...', + confirm: 'Potwierdź', + cancel: 'Anuluj' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/ru.ts b/web/src/i18n/locales/ru.ts index 523ff7c..845f8d7 100644 --- a/web/src/i18n/locales/ru.ts +++ b/web/src/i18n/locales/ru.ts @@ -1,29 +1,11 @@ const ru = { translation: { - language: 'Язык', - changePassword: 'Изменить пароль', - logout: 'Выйти', - images: 'Образы', - loading: 'Загрузка', - empty: 'Пусто', - settings: 'Настройки', - showMouse: 'Показать мышь', - hideMouse: 'Скрыть мышь', - power: 'Питание', - reset: 'Экстренная перезагрузка', - powerShort: 'Питание (короткое нажатие)', - powerLong: 'Питание (длинное нажатие)', - hddLed: 'Индикатор активности хранилища', - checkLibFailed: 'Не удалось проверить библиотеку среды выполнения, попробуйте еще раз', - updateLibFailed: 'Не удалось обновить библиотеку среды выполнения, попробуйте еще раз', - updatingLib: - 'Обновление библиотеки среды выполнения. Пожалуйста, обновите страницу после обновления.', - checkForUpdate: 'Проверить обновления', head: { desktop: 'Удаленный рабочий стол', login: 'Войти', changePassword: 'Изменить пароль', - terminal: 'Терминал' + terminal: 'Терминал', + wifi: 'Wi-Fi' }, auth: { login: 'Войти', @@ -43,14 +25,28 @@ const ru = { illegalUsername: 'Имя пользователя содержит недопустимые символы', illegalPassword: 'Пароль содержит недопустимые символы', forgetPassword: 'Забыли пароль?', - resetPassword: 'Сбросить пароль', - reset1: 'Если вы забыли пароль, выполните следующие действия для его восстановления:', - reset2: '1. Войдите в устройство NanoKVM по протоколу SSH;', - reset3: '2. Удалите файл на устройстве: ', - reset4: '3. Используйте учетную запись по умолчанию для входа в систему: ', ok: 'ОК', cancel: 'Отмена', - loginButtonText: 'Войти' + loginButtonText: 'Войти', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Видеорежим', @@ -135,59 +131,112 @@ const ru = { confirm: 'ОК' }, wol: { + title: 'Wake-on-LAN', sending: 'Отправка команды...', sent: 'Команда отправлена', input: 'Введите MAC-адрес', ok: 'ОК' }, - about: { - title: 'О системе NanoKVM', - information: 'Информация', - ip: 'IP-адрес', - mdns: 'Доменное имя mDNS', - application: 'Версия ПО', - image: 'Версия прошивки', - deviceKey: 'Ключ устройства', - queryFailed: 'Запрос не удался', - community: 'Сообщество' + power: { + title: 'Питание', + reset: 'Экстренная перезагрузка', + power: 'Питание', + powerShort: 'Питание (короткое нажатие)', + powerLong: 'Питание (длинное нажатие)' }, - update: { - title: 'Проверить обновления', - queryFailed: 'Получить версию не удалось', - updateFailed: 'Обновление не удалось. Пожалуйста, попробуйте еще раз.', - isLatest: 'У вас уже есть последняя версия.', - available: 'Доступно обновление. Вы уверены, что хотите обновить?', - updating: 'Начато обновление. Пожалуйста, подождите...', - confirm: 'Подтвердить', - cancel: 'Отмена' - }, - virtualDevice: { - network: 'виртуальная сетевая карта', - disk: 'виртуальный диск' - }, - tailscale: { - loading: 'Загрузка...', - notInstall: 'Tailscale не найден! Пожалуйста, установите.', - install: 'Установить', - installing: 'Установка', - failed: 'Не удалось установить', - retry: 'Пожалуйста, обновите и попробуйте снова, или попробуйте установить вручную', - download: 'Скачайте', - package: 'установочный пакет', - unzip: 'и разархивируйте его', - upTailscale: 'Переместите tailscale в каталог /usr/bin/ на NanoKVM', - upTailscaled: 'Переместите tailscaled в каталог /usr/sbin/ на NanoKVM', - refresh: 'Обновите текущую страницу', - notLogin: 'Устройство не привязано. Войдите, чтобы привязать его к аккаунту.', - urlPeriod: 'Этот адрес действителен в течение 10 минут', - login: 'Войти', - loginSuccess: 'Вход выполнен', - enable: 'Включить Tailscale', - deviceName: 'Имя устройства', - deviceIP: 'IP адрес устройства', - account: 'аккаунт', - logout: 'Выход', - logout2: 'Вы действительно хотите выйти?' + settings: { + title: 'Settings', + about: { + title: 'О системе NanoKVM', + information: 'Информация', + ip: 'IP-адрес', + mdns: 'Доменное имя mDNS', + application: 'Версия ПО', + applicationTip: 'NanoKVM web application version', + image: 'Версия прошивки', + imageTip: 'NanoKVM system image version', + deviceKey: 'Ключ устройства', + community: 'Сообщество' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Загрузка...', + notInstall: 'Tailscale не найден! Пожалуйста, установите.', + install: 'Установить', + installing: 'Установка', + failed: 'Не удалось установить', + retry: 'Пожалуйста, обновите и попробуйте снова, или попробуйте установить вручную', + download: 'Скачайте', + package: 'установочный пакет', + unzip: 'и разархивируйте его', + upTailscale: 'Переместите tailscale в каталог /usr/bin/ на NanoKVM', + upTailscaled: 'Переместите tailscaled в каталог /usr/sbin/ на NanoKVM', + refresh: 'Обновите текущую страницу', + notLogin: 'Устройство не привязано. Войдите, чтобы привязать его к аккаунту.', + urlPeriod: 'Этот адрес действителен в течение 10 минут', + login: 'Войти', + loginSuccess: 'Вход выполнен', + enable: 'Включить Tailscale', + deviceName: 'Имя устройства', + deviceIP: 'IP адрес устройства', + account: 'аккаунт', + logout: 'Выход', + logout2: 'Вы действительно хотите выйти?' + }, + update: { + title: 'Проверить обновления', + queryFailed: 'Получить версию не удалось', + updateFailed: 'Обновление не удалось. Пожалуйста, попробуйте еще раз.', + isLatest: 'У вас уже есть последняя версия.', + available: 'Доступно обновление. Вы уверены, что хотите обновить?', + updating: 'Начато обновление. Пожалуйста, подождите...', + confirm: 'Подтвердить', + cancel: 'Отмена' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/uk.ts b/web/src/i18n/locales/uk.ts index 7f66aa1..821a2f6 100644 --- a/web/src/i18n/locales/uk.ts +++ b/web/src/i18n/locales/uk.ts @@ -1,25 +1,11 @@ const uk = { translation: { - language: 'Мова', - changePassword: 'Змінити пароль', - logout: 'Вийти', - settings: 'Налаштування', - showMouse: 'Показати мишу', - hideMouse: 'Сховати мишу', - power: 'Живлення', - reset: 'Скидання', - powerShort: 'Живлення (коротке натискання)', - powerLong: 'Живлення (довге натискання)', - hddLed: 'Індикатор HDD', - checkLibFailed: 'Не вдалося перевірити бібліотеку виконання, спробуйте ще раз', - updateLibFailed: 'Не вдалося оновити бібліотеку виконання, спробуйте ще раз', - updatingLib: 'Оновлення бібліотеки виконано. Оновіть сторінку після оновлення.', - checkForUpdate: 'Перевірити оновлення', head: { desktop: 'Віддалений робочий стіл', login: 'Вхід', changePassword: 'Змінити пароль', - terminal: 'Термінал' + terminal: 'Термінал', + wifi: 'Wi-Fi' }, auth: { login: 'Вхід', @@ -39,14 +25,28 @@ const uk = { illegalUsername: "ім'я користувача містить недопустимі символи", illegalPassword: 'пароль містить недопустимі символи', forgetPassword: 'Забули пароль', - resetPassword: 'Скинути пароль', - reset1: 'Якщо ви забули пароль, виконайте наступні кроки для його скидання:', - reset2: '1. Увійдіть на пристрій NanoKVM через SSH;', - reset3: '2. Видаліть файл на пристрої: ', - reset4: '3. Використовуйте обліковий запис за замовчуванням для входу: ', ok: 'Ок', cancel: 'Скасувати', - loginButtonText: 'Увійти' + loginButtonText: 'Увійти', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Відеорежим', @@ -132,60 +132,113 @@ const uk = { confirm: 'Ок' }, wol: { + title: 'Wake-on-LAN', sending: 'Посилання команди...', sent: 'Команду відправлено', input: 'Будь ласка, введіть MAC', ok: 'Ок' }, - about: { - title: 'Про NanoKVM', - information: 'Інформація', - ip: 'IP', - mdns: 'mDNS', - application: 'Версія додатку', - image: 'Версія образу', - deviceKey: 'Ключ пристрою', - queryFailed: 'Запит не вдався', - community: 'Спільнота' + power: { + title: 'Живлення', + reset: 'Скидання', + power: 'Живлення', + powerShort: 'Живлення (коротке натискання)', + powerLong: 'Живлення (довге натискання)' }, - update: { - title: 'Перевірити оновлення', - queryFailed: 'Не вдалося отримати версію', - updateFailed: 'Оновлення не вдалося. Будь ласка, спробуйте ще раз.', - isLatest: 'У вас вже остання версія.', - available: 'Доступне оновлення. Ви впевнені, що хочете оновити?', - updating: 'Оновлення розпочато. Будь ласка, зачекайте...', - confirm: 'Підтвердити', - cancel: 'Скасувати' - }, - virtualDevice: { - network: 'Віртуальна мережа', - disk: 'Віртуальний диск' - }, - tailscale: { - loading: 'Завантаження...', - notInstall: 'Tailscale не знайдено! Будь ласка, встановіть клієнт Tailscale.', - install: 'Встановити', - installing: 'Встановлення', - failed: 'Не вдалося встановити', - retry: 'Будь ласка, оновіть сторінку та спробуйте ще раз. Або спробуйте встановити вручну', - download: 'Завантажте', - package: 'пакет встановлення', - unzip: 'та розпакуйте його', - upTailscale: 'Завантажте tailscale до каталогу /usr/bin/ на NanoKVM', - upTailscaled: 'Завантажте tailscaled до каталогу /usr/sbin/ на NanoKVM', - refresh: 'Оновіть поточну сторінку', - notLogin: - "Пристрій ще не прив'язаний. Будь ласка, увійдіть і прив'яжіть цей пристрій до вашого облікового запису.", - urlPeriod: 'Ця URL-адреса дійсна протягом 10 хвилин', - login: 'Увійти', - loginSuccess: 'Успішний вхід', - enable: 'Увімкнути Tailscale', - deviceName: 'Назва пристрою', - deviceIP: 'IP пристрою', - account: 'Обліковий запис', - logout: 'Вийти', - logout2: 'Ви впевнені, що хочете вийти?' + settings: { + title: 'Settings', + about: { + title: 'Про NanoKVM', + information: 'Інформація', + ip: 'IP', + mdns: 'mDNS', + application: 'Версія додатку', + applicationTip: 'NanoKVM web application version', + image: 'Версія образу', + imageTip: 'NanoKVM system image version', + deviceKey: 'Ключ пристрою', + community: 'Спільнота' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Завантаження...', + notInstall: 'Tailscale не знайдено! Будь ласка, встановіть клієнт Tailscale.', + install: 'Встановити', + installing: 'Встановлення', + failed: 'Не вдалося встановити', + retry: 'Будь ласка, оновіть сторінку та спробуйте ще раз. Або спробуйте встановити вручну', + download: 'Завантажте', + package: 'пакет встановлення', + unzip: 'та розпакуйте його', + upTailscale: 'Завантажте tailscale до каталогу /usr/bin/ на NanoKVM', + upTailscaled: 'Завантажте tailscaled до каталогу /usr/sbin/ на NanoKVM', + refresh: 'Оновіть поточну сторінку', + notLogin: + "Пристрій ще не прив'язаний. Будь ласка, увійдіть і прив'яжіть цей пристрій до вашого облікового запису.", + urlPeriod: 'Ця URL-адреса дійсна протягом 10 хвилин', + login: 'Увійти', + loginSuccess: 'Успішний вхід', + enable: 'Увімкнути Tailscale', + deviceName: 'Назва пристрою', + deviceIP: 'IP пристрою', + account: 'Обліковий запис', + logout: 'Вийти', + logout2: 'Ви впевнені, що хочете вийти?' + }, + update: { + title: 'Перевірити оновлення', + queryFailed: 'Не вдалося отримати версію', + updateFailed: 'Оновлення не вдалося. Будь ласка, спробуйте ще раз.', + isLatest: 'У вас вже остання версія.', + available: 'Доступне оновлення. Ви впевнені, що хочете оновити?', + updating: 'Оновлення розпочато. Будь ласка, зачекайте...', + confirm: 'Підтвердити', + cancel: 'Скасувати' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/vi.ts b/web/src/i18n/locales/vi.ts index 75b05a2..421e236 100644 --- a/web/src/i18n/locales/vi.ts +++ b/web/src/i18n/locales/vi.ts @@ -1,25 +1,11 @@ const vi = { translation: { - language: 'Ngôn ngữ', - changePassword: 'Đổi mật khẩu', - logout: 'Đăng xuất', - settings: 'Cài đặt', - showMouse: 'Hiển thị chuột', - hideMouse: 'Ẩn chuột', - power: 'Nguồn', - reset: 'Đặt lại', - powerShort: 'Nguồn (nhấp ngắn)', - powerLong: 'Nguồn (nhấp dài)', - hddLed: 'Đèn HDD', - checkLibFailed: 'Kiểm tra thư viện runtime thất bại, vui lòng thử lại', - updateLibFailed: 'Cập nhật thư viện runtime thất bại, vui lòng thử lại', - updatingLib: 'Đang cập nhật thư viện runtime. Vui lòng làm mới trang sau khi cập nhật.', - checkForUpdate: 'Kiểm tra cập nhật', head: { desktop: 'Remote Desktop', login: 'Đăng nhập', changePassword: 'Đổi mật khẩu', - terminal: 'Terminal' + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { login: 'Đăng nhập', @@ -38,14 +24,28 @@ const vi = { illegalUsername: 'tên người dùng chứa ký tự không hợp lệ', illegalPassword: 'mật khẩu chứa ký tự không hợp lệ', forgetPassword: 'Quên mật khẩu', - resetPassword: 'Đặt lại mật khẩu', - reset1: 'Nếu bạn quên mật khẩu, vui lòng làm theo các bước sau để đặt lại:', - reset2: '1. Đăng nhập vào thiết bị NanoKVM qua SSH;', - reset3: '2. Xóa tệp trong thiết bị: ', - reset4: '3. Sử dụng tài khoản mặc định để đăng nhập: ', ok: 'OK', cancel: 'Hủy', - loginButtonText: 'Đăng nhập' + loginButtonText: 'Đăng nhập', + tips: { + reset1: + 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', + reset2: 'For detailed steps, please consult this document:', + reset3: 'Web default account:', + reset4: 'SSH default account:', + change1: 'Please note that this action will change the following passwords:', + change2: 'Web login password', + change3: 'System root password (SSH login password)', + change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi for NanoKVM', + success: 'Please check the network status of NanoKVM and visit the new IP address.', + failed: 'Operation failed, please try again.', + confirmBtn: 'Ok', + finishBtn: 'Finished' }, screen: { video: 'Chế độ video', @@ -130,60 +130,113 @@ const vi = { confirm: 'OK' }, wol: { + title: 'Wake-on-LAN', sending: 'Đang gửi lệnh...', sent: 'Đã gửi lệnh', input: 'Vui lòng nhập địa chỉ MAC', ok: 'OK' }, - about: { - title: 'Giới thiệu về NanoKVM', - information: 'Thông tin', - ip: 'IP', - mdns: 'mDNS', - application: 'Phiên bản Ứng dụng', - image: 'Phiên bản Hình ảnh', - deviceKey: 'Khóa Thiết bị', - queryFailed: 'Truy vấn thất bại', - community: 'Cộng đồng' + power: { + title: 'Nguồn', + reset: 'Đặt lại', + power: 'Nguồn', + powerShort: 'Nguồn (nhấp ngắn)', + powerLong: 'Nguồn (nhấp dài)' }, - update: { - title: 'Kiểm tra cập nhật', - queryFailed: 'Lấy phiên bản thất bại', - updateFailed: 'Cập nhật thất bại. Vui lòng thử lại.', - isLatest: 'Bạn đã có phiên bản mới nhất.', - available: 'Có bản cập nhật mới. Bạn có chắc chắn muốn cập nhật không?', - updating: 'Bắt đầu cập nhật. Vui lòng chờ...', - confirm: 'Xác nhận', - cancel: 'Hủy' - }, - virtualDevice: { - network: 'Mạng Ảo', - disk: 'Đĩa Ảo' - }, - tailscale: { - loading: 'Đang tải...', - notInstall: 'Không tìm thấy Tailscale! Vui lòng cài đặt.', - install: 'Cài đặt', - installing: 'Đang cài đặt', - failed: 'Cài đặt thất bại', - retry: 'Vui lòng làm mới và thử lại. Hoặc thử cài đặt thủ công', - download: 'Tải xuống', - package: 'gói cài đặt', - unzip: 'và giải nén nó', - upTailscale: 'Tải tailscale lên thư mục /usr/bin/ của NanoKVM', - upTailscaled: 'Tải tailscaled lên thư mục /usr/sbin/ của NanoKVM', - refresh: 'Làm mới trang hiện tại', - notLogin: - 'Thiết bị chưa được liên kết. Vui lòng đăng nhập và liên kết thiết bị này với tài khoản của bạn.', - urlPeriod: 'URL này có hiệu lực trong 10 phút', - login: 'Đăng nhập', - loginSuccess: 'Đăng nhập thành công', - enable: 'Kích hoạt Tailscale', - deviceName: 'Tên Thiết bị', - deviceIP: 'IP Thiết bị', - account: 'Tài khoản', - logout: 'Đăng xuất', - logout2: 'Bạn có chắc chắn muốn đăng xuất không?' + settings: { + title: 'Settings', + about: { + title: 'Giới thiệu về NanoKVM', + information: 'Thông tin', + ip: 'IP', + mdns: 'mDNS', + application: 'Phiên bản Ứng dụng', + applicationTip: 'NanoKVM web application version', + image: 'Phiên bản Hình ảnh', + imageTip: 'NanoKVM system image version', + deviceKey: 'Khóa Thiết bị', + community: 'Cộng đồng' + }, + appearance: { + title: 'Appearance', + display: 'Display', + language: 'Language', + menuBar: 'Menu Bar', + menuBarDesc: 'Display icons in the menu bar' + }, + device: { + title: 'Device', + oled: { + title: 'OLED', + description: 'OLED screen automatically sleep', + 0: 'Never', + 15: '15 sec', + 30: '30 sec', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 hour' + }, + wifi: { + title: 'Wi-Fi', + description: 'Configure Wi-Fi', + setBtn: 'Config' + }, + disk: 'Virtual Disk', + diskDesc: 'Mount virtual U-disk on the remote host', + network: 'Virtual Network', + networkDesc: 'Mount virtual network card on the remote host', + memory: { + title: 'Memory optimization', + tip: 'When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory.', + disable: 'Disable' + } + }, + tailscale: { + title: 'Tailscale', + loading: 'Đang tải...', + notInstall: 'Không tìm thấy Tailscale! Vui lòng cài đặt.', + install: 'Cài đặt', + installing: 'Đang cài đặt', + failed: 'Cài đặt thất bại', + retry: 'Vui lòng làm mới và thử lại. Hoặc thử cài đặt thủ công', + download: 'Tải xuống', + package: 'gói cài đặt', + unzip: 'và giải nén nó', + upTailscale: 'Tải tailscale lên thư mục /usr/bin/ của NanoKVM', + upTailscaled: 'Tải tailscaled lên thư mục /usr/sbin/ của NanoKVM', + refresh: 'Làm mới trang hiện tại', + notLogin: + 'Thiết bị chưa được liên kết. Vui lòng đăng nhập và liên kết thiết bị này với tài khoản của bạn.', + urlPeriod: 'URL này có hiệu lực trong 10 phút', + login: 'Đăng nhập', + loginSuccess: 'Đăng nhập thành công', + enable: 'Kích hoạt Tailscale', + deviceName: 'Tên Thiết bị', + deviceIP: 'IP Thiết bị', + account: 'Tài khoản', + logout: 'Đăng xuất', + logout2: 'Bạn có chắc chắn muốn đăng xuất không?' + }, + update: { + title: 'Kiểm tra cập nhật', + queryFailed: 'Lấy phiên bản thất bại', + updateFailed: 'Cập nhật thất bại. Vui lòng thử lại.', + isLatest: 'Bạn đã có phiên bản mới nhất.', + available: 'Có bản cập nhật mới. Bạn có chắc chắn muốn cập nhật không?', + updating: 'Bắt đầu cập nhật. Vui lòng chờ...', + confirm: 'Xác nhận', + cancel: 'Hủy' + }, + account: { + title: 'Account', + webAccount: 'Web Account Name', + password: 'Password', + updateBtn: 'Update', + logoutBtn: 'Logout' + } } } }; diff --git a/web/src/i18n/locales/zh.ts b/web/src/i18n/locales/zh.ts index 18739b5..36736e3 100644 --- a/web/src/i18n/locales/zh.ts +++ b/web/src/i18n/locales/zh.ts @@ -1,25 +1,11 @@ const zh = { translation: { - currentVersion: '版本', - latestVersion: '最新版本:', - changePassword: '修改密码', - logout: '登出', - settings: '设置', - showMouse: '显示鼠标', - hideMouse: '隐藏鼠标', - power: '电源', - reset: '重启', - powerShort: '电源(短按)', - powerLong: '电源(长按)', - hddLed: '硬盘指示灯', - checkLibFailed: '检查运行库失败,请重试', - updateLibFailed: '更新运行库失败,请重试', - updatingLib: '正在更新运行库。更新完成后请刷新页面。', head: { desktop: '远程桌面', login: '登录', changePassword: '修改密码', - terminal: '终端' + terminal: '终端', + wifi: 'Wi-Fi' }, auth: { login: '登录', @@ -32,19 +18,32 @@ const zh = { invalidUser: '用户名或密码错误', error: '未知错误', changePassword: '修改密码', - changePasswordDesc: '为了您的设备安全,请修改网页登录密码。', + changePasswordDesc: '为了您的设备安全,请修改密码!', differentPassword: '两次密码不一致', illegalUsername: '用户名中包含非法字符', illegalPassword: '密码中包含非法字符', forgetPassword: '忘记密码', - resetPassword: '重置密码', - reset1: '如果您忘记了登录密码,请按照以下步骤重置密码:', - reset2: '1. 通过 SSH 登录到您的 NanoKVM 设备', - reset3: '2. 删除设备中的文件:', - reset4: '3. 使用默认的账号登录: ', ok: '确定', cancel: '取消', - loginButtonText: '登录' + loginButtonText: '登录', + tips: { + reset1: '长按 NanoKVM 上的 BOOT 按键 10 秒钟来重置帐号。', + reset2: '详细操作步骤可参考此文档:', + reset3: '网页默认帐号:', + reset4: 'SSH 默认帐号:', + change1: '请注意,此操作将同时更新以下密码:', + change2: '网页的登录密码', + change3: '系统 root 用户的密码(SSH 登录密码)', + change4: '如果您忘记了密码,需要长按 NanoKVM 上的 BOOT 按键来重置密码。' + } + }, + wifi: { + title: 'Wi-Fi', + description: '配置 NanoKVM Wi-Fi 信息', + success: '请检查 NanoKVM 的网络状态,并访问新的 IP 地址。', + failed: '操作失败,请重试。', + confirmBtn: '确定', + finishBtn: '完成' }, screen: { video: '视频模式', @@ -127,59 +126,112 @@ const zh = { confirm: '确定' }, wol: { + title: 'Wake-on-LAN', sending: '指令发送中...', sent: '指令已发送', input: '请输入MAC地址', ok: '确定' }, - about: { - title: '关于 NanoKVM', - information: '信息', - ip: 'IP', - mdns: 'mDNS', - application: '应用版本', - image: '镜像版本', - deviceKey: '设备码', - queryFailed: '查询失败', - community: '社区' + power: { + title: '电源', + reset: '重启', + power: '电源', + powerShort: '电源(短按)', + powerLong: '电源(长按)' }, - update: { - title: '检查更新', - queryFailed: '获取版本号失败', - updateFailed: '更新失败,请重试', - isLatest: '已经是最新版本。', - available: '有新的可用版本,确定要更新吗?', - updating: '更新中,请稍候...', - confirm: '确定', - cancel: '取消' - }, - virtualDevice: { - network: '虚拟网卡', - disk: '虚拟硬盘' - }, - tailscale: { - loading: '加载中...', - notInstall: '未检测到 Tailscale,请先安装', - install: '安装', - installing: '安装中', - failed: '安装失败', - retry: '请刷新后重试,或尝试手动安装', - download: '下载', - package: '安装包', - unzip: '并解压', - upTailscale: '将 tailscale 文件上传到 /usr/bin/ 目录', - upTailscaled: '将 tailscaled 文件上传到 /usr/sbin/ 目录', - refresh: '刷新页面', - notLogin: '该设备尚未绑定,请点击登录并将这台设备绑定到您的账号。', - urlPeriod: '该链接10分钟内有效', - login: '登录', - loginSuccess: '登录完成', - enable: '启用 Tailscale', - deviceName: '设备名称', - deviceIP: '设备地址', - account: '账号', - logout: '退出', - logout2: '确认退出?' + settings: { + title: '设置', + about: { + title: '关于 NanoKVM', + information: '信息', + ip: 'IP', + mdns: 'mDNS', + application: '应用版本', + applicationTip: 'NanoKVM 网页应用版本', + image: '镜像版本', + imageTip: 'NanoKVM 系统镜像版本', + deviceKey: '设备码', + community: '社区' + }, + appearance: { + title: '外观', + display: '显示', + language: '语言', + menuBar: '菜单栏', + menuBarDesc: '是否在菜单栏中显示图标' + }, + device: { + title: '设备', + oled: { + title: 'OLED', + description: '设置 OLED 屏幕自动休眠时间', + 0: '永不', + 15: '15秒', + 30: '30秒', + 60: '1分钟', + 180: '3分钟', + 300: '5分钟', + 600: '10分钟', + 1800: '30分钟', + 3600: '1小时' + }, + wifi: { + title: 'Wi-Fi', + description: '配置 Wi-Fi 信息', + setBtn: '设置' + }, + disk: '虚拟U盘', + diskDesc: '在远程主机中挂载虚拟U盘', + network: '虚拟网卡', + networkDesc: '在远程主机中挂载虚拟网卡', + memory: { + title: '内存优化', + tip: '当内存占用超过限制时,会更积极地执行垃圾回收来尝试释放内存', + disable: '关闭' + } + }, + tailscale: { + title: 'Tailscale', + loading: '加载中...', + notInstall: '未检测到 Tailscale,请先安装', + install: '安装', + installing: '安装中', + failed: '安装失败', + retry: '请刷新后重试,或尝试手动安装', + download: '下载', + package: '安装包', + unzip: '并解压', + upTailscale: '将 tailscale 文件上传到 /usr/bin/ 目录', + upTailscaled: '将 tailscaled 文件上传到 /usr/sbin/ 目录', + refresh: '刷新页面', + notLogin: '该设备尚未绑定,请点击登录并将这台设备绑定到您的账号。', + urlPeriod: '该链接10分钟内有效', + login: '登录', + loginSuccess: '登录完成', + enable: '启用 Tailscale', + deviceName: '设备名称', + deviceIP: '设备地址', + account: '账号', + logout: '退出', + logout2: '确认退出?' + }, + update: { + title: '检查更新', + queryFailed: '获取版本号失败', + updateFailed: '更新失败,请重试', + isLatest: '已经是最新版本。', + available: '有新的可用版本,确定要更新吗?', + updating: '更新中,请稍候...', + confirm: '确定', + cancel: '取消' + }, + account: { + title: '帐号', + webAccount: '网页帐号', + password: '密码', + updateBtn: '修改', + logoutBtn: '退出' + } } } }; diff --git a/web/src/i18n/locales/zh_tw.ts b/web/src/i18n/locales/zh_tw.ts index 93e225f..c53bd42 100644 --- a/web/src/i18n/locales/zh_tw.ts +++ b/web/src/i18n/locales/zh_tw.ts @@ -1,25 +1,11 @@ const zh_tw = { translation: { - language: '語言', - changePassword: '更改密碼', - logout: '登出', - settings: '設定', - showMouse: '顯示滑鼠游標', - hideMouse: '隱藏滑鼠游標', - power: '電源', - reset: '重新啟動', - powerShort: '電源 (短按)', - powerLong: '電源 (長按)', - hddLed: '硬碟 LED', - checkLibFailed: '檢查執行階段函式庫失敗,請重試', - updateLibFailed: '更新執行階段函式庫失敗,請重試', - updatingLib: '正在更新執行階段函式庫。更新完成後請重新整理頁面。', - checkForUpdate: '檢查更新', head: { desktop: '遠端桌面', login: '登入', changePassword: '更改密碼', - terminal: '終端機' + terminal: '終端機', + wifi: 'Wi-Fi' }, auth: { login: '登入', @@ -32,26 +18,39 @@ const zh_tw = { invalidUser: '使用者名稱或密碼錯誤', error: '非預期性錯誤', changePassword: '更改密碼', - changePasswordDesc: '為了您的裝置安全,請修改網頁登入密碼。', + changePasswordDesc: '為了您的裝置安全,請修改登入密碼。', differentPassword: '密碼不一致', illegalUsername: '使用者名稱包含非法字元', illegalPassword: '密碼包含非法字元', forgetPassword: '忘記密碼', - resetPassword: '重設密碼', - reset1: '如果您忘記密碼,請按照以下步驟重設:', - reset2: '1. 透過 SSH 登入 NanoKVM 設備;', - reset3: '2. 刪除設備中的檔案:', - reset4: '3. 使用預設帳號登入:', ok: '確定', cancel: '取消', loginButtonText: '登入', + tips: { + reset1: '长按 NanoKVM 上的 BOOT 按键 10 秒钟来重置帐号。', + reset2: '详细操作步骤可参考此文档:', + reset3: '网页默认帐号:', + reset4: 'SSH 默认帐号:', + change1: '请注意,此操作将同时更新以下密码:', + change2: '网页的登录密码', + change3: '系统 root 用户的密码(SSH 登录密码)', + change4: '如果您忘记了密码,需要长按 NanoKVM 上的 BOOT 按键来重置密码。' + } + }, + wifi: { + title: 'Wi-Fi', + description: '配置 NanoKVM Wi-Fi 信息', + success: '请检查 NanoKVM 的网络状态,并访问新的 IP 地址。', + failed: '操作失败,请重试。', + confirmBtn: '确定', + finishBtn: '完成' }, screen: { video: '影片模式', resolution: '解析度', auto: '自動', autoTips: - "在特定解析度下可能會出現畫面撕裂或滑鼠偏移的情況。考慮調整遠端主機的解析度或停用自動模式。", + '在特定解析度下可能會出現畫面撕裂或滑鼠偏移的情況。考慮調整遠端主機的解析度或停用自動模式。', fps: '影格速率', customizeFps: '自定義', quality: '品質', @@ -60,8 +59,7 @@ const zh_tw = { qualityMedium: '中', qualityLow: '低', frameDetect: '影格檢測', - frameDetectTip: - "計算影格之間的差異。當遠端主機畫面未偵測到任何變更時,停止傳輸視訊串流。" + frameDetectTip: '計算影格之間的差異。當遠端主機畫面未偵測到任何變更時,停止傳輸視訊串流。' }, keyboard: { paste: '貼上', @@ -88,8 +86,7 @@ const zh_tw = { loading: '載入中...', empty: '未找到任何內容', mountFailed: '掛載失敗', - mountDesc: - "在某些系統中,在掛載映像之前需要中斷遠端主機上的虛擬磁碟。", + mountDesc: '在某些系統中,在掛載映像之前需要中斷遠端主機上的虛擬磁碟。', tips: { title: '如何上傳', usb1: '透過 USB 將 NanoKVM 連接到您的電腦。', @@ -129,60 +126,112 @@ const zh_tw = { confirm: '確定' }, wol: { + title: 'Wake-on-LAN', sending: '發送指令中...', sent: '指令已發送', input: '請輸入 MAC 位址', ok: '確定' }, - about: { - title: '關於 NanoKVM', - information: '資訊', - ip: 'IP', - mdns: 'mDNS', - application: '應用程式版本', - image: '映像版本', - deviceKey: '設備序號', - queryFailed: '查詢失敗', - community: '社群' + power: { + title: '電源', + reset: '重新啟動', + power: '電源', + powerShort: '電源 (短按)', + powerLong: '電源 (長按)' }, - update: { - title: '檢查更新', - queryFailed: '取得版本失敗', - updateFailed: '更新失敗。請重試。', - isLatest: '您已經擁有最新版本。', - available: '有可用更新。確定要更新嗎?', - updating: '正在更新。請稍等...', - confirm: '確定', - cancel: '取消' - }, - virtualDevice: { - network: '虛擬網路', - disk: '虛擬磁碟' - }, - tailscale: { - loading: '載入中...', - notInstall: 'Tailscale 未找到!請先安裝。', - install: '安裝', - installing: '安裝中', - failed: '安裝失敗', - retry: '請重新整理並重試。或嘗試手動安裝', - download: '下載', - package: '安裝包', - unzip: '並解壓縮它', - upTailscale: '將 tailscale 上傳到 NanoKVM 目錄 /usr/bin/', - upTailscaled: '將 tailscale 上傳到 NanoKVM 目錄 /usr/sbin/', - refresh: '重新整理頁面', - notLogin: - '設備尚未綁定。請登入並將該裝置綁定到您的帳戶。', - urlPeriod: '此網址有效期限為 10 分鐘', - login: '登入', - loginSuccess: '登入成功', - enable: '啟用 Tailscale', - deviceName: '裝置名稱', - deviceIP: '裝置 IP', - account: '帳號', - logout: '登出', - logout2: '確認登出?' + settings: { + title: '设置', + about: { + title: '關於 NanoKVM', + information: '資訊', + ip: 'IP', + mdns: 'mDNS', + application: '應用程式版本', + applicationTip: 'NanoKVM 网页应用版本', + image: '映像版本', + imageTip: 'NanoKVM 系统镜像版本', + deviceKey: '設備序號', + community: '社群' + }, + appearance: { + title: '外观', + display: '显示', + language: '语言', + menuBar: '菜单栏', + menuBarDesc: '是否在菜单栏中显示图标' + }, + device: { + title: '设备', + oled: { + title: 'OLED', + description: '设置 OLED 屏幕自动休眠时间', + 0: '永不', + 15: '15秒', + 30: '30秒', + 60: '1分钟', + 180: '3分钟', + 300: '5分钟', + 600: '10分钟', + 1800: '30分钟', + 3600: '1小时' + }, + wifi: { + title: 'Wi-Fi', + description: '配置 Wi-Fi 信息', + setBtn: '设置' + }, + disk: '虚拟U盘', + diskDesc: '在远程主机中挂载虚拟U盘', + network: '虚拟网卡', + networkDesc: '在远程主机中挂载虚拟网卡', + memory: { + title: '内存优化', + tip: '当内存占用超过限制时,会更积极地执行垃圾回收来尝试释放内存', + disable: '关闭' + } + }, + tailscale: { + title: 'Tailscale', + loading: '載入中...', + notInstall: 'Tailscale 未找到!請先安裝。', + install: '安裝', + installing: '安裝中', + failed: '安裝失敗', + retry: '請重新整理並重試。或嘗試手動安裝', + download: '下載', + package: '安裝包', + unzip: '並解壓縮它', + upTailscale: '將 tailscale 上傳到 NanoKVM 目錄 /usr/bin/', + upTailscaled: '將 tailscale 上傳到 NanoKVM 目錄 /usr/sbin/', + refresh: '重新整理頁面', + notLogin: '設備尚未綁定。請登入並將該裝置綁定到您的帳戶。', + urlPeriod: '此網址有效期限為 10 分鐘', + login: '登入', + loginSuccess: '登入成功', + enable: '啟用 Tailscale', + deviceName: '裝置名稱', + deviceIP: '裝置 IP', + account: '帳號', + logout: '登出', + logout2: '確認登出?' + }, + update: { + title: '檢查更新', + queryFailed: '取得版本失敗', + updateFailed: '更新失敗。請重試。', + isLatest: '您已經擁有最新版本。', + available: '有可用更新。確定要更新嗎?', + updating: '正在更新。請稍等...', + confirm: '確定', + cancel: '取消' + }, + account: { + title: '帐号', + webAccount: '网页帐号', + password: '密码', + updateBtn: '修改', + logoutBtn: '退出' + } } } }; diff --git a/web/src/jotai/settings.ts b/web/src/jotai/settings.ts index c115d37..f4336a9 100644 --- a/web/src/jotai/settings.ts +++ b/web/src/jotai/settings.ts @@ -1,4 +1,4 @@ import { atom } from 'jotai'; -// is settings popover opened -export const isSettingsOpenAtom = atom(false); +// menu bar disabled items +export const menuDisabledItemsAtom = atom([]); diff --git a/web/src/lib/localstorage.ts b/web/src/lib/localstorage.ts index 215be15..d59c011 100644 --- a/web/src/lib/localstorage.ts +++ b/web/src/lib/localstorage.ts @@ -9,7 +9,8 @@ const MOUSE_STYLE_KEY = 'nano-kvm-mouse-style'; const MOUSE_MODE_KEY = 'nano-kvm-mouse-mode'; const SKIP_UPDATE_KEY = 'nano-kvm-check-update'; const KEYBOARD_LAYOUT_KEY = 'nano-kvm-keyboard-layout'; -const SKIP_MODIFY_PASSWORD = 'nano-kvm-skip-modify-password'; +const SKIP_MODIFY_PASSWORD_KEY = 'nano-kvm-skip-modify-password'; +const MENU_DISABLED_ITEMS_KEY = 'nano-kvm-menu-disabled-items'; type ItemWithExpiry = { value: string; @@ -127,10 +128,20 @@ export function getKeyboardLayout() { export function setSkipModifyPassword(skip: boolean) { const expiry = 3 * 24 * 60 * 60 * 1000; // 3 days - setWithExpiry(SKIP_MODIFY_PASSWORD, String(skip), expiry); + setWithExpiry(SKIP_MODIFY_PASSWORD_KEY, String(skip), expiry); } export function getSkipModifyPassword() { - const skip = getWithExpiry(SKIP_MODIFY_PASSWORD); + const skip = getWithExpiry(SKIP_MODIFY_PASSWORD_KEY); return skip ? Boolean(skip) : false; } + +export function setMenuDisabledItems(items: string[]) { + const value = JSON.stringify(items); + localStorage.setItem(MENU_DISABLED_ITEMS_KEY, value); +} + +export function getMenuDisabledItems(): string[] { + const value = localStorage.getItem(MENU_DISABLED_ITEMS_KEY); + return value ? JSON.parse(value) : []; +} diff --git a/web/src/pages/auth/login/tips.tsx b/web/src/pages/auth/login/tips.tsx index ae3d1a3..6a04491 100644 --- a/web/src/pages/auth/login/tips.tsx +++ b/web/src/pages/auth/login/tips.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { Button, Modal, Typography } from 'antd'; +import { Button, Card, Modal, Typography } from 'antd'; import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -19,32 +19,43 @@ export const Tips = () => { return ( <> {t('auth.forgetPassword')} -

-
{t('auth.reset1')}
-
{t('auth.reset2')}
-
- {t('auth.reset3')} - /etc/kvm/pwd + +
+
{t('auth.tips.reset1')}
+ +
+ +
    +
  • + {t('auth.tips.reset3')} + admin/admin +
  • +
  • + {t('auth.tips.reset4')} + root/root +
  • +
-
- {t('auth.reset4')} - admin/admin -
-
+