Compare commits

...

10 Commits

Author SHA1 Message Date
lejianwen
bd13fe4ef4 up web client v2 2024-12-10 18:26:08 +08:00
lejianwen
6e1b208464 up README.md 2024-12-10 15:28:05 +08:00
lejianwen
76433a409e up README.md 2024-12-09 13:43:04 +08:00
lejianwen
9b4fa679c2 add batch add ab from peer
add batch update ab tags
2024-12-06 19:45:41 +08:00
lejianwen
c2ae95c4cc up api docs 2024-12-06 10:36:40 +08:00
lejianwen
b2b7f60fd5 add batch delete user token 2024-12-06 10:36:27 +08:00
lejianwen
a465888b31 up username length to 32 #70 2024-12-06 10:22:28 +08:00
lejianwen
d368bdc84c up web client v2 2024-12-04 13:43:04 +08:00
lejianwen
cdc1150505 up readme 2024-11-28 12:42:15 +08:00
32d525c53c Create LICENSE 2024-11-26 17:29:46 +08:00
22 changed files with 71902 additions and 71867 deletions

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024-present Lejianwen and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

200
README.md
View File

@@ -148,6 +148,7 @@
6. `v2 preview` 部署 6. `v2 preview` 部署
- 如果是通过`443`端口的`https`部署,必须配置反向代理,可以参考[官方文档](https://rustdesk.com/docs/en/self-host/rustdesk-server-pro/faq/#8-add-websocket-secure-wss-support-for-the-id-server-and-relay-server-to-enable-secure-communication-for-the-web-client) - 如果是通过`443`端口的`https`部署,必须配置反向代理,可以参考[官方文档](https://rustdesk.com/docs/en/self-host/rustdesk-server-pro/faq/#8-add-websocket-secure-wss-support-for-the-id-server-and-relay-server-to-enable-secure-communication-for-the-web-client)
- 如果是`http`或者其他的`https`端口部署,则和`v1`一样,配置好`21118`,`21119`即可 - 如果是`http`或者其他的`https`端口部署,则和`v1`一样,配置好`21118`,`21119`即可
- 更多参考[Web-Client-V2-Preview-Document](https://github.com/lejianwen/rustdesk-api/wiki/Web-Client-V2-Preview-Document)
### 自动化文档: 使用 Swag 生成 API 文档,方便开发者理解和使用 API。 ### 自动化文档: 使用 Swag 生成 API 文档,方便开发者理解和使用 API。
@@ -262,189 +263,8 @@ proxy:
lejianwen/rustdesk-api lejianwen/rustdesk-api
``` ```
2. 使用`docker compose` 2. 使用`docker compose`,参考[wiki](https://github.com/lejianwen/rustdesk-api/wiki)
- 简单示例
```yaml
services:
rustdesk-api:
container_name: rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
networks:
- rustdesk-net
restart: unless-stopped
```
- 根据rustdesk官方提供的示例加上自己的rustdesk-api
- 如果是使用的系统生成的KEY去掉`-k <key>`参数,在启动后运行`docker-compose logs hbbs`或者`cat ./data/id_ed25519.pub`查看KEY然后再修改`RUSTDESK_API_RUSTDESK_KEY=<key>`再执行`docker-compose up -d`
```yaml
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116 # 自定义 hbbs 映射端口
- 21116:21116/udp # 自定义 hbbs 映射端口
- 21118:21118 # web client
image: rustdesk/rustdesk-server
command: hbbs -r <relay-server-ip[:port]> -k <key> # 填入个人域名或 IP + hbbr 暴露端口
volumes:
- ./data:/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- 21117:21117 # 自定义 hbbr 映射端口
- 21119:21119 # web client
image: rustdesk/rustdesk-server
command: hbbr -k <key>
volumes:
- ./data:/root
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
rustdesk-api:
container_name: rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
networks:
- rustdesk-net
restart: unless-stopped
```
- S6的镜像
- 如果使用***自定义KEY***,会需要修改启动脚本,覆盖镜像中的`/etc/s6-overlay/s6-rc.d/hbbr/run`和`/etc/s6-overlay/s6-rc.d/hbbr/run`
1. 创建`hbbr/run`自定义KEY才需要
```bash
#!/command/with-contenv sh
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbr $PARAMS
```
2. 创建`hbbs/run`自定义KEY才需要
```bash
#!/command/with-contenv sh
sleep 2
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbs -r $RELAY $PARAMS
```
3. 修改`docker-compose.yml`中的`s6`部分
```yaml
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=192.168.1.66:21117
- ENCRYPTED_ONLY=1
- KEY=<key> #自定义KEY
volumes:
- ./data:/data
- ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run
- ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run
restart: unless-stopped
rustdesk-api:
container_name: rustdesk-api
ports:
- 21114:21114
image: lejianwen/rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载
networks:
- rustdesk-net
restart: unless-stopped
```
- 如果使用***系统生成的KEY***或者***自定义KEY_PUB,KEY_PRIV***不需要修改启动脚本但要在生成KEY后获取到KEY再`docker-compose up -d`
```yaml
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=192.168.1.66:21117
- ENCRYPTED_ONLY=1
volumes:
- ./data:/data
restart: unless-stopped
rustdesk-api:
container_name: rustdesk-api
ports:
- 21114:21114
image: lejianwen/rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key> #系统生成的KEY
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载
networks:
- rustdesk-net
restart: unless-stopped
```
#### 下载release直接运行 #### 下载release直接运行
[下载地址](https://github.com/lejianwen/rustdesk-api/releases) [下载地址](https://github.com/lejianwen/rustdesk-api/releases)
@@ -487,21 +307,7 @@ proxy:
6. 打开浏览器访问`http://<your server[:port]>/_admin/`,默认用户名密码为`admin`,请及时更改密码。 6. 打开浏览器访问`http://<your server[:port]>/_admin/`,默认用户名密码为`admin`,请及时更改密码。
#### nginx反代
在`nginx`中配置反代
```
server {
listen <your port>;
server_name <your server>;
location / {
proxy_pass http://<api-server[:port]>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## 其他 ## 其他
- [修改客户端ID](https://github.com/abdullah-erturk/RustDesk-ID-Changer) - [修改客户端ID](https://github.com/abdullah-erturk/RustDesk-ID-Changer)

View File

@@ -152,6 +152,7 @@ installation are `admin` `admin`, please change the password immediately.
6. `v2 preview` deployment 6. `v2 preview` deployment
- If deploying via `https` on port `443`, you must configure a reverse proxy. Refer to the [official documentation](https://rustdesk.com/docs/en/self-host/rustdesk-server-pro/faq/#8-add-websocket-secure-wss-support-for-the-id-server-and-relay-server-to-enable-secure-communication-for-the-web-client) - If deploying via `https` on port `443`, you must configure a reverse proxy. Refer to the [official documentation](https://rustdesk.com/docs/en/self-host/rustdesk-server-pro/faq/#8-add-websocket-secure-wss-support-for-the-id-server-and-relay-server-to-enable-secure-communication-for-the-web-client)
- If deploying via `http` or other `https` ports, configure `21118` and `21119` as with `v1` - If deploying via `http` or other `https` ports, configure `21118` and `21119` as with `v1`
- More [Web-Client-V2-Preview-Document](https://github.com/lejianwen/rustdesk-api/wiki/Web-Client-V2-Preview-Document)
### Automated Documentation : API documentation is generated using Swag, making it easier for developers to understand and use the API. ### Automated Documentation : API documentation is generated using Swag, making it easier for developers to understand and use the API.
@@ -266,189 +267,7 @@ The prefix for variable names is `RUSTDESK_API`. If environment variables exist,
lejianwen/rustdesk-api lejianwen/rustdesk-api
``` ```
2. Using `docker-compose` 2. Using `docker-compose`,look [wiki](https://github.com/lejianwen/rustdesk-api/wiki)
- Simple example:
```yaml
services:
rustdesk-api:
container_name: rustdesk-api
environment:
- RUSTDESK_API_LANG=en
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data # Mount the database for easy backup
networks:
- rustdesk-net
restart: unless-stopped
```
- Example with RustDesk's official Docker Compose file, adding your `rustdesk-api` service:
- If you are using a system-generated KEY, remove the `-k <key>` parameter. However, after the first startup, run `docker-compose logs hbbs` or `cat ./data/id_ed25519.pub` to view the KEY, then modify `RUSTDESK_API_RUSTDESK_KEY=<key>` and execute `docker-compose up -d` again.
```yaml
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116 # 自定义 hbbs 映射端口
- 21116:21116/udp # 自定义 hbbs 映射端口
- 21118:21118 # web client
image: rustdesk/rustdesk-server
command: hbbs -r <relay-server-ip[:port]> -k <key> # 填入个人域名或 IP + hbbr 暴露端口
volumes:
- ./data:/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- 21117:21117 # 自定义 hbbr 映射端口
- 21119:21119 # web client
image: rustdesk/rustdesk-server
command: hbbr -k <key>
volumes:
- ./data:/root
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
rustdesk-api:
container_name: rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
networks:
- rustdesk-net
restart: unless-stopped
```
- S6 image
- - If using ***custom KEY***, you will need to modify the startup script to override the `/etc/s6-overlay/s6-rc.d/hbbr/run` and `/etc/s6-overlay/s6-rc.d/hbbr/run` in the image.
1. Create `hbbr/run`, only needed for custom KEY
```bash
#!/command/with-contenv sh
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbr $PARAMS
```
2. Create `hbbs/run`, only needed for custom KEY
```bash
#!/command/with-contenv sh
sleep 2
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbs -r $RELAY $PARAMS
```
3. Modify the `s6` section in `docker-compose.yml`
```yaml
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=192.168.1.66:21117
- ENCRYPTED_ONLY=1
- KEY=<key> #KEY
volumes:
- ./data:/data
- ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run
- ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run
restart: unless-stopped
rustdesk-api:
container_name: rustdesk-api
ports:
- 21114:21114
image: lejianwen/rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
volumes:
- /data/rustdesk/api:/app/data
networks:
- rustdesk-net
restart: unless-stopped
```
- If using ***system-generated KEY*** or ***custom KEY_PUB, KEY_PRIV***, you do not need to modify the startup script, but you need to obtain the KEY after it is generated and then run `docker-compose up -d`
```yaml
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=192.168.1.66:21117
- ENCRYPTED_ONLY=1
volumes:
- ./data:/data
restart: unless-stopped
rustdesk-api:
container_name: rustdesk-api
ports:
- 21114:21114
image: lejianwen/rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
volumes:
- /data/rustdesk/api:/app/data
networks:
- rustdesk-net
restart: unless-stopped
```
#### Running from Release #### Running from Release
@@ -497,21 +316,7 @@ Download the release from [release](https://github.com/lejianwen/rustdesk-api/re
6. Open your browser and visit `http://<your server[:port]>/_admin/`, with default credentials `admin admin`. Please 6. Open your browser and visit `http://<your server[:port]>/_admin/`, with default credentials `admin admin`. Please
change the password promptly. change the password promptly.
#### nginx reverse proxy
Configure reverse proxy in `nginx`
```
server {
listen <your port>;
server_name <your server>;
location / {
proxy_pass http://<api-server[:port]>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## Others ## Others
- [Change client ID](https://github.com/abdullah-erturk/RustDesk-ID-Changer) - [Change client ID](https://github.com/abdullah-erturk/RustDesk-ID-Changer)

View File

@@ -3569,7 +3569,7 @@ const docTemplateadmin = `{
"token": [] "token": []
} }
], ],
"description": "登录凭证删除", "description": "登录凭证批量删除",
"consumes": [ "consumes": [
"application/json" "application/json"
], ],
@@ -3579,7 +3579,7 @@ const docTemplateadmin = `{
"tags": [ "tags": [
"登录凭证" "登录凭证"
], ],
"summary": "登录凭证删除", "summary": "登录凭证批量删除",
"parameters": [ "parameters": [
{ {
"description": "登录凭证信息", "description": "登录凭证信息",
@@ -3587,7 +3587,7 @@ const docTemplateadmin = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/model.UserToken" "$ref": "#/definitions/admin.UserTokenBatchDeleteForm"
} }
} }
], ],
@@ -3798,12 +3798,12 @@ const docTemplateadmin = `{
"properties": { "properties": {
"new_password": { "new_password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
}, },
"old_password": { "old_password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
} }
} }
@@ -4038,7 +4038,7 @@ const docTemplateadmin = `{
}, },
"username": { "username": {
"type": "string", "type": "string",
"maxLength": 10, "maxLength": 32,
"minLength": 2 "minLength": 2
} }
} }
@@ -4066,11 +4066,25 @@ const docTemplateadmin = `{
}, },
"password": { "password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
} }
} }
}, },
"admin.UserTokenBatchDeleteForm": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer"
}
}
}
},
"model.AddressBook": { "model.AddressBook": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@@ -3562,7 +3562,7 @@
"token": [] "token": []
} }
], ],
"description": "登录凭证删除", "description": "登录凭证批量删除",
"consumes": [ "consumes": [
"application/json" "application/json"
], ],
@@ -3572,7 +3572,7 @@
"tags": [ "tags": [
"登录凭证" "登录凭证"
], ],
"summary": "登录凭证删除", "summary": "登录凭证批量删除",
"parameters": [ "parameters": [
{ {
"description": "登录凭证信息", "description": "登录凭证信息",
@@ -3580,7 +3580,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/model.UserToken" "$ref": "#/definitions/admin.UserTokenBatchDeleteForm"
} }
} }
], ],
@@ -3791,12 +3791,12 @@
"properties": { "properties": {
"new_password": { "new_password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
}, },
"old_password": { "old_password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
} }
} }
@@ -4031,7 +4031,7 @@
}, },
"username": { "username": {
"type": "string", "type": "string",
"maxLength": 10, "maxLength": 32,
"minLength": 2 "minLength": 2
} }
} }
@@ -4059,11 +4059,25 @@
}, },
"password": { "password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
} }
} }
}, },
"admin.UserTokenBatchDeleteForm": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer"
}
}
}
},
"model.AddressBook": { "model.AddressBook": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@@ -78,11 +78,11 @@ definitions:
admin.ChangeCurPasswordForm: admin.ChangeCurPasswordForm:
properties: properties:
new_password: new_password:
maxLength: 20 maxLength: 32
minLength: 4 minLength: 4
type: string type: string
old_password: old_password:
maxLength: 20 maxLength: 32
minLength: 4 minLength: 4
type: string type: string
required: required:
@@ -238,7 +238,7 @@ definitions:
- $ref: '#/definitions/model.StatusCode' - $ref: '#/definitions/model.StatusCode'
minimum: 0 minimum: 0
username: username:
maxLength: 10 maxLength: 32
minLength: 2 minLength: 2
type: string type: string
required: required:
@@ -258,13 +258,22 @@ definitions:
id: id:
type: integer type: integer
password: password:
maxLength: 20 maxLength: 32
minLength: 4 minLength: 4
type: string type: string
required: required:
- id - id
- password - password
type: object type: object
admin.UserTokenBatchDeleteForm:
properties:
ids:
items:
type: integer
type: array
required:
- ids
type: object
model.AddressBook: model.AddressBook:
properties: properties:
alias: alias:
@@ -2871,14 +2880,14 @@ paths:
post: post:
consumes: consumes:
- application/json - application/json
description: 登录凭证删除 description: 登录凭证批量删除
parameters: parameters:
- description: 登录凭证信息 - description: 登录凭证信息
in: body in: body
name: body name: body
required: true required: true
schema: schema:
$ref: '#/definitions/model.UserToken' $ref: '#/definitions/admin.UserTokenBatchDeleteForm'
produces: produces:
- application/json - application/json
responses: responses:
@@ -2892,7 +2901,7 @@ paths:
$ref: '#/definitions/response.Response' $ref: '#/definitions/response.Response'
security: security:
- token: [] - token: []
summary: 登录凭证删除 summary: 登录凭证批量删除
tags: tags:
- 登录凭证 - 登录凭证
/admin/user_token/list: /admin/user_token/list:

View File

@@ -1356,7 +1356,7 @@ const docTemplateapi = `{
}, },
"password": { "password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
}, },
"type": { "type": {
@@ -1364,7 +1364,7 @@ const docTemplateapi = `{
}, },
"username": { "username": {
"type": "string", "type": "string",
"maxLength": 10, "maxLength": 32,
"minLength": 2 "minLength": 2
}, },
"uuid": { "uuid": {

View File

@@ -1349,7 +1349,7 @@
}, },
"password": { "password": {
"type": "string", "type": "string",
"maxLength": 20, "maxLength": 32,
"minLength": 4 "minLength": 4
}, },
"type": { "type": {
@@ -1357,7 +1357,7 @@
}, },
"username": { "username": {
"type": "string", "type": "string",
"maxLength": 10, "maxLength": 32,
"minLength": 2 "minLength": 2
}, },
"uuid": { "uuid": {

View File

@@ -62,13 +62,13 @@ definitions:
id: id:
type: string type: string
password: password:
maxLength: 20 maxLength: 32
minLength: 4 minLength: 4
type: string type: string
type: type:
type: string type: string
username: username:
maxLength: 10 maxLength: 32
minLength: 2 minLength: 2
type: string type: string
uuid: uuid:

View File

@@ -6,6 +6,7 @@ import (
"Gwen/http/response" "Gwen/http/response"
"Gwen/model" "Gwen/model"
"Gwen/service" "Gwen/service"
"encoding/json"
_ "encoding/json" _ "encoding/json"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
@@ -327,3 +328,70 @@ func (ct *AddressBook) ShareByWebClient(c *gin.Context) {
"share_token": m.ShareToken, "share_token": m.ShareToken,
}) })
} }
func (ct *AddressBook) BatchCreateFromPeers(c *gin.Context) {
f := &admin.BatchCreateFromPeersForm{}
if err := c.ShouldBindJSON(f); err != nil {
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
return
}
u := service.AllService.UserService.CurUser(c)
if f.CollectionId != 0 {
collection := service.AllService.AddressBookService.CollectionInfoById(f.CollectionId)
if collection.Id == 0 {
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
return
}
if collection.UserId != u.Id {
response.Fail(c, 101, response.TranslateMsg(c, "NoAccess"))
return
}
}
peers := service.AllService.PeerService.List(1, 999, func(tx *gorm.DB) {
tx.Where("row_id in ?", f.PeerIds)
tx.Where("user_id = ?", u.Id)
})
if peers.Total == 0 {
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
return
}
tags, _ := json.Marshal(f.Tags)
for _, peer := range peers.Peers {
ab := service.AllService.AddressBookService.FromPeer(peer)
ab.Tags = tags
ab.CollectionId = f.CollectionId
ex := service.AllService.AddressBookService.InfoByUserIdAndIdAndCid(u.Id, ab.Id, ab.CollectionId)
if ex.RowId != 0 {
continue
}
service.AllService.AddressBookService.Create(ab)
}
response.Success(c, nil)
}
func (ct *AddressBook) BatchUpdateTags(c *gin.Context) {
f := &admin.BatchUpdateTagsForm{}
if err := c.ShouldBindJSON(f); err != nil {
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
return
}
u := service.AllService.UserService.CurUser(c)
abs := service.AllService.AddressBookService.List(1, 999, func(tx *gorm.DB) {
tx.Where("row_id in ?", f.RowIds)
tx.Where("user_id = ?", u.Id)
})
if abs.Total == 0 {
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
return
}
err := service.AllService.AddressBookService.BatchUpdateTags(abs.AddressBooks, f.Tags)
if err != nil {
response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
return
}
response.Success(c, nil)
}

View File

@@ -81,3 +81,33 @@ func (ct *UserToken) Delete(c *gin.Context) {
} }
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
} }
// BatchDelete 批量删除
// @Tags 登录凭证
// @Summary 登录凭证批量删除
// @Description 登录凭证批量删除
// @Accept json
// @Produce json
// @Param body body admin.UserTokenBatchDeleteForm true "登录凭证信息"
// @Success 200 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /admin/user_token/delete [post]
// @Security token
func (ct *UserToken) BatchDelete(c *gin.Context) {
f := &admin.UserTokenBatchDeleteForm{}
if err := c.ShouldBindJSON(f); err != nil {
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
return
}
ids := f.Ids
if len(ids) == 0 {
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
return
}
err := service.AllService.UserService.BatchDeleteUserToken(ids)
if err == nil {
response.Success(c, nil)
return
}
response.Fail(c, 101, err.Error())
}

View File

@@ -94,7 +94,7 @@ func (i *WebClient) SharedPeer(c *gin.Context) {
// @Produce json // @Produce json
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 500 {object} response.Response // @Failure 500 {object} response.Response
// @Router /server-config [get] // @Router /server-config-v2 [get]
// @Security token // @Security token
func (i *WebClient) ServerConfigV2(c *gin.Context) { func (i *WebClient) ServerConfigV2(c *gin.Context) {
response.Success( response.Success(

View File

@@ -122,3 +122,13 @@ type AddressBookCollectionRuleQuery struct {
IsMy int `form:"is_my"` IsMy int `form:"is_my"`
PageQuery PageQuery
} }
type BatchCreateFromPeersForm struct {
CollectionId uint `json:"collection_id"`
PeerIds []uint `json:"peer_ids"`
Tags []string `json:"tags"`
}
type BatchUpdateTagsForm struct {
RowIds []uint `json:"row_ids"`
Tags []string `json:"tags"`
}

View File

@@ -6,7 +6,7 @@ import (
type UserForm struct { type UserForm struct {
Id uint `json:"id"` Id uint `json:"id"`
Username string `json:"username" validate:"required,gte=2,lte=10"` Username string `json:"username" validate:"required,gte=2,lte=32"`
Email string `json:"email"` //validate:"required,email" email不强制 Email string `json:"email"` //validate:"required,email" email不强制
//Password string `json:"password" validate:"required,gte=4,lte=20"` //Password string `json:"password" validate:"required,gte=4,lte=20"`
Nickname string `json:"nickname"` Nickname string `json:"nickname"`
@@ -51,12 +51,12 @@ type UserQuery struct {
} }
type UserPasswordForm struct { type UserPasswordForm struct {
Id uint `json:"id" validate:"required"` Id uint `json:"id" validate:"required"`
Password string `json:"password" validate:"required,gte=4,lte=20"` Password string `json:"password" validate:"required,gte=4,lte=32"`
} }
type ChangeCurPasswordForm struct { type ChangeCurPasswordForm struct {
OldPassword string `json:"old_password" validate:"required,gte=4,lte=20"` OldPassword string `json:"old_password" validate:"required,gte=4,lte=32"`
NewPassword string `json:"new_password" validate:"required,gte=4,lte=20"` NewPassword string `json:"new_password" validate:"required,gte=4,lte=32"`
} }
type GroupUsersQuery struct { type GroupUsersQuery struct {
IsMy int `json:"is_my"` IsMy int `json:"is_my"`
@@ -64,8 +64,12 @@ type GroupUsersQuery struct {
} }
type RegisterForm struct { type RegisterForm struct {
Username string `json:"username" validate:"required,gte=2,lte=10"` Username string `json:"username" validate:"required,gte=2,lte=32"`
Email string `json:"email"` // validate:"required,email" Email string `json:"email"` // validate:"required,email"
Password string `json:"password" validate:"required,gte=4,lte=20"` Password string `json:"password" validate:"required,gte=4,lte=32"`
ConfirmPassword string `json:"confirm_password" validate:"required,gte=4,lte=20"` ConfirmPassword string `json:"confirm_password" validate:"required,gte=4,lte=32"`
}
type UserTokenBatchDeleteForm struct {
Ids []uint `json:"ids" validate:"required"`
} }

View File

@@ -34,8 +34,8 @@ type LoginForm struct {
Id string `json:"id" label:"id"` Id string `json:"id" label:"id"`
Type string `json:"type" label:"type"` Type string `json:"type" label:"type"`
Uuid string `json:"uuid" label:"uuid"` Uuid string `json:"uuid" label:"uuid"`
Username string `json:"username" validate:"required,gte=2,lte=10" label:"用户名"` Username string `json:"username" validate:"required,gte=2,lte=32" label:"用户名"`
Password string `json:"password,omitempty" validate:"gte=4,lte=20" label:"密码"` Password string `json:"password,omitempty" validate:"gte=4,lte=32" label:"密码"`
} }
type UserListQuery struct { type UserListQuery struct {

View File

@@ -107,9 +107,12 @@ func AddressBookBind(rg *gin.RouterGroup) {
aR.POST("/update", cont.Update) aR.POST("/update", cont.Update)
aR.POST("/delete", cont.Delete) aR.POST("/delete", cont.Delete)
aR.POST("/shareByWebClient", cont.ShareByWebClient) aR.POST("/shareByWebClient", cont.ShareByWebClient)
aR.POST("/batchCreateFromPeers", cont.BatchCreateFromPeers)
aR.POST("/batchUpdateTags", cont.BatchUpdateTags)
arp := aR.Use(middleware.AdminPrivilege()) arp := aR.Use(middleware.AdminPrivilege())
arp.POST("/batchCreate", cont.BatchCreate) arp.POST("/batchCreate", cont.BatchCreate)
} }
} }
func PeerBind(rg *gin.RouterGroup) { func PeerBind(rg *gin.RouterGroup) {
@@ -195,6 +198,7 @@ func UserTokenBind(rg *gin.RouterGroup) {
cont := &admin.UserToken{} cont := &admin.UserToken{}
aR.GET("/list", cont.List) aR.GET("/list", cont.List)
aR.POST("/delete", cont.Delete) aR.POST("/delete", cont.Delete)
aR.POST("/batchDelete", cont.BatchDelete)
} }
func ConfigBind(rg *gin.RouterGroup) { func ConfigBind(rg *gin.RouterGroup) {
aR := rg.Group("/config") aR := rg.Group("/config")

View File

@@ -32,7 +32,7 @@
<title>RustDesk</title> <title>RustDesk</title>
<script src="/webclient-config/index.js"></script> <script src="/webclient-config/index.js"></script>
<link rel="manifest" href="manifest.json" /> <link rel="manifest" href="manifest.json" />
<script type="module" crossorigin src="js/dist/index.js?v=6"></script> <script type="module" crossorigin src="js/dist/index.js?v=893935a2"></script>
<link rel="modulepreload" href="js/dist/vendor.js?v=0b990c6e" /> <link rel="modulepreload" href="js/dist/vendor.js?v=0b990c6e" />
<style> <style>
html, html,
@@ -259,7 +259,7 @@
} }
scriptLoaded = true; scriptLoaded = true;
var scriptTag = document.createElement("script"); var scriptTag = document.createElement("script");
scriptTag.src = "main.dart.js?v=6"; scriptTag.src = "main.dart.js?v=df360f45";
scriptTag.type = "application/javascript"; scriptTag.type = "application/javascript";
document.body.append(scriptTag); document.body.append(scriptTag);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -697,7 +697,8 @@ export const lang = {
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, hr: { }, hr: {
Status: "Status", Status: "Status",
"Your Desktop": "Va\u0161a radna povr\u0161ina", "Your Desktop": "Va\u0161a radna povr\u0161ina",
@@ -1359,7 +1360,8 @@ Mo\u017Eete se povezati s drugim ure\u0111ajima, ali se drugi ure\u0111aji ne mo
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, th: { }, th: {
Status: "\u0E2A\u0E16\u0E32\u0E19\u0E30", Status: "\u0E2A\u0E16\u0E32\u0E19\u0E30",
"Your Desktop": "\u0E2B\u0E19\u0E49\u0E32\u0E08\u0E2D\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13", "Your Desktop": "\u0E2B\u0E19\u0E49\u0E32\u0E08\u0E2D\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
@@ -2013,7 +2015,8 @@ Mo\u017Eete se povezati s drugim ure\u0111ajima, ali se drugi ure\u0111aji ne mo
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ru: { }, ru: {
Status: "\u0421\u0442\u0430\u0442\u0443\u0441", Status: "\u0421\u0442\u0430\u0442\u0443\u0441",
"Your Desktop": "\u0412\u0430\u0448 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B", "Your Desktop": "\u0412\u0430\u0448 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B",
@@ -2682,7 +2685,8 @@ Mo\u017Eete se povezati s drugim ure\u0111ajima, ali se drugi ure\u0111aji ne mo
"Upload folder": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0443", "Upload folder": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0443",
"Upload files": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B", "Upload files": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B",
"Clipboard is synchronized": "\u0411\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D", "Clipboard is synchronized": "\u0411\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D",
"Update client clipboard": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0430" "Update client clipboard": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0430",
Untagged: "\u0411\u0435\u0437 \u043C\u0435\u0442\u043A\u0438"
}, eu: { }, eu: {
Status: "Egoera", Status: "Egoera",
"Your Desktop": "Zure mahaigaina", "Your Desktop": "Zure mahaigaina",
@@ -3349,7 +3353,8 @@ Beste gailuetara konekta zaitezke, baina beste gailu batzuk ezin dira zure gailu
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, el: { }, el: {
Status: "\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7", Status: "\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7",
"Your Desktop": "\u039F \u03C3\u03C4\u03B1\u03B8\u03BC\u03CC\u03C2 \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03C3\u03B1\u03C2", "Your Desktop": "\u039F \u03C3\u03C4\u03B1\u03B8\u03BC\u03CC\u03C2 \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03C3\u03B1\u03C2",
@@ -4008,7 +4013,8 @@ Beste gailuetara konekta zaitezke, baina beste gailu batzuk ezin dira zure gailu
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, et: { }, et: {
Status: "", Status: "",
"Your Desktop": "", "Your Desktop": "",
@@ -4667,7 +4673,8 @@ Kui soovid juurdep\xE4\xE4su seadmele avalikus serveris, sisesta "<id>@public",
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, sl: { }, sl: {
Status: "Stanje", Status: "Stanje",
"Your Desktop": "Va\u0161e namizje", "Your Desktop": "Va\u0161e namizje",
@@ -5333,7 +5340,8 @@ Lahko se pove\u017Eete na druge naprave, druge naprave pa se k vam ne morejo pov
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ko: { }, ko: {
Status: "\uC0C1\uD0DC", Status: "\uC0C1\uD0DC",
"Your Desktop": "\uB0B4 \uB370\uC2A4\uD06C\uD0D1", "Your Desktop": "\uB0B4 \uB370\uC2A4\uD06C\uD0D1",
@@ -5995,7 +6003,8 @@ Lahko se pove\u017Eete na druge naprave, druge naprave pa se k vam ne morejo pov
"Upload folder": "\uD3F4\uB354 \uC5C5\uB85C\uB4DC", "Upload folder": "\uD3F4\uB354 \uC5C5\uB85C\uB4DC",
"Upload files": "\uD30C\uC77C \uC5C5\uB85C\uB4DC", "Upload files": "\uD30C\uC77C \uC5C5\uB85C\uB4DC",
"Clipboard is synchronized": "\uD074\uB9BD\uBCF4\uB4DC\uAC00 \uB3D9\uAE30\uD654\uB428", "Clipboard is synchronized": "\uD074\uB9BD\uBCF4\uB4DC\uAC00 \uB3D9\uAE30\uD654\uB428",
"Update client clipboard": "" "Update client clipboard": "\uD074\uB77C\uC774\uC5B8\uD2B8 \uD074\uB9BD\uBCF4\uB4DC \uC5C5\uB370\uC774\uD2B8",
Untagged: "\uD0DC\uADF8 \uC5C6\uC74C"
}, lv: { }, lv: {
Status: "Statuss", Status: "Statuss",
"Your Desktop": "J\u016Bsu darbvirsma", "Your Desktop": "J\u016Bsu darbvirsma",
@@ -6663,7 +6672,8 @@ Ja v\u0113laties piek\u013C\u016Bt ier\u012Bcei publiskaj\u0101 server\u012B, l\
"Upload folder": "Aug\u0161upiel\u0101d\u0113t mapi", "Upload folder": "Aug\u0161upiel\u0101d\u0113t mapi",
"Upload files": "Aug\u0161upiel\u0101d\u0113t failus", "Upload files": "Aug\u0161upiel\u0101d\u0113t failus",
"Clipboard is synchronized": "Starpliktuve ir sinhroniz\u0113ta", "Clipboard is synchronized": "Starpliktuve ir sinhroniz\u0113ta",
"Update client clipboard": "" "Update client clipboard": "Atjaunin\u0101t klienta starpliktuvi",
Untagged: "Neatz\u012Bm\u0113ts"
}, pl: { }, pl: {
Status: "Status", Status: "Status",
"Your Desktop": "Tw\xF3j pulpit", "Your Desktop": "Tw\xF3j pulpit",
@@ -7330,7 +7340,8 @@ Je\u015Bli chcesz uzyska\u0107 dost\u0119p do urz\u0105dzenia na serwerze public
"Upload folder": "Wy\u015Blij folder", "Upload folder": "Wy\u015Blij folder",
"Upload files": "Wy\u015Blij pliki", "Upload files": "Wy\u015Blij pliki",
"Clipboard is synchronized": "Schowek jest zsynchronizowany", "Clipboard is synchronized": "Schowek jest zsynchronizowany",
"Update client clipboard": "" "Update client clipboard": "Uaktualnij schowek klienta",
Untagged: ""
}, pt_PT: { }, pt_PT: {
Status: "Estado", Status: "Estado",
"Your Desktop": "Ambiente de Trabalho", "Your Desktop": "Ambiente de Trabalho",
@@ -7984,7 +7995,8 @@ Je\u015Bli chcesz uzyska\u0107 dost\u0119p do urz\u0105dzenia na serwerze public
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, id: { }, id: {
Status: "Status", Status: "Status",
"Your Desktop": "Layar Utama", "Your Desktop": "Layar Utama",
@@ -8650,7 +8662,8 @@ Untuk mengakses perangkat di server publik, cukup masukkan "<id>@public", tanpa
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ptbr: { }, ptbr: {
Status: "Status", Status: "Status",
"Your Desktop": "Seu Computador", "Your Desktop": "Seu Computador",
@@ -9314,7 +9327,8 @@ Voc\xEA pode se conectar a outros dispositivos, mas eles n\xE3o podem se conecta
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ja: { }, ja: {
Status: "\u72B6\u614B", Status: "\u72B6\u614B",
"Your Desktop": "\u3042\u306A\u305F\u306E\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC", "Your Desktop": "\u3042\u306A\u305F\u306E\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC",
@@ -9979,7 +9993,8 @@ QR\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3001\u30A2\u30D7\u30EA
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, he: { }, he: {
Status: "", Status: "",
"Your Desktop": "", "Your Desktop": "",
@@ -10641,7 +10656,8 @@ QR\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3001\u30A2\u30D7\u30EA
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, bg: { }, bg: {
Status: "\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435", Status: "\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435",
"Your Desktop": "\u0412\u0430\u0448\u0430\u0442\u0430 \u0440\u0430\u0431\u043E\u0442\u043D\u0430 \u0441\u0440\u0435\u0434\u0430", "Your Desktop": "\u0412\u0430\u0448\u0430\u0442\u0430 \u0440\u0430\u0431\u043E\u0442\u043D\u0430 \u0441\u0440\u0435\u0434\u0430",
@@ -11302,7 +11318,8 @@ QR\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3001\u30A2\u30D7\u30EA
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, fa: { }, fa: {
Status: "\u0648\u0636\u0639\u06CC\u062A", Status: "\u0648\u0636\u0639\u06CC\u062A",
"Your Desktop": "\u062F\u0633\u06A9\u062A\u0627\u067E \u0634\u0645\u0627", "Your Desktop": "\u062F\u0633\u06A9\u062A\u0627\u067E \u0634\u0645\u0627",
@@ -11965,7 +11982,8 @@ QR\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3001\u30A2\u30D7\u30EA
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, README: {"ENG-KEY": "translation"}, de: { }, README: {"ENG-KEY": "translation"}, de: {
Status: "Status", Status: "Status",
"Your Desktop": "Ihr Desktop", "Your Desktop": "Ihr Desktop",
@@ -12636,7 +12654,8 @@ Wenn Sie auf ein Ger\xE4t auf einem \xF6ffentlichen Server zugreifen wollen, geb
"Upload folder": "Ordner hochladen", "Upload folder": "Ordner hochladen",
"Upload files": "Dateien hochladen", "Upload files": "Dateien hochladen",
"Clipboard is synchronized": "Zwischenablage ist synchronisiert", "Clipboard is synchronized": "Zwischenablage ist synchronisiert",
"Update client clipboard": "Client-Zwischenablage aktualisieren" "Update client clipboard": "Client-Zwischenablage aktualisieren",
Untagged: ""
}, kz: { }, kz: {
Status: "\u041A\u04AF\u0439", Status: "\u041A\u04AF\u0439",
"Your Desktop": "\u0421\u0456\u0437\u0434\u0456\u04A3 \u0416\u04B1\u043C\u044B\u0441 \u04AF\u0441\u0442\u0435\u043B\u0456\u04A3\u0456\u0437", "Your Desktop": "\u0421\u0456\u0437\u0434\u0456\u04A3 \u0416\u04B1\u043C\u044B\u0441 \u04AF\u0441\u0442\u0435\u043B\u0456\u04A3\u0456\u0437",
@@ -13290,7 +13309,8 @@ Wenn Sie auf ein Ger\xE4t auf einem \xF6ffentlichen Server zugreifen wollen, geb
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, da: { }, da: {
Status: "Status", Status: "Status",
"Your Desktop": "Dit skrivebord", "Your Desktop": "Dit skrivebord",
@@ -13957,7 +13977,8 @@ Du kan forbinde til andre enheder, men andre enheder kan ikke forbinde til din e
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, nb: { }, nb: {
Status: "Status", Status: "Status",
"Your Desktop": "Ditt skrivebord", "Your Desktop": "Ditt skrivebord",
@@ -14611,7 +14632,8 @@ Du kan forbinde til andre enheder, men andre enheder kan ikke forbinde til din e
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, be: { }, be: {
Status: "\u0421\u0442\u0430\u0442\u0443\u0441", Status: "\u0421\u0442\u0430\u0442\u0443\u0441",
"Your Desktop": "\u0412\u0430\u0448 \u043F\u0440\u0430\u0446\u043E\u045E\u043D\u044B \u0441\u0442\u043E\u043B", "Your Desktop": "\u0412\u0430\u0448 \u043F\u0440\u0430\u0446\u043E\u045E\u043D\u044B \u0441\u0442\u043E\u043B",
@@ -15274,7 +15296,8 @@ Du kan forbinde til andre enheder, men andre enheder kan ikke forbinde til din e
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ca: { }, ca: {
Status: "Estat", Status: "Estat",
"Your Desktop": "Aquest ordinador", "Your Desktop": "Aquest ordinador",
@@ -15940,7 +15963,8 @@ Si voleu accedir a un dispositiu en un servidor p\xFAblic, no cal que inseriu la
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, eo: { }, eo: {
Status: "Stato", Status: "Stato",
"Your Desktop": "Via aparato", "Your Desktop": "Via aparato",
@@ -16594,7 +16618,8 @@ Si voleu accedir a un dispositiu en un servidor p\xFAblic, no cal que inseriu la
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, ro: { }, ro: {
Status: "Stare", Status: "Stare",
"Your Desktop": "Desktopul t\u0103u", "Your Desktop": "Desktopul t\u0103u",
@@ -17250,7 +17275,8 @@ Hai s\u0103-\u021Bi g\u0103sim pe cineva cu care s\u0103 te conectezi, iar apoi
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, tr: { }, tr: {
Status: "Durum", Status: "Durum",
"Your Desktop": "Sizin Masa\xFCst\xFCn\xFCz", "Your Desktop": "Sizin Masa\xFCst\xFCn\xFCz",
@@ -17906,7 +17932,8 @@ Ba\u011Flanacak ve favorilere eklemek i\xE7in birini bulal\u0131m!`,
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, vn: { }, vn: {
Status: "Tr\u1EA1ng th\xE1i hi\u1EC7n t\u1EA1i", Status: "Tr\u1EA1ng th\xE1i hi\u1EC7n t\u1EA1i",
"Your Desktop": "Desktop c\u1EE7a b\u1EA1n", "Your Desktop": "Desktop c\u1EE7a b\u1EA1n",
@@ -18563,7 +18590,8 @@ H\xE3y t\xECm ai \u0111\xF3 \u0111\u1EC3 k\u1EBFt n\u1ED1i c\xF9ng v\xE0 th\xEAm
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, cn: { }, cn: {
Status: "\u72B6\u6001", Status: "\u72B6\u6001",
"Your Desktop": "\u4F60\u7684\u684C\u9762", "Your Desktop": "\u4F60\u7684\u684C\u9762",
@@ -19229,7 +19257,8 @@ H\xE3y t\xECm ai \u0111\xF3 \u0111\u1EC3 k\u1EBFt n\u1ED1i c\xF9ng v\xE0 th\xEAm
"Upload folder": "\u4E0A\u4F20\u6587\u4EF6\u5939", "Upload folder": "\u4E0A\u4F20\u6587\u4EF6\u5939",
"Upload files": "\u4E0A\u4F20\u6587\u4EF6", "Upload files": "\u4E0A\u4F20\u6587\u4EF6",
"Clipboard is synchronized": "\u526A\u8D34\u677F\u5DF2\u540C\u6B65", "Clipboard is synchronized": "\u526A\u8D34\u677F\u5DF2\u540C\u6B65",
"Update client clipboard": "\u66F4\u65B0\u5BA2\u6237\u7AEF\u7684\u7C98\u8D34\u677F" "Update client clipboard": "\u66F4\u65B0\u5BA2\u6237\u7AEF\u7684\u7C98\u8D34\u677F",
Untagged: "\u65E0\u6807\u7B7E"
}, ar: { }, ar: {
Status: "\u0627\u0644\u062D\u0627\u0644\u0629", Status: "\u0627\u0644\u062D\u0627\u0644\u0629",
"Your Desktop": "\u0633\u0637\u062D \u0645\u0643\u062A\u0628\u0643", "Your Desktop": "\u0633\u0637\u062D \u0645\u0643\u062A\u0628\u0643",
@@ -19885,7 +19914,8 @@ H\xE3y t\xECm ai \u0111\xF3 \u0111\u1EC3 k\u1EBFt n\u1ED1i c\xF9ng v\xE0 th\xEAm
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, it: { }, it: {
Status: "Stato", Status: "Stato",
"Your Desktop": "Questo desktop", "Your Desktop": "Questo desktop",
@@ -20568,7 +20598,8 @@ Se vuoi accedere ad un dispositivo in un server pubblico, inserisci "<id>@public
"Upload folder": "Cartella upload", "Upload folder": "Cartella upload",
"Upload files": "File upload", "Upload files": "File upload",
"Clipboard is synchronized": "Gli appunti sono sincronizzati", "Clipboard is synchronized": "Gli appunti sono sincronizzati",
"Update client clipboard": "Aggiorna appunti client" "Update client clipboard": "Aggiorna appunti client",
Untagged: "Senza tag"
}, sk: { }, sk: {
Status: "Stav", Status: "Stav",
"Your Desktop": "Va\u0161a plocha", "Your Desktop": "Va\u0161a plocha",
@@ -21233,7 +21264,8 @@ M\xF4\u017Eete sa pripoji\u0165 k in\xFDm zariadeniam, ale in\xE9 zariadenia sa
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, es: { }, es: {
Status: "Estado", Status: "Estado",
"Your Desktop": "Tu escritorio", "Your Desktop": "Tu escritorio",
@@ -21902,7 +21934,8 @@ Si quieres accedder a un dispositivo en un servidor p\xFAblico, por favor, intro
"Upload folder": "Subir carpeta", "Upload folder": "Subir carpeta",
"Upload files": "Subir archivos", "Upload files": "Subir archivos",
"Clipboard is synchronized": "Portapapeles sincronizado", "Clipboard is synchronized": "Portapapeles sincronizado",
"Update client clipboard": "" "Update client clipboard": "Actualizar portapapeles del cliente",
Untagged: ""
}, sr: { }, sr: {
Status: "Status", Status: "Status",
"Your Desktop": "Va\u0161a radna povr\u0161ina", "Your Desktop": "Va\u0161a radna povr\u0161ina",
@@ -22556,7 +22589,8 @@ Si quieres accedder a un dispositivo en un servidor p\xFAblico, por favor, intro
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, hu: { }, hu: {
Status: "\xC1llapot", Status: "\xC1llapot",
"Your Desktop": "Saj\xE1t asztal", "Your Desktop": "Saj\xE1t asztal",
@@ -23227,7 +23261,8 @@ Ha egy nyilv\xE1nos szerveren l\xE9v\u0151 eszk\xF6zh\xF6z szeretne hozz\xE1f\xE
"Upload folder": "Mappa felt\xF6lt\xE9se", "Upload folder": "Mappa felt\xF6lt\xE9se",
"Upload files": "F\xE1jlok felt\xF6lt\xE9se", "Upload files": "F\xE1jlok felt\xF6lt\xE9se",
"Clipboard is synchronized": "A v\xE1g\xF3lap szinkroniz\xE1lva van", "Clipboard is synchronized": "A v\xE1g\xF3lap szinkroniz\xE1lva van",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, tw: { }, tw: {
Status: "\u72C0\u614B", Status: "\u72C0\u614B",
"Your Desktop": "\u60A8\u7684\u684C\u9762", "Your Desktop": "\u60A8\u7684\u684C\u9762",
@@ -23896,7 +23931,8 @@ Ha egy nyilv\xE1nos szerveren l\xE9v\u0151 eszk\xF6zh\xF6z szeretne hozz\xE1f\xE
"Upload folder": "\u4E0A\u50B3\u8CC7\u6599\u593E", "Upload folder": "\u4E0A\u50B3\u8CC7\u6599\u593E",
"Upload files": "\u4E0A\u50B3\u6A94\u6848", "Upload files": "\u4E0A\u50B3\u6A94\u6848",
"Clipboard is synchronized": "\u526A\u8CBC\u7C3F\u5DF2\u540C\u6B65", "Clipboard is synchronized": "\u526A\u8CBC\u7C3F\u5DF2\u540C\u6B65",
"Update client clipboard": "" "Update client clipboard": "\u66F4\u65B0\u5BA2\u6236\u7AEF\u7684\u526A\u8CBC\u7C3F",
Untagged: "\u7121\u6A19\u7C64"
}, lt: { }, lt: {
Status: "B\u016Bsena", Status: "B\u016Bsena",
"Your Desktop": "J\u016Bs\u0173 darbalaukis", "Your Desktop": "J\u016Bs\u0173 darbalaukis",
@@ -24552,7 +24588,8 @@ Laikas suplanuoti nauj\u0105.`,
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, en: { }, en: {
desk_tip: "Your desktop can be accessed with this ID and password.", desk_tip: "Your desktop can be accessed with this ID and password.",
connecting_status: "Connecting to the RustDesk network...", connecting_status: "Connecting to the RustDesk network...",
@@ -25458,7 +25495,8 @@ If you want to access a device on a public server, please input "<id>@public", t
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, uk: { }, uk: {
Status: "\u0421\u0442\u0430\u0442\u0443\u0441", Status: "\u0421\u0442\u0430\u0442\u0443\u0441",
"Your Desktop": "\u0412\u0430\u0448\u0430 \u0441\u0442\u0456\u043B\u044C\u043D\u0438\u0446\u044F", "Your Desktop": "\u0412\u0430\u0448\u0430 \u0441\u0442\u0456\u043B\u044C\u043D\u0438\u0446\u044F",
@@ -25579,9 +25617,9 @@ If you want to access a device on a public server, please input "<id>@public", t
Original: "\u041E\u0440\u0438\u0433\u0456\u043D\u0430\u043B", Original: "\u041E\u0440\u0438\u0433\u0456\u043D\u0430\u043B",
Shrink: "\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438", Shrink: "\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438",
Stretch: "\u0420\u043E\u0437\u0442\u044F\u0433\u043D\u0443\u0442\u0438", Stretch: "\u0420\u043E\u0437\u0442\u044F\u0433\u043D\u0443\u0442\u0438",
Scrollbar: "\u0421\u043C\u0443\u0433\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438", Scrollbar: "\u0421\u043C\u0443\u0436\u043A\u0430 \u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F",
ScrollAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430", ScrollAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F",
"Good image quality": "\u0425\u043E\u0440\u043E\u0448\u0430 \u044F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F", "Good image quality": "\u0413\u0430\u0440\u043D\u0430 \u044F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",
Balanced: "\u0417\u0431\u0430\u043B\u0430\u043D\u0441\u043E\u0432\u0430\u043D\u0430", Balanced: "\u0417\u0431\u0430\u043B\u0430\u043D\u0441\u043E\u0432\u0430\u043D\u0430",
"Optimize reaction time": "\u041E\u043F\u0442\u0438\u043C\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441 \u0440\u0435\u0430\u043A\u0446\u0456\u0457", "Optimize reaction time": "\u041E\u043F\u0442\u0438\u043C\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441 \u0440\u0435\u0430\u043A\u0446\u0456\u0457",
Custom: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0430", Custom: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0430",
@@ -25606,7 +25644,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"OS Password": "\u041F\u0430\u0440\u043E\u043B\u044C \u041E\u0421", "OS Password": "\u041F\u0430\u0440\u043E\u043B\u044C \u041E\u0421",
install_tip: "\u0427\u0435\u0440\u0435\u0437 UAC, \u0432 \u0434\u0435\u044F\u043A\u0438\u0445 \u0432\u0438\u043F\u0430\u0434\u043A\u0430\u0445 RustDesk \u043C\u043E\u0436\u0435 \u043F\u0440\u0430\u0446\u044E\u0432\u0430\u0442\u0438 \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u043E \u043D\u0430 \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u043C\u0443 \u0432\u0443\u0437\u043B\u0456. \u0429\u043E\u0431 \u0443\u043D\u0438\u043A\u043D\u0443\u0442\u0438 UAC, \u043D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0447\u0435 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F RustDesk \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0456", install_tip: "\u0427\u0435\u0440\u0435\u0437 UAC, \u0432 \u0434\u0435\u044F\u043A\u0438\u0445 \u0432\u0438\u043F\u0430\u0434\u043A\u0430\u0445 RustDesk \u043C\u043E\u0436\u0435 \u043F\u0440\u0430\u0446\u044E\u0432\u0430\u0442\u0438 \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u043E \u043D\u0430 \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u043C\u0443 \u0432\u0443\u0437\u043B\u0456. \u0429\u043E\u0431 \u0443\u043D\u0438\u043A\u043D\u0443\u0442\u0438 UAC, \u043D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0447\u0435 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F RustDesk \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0456",
"Click to upgrade": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u043D\u0430\u044F\u0432\u043D\u0456\u0441\u0442\u044C \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u044C", "Click to upgrade": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u043D\u0430\u044F\u0432\u043D\u0456\u0441\u0442\u044C \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u044C",
"Click to download": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438", "Click to download": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438",
"Click to update": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043E\u043D\u043E\u0432\u0438\u0442\u0438", "Click to update": "\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043E\u043D\u043E\u0432\u0438\u0442\u0438",
Configure: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438", Configure: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438",
config_acc: '\u0414\u043B\u044F \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u0433\u043E \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0430\u0448\u043E\u044E \u0441\u0442\u0456\u043B\u044C\u043D\u0438\u0446\u0435\u044E, \u0432\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u043D\u0430\u0434\u0430\u0442\u0438 RustDesk \u0434\u043E\u0437\u0432\u043E\u043B\u0438 "\u0421\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456"', config_acc: '\u0414\u043B\u044F \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u0433\u043E \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0430\u0448\u043E\u044E \u0441\u0442\u0456\u043B\u044C\u043D\u0438\u0446\u0435\u044E, \u0432\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u043D\u0430\u0434\u0430\u0442\u0438 RustDesk \u0434\u043E\u0437\u0432\u043E\u043B\u0438 "\u0421\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456"',
@@ -25658,10 +25696,10 @@ If you want to access a device on a public server, please input "<id>@public", t
"Please enter the folder name": "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430\u0437\u0432\u0443 \u0434\u043B\u044F \u0442\u0435\u043A\u0438", "Please enter the folder name": "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430\u0437\u0432\u0443 \u0434\u043B\u044F \u0442\u0435\u043A\u0438",
"Fix it": "\u0412\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438", "Fix it": "\u0412\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438",
Warning: "\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F", Warning: "\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",
"Login screen using Wayland is not supported": "\u0412\u0445\u0456\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0437 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F\u043C Wayland \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F", "Login screen using Wayland is not supported": "\u0415\u043A\u0440\u0430\u043D \u0432\u0445\u043E\u0434\u0443, \u044F\u043A\u0438\u0439 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 Wayland, \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",
"Reboot required": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F", "Reboot required": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",
"Unsupported display server": "\u0413\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F", "Unsupported display server": "\u0413\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",
"x11 expected": "\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F X11", "x11 expected": "\u041F\u043E\u0442\u0440\u0456\u0431\u0435\u043D X11",
Port: "\u041F\u043E\u0440\u0442", Port: "\u041F\u043E\u0440\u0442",
Settings: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F", Settings: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F",
Username: "\u0406\u043C\u02BC\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430", Username: "\u0406\u043C\u02BC\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430",
@@ -25679,21 +25717,21 @@ If you want to access a device on a public server, please input "<id>@public", t
"Verification code": "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F", "Verification code": "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
verification_tip: "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E \u043D\u0430 \u0437\u0430\u0440\u0435\u0454\u0441\u0442\u0440\u043E\u0432\u0430\u043D\u0443 email-\u0430\u0434\u0440\u0435\u0441\u0443, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0435\u043D\u043D\u044F \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0456\u0457.", verification_tip: "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E \u043D\u0430 \u0437\u0430\u0440\u0435\u0454\u0441\u0442\u0440\u043E\u0432\u0430\u043D\u0443 email-\u0430\u0434\u0440\u0435\u0441\u0443, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0435\u043D\u043D\u044F \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0456\u0457.",
Logout: "\u0412\u0438\u0439\u0442\u0438", Logout: "\u0412\u0438\u0439\u0442\u0438",
Tags: "\u0422\u0435\u0433\u0438", Tags: "\u041C\u0456\u0442\u043A\u0438",
"Search ID": "\u041F\u043E\u0448\u0443\u043A \u0437\u0430 ID", "Search ID": "\u041F\u043E\u0448\u0443\u043A \u0437\u0430 ID",
whitelist_sep: "\u0412\u0456\u0434\u043E\u043A\u0440\u0435\u043C\u043B\u0435\u043D\u043D\u044F \u043A\u043E\u043C\u043E\u044E, \u043A\u0440\u0430\u043F\u043A\u043E\u044E \u0437 \u043A\u043E\u043C\u043E\u044E, \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u043C \u0430\u0431\u043E \u043D\u043E\u0432\u0438\u043C \u0440\u044F\u0434\u043A\u043E\u043C", whitelist_sep: "\u0412\u0456\u0434\u043E\u043A\u0440\u0435\u043C\u043B\u0435\u043D\u043D\u044F \u043A\u043E\u043C\u043E\u044E, \u043A\u0440\u0430\u043F\u043A\u043E\u044E \u0437 \u043A\u043E\u043C\u043E\u044E, \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u043C \u0430\u0431\u043E \u043D\u043E\u0432\u0438\u043C \u0440\u044F\u0434\u043A\u043E\u043C",
"Add ID": "\u0414\u043E\u0434\u0430\u0442\u0438 ID", "Add ID": "\u0414\u043E\u0434\u0430\u0442\u0438 ID",
"Add Tag": "\u0414\u043E\u0434\u0430\u0442\u0438 \u043A\u043B\u044E\u0447\u043E\u0432\u0435 \u0441\u043B\u043E\u0432\u043E", "Add Tag": "\u0414\u043E\u0434\u0430\u0442\u0438 \u043C\u0456\u0442\u043A\u0443",
"Unselect all tags": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0456\u0440 \u0443\u0441\u0456\u0445 \u0442\u0435\u0433\u0456\u0432", "Unselect all tags": "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0456\u0440 \u0443\u0441\u0456\u0445 \u043C\u0456\u0442\u043E\u043A",
"Network error": "\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043C\u0435\u0440\u0435\u0436\u0456", "Network error": "\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043C\u0435\u0440\u0435\u0436\u0456",
"Username missed": "\u0406\u043C\u02BC\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0454", "Username missed": "\u0406\u043C\u02BC\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0454",
"Password missed": "\u041F\u0430\u0440\u043E\u043B\u044C \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439", "Password missed": "\u041F\u0430\u0440\u043E\u043B\u044C \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439",
"Wrong credentials": "\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0434\u0430\u043D\u0456", "Wrong credentials": "\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0434\u0430\u043D\u0456",
"The verification code is incorrect or has expired": "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043F\u0440\u043E\u0442\u0435\u0440\u043C\u0456\u043D\u043E\u0432\u0430\u043D\u0438\u0439", "The verification code is incorrect or has expired": "\u041A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043F\u0440\u043E\u0442\u0435\u0440\u043C\u0456\u043D\u043E\u0432\u0430\u043D\u0438\u0439",
"Edit Tag": "\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0442\u0435\u0433", "Edit Tag": "\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043C\u0456\u0442\u043A\u0443",
"Forget Password": "\u041D\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0430\u0440\u043E\u043B\u044C", "Forget Password": "\u041D\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0430\u0440\u043E\u043B\u044C",
Favorites: "\u0412\u0438\u0431\u0440\u0430\u043D\u0435", Favorites: "\u0412\u0438\u0431\u0440\u0430\u043D\u0435",
"Add to Favorites": "\u0414\u043E\u0434\u0430\u0442\u0438 \u0432 \u043E\u0431\u0440\u0430\u043D\u0435", "Add to Favorites": "\u0414\u043E\u0434\u0430\u0442\u0438 \u0434\u043E \u043E\u0431\u0440\u0430\u043D\u043E\u0433\u043E",
"Remove from Favorites": "\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0437 \u043E\u0431\u0440\u0430\u043D\u043E\u0433\u043E", "Remove from Favorites": "\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0437 \u043E\u0431\u0440\u0430\u043D\u043E\u0433\u043E",
Empty: "\u041F\u0443\u0441\u0442\u043E", Empty: "\u041F\u0443\u0441\u0442\u043E",
"Invalid folder name": "\u041D\u0435\u043F\u0440\u0438\u043F\u0443\u0441\u0442\u0438\u043C\u0430 \u043D\u0430\u0437\u0432\u0430 \u0442\u0435\u043A\u0438", "Invalid folder name": "\u041D\u0435\u043F\u0440\u0438\u043F\u0443\u0441\u0442\u0438\u043C\u0430 \u043D\u0430\u0437\u0432\u0430 \u0442\u0435\u043A\u0438",
@@ -25705,7 +25743,7 @@ If you want to access a device on a public server, please input "<id>@public", t
Paste: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438", Paste: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438",
"Paste here?": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u044E\u0434\u0438?", "Paste here?": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u044E\u0434\u0438?",
"Are you sure to close the connection?": "\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F?", "Are you sure to close the connection?": "\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F?",
"Download new version": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0442\u0435 \u043D\u043E\u0432\u0443 \u0432\u0435\u0440\u0441\u0456\u044E", "Download new version": "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043D\u043E\u0432\u0443 \u0432\u0435\u0440\u0441\u0456\u044E",
"Touch mode": "\u0421\u0435\u043D\u0441\u043E\u0440\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C", "Touch mode": "\u0421\u0435\u043D\u0441\u043E\u0440\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C",
"Mouse mode": "\u0420\u0435\u0436\u0438\u043C \u043C\u0438\u0448\u0456", "Mouse mode": "\u0420\u0435\u0436\u0438\u043C \u043C\u0438\u0448\u0456",
"One-Finger Tap": "\u0414\u043E\u0442\u0438\u043A \u043E\u0434\u043D\u0438\u043C \u043F\u0430\u043B\u044C\u0446\u0435\u043C", "One-Finger Tap": "\u0414\u043E\u0442\u0438\u043A \u043E\u0434\u043D\u0438\u043C \u043F\u0430\u043B\u044C\u0446\u0435\u043C",
@@ -25738,7 +25776,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"Screen Connection": "\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0435\u043A\u0440\u0430\u043D\u0430", "Screen Connection": "\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0435\u043A\u0440\u0430\u043D\u0430",
"Do you accept?": "\u0412\u0438 \u0437\u0433\u043E\u0434\u043D\u0456?", "Do you accept?": "\u0412\u0438 \u0437\u0433\u043E\u0434\u043D\u0456?",
"Open System Setting": "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0438", "Open System Setting": "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0438",
"How to get Android input permission?": "\u042F\u043A \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0437\u0432\u0456\u043B \u043D\u0430 \u0432\u0432\u0435\u0434\u0435\u043D\u043D\u044F Android?", "How to get Android input permission?": "\u042F\u043A \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0437\u0432\u0456\u043B \u043D\u0430 \u0432\u0432\u0435\u0434\u0435\u043D\u043D\u044F \u0432 Android?",
android_input_permission_tip1: '\u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0449\u043E\u0431 \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043C\u0456\u0433 \u043A\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0430\u0448\u0438\u043C Android-\u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0454\u043C \u0437\u0430 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u043E\u044E \u043C\u0438\u0448\u0456 \u0430\u0431\u043E \u0434\u043E\u0442\u0438\u043A\u0443, \u0432\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 RustDesk \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u0443\u0436\u0431\u0443 "\u0421\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456".', android_input_permission_tip1: '\u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0449\u043E\u0431 \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043C\u0456\u0433 \u043A\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0430\u0448\u0438\u043C Android-\u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0454\u043C \u0437\u0430 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u043E\u044E \u043C\u0438\u0448\u0456 \u0430\u0431\u043E \u0434\u043E\u0442\u0438\u043A\u0443, \u0432\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 RustDesk \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u0443\u0436\u0431\u0443 "\u0421\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E\u0441\u0442\u0456".',
android_input_permission_tip2: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043F\u0435\u0440\u0435\u0439\u0434\u0456\u0442\u044C \u043D\u0430 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0438\u0445 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u044C, \u0437\u043D\u0430\u0439\u0434\u0456\u0442\u044C \u0442\u0430 \u0443\u0432\u0456\u0439\u0434\u0456\u0442\u044C \u0443 [\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0441\u043B\u0443\u0436\u0431\u0438], \u0443\u0432\u0456\u043C\u043A\u043D\u0456\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443 [RustDesk Input].", android_input_permission_tip2: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043F\u0435\u0440\u0435\u0439\u0434\u0456\u0442\u044C \u043D\u0430 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0438\u0445 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u044C, \u0437\u043D\u0430\u0439\u0434\u0456\u0442\u044C \u0442\u0430 \u0443\u0432\u0456\u0439\u0434\u0456\u0442\u044C \u0443 [\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0441\u043B\u0443\u0436\u0431\u0438], \u0443\u0432\u0456\u043C\u043A\u043D\u0456\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443 [RustDesk Input].",
android_new_connection_tip: "\u041E\u0442\u0440\u0438\u043C\u0430\u043D\u043E \u043D\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0442 \u043D\u0430 \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0430\u0448\u0438\u043C \u043F\u043E\u0442\u043E\u0447\u043D\u0438\u043C \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0454\u043C.", android_new_connection_tip: "\u041E\u0442\u0440\u0438\u043C\u0430\u043D\u043E \u043D\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0442 \u043D\u0430 \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0430\u0448\u0438\u043C \u043F\u043E\u0442\u043E\u0447\u043D\u0438\u043C \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0454\u043C.",
@@ -25766,7 +25804,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"Ignore Battery Optimizations": "\u0406\u0433\u043D\u043E\u0440\u0443\u0432\u0430\u0442\u0438 \u043E\u043F\u0442\u0438\u043C\u0456\u0437\u0430\u0446\u0456\u0457 \u0431\u0430\u0442\u0430\u0440\u0435\u0457", "Ignore Battery Optimizations": "\u0406\u0433\u043D\u043E\u0440\u0443\u0432\u0430\u0442\u0438 \u043E\u043F\u0442\u0438\u043C\u0456\u0437\u0430\u0446\u0456\u0457 \u0431\u0430\u0442\u0430\u0440\u0435\u0457",
android_open_battery_optimizations_tip: "\u041F\u0435\u0440\u0435\u0439\u0434\u0456\u0442\u044C \u043D\u0430 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u044C", android_open_battery_optimizations_tip: "\u041F\u0435\u0440\u0435\u0439\u0434\u0456\u0442\u044C \u043D\u0430 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u044C",
"Start on boot": "\u0410\u0432\u0442\u043E\u0437\u0430\u043F\u0443\u0441\u043A", "Start on boot": "\u0410\u0432\u0442\u043E\u0437\u0430\u043F\u0443\u0441\u043A",
"Start the screen sharing service on boot, requires special permissions": "\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0441\u043B\u0443\u0436\u0431\u0443 \u0441\u043B\u0443\u0436\u0431\u0443 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0443 \u0434\u043E \u0435\u043A\u0440\u0430\u043D\u0430 \u043F\u0456\u0434 \u0447\u0430\u0441 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F, \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0454 \u0441\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0438\u0445 \u0434\u043E\u0437\u0432\u043E\u043B\u0456\u0432", "Start the screen sharing service on boot, requires special permissions": "\u0417\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u0438 \u0441\u043B\u0443\u0436\u0431\u0443 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0443 \u0434\u043E \u0435\u043A\u0440\u0430\u043D\u0430 \u043F\u0456\u0434 \u0447\u0430\u0441 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F, \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0454 \u0441\u043F\u0435\u0446\u0456\u0430\u043B\u044C\u043D\u0438\u0445 \u0434\u043E\u0437\u0432\u043E\u043B\u0456\u0432",
"Connection not allowed": "\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u043D\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E", "Connection not allowed": "\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u043D\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E",
"Legacy mode": "\u0417\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438\u0439 \u0440\u0435\u0436\u0438\u043C", "Legacy mode": "\u0417\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438\u0439 \u0440\u0435\u0436\u0438\u043C",
"Map mode": "\u0420\u0435\u0436\u0438\u043C \u043A\u0430\u0440\u0442\u0438", "Map mode": "\u0420\u0435\u0436\u0438\u043C \u043A\u0430\u0440\u0442\u0438",
@@ -25788,15 +25826,15 @@ If you want to access a device on a public server, please input "<id>@public", t
"Display Settings": "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u0438\u0441\u043F\u043B\u0435\u044E", "Display Settings": "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u0438\u0441\u043F\u043B\u0435\u044E",
Ratio: "\u0421\u043F\u0456\u0432\u0432\u0456\u0434\u043D\u043E\u0448\u0435\u043D\u043D\u044F", Ratio: "\u0421\u043F\u0456\u0432\u0432\u0456\u0434\u043D\u043E\u0448\u0435\u043D\u043D\u044F",
"Image Quality": "\u042F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F", "Image Quality": "\u042F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",
"Scroll Style": "\u0421\u0442\u0438\u043B\u044C \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438", "Scroll Style": "\u0421\u0442\u0438\u043B\u044C \u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F",
"Show Toolbar": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432", "Show Toolbar": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432",
"Hide Toolbar": "\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432", "Hide Toolbar": "\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432",
"Direct Connection": "\u041F\u0440\u044F\u043C\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F", "Direct Connection": "\u041F\u0440\u044F\u043C\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"Relay Connection": "\u0420\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044C\u043E\u0432\u0430\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F", "Relay Connection": "\u0420\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044C\u043E\u0432\u0430\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"Secure Connection": "\u0411\u0435\u0437\u043F\u0435\u0447\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F", "Secure Connection": "\u0411\u0435\u0437\u043F\u0435\u0447\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"Insecure Connection": "\u041D\u0435\u0431\u0435\u0437\u043F\u0435\u0447\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F", "Insecure Connection": "\u041D\u0435\u0431\u0435\u0437\u043F\u0435\u0447\u043D\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F",
"Scale original": "\u041E\u0440\u0438\u0433\u0456\u043D\u0430\u043B \u043C\u0430\u0441\u0448\u0442\u0430\u0431\u0443", "Scale original": "\u041E\u0440\u0438\u0433\u0456\u043D\u0430\u043B\u044C\u043D\u0438\u0439 \u043C\u0430\u0441\u0448\u0442\u0430\u0431",
"Scale adaptive": "\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0430\u0434\u0430\u043F\u0442\u0438\u0432\u043D\u0438\u0439", "Scale adaptive": "\u0410\u0434\u0430\u043F\u0442\u0438\u0432\u043D\u0438\u0439 \u043C\u0430\u0441\u0448\u0442\u0430\u0431",
General: "\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456", General: "\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456",
Security: "\u0411\u0435\u0437\u043F\u0435\u043A\u0430", Security: "\u0411\u0435\u0437\u043F\u0435\u043A\u0430",
Theme: "\u0422\u0435\u043C\u0430", Theme: "\u0422\u0435\u043C\u0430",
@@ -25861,7 +25899,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"Hide connection management window": "\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u0432\u0456\u043A\u043D\u043E \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F\u043C\u0438", "Hide connection management window": "\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u0432\u0456\u043A\u043D\u043E \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F\u043C\u0438",
hide_cm_tip: "\u0414\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u044F\u043A\u0449\u043E \u0441\u0435\u0430\u043D\u0441 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0443\u0454\u0442\u044C\u0441\u044F \u043F\u043E\u0441\u0442\u0456\u0439\u043D\u0438\u043C \u043F\u0430\u0440\u043E\u043B\u0435\u043C", hide_cm_tip: "\u0414\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u044F\u043A\u0449\u043E \u0441\u0435\u0430\u043D\u0441 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0443\u0454\u0442\u044C\u0441\u044F \u043F\u043E\u0441\u0442\u0456\u0439\u043D\u0438\u043C \u043F\u0430\u0440\u043E\u043B\u0435\u043C",
wayland_experiment_tip: "\u041F\u0456\u0434\u0442\u0440\u0438\u043C\u043A\u0430 Wayland \u043D\u0430 \u0435\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u0456\u0439 \u0441\u0442\u0430\u0434\u0456\u0457, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 X11, \u044F\u043A\u0449\u043E \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F.", wayland_experiment_tip: "\u041F\u0456\u0434\u0442\u0440\u0438\u043C\u043A\u0430 Wayland \u043D\u0430 \u0435\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u0456\u0439 \u0441\u0442\u0430\u0434\u0456\u0457, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 X11, \u044F\u043A\u0449\u043E \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F.",
"Right click to select tabs": "\u041F\u0440\u0430\u0432\u0438\u0439 \u043A\u043B\u0456\u043A \u0434\u043B\u044F \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u043A\u043B\u0430\u0434\u043A\u0438", "Right click to select tabs": "\u0412\u0438\u0431\u0456\u0440 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u044F\u043C \u043F\u0440\u0430\u0432\u043E\u044E",
Skipped: "\u041F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u043E", Skipped: "\u041F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u043E",
"Add to address book": "\u0414\u043E\u0434\u0430\u0442\u0438 IP \u0434\u043E \u0410\u0434\u0440\u0435\u0441\u043D\u043E\u0457 \u043A\u043D\u0438\u0433\u0438", "Add to address book": "\u0414\u043E\u0434\u0430\u0442\u0438 IP \u0434\u043E \u0410\u0434\u0440\u0435\u0441\u043D\u043E\u0457 \u043A\u043D\u0438\u0433\u0438",
Group: "\u0413\u0440\u0443\u043F\u0430", Group: "\u0413\u0440\u0443\u043F\u0430",
@@ -25975,7 +26013,7 @@ If you want to access a device on a public server, please input "<id>@public", t
Stop: "\u0417\u0443\u043F\u0438\u043D\u0438\u0442\u0438", Stop: "\u0417\u0443\u043F\u0438\u043D\u0438\u0442\u0438",
exceed_max_devices: "\u0423 \u0432\u0430\u0441 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457\u0432.", exceed_max_devices: "\u0423 \u0432\u0430\u0441 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457\u0432.",
"Sync with recent sessions": "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F \u0437 \u043D\u0435\u0449\u043E\u0434\u0430\u0432\u043D\u0456\u043C\u0438 \u0441\u0435\u0430\u043D\u0441\u0430\u043C\u0438", "Sync with recent sessions": "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F \u0437 \u043D\u0435\u0449\u043E\u0434\u0430\u0432\u043D\u0456\u043C\u0438 \u0441\u0435\u0430\u043D\u0441\u0430\u043C\u0438",
"Sort tags": "\u0421\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0442\u0435\u0433\u0438", "Sort tags": "\u0421\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043C\u0456\u0442\u043A\u0438",
"Open connection in new tab": "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0432 \u043D\u043E\u0432\u0456\u0439 \u0432\u043A\u043B\u0430\u0434\u0446\u0456", "Open connection in new tab": "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0432 \u043D\u043E\u0432\u0456\u0439 \u0432\u043A\u043B\u0430\u0434\u0446\u0456",
"Move tab to new window": "\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u043A\u043B\u0430\u0434\u043A\u0443 \u0434\u043E \u043D\u043E\u0432\u043E\u0433\u043E \u0432\u0456\u043A\u043D\u0430", "Move tab to new window": "\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u043A\u043B\u0430\u0434\u043A\u0443 \u0434\u043E \u043D\u043E\u0432\u043E\u0433\u043E \u0432\u0456\u043A\u043D\u0430",
"Can not be empty": "\u041D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u043C", "Can not be empty": "\u041D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u043C",
@@ -25986,7 +26024,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"Grid View": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0491\u0440\u0430\u0442\u043A\u043E\u044E", "Grid View": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0491\u0440\u0430\u0442\u043A\u043E\u044E",
"List View": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0441\u043F\u0438\u0441\u043A\u043E\u043C", "List View": "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0441\u043F\u0438\u0441\u043A\u043E\u043C",
Select: "\u0412\u0438\u0431\u0440\u0430\u0442\u0438", Select: "\u0412\u0438\u0431\u0440\u0430\u0442\u0438",
"Toggle Tags": "\u0412\u0438\u0434\u0438\u043C\u0456\u0441\u0442\u044C \u0442\u0435\u0433\u0456\u0432", "Toggle Tags": "\u0412\u0438\u0434\u0438\u043C\u0456\u0441\u0442\u044C \u043C\u0456\u0442\u043E\u043A",
pull_ab_failed_tip: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043E\u043D\u043E\u0432\u0438\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u043D\u0443 \u043A\u043D\u0438\u0433\u0443", pull_ab_failed_tip: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043E\u043D\u043E\u0432\u0438\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u043D\u0443 \u043A\u043D\u0438\u0433\u0443",
push_ab_failed_tip: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u043D\u0443 \u043A\u043D\u0438\u0433\u0443", push_ab_failed_tip: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u043D\u0443 \u043A\u043D\u0438\u0433\u0443",
synced_peer_readded_tip: "\u041F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u0437 \u043D\u0435\u0449\u043E\u0434\u0430\u0432\u043D\u0456\u0445 \u0441\u0435\u0430\u043D\u0441\u0456\u0432 \u0431\u0443\u0434\u0443\u0442\u044C \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u043E\u0432\u0430\u043D\u0456 \u0437 \u0430\u0434\u0440\u0435\u0441\u043D\u043E\u044E \u043A\u043D\u0438\u0433\u043E\u044E.", synced_peer_readded_tip: "\u041F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u0437 \u043D\u0435\u0449\u043E\u0434\u0430\u0432\u043D\u0456\u0445 \u0441\u0435\u0430\u043D\u0441\u0456\u0432 \u0431\u0443\u0434\u0443\u0442\u044C \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u043E\u0432\u0430\u043D\u0456 \u0437 \u0430\u0434\u0440\u0435\u0441\u043D\u043E\u044E \u043A\u043D\u0438\u0433\u043E\u044E.",
@@ -25995,7 +26033,7 @@ If you want to access a device on a public server, please input "<id>@public", t
"HSV Color": "\u041A\u043E\u043B\u0456\u0440 HSV", "HSV Color": "\u041A\u043E\u043B\u0456\u0440 HSV",
"Installation Successful!": "\u0423\u0441\u043F\u0456\u0448\u043D\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F!", "Installation Successful!": "\u0423\u0441\u043F\u0456\u0448\u043D\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F!",
"Installation failed!": "\u041D\u0435\u0432\u0434\u0430\u043B\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F!", "Installation failed!": "\u041D\u0435\u0432\u0434\u0430\u043B\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F!",
"Reverse mouse wheel": "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456\u0439 \u043D\u0430\u043F\u0440\u044F\u043C \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438", "Reverse mouse wheel": "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456\u0439 \u043D\u0430\u043F\u0440\u044F\u043C \u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F",
"{} sessions": "{} \u0441\u0435\u0430\u043D\u0441\u0456\u0432", "{} sessions": "{} \u0441\u0435\u0430\u043D\u0441\u0456\u0432",
scam_title: "\u0412\u0430\u0441 \u043C\u043E\u0436\u0443\u0442\u044C \u041E\u0411\u041C\u0410\u041D\u0423\u0422\u0418!", scam_title: "\u0412\u0430\u0441 \u043C\u043E\u0436\u0443\u0442\u044C \u041E\u0411\u041C\u0410\u041D\u0423\u0422\u0418!",
scam_text1: "\u042F\u043A\u0449\u043E \u0432\u0438 \u0440\u043E\u0437\u043C\u043E\u0432\u043B\u044F\u0454\u0442\u0435 \u043F\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0437 \u043A\u0438\u043C\u043E\u0441\u044C, \u043A\u043E\u0433\u043E \u041D\u0415 \u0417\u041D\u0410\u0404\u0422\u0415 \u0447\u0438 \u043A\u043E\u043C\u0443 \u041D\u0415 \u0414\u041E\u0412\u0406\u0420\u042F\u0404\u0422\u0415, \u0456 \u0446\u044F \u043E\u0441\u043E\u0431\u0430 \u0445\u043E\u0447\u0435, \u0449\u043E\u0431 \u0432\u0438 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043B\u0438 RustDesk \u0442\u0430 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u043B\u0443\u0436\u0431\u0443, \u043D\u0435 \u0440\u043E\u0431\u0456\u0442\u044C \u0446\u044C\u043E\u0433\u043E \u0442\u0430 \u043D\u0435\u0433\u0430\u0439\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u0434\u0437\u0432\u0456\u043D\u043E\u043A.", scam_text1: "\u042F\u043A\u0449\u043E \u0432\u0438 \u0440\u043E\u0437\u043C\u043E\u0432\u043B\u044F\u0454\u0442\u0435 \u043F\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0437 \u043A\u0438\u043C\u043E\u0441\u044C, \u043A\u043E\u0433\u043E \u041D\u0415 \u0417\u041D\u0410\u0404\u0422\u0415 \u0447\u0438 \u043A\u043E\u043C\u0443 \u041D\u0415 \u0414\u041E\u0412\u0406\u0420\u042F\u0404\u0422\u0415, \u0456 \u0446\u044F \u043E\u0441\u043E\u0431\u0430 \u0445\u043E\u0447\u0435, \u0449\u043E\u0431 \u0432\u0438 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043B\u0438 RustDesk \u0442\u0430 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u043B\u0443\u0436\u0431\u0443, \u043D\u0435 \u0440\u043E\u0431\u0456\u0442\u044C \u0446\u044C\u043E\u0433\u043E \u0442\u0430 \u043D\u0435\u0433\u0430\u0439\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u0434\u0437\u0432\u0456\u043D\u043E\u043A.",
@@ -26119,15 +26157,16 @@ If you want to access a device on a public server, please input "<id>@public", t
"one-way-file-transfer-tip": "\u041D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0456, \u0449\u043E \u043A\u0435\u0440\u0443\u0454\u0442\u044C\u0441\u044F, \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E \u043E\u0434\u043D\u043E\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u044E \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0444\u0430\u0439\u043B\u0456\u0432.", "one-way-file-transfer-tip": "\u041D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0456, \u0449\u043E \u043A\u0435\u0440\u0443\u0454\u0442\u044C\u0441\u044F, \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E \u043E\u0434\u043D\u043E\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u044E \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0444\u0430\u0439\u043B\u0456\u0432.",
"Authentication Required": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u0430 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F", "Authentication Required": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u0430 \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F",
Authenticate: "\u0410\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0443\u0432\u0430\u0442\u0438", Authenticate: "\u0410\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0443\u0432\u0430\u0442\u0438",
web_id_input_tip: `\u0412\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 ID \u0437 \u0442\u043E\u0433\u043E \u0441\u0430\u043C\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043F\u0440\u044F\u043C\u0438\u0439 IP-\u0434\u043E\u0441\u0442\u0443\u043F \u0443 \u0432\u0435\u0431-\u043A\u043B\u0456\u0454\u043D\u0442\u0456 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F. web_id_input_tip: `\u0412\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 ID \u043D\u0430 \u0442\u043E\u043C\u0443 \u0441\u0430\u043C\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043F\u0440\u044F\u043C\u0438\u0439 IP-\u0434\u043E\u0441\u0442\u0443\u043F \u0443 \u0432\u0435\u0431-\u043A\u043B\u0456\u0454\u043D\u0442\u0456 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F.
\u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0456, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0434\u043E\u0434\u0430\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (<id>@<\u0430\u0434\u0440\u0435\u0441\u0430_\u0441\u0435\u0440\u0432\u0435\u0440\u0430>?key=<\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F_\u043A\u043B\u044E\u0447\u0430>), \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0456, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0434\u043E\u0434\u0430\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (<id>@<\u0430\u0434\u0440\u0435\u0441\u0430_\u0441\u0435\u0440\u0432\u0435\u0440\u0430>?key=<\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F_\u043A\u043B\u044E\u0447\u0430>). \u041D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434,
9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=. 9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.
\u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E \u043D\u0430 \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0456, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0432\u0435\u0434\u0456\u0442\u044C "<id>@public", \u0434\u043B\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043A\u043B\u044E\u0447 \u043D\u0435 \u043F\u043E\u0442\u0440\u0456\u0431\u0435\u043D.`, \u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E \u043D\u0430 \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0456, \u0431\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0432\u0435\u0434\u0456\u0442\u044C "<id>@public". \u0414\u043B\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043A\u043B\u044E\u0447 \u043D\u0435 \u043F\u043E\u0442\u0440\u0456\u0431\u0435\u043D.`,
Download: "", Download: "\u041E\u0442\u0440\u0438\u043C\u0430\u0442\u0438",
"Upload folder": "", "Upload folder": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0442\u0435\u043A\u0443",
"Upload files": "", "Upload files": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438",
"Clipboard is synchronized": "", "Clipboard is synchronized": "\u0411\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0456\u043D\u0443 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u043E\u0432\u0430\u043D\u043E",
"Update client clipboard": "" "Update client clipboard": "\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0456\u043D\u0443 \u043A\u043B\u0456\u0454\u043D\u0442\u0430",
Untagged: "\u0411\u0435\u0437 \u043C\u0456\u0442\u043E\u043A"
}, cs: { }, cs: {
Status: "Stav", Status: "Stav",
"Your Desktop": "Va\u0161e plocha", "Your Desktop": "Va\u0161e plocha",
@@ -26792,7 +26831,8 @@ M\u016F\u017Eete se p\u0159ipojit k jin\xFDm za\u0159\xEDzen\xEDm, ale jin\xE1 z
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
}, nl: { }, nl: {
Status: "Status", Status: "Status",
"Your Desktop": "Uw Bureaublad", "Your Desktop": "Uw Bureaublad",
@@ -27455,7 +27495,8 @@ Als je toegang wilt krijgen tot een apparaat op een publieke server, voer dan "<
"Upload folder": "Map uploaden", "Upload folder": "Map uploaden",
"Upload files": "Bestanden uploaden", "Upload files": "Bestanden uploaden",
"Clipboard is synchronized": "Klembord is gesynchroniseerd", "Clipboard is synchronized": "Klembord is gesynchroniseerd",
"Update client clipboard": "Klembord van client bijwerken" "Update client clipboard": "Klembord van client bijwerken",
Untagged: ""
}, fr: { }, fr: {
Status: "Statut", Status: "Statut",
"Your Desktop": "Votre bureau", "Your Desktop": "Votre bureau",
@@ -27601,7 +27642,7 @@ Als je toegang wilt krijgen tot een apparaat op een publieke server, voer dan "<
"Failed to make direct connection to remote desktop": "Impossible d'\xE9tablir une connexion directe", "Failed to make direct connection to remote desktop": "Impossible d'\xE9tablir une connexion directe",
"Set Password": "D\xE9finir le mot de passe", "Set Password": "D\xE9finir le mot de passe",
"OS Password": "Mot de passe du syst\xE8me d'exploitation", "OS Password": "Mot de passe du syst\xE8me d'exploitation",
install_tip: "Vous utilisez une version non install\xE9e. En raison des restrictions UAC, en tant que terminal contr\xF4l\xE9, dans certains cas, il ne sera pas en mesure de contr\xF4ler la souris et le clavier ou d'enregistrer l'\xE9cran. Veuillez cliquer sur le bouton ci-dessous pour installer RustDesk au syst\xE8me pour \xE9viter la question ci-dessus.", install_tip: "RustDesk n'est pas install\xE9, ce qui peut limiter son utilisation \xE0 cause de l'UAC. Cliquez ci-dessous pour l'installer.",
"Click to upgrade": "Cliquer pour mettre \xE0 niveau", "Click to upgrade": "Cliquer pour mettre \xE0 niveau",
"Click to download": "Cliquer pour t\xE9l\xE9charger", "Click to download": "Cliquer pour t\xE9l\xE9charger",
"Click to update": "Cliquer pour mettre \xE0 jour", "Click to update": "Cliquer pour mettre \xE0 jour",
@@ -28116,6 +28157,7 @@ Vous pouvez vous connecter \xE0 d\u2019autres appareils, mais les autres apparei
"Upload folder": "", "Upload folder": "",
"Upload files": "", "Upload files": "",
"Clipboard is synchronized": "", "Clipboard is synchronized": "",
"Update client clipboard": "" "Update client clipboard": "",
Untagged: ""
} }
} }

139287
resources/web2/main.dart.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -3,6 +3,7 @@ package service
import ( import (
"Gwen/global" "Gwen/global"
"Gwen/model" "Gwen/model"
"encoding/json"
"github.com/google/uuid" "github.com/google/uuid"
"gorm.io/gorm" "gorm.io/gorm"
"strings" "strings"
@@ -116,6 +117,16 @@ func (s *AddressBookService) List(page, pageSize uint, where func(tx *gorm.DB))
return return
} }
func (s *AddressBookService) FromPeer(peer *model.Peer) (a *model.AddressBook) {
a = &model.AddressBook{}
a.Id = peer.Id
a.Username = peer.Username
a.Hostname = peer.Hostname
a.UserId = peer.UserId
a.Platform = s.PlatformFromOs(peer.Os)
return a
}
// Create 创建 // Create 创建
func (s *AddressBookService) Create(u *model.AddressBook) error { func (s *AddressBookService) Create(u *model.AddressBook) error {
res := global.DB.Create(u).Error res := global.DB.Create(u).Error
@@ -318,3 +329,12 @@ func (s *AddressBookService) CheckCollectionOwner(uid uint, cid uint) bool {
p := s.CollectionInfoById(cid) p := s.CollectionInfoById(cid)
return p.UserId == uid return p.UserId == uid
} }
func (s *AddressBookService) BatchUpdateTags(abs []*model.AddressBook, tags []string) error {
ids := make([]uint, 0)
for _, ab := range abs {
ids = append(ids, ab.RowId)
}
tagsv, _ := json.Marshal(tags)
return global.DB.Model(&model.AddressBook{}).Where("row_id in ?", ids).Update("tags", tagsv).Error
}

View File

@@ -458,3 +458,7 @@ func (us *UserService) AutoRefreshAccessToken(ut *model.UserToken) {
us.RefreshAccessToken(ut) us.RefreshAccessToken(ut)
} }
} }
func (us *UserService) BatchDeleteUserToken(ids []uint) error {
return global.DB.Where("id in ?", ids).Delete(&model.UserToken{}).Error
}