+[文档](https://audiobookshelf.org/docs) · [用户指南](https://audiobookshelf.org/guides) · [支持](https://audiobookshelf.org/support)
-# About
+# 关于
-Audiobookshelf is a self-hosted audiobook and podcast server.
+Audiobookshelf 是一个自托管的有声书和播客服务器。
-### Features
+### 功能
-* Fully **open-source**, including the [android & iOS app](https://github.com/advplyr/audiobookshelf-app) *(in beta)*
-* Stream all audio formats on the fly
-* Search and add podcasts to download episodes w/ auto-download
-* Multi-user support w/ custom permissions
-* Keeps progress per user and syncs across devices
-* Auto-detects library updates, no need to re-scan
-* Upload books and podcasts w/ bulk upload drag and drop folders
-* Backup your metadata + automated daily backups
-* Progressive Web App (PWA)
-* Chromecast support on the web app and android app
-* Fetch metadata and cover art from several sources
-* Chapter editor and chapter lookup (using [Audnexus API](https://audnex.us/))
-* Merge your audio files into a single m4b
-* Embed metadata and cover image into your audio files (using [Tone](https://github.com/sandreas/tone))
-* Basic ebook support and ereader
- * Epub, pdf, cbr, cbz
- * Send ebook to device (i.e. Kindle)
-* Open RSS feeds for podcasts and audiobooks
+* 完全 **开源** ,包括 [Android & iOS 应用](https://github.com/advplyr/audiobookshelf-app) *(内测中)*
+* 实时流式传输所有音频格式
+* 搜索并添加播客以自动下载集数
+* 支持多用户,并可自定义权限
+* 按用户保存进度并在设备间同步
+* 自动检测库更新,无需重新扫描
+* 批量上传书籍和播客,支持拖放文件夹
+* 备份元数据,并提供每日自动备份
+* 渐进式网络应用(PWA)
+* 支持通过网页和安卓应用使用 Chromecast
+* 从多个来源获取元数据和封面艺术
+* 章节编辑和章节查找(使用 Audnexus API)
+* 将你的音频文件合并为一个 m4b 文件
+* 将元数据和封面图片嵌入到你的音频文件中(使用 Tone)
+* 基本的电子书支持和电子阅读器
+ * Epub, pdf, cbr, cbz
+ * 将电子书发送到设备(例如:Kindle)
+* 打开播客和有声书的 RSS 订阅源
-Is there a feature you are looking for? [Suggest it](https://github.com/advplyr/audiobookshelf/issues/new/choose)
+您在寻找某个功能吗? [提出来](https://github.com/advplyr/audiobookshelf/issues/new/choose)
-Join us on [Discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
+加入我们,在 [Discord](https://discord.gg/pJsjuNCKRq) 或 [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
-### Android App (beta)
-Try it out on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
+### Android 应用(测试版)
-### iOS App (beta)
-Available using Test Flight: https://testflight.apple.com/join/wiic7QIW - [Join the discussion](https://github.com/advplyr/audiobookshelf-app/discussions/60)
+在 [Google Play 商店](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)试用
-### Build your own tools & clients
-Check out the [API documentation](https://api.audiobookshelf.org/)
+### iOS App(测试版)
-
+通过 Test Flight 获取:[https://testflight.apple.com/join/wiic7QIW](https://testflight.apple.com/join/wiic7QIW) - [加入讨论](https://testflight.apple.com/join/wiic7QIW)
-
+### 自建工具与客户端
-
+查看 [API 文档](API 文档)
-# Organizing your audiobooks
+
-#### Directory structure and folder names are important to Audiobookshelf!
+# 整理有声书
- See [documentation](https://audiobookshelf.org/docs#book-directory-structure) for supported directory structure, folder naming conventions, and audio file metadata usage.
+#### 目录结构和文件夹名称对 Audiobookshelf 非常重要!
-
+请参阅[文档](https://audiobookshelf.org/docs#book-directory-structure)了解支持的目录结构、文件夹命名约定以及音频文件元数据的使用方法。
-# Installation
+# 安装
-See [install docs](https://www.audiobookshelf.org/docs)
+请参阅[安装文档](https://www.audiobookshelf.org/docs)
-
+# 反向代理设置
-# Reverse Proxy Set Up
+#### 重要!Audiobookshelf 需要建立 WebSocket 连接。
-#### Important! Audiobookshelf requires a websocket connection.
+#### 注意:子文件夹路径(例如 /audiobooks)尚未支持。详见 [issue](https://github.com/advplyr/audiobookshelf/issues/385)
-#### Note: Subfolder paths (e.g. /audiobooks) are not supported yet. See [issue](https://github.com/advplyr/audiobookshelf/issues/385)
+### NGINX 反向代理管理器
-### NGINX Proxy Manager
+启用 WebSockets 支持
-Toggle websockets support.
+
-
-
-### NGINX Reverse Proxy
-
-Add this to the site config file on your nginx server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+### NGINX 反向代理
+在你的 Nginx 服务器的站点配置文件中添加以下内容,更改 <> 中的相关部分,并插入你的证书路径,然后保存文件。
```bash
server
@@ -114,17 +98,18 @@ server
}
```
-### Apache Reverse Proxy
+### Apache 反向代理
-Add this to the site config file on your Apache server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+在你的 Apache 服务器的站点配置文件中添加以下内容,更改 <> 中的相关部分,并插入你的证书路径,然后保存文件。
-For this to work you must enable at least the following mods using `a2enmod`:
- - `ssl`
- - `proxy`
- - `proxy_http`
- - `proxy_balancer`
- - `proxy_wstunnel`
- - `rewrite`
+要使此功能正常工作,你必须使用 `a2enmod` 启用以下模块中的至少一个:
+
+* `ssl`
+* `proxy`
+* `proxy_http`
+* `proxy_balancer`
+* `proxy_wstunnel`
+* `rewrite`
```bash
@@ -149,9 +134,8 @@ For this to work you must enable at least the following mods using `a2enmod`:
```
-Some SSL certificates like those signed by Let's Encrypt require ACME validation. To allow Let's Encrypt to write and confirm
-the ACME challenge, edit your VirtualHost definition to prevent proxying traffic that queries `/.well-known` and instead
-serve that directly:
+某些由 Let's Encrypt 签名的 SSL 证书(如 Let's Encrypt 证书)需要进行 ACME 验证。为了允许 Let's Encrypt 写入并确认 ACME 挑战,请编辑您的 VirtualHost 定义,以防止代理查询 `/.well-known` 的流量,而是直接提供这些内容:
+
```bash
# ...
@@ -169,36 +153,32 @@ serve that directly:
```
+### SWAG 反向代理
-### SWAG Reverse Proxy
+[请参阅 LinuxServer.io 配置示例](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
-[See LinuxServer.io config sample](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
+### Synology 反向代理
-### Synology Reverse Proxy
+1. 打开控制面板 > 应用程序门户
+2. 切换到反向代理选项卡
+3. 选择您想要启用 Websockets 的代理规则,然后点击编辑
+4. 切换到“自定义标头”选项卡
+5. 点击创建 > WebSocket
+6. 点击保存
-1. Open Control Panel > Application Portal
-2. Change to the Reverse Proxy tab
-3. Select the proxy rule for which you want to enable Websockets and click on Edit
-4. Change to the "Custom Header" tab
-5. Click Create > WebSocket
-6. Click Save
+[来自 @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
-[from @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
+### [Traefik 反向代理](https://doc.traefik.io/traefik/)
-### [Traefik Reverse Proxy](https://doc.traefik.io/traefik/)
+与 CORS 相关的中间件会导致在登录时应用程序报告未知错误。为了避免这种情况,请不要为该站点的路由器应用以下标头:
-Middleware relating to CORS will cause the app to report Unknown Error when logging in. To prevent this don't apply any of the following headers to the router for this site:
+* accessControlAllowMethods
+* accessControlAllowOriginList
+* accessControlMaxAge
-
-
accessControlAllowMethods
-
accessControlAllowOriginList
-
accessControlMaxAge
-
+来自 @Dondochaka 和 @BeastleeUK
-From [@Dondochaka](https://discord.com/channels/942908292873723984/942914154254176257/945074590374318170) and [@BeastleeUK](https://discord.com/channels/942908292873723984/942914154254176257/970366039294611506)
-
-
-### Example Caddyfile - [Caddy Reverse Proxy](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
+### 示例 Caddyfile - [Caddy 反向代理](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
```
subdomain.domain.com {
@@ -207,78 +187,56 @@ subdomain.domain.com {
}
```
+# 从源代码运行
-# Run from source
+# 贡献
-# Contributing
+该应用使用 [NodeJs](https://nodejs.org/) 构建。
-This application is built using [NodeJs](https://nodejs.org/).
+### Dev Container 设置
-### Dev Container Setup
-The easiest way to begin developing this project is to use a dev container. An introduction to dev containers in VSCode can be found [here](https://code.visualstudio.com/docs/devcontainers/containers).
+开始开发这个项目最简单的方法是使用开发容器。在 VSCode 中使用开发容器的介绍可以在这里找到 [这里](https://code.visualstudio.com/docs/devcontainers/containers) 。
-Required Software:
-* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
-* [VSCode](https://code.visualstudio.com/download)
+所需软件:
-*Note, it is possible to use other container software than Docker and IDEs other than VSCode. However, this setup is more complicated and not covered here.*
+* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
+* [VSCode](https://code.visualstudio.com/download)
-
-
-Install the required software on Windows with winget
+*请注意,除了使用 Docker 作为容器软件,还可以使用其他容器软件;除了使用 VSCode 作为 IDE,还可以使用其他 IDE。然而,这种设置更为复杂,这里不予涵盖。*
-
-Note: This requires a PowerShell prompt with winget installed. You should be able to copy and paste the code block to install. If you use an elevated PowerShell prompt, UAC will not pop up during the installs.
+在 Windows 上使用安装所需的软件
+
+注意:这需要一个带有 winget 的 PowerShell 提示符。你应该能够复制并粘贴代码块进行安装。如果你使用的是提升的 PowerShell 提示符,安装过程中不会弹出 UAC 提示。
```PowerShell
winget install -e --id Docker.DockerDesktop; `
winget install -e --id Microsoft.VisualStudioCode
```
-
-
-
-
-
-
-Install the required software on MacOS with homebrew
-
-
+安装这些包后,您现在可以安装 VSCode 的 [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) 扩展。安装完此扩展后,打开命令面板(`ctrl+shift+p` 或 `cmd+shift+p`),然后选择命令 `>Dev Containers: Rebuild and Reopen in Container` 。这将导致开发环境容器被构建并启动。
-After installing these packages, you can now install the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension for VSCode. After installing this extension open the command pallet (`ctrl+shift+p` or `cmd+shift+p`) and select the command `>Dev Containers: Rebuild and Reopen in Container`. This will cause the development environment container to be built and launched.
+现在您可以开始开发了!
-You are now ready to start development!
+### 手动设置环境
-### Manual Environment Setup
+如果你不想使用开发容器,仍然可以开发这个项目。首先,你需要安装 [NodeJs](https://nodejs.org/)(版本 16)和 [FFmpeg](https://ffmpeg.org/)。
-If you don't want to use the dev container, you can still develop this project. First, you will need to install [NodeJs](https://nodejs.org/) (version 16) and [FFmpeg](https://ffmpeg.org/).
+接下来,你需要在项目的根目录中创建一个 `dev.js` 文件。这个文件包含配置信息和与你的开发环境相关的路径。你可以在 `.devcontainer/dev.js` 中找到这个文件的一个示例。
-Next you will need to create a `dev.js` file in the project's root directory. This contains configuration information and paths unique to your development environment. You can find an example of this file in `.devcontainer/dev.js`.
-
-You are now ready to build the client:
+你现在可以构建客户端了:
```sh
npm ci
@@ -288,21 +246,20 @@ npm run generate
cd ..
```
-### Development Commands
+### 开发命令
-After setting up your development environment, either using the dev container or using your own custom environment, the following commands will help you run the server and client.
+设置完开发环境后(无论是使用开发容器还是自定义环境),以下命令可以帮助你运行服务器和客户端。
-To run the server, you can use the command `npm run dev`. This will use the client that was built when you ran `npm run generate` in the client directory or when you started the dev container. If you make changes to the server, you will need to restart the server. If you make changes to the client, you will need to run the command `(cd client; npm run generate)` and then restart the server. By default the client runs at `localhost:3333`, though the port can be configured in `dev.js`.
+要运行服务器,可以使用命令 ``npm run dev``。这将使用你在客户端目录中运行 ``npm run generate`` 时构建的客户端,或者在启动开发容器时构建的客户端。如果你对服务器进行了修改,需要重启服务器。如果你对客户端进行了修改,需要运行命令 ``(cd client; npm run generate)``,然后重启服务器。默认情况下,客户端运行在 ``localhost:3333``,但端口可以在 ``dev.js`` 中进行配置。
-You can also build a version of the client that supports live reloading. To do this, start the server, then run the command `(cd client; npm run dev)`. This will run a separate instance of the client at `localhost:3000` that will be automatically updated as you make changes to the client.
+你也可以构建一个支持实时重载的客户端版本。要实现这一点,先启动服务器,然后运行命令 ``(cd client; npm run dev)``。这将在 ``localhost:3000`` 上运行一个客户端实例,并且当你对客户端进行修改时会自动更新。
-If you are using VSCode, this project includes a couple of pre-defined targets to speed up this process. First, if you build the project (`ctrl+shift+b` or `cmd+shift+b`) it will automatically generate the client. Next, there are debug commands for running the server and client. You can view these targets using the debug panel (bring it up with (`ctrl+shift+d` or `cmd+shift+d`):
+如果你使用的是 VSCode,这个项目包含几个预定义的目标来加快这个过程。首先,如果你构建项目(`ctrl+shift+b` 或 `cmd+shift+b`),它会自动生成客户端。接下来,有调试命令可以运行服务器和客户端。你可以通过调试面板查看这些目标(使用 `ctrl+shift+d` 或 `cmd+shift+d` 打开调试面板):
-* `Debug server`—Run the server.
-* `Debug client (nuxt)`—Run the client with live reload.
-* `Debug server and client (nuxt)`—Runs both the preceding two debug targets.
+* `Debug server`—运行服务器。
+* `Debug client (nuxt)`—运行客户端并启用实时重载。
+* `Debug server and client (nuxt)` —运行上述两个调试目标。
+# 如何支持
-# How to Support
-
-[See the incomplete "How to Support" page](https://www.audiobookshelf.org/support)
\ No newline at end of file
+[查看不完整的“支持方式”页面](https://www.audiobookshelf.org/support)
\ No newline at end of file
diff --git a/apps/audiobookshelf/README_en.md b/apps/audiobookshelf/README_en.md
new file mode 100644
index 000000000..87fdfec72
--- /dev/null
+++ b/apps/audiobookshelf/README_en.md
@@ -0,0 +1,308 @@
+
+
+
+# About
+
+Audiobookshelf is a self-hosted audiobook and podcast server.
+
+### Features
+
+* Fully **open-source**, including the [android & iOS app](https://github.com/advplyr/audiobookshelf-app) *(in beta)*
+* Stream all audio formats on the fly
+* Search and add podcasts to download episodes w/ auto-download
+* Multi-user support w/ custom permissions
+* Keeps progress per user and syncs across devices
+* Auto-detects library updates, no need to re-scan
+* Upload books and podcasts w/ bulk upload drag and drop folders
+* Backup your metadata + automated daily backups
+* Progressive Web App (PWA)
+* Chromecast support on the web app and android app
+* Fetch metadata and cover art from several sources
+* Chapter editor and chapter lookup (using [Audnexus API](https://audnex.us/))
+* Merge your audio files into a single m4b
+* Embed metadata and cover image into your audio files (using [Tone](https://github.com/sandreas/tone))
+* Basic ebook support and ereader
+ * Epub, pdf, cbr, cbz
+ * Send ebook to device (i.e. Kindle)
+* Open RSS feeds for podcasts and audiobooks
+
+Is there a feature you are looking for? [Suggest it](https://github.com/advplyr/audiobookshelf/issues/new/choose)
+
+Join us on [Discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
+
+### Android App (beta)
+Try it out on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
+
+### iOS App (beta)
+Available using Test Flight: https://testflight.apple.com/join/wiic7QIW - [Join the discussion](https://github.com/advplyr/audiobookshelf-app/discussions/60)
+
+### Build your own tools & clients
+Check out the [API documentation](https://api.audiobookshelf.org/)
+
+
+
+
+
+
+
+# Organizing your audiobooks
+
+#### Directory structure and folder names are important to Audiobookshelf!
+
+ See [documentation](https://audiobookshelf.org/docs#book-directory-structure) for supported directory structure, folder naming conventions, and audio file metadata usage.
+
+
+
+# Installation
+
+See [install docs](https://www.audiobookshelf.org/docs)
+
+
+
+# Reverse Proxy Set Up
+
+#### Important! Audiobookshelf requires a websocket connection.
+
+#### Note: Subfolder paths (e.g. /audiobooks) are not supported yet. See [issue](https://github.com/advplyr/audiobookshelf/issues/385)
+
+### NGINX Proxy Manager
+
+Toggle websockets support.
+
+
+
+### NGINX Reverse Proxy
+
+Add this to the site config file on your nginx server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+
+
+```bash
+server
+{
+ listen 443 ssl;
+ server_name ..;
+
+ access_log /var/log/nginx/audiobookshelf.access.log;
+ error_log /var/log/nginx/audiobookshelf.error.log;
+
+ ssl_certificate /path/to/certificate;
+ ssl_certificate_key /path/to/key;
+
+ location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $host;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_http_version 1.1;
+
+ proxy_pass http://;
+ proxy_redirect http:// https://;
+ }
+}
+```
+
+### Apache Reverse Proxy
+
+Add this to the site config file on your Apache server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+
+For this to work you must enable at least the following mods using `a2enmod`:
+ - `ssl`
+ - `proxy`
+ - `proxy_http`
+ - `proxy_balancer`
+ - `proxy_wstunnel`
+ - `rewrite`
+
+```bash
+
+
+ ServerName ..
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+ ProxyPreserveHost On
+ ProxyPass / http://localhost:/
+ RewriteEngine on
+ RewriteCond %{HTTP:Upgrade} websocket [NC]
+ RewriteCond %{HTTP:Connection} upgrade [NC]
+ RewriteRule ^/?(.*) "ws://localhost:/$1" [P,L]
+
+ # unless you're doing something special this should be generated by a
+ # tool like certbot by let's encrypt
+ SSLCertificateFile /path/to/cert/file
+ SSLCertificateKeyFile /path/to/key/file
+
+
+```
+
+Some SSL certificates like those signed by Let's Encrypt require ACME validation. To allow Let's Encrypt to write and confirm
+the ACME challenge, edit your VirtualHost definition to prevent proxying traffic that queries `/.well-known` and instead
+serve that directly:
+```bash
+
+ # ...
+
+ # create the directory structure /.well-known/acme-challenges
+ # within DocumentRoot and give the HTTP user recursive write
+ # access to it.
+ DocumentRoot /path/to/local/directory
+
+ ProxyPreserveHost On
+ ProxyPass /.well-known !
+ ProxyPass / http://localhost:/
+
+ # ...
+
+```
+
+
+### SWAG Reverse Proxy
+
+[See LinuxServer.io config sample](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
+
+### Synology Reverse Proxy
+
+1. Open Control Panel > Application Portal
+2. Change to the Reverse Proxy tab
+3. Select the proxy rule for which you want to enable Websockets and click on Edit
+4. Change to the "Custom Header" tab
+5. Click Create > WebSocket
+6. Click Save
+
+[from @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
+
+### [Traefik Reverse Proxy](https://doc.traefik.io/traefik/)
+
+Middleware relating to CORS will cause the app to report Unknown Error when logging in. To prevent this don't apply any of the following headers to the router for this site:
+
+
+
accessControlAllowMethods
+
accessControlAllowOriginList
+
accessControlMaxAge
+
+
+From [@Dondochaka](https://discord.com/channels/942908292873723984/942914154254176257/945074590374318170) and [@BeastleeUK](https://discord.com/channels/942908292873723984/942914154254176257/970366039294611506)
+
+
+### Example Caddyfile - [Caddy Reverse Proxy](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
+
+```
+subdomain.domain.com {
+ encode gzip zstd
+ reverse_proxy :
+}
+```
+
+
+# Run from source
+
+# Contributing
+
+This application is built using [NodeJs](https://nodejs.org/).
+
+### Dev Container Setup
+The easiest way to begin developing this project is to use a dev container. An introduction to dev containers in VSCode can be found [here](https://code.visualstudio.com/docs/devcontainers/containers).
+
+Required Software:
+* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
+* [VSCode](https://code.visualstudio.com/download)
+
+*Note, it is possible to use other container software than Docker and IDEs other than VSCode. However, this setup is more complicated and not covered here.*
+
+
+
+Install the required software on Windows with winget
+
+
+Note: This requires a PowerShell prompt with winget installed. You should be able to copy and paste the code block to install. If you use an elevated PowerShell prompt, UAC will not pop up during the installs.
+
+```PowerShell
+winget install -e --id Docker.DockerDesktop; `
+winget install -e --id Microsoft.VisualStudioCode
+```
+
+
+
+
+
+
+
+Install the required software on MacOS with homebrew
+
+
+
+After installing these packages, you can now install the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension for VSCode. After installing this extension open the command pallet (`ctrl+shift+p` or `cmd+shift+p`) and select the command `>Dev Containers: Rebuild and Reopen in Container`. This will cause the development environment container to be built and launched.
+
+You are now ready to start development!
+
+### Manual Environment Setup
+
+If you don't want to use the dev container, you can still develop this project. First, you will need to install [NodeJs](https://nodejs.org/) (version 16) and [FFmpeg](https://ffmpeg.org/).
+
+Next you will need to create a `dev.js` file in the project's root directory. This contains configuration information and paths unique to your development environment. You can find an example of this file in `.devcontainer/dev.js`.
+
+You are now ready to build the client:
+
+```sh
+npm ci
+cd client
+npm ci
+npm run generate
+cd ..
+```
+
+### Development Commands
+
+After setting up your development environment, either using the dev container or using your own custom environment, the following commands will help you run the server and client.
+
+To run the server, you can use the command `npm run dev`. This will use the client that was built when you ran `npm run generate` in the client directory or when you started the dev container. If you make changes to the server, you will need to restart the server. If you make changes to the client, you will need to run the command `(cd client; npm run generate)` and then restart the server. By default the client runs at `localhost:3333`, though the port can be configured in `dev.js`.
+
+You can also build a version of the client that supports live reloading. To do this, start the server, then run the command `(cd client; npm run dev)`. This will run a separate instance of the client at `localhost:3000` that will be automatically updated as you make changes to the client.
+
+If you are using VSCode, this project includes a couple of pre-defined targets to speed up this process. First, if you build the project (`ctrl+shift+b` or `cmd+shift+b`) it will automatically generate the client. Next, there are debug commands for running the server and client. You can view these targets using the debug panel (bring it up with (`ctrl+shift+d` or `cmd+shift+d`):
+
+* `Debug server`—Run the server.
+* `Debug client (nuxt)`—Run the client with live reload.
+* `Debug server and client (nuxt)`—Runs both the preceding two debug targets.
+
+
+# How to Support
+
+[See the incomplete "How to Support" page](https://www.audiobookshelf.org/support)
\ No newline at end of file
diff --git a/apps/autoheal/README.md b/apps/autoheal/README.md
index 33cd3ee28..347b131e0 100644
--- a/apps/autoheal/README.md
+++ b/apps/autoheal/README.md
@@ -1,18 +1,19 @@
# Docker Autoheal
-Monitor and restart unhealthy docker containers.
-This functionality was proposed to be included with the addition of `HEALTHCHECK`, however didn't make the cut.
-This container is a stand-in till there is native support for `--exit-on-unhealthy` https://github.com/docker/docker/pull/22719.
+监控并重启不健康的 Docker 容器。此功能曾提议在增加 \``HEALTHCHECK`\` 后包含进来,但最终未能实现。此容器是一个临时替代品,直到有原生支持 \``--exit-on-unhealthy`\`[https://github.com/docker/docker/pull/22719](https://github.com/docker/docker/pull/22719)。
-## Supported tags and Dockerfile links
-- [`latest` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/main/Dockerfile) - Built daily
-- [`1.1.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/1.1.0/Dockerfile)
-- [`v0.7.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/v0.7.0/Dockerfile)
+## 支持的标签和 Dockerfile 链接
+
+* [`latest` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/main/Dockerfile) - 每日构建
+* [`1.1.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/1.1.0/Dockerfile)
+* [`v0.7.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/v0.7.0/Dockerfile)
 [](http://microbadger.com/images/willfarrell/autoheal "Docker layer breakdown")
-## How to use
-### UNIX socket passthrough
+## 如何使用
+
+### UNIX 套接字透传
+
```bash
docker run -d \
--name autoheal \
@@ -21,7 +22,9 @@ docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autoheal
```
+
### TCP socket
+
```bash
docker run -d \
--name autoheal \
@@ -31,28 +34,31 @@ docker run -d \
-v /path/to/certs/:/certs/:ro \
willfarrell/autoheal
```
-a) Apply the label `autoheal=true` to your container to have it watched.
-b) Set ENV `AUTOHEAL_CONTAINER_LABEL=all` to watch all running containers.
+a) 在你的容器上应用标签 \``autoheal=true`\` 以使其被监控。
-c) Set ENV `AUTOHEAL_CONTAINER_LABEL` to existing label name that has the value `true`.
+b) 设置环境变量 \``AUTOHEAL_CONTAINER_LABEL=all`\` 以监控所有运行中的容器。
-Note: You must apply `HEALTHCHECK` to your docker images first. See https://docs.docker.com/engine/reference/builder/#healthcheck for details.
-See https://docs.docker.com/engine/security/https/ for how to configure TCP with mTLS
+c) 设置环境变量 \``AUTOHEAL_CONTAINER_LABEL`\` 为具有值 \``true`\` 的现有标签名称。
-The certificates, and keys need these names:
-* ca.pem
-* client-cert.pem
-* client-key.pem
+注意:您必须首先将 `HEALTHCHECK` 应用于您的 Docker 镜像。详情请参阅 [https://docs.docker.com/engine/reference/builder/#healthcheck](https://docs.docker.com/engine/reference/builder/#healthcheck)。有关如何使用 mTLS 配置 TCP,请参阅 [https://docs.docker.com/engine/security/https/](https://docs.docker.com/engine/security/https/)。
+
+证书和密钥需要以下名称:
+
+* ca.pem
+* client-cert.pem
+* client-key.pem
+
+### 更改时区
+
+如果需要时区与本地机器一致,可以将 `/etc/localtime` 映射到容器中。
-### Change Timezone
-If you need the timezone to match the local machine, you can map the `/etc/localtime` into the container.
```
docker run ... -v /etc/localtime:/etc/localtime:ro
```
+## ENV 默认设置
-## ENV Defaults
```
AUTOHEAL_CONTAINER_LABEL=autoheal
AUTOHEAL_INTERVAL=5 # check every 5 seconds
@@ -63,12 +69,14 @@ CURL_TIMEOUT=30 # --max-time seconds for curl requests to Docker API
WEBHOOK_URL="" # post message to the webhook if a container was restarted (or restart failed)
```
-### Optional Container Labels
+### 可选容器标签
+
```
autoheal.stop.timeout=20 # Per containers override for stop timeout seconds during restart
```
-## Testing
+## 测试
+
```bash
docker build -t autoheal .
diff --git a/apps/autoheal/README_en.md b/apps/autoheal/README_en.md
new file mode 100644
index 000000000..33cd3ee28
--- /dev/null
+++ b/apps/autoheal/README_en.md
@@ -0,0 +1,79 @@
+# Docker Autoheal
+
+Monitor and restart unhealthy docker containers.
+This functionality was proposed to be included with the addition of `HEALTHCHECK`, however didn't make the cut.
+This container is a stand-in till there is native support for `--exit-on-unhealthy` https://github.com/docker/docker/pull/22719.
+
+## Supported tags and Dockerfile links
+- [`latest` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/main/Dockerfile) - Built daily
+- [`1.1.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/1.1.0/Dockerfile)
+- [`v0.7.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/v0.7.0/Dockerfile)
+
+ [](http://microbadger.com/images/willfarrell/autoheal "Docker layer breakdown")
+
+## How to use
+### UNIX socket passthrough
+```bash
+docker run -d \
+ --name autoheal \
+ --restart=always \
+ -e AUTOHEAL_CONTAINER_LABEL=all \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ willfarrell/autoheal
+```
+### TCP socket
+```bash
+docker run -d \
+ --name autoheal \
+ --restart=always \
+ -e AUTOHEAL_CONTAINER_LABEL=all \
+ -e DOCKER_SOCK=tcp://HOST:PORT \
+ -v /path/to/certs/:/certs/:ro \
+ willfarrell/autoheal
+```
+a) Apply the label `autoheal=true` to your container to have it watched.
+
+b) Set ENV `AUTOHEAL_CONTAINER_LABEL=all` to watch all running containers.
+
+c) Set ENV `AUTOHEAL_CONTAINER_LABEL` to existing label name that has the value `true`.
+
+Note: You must apply `HEALTHCHECK` to your docker images first. See https://docs.docker.com/engine/reference/builder/#healthcheck for details.
+See https://docs.docker.com/engine/security/https/ for how to configure TCP with mTLS
+
+The certificates, and keys need these names:
+* ca.pem
+* client-cert.pem
+* client-key.pem
+
+### Change Timezone
+If you need the timezone to match the local machine, you can map the `/etc/localtime` into the container.
+```
+docker run ... -v /etc/localtime:/etc/localtime:ro
+```
+
+
+## ENV Defaults
+```
+AUTOHEAL_CONTAINER_LABEL=autoheal
+AUTOHEAL_INTERVAL=5 # check every 5 seconds
+AUTOHEAL_START_PERIOD=0 # wait 0 seconds before first health check
+AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 # Docker waits max 10 seconds (the Docker default) for a container to stop before killing during restarts (container overridable via label, see below)
+DOCKER_SOCK=/var/run/docker.sock # Unix socket for curl requests to Docker API
+CURL_TIMEOUT=30 # --max-time seconds for curl requests to Docker API
+WEBHOOK_URL="" # post message to the webhook if a container was restarted (or restart failed)
+```
+
+### Optional Container Labels
+```
+autoheal.stop.timeout=20 # Per containers override for stop timeout seconds during restart
+```
+
+## Testing
+```bash
+docker build -t autoheal .
+
+docker run -d \
+ -e AUTOHEAL_CONTAINER_LABEL=all \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ autoheal
+```
\ No newline at end of file
diff --git a/apps/baota/9.0_lts_lnmp/data.yml b/apps/baota/10.0_lts/data.yml
similarity index 100%
rename from apps/baota/9.0_lts_lnmp/data.yml
rename to apps/baota/10.0_lts/data.yml
diff --git a/apps/baota/9.0_lts_lnmp/docker-compose.yml b/apps/baota/10.0_lts/docker-compose.yml
similarity index 95%
rename from apps/baota/9.0_lts_lnmp/docker-compose.yml
rename to apps/baota/10.0_lts/docker-compose.yml
index 884ce8d9f..1fe65a17f 100644
--- a/apps/baota/9.0_lts_lnmp/docker-compose.yml
+++ b/apps/baota/10.0_lts/docker-compose.yml
@@ -4,7 +4,7 @@ networks:
services:
baota:
- image: btpanel/baota:9.0_lts_lnmp
+ image: btpanel/baota:10.0_lts
container_name: ${CONTAINER_NAME}
labels:
createdBy: "Apps"
diff --git a/apps/auto-lady/1.11.8/envs/default.env b/apps/baota/10.0_lts/envs/default.env
similarity index 100%
rename from apps/auto-lady/1.11.8/envs/default.env
rename to apps/baota/10.0_lts/envs/default.env
diff --git a/apps/auto-lady/1.11.8/envs/global.env b/apps/baota/10.0_lts/envs/global.env
similarity index 100%
rename from apps/auto-lady/1.11.8/envs/global.env
rename to apps/baota/10.0_lts/envs/global.env
diff --git a/apps/baota/9.0_lts_lnmp/scripts/init.sh b/apps/baota/10.0_lts/scripts/init.sh
similarity index 100%
rename from apps/baota/9.0_lts_lnmp/scripts/init.sh
rename to apps/baota/10.0_lts/scripts/init.sh
diff --git a/apps/baota/9.0_lts_lnmp/scripts/uninstall.sh b/apps/baota/10.0_lts/scripts/uninstall.sh
similarity index 100%
rename from apps/baota/9.0_lts_lnmp/scripts/uninstall.sh
rename to apps/baota/10.0_lts/scripts/uninstall.sh
diff --git a/apps/baota/9.0_lts_lnmp/scripts/upgrade.sh b/apps/baota/10.0_lts/scripts/upgrade.sh
similarity index 100%
rename from apps/baota/9.0_lts_lnmp/scripts/upgrade.sh
rename to apps/baota/10.0_lts/scripts/upgrade.sh
diff --git a/apps/bytebase/README.md b/apps/bytebase/README.md
index 1fc46987b..7d41c2729 100644
--- a/apps/bytebase/README.md
+++ b/apps/bytebase/README.md
@@ -1,152 +1,86 @@
-
- Want to formalize the database change process but don't know how?
-
+🔮
-| | |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
-| Standard Operating Procedure (SOP) Standardize the database schema and data change process across different database systems, small or [large tables](https://www.bytebase.com/docs/change-database/online-schema-migration-for-mysql) and [different tenants](https://www.bytebase.com/docs/change-database/batch-change/#change-databases-from-multiple-tenants).
SQL Review [100+ lint rules](https://www.bytebase.com/docs/sql-review/review-rules) to detect SQL anti-patterns and enforce consistent SQL style in the organization.
GitOps [Point-and-click GitHub and GitLab integration](https://www.bytebase.com/docs/vcs-integration/overview) to enable GitOps workflow for changing database. | |
+# 查询
-
+想控制数据访问却不知如何操作?
-
🔮
-
Query
-
- Want to control the data access but don't know how?
-
**数据访问控制** 组织层面政策以集中[数据访问控制 ](https://www.bytebase.com/docs/security/data-access-control)。 | |
-| | |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
-| All-in-one SQL Editor Web-based IDE specifically for performing SQL specific tasks.
Data Masking State-of-the-art [column level masking](https://www.bytebase.com/docs/sql-editor/mask-data) engine to cover complex situations like subquery, CTE.
Data Access Control Organization level policy to centralize the [data access control](https://www.bytebase.com/docs/security/data-access-control). | |
+🔒
-
+# 安全
-
🔒
-
Secure
-
- Want to avoid data leakage, change outage and detect malicious behavior but don't know how?
-
+想要避免数据泄露、服务中断并检测恶意行为却不知如何操作?
-| | |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
-| Centralize Change, Query and Admin Tasks A single place to perform different tasks on different databases, thus enforce policy and monitor activity accordingly.
RBAC [Two-level RBAC model](https://www.bytebase.com/docs/concepts/roles-and-permissions) mapping to the organization wide privileges and application team privileges respectively.
Anomaly Center and Audit Logging Capture all database [anomalies](https://www.bytebase.com/docs/administration/anomaly-center), user actions and system events and present them in a holistic view. | |
+| | |
+| --- | --- |
+| **集中变更、查询和管理任务** 在一个地方执行不同数据库上的不同任务,从而执行策略并相应地监控活动。
- Want to enforce organization policy but don't know how?
-
+# 治理
-| | |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
-| Manage Database Resources A single place to manage environments, database instances, database users for application development, with optional [Terraform integration](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs).
Policy Enforcement Enforce organization wide SQL Review policy, backup policy and data access policy.
SQL Editor Admin mode [CLI like experience](https://www.bytebase.com/docs/sql-editor/admin-mode) without setting up bastion. | |
+想强制执行组织策略但不知道怎么做?
-
+| | |
+| --- | --- |
+| **管理数据库资源** 一个地方管理环境、数据库实例、数据库用户以进行应用开发,可选的 [Terraform 集成 ](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs)。
**策略执行** 强制执行组织范围内的 SQL 审查策略、备份策略和数据访问策略。
**SQL 编辑器管理员模式** [类似 CLI 的体验 ](https://www.bytebase.com/docs/sql-editor/admin-mode),无需设置堡垒机。 | |
-# 🖖 Intro
+# 🪄 引言
-Bytebase is a Database CI/CD solution for the Developers and DBAs. It's the **only database CI/CD project** included by the [CNCF Landscape](https://landscape.cncf.io/?selected=bytebase). The Bytebase family consists of these tools:
+Bytebase 是一个面向开发人员和数据库管理员的数据库持续集成/持续部署解决方案。它是 **唯一被 CNCF 景观收录的数据库 CI/CD 项目** 。Bytebase 家族包括以下这些工具:
-- [Bytebase Console](https://bytebase.com/?source=github): A web-based GUI for developers and DBAs to manage the database development lifecycle.
-- [Bytebase CLI (bb)](https://www.bytebase.com/docs/cli/overview): The CLI to help developers integrate database changes into the existing CI/CD workflow.
-- [Bytebase GitHub App](https://github.com/marketplace/bytebase) and [SQL Review GitHub Action](https://github.com/marketplace/actions/sql-review): The GitHub App and GitHub Action to detect SQL anti-patterns and enforce a consistent SQL style guide during Pull Request.
-- [Terraform Bytebase Provider](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs): The Terraform
- provider enables team to manage Bytebase resources via Terraform. A typical setup involves teams using
- Terraform to provision database instances from Cloud vendors, followed by using Bytebase provider to
- prepare those instances ready for application use.
+* [Bytebase 控制台](https://bytebase.com/?source=github) : 一个基于 Web 的图形界面,供开发人员和数据库管理员管理数据库开发生命周期。
+* [Bytebase CLI (bb)](https://www.bytebase.com/docs/cli/overview): 一个命令行工具,帮助开发人员将数据库变更集成到现有的持续集成/持续部署流程中。
+* [Bytebase GitHub App](https://github.com/marketplace/bytebase) 和 [SQL Review GitHub Action](https://github.com/marketplace/actions/sql-review): 一个 GitHub 应用程序和 GitHub 动作,用于在 Pull Request 中检测 SQL 反模式并强制执行一致的 SQL 代码规范。
+* [Terraform Bytebase 提供程序](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs) : Terraform 提供程序使团队能够通过 Terraform 管理 Bytebase 资源。典型的设置是团队使用 Terraform 从云供应商处部署数据库实例,然后使用 Bytebase 提供程序将这些实例准备就绪以供应用程序使用。
-| | Topic |
-| --- | :------------------------------------------------------------------ |
-| 🏗️ | [Installation](#-installation) |
-| 🎮 | [Demo](#-demo) |
-| 👩🏫 | [Tutorials](#-tutorials) |
-| 💎 | [Design Principles](#-design-principles) |
-| 🧩 | [Data Model](#-data-model) |
-| 🎭 | [Roles](#-roles) |
-| 🕊 | [Developing and Contributing](#-developing-and-contributing) |
-| 🤺 | [Bytebase vs Alternatives](#-bytebase-vs-alternatives) |
+| | 主题 |
+| --- | --- |
+| 🏗️ | 安装 |
+| 🎮 | 演示 |
+| 👩🏫 | 教程 |
+| 💎 | 设计原则 |
+| 🧩 | 数据模型 |
+| 🎭 | 角色 |
+| 🕊 | 开发与贡献 |
+| 🤺 | Bytebase vs 替代方案 |
-
+# 🏗️ 安装
-# 🏗️ Installation
-
-### One liner
+### 一句话概括
```bash
# One-liner installation script from latest release
@@ -154,207 +88,167 @@ Bytebase is a Database CI/CD solution for the Developers and DBAs. It's the **on
```
-- [Build from source](https://www.bytebase.com/docs/get-started/install/build-from-source-code)
-- [Docker](https://www.bytebase.com/docs/get-started/install/deploy-with-docker)
-- [Kubernetes](https://www.bytebase.com/docs/get-started/install/deploy-to-kubernetes)
-- [render.com](https://www.bytebase.com/docs/get-started/install/deploy-to-render)
-- [Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
+* [从源代码构建](https://www.bytebase.com/docs/get-started/install/build-from-source-code)
+* [Docker](https://www.bytebase.com/docs/get-started/install/deploy-with-docker)
+* [Kubernetes](https://www.bytebase.com/docs/get-started/install/deploy-to-kubernetes)
+* [render.com](https://www.bytebase.com/docs/get-started/install/deploy-to-render)
+* [Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
-
+# 🎮 示例
-# 🎮 Demo
+Live demo at [https://demo.bytebase.com](https://demo.bytebase.com)
-Live demo at https://demo.bytebase.com
+您还可以与我们的产品专家预约一个 30 分钟的产品导览。 [预约链接](https://cal.com/adela-bytebase/30min)
-You can also [book a 30min product walkthrough](https://cal.com/adela-bytebase/30min) with one of
-our product experts.
+# 👩🏫 教程
-
+产品教程可在 [https://www.bytebase.com/tutorial](https://www.bytebase.com/tutorial) 获取。
-# 👩🏫 Tutorials
+## 集成
-Product tutorials are available at https://www.bytebase.com/tutorial.
+* [管理 Supabase PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/supabase)
+* [管理渲染 PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/render)
+* [管理 Neon 数据库](https://www.bytebase.com/docs/how-to/integrations/neon)
+* [部署到 sealos](https://www.bytebase.com/docs/get-started/install/deploy-to-sealos)
+* [部署到 Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
-## Integrations
+# 💎 设计原则
-- [Manage Supabase PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/supabase)
-- [Manage render PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/render)
-- [Manage Neon database](https://www.bytebase.com/docs/how-to/integrations/neon)
-- [Deploy to sealos](https://www.bytebase.com/docs/get-started/install/deploy-to-sealos)
-- [Deploy to Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
+| | | |
+| --- | --- | --- |
+| 🪶 | 无依赖 | 只需一条命令 ./bytebase 即可开始,无需任何外部依赖。外部的 PostgreSQL 数据存储和其他项均为可选。 |
+| 🔗 | 优先集成 | 专注于数据库管理,其余部分留给其他工具。我们原生集成了 GitHub/GitLab、Terraform 提供程序 、webhook 等版本控制系统集成。 |
+| 👩🦳 | 工程严谨 | 严谨的双周发布和工程实践。 |
-
+# 🧩 数据模型
-# 💎 Design Principles
+更多详情参见 [数据模型文档](https://www.bytebase.com/docs/concepts/data-model) 。
-| | | |
-| --- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| 🪶 | Dependency Free | Start with a single command `./bytebase` without any external dependency. External PostgreSQL data store and others are optional. |
-| 🔗 | Integration First | Solely focus on database management and leave the rest to others. We have native VCS integration with [GitHub/GitLab](https://www.bytebase.com/docs/vcs-integration/overview), [Terraform Provider](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs), [webhook](https://www.bytebase.com/docs/change-database/webhook), and etc. |
-| 💂♀️ | Engineering Disciplined | Disciplined [bi-weekly release](https://www.bytebase.com/changelog) and [engineering practice](https://github.com/bytebase/bytebase/blob/main/docs/life-of-a-feature.md). |
+
-
+# 🎭 角色
-# 🧩 Data Model
+更多详情请参阅[角色和权限文档](https://www.bytebase.com/docs/concepts/roles-and-permissions) 。
-More details in [Data Model Doc](https://www.bytebase.com/docs/concepts/data-model).
+Bytebase 使用基于角色的访问控制(RBAC),并在工作空间和项目级别提供了两种角色集:
-
-
-
+* 工作空间角色:`Owner`、`DBA`、`Developer`。工作空间角色映射到工程组织中的角色。
+* 项目角色:`Owner`、`Developer`。项目级别角色映射到特定团队或项目的角色。
-
+每个用户都会被分配一个工作空间角色,如果某个用户参与了某个特定项目,那么她也会相应地被分配一个项目角色。
-# 🎭 Roles
+下图描述了典型的技术团队与 Bytebase 工作空间中相应角色之间的映射关系。
-More details in [Roles and Permissions Doc](https://www.bytebase.com/docs/concepts/roles-and-permissions).
+
-Bytebase employs RBAC (Role-Based-Access-Control) and provides two role sets at the workspace and project level:
+# 🕊 开发与贡献
-- Workspace roles: `Owner`, `DBA`, `Developer`. The workspace role maps to the role in an engineering organization.
-- Project roles: `Owner`, `Developer`. The project level role maps to the role in a specific team or project.
+
-Every user is assigned a workspace role, and if a particular user is involved in a particular project, then she will also be assigned a project role accordingly.
+* Bytebase 使用了精心挑选的技术栈,它针对开发者的体验进行了优化,并且非常容易开始编写代码:
+
+ 1. 它没有外部依赖。
+ 2. 无需任何配置。
+ 3. 启动后端和前端各一个命令,都支持实时重载。
+
+ * [模式变更的生命周期](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/life-of-a-schema-change.snb.md)
+ * [SQL 审查](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/sql-review-source-code-tour.snb.md)
+* 查看 [功能生命周期](https://github.com/bytebase/bytebase/blob/main/docs/life-of-a-feature.md) 。
+
-Below diagram describes a typical mapping between an engineering org and the corresponding roles in the Bytebase workspace
+## 开发环境设置
-
+1. 拉取源代码。
+
+ ```bash
+ git clone https://github.com/bytebase/bytebase
+ ```
+
+2. 在本地主机上创建外部 Postgres 数据库。
+
-- Bytebase is built with a curated tech stack. It is optimized for **developer experience** and is very easy to start
- working on the code:
+```sql
+CREATE USER bbdev SUPERUSER;
+CREATE DATABASE bbdev;
+```
- 1. It has no external dependency.
- 1. It requires zero config.
- 1. 1 command to start backend and 1 command to start frontend, both with live reload support.
+1. 使用 air 启动后端(带有实时重载)。
+
+ ```bash
+ PG_URL=postgresql://bbdev@localhost/bbdev air -c scripts/.air.toml
+ ```
+
+ 如果遇到“错误:打开的文件太多”的问题,请更改打开文件限制。
+
+ ```bash
+ ulimit -n 10240
+ ```
+
+ 如果需要额外的运行时参数(如 --backup-bucket),请像这样添加它们:
+
+ ```bash
+ air -c scripts/.air.toml -- --backup-region us-east-1 --backup-bucket s3:\\/\\/example-bucket --backup-credential ~/.aws/credentials
+ ```
+
+2. 启动前端(带有实时重载)。
+
+ ```bash
+ cd frontend && pnpm i && pnpm dev
+ ```
+
+ Bytebase 现在应该在 [http://localhost:3000](http://localhost:3000) 运行,并且修改前端或后端代码会触发实时重载。
+
-- Interactive code walkthrough
+### 提示
- - [Life of a schema change](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/life-of-a-schema-change.snb.md)
- - [SQL Review](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/sql-review-source-code-tour.snb.md)
-
-- Follow [Life of a Feature](https://github.com/bytebase/bytebase/blob/main/docs/life-of-a-feature.md).
-
-## Dev Environment Setup
-
-### Prerequisites
-
-- [Go](https://golang.org/doc/install) (1.21.3 or later)
-- [pnpm](https://pnpm.io/installation)
-- [Air](https://github.com/bytebase/air) (**our forked repo @87187cc with the proper signal handling**). This is for backend live reload.
- ```bash
- go install github.com/bytebase/air@87187cc
- ```
-
-### Steps
-
-1. Pull source.
-
- ```bash
- git clone https://github.com/bytebase/bytebase
- ```
-
-1. Create an external Postgres database on localhost.
-
- ```sql
- CREATE USER bbdev SUPERUSER;
- CREATE DATABASE bbdev;
- ```
-
-1. Start backend using air (with live reload).
-
- ```bash
- PG_URL=postgresql://bbdev@localhost/bbdev air -c scripts/.air.toml
- ```
-
- Change the open file limit if you encounter "error: too many open files".
-
- ```bash
- ulimit -n 10240
- ```
-
- If you need additional runtime parameters such as --backup-bucket, please add them like this:
-
- ```bash
- air -c scripts/.air.toml -- --backup-region us-east-1 --backup-bucket s3:\\/\\/example-bucket --backup-credential ~/.aws/credentials
- ```
-
-1. Start frontend (with live reload).
-
- ```bash
- cd frontend && pnpm i && pnpm dev
- ```
-
- Bytebase should now be running at http://localhost:3000 and change either frontend or backend code would trigger live reload.
-
-### Tips
-
-* Use [Code Inspector](https://en.inspector.fe-dev.cn/guide/start.html#method1-recommend) to locate
-frontend code from UI. Hold `Option + Shift` on Mac or `Alt + Shift` on Windows
-
-
-
+* 使用 [Code Inspector](https://en.inspector.fe-dev.cn/guide/start.html#method1-recommend) 从界面定位前端代码。在 Mac 上按 `Option + Shift`,在 Windows 上按 `Alt + Shift`。
# Bytebase vs Flyway, Liquibase
-- [Bytebase vs Liquibase](https://www.bytebase.com/blog/bytebase-vs-liquibase/)
-- [Bytebase vs Flyway](https://www.bytebase.com/blog/bytebase-vs-flyway/)
+* [Bytebase vs Liquibase](https://www.bytebase.com/blog/bytebase-vs-liquibase/)
+* [Bytebase vs Flyway](https://www.bytebase.com/blog/bytebase-vs-flyway/)
-Either Flyway or Liquibase is a library and CLI focusing on schema change. While Bytebase is an one-stop
-solution covering the entire database development lifecycle for Developers and DBAs to collaborate.
+无论是 Liquibase 还是 Flyway 都是专注于数据库模式变更的库和命令行界面(CLI)。而 Bytebase 则是一个一站式解决方案,涵盖了整个数据库开发生命周期,支持开发人员和数据库管理员(DBA)协作。
-Another key difference is Bytebase **doesn't** support Oracle and SQL Server. This is a conscious
-decision we make so that we can focus on supporting other databases without good tooling support.
-In particular, many of our users tell us Bytebase is by far the best (and sometimes the only) database
-tool that can support their PostgreSQL and ClickHouse use cases.
+另一个关键区别是,Bytebase **不**支持 Oracle 和 SQL Server。这是我们有意做出的决定,以便我们可以专注于支持其他工具支持不足的数据库。特别是,许多我们的用户告诉我们,Bytebase 无疑是(有时是唯一的选择)支持他们 PostgreSQL 和 ClickHouse 用例的最佳数据库工具。
[](https://star-history.com/#bytebase/bytebase&liquibase/liquibase&flyway/flyway&Date)
# Bytebase vs Yearning, Archery
-Either Yearning or Archery provides a DBA operation portal. While Bytebase provides a collaboration
-workspace for DBAs and Developers, and brings DevOps practice to the Database Change Management (DCM).
-Bytebase has the similar `Project` concept seen in GitLab/GitHub and provides native GitOps integration
-with GitLab/GitHub.
+Either Yearning 或 Archery 提供了 DBA 操作门户。而 Bytebase 为 DBA 和开发者提供了一个协作工作空间,并将 DevOps 实践引入了数据库变更管理(DCM)。Bytebase 具有与 GitLab/GitHub 中的 `Project` 类似的概念,并提供了与 GitLab/GitHub 的原生 GitOps 集成。
-Another key difference is Yearning, Archery are open source projects maintained by the individuals part-time. While Bytebase is open-sourced, it adopts an open-core model and is a commercialized product, supported
-by a [fully staffed team](https://www.bytebase.com/about#team) [releasing new version every 2 weeks](https://www.bytebase.com/changelog).
+另一个关键区别在于,Yearning 和 Archery 是由个人业余时间维护的开源项目。而 Bytebase 是开源的,但它采用了开放核心模型,并且是一个商业产品,由一个 全职团队 支持,并且每两周发布一次新版本。
[](https://star-history.com/#bytebase/bytebase&cookieY/Yearning&hhyo/Archery&Date)
-# 👨👩👧👦 Community
+# FAMILY Community
[](https://discord.gg/huyw7gRsyA)
[](https://twitter.com/Bytebase)
-
+# 🤔 常见问题解答 (FAQs)
-# 🤔 Frequently Asked Questions (FAQs)
+请查阅我们的 常见问题 。
+
+# 🙋 联系我们
+
+* 如果您有兴趣加入我们,请查阅我们的 职位页面 查看是否有适合您的职位。
+* 想要解决你的模式变更和数据库管理难题?预约与我们的产品专家进行一次 [30 分钟的演示](https://cal.com/adela-bytebase/30min) 。Qs)
Check out our [FAQ](https://www.bytebase.com/docs/faq).
diff --git a/apps/bytebase/README_en.md b/apps/bytebase/README_en.md
new file mode 100644
index 000000000..538081d6e
--- /dev/null
+++ b/apps/bytebase/README_en.md
@@ -0,0 +1,366 @@
+
+ Want to formalize the database change process but don't know how?
+
+
+| | |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
+| Standard Operating Procedure (SOP) Standardize the database schema and data change process across different database systems, small or [large tables](https://www.bytebase.com/docs/change-database/online-schema-migration-for-mysql) and [different tenants](https://www.bytebase.com/docs/change-database/batch-change/#change-databases-from-multiple-tenants).
SQL Review [100+ lint rules](https://www.bytebase.com/docs/sql-review/review-rules) to detect SQL anti-patterns and enforce consistent SQL style in the organization.
GitOps [Point-and-click GitHub and GitLab integration](https://www.bytebase.com/docs/vcs-integration/overview) to enable GitOps workflow for changing database. | |
+
+
+
+
🔮
+
Query
+
+ Want to control the data access but don't know how?
+
+
+| | |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| All-in-one SQL Editor Web-based IDE specifically for performing SQL specific tasks.
Data Masking State-of-the-art [column level masking](https://www.bytebase.com/docs/sql-editor/mask-data) engine to cover complex situations like subquery, CTE.
Data Access Control Organization level policy to centralize the [data access control](https://www.bytebase.com/docs/security/data-access-control). | |
+
+
+
+
🔒
+
Secure
+
+ Want to avoid data leakage, change outage and detect malicious behavior but don't know how?
+
+
+| | |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| Centralize Change, Query and Admin Tasks A single place to perform different tasks on different databases, thus enforce policy and monitor activity accordingly.
RBAC [Two-level RBAC model](https://www.bytebase.com/docs/concepts/roles-and-permissions) mapping to the organization wide privileges and application team privileges respectively.
Anomaly Center and Audit Logging Capture all database [anomalies](https://www.bytebase.com/docs/administration/anomaly-center), user actions and system events and present them in a holistic view. | |
+
+
+
+
👩💼
+
Govern
+
+ Want to enforce organization policy but don't know how?
+
+
+| | |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
+| Manage Database Resources A single place to manage environments, database instances, database users for application development, with optional [Terraform integration](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs).
Policy Enforcement Enforce organization wide SQL Review policy, backup policy and data access policy.
SQL Editor Admin mode [CLI like experience](https://www.bytebase.com/docs/sql-editor/admin-mode) without setting up bastion. | |
+
+
+
+# 🖖 Intro
+
+Bytebase is a Database CI/CD solution for the Developers and DBAs. It's the **only database CI/CD project** included by the [CNCF Landscape](https://landscape.cncf.io/?selected=bytebase). The Bytebase family consists of these tools:
+
+- [Bytebase Console](https://bytebase.com/?source=github): A web-based GUI for developers and DBAs to manage the database development lifecycle.
+- [Bytebase CLI (bb)](https://www.bytebase.com/docs/cli/overview): The CLI to help developers integrate database changes into the existing CI/CD workflow.
+- [Bytebase GitHub App](https://github.com/marketplace/bytebase) and [SQL Review GitHub Action](https://github.com/marketplace/actions/sql-review): The GitHub App and GitHub Action to detect SQL anti-patterns and enforce a consistent SQL style guide during Pull Request.
+- [Terraform Bytebase Provider](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs): The Terraform
+ provider enables team to manage Bytebase resources via Terraform. A typical setup involves teams using
+ Terraform to provision database instances from Cloud vendors, followed by using Bytebase provider to
+ prepare those instances ready for application use.
+
+| | Topic |
+| --- | :------------------------------------------------------------------ |
+| 🏗️ | [Installation](#-installation) |
+| 🎮 | [Demo](#-demo) |
+| 👩🏫 | [Tutorials](#-tutorials) |
+| 💎 | [Design Principles](#-design-principles) |
+| 🧩 | [Data Model](#-data-model) |
+| 🎭 | [Roles](#-roles) |
+| 🕊 | [Developing and Contributing](#-developing-and-contributing) |
+| 🤺 | [Bytebase vs Alternatives](#-bytebase-vs-alternatives) |
+
+
+
+# 🏗️ Installation
+
+### One liner
+
+```bash
+# One-liner installation script from latest release
+/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/bytebase/install/main/install.sh)"
+
+```
+
+- [Build from source](https://www.bytebase.com/docs/get-started/install/build-from-source-code)
+- [Docker](https://www.bytebase.com/docs/get-started/install/deploy-with-docker)
+- [Kubernetes](https://www.bytebase.com/docs/get-started/install/deploy-to-kubernetes)
+- [render.com](https://www.bytebase.com/docs/get-started/install/deploy-to-render)
+- [Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
+
+
+
+# 🎮 Demo
+
+Live demo at https://demo.bytebase.com
+
+You can also [book a 30min product walkthrough](https://cal.com/adela-bytebase/30min) with one of
+our product experts.
+
+
+
+# 👩🏫 Tutorials
+
+Product tutorials are available at https://www.bytebase.com/tutorial.
+
+## Integrations
+
+- [Manage Supabase PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/supabase)
+- [Manage render PostgreSQL](https://www.bytebase.com/docs/how-to/integrations/render)
+- [Manage Neon database](https://www.bytebase.com/docs/how-to/integrations/neon)
+- [Deploy to sealos](https://www.bytebase.com/docs/get-started/install/deploy-to-sealos)
+- [Deploy to Rainbond](https://www.bytebase.com/docs/get-started/install/deploy-to-rainbond)
+
+
+
+# 💎 Design Principles
+
+| | | |
+| --- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| 🪶 | Dependency Free | Start with a single command `./bytebase` without any external dependency. External PostgreSQL data store and others are optional. |
+| 🔗 | Integration First | Solely focus on database management and leave the rest to others. We have native VCS integration with [GitHub/GitLab](https://www.bytebase.com/docs/vcs-integration/overview), [Terraform Provider](https://registry.terraform.io/providers/bytebase/bytebase/latest/docs), [webhook](https://www.bytebase.com/docs/change-database/webhook), and etc. |
+| 💂♀️ | Engineering Disciplined | Disciplined [bi-weekly release](https://www.bytebase.com/changelog) and [engineering practice](https://github.com/bytebase/bytebase/blob/main/docs/life-of-a-feature.md). |
+
+
+
+# 🧩 Data Model
+
+More details in [Data Model Doc](https://www.bytebase.com/docs/concepts/data-model).
+
+
+
+
+
+
+
+# 🎭 Roles
+
+More details in [Roles and Permissions Doc](https://www.bytebase.com/docs/concepts/roles-and-permissions).
+
+Bytebase employs RBAC (Role-Based-Access-Control) and provides two role sets at the workspace and project level:
+
+- Workspace roles: `Owner`, `DBA`, `Developer`. The workspace role maps to the role in an engineering organization.
+- Project roles: `Owner`, `Developer`. The project level role maps to the role in a specific team or project.
+
+Every user is assigned a workspace role, and if a particular user is involved in a particular project, then she will also be assigned a project role accordingly.
+
+Below diagram describes a typical mapping between an engineering org and the corresponding roles in the Bytebase workspace
+
+
+
+
+
+
+
+# 🕊 Developing and Contributing
+
+
+
+
+
+- Bytebase is built with a curated tech stack. It is optimized for **developer experience** and is very easy to start
+ working on the code:
+
+ 1. It has no external dependency.
+ 1. It requires zero config.
+ 1. 1 command to start backend and 1 command to start frontend, both with live reload support.
+
+- Interactive code walkthrough
+
+ - [Life of a schema change](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/life-of-a-schema-change.snb.md)
+ - [SQL Review](https://sourcegraph.com/github.com/bytebase/bytebase/-/blob/docs/design/sql-review-source-code-tour.snb.md)
+
+- Follow [Life of a Feature](https://github.com/bytebase/bytebase/blob/main/docs/life-of-a-feature.md).
+
+## Dev Environment Setup
+
+### Prerequisites
+
+- [Go](https://golang.org/doc/install) (1.21.3 or later)
+- [pnpm](https://pnpm.io/installation)
+- [Air](https://github.com/bytebase/air) (**our forked repo @87187cc with the proper signal handling**). This is for backend live reload.
+ ```bash
+ go install github.com/bytebase/air@87187cc
+ ```
+
+### Steps
+
+1. Pull source.
+
+ ```bash
+ git clone https://github.com/bytebase/bytebase
+ ```
+
+1. Create an external Postgres database on localhost.
+
+ ```sql
+ CREATE USER bbdev SUPERUSER;
+ CREATE DATABASE bbdev;
+ ```
+
+1. Start backend using air (with live reload).
+
+ ```bash
+ PG_URL=postgresql://bbdev@localhost/bbdev air -c scripts/.air.toml
+ ```
+
+ Change the open file limit if you encounter "error: too many open files".
+
+ ```bash
+ ulimit -n 10240
+ ```
+
+ If you need additional runtime parameters such as --backup-bucket, please add them like this:
+
+ ```bash
+ air -c scripts/.air.toml -- --backup-region us-east-1 --backup-bucket s3:\\/\\/example-bucket --backup-credential ~/.aws/credentials
+ ```
+
+1. Start frontend (with live reload).
+
+ ```bash
+ cd frontend && pnpm i && pnpm dev
+ ```
+
+ Bytebase should now be running at http://localhost:3000 and change either frontend or backend code would trigger live reload.
+
+### Tips
+
+* Use [Code Inspector](https://en.inspector.fe-dev.cn/guide/start.html#method1-recommend) to locate
+frontend code from UI. Hold `Option + Shift` on Mac or `Alt + Shift` on Windows
+
+
+
+
+# Bytebase vs Flyway, Liquibase
+
+- [Bytebase vs Liquibase](https://www.bytebase.com/blog/bytebase-vs-liquibase/)
+- [Bytebase vs Flyway](https://www.bytebase.com/blog/bytebase-vs-flyway/)
+
+Either Flyway or Liquibase is a library and CLI focusing on schema change. While Bytebase is an one-stop
+solution covering the entire database development lifecycle for Developers and DBAs to collaborate.
+
+Another key difference is Bytebase **doesn't** support Oracle and SQL Server. This is a conscious
+decision we make so that we can focus on supporting other databases without good tooling support.
+In particular, many of our users tell us Bytebase is by far the best (and sometimes the only) database
+tool that can support their PostgreSQL and ClickHouse use cases.
+
+[](https://star-history.com/#bytebase/bytebase&liquibase/liquibase&flyway/flyway&Date)
+
+# Bytebase vs Yearning, Archery
+
+Either Yearning or Archery provides a DBA operation portal. While Bytebase provides a collaboration
+workspace for DBAs and Developers, and brings DevOps practice to the Database Change Management (DCM).
+Bytebase has the similar `Project` concept seen in GitLab/GitHub and provides native GitOps integration
+with GitLab/GitHub.
+
+Another key difference is Yearning, Archery are open source projects maintained by the individuals part-time. While Bytebase is open-sourced, it adopts an open-core model and is a commercialized product, supported
+by a [fully staffed team](https://www.bytebase.com/about#team) [releasing new version every 2 weeks](https://www.bytebase.com/changelog).
+
+[](https://star-history.com/#bytebase/bytebase&cookieY/Yearning&hhyo/Archery&Date)
+
+# 👨👩👧👦 Community
+
+[](https://discord.gg/huyw7gRsyA)
+
+[](https://twitter.com/Bytebase)
+
+
+
+# 🤔 Frequently Asked Questions (FAQs)
+
+Check out our [FAQ](https://www.bytebase.com/docs/faq).
+
+
+
+# 🙋 Contact Us
+
+- Interested in joining us? Check out our [jobs page](https://bytebase.com/jobs?source=github) for openings.
+- Want to solve your schema change and database management headache? Book a [30min demo](https://cal.com/adela-bytebase/30min) with one of our product experts.
diff --git a/apps/changedetectionio/README.md b/apps/changedetectionio/README.md
index ea93e7424..22c4bc528 100644
--- a/apps/changedetectionio/README.md
+++ b/apps/changedetectionio/README.md
@@ -1,131 +1,128 @@
-## Web Site Change Detection, Restock monitoring and notifications.
+## 网站变更检测,库存监控及通知。
-**_Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more._**
+***检测网站内容变化并执行有意义的操作——通过 Discord、邮件、Slack、Telegram、API 调用等多种方式触发通知。***
-_Live your data-life pro-actively._
+*主动管理您的数据生活。*
+[](https://changedetection.io?src=github)
-[](https://changedetection.io?src=github)
-
-[![Release Version][release-shield]][release-link] [![Docker Pulls][docker-pulls]][docker-link] [![License][license-shield]](https://github.com/dgtlmoon/changedetection.io/blob/master/LICENSE.md)
+[](https://github.com/dgtlmoon/changedetection.io/releases) [](https://hub.docker.com/r/dgtlmoon/changedetection.io) [](https://github.com/dgtlmoon/changedetection.io/blob/master/LICENSE.md)

-[**Don't have time? Let us host it for you! try our $8.99/month subscription - use our proxies and support!**](https://changedetection.io) , _half the price of other website change monitoring services!_
+[**没时间?让我们为您托管!试用我们的每月 8.99 美元订阅服务——使用我们的代理服务器并获得支持!**](https://changedetection.io), *价格仅为其他网站变更监控服务的一半!*
-- Chrome browser included.
-- Super fast, no registration needed setup.
-- Get started watching and receiving website change notifications straight away.
+* 包含 Chrome 浏览器。
+* 无需注册,快速设置。
+* 立即开始观看并接收网站更改通知。
+### 使用视觉选择工具针对网页的特定部分进行操作。
-### Target specific parts of the webpage using the Visual Selector tool.
+连接到 [playwright 内容获取器](https://github.com/dgtlmoon/changedetection.io/wiki/Playwright-content-fetcher)时可用(作为我们订阅服务的一部分提供)
-Available when connected to a playwright content fetcher (included as part of our subscription service)
+[](https://changedetection.io?src=github)
-[](https://changedetection.io?src=github)
+### 轻松查看更改内容,按词、行或个别字符进行检查。
-### Easily see what changed, examine by word, line, or individual character.
+[](https://changedetection.io?src=github)
-[](https://changedetection.io?src=github)
+### 执行交互式浏览器步骤
+填写文本框、点击按钮等,设置您的更改检测场景。
-### Perform interactive browser steps
+使用**浏览器步骤**配置,在进行变更检测之前添加基本步骤,例如登录网站、将产品添加到购物车、接受 Cookie 登录、输入日期并精炼搜索。
-Fill in text boxes, click buttons and more, setup your changedetection scenario.
+[](https://changedetection.io?src=github)
-Using the **Browser Steps** configuration, add basic steps before performing change detection, such as logging into websites, adding a product to a cart, accept cookie logins, entering dates and refining searches.
+运行完**浏览器步骤**后,然后访问**视觉选择器**标签以精炼您感兴趣的内容。需要启用 Playwright。
-[](https://changedetection.io?src=github)
+### 示例使用场景
-After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
-Requires Playwright to be enabled.
+* 产品和服务的价格发生变化
+* *缺货通知*和*库存恢复通知*
+* 监控和跟踪 PDF 文件的变化,了解 PDF 文件何时进行了文本修改。
+* 政府部门更新(更改通常仅在其网站上)
+* 新软件发布、安全公告(当你不在他们的邮件列表中时)
+* 有变动的节日
+* Discogs 补货提醒和监控
+* 房地产列表变动
+* 抢先知道你喜爱的威士忌打折,或是在别人之前获悉其他特别优惠
+* 政府网站上的新冠疫情相关新闻
+* 他们网站上的大学/组织新闻
+* 检测和监控 JSON API 响应的变化
+* JSON API 监控和告警
+* 法律及其他文档中的变更
+* 通过通知触发 API 调用,当网站上出现特定文本时
+* 使用 JSON 过滤器和 JSON 通知将 API 粘合在一起
+* 根据网页内容的变更创建 RSS 订阅源
+* 监控 HTML 源代码以防止意外更改,加强你的 PCI 合规性
+* 你有一份非常敏感的 URL 列表需要监控,你*不*想使用付费替代方案。(记住, *你*就是产品)
+* 当某些关键词出现在 Twitter 搜索结果中时收到通知
+* 主动搜索职位信息,当公司更新其招聘页面或在求职网站中出现关键词时收到通知
+* 当 Bamboo HR 和其他招聘平台上新职位开放时获取通知
+* 网站篡改监控
+* 宝可梦卡库存追踪器 / 宝可梦 TCG 追踪器
+*需要支持 JavaScript 的实际 Chrome 运行器吗?我们支持通过 WebDriver 和 Playwright 获取数据!*
-### Example use cases
+#### 主要功能
-- Products and services have a change in pricing
-- _Out of stock notification_ and _Back In stock notification_
-- Monitor and track PDF file changes, know when a PDF file has text changes.
-- Governmental department updates (changes are often only on their websites)
-- New software releases, security advisories when you're not on their mailing list.
-- Festivals with changes
-- Discogs restock alerts and monitoring
-- Realestate listing changes
-- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else
-- COVID related news from government websites
-- University/organisation news from their website
-- Detect and monitor changes in JSON API responses
-- JSON API monitoring and alerting
-- Changes in legal and other documents
-- Trigger API calls via notifications when text appears on a website
-- Glue together APIs using the JSON filter and JSON notifications
-- Create RSS feeds based on changes in web content
-- Monitor HTML source code for unexpected changes, strengthen your PCI compliance
-- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product)
-- Get notified when certain keywords appear in Twitter search results
-- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords.
-- Get alerts when new job positions are open on Bamboo HR and other job platforms
-- Website defacement monitoring
-- Pokémon Card Restock Tracker / Pokémon TCG Tracker
+* 包含多种触发过滤器,如“文本触发”,“通过选择器移除文本”,“忽略文本”,“提取文本”,还支持正则表达式!
+* 使用 xPath 和 CSS 选择器定位目标元素,使用 JSONPath 或 jq 轻松监控复杂 JSON
+* 在快速非 JS 模式和基于 Chrome JS 的“fetchers”之间切换
+* 监控 PDF 文件中的更改(监控 PDF 中的文本更改,同时监控 PDF 文件大小和校验和)
+* 轻松指定检查站点的频率
+* 在提取文本前执行 JS(适用于登录操作,请参阅 UI 中的示例!)
+* 覆盖请求头,指定 `POST` 或 `GET` 及其他方法
+* 使用“视觉选择器”来帮助目标特定元素
+* 每项监控配置代理
+* 检测到网页更改时,随通知发送屏幕截图
-_Need an actual Chrome runner with Javascript support? We support fetching via WebDriver and Playwright!_
+我们推荐并使用 Bright Data 全球代理服务,通过我们的注册链接,Bright Data 将为您提供最高 100 美元的首次存款匹配。
-#### Key Features
+请给这个项目点个星标🌟,帮助它成长!\[https://github.com/dgtlmoon/changedetection.io/\](https://github.com/dgtlmoon/changedetection.io/)
-- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions!
-- Target elements with xPath and CSS Selectors, Easily monitor complex JSON with JSONPath or jq
-- Switch between fast non-JS and Chrome JS based "fetchers"
-- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums)
-- Easily specify how often a site should be checked
-- Execute JS before extracting text (Good for logging in, see examples in the UI!)
-- Override Request Headers, Specify `POST` or `GET` and other methods
-- Use the "Visual Selector" to help target specific elements
-- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration)
-- Send a screenshot with the notification when a change is detected in the web page
-
-We [recommend and use Bright Data](https://brightdata.grsm.io/n0r16zf7eivq) global proxy services, Bright Data will match any first deposit up to $100 using our signup link.
-
-Please :star: star :star: this project and help it grow! https://github.com/dgtlmoon/changedetection.io/
-
-## Installation
+## 安装
### Docker
-With Docker composer, just clone this repository and..
+使用 Docker Compose,只需克隆这个仓库并...
```bash
$ docker-compose up -d
```
-Docker standalone
+Docker 独立版本
+
```bash
$ docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
```
-`:latest` tag is our latest stable release, `:dev` tag is our bleeding edge `master` branch.
+\`:latest\` 标签是我们最新的稳定版本,\`:dev\` 标签是我们的尖端 \`master\` 分支。
-Alternative docker repository over at ghcr - [ghcr.io/dgtlmoon/changedetection.io](https://ghcr.io/dgtlmoon/changedetection.io)
+替代的 Docker 仓库位于 ghcr - [ghcr.io/dgtlmoon/changedetection.io](https://ghcr.io/dgtlmoon/changedetection.io)
### Windows
-See the install instructions at the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows
+请参阅 wiki 中的安装说明 [https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows](https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows)
### Python Pip
-Check out our pypi page https://pypi.org/project/changedetection.io/
+请访问我们的 PyPI 页面 [https://pypi.org/project/changedetection.io/](https://pypi.org/project/changedetection.io/)
```bash
$ pip3 install changedetection.io
$ changedetection.io -d /path/to/empty/data/dir -p 5000
```
-Then visit http://127.0.0.1:5000 , You should now be able to access the UI.
+然后访问 [http://127.0.0.1:5000](http://127.0.0.1:5000),您现在应该可以访问 UI 了。
-_Now with per-site configurable support for using a fast built in HTTP fetcher or use a Chrome based fetcher for monitoring of JavaScript websites!_
+*现在支持每个站点配置使用内置的快速 HTTP 获取器,或者使用基于 Chrome 的获取器来监控 JavaScript 网站!*
-## Updating changedetection.io
+## 更新 changedetection.io
### Docker
+
```
docker pull dgtlmoon/changedetection.io
docker kill $(docker ps -a -f name=changedetection.io -q)
@@ -139,59 +136,58 @@ docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/dat
docker-compose pull && docker-compose up -d
```
-See the wiki for more information https://github.com/dgtlmoon/changedetection.io/wiki
-
+参见维基以获取更多信息 [https://github.com/dgtlmoon/changedetection.io/wiki](https://github.com/dgtlmoon/changedetection.io/wiki)
## Filters
-XPath, JSONPath, jq, and CSS support comes baked in! You can be as specific as you need, use XPath exported from various XPath element query creation tools.
-(We support LXML `re:test`, `re:match` and `re:replace`.)
+内置支持 XPath、JSONPath、jq 和 CSS!您可以根据需要进行精确匹配,使用来自各种 XPath 元素查询创建工具导出的 XPath。 (我们支持 LXML 的 `re:test`、`re:match` 和 `re:replace`。)
## Notifications
-ChangeDetection.io supports a massive amount of notifications (including email, office365, custom APIs, etc) when a web-page has a change detected thanks to the apprise library.
-Simply set one or more notification URL's in the _[edit]_ tab of that watch.
+ChangeDetection.io 通过 [apprise](https://github.com/caronc/apprise) 库支持大量通知(包括电子邮件、office365、自定义 API 等),当检测到网页发生变化时会发送通知。只需在“*\[编辑\]*”标签页中设置一个或多个通知 URL。
-Just some examples
+仅作一些示例
- discord://webhook_id/webhook_token
- flock://app_token/g:channel_id
- gitter://token/room
- gchat://workspace/key/token
- msteams://TokenA/TokenB/TokenC/
- o365://TenantID:AccountEmail/ClientID/ClientSecret/TargetEmail
- rocket://user:password@hostname/#Channel
- mailto://user:pass@example.com?to=receivingAddress@example.com
- json://someserver.com/custom-api
- syslog://
-
-And everything else in this list!
+```
+discord://webhook_id/webhook_token
+flock://app_token/g:channel_id
+gitter://token/room
+gchat://workspace/key/token
+msteams://TokenA/TokenB/TokenC/
+o365://TenantID:AccountEmail/ClientID/ClientSecret/TargetEmail
+rocket://user:password@hostname/#Channel
+mailto://user:pass@example.com?to=receivingAddress@example.com
+json://someserver.com/custom-api
+syslog://
+```
-
+[以及列表中的其他一切!](https://github.com/caronc/apprise#popular-notification-services)
-Now you can also customise your notification content and use Jinja2 templating for their title and body!
+
-## JSON API Monitoring
+现在你还可以自定义通知内容,并使用 [Jinja2 模板](https://jinja.palletsprojects.com/en/3.0.x/templates/) 来设置其标题和正文!
-Detect changes and monitor data in JSON API's by using either JSONPath or jq to filter, parse, and restructure JSON as needed.
+## JSON API 监控
+
+通过使用 JSONPath 或 jq 过滤、解析和重组 JSON,来检测 JSON API 中的变化和监控数据。

-This will re-parse the JSON and apply formatting to the text, making it super easy to monitor and detect changes in JSON API results
+这将重新解析 JSON 并对文本进行格式化,使监控和检测 JSON API 结果中的变化变得极其简单

-### JSONPath or jq?
+### JSONPath 或 jq?
-For more complex parsing, filtering, and modifying of JSON data, jq is recommended due to the built-in operators and functions. Refer to the [documentation](https://stedolan.github.io/jq/manual/) for more specifc information on jq.
+对于更复杂的 JSON 数据解析、过滤和修改,推荐使用 jq,因为它内置了操作符和函数。更多具体信息请参阅\[jq 文档\](#0)。
-One big advantage of `jq` is that you can use logic in your JSON filter, such as filters to only show items that have a value greater than/less than etc.
+jq 的一大优势是你可以使用逻辑来过滤 JSON 数据,例如只显示值大于/小于等条件的数据项。
-See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/JSON-Selector-Filter-help for more information and examples
+更多详细信息和示例请参阅维基页面\[https://github.com/dgtlmoon/changedetection.io/wiki/JSON-Selector-Filter-help\](#0)
-### Parse JSON embedded in HTML!
+### 解析嵌入在 HTML 中的 JSON 数据!
-When you enable a `json:` or `jq:` filter, you can even automatically extract and parse embedded JSON inside a HTML page! Amazingly handy for sites that build content based on JSON, such as many e-commerce websites.
+启用 `json:` 或 `jq:` 过滤器后,你甚至可以自动提取并解析 HTML 页面中的嵌入 JSON!这对于基于 JSON 构建内容的网站非常有用,比如许多电子商务网站。
```
@@ -214,47 +210,36 @@ When you enable a `json:` or `jq:` filter, you can even automatically extract an
"itemCondition":"NewCondition"
}
-```
+```
-`json:$..price` or `jq:..price` would give `3949.99`, or you can extract the whole structure (use a JSONpath test website to validate with)
+`json:$..price` 或 `jq:..price` 会返回 `3949.99`,或者你可以提取整个结构(使用 JSONpath 测试网站进行验证)
-The application also supports notifying you that it can follow this information automatically
+该应用还支持通知你它可以自动跟踪这些信息
+## 代理配置
-## Proxy Configuration
+参见维基 [https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration),我们还支持在可能的情况下使用 [BrightData 代理服务](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support)
-See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration , we also support using [BrightData proxy services where possible]( https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support)
+## Raspberry Pi 支持吗?
-## Raspberry Pi support?
+Raspberry Pi 和 linux/arm/v6、linux/arm/v7、arm64 设备都支持!参见维基 [以获取详细信息](https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver)
-Raspberry Pi and linux/arm/v6 linux/arm/v7 arm64 devices are supported! See the wiki for [details](https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver)
+## API 支持
-## API Support
+支持通过我们的 API 管理网站监控列表 [via our API](https://changedetection.io/docs/api_v1/index.html)
-Supports managing the website watch list [via our API](https://changedetection.io/docs/api_v1/index.html)
+## 支持我们
-## Support us
+您是否利用 changedetection.io 来赚钱?它是否为您节省了时间或金钱?是否让您的生活更加轻松或减少压力?请记住,我们在编写此软件时本应从事有偿工作,我们也需要购买食物和支付房租,就像您一样。
-Do you use changedetection.io to make money? does it save you time or money? Does it make your life easier? less stressful? Remember, we write this software when we should be doing actual paid work, we have to buy food and pay rent just like you.
+首先,考虑订阅一个 [change detection 月度订阅 - 无限次检查和监控](https://changedetection.io?src=github) ,即使您不使用它,您仍然会获得帮助项目的温暖感觉。(谁知道呢,您可能真的会用到它!)
+或直接通过 PayPal 捐赠金额[](https://www.paypal.com/donate/?hosted_button_id=7CP6HR9ZCNDYJ)
-Firstly, consider taking out a [change detection monthly subscription - unlimited checks and watches](https://changedetection.io?src=github) , even if you don't use it, you still get the warm fuzzy feeling of helping out the project. (And who knows, you might just use it!)
+或 BTC `1PLFN327GyUarpJd7nVe7Reqg9qHx5frNn`
-Or directly donate an amount PayPal [](https://www.paypal.com/donate/?hosted_button_id=7CP6HR9ZCNDYJ)
+
-Or BTC `1PLFN327GyUarpJd7nVe7Reqg9qHx5frNn`
+## 商业支持
-
-
-## Commercial Support
-
-I offer commercial support, this software is depended on by network security, aerospace , data-science and data-journalist professionals just to name a few, please reach out at dgtlmoon@gmail.com for any enquiries, I am more than glad to work with your organisation to further the possibilities of what can be done with changedetection.io
-
-
-[release-shield]: https://img.shields.io:/github/v/release/dgtlmoon/changedetection.io?style=for-the-badge
-[docker-pulls]: https://img.shields.io/docker/pulls/dgtlmoon/changedetection.io?style=for-the-badge
-[test-shield]: https://github.com/dgtlmoon/changedetection.io/actions/workflows/test-only.yml/badge.svg?branch=master
-
-[license-shield]: https://img.shields.io/github/license/dgtlmoon/changedetection.io.svg?style=for-the-badge
-[release-link]: https://github.com/dgtlmoon/changedetection.io/releases
-[docker-link]: https://hub.docker.com/r/dgtlmoon/changedetection.io
\ No newline at end of file
+我提供商业支持,此软件被网络安全、航空航天、数据科学和数据记者等专业人士依赖,如有任何咨询,请联系 [dgtlmoon@gmail.com](mailto:dgtlmoon@gmail.com),我很乐意与贵组织合作,进一步探索 changedetection.io 的可能性
\ No newline at end of file
diff --git a/apps/changedetectionio/README_en.md b/apps/changedetectionio/README_en.md
new file mode 100644
index 000000000..ea93e7424
--- /dev/null
+++ b/apps/changedetectionio/README_en.md
@@ -0,0 +1,260 @@
+## Web Site Change Detection, Restock monitoring and notifications.
+
+**_Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more._**
+
+_Live your data-life pro-actively._
+
+
+[](https://changedetection.io?src=github)
+
+[![Release Version][release-shield]][release-link] [![Docker Pulls][docker-pulls]][docker-link] [![License][license-shield]](https://github.com/dgtlmoon/changedetection.io/blob/master/LICENSE.md)
+
+
+
+[**Don't have time? Let us host it for you! try our $8.99/month subscription - use our proxies and support!**](https://changedetection.io) , _half the price of other website change monitoring services!_
+
+- Chrome browser included.
+- Super fast, no registration needed setup.
+- Get started watching and receiving website change notifications straight away.
+
+
+### Target specific parts of the webpage using the Visual Selector tool.
+
+Available when connected to a playwright content fetcher (included as part of our subscription service)
+
+[](https://changedetection.io?src=github)
+
+### Easily see what changed, examine by word, line, or individual character.
+
+[](https://changedetection.io?src=github)
+
+
+### Perform interactive browser steps
+
+Fill in text boxes, click buttons and more, setup your changedetection scenario.
+
+Using the **Browser Steps** configuration, add basic steps before performing change detection, such as logging into websites, adding a product to a cart, accept cookie logins, entering dates and refining searches.
+
+[](https://changedetection.io?src=github)
+
+After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
+Requires Playwright to be enabled.
+
+
+### Example use cases
+
+- Products and services have a change in pricing
+- _Out of stock notification_ and _Back In stock notification_
+- Monitor and track PDF file changes, know when a PDF file has text changes.
+- Governmental department updates (changes are often only on their websites)
+- New software releases, security advisories when you're not on their mailing list.
+- Festivals with changes
+- Discogs restock alerts and monitoring
+- Realestate listing changes
+- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else
+- COVID related news from government websites
+- University/organisation news from their website
+- Detect and monitor changes in JSON API responses
+- JSON API monitoring and alerting
+- Changes in legal and other documents
+- Trigger API calls via notifications when text appears on a website
+- Glue together APIs using the JSON filter and JSON notifications
+- Create RSS feeds based on changes in web content
+- Monitor HTML source code for unexpected changes, strengthen your PCI compliance
+- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product)
+- Get notified when certain keywords appear in Twitter search results
+- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords.
+- Get alerts when new job positions are open on Bamboo HR and other job platforms
+- Website defacement monitoring
+- Pokémon Card Restock Tracker / Pokémon TCG Tracker
+
+_Need an actual Chrome runner with Javascript support? We support fetching via WebDriver and Playwright!_
+
+#### Key Features
+
+- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions!
+- Target elements with xPath and CSS Selectors, Easily monitor complex JSON with JSONPath or jq
+- Switch between fast non-JS and Chrome JS based "fetchers"
+- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums)
+- Easily specify how often a site should be checked
+- Execute JS before extracting text (Good for logging in, see examples in the UI!)
+- Override Request Headers, Specify `POST` or `GET` and other methods
+- Use the "Visual Selector" to help target specific elements
+- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration)
+- Send a screenshot with the notification when a change is detected in the web page
+
+We [recommend and use Bright Data](https://brightdata.grsm.io/n0r16zf7eivq) global proxy services, Bright Data will match any first deposit up to $100 using our signup link.
+
+Please :star: star :star: this project and help it grow! https://github.com/dgtlmoon/changedetection.io/
+
+## Installation
+
+### Docker
+
+With Docker composer, just clone this repository and..
+
+```bash
+$ docker-compose up -d
+```
+
+Docker standalone
+```bash
+$ docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
+```
+
+`:latest` tag is our latest stable release, `:dev` tag is our bleeding edge `master` branch.
+
+Alternative docker repository over at ghcr - [ghcr.io/dgtlmoon/changedetection.io](https://ghcr.io/dgtlmoon/changedetection.io)
+
+### Windows
+
+See the install instructions at the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows
+
+### Python Pip
+
+Check out our pypi page https://pypi.org/project/changedetection.io/
+
+```bash
+$ pip3 install changedetection.io
+$ changedetection.io -d /path/to/empty/data/dir -p 5000
+```
+
+Then visit http://127.0.0.1:5000 , You should now be able to access the UI.
+
+_Now with per-site configurable support for using a fast built in HTTP fetcher or use a Chrome based fetcher for monitoring of JavaScript websites!_
+
+## Updating changedetection.io
+
+### Docker
+```
+docker pull dgtlmoon/changedetection.io
+docker kill $(docker ps -a -f name=changedetection.io -q)
+docker rm $(docker ps -a -f name=changedetection.io -q)
+docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
+```
+
+### docker-compose
+
+```bash
+docker-compose pull && docker-compose up -d
+```
+
+See the wiki for more information https://github.com/dgtlmoon/changedetection.io/wiki
+
+
+## Filters
+
+XPath, JSONPath, jq, and CSS support comes baked in! You can be as specific as you need, use XPath exported from various XPath element query creation tools.
+(We support LXML `re:test`, `re:match` and `re:replace`.)
+
+## Notifications
+
+ChangeDetection.io supports a massive amount of notifications (including email, office365, custom APIs, etc) when a web-page has a change detected thanks to the apprise library.
+Simply set one or more notification URL's in the _[edit]_ tab of that watch.
+
+Just some examples
+
+ discord://webhook_id/webhook_token
+ flock://app_token/g:channel_id
+ gitter://token/room
+ gchat://workspace/key/token
+ msteams://TokenA/TokenB/TokenC/
+ o365://TenantID:AccountEmail/ClientID/ClientSecret/TargetEmail
+ rocket://user:password@hostname/#Channel
+ mailto://user:pass@example.com?to=receivingAddress@example.com
+ json://someserver.com/custom-api
+ syslog://
+
+And everything else in this list!
+
+
+
+Now you can also customise your notification content and use Jinja2 templating for their title and body!
+
+## JSON API Monitoring
+
+Detect changes and monitor data in JSON API's by using either JSONPath or jq to filter, parse, and restructure JSON as needed.
+
+
+
+This will re-parse the JSON and apply formatting to the text, making it super easy to monitor and detect changes in JSON API results
+
+
+
+### JSONPath or jq?
+
+For more complex parsing, filtering, and modifying of JSON data, jq is recommended due to the built-in operators and functions. Refer to the [documentation](https://stedolan.github.io/jq/manual/) for more specifc information on jq.
+
+One big advantage of `jq` is that you can use logic in your JSON filter, such as filters to only show items that have a value greater than/less than etc.
+
+See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/JSON-Selector-Filter-help for more information and examples
+
+### Parse JSON embedded in HTML!
+
+When you enable a `json:` or `jq:` filter, you can even automatically extract and parse embedded JSON inside a HTML page! Amazingly handy for sites that build content based on JSON, such as many e-commerce websites.
+
+```
+
+...
+
+```
+
+`json:$..price` or `jq:..price` would give `3949.99`, or you can extract the whole structure (use a JSONpath test website to validate with)
+
+The application also supports notifying you that it can follow this information automatically
+
+
+## Proxy Configuration
+
+See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration , we also support using [BrightData proxy services where possible]( https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support)
+
+## Raspberry Pi support?
+
+Raspberry Pi and linux/arm/v6 linux/arm/v7 arm64 devices are supported! See the wiki for [details](https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver)
+
+## API Support
+
+Supports managing the website watch list [via our API](https://changedetection.io/docs/api_v1/index.html)
+
+## Support us
+
+Do you use changedetection.io to make money? does it save you time or money? Does it make your life easier? less stressful? Remember, we write this software when we should be doing actual paid work, we have to buy food and pay rent just like you.
+
+
+Firstly, consider taking out a [change detection monthly subscription - unlimited checks and watches](https://changedetection.io?src=github) , even if you don't use it, you still get the warm fuzzy feeling of helping out the project. (And who knows, you might just use it!)
+
+Or directly donate an amount PayPal [](https://www.paypal.com/donate/?hosted_button_id=7CP6HR9ZCNDYJ)
+
+Or BTC `1PLFN327GyUarpJd7nVe7Reqg9qHx5frNn`
+
+
+
+## Commercial Support
+
+I offer commercial support, this software is depended on by network security, aerospace , data-science and data-journalist professionals just to name a few, please reach out at dgtlmoon@gmail.com for any enquiries, I am more than glad to work with your organisation to further the possibilities of what can be done with changedetection.io
+
+
+[release-shield]: https://img.shields.io:/github/v/release/dgtlmoon/changedetection.io?style=for-the-badge
+[docker-pulls]: https://img.shields.io/docker/pulls/dgtlmoon/changedetection.io?style=for-the-badge
+[test-shield]: https://github.com/dgtlmoon/changedetection.io/actions/workflows/test-only.yml/badge.svg?branch=master
+
+[license-shield]: https://img.shields.io/github/license/dgtlmoon/changedetection.io.svg?style=for-the-badge
+[release-link]: https://github.com/dgtlmoon/changedetection.io/releases
+[docker-link]: https://hub.docker.com/r/dgtlmoon/changedetection.io
\ No newline at end of file
diff --git a/apps/cloudbeaver/README.md b/apps/cloudbeaver/README.md
index 93b613e37..89db6fd4a 100644
--- a/apps/cloudbeaver/README.md
+++ b/apps/cloudbeaver/README.md
@@ -1,70 +1,68 @@
-# CloudBeaver Community
+# CloudBeaver 社区版
-
+
-Cloud Database Manager - Community Edition.
-CloudBeaver is a web server which provides rich web interface. Server itself is a Java application, web part is written on TypeScript and React.
-It is free to use and open-source (licensed under [Apache 2](https://github.com/dbeaver/cloudbeaver/blob/devel/LICENSE) license).
-See out [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details.
+Cloud 数据库管理器 - 社区版。
+CloudBeaver 是一个 web 服务器,提供丰富的 web 界面。服务器本身是一个 Java 应用程序,web 部分使用 TypeScript 和 React 编写。
+它免费提供使用,并且是开源的(采用 [Apache 2](https://github.com/dbeaver/cloudbeaver/blob/devel/LICENSE) 许可证)。 %%
+访问 [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) 以获取更多细节。

-## Run in Docker
+## 使用 Docker 运行
-- [Official Docker repository](https://hub.docker.com/r/dbeaver/cloudbeaver)
-- [Running instructions](https://github.com/dbeaver/cloudbeaver/wiki/Run-Docker-Container)
+* [官方 Docker 仓库](https://hub.docker.com/r/dbeaver/cloudbeaver)
+* [运行说明](https://github.com/dbeaver/cloudbeaver/wiki/Run-Docker-Container)
-## Demo server
+## 演示服务器
-You can see live demo of CloudBeaver here: https://demo.cloudbeaver.io
+您可以在以下地址查看 CloudBeaver 的实时演示:\[https://demo.cloudbeaver.io\](https://demo.cloudbeaver.io)
-[Database access instructions](https://github.com/dbeaver/cloudbeaver/wiki/Demo-Server)
+[数据库访问说明](https://github.com/dbeaver/cloudbeaver/wiki/Demo-Server)
-## Changelog
+## 更新日志
### CloudBeaver 23.1.3 - 2023-07-24
-- Users can simultaneously edit resources, allowing them to work together;
-- We have improved the UX in the search bar - users can delete a query or request by clicking on the cross icon;
-- The search request considers file names and exclude the .sql file extension for now;
-- Different bug fixes and enhancements have been made.
+* 用户可以同时编辑资源,从而可以协同工作;
+* 我们改进了搜索栏的用户体验——用户可以通过点击叉号图标删除查询或请求;
+* 搜索请求目前会考虑文件名,但不包括.sql 文件扩展名;
+* 已进行了不同的错误修复和增强。
### CloudBeaver 23.1.2 - 2023-07-10
-- We have improved the SQL Editor functionality by adding support for displaying tables with nested arrays of objects;
-- The ability to compress files during export allows for faster download speeds, particularly for larger files;
-- New Settings panel displays the product configuration settings such as Minimum fetch size, Maximum fetch size, and Default fetch size from the Data Editor;
-- Different bug fixes and enhancements have been made.
+* 我们改进了 SQL 编辑器的功能,增加了显示嵌套对象数组的表格的支持;
+* 导出时压缩文件的能力可以提高下载速度,尤其是对于大文件;
+* 新的设置面板显示来自数据编辑器的最小获取大小、最大获取大小和默认获取大小等产品配置设置;
+* 不同问题已修复并增加了多项改进。
### CloudBeaver 23.1.1 - 2023-06-26
-- Connections are consistently displayed now when they are pre-configured into the workspace in the Global Configuration json file.
-- Different bug fixes and enhancements have been made.
+* 现在,当连接在全局配置 json 文件中预配置到工作空间时,连接将始终显示。
+* 不同问题已修复并增加了多项改进。
### CloudBeaver 23.1.0 - 2023-06-05
-Changes since 23.0.0
+自 23.0.0 版以来的更改
-- Data viewer:
- - New grouping panel menu was added in the Data Viewer. This panel extracts unique values from the database column for count. Users can drag and drop the column to the grouping panel and get the results immediately. Sorting, filtering and exporting of the results are available on the Grouping panel.
-- SQL Editor:
- - We improved the performance of the SQL-editor - as a result, handling scripts with up to 10 000 lines does not present any challenges;
- - In the SQL-editor, pressing Tab/Space followed by Enter now causes the cursor to move to a new line;
- - In the SQL editor, when the cursor goes back on the query, the previous hints are displayed;
- - Error when running SQL with semicolon has been fixed.
-- Connections:
- - If there is an error in saving the data, the tab for the chosen connection dialog will stay open to allow corrections;
- - The URL-configuration for PostgreSQL now correctly displays only a single database.
-- Driver management:
- - The CE version now offers the updated sqlite-jdbc driver, version 3.41.2;
- - CloudBeaver has the option to connect to H2 database version 2;
- - The internal CloudBeaver database is upgraded to the newest H2 version 2 to avoid vulnerability issues. The database will be safely upgraded automatically for the servers with default configurations. You can perform this upgrade manually if you have a custom configuration for this database in your infrastructure.
-- Connections:
- - Option to increase the maximum size of text files displayed in the value panel (using the sqlTextPreviewMaxLength parameter) has been added;
- - Support for custom logging configuration has been added. An external configuration file can be used instead of the default configuration.
+* 数据查看器:
+ * 在数据查看器中新增了分组面板菜单。此面板可以从数据库列中提取用于计数的唯一值。用户可以将列拖放到分组面板中并立即获得结果。分组面板中还提供了对结果进行排序、过滤和导出的功能。
+* SQL 编辑器:
+ * 我们改进了 SQL 编辑器的性能——现在处理包含多达 10000 行的脚本不再有任何挑战;
+ * 在 SQL 编辑器中,按下 Tab/Space 后跟 Enter 键会使光标移动到新行;
+ * 在 SQL 编辑器中,当光标返回查询时,会显示之前的提示;
+ * 运行包含分号的 SQL 时的错误已修复。
+* 连接:
+ * 如果保存数据时出现错误,将打开所选连接对话框的选项卡以允许进行修正;
+ * PostgreSQL 的 URL 配置现在正确地只显示一个数据库。
+* 驱动管理:
+ * CE 版本现在提供了更新的 sqlite-jdbc 驱动,版本为 3.41.2;
+ * CloudBeaver 可以连接到 H2 数据库版本 2;
+ * CloudBeaver 内部数据库升级到最新的 H2 版本 2 以避免安全漏洞问题。对于默认配置的服务器,数据库将安全地自动升级。如果您在基础设施中为该数据库设置了自定义配置,可以手动执行此升级。
+* 连接:
+ * 现在可以在值面板中显示更大尺寸的文本文件(通过使用 sqlTextPreviewMaxLength 参数);
+ * 增加了对自定义日志配置的支持。可以使用外部配置文件替代默认配置。
+### 旧版本的 CloudBeaver
-### Old CloudBeaver releases
-
-You can find information about earlier releases on the CloudBeaver wiki https://github.com/dbeaver/cloudbeaver/wiki/Releases.
-
+您可以在 CloudBeaver 维基上找到关于早期版本的信息:[https://github.com/dbeaver/cloudbeaver/wiki/Releases](https://github.com/dbeaver/cloudbeaver/wiki/Releases)。
\ No newline at end of file
diff --git a/apps/cloudbeaver/README_en.md b/apps/cloudbeaver/README_en.md
new file mode 100644
index 000000000..93b613e37
--- /dev/null
+++ b/apps/cloudbeaver/README_en.md
@@ -0,0 +1,70 @@
+# CloudBeaver Community
+
+
+
+Cloud Database Manager - Community Edition.
+CloudBeaver is a web server which provides rich web interface. Server itself is a Java application, web part is written on TypeScript and React.
+It is free to use and open-source (licensed under [Apache 2](https://github.com/dbeaver/cloudbeaver/blob/devel/LICENSE) license).
+See out [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details.
+
+
+
+## Run in Docker
+
+- [Official Docker repository](https://hub.docker.com/r/dbeaver/cloudbeaver)
+- [Running instructions](https://github.com/dbeaver/cloudbeaver/wiki/Run-Docker-Container)
+
+## Demo server
+
+You can see live demo of CloudBeaver here: https://demo.cloudbeaver.io
+
+[Database access instructions](https://github.com/dbeaver/cloudbeaver/wiki/Demo-Server)
+
+## Changelog
+
+### CloudBeaver 23.1.3 - 2023-07-24
+
+- Users can simultaneously edit resources, allowing them to work together;
+- We have improved the UX in the search bar - users can delete a query or request by clicking on the cross icon;
+- The search request considers file names and exclude the .sql file extension for now;
+- Different bug fixes and enhancements have been made.
+
+### CloudBeaver 23.1.2 - 2023-07-10
+
+- We have improved the SQL Editor functionality by adding support for displaying tables with nested arrays of objects;
+- The ability to compress files during export allows for faster download speeds, particularly for larger files;
+- New Settings panel displays the product configuration settings such as Minimum fetch size, Maximum fetch size, and Default fetch size from the Data Editor;
+- Different bug fixes and enhancements have been made.
+
+### CloudBeaver 23.1.1 - 2023-06-26
+
+- Connections are consistently displayed now when they are pre-configured into the workspace in the Global Configuration json file.
+- Different bug fixes and enhancements have been made.
+
+### CloudBeaver 23.1.0 - 2023-06-05
+
+Changes since 23.0.0
+
+- Data viewer:
+ - New grouping panel menu was added in the Data Viewer. This panel extracts unique values from the database column for count. Users can drag and drop the column to the grouping panel and get the results immediately. Sorting, filtering and exporting of the results are available on the Grouping panel.
+- SQL Editor:
+ - We improved the performance of the SQL-editor - as a result, handling scripts with up to 10 000 lines does not present any challenges;
+ - In the SQL-editor, pressing Tab/Space followed by Enter now causes the cursor to move to a new line;
+ - In the SQL editor, when the cursor goes back on the query, the previous hints are displayed;
+ - Error when running SQL with semicolon has been fixed.
+- Connections:
+ - If there is an error in saving the data, the tab for the chosen connection dialog will stay open to allow corrections;
+ - The URL-configuration for PostgreSQL now correctly displays only a single database.
+- Driver management:
+ - The CE version now offers the updated sqlite-jdbc driver, version 3.41.2;
+ - CloudBeaver has the option to connect to H2 database version 2;
+ - The internal CloudBeaver database is upgraded to the newest H2 version 2 to avoid vulnerability issues. The database will be safely upgraded automatically for the servers with default configurations. You can perform this upgrade manually if you have a custom configuration for this database in your infrastructure.
+- Connections:
+ - Option to increase the maximum size of text files displayed in the value panel (using the sqlTextPreviewMaxLength parameter) has been added;
+ - Support for custom logging configuration has been added. An external configuration file can be used instead of the default configuration.
+
+
+### Old CloudBeaver releases
+
+You can find information about earlier releases on the CloudBeaver wiki https://github.com/dbeaver/cloudbeaver/wiki/Releases.
+
diff --git a/apps/code-server/README.md b/apps/code-server/README.md
index 9ed85ffdc..73d8af2e7 100644
--- a/apps/code-server/README.md
+++ b/apps/code-server/README.md
@@ -2,77 +2,61 @@
[](https://github.com/coder/code-server/discussions) [](https://coder.com/community) [](https://twitter.com/coderhq) [](https://codecov.io/gh/coder/code-server) [](https://coder.com/docs/code-server/latest)
-Run [VS Code](https://github.com/Microsoft/vscode) on any machine anywhere and
-access it in the browser.
+在任何机器上运行 [VS Code](https://github.com/Microsoft/vscode),并通过浏览器访问它。

-## Highlights
+## 亮点
-- Code on any device with a consistent development environment
-- Use cloud servers to speed up tests, compilations, downloads, and more
-- Preserve battery life when you're on the go; all intensive tasks run on your
- server
+* 在任何设备上使用一致的开发环境进行编码
+* 使用云服务器加速测试、编译、下载等操作
+* 在移动时保护电池寿命;所有密集型任务都在您的服务器上运行
-## Requirements
+## 要求
-See [requirements](https://coder.com/docs/code-server/latest/requirements) for minimum specs, as well as instructions
-on how to set up a Google VM on which you can install code-server.
+查看[要求](https://coder.com/docs/code-server/latest/requirements)以获取最低配置信息,以及如何设置 Google VM 以安装 code-server 的说明。
-**TL;DR:** Linux machine with WebSockets enabled, 1 GB RAM, and 2 vCPUs
+**TL;DR:** 开启 WebSockets 的 Linux 机器,1 GB RAM,2 个 vCPU
-## Getting started
+## 入门指南
-There are four ways to get started:
+有四种入门方式:
-1. Using the [install
- script](https://github.com/coder/code-server/blob/main/install.sh), which
- automates most of the process. The script uses the system package manager if
- possible.
-2. Manually [installing
- code-server](https://coder.com/docs/code-server/latest/install)
-3. Deploy code-server to your team with [coder/coder](https://cdr.co/coder-github)
-4. Using our one-click buttons and guides to [deploy code-server to a cloud
- provider](https://github.com/coder/deploy-code-server) ⚡
+1. 使用[安装脚本](https://github.com/coder/code-server/blob/main/install.sh) ,该脚本自动化了大部分过程。如果可能,脚本会使用系统包管理器。
+2. 手动 [安装 code-server](https://coder.com/docs/code-server/latest/install)
+3. 使用 [coder/coder](https://cdr.co/coder-github) 将 code-server 部署到您的团队
+4. 通过我们的单点点击按钮和指南,将 [code-server 部署到云服务提供商](https://github.com/coder/deploy-code-server) ⚡
-If you use the install script, you can preview what occurs during the install
-process:
+如果您使用安装脚本,可以预览安装过程中发生的情况:
```bash
curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run
```
-To install, run:
+安装,运行:
```bash
curl -fsSL https://code-server.dev/install.sh | sh
```
-When done, the install script prints out instructions for running and starting
-code-server.
+完成安装后,安装脚本将打印出运行和启动 code-server 的说明。
-> **Note**
-> To manage code-server for a team on your infrastructure, see: [coder/coder](https://cdr.co/coder-github)
+> **注意** 要在您的基础设施上为团队管理 code-server,请参阅:[coder/coder](https://cdr.co/coder-github)
-We also have an in-depth [setup and
-configuration](https://coder.com/docs/code-server/latest/guide) guide.
+我们还有一份详细的 [设置和配置](https://coder.com/docs/code-server/latest/guide) 指南。
-## Questions?
+## 疑问?
-See answers to [frequently asked
-questions](https://coder.com/docs/code-server/latest/FAQ).
+查看[常见问题解答](https://coder.com/docs/code-server/latest/FAQ) 。
-## Want to help?
+## 想要帮忙?
-See [Contributing](https://coder.com/docs/code-server/latest/CONTRIBUTING) for
-details.
+查看[贡献指南](https://coder.com/docs/code-server/latest/CONTRIBUTING) 。
-## Hiring
+## 招聘
-Interested in [working at Coder](https://coder.com/careers)? Check out [our open
-positions](https://coder.com/careers#openings)!
+对在 Coder 工作感兴趣?查看[我们的开放职位](https://coder.com/careers#openings) !
-## For Organizations
+## 为企业
-Want remote development for your organization or enterprise? Visit [our
-website](https://coder.com) to learn more about Coder.
+想为您的组织或企业进行远程开发?访问[我们的网站](https://coder.com)了解有关 Coder 的更多信息。
\ No newline at end of file
diff --git a/apps/code-server/README_en.md b/apps/code-server/README_en.md
new file mode 100644
index 000000000..9ed85ffdc
--- /dev/null
+++ b/apps/code-server/README_en.md
@@ -0,0 +1,78 @@
+# code-server
+
+[](https://github.com/coder/code-server/discussions) [](https://coder.com/community) [](https://twitter.com/coderhq) [](https://codecov.io/gh/coder/code-server) [](https://coder.com/docs/code-server/latest)
+
+Run [VS Code](https://github.com/Microsoft/vscode) on any machine anywhere and
+access it in the browser.
+
+
+
+## Highlights
+
+- Code on any device with a consistent development environment
+- Use cloud servers to speed up tests, compilations, downloads, and more
+- Preserve battery life when you're on the go; all intensive tasks run on your
+ server
+
+## Requirements
+
+See [requirements](https://coder.com/docs/code-server/latest/requirements) for minimum specs, as well as instructions
+on how to set up a Google VM on which you can install code-server.
+
+**TL;DR:** Linux machine with WebSockets enabled, 1 GB RAM, and 2 vCPUs
+
+## Getting started
+
+There are four ways to get started:
+
+1. Using the [install
+ script](https://github.com/coder/code-server/blob/main/install.sh), which
+ automates most of the process. The script uses the system package manager if
+ possible.
+2. Manually [installing
+ code-server](https://coder.com/docs/code-server/latest/install)
+3. Deploy code-server to your team with [coder/coder](https://cdr.co/coder-github)
+4. Using our one-click buttons and guides to [deploy code-server to a cloud
+ provider](https://github.com/coder/deploy-code-server) ⚡
+
+If you use the install script, you can preview what occurs during the install
+process:
+
+```bash
+curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run
+```
+
+To install, run:
+
+```bash
+curl -fsSL https://code-server.dev/install.sh | sh
+```
+
+When done, the install script prints out instructions for running and starting
+code-server.
+
+> **Note**
+> To manage code-server for a team on your infrastructure, see: [coder/coder](https://cdr.co/coder-github)
+
+We also have an in-depth [setup and
+configuration](https://coder.com/docs/code-server/latest/guide) guide.
+
+## Questions?
+
+See answers to [frequently asked
+questions](https://coder.com/docs/code-server/latest/FAQ).
+
+## Want to help?
+
+See [Contributing](https://coder.com/docs/code-server/latest/CONTRIBUTING) for
+details.
+
+## Hiring
+
+Interested in [working at Coder](https://coder.com/careers)? Check out [our open
+positions](https://coder.com/careers#openings)!
+
+## For Organizations
+
+Want remote development for your organization or enterprise? Visit [our
+website](https://coder.com) to learn more about Coder.
diff --git a/apps/dashdot/README.md b/apps/dashdot/README.md
index e8702d8ed..b7477b63b 100644
--- a/apps/dashdot/README.md
+++ b/apps/dashdot/README.md
@@ -1,69 +1,28 @@
-
-
-
-
+# 
-
- dash. (or dashdot) is a modern server dashboard,
- running on the latest tech, designed with glassmorphism in mind.
- It is intended to be used for smaller VPS and private servers.
-
+[在线演示](https://dash.mauz.dev) | [容器镜像](https://hub.docker.com/r/mauricenino/dashdot)
-#
+[](https://ko-fi.com/mauricenino)
-
-
-
+**dash. 是一个开源项目,因此任何贡献都备受赞赏。 如果您有兴趣进一步开发此项目,请查看 [Contributing.md](https://github.com/MauriceNino/dashdot/blob/main/.github/CONTRIBUTING.md).**
-
+如果您想从经济上支持这个项目,您可以访问我的 [GitHub 赞助](https://github.com/sponsors/MauriceNino) ,或者我的 [Ko-Fi](https://ko-fi.com/mauricenino)。
-**dash.** is a open-source project, so any contribution is highly appreciated.
-If you are interested in further developing this project, have a look at the
-[Contributing.md](https://github.com/MauriceNino/dashdot/blob/main/.github/CONTRIBUTING.md).
+## 预览
-In case you want to financially support this project, you can visit my
-[GitHub Sponsors](https://github.com/sponsors/MauriceNino), or my [Ko-Fi](https://ko-fi.com/mauricenino).
+| 暗黑模式 | 亮色模式 |
+| --- | --- |
+| | |
-## Preview
+## 快速安装(Docker)
-
-
-| Dark-Mode | Light-Mode |
-| -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
-| | |
-
-
-## Quick Install (Docker)
-
-Images are hosted on [DockerHub](https://hub.docker.com/r/mauricenino/dashdot),
-and are available for both AMD64 and ARM devices.
+镜像托管在 [DockerHub](https://hub.docker.com/r/mauricenino/dashdot),适用于 AMD64 和 ARM 设备。
```bash
docker container run -it \
@@ -73,8 +32,6 @@ docker container run -it \
mauricenino/dashdot
```
-To get more information on why which flag is needed, or if you want to use other
-install options instead (`docker-compose`, or from source), have a look at the
-[installation options](https://getdashdot.com/docs/install).
+要了解更多关于为什么需要哪个标志,或者如果您想使用其他安装选项(如 `docker-compose` 或从源代码安装),请查看 [安装选项](https://getdashdot.com/docs/install) 。
-To read more about configuration options, you can visit the [configuration options](https://getdashdot.com/docs/config).
\ No newline at end of file
+要了解更多关于配置选项的信息,您可以访问[配置选项](https://getdashdot.com/docs/config) 。
\ No newline at end of file
diff --git a/apps/dashdot/README_en.md b/apps/dashdot/README_en.md
new file mode 100644
index 000000000..e8702d8ed
--- /dev/null
+++ b/apps/dashdot/README_en.md
@@ -0,0 +1,80 @@
+
+
+ Feel free to join the Discord and star the repo if you like the project!
+
+
+
+
+
+ dash. (or dashdot) is a modern server dashboard,
+ running on the latest tech, designed with glassmorphism in mind.
+ It is intended to be used for smaller VPS and private servers.
+
+
+#
+
+
+
+
+
+
+
+**dash.** is a open-source project, so any contribution is highly appreciated.
+If you are interested in further developing this project, have a look at the
+[Contributing.md](https://github.com/MauriceNino/dashdot/blob/main/.github/CONTRIBUTING.md).
+
+In case you want to financially support this project, you can visit my
+[GitHub Sponsors](https://github.com/sponsors/MauriceNino), or my [Ko-Fi](https://ko-fi.com/mauricenino).
+
+## Preview
+
+
+
+| Dark-Mode | Light-Mode |
+| -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
+| | |
+
+
+## Quick Install (Docker)
+
+Images are hosted on [DockerHub](https://hub.docker.com/r/mauricenino/dashdot),
+and are available for both AMD64 and ARM devices.
+
+```bash
+docker container run -it \
+ -p 80:3001 \
+ -v /:/mnt/host:ro \
+ --privileged \
+ mauricenino/dashdot
+```
+
+To get more information on why which flag is needed, or if you want to use other
+install options instead (`docker-compose`, or from source), have a look at the
+[installation options](https://getdashdot.com/docs/install).
+
+To read more about configuration options, you can visit the [configuration options](https://getdashdot.com/docs/config).
\ No newline at end of file
diff --git a/apps/dashy/README.md b/apps/dashy/README.md
index 805a4059d..618da6c2a 100644
--- a/apps/dashy/README.md
+++ b/apps/dashy/README.md
@@ -1,32 +1,29 @@
+# Dashy
-
+*Dashy 帮助您通过将自托管服务集中在一个地方来组织它们*
+
+**[用户展示](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md)** | **[实时演示](https://demo.dashy.to)** | **[入门指南](https://github.com/Lissy93/dashy/blob/master/docs/quick-start.md)** | **[文档](https://dashy.to/docs)** | **[GitHub](https://github.com/Lissy93/dashy)**
-## Features 🌈
-- 📃 Support for multiple pages
-- 🚦 Real-time status monitoring for each of your apps/links
-- 📊 Use widgets to display info and dynamic content from self-hosted services
-- 🔎 Instant search by name, domain, or tags + customizable hotkeys & keyboard shortcuts
-- 🎨 Many built-in color themes, with UI color editor and support for custom CSS
-- 🧸 Many icon options - Font-Awesome, homelab icons, auto-fetching Favicon, images, emojis, etc.
-- 💂 Optional authentication with multi-user access, configurable privileges, and SSO support
-- 🌎 Multi-language support, with 10+ human-translated languages, and more on the way
-- ☁ Optional, encrypted, free off-site cloud backup and restore feature available
-- 💼 A workspace view, for easily switching between multiple apps simultaneously
-- 🛩️ A minimal view, for use as a fast-loading browser Startpage
-- 🖱️ Choose app launch methods: new tab, same tab, clipboard, pop-up modal, or open in workspace view
-- 📏 Customizable layout, sizes, text, component visibility, sort order, behavior, etc.
-- 🖼️ Options for a full-screen background image, custom nav-bar links, HTML footer, title, etc.
-- 🚀 Easy to setup with Docker, or on bare metal, or with 1-Click cloud deployment
-- ⚙️ Easy single-file YAML-based configuration, and option to configure app through the UI
-- ✨ Under active development with improvements and new features added regularly
-- 🤏 Small bundle size, fully responsive UI, and PWA for basic offline access
-- 🆓 100% free and open-source
-- 🔐 Strong focus on privacy
-- 🌈 And loads more...
+## 功能 🌈
+
+* 📃 支持多页
+* 🚦 对每个应用/链接进行实时状态监控
+* 📊 使用小部件显示来自自托管服务的信息和动态内容
+* 🔎 通过名称、域名或标签进行即时搜索 + 可自定义快捷键和键盘快捷方式
+* 🎨 许多内置颜色主题,包含 UI 颜色编辑器和自定义 CSS 支持
+* 🧸 许多图标选项 - Font-Awesome、homelab 图标、自动获取 Favicon、图片、表情符号等。
+* 💂 可选的认证功能,支持多用户访问、可配置权限和 SSO 支持
+* 🌎 多语言支持,包含10+种人工翻译的语言,还有更多即将到来
+* ☁ 可选的加密、免费离线云备份和恢复功能可用
+* 💼 工作空间视图,便于同时切换多个应用
+* 🛩️ 最简视图,可作为快速加载的浏览器起始页使用
+* 🖱️ 选择应用启动方式:新标签页、同一标签页、剪贴板、弹出模态窗口或在工作空间视图中打开
+* 📏 可自定义布局、尺寸、文本、组件可见性、排序顺序、行为等。
+* 🖼️ 提供全屏背景图片、自定义导航栏链接、HTML 页脚、标题等选项。
+* 🚀 使用 Docker、裸机或一键云部署轻松设置。
+* ⚙️ 易于使用基于单文件的 YAML 配置,并通过 UI 配置应用程序。
+* ✨ 正在积极开发中,定期添加改进和新功能
+* 🤏 小巧的安装包,完全响应式界面,支持离线访问的 PWA
+* 🆓 100% 免费且开源
+* 🔐 强调隐私保护
+* 🌈 更多内容...
\ No newline at end of file
diff --git a/apps/dashy/README_en.md b/apps/dashy/README_en.md
new file mode 100644
index 000000000..805a4059d
--- /dev/null
+++ b/apps/dashy/README_en.md
@@ -0,0 +1,32 @@
+
+
+
+## Features 🌈
+- 📃 Support for multiple pages
+- 🚦 Real-time status monitoring for each of your apps/links
+- 📊 Use widgets to display info and dynamic content from self-hosted services
+- 🔎 Instant search by name, domain, or tags + customizable hotkeys & keyboard shortcuts
+- 🎨 Many built-in color themes, with UI color editor and support for custom CSS
+- 🧸 Many icon options - Font-Awesome, homelab icons, auto-fetching Favicon, images, emojis, etc.
+- 💂 Optional authentication with multi-user access, configurable privileges, and SSO support
+- 🌎 Multi-language support, with 10+ human-translated languages, and more on the way
+- ☁ Optional, encrypted, free off-site cloud backup and restore feature available
+- 💼 A workspace view, for easily switching between multiple apps simultaneously
+- 🛩️ A minimal view, for use as a fast-loading browser Startpage
+- 🖱️ Choose app launch methods: new tab, same tab, clipboard, pop-up modal, or open in workspace view
+- 📏 Customizable layout, sizes, text, component visibility, sort order, behavior, etc.
+- 🖼️ Options for a full-screen background image, custom nav-bar links, HTML footer, title, etc.
+- 🚀 Easy to setup with Docker, or on bare metal, or with 1-Click cloud deployment
+- ⚙️ Easy single-file YAML-based configuration, and option to configure app through the UI
+- ✨ Under active development with improvements and new features added regularly
+- 🤏 Small bundle size, fully responsive UI, and PWA for basic offline access
+- 🆓 100% free and open-source
+- 🔐 Strong focus on privacy
+- 🌈 And loads more...
diff --git a/apps/dbgate/README.md b/apps/dbgate/README.md
index b105e44ce..9c246bdde 100644
--- a/apps/dbgate/README.md
+++ b/apps/dbgate/README.md
@@ -1,156 +1,136 @@
-[](https://www.npmjs.com/package/dbgate-serve)
-
-[](https://snapcraft.io/dbgate)
-[](https://snapcraft.io/dbgate)
-[](https://github.com/prettier/prettier)
+[](https://www.npmjs.com/package/dbgate-serve)  [](https://snapcraft.io/dbgate) [](https://snapcraft.io/dbgate) [](https://github.com/prettier/prettier)
-
+
-# DbGate - (no)SQL database client
+# DbGate - (无)SQL 数据库客户端
-DbGate is cross-platform database manager.
-It's designed to be simple to use and effective, when working with more databases simultaneously.
-But there are also many advanced features like schema compare, visual query designer, chart visualisation or batch export and import.
+DbGate 是一款跨平台数据库管理器。它设计得简单易用,同时高效地处理多个数据库。但同时也拥有许多高级功能,如模式比较、可视化查询设计器、图表可视化或批量导入导出。
-DbGate is licensed under MIT license and is completely free.
+DbGate 采用 MIT 许可证,并且完全免费。
-* Try it online - [demo.dbgate.org](https://demo.dbgate.org) - online demo application
-* **Download** application for Windows, Linux or Mac from [dbgate.org](https://dbgate.org/download/)
-* Run web version as [NPM package](https://www.npmjs.com/package/dbgate-serve) or as [docker image](https://hub.docker.com/r/dbgate/dbgate)
+* 在线试用 - [demo.dbgate.org](https://demo.dbgate.org) - 在线演示应用程序
+* **下载**适用于 Windows、Linux 或 Mac 的应用程序,从 [dbgate.org](https://dbgate.org/download/)
+* 作为 [NPM 包](https://www.npmjs.com/package/dbgate-serve)或 [docker 镜像](https://hub.docker.com/r/dbgate/dbgate)运行 Web 版本
-## Supported databases
-* MySQL
-* PostgreSQL
-* SQL Server
-* Oracle (experimental)
-* MongoDB
-* Redis
-* SQLite
-* Amazon Redshift
-* CockroachDB
-* MariaDB
+## 支持的数据库
-
+* MySQL
+* PostgreSQL
+* SQL Server
+* Oracle (实验性)
+* MongoDB
+* Redis
+* SQLite
+* Amazon Redshift
+* CockroachDB
+* MariaDB
+ [](https://raw.githubusercontent.com/dbgate/dbgate/master/img/screenshot1.png)[ ](https://raw.githubusercontent.com/dbgate/dbgate/master/img/screenshot2.png)[ ](https://raw.githubusercontent.com/dbgate/dbgate/master/img/screenshot4.png)[](https://raw.githubusercontent.com/dbgate/dbgate/master/img/screenshot3.png)
-
-
-
-
-
-
-
-
-
-
-
-
+## 功能
-
+* 表格数据编辑,预览 SQL 更改脚本
+* 编辑表结构、索引、主键和外键
+* 比较和同步数据库结构
+* ER 图
+* 浅色和深色主题
+* 主/详细视图,外键查找
+* 查询设计器
+* 表格多列的舒适工作表单
+* MongoDB 集合的 JSON 视图
+* 探索表格、视图、过程、函数、MongoDB 集合
+* SQL 编辑器
+ * 执行 SQL 脚本
+ * SQL 代码格式化工具
+ * SQL 代码自动补全
+ * 添加 SQL 左/内/右连接实用工具
+* Mongo JavaScript 编辑器,执行 Mongo 脚本(使用 NodeJs 语法)
+* Redis 树形视图,从键生成脚本,运行 Redis 脚本
+* 可在 Windows、Linux 和 Mac 上作为应用程序运行。或在服务器上的 Docker 容器中,以及在客户端的网页浏览器中运行。
+* 从/到 CSV、Excel、JSON、NDJSON、XML 导入/导出
+* 免费表格编辑器 - 快速编辑表格数据(在导入/导出前清理数据,原型表格等)
+* 存档 - 在本地文件系统(或使用 Web 应用时在 DbGate 服务器上)以 NDJSON 文件备份您的数据
+* 图表,将图表导出到 HTML 页面
+* 有关详细信息,如何将 DbGate 运行在 Docker 容器中,请访问 [docker hub](https://hub.docker.com/r/dbgate/dbgate)
+* 可扩展插件架构
+* 视角 - 复杂关系数据的嵌套表格视图,MongoDB 数据库的查询设计器
-## Features
-* Table data editing, with SQL change script preview
-* Edit table schema, indexes, primary and foreign keys
-* Compare and synchronize database structure
-* ER diagram
-* Light and dark theme
-* Master/detail views, foreign key lookups
-* Query designer
-* Form view for comfortable work with tables with many columns
-* JSON view on MongoDB collections
-* Explore tables, views, procedures, functions, MongoDB collections
-* SQL editor
- * execute SQL script
- * SQL code formatter
- * SQL code completion
- * Add SQL LEFT/INNER/RIGHT join utility
-* Mongo JavaScript editor, execute Mongo script (with NodeJs syntax)
-* Redis tree view, generate script from keys, run Redis script
-* Runs as application for Windows, Linux and Mac. Or in Docker container on server and in web Browser on client.
-* Import, export from/to CSV, Excel, JSON, NDJSON, XML
-* Free table editor - quick table data editing (cleanup data after import/before export, prototype tables etc.)
-* Archives - backup your data in NDJSON files on local filesystem (or on DbGate server, when using web application)
-* Charts, export chart to HTML page
-* For detailed info, how to run DbGate in docker container, visit [docker hub](https://hub.docker.com/r/dbgate/dbgate)
-* Extensible plugin architecture
-* Perspectives - nested table view over complex relational data, query designer on MongoDB databases
+## 如何贡献
-## How to contribute
-Any contributions are welcome. If you want to contribute without coding, consider following:
+欢迎任何形式的贡献。如果您想在不编码的情况下做出贡献,请考虑以下方式:
-* Tell your friends about DbGate or share on social networks - when more people will use DbGate, it will grow to be better
-* Write review on [Slant.co](https://www.slant.co/improve/options/41086/~dbgate-review) or [G2](https://www.g2.com/products/dbgate/reviews)
-* Create issue, if you find problem in app, or you have idea to new feature. If issue already exists, you could leave comment on it, to prioritise most wanted issues
-* Create some tutorial video on [youtube](https://www.youtube.com/playlist?list=PLCo7KjCVXhr0RfUSjM9wJMsp_ShL1q61A)
-* Become a backer on [GitHub sponsors](https://github.com/sponsors/dbgate) or [Open collective](https://opencollective.com/dbgate)
-* Where a small coding is acceptable for you, you could [create plugin](https://dbgate.org/docs/plugin-development.html). Plugins for new themes can be created actually without JS coding
+* 告诉你的朋友关于 DbGate 或者在社会网络上分享——当更多的人使用 DbGate 时,它将变得更好
+* 在 [Slant.co](https://www.slant.co/improve/options/41086/~dbgate-review) 或 [G2](https://www.g2.com/products/dbgate/reviews) 上写评论
+* 如果你在应用中遇到问题,或者有新功能的想法,请创建问题。如果问题已经存在,你可以在它上面留言,以优先处理最需要的议题
+* 在 [youtube](https://www.youtube.com/playlist?list=PLCo7KjCVXhr0RfUSjM9wJMsp_ShL1q61A) 上创建一些教程视频
+* 成为 GitHub sponsors [赞助者](https://github.com/sponsors/dbgate)或 [Open collective](https://opencollective.com/dbgate) 的资助者
+* 在你能够接受少量编码的情况下,你可以[创建插件](https://dbgate.org/docs/plugin-development.html) 。实际上,为新的主题创建插件无需 JS 编码
-Thank you!
+谢谢!
-## Why is DbGate different
-There are many database managers now, so why DbGate?
-* Works everywhere - Windows, Linux, Mac, Web browser (+mobile web is planned), without compromises in features
-* Based on standalone NPM packages, scripts can be run without DbGate (example - [CSV export](https://www.npmjs.com/package/dbgate-plugin-csv) )
-* Many data browsing functions based using foreign keys - master/detail, expand columns, expandable form view
+## DbGate 有什么不同?
-## Design goals
-* Application simplicity - DbGate takes the best and only the best from old DbGate, [DatAdmin](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DatAdmin-Personal.shtml), [DbMouse](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DbMouse.shtml) and [SQL Database Studio](https://en.wikipedia.org/wiki/SQL_Database_Studio)
-* Minimal dependencies
- * Frontend - Svelte
- * Backend - NodeJs, ExpressJs, database connection drivers
- * JavaScript + TypeScript
- * App - electron
-* Platform independent - runs as web application in single docker container on server, or as application using Electron platform on Linux, Windows and Mac
+现在有很多数据库管理器,那么为什么选择 DbGate?
-
+* 应用简洁性 - DbGate 汲取了旧版 DbGate、 [DatAdmin](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DatAdmin-Personal.shtml)、 [DbMouse](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DbMouse.shtml) 和 [SQL Database Studio](https://en.wikipedia.org/wiki/SQL_Database_Studio) 中的最佳元素,仅取其精华
+* 最小化依赖
+ * 前端 - Svelte
+ * 后端 - NodeJs, ExpressJs, 数据库连接驱动
+ * JavaScript + TypeScript
+ * 应用 - electron
+* 平台无关 - 服务器上作为单个 Docker 容器中的 Web 应用运行,或作为使用 Electron 平台的 Linux、Windows 和 Mac 上的应用程序运行
-## How to run development environment
+## 如何运行开发环境
+
+简单版本 - 运行 WEB 应用:
-Simple variant - runs WEB application:
```sh
yarn
yarn start
```
-If you want more control, run WEB application:
+如果您想有更多控制权,运行 WEB 应用:
+
```sh
yarn # install NPM packages
```
-And than run following 3 commands concurrently in 3 terminals:
+然后在3个终端中同时运行以下3个命令:
+
```
yarn start:api # run API on port 3000
yarn start:web # run web on port 5001
yarn lib # watch typescript libraries and plugins modifications
```
-This runs API on port 3000 and web application on port 5001
-Open http://localhost:5001 in your browser
-If you want to run electron app:
+在端口 3000 上运行 API,在端口 5001 上运行 Web 应用
+在您的浏览器中打开 [http://localhost:5001](http://localhost:5001)
+
+如果您想运行 electron 应用:
+
```sh
yarn # install NPM packages
cd app
yarn # install NPM packages for electron
```
-And than run following 3 commands concurrently in 3 terminals:
+然后在3个终端中同时运行以下3个命令:
+
```
yarn start:web # run web on port 5001 (only static JS and HTML files)
yarn lib # watch typescript libraries and plugins modifications
yarn start:app # run electron app
```
-## How to run built electron app locally
-This mode is very similar to production run of electron app. Electron doesn't use localhost:5001.
+## 如何在本地运行构建的 electron 应用
+
+此模式与 electron 应用的生成运行非常相似。Electron 不使用 localhost:5001。
```sh
cd app
@@ -163,10 +143,11 @@ yarn build:app:local
yarn start:app:local
```
-## How to create plugin
-Creating plugin is described in [documentation](https://github.com/dbgate/dbgate/wiki/Plugin-development)
+## 如何创建插件
-But it is very simple:
+创建插件在[文档](https://github.com/dbgate/dbgate/wiki/Plugin-development)中有描述
+
+但是很简单:
```sh
npm install -g yo # install yeoman
@@ -175,7 +156,8 @@ cd dbgate-plugin-my-new-plugin # this directory is created by wizard, edit, what
yarn plugin # this compiles plugin and copies it into existing DbGate installation
```
-After restarting DbGate, you could use your new plugin from DbGate.
+重启 DbGate 后,您就可以从 DbGate 使用您的新插件。
-## Logging
-DbGate uses [pinomin logger](https://github.com/dbgate/pinomin). So by default, it produces JSON log messages into console and log files. If you want to see formatted logs, please use [pino-pretty](https://github.com/pinojs/pino-pretty) log formatter.
\ No newline at end of file
+## 日志记录
+
+DbGate 使用 [pinomin logger](https://github.com/dbgate/pinomin)。因此,默认情况下,它将 JSON 日志消息输出到控制台和日志文件中。如果您想查看格式化的日志,请使用 [pino-pretty](https://github.com/pinojs/pino-pretty) 日志格式化器。
\ No newline at end of file
diff --git a/apps/dbgate/README_en.md b/apps/dbgate/README_en.md
new file mode 100644
index 000000000..9f728a449
--- /dev/null
+++ b/apps/dbgate/README_en.md
@@ -0,0 +1,181 @@
+[](https://www.npmjs.com/package/dbgate-serve)
+
+[](https://snapcraft.io/dbgate)
+[](https://snapcraft.io/dbgate)
+[](https://github.com/prettier/prettier)
+
+
+
+# DbGate - (no)SQL database client
+
+DbGate is cross-platform database manager.
+It's designed to be simple to use and effective, when working with more databases simultaneously.
+But there are also many advanced features like schema compare, visual query designer, chart visualisation or batch export and import.
+
+DbGate is licensed under MIT license and is completely free.
+
+* Try it online - [demo.dbgate.org](https://demo.dbgate.org) - online demo application
+* **Download** application for Windows, Linux or Mac from [dbgate.org](https://dbgate.org/download/)
+* Run web version as [NPM package](https://www.npmjs.com/package/dbgate-serve) or as [docker image](https://hub.docker.com/r/dbgate/dbgate)
+
+## Supported databases
+* MySQL
+* PostgreSQL
+* SQL Server
+* Oracle (experimental)
+* MongoDB
+* Redis
+* SQLite
+* Amazon Redshift
+* CockroachDB
+* MariaDB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Features
+* Table data editing, with SQL change script preview
+* Edit table schema, indexes, primary and foreign keys
+* Compare and synchronize database structure
+* ER diagram
+* Light and dark theme
+* Master/detail views, foreign key lookups
+* Query designer
+* Form view for comfortable work with tables with many columns
+* JSON view on MongoDB collections
+* Explore tables, views, procedures, functions, MongoDB collections
+* SQL editor
+ * execute SQL script
+ * SQL code formatter
+ * SQL code completion
+ * Add SQL LEFT/INNER/RIGHT join utility
+* Mongo JavaScript editor, execute Mongo script (with NodeJs syntax)
+* Redis tree view, generate script from keys, run Redis script
+* Runs as application for Windows, Linux and Mac. Or in Docker container on server and in web Browser on client.
+* Import, export from/to CSV, Excel, JSON, NDJSON, XML
+* Free table editor - quick table data editing (cleanup data after import/before export, prototype tables etc.)
+* Archives - backup your data in NDJSON files on local filesystem (or on DbGate server, when using web application)
+* Charts, export chart to HTML page
+* For detailed info, how to run DbGate in docker container, visit [docker hub](https://hub.docker.com/r/dbgate/dbgate)
+* Extensible plugin architecture
+* Perspectives - nested table view over complex relational data, query designer on MongoDB databases
+
+## How to contribute
+Any contributions are welcome. If you want to contribute without coding, consider following:
+
+* Tell your friends about DbGate or share on social networks - when more people will use DbGate, it will grow to be better
+* Write review on [Slant.co](https://www.slant.co/improve/options/41086/~dbgate-review) or [G2](https://www.g2.com/products/dbgate/reviews)
+* Create issue, if you find problem in app, or you have idea to new feature. If issue already exists, you could leave comment on it, to prioritise most wanted issues
+* Create some tutorial video on [youtube](https://www.youtube.com/playlist?list=PLCo7KjCVXhr0RfUSjM9wJMsp_ShL1q61A)
+* Become a backer on [GitHub sponsors](https://github.com/sponsors/dbgate) or [Open collective](https://opencollective.com/dbgate)
+* Where a small coding is acceptable for you, you could [create plugin](https://dbgate.org/docs/plugin-development.html). Plugins for new themes can be created actually without JS coding
+
+Thank you!
+
+## Why is DbGate different
+There are many database managers now, so why DbGate?
+* Works everywhere - Windows, Linux, Mac, Web browser (+mobile web is planned), without compromises in features
+* Based on standalone NPM packages, scripts can be run without DbGate (example - [CSV export](https://www.npmjs.com/package/dbgate-plugin-csv) )
+* Many data browsing functions based using foreign keys - master/detail, expand columns, expandable form view
+
+## Design goals
+* Application simplicity - DbGate takes the best and only the best from old DbGate, [DatAdmin](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DatAdmin-Personal.shtml), [DbMouse](https://www.softpedia.com/get/Internet/Servers/Database-Utils/DbMouse.shtml) and [SQL Database Studio](https://en.wikipedia.org/wiki/SQL_Database_Studio)
+* Minimal dependencies
+ * Frontend - Svelte
+ * Backend - NodeJs, ExpressJs, database connection drivers
+ * JavaScript + TypeScript
+ * App - electron
+* Platform independent - runs as web application in single docker container on server, or as application using Electron platform on Linux, Windows and Mac
+
+
+
+## How to run development environment
+
+Simple variant - runs WEB application:
+```sh
+yarn
+yarn start
+```
+
+If you want more control, run WEB application:
+```sh
+yarn # install NPM packages
+```
+
+And than run following 3 commands concurrently in 3 terminals:
+```
+yarn start:api # run API on port 3000
+yarn start:web # run web on port 5001
+yarn lib # watch typescript libraries and plugins modifications
+```
+This runs API on port 3000 and web application on port 5001
+Open http://localhost:5001 in your browser
+
+If you want to run electron app:
+```sh
+yarn # install NPM packages
+cd app
+yarn # install NPM packages for electron
+```
+
+And than run following 3 commands concurrently in 3 terminals:
+```
+yarn start:web # run web on port 5001 (only static JS and HTML files)
+yarn lib # watch typescript libraries and plugins modifications
+yarn start:app # run electron app
+```
+
+## How to run built electron app locally
+This mode is very similar to production run of electron app. Electron doesn't use localhost:5001.
+
+```sh
+cd app
+yarn
+```
+
+```sh
+yarn
+yarn build:app:local
+yarn start:app:local
+```
+
+## How to create plugin
+Creating plugin is described in [documentation](https://github.com/dbgate/dbgate/wiki/Plugin-development)
+
+But it is very simple:
+
+```sh
+npm install -g yo # install yeoman
+npm install -g generator-dbgate # install dbgate generator
+cd dbgate-plugin-my-new-plugin # this directory is created by wizard, edit, what you need to change
+yarn plugin # this compiles plugin and copies it into existing DbGate installation
+```
+
+After restarting DbGate, you could use your new plugin from DbGate.
+
+## Logging
+DbGate uses [pinomin logger](https://github.com/dbgate/pinomin). So by default, it produces JSON log messages into console and log files. If you want to see formatted logs, please use [pino-pretty](https://github.com/pinojs/pino-pretty) log formatter.
\ No newline at end of file
diff --git a/apps/docker-lxc/README.md b/apps/docker-lxc/README.md
index 2ae8ff5c8..f723be91b 100644
--- a/apps/docker-lxc/README.md
+++ b/apps/docker-lxc/README.md
@@ -1,41 +1,40 @@
-# Running stateful linux containers in docker 
+# 运行具有状态的 Linux 容器在 Docker 中
-> :warning: This is a complete rewrite, using LXC only without vagrant. It is able to run LXC containers created with v0.1 but
-> config and usage differs. Use tag v0.1 to get the old version.
+> :warning: 这是一个完整的重写,仅使用 LXC,不使用 vagrant。它可以运行使用 v0.1 创建的 LXC 容器,但配置和使用方式不同。使用标签 v0.1 获取旧版本。
-Docker Hub: [micwy/lxc](https://hub.docker.com/r/micwy/lxc)
+Docker Hub: [micwy/lxc](https://hub.docker.com/r/micwy/lxc)
-I'm very impressed, how much pulls this image gets. Please let me know how you use this (just create an issue at github), I'll add this to the "Use-Cases" section.
+我非常惊讶,这个镜像的拉取次数有多少。请告诉我你是如何使用它的(只需在 github 上创建一个问题),我会将其添加到“用例”部分。
-## Why?
+## 为什么?
-In some cases, it might be usefull to run full-blown operating systems in a docker environment which have "state", primarily meaning to have a persitent root volume. With docker only, this is not possible since docker does not allow / to be a volume. This is where LXC comes into play. LXC provides a process isolation similar to docker but with statefull root filesystems. Unfortunately, with the rise of docker, management tools for docker are much more widespread and sophisticated than those for LXC.
+在某些情况下,在具有“状态”的 docker 环境中运行完整的操作系统可能很有用,这主要意味着拥有一个持久的根卷。仅使用 docker 是不可能的,因为 docker 不允许/成为一个卷。这就是 LXC 发挥作用的地方。LXC 提供与 docker 类似的过程隔离,但具有状态化的根文件系统。不幸的是,随着 docker 的兴起,docker 的管理工具比 LXC 的管理工具更为广泛和复杂。
-This project allows to use a single LXC container within a docker container to get best of both worlds.
+这个项目允许在 docker 容器内使用单个 LXC 容器,以获得两者的最佳效果。
-## Features
+## 功能
-* Runs a single LXC container in docker with full OS and persistent root
-* Use features unique to docker for your lxc containers (e.g. docker-compose, exposed ports, traefik for ingress, kubernetes as platform)
-* The LXC container uses the same limits and network stack as the docker container, so things like exposed ports works as expected
-* Proper signal handling in both directions (shutting down the docker container properly shuts down the LXC container. Poweroff in LXC shuts down the docker container)
-* LXCFS support: Within the container, uptime and limits are displayed correctly
-* Shell-Wrapper: If /bin/sh is invoked with "docker exec", a shell in the LXC container is spawned. So a console in most management tools opens directly within the LXC container, not in the surrounding docker container
-* Creation of initial root filesystems: for some distributions, an initial root filesystem can simply be set up, using an environment variable
-* Adding of initial SSH key via environment variable to get instant log-in
+* 在 docker 中运行单个 LXC 容器,具有完整的操作系统和持久的根
+* 使用 docker 特有的功能为您的 LXC 容器(例如:docker-compose、暴露端口、traefik 用于入口、Kubernetes 作为平台)
+* LXC 容器使用与 docker 容器相同的限制和网络堆栈,因此像暴露端口这样的功能按预期工作
+* 双向正确的信号处理(正确关闭 docker 容器可以正确关闭 LXC 容器。在 LXC 中关机可以关闭 docker 容器)
+* LXCFS 支持:在容器内,显示正确的运行时间和限制
+* Shell-Wrapper:如果使用“docker exec”调用/bin/sh,则会在 LXC 容器中启动一个 shell。因此,大多数管理工具中的控制台会直接在 LXC 容器内打开,而不是在周围的 docker 容器中
+* 创建初始根文件系统:对于某些发行版,可以通过环境变量简单地设置初始根文件系统
+* 通过环境变量添加初始 SSH 密钥以实现即时登录
-### Some Use-Cases
+### 一些用例
-* Provide "home containers" for your users, each with own ssh access and persistent state
-* Run a linux remote desktop server on kubernetes
-* Easily run statefull software (like froxlor control panel or plesk) on docker/kubernetes
+* 为您的用户提供“家庭容器”,每个容器都有自己的 ssh 访问权限和持久状态
+* 在 Kubernetes 上运行 Linux 远程桌面服务器
+* 轻松在 Docker/Kubernetes 上运行有状态软件(如 froxlor 控制面板或 plesk)
-### Ideas / Backlog
+### 想法 / 待办事项
-* Support more distribution root filesystems
-* Import rootfs from vagrant-lxc boxes
+* 支持更多分发根文件系统
+* 从 vagrant-lxc 盒子导入 rootfs
-## How to run
+## 如何运行
```
docker run -d \
@@ -47,15 +46,15 @@ docker run -d \
-e DISTRIBUTION=alpine \
-e INITIAL_SSH_KEY="ssh-rsa AAAA...Q== my-initial-ssh-key" \
micwy/lxc
- ```
+```
-* "privileged" is currently required to run LXC on the container
-* The hostname is passed into the lxc container
-* The volume /data contains the root filesystem (under /data/rootfs) and some additional files (temporary root fs during system creation, lxc config)
+* 目前运行 LXC 在容器中需要"privileged"权限
+* 主机名传递到 lxc 容器
+* 卷/data 包含根文件系统(位于/data/rootfs)和一些附加文件(系统创建期间的临时根文件系统,lxc 配置)
-### Running on Kubernetes
+### 运行于 Kubernetes
-Here's an example yaml to run this on kubernetes. If there's some interest, I can also provide a helm chart.
+以下是一个在 Kubernetes 上运行的 yaml 示例。如果有兴趣,我也可以提供 helm 图表。
```
---
@@ -114,41 +113,45 @@ spec:
```
-### Environment variables
+### 环境变量
-* DISTRIBUTION: triggers a distribution specific setup script if /data/rootfs does not exist (see below)
-* INITIAL_SSH_KEY: if set, it is copied to /root/.ssh/authorized keys on startup if that file does not exist yet
-* USE_LXCFS (default false): if true, mount [LXCFS](https://github.com/lxc/lxcfs) into the LXC container
- * :warning: May not work with systemd!
-* COPY_RESOLV_CONF (default true): if true, copy resolv.conf from docker container into the LXC container
+* DISTRIBUTION:如果/data/rootfs 不存在,则触发特定分布的设置脚本(见下文)
+* INITIAL\_SSH\_KEY:如果设置,则在启动时将其复制到/root/.ssh/authorized\_keys,如果该文件尚不存在
+* USE\_LXCFS(默认为 false):如果为 true,则将 [LXCFS](https://github.com/lxc/lxcfs) 挂载到 LXC 容器中
+ * :warning: 可能与 systemd 不兼容!
+* COPY\_RESOLV\_CONF(默认为 true):如果为 true,则将 docker 容器中的 resolv.conf 复制到 LXC 容器中
-### Additional volumes
+### 附加卷
-* the directory /vol of the docker container is mounted with "rbind" into /vol on the LXC container
-* Every docker-volume that is mounted to /vol/something will appear as /vol/something on LXC
+* docker 容器的目录/vol 使用“rbind”挂载到 LXC 容器的/vol 上
+* 每个挂载到/vol/something 的 docker-volume 将显示为/vol/something 在 LXC 上
-### Available distribution setup scripts
+### 可用的分发设置脚本
#### DISTRIBUTION: alpine
-Installs alpine if rootfs does not exist.
+如果 rootfs 不存在,则安装 alpine。
-Features:
-* Quite minimal image with bash, nano and openssh
+特性:
-Supported environment variables:
-* ALPINE_ARCH: (default x86_64): architecture of the rootfs
-* ALPINE_VERSION: (default latest-stable): alpine version to install
-* ALPINE_EXTRA_PACKAGES: additional packages to install along with the rootfs
+* 非常简约的 bash、nano 和 openssh 图像
-#### DISTRIBUTION: archlinux
+支持的环镜变量:
-Installs archlinux if rootfs does not exist.
+* ALPINE\_ARCH:(默认 x86\_64):rootfs 的架构
+* ALPINE\_VERSION: (默认最新稳定版): 安装的 alpine 版本
+* ALPINE\_EXTRA\_PACKAGES: 伴随 rootfs 一起安装的额外软件包
-Features:
-* Basic system image with common tools and openssh
+#### 分发:archlinux
-Supported environment variables:
-* ARCHLINUX_INSTALL_TRIZEN: (default: true): if true, install the trizen package manager for AUR packages
-* ARCHLINUX_EXTRA_PACKAGES: additional packages to install along with the rootfs. Installation will be run with trizen if installed, otherwise with pacman
-* ARCHLINUX_MIRRORLIST_COUNTRY (default: Germany - I confess, I'm biased): Country to use for create an initial packman mirror list
+如果 rootfs 不存在,则安装 archlinux。
+
+特性:
+
+* 基本系统镜像,包含常用工具和 openssh
+
+支持的环镜变量:
+
+* ARCHLINUX\_INSTALL\_TRIZEN: (默认:true):如果为 true,则为 AUR 软件包安装 trizen 包管理器
+* ARCHLINUX\_EXTRA\_PACKAGES:与 rootfs 一起安装的附加包。如果已安装,将使用 trizen 运行安装,否则使用 pacman。
+* ARCHLINUX\_MIRRORLIST\_COUNTRY(默认:德国 - 我必须承认,我有偏见):用于创建初始 packman 镜像列表的国家。
\ No newline at end of file
diff --git a/apps/docker-lxc/README_en.md b/apps/docker-lxc/README_en.md
new file mode 100644
index 000000000..2ae8ff5c8
--- /dev/null
+++ b/apps/docker-lxc/README_en.md
@@ -0,0 +1,154 @@
+# Running stateful linux containers in docker 
+
+> :warning: This is a complete rewrite, using LXC only without vagrant. It is able to run LXC containers created with v0.1 but
+> config and usage differs. Use tag v0.1 to get the old version.
+
+Docker Hub: [micwy/lxc](https://hub.docker.com/r/micwy/lxc)
+
+I'm very impressed, how much pulls this image gets. Please let me know how you use this (just create an issue at github), I'll add this to the "Use-Cases" section.
+
+## Why?
+
+In some cases, it might be usefull to run full-blown operating systems in a docker environment which have "state", primarily meaning to have a persitent root volume. With docker only, this is not possible since docker does not allow / to be a volume. This is where LXC comes into play. LXC provides a process isolation similar to docker but with statefull root filesystems. Unfortunately, with the rise of docker, management tools for docker are much more widespread and sophisticated than those for LXC.
+
+This project allows to use a single LXC container within a docker container to get best of both worlds.
+
+## Features
+
+* Runs a single LXC container in docker with full OS and persistent root
+* Use features unique to docker for your lxc containers (e.g. docker-compose, exposed ports, traefik for ingress, kubernetes as platform)
+* The LXC container uses the same limits and network stack as the docker container, so things like exposed ports works as expected
+* Proper signal handling in both directions (shutting down the docker container properly shuts down the LXC container. Poweroff in LXC shuts down the docker container)
+* LXCFS support: Within the container, uptime and limits are displayed correctly
+* Shell-Wrapper: If /bin/sh is invoked with "docker exec", a shell in the LXC container is spawned. So a console in most management tools opens directly within the LXC container, not in the surrounding docker container
+* Creation of initial root filesystems: for some distributions, an initial root filesystem can simply be set up, using an environment variable
+* Adding of initial SSH key via environment variable to get instant log-in
+
+### Some Use-Cases
+
+* Provide "home containers" for your users, each with own ssh access and persistent state
+* Run a linux remote desktop server on kubernetes
+* Easily run statefull software (like froxlor control panel or plesk) on docker/kubernetes
+
+### Ideas / Backlog
+
+* Support more distribution root filesystems
+* Import rootfs from vagrant-lxc boxes
+
+## How to run
+
+```
+docker run -d \
+ --name lxc \
+ --privileged \
+ --hostname lxctest1 \
+ -v /path/to/data:/data \
+ -v /path/to/somedir:/vol/somedir \
+ -e DISTRIBUTION=alpine \
+ -e INITIAL_SSH_KEY="ssh-rsa AAAA...Q== my-initial-ssh-key" \
+ micwy/lxc
+ ```
+
+* "privileged" is currently required to run LXC on the container
+* The hostname is passed into the lxc container
+* The volume /data contains the root filesystem (under /data/rootfs) and some additional files (temporary root fs during system creation, lxc config)
+
+### Running on Kubernetes
+
+Here's an example yaml to run this on kubernetes. If there's some interest, I can also provide a helm chart.
+
+```
+---
+# Source: lxc/templates/deployment.yaml
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: mylxcbox
+ labels:
+ app.kubernetes.io/name: lxc
+ app.kubernetes.io/instance: mylxcbox
+spec:
+ replicas:
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: lxc
+ app.kubernetes.io/instance: mylxcbox
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: lxc
+ app.kubernetes.io/instance: mylxcbox
+ spec:
+ containers:
+ - name: lxc
+ image: "micwy/lxc:latest"
+ imagePullPolicy: Always
+ # Required to launch lxc containers in the docker container
+ securityContext:
+ privileged: true
+ # Required to make LXC console work
+ stdin: true
+ tty: true
+ ports:
+ - name: ssh
+ containerPort: 22
+ protocol: TCP
+ hostPort: 2201
+ env:
+ - name: "DISTRIBUTION"
+ value: "archlinux"
+ - name: "INITIAL_SSH_KEY"
+ value: "ssh-rsa ...DVs= my-ssh-key"
+ volumeMounts:
+ - mountPath: /data
+ name: data
+ # Will be passed into the lxc container
+ hostname: mylxcbox
+ volumes:
+ - name: data
+ hostPath:
+ path: /data/mylxcbox
+ # Strategy must be recreate if hostPort is used
+ strategy:
+ type: Recreate
+
+```
+
+### Environment variables
+
+* DISTRIBUTION: triggers a distribution specific setup script if /data/rootfs does not exist (see below)
+* INITIAL_SSH_KEY: if set, it is copied to /root/.ssh/authorized keys on startup if that file does not exist yet
+* USE_LXCFS (default false): if true, mount [LXCFS](https://github.com/lxc/lxcfs) into the LXC container
+ * :warning: May not work with systemd!
+* COPY_RESOLV_CONF (default true): if true, copy resolv.conf from docker container into the LXC container
+
+### Additional volumes
+
+* the directory /vol of the docker container is mounted with "rbind" into /vol on the LXC container
+* Every docker-volume that is mounted to /vol/something will appear as /vol/something on LXC
+
+### Available distribution setup scripts
+
+#### DISTRIBUTION: alpine
+
+Installs alpine if rootfs does not exist.
+
+Features:
+* Quite minimal image with bash, nano and openssh
+
+Supported environment variables:
+* ALPINE_ARCH: (default x86_64): architecture of the rootfs
+* ALPINE_VERSION: (default latest-stable): alpine version to install
+* ALPINE_EXTRA_PACKAGES: additional packages to install along with the rootfs
+
+#### DISTRIBUTION: archlinux
+
+Installs archlinux if rootfs does not exist.
+
+Features:
+* Basic system image with common tools and openssh
+
+Supported environment variables:
+* ARCHLINUX_INSTALL_TRIZEN: (default: true): if true, install the trizen package manager for AUR packages
+* ARCHLINUX_EXTRA_PACKAGES: additional packages to install along with the rootfs. Installation will be run with trizen if installed, otherwise with pacman
+* ARCHLINUX_MIRRORLIST_COUNTRY (default: Germany - I confess, I'm biased): Country to use for create an initial packman mirror list
diff --git a/apps/dockge/README.md b/apps/dockge/README.md
index 1f18756a3..0508b34e0 100644
--- a/apps/dockge/README.md
+++ b/apps/dockge/README.md
@@ -1,57 +1,54 @@
-
-
-
+
# Dockge
-A fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.
+一个花哨、易于使用且反应灵敏的自托管 docker compose.yaml 堆栈式管理器。
   
-
+
-View Video: https://youtu.be/AWAlOQeNpgU?t=48
+观看视频:\[https://youtu.be/AWAlOQeNpgU?t=48\](https://youtu.be/AWAlOQeNpgU?t=48)
-## ⭐ Features
-
-- Manage `compose.yaml`
- - Create/Edit/Start/Stop/Restart/Delete
- - Update Docker Images
-- Interactive Editor for `compose.yaml`
-- Interactive Web Terminal
-- Reactive
- - Everything is just responsive. Progress (Pull/Up/Down) and terminal output are in real-time
-- Easy-to-use & fancy UI
- - If you love Uptime Kuma's UI/UX, you will love this one too
-- Convert `docker run ...` commands into `compose.yaml`
-- File based structure
- - Dockge won't kidnap your compose files, they are stored on your drive as usual. You can interact with them using normal `docker compose` commands
-
+## ⭐ 特点
+* 管理 `compose.yaml`
+ * 创建/编辑/启动/停止/重启/删除
+ * 更新 Docker 镜像
+* `compose.yaml` 的交互式编辑器
+* 交互式网络终端
+* 响应式
+ * 一切都很响应。进度(下拉/上拉)和终端输出都是实时的
+* 易于使用且界面精美
+ * 如果你喜欢 Uptime Kuma 的 UI/UX,你也会喜欢这个
+* 将 `docker run ...` 命令转换为 `compose.yaml`
+* 基于文件的架构
+ * Docker 不会绑架你的 compose 文件,它们会像往常一样存储在你的驱动器上。你可以使用正常的 `docker compose` 命令与之交互

-## 🔧 How to Install
+## 🔧 如何安装
-Requirements:
-- [Docker](https://docs.docker.com/engine/install/) 20+ / Podman
-- (Podman only) podman-docker (Debian: `apt install podman-docker`)
-- OS:
- - Major Linux distros that can run Docker/Podman such as:
- - ✅ Ubuntu
- - ✅ Debian (Bullseye or newer)
- - ✅ Raspbian (Bullseye or newer)
- - ✅ CentOS
- - ✅ Fedora
- - ✅ ArchLinux
- - ❌ Debian/Raspbian Buster or lower is not supported
- - ❌ Windows (Will be supported later)
-- Arch: armv7, arm64, amd64 (a.k.a x86_64)
+要求:
-### Basic
+* [Docker](https://docs.docker.com/engine/install/) 20+ / Podman
+* (仅限 Podman)podman-docker(Debian:`apt install podman-docker`)
+* 操作系统:
+ * 可以运行 Docker/Podman 的主要 Linux 发行版,例如:
+ * ✅ Ubuntu
+ * ✅ Debian(Bullseye 或更新版)
+ * ✅ Raspbian(Bullseye 或更新版)
+ * ✅ CentOS
+ * ✅ Fedora
+ * ✅ ArchLinux
+ * ❌ Debian/Raspbian Buster 或更低版本不受支持
+ * ❌ Windows(将稍后支持)
+* 架构:armv7, arm64, amd64(即 x86\_64)
-- Default Stacks Directory: `/opt/stacks`
-- Default Port: 5001
+### 基本
+
+* 默认栈目录:`/opt/stacks`
+* 默认端口:5001
```
# Create directories that store your stacks and stores Dockge's stack
@@ -68,98 +65,97 @@ docker compose up -d
# docker-compose up -d
```
-Dockge is now running on http://localhost:5001
+Dockge 现在运行在 [http://localhost:5001](http://localhost:5001)
-### Advanced
+### 高级
-If you want to store your stacks in another directory, you can generate your compose.yaml file by using the following URL with custom query strings.
+如果您想将栈存储在其他目录,可以使用以下带有自定义查询字符串的 URL 生成您的 compose.yaml 文件。
```
# Download your compose.yaml
curl "https://dockge.kuma.pet/compose.yaml?port=5001&stacksPath=/opt/stacks" --output compose.yaml
```
-- port=`5001`
-- stacksPath=`/opt/stacks`
+* port=`5001`
+* stacksPath=`/opt/stacks`
-Interactive compose.yaml generator is available on:
-https://dockge.kuma.pet
+交互式 compose.yaml 生成器可在以下网址获取: [https://dockge.kuma.pet](https://dockge.kuma.pet)
-## How to Update
+## 如何更新
```bash
cd /opt/dockge
docker compose pull && docker compose up -d
```
-## Screenshots
+## 屏幕截图

-



+## 动机
-## Motivations
+* 我已经使用 Portainer 一段时间了,但在堆栈管理方面,我有时对其不太满意。例如,有时我尝试部署堆栈时,加载图标会空转几分钟而没有进展。有时错误信息也不清晰。
+* 尝试使用 ES 模块 + TypeScript 进行开发(最初,我计划使用 Deno 或 Bun.js,但它们不支持 arm64,所以我退回到 Node.js)
-- I have been using Portainer for some time, but for the stack management, I am sometimes not satisfied with it. For example, sometimes when I try to deploy a stack, the loading icon keeps spinning for a few minutes without progress. And sometimes error messages are not clear.
-- Try to develop with ES Module + TypeScript (Originally, I planned to use Deno or Bun.js, but they don't have support for arm64, so I stepped back to Node.js)
+如果您喜欢这个项目,请考虑给它一个⭐。
-If you love this project, please consider giving it a ⭐.
+## 🗣️ 社区和贡献
+### 错误报告
-## 🗣️ Community and Contribution
+[https://github.com/louislam/dockge/issues](https://github.com/louislam/dockge/issues)
-### Bug Report
-https://github.com/louislam/dockge/issues
+### 寻求帮助/讨论
-### Ask for Help / Discussions
-https://github.com/louislam/dockge/discussions
+[https://github.com/louislam/dockge/discussions](https://github.com/louislam/dockge/discussions)
### Translation
-If you want to translate Dockge into your language, please read [Translation Guide](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md)
-### Create a Pull Request
+如果您想将 Dockge 翻译成您的语言,请阅读[翻译指南](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md)
-Be sure to read the [guide](https://github.com/louislam/dockge/blob/master/CONTRIBUTING.md), as we don't accept all types of pull requests and don't want to waste your time.
+### 创建一个拉取请求
-## FAQ
+请务必阅读[指南](https://github.com/louislam/dockge/blob/master/CONTRIBUTING.md) ,因为我们不接受所有类型的拉取请求,也不希望浪费您的时间。
+
+## 常见问题
#### "Dockge"?
-"Dockge" is a coinage word which is created by myself. I originally hoped it sounds like `Dodge`, but apparently many people called it `Dockage`, it is also acceptable.
+"Dockge" 是一个我创造的合成词。我最初希望它听起来像 `Dodge`,但显然很多人称之为 `Dockage`,这也是可以接受的。
-The naming idea came from Twitch emotes like `sadge`, `bedge` or `wokege`. They all end in `-ge`.
+命名灵感来自 Twitch 表情包,如 `sadge`、`bedge` 或 `wokege`。它们都以 `-ge` 结尾。
-#### Can I manage a single container without `compose.yaml`?
+#### 我能否在不使用 `compose.yaml` 的情况下管理单个容器?
-The main objective of Dockge is to try to use the docker `compose.yaml` for everything. If you want to manage a single container, you can just use Portainer or Docker CLI.
+Dockge 的主要目标是尝试使用 docker `compose.yaml` 来处理所有事情。如果您只想管理单个容器,您可以直接使用 Portainer 或 Docker CLI。
-#### Can I manage existing stacks?
+#### 我能管理现有的堆栈吗?
-Yes, you can. However, you need to move your compose file into the stacks directory:
+是的,您可以。但是,您需要将您的 compose 文件移动到堆栈目录:
-1. Stop your stack
-2. Move your compose file into `/opt/stacks//compose.yaml`
-3. In Dockge, click the " Scan Stacks Folder" button in the top-right corner's dropdown menu
-4. Now you should see your stack in the list
+1. 停止您的堆栈
+2. 将你的 compose 文件移动到 `/opt/stacks//compose.yaml`
+3. 在 Dockge 中,点击右上角下拉菜单中的“扫描堆叠文件夹”按钮
+4. 现在你应该能在列表中看到你的堆叠
-#### Is Dockge a Portainer replacement?
+#### Dockge 是 Portainer 的替代品吗?
-Yes or no. Portainer provides a lot of Docker features. While Dockge is currently only focusing on docker-compose with a better user interface and better user experience.
+是的或否。Portainer 提供了许多 Docker 功能。而 Dockge 目前仅专注于 docker-compose,拥有更好的用户界面和用户体验。
-If you want to manage your container with docker-compose only, the answer may be yes.
+如果您只想使用 docker-compose 来管理容器,答案可能是“是”。
-If you still need to manage something like docker networks, single containers, the answer may be no.
+如果您还需要管理像 docker 网络、单个容器这样的功能,答案可能是“否”。
-#### Can I install both Dockge and Portainer?
+#### 我能否同时安装 Dockge 和 Portainer?
-Yes, you can.
+是的,你可以。
-## Others
+## 其他人
-Dockge is built on top of [Compose V2](https://docs.docker.com/compose/migrate/). `compose.yaml` also known as `docker-compose.yml`.
\ No newline at end of file
+Dockge 是基于 [Compose V2](https://docs.docker.com/compose/migrate/) 构建的。 `compose.yaml` 也称为 `docker-compose.yml`。
\ No newline at end of file
diff --git a/apps/dockge/README_en.md b/apps/dockge/README_en.md
new file mode 100644
index 000000000..1f18756a3
--- /dev/null
+++ b/apps/dockge/README_en.md
@@ -0,0 +1,165 @@
+
+
+
+
+# Dockge
+
+A fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.
+
+   
+
+
+
+View Video: https://youtu.be/AWAlOQeNpgU?t=48
+
+## ⭐ Features
+
+- Manage `compose.yaml`
+ - Create/Edit/Start/Stop/Restart/Delete
+ - Update Docker Images
+- Interactive Editor for `compose.yaml`
+- Interactive Web Terminal
+- Reactive
+ - Everything is just responsive. Progress (Pull/Up/Down) and terminal output are in real-time
+- Easy-to-use & fancy UI
+ - If you love Uptime Kuma's UI/UX, you will love this one too
+- Convert `docker run ...` commands into `compose.yaml`
+- File based structure
+ - Dockge won't kidnap your compose files, they are stored on your drive as usual. You can interact with them using normal `docker compose` commands
+
+
+
+
+
+## 🔧 How to Install
+
+Requirements:
+- [Docker](https://docs.docker.com/engine/install/) 20+ / Podman
+- (Podman only) podman-docker (Debian: `apt install podman-docker`)
+- OS:
+ - Major Linux distros that can run Docker/Podman such as:
+ - ✅ Ubuntu
+ - ✅ Debian (Bullseye or newer)
+ - ✅ Raspbian (Bullseye or newer)
+ - ✅ CentOS
+ - ✅ Fedora
+ - ✅ ArchLinux
+ - ❌ Debian/Raspbian Buster or lower is not supported
+ - ❌ Windows (Will be supported later)
+- Arch: armv7, arm64, amd64 (a.k.a x86_64)
+
+### Basic
+
+- Default Stacks Directory: `/opt/stacks`
+- Default Port: 5001
+
+```
+# Create directories that store your stacks and stores Dockge's stack
+mkdir -p /opt/stacks /opt/dockge
+cd /opt/dockge
+
+# Download the compose.yaml
+curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
+
+# Start the server
+docker compose up -d
+
+# If you are using docker-compose V1 or Podman
+# docker-compose up -d
+```
+
+Dockge is now running on http://localhost:5001
+
+### Advanced
+
+If you want to store your stacks in another directory, you can generate your compose.yaml file by using the following URL with custom query strings.
+
+```
+# Download your compose.yaml
+curl "https://dockge.kuma.pet/compose.yaml?port=5001&stacksPath=/opt/stacks" --output compose.yaml
+```
+
+- port=`5001`
+- stacksPath=`/opt/stacks`
+
+Interactive compose.yaml generator is available on:
+https://dockge.kuma.pet
+
+## How to Update
+
+```bash
+cd /opt/dockge
+docker compose pull && docker compose up -d
+```
+
+## Screenshots
+
+
+
+
+
+
+
+
+
+
+
+## Motivations
+
+- I have been using Portainer for some time, but for the stack management, I am sometimes not satisfied with it. For example, sometimes when I try to deploy a stack, the loading icon keeps spinning for a few minutes without progress. And sometimes error messages are not clear.
+- Try to develop with ES Module + TypeScript (Originally, I planned to use Deno or Bun.js, but they don't have support for arm64, so I stepped back to Node.js)
+
+If you love this project, please consider giving it a ⭐.
+
+
+## 🗣️ Community and Contribution
+
+### Bug Report
+https://github.com/louislam/dockge/issues
+
+### Ask for Help / Discussions
+https://github.com/louislam/dockge/discussions
+
+### Translation
+If you want to translate Dockge into your language, please read [Translation Guide](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md)
+
+### Create a Pull Request
+
+Be sure to read the [guide](https://github.com/louislam/dockge/blob/master/CONTRIBUTING.md), as we don't accept all types of pull requests and don't want to waste your time.
+
+## FAQ
+
+#### "Dockge"?
+
+"Dockge" is a coinage word which is created by myself. I originally hoped it sounds like `Dodge`, but apparently many people called it `Dockage`, it is also acceptable.
+
+The naming idea came from Twitch emotes like `sadge`, `bedge` or `wokege`. They all end in `-ge`.
+
+#### Can I manage a single container without `compose.yaml`?
+
+The main objective of Dockge is to try to use the docker `compose.yaml` for everything. If you want to manage a single container, you can just use Portainer or Docker CLI.
+
+#### Can I manage existing stacks?
+
+Yes, you can. However, you need to move your compose file into the stacks directory:
+
+1. Stop your stack
+2. Move your compose file into `/opt/stacks//compose.yaml`
+3. In Dockge, click the " Scan Stacks Folder" button in the top-right corner's dropdown menu
+4. Now you should see your stack in the list
+
+#### Is Dockge a Portainer replacement?
+
+Yes or no. Portainer provides a lot of Docker features. While Dockge is currently only focusing on docker-compose with a better user interface and better user experience.
+
+If you want to manage your container with docker-compose only, the answer may be yes.
+
+If you still need to manage something like docker networks, single containers, the answer may be no.
+
+#### Can I install both Dockge and Portainer?
+
+Yes, you can.
+
+## Others
+
+Dockge is built on top of [Compose V2](https://docs.docker.com/compose/migrate/). `compose.yaml` also known as `docker-compose.yml`.
\ No newline at end of file
diff --git a/apps/element-web/README.md b/apps/element-web/README.md
index 52210e277..6e0be1705 100644
--- a/apps/element-web/README.md
+++ b/apps/element-web/README.md
@@ -1,105 +1,66 @@
-[](https://matrix.to/#/#element-web:matrix.org)
-
-
-[](https://translate.element.io/engage/element-web/)
-[](https://sonarcloud.io/summary/new_code?id=element-web)
-[](https://sonarcloud.io/summary/new_code?id=element-web)
-[](https://sonarcloud.io/summary/new_code?id=element-web)
-[](https://sonarcloud.io/summary/new_code?id=element-web)
+[](https://matrix.to/#/#element-web:matrix.org)   [](https://translate.element.io/engage/element-web/) [](https://sonarcloud.io/summary/new_code?id=element-web) [](https://sonarcloud.io/summary/new_code?id=element-web) [](https://sonarcloud.io/summary/new_code?id=element-web) [](https://sonarcloud.io/summary/new_code?id=element-web)
-# Element
+# 元素
-Element (formerly known as Vector and Riot) is a Matrix web client built using the [Matrix
-React SDK](https://github.com/matrix-org/matrix-react-sdk).
+Element(以前称为 Vector 和 Riot)是一个使用 [Matrix React SDK](https://github.com/matrix-org/matrix-react-sdk) 构建的 Matrix 网络客户端。
-# Supported Environments
+# 支持的环境
-Element has several tiers of support for different environments:
+Element 对不同环境提供了几个支持层级:
-- Supported
- - Definition: Issues **actively triaged**, regressions **block** the release
- - Last 2 major versions of Chrome, Firefox, and Edge on desktop OSes
- - Last 2 versions of Safari
- - Latest release of official Element Desktop app on desktop OSes
- - Desktop OSes means macOS, Windows, and Linux versions for desktop devices
- that are actively supported by the OS vendor and receive security updates
-- Experimental
- - Definition: Issues **accepted**, regressions **do not block** the release
- - Element as an installed PWA via current stable version of Chrome
- - Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS
-- Not supported
- - Definition: Issues only affecting unsupported environments are **closed**
- - Everything else
+* 支持
+ * 定义:问题被**积极处理** ,回归问题**阻止**发布
+ * 桌面操作系统上最后两个主要版本的 Chrome、Firefox 和 Edge
+ * Safari 的最后两个版本
+ * 桌面操作系统上官方 Element Desktop 应用的最新版本
+ * 桌面操作系统指的是活跃受 OS 厂商支持并接收安全更新的 macOS、Windows 和 Linux 版本
+* 实验性功能
+ * 定义:接受的问题,回归问题不阻碍发布
+ * 通过当前稳定版 Chrome 安装的 PWA 元素
+ * 当前稳定版 Chrome、Firefox 和 Safari 在 Android、iOS 和 iPadOS 上的移动网页版本
+* 不支持
+ * 定义:仅影响不支持环境的问题将被 **关闭**
+ * 其他所有内容
-For accessing Element on an Android or iOS device, we currently recommend the
-native apps [element-android](https://github.com/vector-im/element-android)
-and [element-ios](https://github.com/vector-im/element-ios).
+要访问 Element 在 Android 或 iOS 设备上,我们目前推荐使用原生应用 element-android 和 element-ios。
-# Getting Started
+# 快速入门
-The easiest way to test Element is to just use the hosted copy at .
-The `develop` branch is continuously deployed to
-for those who like living dangerously.
+测试 Element 最简单的方法就是使用托管版本 [https://app.element.io](https://app.element.io)。喜欢冒险的人可以将 `develop` 分支持续部署到 [https://develop.element.io](https://develop.element.io)。
-To host your own copy of Element, the quickest bet is to use a pre-built
-released version of Element:
+要托管您自己的 Element 版本,最快的方法是使用 Element 的预构建发布版本:
-1. Download the latest version from
-1. Untar the tarball on your web server
-1. Move (or symlink) the `element-x.x.x` directory to an appropriate name
-1. Configure the correct caching headers in your webserver (see below)
-1. Configure the app by copying `config.sample.json` to `config.json` and
- modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
-1. Enter the URL into your browser and log into Element!
+1. 从 [https://github.com/vector-im/element-web/releases](https://github.com/vector-im/element-web/releases) 下载最新版本
+2. 在您的 Web 服务器上解压 tarball
+3. 将 `element-x.x.x` 目录移动到一个合适的名称
+4. 在你的 Web 服务器上配置正确的缓存头(参见下方)
+5. 配置应用程序:将 `config.sample.json` 复制到 `config.json` 并进行修改。详情请参见 [配置文档](https://github.com/vector-im/element-web/blob/develop/docs/config.md) 。
+6. 在浏览器中输入 URL 并登录 Element!
-Releases are signed using gpg and the OpenPGP standard, and can be checked against the public key located
-at .
+发布使用 gpg 并遵循 OpenPGP 标准进行签名,您可以在此处验证签名:\[https://packages.riot.im/element-release-key.asc\](https://packages.riot.im/element-release-key.asc)
-Note that for the security of your chats will need to serve Element
-over HTTPS. Major browsers also do not allow you to use VoIP/video
-chats over HTTP, as WebRTC is only usable over HTTPS.
-There are some exceptions like when using localhost, which is
-considered a [secure context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts)
-and thus allowed.
+请注意,为了保证聊天的安全性,您需要通过 HTTPS 服务 Element。主要浏览器也不允许通过 HTTP 进行 VoIP 或视频聊天,因为 WebRTC 只能在 HTTPS 下使用。不过,当使用本地主机时,这被视为一个 [安全上下文](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts) ,因此是允许的。
-To install Element as a desktop application, see [Running as a desktop
-app](#running-as-a-desktop-app) below.
+要将 Element 安装为桌面应用程序,请参阅下方的 [以桌面应用方式运行](#running-as-a-desktop-app) 。
-# Important Security Notes
+# 重要安全注意事项
-## Separate domains
+## 分离的域名
-We do not recommend running Element from the same domain name as your Matrix
-homeserver. The reason is the risk of XSS (cross-site-scripting)
-vulnerabilities that could occur if someone caused Element to load and render
-malicious user generated content from a Matrix API which then had trusted
-access to Element (or other apps) due to sharing the same domain.
+我们不建议从与你的 Matrix 服务器相同的域名运行 Element。原因是,如果有人导致 Element 加载并渲染来自 Matrix API 的恶意用户生成内容,而这些内容由于共享相同的域名,获得了对 Element(或其他应用)的信任访问权限,那么可能会出现跨站脚本(XSS)漏洞。
-We have put some coarse mitigations into place to try to protect against this
-situation, but it's still not good practice to do it in the first place. See
- for more details.
+我们已经实施了一些粗略的缓解措施,以尽量保护自己不受这种情况的影响, 但首先这样做仍然不是良好的实践。更多详情请参阅 [https://github.com/vector-im/element-web/issues/1977](https://github.com/vector-im/element-web/issues/1977)。
-## Configuration best practices
+## 配置最佳实践
-Unless you have special requirements, you will want to add the following to
-your web server configuration when hosting Element Web:
+除非有特殊需求,否则在托管 Element Web 时,您需要在 web 服务器配置中添加以下内容:
-- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being
- framed and protect from [clickjacking][owasp-clickjacking].
-- The `frame-ancestors 'self'` directive to your `Content-Security-Policy`
- header, as the modern replacement for `X-Frame-Options` (though both should be
- included since not all browsers support it yet, see
- [this][owasp-clickjacking-csp]).
-- The `X-Content-Type-Options: nosniff` header, to [disable MIME
- sniffing][mime-sniffing].
-- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in
- legacy browsers.
+* \`X-Frame-Options: SAMEORIGIN\` 头,以防止 Element Web 被嵌入框架,并保护免受点击劫持攻击。
+* 将 \`frame-ancestors 'self'\` 指令添加到 \`Content-Security-Policy\` 头中,作为 \`X-Frame-Options\` 的现代替代方案(尽管两者都应被使用)。 由于并非所有浏览器都支持,因此包含在此处,请参阅 [this](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples))。
+* The `X-Content-Type-Options: nosniff` 头,用于禁用 MIME 类型推断。
+* The `X-XSS-Protection: 1; mode=block;` 头,用于在旧版浏览器中提供基本的 XSS 保护。
-[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing
-[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples
-[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
-
-If you are using nginx, this would look something like the following:
+如果你使用的是 nginx,配置会类似于以下内容:
```
add_header X-Frame-Options SAMEORIGIN;
@@ -108,7 +69,7 @@ add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "frame-ancestors 'self'";
```
-For Apache, the configuration looks like:
+对于 Apache,配置如下:
```
Header set X-Frame-Options SAMEORIGIN
@@ -117,80 +78,59 @@ Header set X-XSS-Protection "1; mode=block"
Header set Content-Security-Policy "frame-ancestors 'self'"
```
-Note: In case you are already setting a `Content-Security-Policy` header
-elsewhere, you should modify it to include the `frame-ancestors` directive
-instead of adding that last line.
+注意:如果你已经在其他地方设置了 `Content-Security-Policy` 头,你应该修改它以包含 `frame-ancestors` 指令,而不是添加最后一行。
-# Building From Source
+# 从源代码构建
-Element is a modular webapp built with modern ES6 and uses a Node.js build system.
-Ensure you have the latest LTS version of Node.js installed.
+Element 是一个基于现代 ES6 构建的模块化 web 应用,并使用 Node.js 构建系统。请确保安装了最新版本的 LTS Node.js。
-Using `yarn` instead of `npm` is recommended. Please see the Yarn [install
-guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it already.
+使用 \``yarn`\` 而不是 \``npm`\` 是推荐的。如果你还没有安装,请参阅 Yarn 的 [安装指南](https://classic.yarnpkg.com/en/docs/install) 。
-1. Install or update `node.js` so that your `node` is at least the current recommended LTS.
-1. Install `yarn` if not present already.
-1. Clone the repo: `git clone https://github.com/vector-im/element-web.git`.
-1. Switch to the element-web directory: `cd element-web`.
-1. Install the prerequisites: `yarn install`.
- - If you're using the `develop` branch, then it is recommended to set up a
- proper development environment (see [Setting up a dev
- environment](#setting-up-a-dev-environment) below). Alternatively, you
- can use - the continuous integration release of
- the develop branch.
-1. Configure the app by copying `config.sample.json` to `config.json` and
- modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
-1. `yarn dist` to build a tarball to deploy. Untaring this file will give
- a version-specific directory containing all the files that need to go on your
- web server.
+1. 安装或更新 \``node.js`\`,确保你的 \``node`\` 至少是当前推荐的 LTS 版本。
+2. 如果还没有安装,请安装 \``yarn`\`。
+3. 克隆仓库: `git clone https://github.com/vector-im/element-web.git`
+4. 切换到 element-web 目录:\`\`\`cd element-web\`\`\`.
+5. 安装依赖项:\`\`\`yarn install\`\`\`.
+ * 如果你使用的是 \`\`\`develop\`\`\` 分支,建议设置一个完整的开发环境(参见下方的 [设置开发环境](#setting-up-a-dev-environment) )。或者,你可以使用 [https://develop.element.io](https://develop.element.io) - \`\`\`develop\`\`\` 分支的持续集成发布版本。
+6. 通过复制 \`\`\`config.sample.json\`\`\` 并重命名为 \`\`\`config.json\`\`\` 并进行修改来配置应用。详情请参见 [配置文档](https://github.com/vector-im/element-web/blob/develop/docs/config.md) 。
+7. 运行 \``yarn dist`\` 来构建一个 tarball 用于部署。解压此文件会得到一个版本特定的目录,其中包含需要上传到你的 web 服务器的所有文件。
-Note that `yarn dist` is not supported on Windows, so Windows users can run `yarn build`,
-which will build all the necessary files into the `webapp` directory. The version of Element
-will not appear in Settings without using the dist script. You can then mount the
-`webapp` directory on your web server to actually serve up the app, which is
-entirely static content.
+请注意,在 Windows 上不支持\``yarn dist`\`,因此 Windows 用户可以运行\``yarn build`\`,这将会把所有必要的文件构建到\``webapp`\`目录中。Element 的版本 不会在设置中出现,除非使用 dist 脚本。然后你可以挂载 将 \``webapp`\` 目录部署到你的 Web 服务器上,以实际提供该应用,该应用完全是静态内容。
-# Running as a Desktop app
+# 以桌面应用方式运行
-Element can also be run as a desktop app, wrapped in Electron. You can download a
-pre-built version from or, if you prefer,
-build it yourself.
+Element 也可以作为一个桌面应用运行,使用 Electron 包装。您可以在 [https://element.io/get-started](https://element.io/get-started) 下载预构建版本,或者如果您愿意,可以自行构建。
-To build it yourself, follow the instructions at .
+要自行构建,请按照 [https://github.com/vector-im/element-desktop](https://github.com/vector-im/element-desktop) 中的说明操作。
-Many thanks to @aviraldg for the initial work on the Electron integration.
+非常感谢 @aviraldg 在 Electron 集成方面的初始工作。
-Other options for running as a desktop app:
+其他作为桌面应用运行的选项:
-- @asdf:matrix.org points out that you can use nativefier and it just works(tm)
+* @asdf:matrix.org 指出,你可以使用 nativefier,它就能正常工作(tm)
```bash
yarn global add nativefier
nativefier https://app.element.io/
```
-The [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md#desktop-app-configuration) show how to
-override the desktop app's default settings if desired.
+配置文档 [展示了如何覆盖桌面应用的默认设置](https://github.com/vector-im/element-web/blob/develop/docs/config.md#desktop-app-configuration) (如果需要的话)。
-# Running from Docker
+# 使用 Docker 运行
-The Docker image can be used to serve element-web as a web server. The easiest way to use
-it is to use the prebuilt image:
+Docker 镜像可以用来作为 web 服务器运行 element-web。最简单的方法是使用预构建的镜像:
```bash
docker run -p 80:80 vectorim/element-web
```
-To supply your own custom `config.json`, map a volume to `/app/config.json`. For example,
-if your custom config was located at `/etc/element-web/config.json` then your Docker command
-would be:
+要提供你自己的自定义 `config.json`,将一个卷映射到 `/app/config.json`。例如,如果你的自定义配置文件位于 `/etc/element-web/config.json`,那么你的 Docker 命令将是:
```bash
docker run -p 80:80 -v /etc/element-web/config.json:/app/config.json vectorim/element-web
```
-To build the image yourself:
+自行构建镜像:
```bash
git clone https://github.com/vector-im/element-web.git element-web
@@ -199,8 +139,7 @@ git checkout master
docker build .
```
-If you're building a custom branch, or want to use the develop branch, check out the appropriate
-element-web branch and then run:
+如果你正在构建自定义分支,或者想要使用 develop 分支,请检出相应的 element-web 分支,然后运行:
```bash
docker build -t \
@@ -212,24 +151,21 @@ docker build -t \
.
```
-# Running in Kubernetes
+# 在 Kubernetes 中运行
-The provided element-web docker image can also be run from within a Kubernetes cluster.
-See the [Kubernetes example](https://github.com/vector-im/element-web/blob/develop/docs/kubernetes.md) for more details.
+提供的 element-web docker 镜像也可以在 Kubernetes 集群内部运行。更多详情请参见 [Kubernetes 示例](https://github.com/vector-im/element-web/blob/develop/docs/kubernetes.md) 。
# config.json
-Element supports a variety of settings to configure default servers, behaviour, themes, etc.
-See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for more details.
+Element 支持多种设置来配置默认服务器、行为、主题等。更多详情请参见 [配置文档](https://github.com/vector-im/element-web/blob/develop/docs/config.md) 。
-# Labs Features
+# 实验室功能
-Some features of Element may be enabled by flags in the `Labs` section of the settings.
-Some of these features are described in [labs.md](https://github.com/vector-im/element-web/blob/develop/docs/labs.md).
+Element 的一些功能可能需要在设置中的“实验”部分启用标志才能启用。其中一些功能在 [labs.md](https://github.com/vector-im/element-web/blob/develop/docs/labs.md) 中有描述。
-# Caching requirements
+# 缓存要求
-Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver:
+当你从自己的 web 服务器提供 Element 时,Element 需要以下 URL 不被缓存:
```
/config.*.json
@@ -239,49 +175,27 @@ Element requires the following URLs not to be cached, when/if you are serving El
/index.html
```
-We also recommend that you force browsers to re-validate any cached copy of Element on page load by configuring your
-webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser will fetch a new version of Element on
-the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our
-Dockerfile.
+我们还建议通过配置 web 服务器,使其在页面加载时返回 `Cache-Control: no-cache` 对于 `/`,强制浏览器重新验证任何缓存的 Element 副本。这可以确保在部署后,浏览器会在下一次页面加载时获取 Element 的新版本。请注意,这已经在我们 Dockerfile 的 nginx 配置中为你配置好了。
-# Development
+# 开发
-Before attempting to develop on Element you **must** read the [developer guide
-for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which
-also defines the design, architecture and style for Element too.
+在尝试对 Element 进行开发之前,你**必须**阅读 [matrix-react-sdk 的开发指南](https://github.com/matrix-org/matrix-react-sdk#developer-guide) ,该指南还定义了 Element 的设计、架构和样式。
-Read the [Choosing an issue](https://github.com/vector-im/element-web/blob/develop/docs/choosing-an-issue.md) page for some guidance
-about where to start. Before starting work on a feature, it's best to ensure
-your plan aligns well with our vision for Element. Please chat with the team in
-[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before
-you start so we can ensure it's something we'd be willing to merge.
+阅读[选择问题](https://github.com/vector-im/element-web/blob/develop/docs/choosing-an-issue.md)页面以获得一些指导 在开始工作之前,最好先确定从哪里开始。在着手开发一个新功能之前,最好确保 你的计划与我们对 Element 的愿景非常契合。请与团队进行交流。 在开始之前,请访问 [#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org),以便我们可以确认这是否是我们愿意合并的内容。
-You should also familiarise yourself with the ["Here be Dragons" guide
-](https://docs.google.com/document/d/12jYzvkidrp1h7liEuLIe6BMdU0NUjndUYI971O06ooM)
-to the tame & not-so-tame dragons (gotchas) which exist in the codebase.
+你也应该熟悉一下《Here be Dragons》指南,了解代码库中存在的 tame 和不那么 tame 的 dragons(注意事项)。
-The idea of Element is to be a relatively lightweight "skin" of customisations on
-top of the underlying `matrix-react-sdk`. `matrix-react-sdk` provides both the
-higher and lower level React components useful for building Matrix communication
-apps using React.
+Element 的设计理念是作为底层 matrix-react-sdk 的相对轻量级“皮肤”,在其上进行自定义。matrix-react-sdk 提供了构建基于 React 的 Matrix 通信应用所需的高、低级别 React 组件。
-Please note that Element is intended to run correctly without access to the public
-internet. So please don't depend on resources (JS libs, CSS, images, fonts)
-hosted by external CDNs or servers but instead please package all dependencies
-into Element itself.
+请注意,Element 设计为在不连接公共互联网的情况下也能正确运行。因此,请不要依赖由外部 CDN 或服务器托管的资源(如 JS 库、CSS、图片、字体),而是将所有依赖项打包到 Element 本身中。
-CSS hot-reload is available as an opt-in development feature. You can enable it
-by defining a `CSS_HOT_RELOAD` environment variable, in a `.env` file in the root
-of the repository. See `.env.example` for documentation and an example.
+CSS 热重载作为可选的开发功能可用。你可以在仓库根目录的 .env 文件中定义一个 CSS\_HOT\_RELOAD 环境变量来启用它。请参阅 .env.example 文件以获取文档和示例。
-# Setting up a dev environment
+# 设置开发环境
-Much of the functionality in Element is actually in the `matrix-react-sdk` and
-`matrix-js-sdk` modules. It is possible to set these up in a way that makes it
-easy to track the `develop` branches in git and to make local changes without
-having to manually rebuild each time.
+Element 的许多功能实际上在 `matrix-react-sdk` 中实现的,并 \`matrix-js-sdk\` 模块。可以设置这些模块以便于跟踪 git 中的 \`develop\` 分支,并且可以在本地进行修改而无需每次手动重新构建。
-First clone and build `matrix-js-sdk`:
+首先克隆并构建 `matrix-js-sdk`:
```bash
git clone https://github.com/matrix-org/matrix-js-sdk.git
@@ -291,7 +205,7 @@ yarn install
popd
```
-Then similarly with `matrix-react-sdk`:
+然后像 \``matrix-react-sdk`\` 一样:
```bash
git clone https://github.com/matrix-org/matrix-react-sdk.git
@@ -302,17 +216,16 @@ yarn install
popd
```
-Clone the repo and switch to the `element-web` directory:
+克隆仓库并切换到 `element-web` 目录:
```bash
git clone https://github.com/vector-im/element-web.git
cd element-web
```
-Configure the app by copying `config.sample.json` to `config.json` and
-modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
+通过复制 `config.sample.json` 为 `config.json` 并对其进行修改来配置应用。详情请参阅 [配置文档](https://github.com/vector-im/element-web/blob/develop/docs/config.md) 。
-Finally, build and start Element itself:
+最后,构建并启动 Element 本身:
```bash
yarn link matrix-js-sdk
@@ -321,7 +234,7 @@ yarn install
yarn start
```
-Wait a few seconds for the initial build to finish; you should see something like:
+等待几秒钟以完成初始构建;你应该会看到类似的内容:
```
[element-js] [webpack.Progress] 100%
@@ -330,21 +243,15 @@ Wait a few seconds for the initial build to finish; you should see something lik
[element-js] ℹ 「wdm」: Compiled successfully.
```
-Remember, the command will not terminate since it runs the web server
-and rebuilds source files when they change. This development server also
-disables caching, so do NOT use it in production.
+请记住,该命令不会终止,因为它会运行 Web 服务器并在源文件更改时重建文件。此开发服务器还禁用了缓存,因此请勿在生产环境中使用它。
-Open in your browser to see your newly built Element.
+在浏览器中打开 [http://127.0.0.1:8080/](http://127.0.0.1:8080/) 查看您新构建的 Element。
-**Note**: The build script uses inotify by default on Linux to monitor directories
-for changes. If the inotify limits are too low your build will fail silently or with
-`Error: EMFILE: too many open files`. To avoid these issues, we recommend a watch limit
-of at least `128M` and instance limit around `512`.
+**注意** :构建脚本默认在 Linux 上使用 inotify 监控目录 以检测更改。如果 inotify 限制过低,您的构建可能会静默失败或失败。 为了避免这些问题,我们建议设置最多监视器数量为至少 128M,并且实例数量约为 512。
-You may be interested in issues [#15750](https://github.com/vector-im/element-web/issues/15750) and
-[#15774](https://github.com/vector-im/element-web/issues/15774) for further details.
+你可能对问题 [#15750](https://github.com/vector-im/element-web/issues/15750) 感兴趣和 \[1#15774\](#1) 以获取更多信息。
-To set a new inotify watch and instance limit, execute:
+要设置新的 inotify 监视器和实例限制,请执行:
```
sudo sysctl fs.inotify.max_user_watches=131072
@@ -352,7 +259,7 @@ sudo sysctl fs.inotify.max_user_instances=512
sudo sysctl -p
```
-If you wish, you can make the new limits permanent, by executing:
+如果你愿意,可以通过执行以下命令使新的限制永久生效:
```
echo fs.inotify.max_user_watches=131072 | sudo tee -a /etc/sysctl.conf
@@ -360,38 +267,34 @@ echo fs.inotify.max_user_instances=512 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```
----
+* * *
-When you make changes to `matrix-react-sdk` or `matrix-js-sdk` they should be
-automatically picked up by webpack and built.
+当你对 `matrix-react-sdk` 或 `matrix-js-sdk` 进行修改时,webpack 应该会自动检测并构建这些更改。
-If any of these steps error with, `file table overflow`, you are probably on a mac
-which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again.
-You'll need to do this in each new terminal you open before building Element.
+如果在执行这些步骤时遇到`文件表溢出`错误,你可能使用的是 mac 系统,其最大打开文件数的限制非常低。可以运行 `ulimit -Sn 1024` 并重新尝试。在每次打开新的终端窗口进行构建 Element 之前,都需要执行此操作。
-## Running the tests
+## 运行测试
-There are a number of application-level tests in the `tests` directory; these
-are designed to run with Jest and JSDOM. To run them
+在 \``tests`\` 目录中有若干应用级测试;这些测试设计为与 Jest 和 JSDOM 一起运行。要运行这些测试,请参阅相关文档。
```
yarn test
```
-### End-to-End tests
+### 端到端测试
-See [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests) for how to run the end-to-end tests.
+有关如何运行端到端测试,请参阅 [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests)。
-# Translations
+# 翻译
-To add a new translation, head to the [translating doc](https://github.com/vector-im/element-web/blob/develop/docs/translating.md).
+要添加新的翻译,请前往 [翻译文档](https://github.com/vector-im/element-web/blob/develop/docs/translating.md) 。
-For a developer guide, see the [translating dev doc](https://github.com/vector-im/element-web/blob/develop/docs/translating-dev.md).
+对于开发人员指南,请参阅[翻译开发文档](https://github.com/vector-im/element-web/blob/develop/docs/translating-dev.md) 。
-[](https://translate.element.io/engage/element-web/?utm_source=widget)
+[](https://translate.element.io/engage/element-web/?utm_source=widget)
-# Triaging issues
+# 处理问题
-Issues are triaged by community members and the Web App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process).
+问题由社区成员和 Web 应用团队按照[处理流程](https://github.com/vector-im/element-meta/wiki/Triage-process)进行分类处理。
-We use [issue labels](https://github.com/vector-im/element-meta/wiki/Issue-labelling) to sort all incoming issues.
\ No newline at end of file
+我们使用[问题标签](https://github.com/vector-im/element-meta/wiki/Issue-labelling)来整理所有收到的问题。
\ No newline at end of file
diff --git a/apps/element-web/README_en.md b/apps/element-web/README_en.md
new file mode 100644
index 000000000..52210e277
--- /dev/null
+++ b/apps/element-web/README_en.md
@@ -0,0 +1,397 @@
+[](https://matrix.to/#/#element-web:matrix.org)
+
+
+[](https://translate.element.io/engage/element-web/)
+[](https://sonarcloud.io/summary/new_code?id=element-web)
+[](https://sonarcloud.io/summary/new_code?id=element-web)
+[](https://sonarcloud.io/summary/new_code?id=element-web)
+[](https://sonarcloud.io/summary/new_code?id=element-web)
+
+# Element
+
+Element (formerly known as Vector and Riot) is a Matrix web client built using the [Matrix
+React SDK](https://github.com/matrix-org/matrix-react-sdk).
+
+# Supported Environments
+
+Element has several tiers of support for different environments:
+
+- Supported
+ - Definition: Issues **actively triaged**, regressions **block** the release
+ - Last 2 major versions of Chrome, Firefox, and Edge on desktop OSes
+ - Last 2 versions of Safari
+ - Latest release of official Element Desktop app on desktop OSes
+ - Desktop OSes means macOS, Windows, and Linux versions for desktop devices
+ that are actively supported by the OS vendor and receive security updates
+- Experimental
+ - Definition: Issues **accepted**, regressions **do not block** the release
+ - Element as an installed PWA via current stable version of Chrome
+ - Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS
+- Not supported
+ - Definition: Issues only affecting unsupported environments are **closed**
+ - Everything else
+
+For accessing Element on an Android or iOS device, we currently recommend the
+native apps [element-android](https://github.com/vector-im/element-android)
+and [element-ios](https://github.com/vector-im/element-ios).
+
+# Getting Started
+
+The easiest way to test Element is to just use the hosted copy at .
+The `develop` branch is continuously deployed to
+for those who like living dangerously.
+
+To host your own copy of Element, the quickest bet is to use a pre-built
+released version of Element:
+
+1. Download the latest version from
+1. Untar the tarball on your web server
+1. Move (or symlink) the `element-x.x.x` directory to an appropriate name
+1. Configure the correct caching headers in your webserver (see below)
+1. Configure the app by copying `config.sample.json` to `config.json` and
+ modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
+1. Enter the URL into your browser and log into Element!
+
+Releases are signed using gpg and the OpenPGP standard, and can be checked against the public key located
+at .
+
+Note that for the security of your chats will need to serve Element
+over HTTPS. Major browsers also do not allow you to use VoIP/video
+chats over HTTP, as WebRTC is only usable over HTTPS.
+There are some exceptions like when using localhost, which is
+considered a [secure context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts)
+and thus allowed.
+
+To install Element as a desktop application, see [Running as a desktop
+app](#running-as-a-desktop-app) below.
+
+# Important Security Notes
+
+## Separate domains
+
+We do not recommend running Element from the same domain name as your Matrix
+homeserver. The reason is the risk of XSS (cross-site-scripting)
+vulnerabilities that could occur if someone caused Element to load and render
+malicious user generated content from a Matrix API which then had trusted
+access to Element (or other apps) due to sharing the same domain.
+
+We have put some coarse mitigations into place to try to protect against this
+situation, but it's still not good practice to do it in the first place. See
+ for more details.
+
+## Configuration best practices
+
+Unless you have special requirements, you will want to add the following to
+your web server configuration when hosting Element Web:
+
+- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being
+ framed and protect from [clickjacking][owasp-clickjacking].
+- The `frame-ancestors 'self'` directive to your `Content-Security-Policy`
+ header, as the modern replacement for `X-Frame-Options` (though both should be
+ included since not all browsers support it yet, see
+ [this][owasp-clickjacking-csp]).
+- The `X-Content-Type-Options: nosniff` header, to [disable MIME
+ sniffing][mime-sniffing].
+- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in
+ legacy browsers.
+
+[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing
+[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples
+[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
+
+If you are using nginx, this would look something like the following:
+
+```
+add_header X-Frame-Options SAMEORIGIN;
+add_header X-Content-Type-Options nosniff;
+add_header X-XSS-Protection "1; mode=block";
+add_header Content-Security-Policy "frame-ancestors 'self'";
+```
+
+For Apache, the configuration looks like:
+
+```
+Header set X-Frame-Options SAMEORIGIN
+Header set X-Content-Type-Options nosniff
+Header set X-XSS-Protection "1; mode=block"
+Header set Content-Security-Policy "frame-ancestors 'self'"
+```
+
+Note: In case you are already setting a `Content-Security-Policy` header
+elsewhere, you should modify it to include the `frame-ancestors` directive
+instead of adding that last line.
+
+# Building From Source
+
+Element is a modular webapp built with modern ES6 and uses a Node.js build system.
+Ensure you have the latest LTS version of Node.js installed.
+
+Using `yarn` instead of `npm` is recommended. Please see the Yarn [install
+guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it already.
+
+1. Install or update `node.js` so that your `node` is at least the current recommended LTS.
+1. Install `yarn` if not present already.
+1. Clone the repo: `git clone https://github.com/vector-im/element-web.git`.
+1. Switch to the element-web directory: `cd element-web`.
+1. Install the prerequisites: `yarn install`.
+ - If you're using the `develop` branch, then it is recommended to set up a
+ proper development environment (see [Setting up a dev
+ environment](#setting-up-a-dev-environment) below). Alternatively, you
+ can use - the continuous integration release of
+ the develop branch.
+1. Configure the app by copying `config.sample.json` to `config.json` and
+ modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
+1. `yarn dist` to build a tarball to deploy. Untaring this file will give
+ a version-specific directory containing all the files that need to go on your
+ web server.
+
+Note that `yarn dist` is not supported on Windows, so Windows users can run `yarn build`,
+which will build all the necessary files into the `webapp` directory. The version of Element
+will not appear in Settings without using the dist script. You can then mount the
+`webapp` directory on your web server to actually serve up the app, which is
+entirely static content.
+
+# Running as a Desktop app
+
+Element can also be run as a desktop app, wrapped in Electron. You can download a
+pre-built version from or, if you prefer,
+build it yourself.
+
+To build it yourself, follow the instructions at .
+
+Many thanks to @aviraldg for the initial work on the Electron integration.
+
+Other options for running as a desktop app:
+
+- @asdf:matrix.org points out that you can use nativefier and it just works(tm)
+
+```bash
+yarn global add nativefier
+nativefier https://app.element.io/
+```
+
+The [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md#desktop-app-configuration) show how to
+override the desktop app's default settings if desired.
+
+# Running from Docker
+
+The Docker image can be used to serve element-web as a web server. The easiest way to use
+it is to use the prebuilt image:
+
+```bash
+docker run -p 80:80 vectorim/element-web
+```
+
+To supply your own custom `config.json`, map a volume to `/app/config.json`. For example,
+if your custom config was located at `/etc/element-web/config.json` then your Docker command
+would be:
+
+```bash
+docker run -p 80:80 -v /etc/element-web/config.json:/app/config.json vectorim/element-web
+```
+
+To build the image yourself:
+
+```bash
+git clone https://github.com/vector-im/element-web.git element-web
+cd element-web
+git checkout master
+docker build .
+```
+
+If you're building a custom branch, or want to use the develop branch, check out the appropriate
+element-web branch and then run:
+
+```bash
+docker build -t \
+ --build-arg USE_CUSTOM_SDKS=true \
+ --build-arg REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git" \
+ --build-arg REACT_SDK_BRANCH="develop" \
+ --build-arg JS_SDK_REPO="https://github.com/matrix-org/matrix-js-sdk.git" \
+ --build-arg JS_SDK_BRANCH="develop" \
+ .
+```
+
+# Running in Kubernetes
+
+The provided element-web docker image can also be run from within a Kubernetes cluster.
+See the [Kubernetes example](https://github.com/vector-im/element-web/blob/develop/docs/kubernetes.md) for more details.
+
+# config.json
+
+Element supports a variety of settings to configure default servers, behaviour, themes, etc.
+See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for more details.
+
+# Labs Features
+
+Some features of Element may be enabled by flags in the `Labs` section of the settings.
+Some of these features are described in [labs.md](https://github.com/vector-im/element-web/blob/develop/docs/labs.md).
+
+# Caching requirements
+
+Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver:
+
+```
+/config.*.json
+/i18n
+/home
+/sites
+/index.html
+```
+
+We also recommend that you force browsers to re-validate any cached copy of Element on page load by configuring your
+webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser will fetch a new version of Element on
+the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our
+Dockerfile.
+
+# Development
+
+Before attempting to develop on Element you **must** read the [developer guide
+for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which
+also defines the design, architecture and style for Element too.
+
+Read the [Choosing an issue](https://github.com/vector-im/element-web/blob/develop/docs/choosing-an-issue.md) page for some guidance
+about where to start. Before starting work on a feature, it's best to ensure
+your plan aligns well with our vision for Element. Please chat with the team in
+[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before
+you start so we can ensure it's something we'd be willing to merge.
+
+You should also familiarise yourself with the ["Here be Dragons" guide
+](https://docs.google.com/document/d/12jYzvkidrp1h7liEuLIe6BMdU0NUjndUYI971O06ooM)
+to the tame & not-so-tame dragons (gotchas) which exist in the codebase.
+
+The idea of Element is to be a relatively lightweight "skin" of customisations on
+top of the underlying `matrix-react-sdk`. `matrix-react-sdk` provides both the
+higher and lower level React components useful for building Matrix communication
+apps using React.
+
+Please note that Element is intended to run correctly without access to the public
+internet. So please don't depend on resources (JS libs, CSS, images, fonts)
+hosted by external CDNs or servers but instead please package all dependencies
+into Element itself.
+
+CSS hot-reload is available as an opt-in development feature. You can enable it
+by defining a `CSS_HOT_RELOAD` environment variable, in a `.env` file in the root
+of the repository. See `.env.example` for documentation and an example.
+
+# Setting up a dev environment
+
+Much of the functionality in Element is actually in the `matrix-react-sdk` and
+`matrix-js-sdk` modules. It is possible to set these up in a way that makes it
+easy to track the `develop` branches in git and to make local changes without
+having to manually rebuild each time.
+
+First clone and build `matrix-js-sdk`:
+
+```bash
+git clone https://github.com/matrix-org/matrix-js-sdk.git
+pushd matrix-js-sdk
+yarn link
+yarn install
+popd
+```
+
+Then similarly with `matrix-react-sdk`:
+
+```bash
+git clone https://github.com/matrix-org/matrix-react-sdk.git
+pushd matrix-react-sdk
+yarn link
+yarn link matrix-js-sdk
+yarn install
+popd
+```
+
+Clone the repo and switch to the `element-web` directory:
+
+```bash
+git clone https://github.com/vector-im/element-web.git
+cd element-web
+```
+
+Configure the app by copying `config.sample.json` to `config.json` and
+modifying it. See the [configuration docs](https://github.com/vector-im/element-web/blob/develop/docs/config.md) for details.
+
+Finally, build and start Element itself:
+
+```bash
+yarn link matrix-js-sdk
+yarn link matrix-react-sdk
+yarn install
+yarn start
+```
+
+Wait a few seconds for the initial build to finish; you should see something like:
+
+```
+[element-js] [webpack.Progress] 100%
+[element-js]
+[element-js] ℹ 「wdm」: 1840 modules
+[element-js] ℹ 「wdm」: Compiled successfully.
+```
+
+Remember, the command will not terminate since it runs the web server
+and rebuilds source files when they change. This development server also
+disables caching, so do NOT use it in production.
+
+Open in your browser to see your newly built Element.
+
+**Note**: The build script uses inotify by default on Linux to monitor directories
+for changes. If the inotify limits are too low your build will fail silently or with
+`Error: EMFILE: too many open files`. To avoid these issues, we recommend a watch limit
+of at least `128M` and instance limit around `512`.
+
+You may be interested in issues [#15750](https://github.com/vector-im/element-web/issues/15750) and
+[#15774](https://github.com/vector-im/element-web/issues/15774) for further details.
+
+To set a new inotify watch and instance limit, execute:
+
+```
+sudo sysctl fs.inotify.max_user_watches=131072
+sudo sysctl fs.inotify.max_user_instances=512
+sudo sysctl -p
+```
+
+If you wish, you can make the new limits permanent, by executing:
+
+```
+echo fs.inotify.max_user_watches=131072 | sudo tee -a /etc/sysctl.conf
+echo fs.inotify.max_user_instances=512 | sudo tee -a /etc/sysctl.conf
+sudo sysctl -p
+```
+
+---
+
+When you make changes to `matrix-react-sdk` or `matrix-js-sdk` they should be
+automatically picked up by webpack and built.
+
+If any of these steps error with, `file table overflow`, you are probably on a mac
+which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again.
+You'll need to do this in each new terminal you open before building Element.
+
+## Running the tests
+
+There are a number of application-level tests in the `tests` directory; these
+are designed to run with Jest and JSDOM. To run them
+
+```
+yarn test
+```
+
+### End-to-End tests
+
+See [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests) for how to run the end-to-end tests.
+
+# Translations
+
+To add a new translation, head to the [translating doc](https://github.com/vector-im/element-web/blob/develop/docs/translating.md).
+
+For a developer guide, see the [translating dev doc](https://github.com/vector-im/element-web/blob/develop/docs/translating-dev.md).
+
+[](https://translate.element.io/engage/element-web/?utm_source=widget)
+
+# Triaging issues
+
+Issues are triaged by community members and the Web App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process).
+
+We use [issue labels](https://github.com/vector-im/element-meta/wiki/Issue-labelling) to sort all incoming issues.
\ No newline at end of file
diff --git a/apps/filebrowser/README.md b/apps/filebrowser/README.md
index 31d513480..70e52e2ce 100644
--- a/apps/filebrowser/README.md
+++ b/apps/filebrowser/README.md
@@ -1,6 +1,6 @@
# 使用说明
-- 默认账户密码
+* 默认账户密码
```
username:admin
@@ -9,36 +9,30 @@ password:admin
# 原始相关
-
-
-
+

-[](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml)
-[](https://goreportcard.com/report/github.com/filebrowser/filebrowser)
-[](http://godoc.org/github.com/filebrowser/filebrowser)
-[](https://github.com/filebrowser/filebrowser/releases/latest)
-[](http://webchat.freenode.net/?channels=%23filebrowser)
+[](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml) [](https://goreportcard.com/report/github.com/filebrowser/filebrowser) [](http://godoc.org/github.com/filebrowser/filebrowser) [](https://github.com/filebrowser/filebrowser/releases/latest) [](http://webchat.freenode.net/?channels=%23filebrowser)
-filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app.
+filebrowser 在指定目录内提供了一个文件管理界面,可用于上传、删除、预览、重命名和编辑您的文件。它允许创建多个用户,每个用户都可以拥有自己的目录。它可以作为一个独立的应用程序使用。
-## Features
+## 功能
-Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
+请参阅我们的文档:[https://filebrowser.org/features](https://filebrowser.org/features)
-## Install
+## 安装
-For installation instructions please refer to our docs at [https://filebrowser.org/installation](https://filebrowser.org/installation).
+有关安装说明,请参阅我们的文档:[https://filebrowser.org/installation](https://filebrowser.org/installation)。
-## Configuration
+## 配置
-[Authentication Method](https://filebrowser.org/configuration/authentication-method) - You can change the way the user authenticates with the filebrowser server
+[认证方法](https://filebrowser.org/configuration/authentication-method) \- 您可以更改用户与 filebrowser 服务器进行认证的方式
-[Command Runner](https://filebrowser.org/configuration/command-runner) - The command runner is a feature that enables you to execute any shell command you want before or after a certain event.
+[命令运行器](https://filebrowser.org/configuration/command-runner) \- 命令运行器是一个功能,允许你在某个事件之前或之后执行任何你想要的 shell 命令。
-[Custom Branding](https://filebrowser.org/configuration/custom-branding) - You can customize your File Browser installation by change its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want.
+[自定义品牌](https://filebrowser.org/configuration/custom-branding) \- 你可以通过更改其名称为任何你想要的,添加全局自定义样式表以及使用你自己的标志(如果需要)来自定义你的文件浏览器安装。
-## Contributing
+## 贡献
-If you're interested in contributing to this project, our docs are best places to start [https://filebrowser.org/contributing](https://filebrowser.org/contributing).
+如果你有兴趣为这个项目做出贡献,我们的文档是最好的起点 [https://filebrowser.org/contributing](https://filebrowser.org/contributing).
\ No newline at end of file
diff --git a/apps/filebrowser/README_en.md b/apps/filebrowser/README_en.md
new file mode 100644
index 000000000..31d513480
--- /dev/null
+++ b/apps/filebrowser/README_en.md
@@ -0,0 +1,44 @@
+# 使用说明
+
+- 默认账户密码
+
+```
+username:admin
+password:admin
+```
+
+# 原始相关
+
+
+
+
+
+
+
+[](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml)
+[](https://goreportcard.com/report/github.com/filebrowser/filebrowser)
+[](http://godoc.org/github.com/filebrowser/filebrowser)
+[](https://github.com/filebrowser/filebrowser/releases/latest)
+[](http://webchat.freenode.net/?channels=%23filebrowser)
+
+filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app.
+
+## Features
+
+Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
+
+## Install
+
+For installation instructions please refer to our docs at [https://filebrowser.org/installation](https://filebrowser.org/installation).
+
+## Configuration
+
+[Authentication Method](https://filebrowser.org/configuration/authentication-method) - You can change the way the user authenticates with the filebrowser server
+
+[Command Runner](https://filebrowser.org/configuration/command-runner) - The command runner is a feature that enables you to execute any shell command you want before or after a certain event.
+
+[Custom Branding](https://filebrowser.org/configuration/custom-branding) - You can customize your File Browser installation by change its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want.
+
+## Contributing
+
+If you're interested in contributing to this project, our docs are best places to start [https://filebrowser.org/contributing](https://filebrowser.org/contributing).
diff --git a/apps/firefox-browser/README.md b/apps/firefox-browser/README.md
index 55a9c4f00..ad1921f90 100644
--- a/apps/firefox-browser/README.md
+++ b/apps/firefox-browser/README.md
@@ -1,26 +1,24 @@

+[Firefox](https://www.mozilla.org/en-US/firefox/) 浏览器,也称为 Mozilla Firefox 或简称为 Firefox,是由 Mozilla 基金会和其子公司 Mozilla Corporation 开发的一款免费开源的网页浏览器。Firefox 使用 Gecko 布局引擎来渲染网页,该引擎实现了当前和预期的网页标准。
-[Firefox](https://www.mozilla.org/en-US/firefox/) Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards.
+## 支持的架构
+我们使用 Docker 清单来实现多平台意识。更多信息请参阅 Docker [此处](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) 和我们的公告 [此处](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/) 。
-## Supported Architectures
+简单地拉取 `lscr.io/linuxserver/firefox:latest` 应该可以检索到适合您架构的正确镜像,但您也可以通过标签拉取特定的架构镜像。
-We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
+此镜像支持的架构如下:
-Simply pulling `lscr.io/linuxserver/firefox:latest` should retrieve the correct image for your arch, but you can also pull specific arch images via tags.
-
-The architectures supported by this image are:
-
-| Architecture | Available | Tag |
+| 架构 | 可用 | 标签 |
| --- | --- | --- |
-| x86-64 | ✅ | amd64-<version tag> |
-| arm64 | ✅ | arm64v8-<version tag> |
-| armhf | ❌ | |
+| x86-64 | ✅ | amd64-<版本标签> |
+| arm64 | ✅ | arm64v8-<版本标签> |
+| armhf | ❌ | |
-## Application Setup
+## 应用设置
-The application can be accessed at:
+该应用可通过以下链接访问:
-- http://yourhost:3000/
-- https://yourhost:3001/
+* [http://yourhost:3000/](http://yourhost:3000/)
+* [https://yourhost:3001/](https://yourhost:3001/)
\ No newline at end of file
diff --git a/apps/firefox-browser/README_en.md b/apps/firefox-browser/README_en.md
new file mode 100644
index 000000000..55a9c4f00
--- /dev/null
+++ b/apps/firefox-browser/README_en.md
@@ -0,0 +1,26 @@
+
+
+
+[Firefox](https://www.mozilla.org/en-US/firefox/) Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards.
+
+
+## Supported Architectures
+
+We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
+
+Simply pulling `lscr.io/linuxserver/firefox:latest` should retrieve the correct image for your arch, but you can also pull specific arch images via tags.
+
+The architectures supported by this image are:
+
+| Architecture | Available | Tag |
+| --- | --- | --- |
+| x86-64 | ✅ | amd64-<version tag> |
+| arm64 | ✅ | arm64v8-<version tag> |
+| armhf | ❌ | |
+
+## Application Setup
+
+The application can be accessed at:
+
+- http://yourhost:3000/
+- https://yourhost:3001/
diff --git a/apps/flexget/README.md b/apps/flexget/README.md
index 87b5aeac5..e81d8f87c 100644
--- a/apps/flexget/README.md
+++ b/apps/flexget/README.md
@@ -8,56 +8,46 @@
[](http://isitmaintained.com/project/Flexget/Flexget)
-[FlexGet](https://flexget.com) is a multipurpose automation tool for
-content like torrents, nzbs, podcasts, comics, series, movies, etc. It
-can use different kinds of sources like RSS-feeds, html pages, csv
-files, search engines and there are even plugins for sites that do not
-provide any kind of useful feeds.
+[FlexGet](https://flexget.com) 是一款多功能的自动化工具,用于处理如种子、NZB、播客、漫画、剧集、电影等内容。它可以使用不同的来源,如 RSS 订阅源、HTML 页面、CSV 文件、搜索引擎,甚至为那些不提供任何有用订阅源的网站提供插件。
-# Example
+# 示例
-Flexget uses a [YAML](http://www.yaml.org/) based configuration file.
-The following example will look in the RSS feed in the link, will match
-any item that match the series names and download it:
+Flexget 使用基于 [YAML](http://www.yaml.org/) 的配置文件。以下示例将检查链接中的 RSS 订阅源,匹配任何与系列名称匹配的项目并下载它们:
- tasks:
- tv:
- rss: http://example.com/torrents.xml
- series:
- - some series
- - another series
- download: /tvshows
+```
+tasks:
+ tv:
+ rss: http://example.com/torrents.xml
+ series:
+ - some series
+ - another series
+ download: /tvshows
+```
-There are numerous plugins that allow utilizing FlexGet in interesting
-ways and more are being added continuously.
+有许多插件允许以有趣的方式使用 FlexGet,并且持续有更多插件被添加。
-FlexGet is extremely useful in conjunction with applications which have
-watch directory support or provide interface for external utilities like
-FlexGet. To get a sense of the many things that can be done with FlexGet
-you can take a look in our [cookbook](https://flexget.com/Cookbook).
+FlexGet 与支持监视目录或提供 FlexGet 等外部工具接口的应用程序结合使用时非常实用。要了解 FlexGet 可以完成的各种事情,您可以查看我们的[烹饪书](https://flexget.com/Cookbook) 。
-**ChangeLog:**
+**变更日志:**[https://flexget.com/ChangeLog](https://flexget.com/ChangeLog)
-**Help:**
+**帮助:**[https://github.com/Flexget/Flexget/discussions](https://github.com/Flexget/Flexget/discussions)
-**Chat:**
+**Chat:** [https://flexget.com/Chat](https://flexget.com/Chat)
-**Bugs:**
+**错误:**[https://github.com/Flexget/Flexget/issues](https://github.com/Flexget/Flexget/issues)
-## Install
+## 安装
-FlexGet is installable via pip with the command:
+FlexGet 可以通过 pip 命令安装:
- pip install flexget
+```
+pip install flexget
+```
-For more detailed instructions see the [installation
-guide](https://flexget.com/Install).
+更多详细说明请参阅[安装指南](https://flexget.com/Install) .
-## How to use GIT checkout
+## 如何使用 GIT checkout
-Refer to [development
-guide](https://flexget.readthedocs.io/en/latest/develop/index.html#how-do-i-get-started).
+请参考[开发指南](https://flexget.readthedocs.io/en/latest/develop/index.html#how-do-i-get-started) 。
-If you don\'t want to use virtualenv there\'s `flexget_vanilla.py` file
-which can be used to run FlexGet without virtualenv, note that you will
-need to install all required dependencies yourself.
+如果您不想使用 virtualenv,可以使用 `flexget_vanilla.py` 文件来运行 FlexGet 而不需要 virtualenv,请注意您需要自行安装所有必需的依赖项。
\ No newline at end of file
diff --git a/apps/flexget/README_en.md b/apps/flexget/README_en.md
new file mode 100644
index 000000000..87b5aeac5
--- /dev/null
+++ b/apps/flexget/README_en.md
@@ -0,0 +1,63 @@
+# FlexGet
+
+[](https://github.com/Flexget/Flexget/actions/workflows/main.yml?query=branch%3Adevelop)
+
+[](https://pypi.python.org/pypi/Flexget)
+
+[](https://discord.gg/W6CQrJx)
+
+[](http://isitmaintained.com/project/Flexget/Flexget)
+
+[FlexGet](https://flexget.com) is a multipurpose automation tool for
+content like torrents, nzbs, podcasts, comics, series, movies, etc. It
+can use different kinds of sources like RSS-feeds, html pages, csv
+files, search engines and there are even plugins for sites that do not
+provide any kind of useful feeds.
+
+# Example
+
+Flexget uses a [YAML](http://www.yaml.org/) based configuration file.
+The following example will look in the RSS feed in the link, will match
+any item that match the series names and download it:
+
+ tasks:
+ tv:
+ rss: http://example.com/torrents.xml
+ series:
+ - some series
+ - another series
+ download: /tvshows
+
+There are numerous plugins that allow utilizing FlexGet in interesting
+ways and more are being added continuously.
+
+FlexGet is extremely useful in conjunction with applications which have
+watch directory support or provide interface for external utilities like
+FlexGet. To get a sense of the many things that can be done with FlexGet
+you can take a look in our [cookbook](https://flexget.com/Cookbook).
+
+**ChangeLog:**
+
+**Help:**
+
+**Chat:**
+
+**Bugs:**
+
+## Install
+
+FlexGet is installable via pip with the command:
+
+ pip install flexget
+
+For more detailed instructions see the [installation
+guide](https://flexget.com/Install).
+
+## How to use GIT checkout
+
+Refer to [development
+guide](https://flexget.readthedocs.io/en/latest/develop/index.html#how-do-i-get-started).
+
+If you don\'t want to use virtualenv there\'s `flexget_vanilla.py` file
+which can be used to run FlexGet without virtualenv, note that you will
+need to install all required dependencies yourself.
diff --git a/apps/focalboard/README.md b/apps/focalboard/README.md
index 1cd5f187f..213e33b9b 100644
--- a/apps/focalboard/README.md
+++ b/apps/focalboard/README.md
@@ -8,142 +8,138 @@
# 原始相关
-# :warning: Announcement: PLEASE READ :warning:
-Focalboard Personal Server and Personal Desktop editions will transition to being fully community supported as of **April 30th, 2023**. This Focalboard repository will become the Personal Edition repository, and will remain open indefinitely. However, we won’t be adding any new enhancements, and will only address Sev-1 level bugs until April 30th, 2023.
+# :warning: 通告:请阅读 :warning:
+
+Focalboard 个人服务器和个人桌面版将从 2023 年 4 月 30 日起完全转为社区支持。此 Focalboard 仓库将成为个人版仓库,并将无限期保持开放。然而,我们不会添加任何新功能,并且仅在 2023 年 4 月 30 日之前解决 Sev-1 级别的错误。
# Focalboard
-
-
-
-
-
-
-
+    [](https://translate.mattermost.com/engage/focalboard/)
-Like what you see? :eyes: Give us a GitHub Star! :star:
+喜欢你所看到的吗? :eyes: 给我们一个 GitHub Star! :star:

-Focalboard is an open source, multilingual, self-hosted project management tool that's an alternative to Trello, Notion, and Asana.
+Focalboard 是一个开源的多语言自托管项目管理工具,是 Trello、Notion 和 Asana 的替代品。
-It helps define, organize, track and manage work across individuals and teams. Focalboard comes in three editions:
+它有助于定义、组织、跟踪和管理个人和团队之间的工作。Focalboard 有三个版本:
-* **[Mattermost Boards](https://mattermost.com/boards/)**: Integrated with the Mattermost platform for your team to plan and collaborate.
+* **[Mattermost Boards](https://mattermost.com/boards/)**:与 Mattermost 平台集成,以便您的团队进行计划和协作。
+
+* **[个人桌面](https://www.focalboard.com/docs/personal-edition/desktop/)** :一个独立的一用户 [macOS](https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8)、[Windows](https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website) 或 [Linux](https://www.focalboard.com/download/personal-edition/desktop/#linux-desktop) 桌面应用程序,用于您自己的待办事项和个人项目。
+
+* **[个人服务器](https://www.focalboard.com/download/personal-edition/ubuntu/)** :一款独立的多用户服务器,适用于开发和个人使用。
+
-* **[Personal Desktop](https://www.focalboard.com/docs/personal-edition/desktop/)**: A standalone, single-user [macOS](https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8), [Windows](https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website), or [Linux](https://www.focalboard.com/download/personal-edition/desktop/#linux-desktop) desktop app for your own todos and personal projects.
-
-* **[Personal Server](https://www.focalboard.com/download/personal-edition/ubuntu/)**: A standalone, multi-user server for development and personal use.
-
-## Try Focalboard
+## 尝试 Focalboard
### Mattermost Boards
-**Mattermost Boards** combines project management tools with messaging and collaboration for teams of all sizes. To access and use **Mattermost Boards**, install or upgrade to Mattermost v6.0 or later as a [self-hosted server](https://docs.mattermost.com/guides/deployment.html?utm_source=github&utm_campaign=focalboard). After logging into Mattermost, select the menu in the top left corner and select **Boards**.
+**Mattermost Boards** 将项目管理工具与消息传递和协作结合在一起,适用于所有规模的组织。要访问和使用 **Mattermost Boards**,请安装或升级到 Mattermost v6.0 或更高版本作为[自托管服务器](https://docs.mattermost.com/guides/deployment.html?utm_source=github&utm_campaign=focalboard) 。登录 Mattermost 后,选择左上角的菜单,然后选择 **Boards**。
-### Personal Desktop (Windows, Mac or Linux Desktop)
+### 个人桌面(Windows、Mac 或 Linux 桌面)
-* **Windows**: Download from the [Windows App Store](https://www.microsoft.com/store/productId/9NLN2T0SX9VF) or download `focalboard-win.zip` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and run `Focalboard.exe`.
-* **Mac**: Download from the [Mac App Store](https://apps.apple.com/us/app/focalboard-insiders/id1556908618?mt=12).
-* **Linux Desktop**: Download `focalboard-linux.tar.gz` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and open `focalboard-app`.
+* **Windows**:从 [Windows 应用商店](https://www.microsoft.com/store/productId/9NLN2T0SX9VF)下载或从[最新版本](https://github.com/mattermost/focalboard/releases)下载 `focalboard-win.zip`,解压后运行 `Focalboard.exe`。
+* **Mac**:从 [Mac 应用商店](https://apps.apple.com/us/app/focalboard-insiders/id1556908618?mt=12)下载。
+* **Linux 桌面** :从[最新版本](https://github.com/mattermost/focalboard/releases)下载 `focalboard-linux.tar.gz`,解压后打开 `focalboard-app`。
-### Personal Server
+### 个人服务器
-**Ubuntu**: You can download and run the compiled Focalboard **Personal Server** on Ubuntu by following [our latest install guide](https://www.focalboard.com/download/personal-edition/ubuntu/).
+**Ubuntu**:您可以通过遵循[我们最新的安装指南](https://www.focalboard.com/download/personal-edition/ubuntu/)下载并运行编译好的 Focalboard **个人服务器** 。
-### API Docs
+### API 文档
-Boards API docs can be found over at https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html
+Boards API 文档可以在 [https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html](https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html) 找到。
-## Contribute to Focalboard
+## 为 Focalboard 做出贡献
-For anyone interested in being an official maintainer of the Focalboard repository, please reach out to us on our [Focalboard Community Channel](https://community.mattermost.com/core/channels/focalboard). If there are no maintainers, and you’re still interested in adding your own improvements to the Focalboard Personal Editions, we encourage you to fork and maintain the repository.
+对于任何有兴趣成为 Focalboard 仓库官方维护者的人来说,请通过我们的 [Focalboard 社区频道](https://community.mattermost.com/core/channels/focalboard)联系我们。如果没有维护者,而你仍然有兴趣为 Focalboard 个人版添加自己的改进,我们鼓励你进行分支并维护该仓库。
-### Getting started
+### 入门指南
-Our [developer guide](https://developers.mattermost.com/contribute/focalboard/personal-server-setup-guide) has detailed instructions on how to set up your development environment for the **Personal Server**. It also provides more information about contributing to our open source community.
+我们的[开发者指南](https://developers.mattermost.com/contribute/focalboard/personal-server-setup-guide)详细说明了如何为**个人服务器**设置你的开发环境。它还提供了更多关于为我们的开源社区做出贡献的信息。
-Clone [mattermost-server](https://github.com/mattermost/mattermost-server) into sibling directory.
+将 [mattermost-server](https://github.com/mattermost/mattermost-server) 克隆到同级目录。
-Create an `.env` file in the focalboard directory that contains:
+在 focalboard 目录下创建一个 `.env` 文件,其中包含:
```
EXCLUDE_ENTERPRISE="1"
```
-To build the server:
+构建服务器:
```
make prebuild
make
```
-To run the server:
+运行服务器:
```
./bin/focalboard-server
```
-Then navigate your browser to [`http://localhost:8000`](http://localhost:8000) to access your Focalboard server. The port is configured in `config.json`.
+然后,在浏览器中导航到 [`http://localhost:8000`](http://localhost:8000) 以访问您的 Focalboard 服务器。端口号配置在 `config.json` 中。
-Once the server is running, you can rebuild just the web app via `make webapp` in a separate terminal window. Reload your browser to see the changes.
+一旦服务器运行,您可以在另一个终端窗口中通过 `make webapp` 重新构建仅网页应用。重新加载浏览器以查看更改。
-### Building and running standalone desktop apps
+### 构建和运行独立桌面应用
-You can build standalone apps that package the server to run locally against SQLite:
+您可以构建包含服务器的独立应用,以便在本地针对 SQLite 运行:
-* **Windows**:
- * *Requires Windows 10, [Windows 10 SDK](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/) 10.0.19041.0, and .NET 4.8 developer pack*
- * Open a `git-bash` prompt.
- * Run `make prebuild`
- * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
- * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
- * Run `make win-wpf-app`
- * Run `cd win-wpf/msix && focalboard.exe`
-* **Mac**:
- * *Requires macOS 11.3+ and Xcode 13.2.1+*
- * Run `make prebuild`
- * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
- * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
- * Run `make mac-app`
- * Run `open mac/dist/Focalboard.app`
-* **Linux**:
- * *Tested on Ubuntu 18.04*
- * Install `webgtk` dependencies
- * Run `sudo apt-get install libgtk-3-dev`
- * Run `sudo apt-get install libwebkit2gtk-4.0-dev`
- * Run `make prebuild`
- * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
- * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
- * Run `make linux-app`
- * Uncompress `linux/dist/focalboard-linux.tar.gz` to a directory of your choice
- * Run `focalboard-app` from the directory you have chosen
-* **Docker**:
- * To run it locally from offical image:
- * `docker run -it -p 80:8000 mattermost/focalboard`
- * To build it for your current architecture:
- * `docker build -f docker/Dockerfile .`
- * To build it for a custom architecture (experimental):
- * `docker build -f docker/Dockerfile --platform linux/arm64 .`
+* **Windows**:
+ * *需要 Windows 10,[Windows 10 SDK](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/) 10.0.19041.0,以及.NET 4.8 开发者包*
+ * 打开一个 `git-bash` 提示符。
+ * 运行 `make prebuild`
+ * 上述预构建步骤仅在您对项目进行更改或想要安装 npm 依赖项等时需要运行。
+ * 一旦预构建完成,您可以重复以下步骤来构建应用程序并查看更改。
+ * 运行 `make win-wpf-app`
+ * Run `cd win-wpf/msix && focalboard.exe`
+* **Mac**:
+ * *需要 macOS 11.3+ 和 Xcode 13.2.1+*
+ * 运行 `make prebuild`
+ * 上述预构建步骤仅在您对项目进行更改或想要安装 npm 依赖项等时需要运行。
+ * 预构建完成后,您可以重复以下步骤来构建应用程序并查看更改。
+ * 运行 `make mac-app`
+ * 运行 `open mac/dist/Focalboard.app`
+* **Linux**:
+ * *在 Ubuntu 18.04 上测试过*
+ * 安装 `webgtk` 依赖
+ * Run `sudo apt-get install libgtk-3-dev`
+ * Run `sudo apt-get install libwebkit2gtk-4.0-dev`
+ * 运行 `make prebuild`
+ * 上述预构建步骤仅在您对项目进行更改或想要安装 npm 依赖项等时需要运行。
+ * 预构建完成后,您可以重复以下步骤来构建应用程序并查看更改。
+ * 运行 `make linux-app`
+ * 解压 `linux/dist/focalboard-linux.tar.gz` 到您选择的目录
+ * 从您选择的目录运行 `focalboard-app`
+* **Docker**:
+ * 要从官方镜像本地运行它:
+ * `docker run -it -p 80:8000 mattermost/focalboard`
+ * 为构建适用于您当前架构:
+ * `docker build -f docker/Dockerfile .`
+ * 为构建适用于自定义架构(实验性):
+ * `docker build -f docker/Dockerfile --platform linux/arm64 .`
-Cross-compilation currently isn't fully supported, so please build on the appropriate platform. Refer to the GitHub Actions workflows (`build-mac.yml`, `build-win.yml`, `build-ubuntu.yml`) for the detailed list of steps on each platform.
+交叉编译目前尚未完全支持,请在该平台上进行构建。请参考 GitHub Actions 工作流程(`build-mac.yml`、`build-win.yml`、`build-ubuntu.yml`)以获取每个平台的详细步骤列表。
-### Unit testing
+### 单元测试
-Before checking in commits, run `make ci`, which is similar to the `.gitlab-ci.yml` workflow and includes:
+在提交检查之前,运行 `make ci`,这与 `.gitlab-ci.yml` 工作流程类似,包括:
-* **Server unit tests**: `make server-test`
-* **Web app ESLint**: `cd webapp; npm run check`
-* **Web app unit tests**: `cd webapp; npm run test`
-* **Web app UI tests**: `cd webapp; npm run cypress:ci`
+* **服务器单元测试** :`make server-test`
+* **Web 应用 ESLint**:`cd webapp; npm run check`
+* **Web 应用单元测试** :`cd webapp; npm run test`
+* **Web 应用 UI 测试** : `cd webapp; npm run cypress:ci`
-### Translating
+### 翻译中
-Help translate Focalboard! The app is already translated into several languages. We welcome corrections and new language translations! You can add new languages or improve existing translations at [Weblate](https://translate.mattermost.com/engage/focalboard/).
+帮助翻译 Focalboard!该应用已翻译成多种语言。我们欢迎更正和新语言翻译!您可以在 [Weblate](https://translate.mattermost.com/engage/focalboard/) 添加新语言或改进现有翻译。
-### Staying informed
+### 保持信息更新
-* **Changes**: See the [CHANGELOG](CHANGELOG.md) for the latest updates
-* **GitHub Discussions**: Join the [Developer Discussion](https://github.com/mattermost/focalboard/discussions) board
-* **Bug Reports**: [File a bug report](https://github.com/mattermost/focalboard/issues/new?assignees=&labels=bug&template=bug_report.md&title=)
-* **Chat**: Join the [Focalboard community channel](https://community.mattermost.com/core/channels/focalboard)
\ No newline at end of file
+* **变更** :查看最新的更新请参阅[变更日志](CHANGELOG.md)
+* **GitHub 讨论区** :加入[开发者讨论](https://github.com/mattermost/focalboard/discussions)板块
+* **错误报告** : [提交错误报告](https://github.com/mattermost/focalboard/issues/new?assignees=&labels=bug&template=bug_report.md&title=)
+* **聊天** :加入 [Focalboard 社区频道](https://community.mattermost.com/core/channels/focalboard)
\ No newline at end of file
diff --git a/apps/focalboard/README_en.md b/apps/focalboard/README_en.md
new file mode 100644
index 000000000..1cd5f187f
--- /dev/null
+++ b/apps/focalboard/README_en.md
@@ -0,0 +1,149 @@
+# 使用说明
+
+默认以`SQLite`数据库模式运行,
+
+需要以`postgres`数据库运行的,需要修改目录下的`postgres-config.json`里的数据库信息
+
+且修改`docker-compose.yml`文件里的配置映射。
+
+# 原始相关
+
+# :warning: Announcement: PLEASE READ :warning:
+Focalboard Personal Server and Personal Desktop editions will transition to being fully community supported as of **April 30th, 2023**. This Focalboard repository will become the Personal Edition repository, and will remain open indefinitely. However, we won’t be adding any new enhancements, and will only address Sev-1 level bugs until April 30th, 2023.
+
+# Focalboard
+
+
+
+
+
+
+
+
+
+Like what you see? :eyes: Give us a GitHub Star! :star:
+
+
+
+Focalboard is an open source, multilingual, self-hosted project management tool that's an alternative to Trello, Notion, and Asana.
+
+It helps define, organize, track and manage work across individuals and teams. Focalboard comes in three editions:
+
+* **[Mattermost Boards](https://mattermost.com/boards/)**: Integrated with the Mattermost platform for your team to plan and collaborate.
+
+* **[Personal Desktop](https://www.focalboard.com/docs/personal-edition/desktop/)**: A standalone, single-user [macOS](https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8), [Windows](https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website), or [Linux](https://www.focalboard.com/download/personal-edition/desktop/#linux-desktop) desktop app for your own todos and personal projects.
+
+* **[Personal Server](https://www.focalboard.com/download/personal-edition/ubuntu/)**: A standalone, multi-user server for development and personal use.
+
+## Try Focalboard
+
+### Mattermost Boards
+
+**Mattermost Boards** combines project management tools with messaging and collaboration for teams of all sizes. To access and use **Mattermost Boards**, install or upgrade to Mattermost v6.0 or later as a [self-hosted server](https://docs.mattermost.com/guides/deployment.html?utm_source=github&utm_campaign=focalboard). After logging into Mattermost, select the menu in the top left corner and select **Boards**.
+
+### Personal Desktop (Windows, Mac or Linux Desktop)
+
+* **Windows**: Download from the [Windows App Store](https://www.microsoft.com/store/productId/9NLN2T0SX9VF) or download `focalboard-win.zip` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and run `Focalboard.exe`.
+* **Mac**: Download from the [Mac App Store](https://apps.apple.com/us/app/focalboard-insiders/id1556908618?mt=12).
+* **Linux Desktop**: Download `focalboard-linux.tar.gz` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and open `focalboard-app`.
+
+### Personal Server
+
+**Ubuntu**: You can download and run the compiled Focalboard **Personal Server** on Ubuntu by following [our latest install guide](https://www.focalboard.com/download/personal-edition/ubuntu/).
+
+### API Docs
+
+Boards API docs can be found over at https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html
+
+## Contribute to Focalboard
+
+For anyone interested in being an official maintainer of the Focalboard repository, please reach out to us on our [Focalboard Community Channel](https://community.mattermost.com/core/channels/focalboard). If there are no maintainers, and you’re still interested in adding your own improvements to the Focalboard Personal Editions, we encourage you to fork and maintain the repository.
+
+### Getting started
+
+Our [developer guide](https://developers.mattermost.com/contribute/focalboard/personal-server-setup-guide) has detailed instructions on how to set up your development environment for the **Personal Server**. It also provides more information about contributing to our open source community.
+
+Clone [mattermost-server](https://github.com/mattermost/mattermost-server) into sibling directory.
+
+Create an `.env` file in the focalboard directory that contains:
+
+```
+EXCLUDE_ENTERPRISE="1"
+```
+
+To build the server:
+
+```
+make prebuild
+make
+```
+
+To run the server:
+
+```
+ ./bin/focalboard-server
+```
+
+Then navigate your browser to [`http://localhost:8000`](http://localhost:8000) to access your Focalboard server. The port is configured in `config.json`.
+
+Once the server is running, you can rebuild just the web app via `make webapp` in a separate terminal window. Reload your browser to see the changes.
+
+### Building and running standalone desktop apps
+
+You can build standalone apps that package the server to run locally against SQLite:
+
+* **Windows**:
+ * *Requires Windows 10, [Windows 10 SDK](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/) 10.0.19041.0, and .NET 4.8 developer pack*
+ * Open a `git-bash` prompt.
+ * Run `make prebuild`
+ * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
+ * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
+ * Run `make win-wpf-app`
+ * Run `cd win-wpf/msix && focalboard.exe`
+* **Mac**:
+ * *Requires macOS 11.3+ and Xcode 13.2.1+*
+ * Run `make prebuild`
+ * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
+ * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
+ * Run `make mac-app`
+ * Run `open mac/dist/Focalboard.app`
+* **Linux**:
+ * *Tested on Ubuntu 18.04*
+ * Install `webgtk` dependencies
+ * Run `sudo apt-get install libgtk-3-dev`
+ * Run `sudo apt-get install libwebkit2gtk-4.0-dev`
+ * Run `make prebuild`
+ * The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
+ * Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
+ * Run `make linux-app`
+ * Uncompress `linux/dist/focalboard-linux.tar.gz` to a directory of your choice
+ * Run `focalboard-app` from the directory you have chosen
+* **Docker**:
+ * To run it locally from offical image:
+ * `docker run -it -p 80:8000 mattermost/focalboard`
+ * To build it for your current architecture:
+ * `docker build -f docker/Dockerfile .`
+ * To build it for a custom architecture (experimental):
+ * `docker build -f docker/Dockerfile --platform linux/arm64 .`
+
+Cross-compilation currently isn't fully supported, so please build on the appropriate platform. Refer to the GitHub Actions workflows (`build-mac.yml`, `build-win.yml`, `build-ubuntu.yml`) for the detailed list of steps on each platform.
+
+### Unit testing
+
+Before checking in commits, run `make ci`, which is similar to the `.gitlab-ci.yml` workflow and includes:
+
+* **Server unit tests**: `make server-test`
+* **Web app ESLint**: `cd webapp; npm run check`
+* **Web app unit tests**: `cd webapp; npm run test`
+* **Web app UI tests**: `cd webapp; npm run cypress:ci`
+
+### Translating
+
+Help translate Focalboard! The app is already translated into several languages. We welcome corrections and new language translations! You can add new languages or improve existing translations at [Weblate](https://translate.mattermost.com/engage/focalboard/).
+
+### Staying informed
+
+* **Changes**: See the [CHANGELOG](CHANGELOG.md) for the latest updates
+* **GitHub Discussions**: Join the [Developer Discussion](https://github.com/mattermost/focalboard/discussions) board
+* **Bug Reports**: [File a bug report](https://github.com/mattermost/focalboard/issues/new?assignees=&labels=bug&template=bug_report.md&title=)
+* **Chat**: Join the [Focalboard community channel](https://community.mattermost.com/core/channels/focalboard)
\ No newline at end of file
diff --git a/apps/frpc/README.md b/apps/frpc/README.md
index 9e035d0ea..c5c14c731 100644
--- a/apps/frpc/README.md
+++ b/apps/frpc/README.md
@@ -1,413 +1,397 @@
-
# frp
-[](https://circleci.com/gh/fatedier/frp)
-[](https://github.com/fatedier/frp/releases)
+[](https://circleci.com/gh/fatedier/frp) [](https://github.com/fatedier/frp/releases)
-[README](README.md) | [中文文档](README_zh.md)
-
+### 金牌赞助商
-
+ [](https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=frp&utm_source=github) [](https://asocks.com/c/vDu6Dk)
-## What is frp?
+## 什么是 frp?
-frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports **TCP** and **UDP**, as well as **HTTP** and **HTTPS** protocols, enabling requests to be forwarded to internal services via domain name.
+frp 是一个快速的逆向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露给互联网。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,使得请求可以通过域名转发到内部服务。
-frp also offers a P2P connect mode.
+frp 还提供了一种 P2P 连接模式。
-## Table of Contents
+## 目录
-
+* [frp](#frp)
+ * [什么是 frp?](#what-is-frp)
+ * [目录](#table-of-contents)
+ * [开发状态](#development-status)
+ * [架构](#architecture)
+ * [示例用法](#example-usage)
+ * [通过 SSH 访问局域网内的计算机](#access-your-computer-in-a-lan-network-via-ssh)
+ * [在局域网中通过自定义域名访问内部 Web 服务](#accessing-internal-web-services-with-custom-domains-in-lan)
+ * [正向 DNS 查询请求](#forward-dns-query-requests)
+ * [正向 Unix 域套接字](#forward-unix-domain-socket)
+ * [暴露一个简单的 HTTP 文件服务器](#expose-a-simple-http-file-server)
+ * [为本地 HTTP(S)服务启用 HTTPS](#enable-https-for-a-local-https-service)
+ * [私密地公开您的服务](#expose-your-service-privately)
+ * [点对点模式](#p2p-mode)
+ * [功能](#features)
+ * [配置文件](#configuration-files)
+ * [使用环境变量](#using-environment-variables)
+ * [将配置拆分到不同的文件中](#split-configures-into-different-files)
+ * [仪表板](#dashboard)
+ * [管理界面](#admin-ui)
+ * [监控](#monitor)
+ * [普罗米修斯](#prometheus)
+ * [客户端认证](#authenticating-the-client)
+ * [令牌认证](#token-authentication)
+ * [OIDC 身份验证](#oidc-authentication)
+ * [加密和压缩](#encryption-and-compression)
+ * [TLS](#tls)
+ * [热重载 frpc 配置](#hot-reloading-frpc-configuration)
+ * [从客户端获取代理状态](#get-proxy-status-from-client)
+ * [仅允许服务器上某些端口](#only-allowing-certain-ports-on-the-server)
+ * [端口重用](#port-reuse)
+ * [带宽限制](#bandwidth-limit)
+ * [对于每个代理](#for-each-proxy)
+ * [TCP 流复用](#tcp-stream-multiplexing)
+ * [支持 KCP 协议](#support-kcp-protocol)
+ * [支持 QUIC 协议](#support-quic-protocol)
+ * [连接池](#connection-pooling)
+ * [负载均衡](#load-balancing)
+ * [服务健康检查](#service-health-check)
+ * [重写 HTTP 主机头](#rewriting-the-http-host-header)
+ * [设置其他 HTTP 头](#setting-other-http-headers)
+ * [获取真实 IP](#get-real-ip)
+ * [HTTP X-Forwarded-For](#http-x-forwarded-for)
+ * [代理协议](#proxy-protocol)
+ * [需要为 Web 服务要求 HTTP 基本认证(密码)](#require-http-basic-auth-password-for-web-services)
+ * [自定义子域名](#custom-subdomain-names)
+ * [URL 路由](#url-routing)
+ * [TCP 端口复用](#tcp-port-multiplexing)
+ * [连接到 frps 通过 HTTP 代理](#connecting-to-frps-via-http-proxy)
+ * [端口映射范围](#range-ports-mapping)
+ * [客户端插件](#client-plugins)
+ * [服务器管理插件](#server-manage-plugins)
+ * [发展计划](#development-plan)
+ * [贡献](#contributing)
+ * [捐赠](#donation)
+ * [GitHub 赞助者](#github-sponsors)
+ * [PayPal](#paypal)
-- [frp](#frp)
- - [What is frp?](#what-is-frp)
- - [Table of Contents](#table-of-contents)
- - [Development Status](#development-status)
- - [Architecture](#architecture)
- - [Example Usage](#example-usage)
- - [Access your computer in a LAN network via SSH](#access-your-computer-in-a-lan-network-via-ssh)
- - [Accessing Internal Web Services with Custom Domains in LAN](#accessing-internal-web-services-with-custom-domains-in-lan)
- - [Forward DNS query requests](#forward-dns-query-requests)
- - [Forward Unix Domain Socket](#forward-unix-domain-socket)
- - [Expose a simple HTTP file server](#expose-a-simple-http-file-server)
- - [Enable HTTPS for a local HTTP(S) service](#enable-https-for-a-local-https-service)
- - [Expose your service privately](#expose-your-service-privately)
- - [P2P Mode](#p2p-mode)
- - [Features](#features)
- - [Configuration Files](#configuration-files)
- - [Using Environment Variables](#using-environment-variables)
- - [Split Configures Into Different Files](#split-configures-into-different-files)
- - [Dashboard](#dashboard)
- - [Admin UI](#admin-ui)
- - [Monitor](#monitor)
- - [Prometheus](#prometheus)
- - [Authenticating the Client](#authenticating-the-client)
- - [Token Authentication](#token-authentication)
- - [OIDC Authentication](#oidc-authentication)
- - [Encryption and Compression](#encryption-and-compression)
- - [TLS](#tls)
- - [Hot-Reloading frpc configuration](#hot-reloading-frpc-configuration)
- - [Get proxy status from client](#get-proxy-status-from-client)
- - [Only allowing certain ports on the server](#only-allowing-certain-ports-on-the-server)
- - [Port Reuse](#port-reuse)
- - [Bandwidth Limit](#bandwidth-limit)
- - [For Each Proxy](#for-each-proxy)
- - [TCP Stream Multiplexing](#tcp-stream-multiplexing)
- - [Support KCP Protocol](#support-kcp-protocol)
- - [Support QUIC Protocol](#support-quic-protocol)
- - [Connection Pooling](#connection-pooling)
- - [Load balancing](#load-balancing)
- - [Service Health Check](#service-health-check)
- - [Rewriting the HTTP Host Header](#rewriting-the-http-host-header)
- - [Setting other HTTP Headers](#setting-other-http-headers)
- - [Get Real IP](#get-real-ip)
- - [HTTP X-Forwarded-For](#http-x-forwarded-for)
- - [Proxy Protocol](#proxy-protocol)
- - [Require HTTP Basic Auth (Password) for Web Services](#require-http-basic-auth-password-for-web-services)
- - [Custom Subdomain Names](#custom-subdomain-names)
- - [URL Routing](#url-routing)
- - [TCP Port Multiplexing](#tcp-port-multiplexing)
- - [Connecting to frps via HTTP PROXY](#connecting-to-frps-via-http-proxy)
- - [Range ports mapping](#range-ports-mapping)
- - [Client Plugins](#client-plugins)
- - [Server Manage Plugins](#server-manage-plugins)
- - [Development Plan](#development-plan)
- - [Contributing](#contributing)
- - [Donation](#donation)
- - [GitHub Sponsors](#github-sponsors)
- - [PayPal](#paypal)
+## 开发状态
-
+frp 目前正在开发中。您可以在 `master` 分支尝试最新的发布版本,或者使用 `dev` 分支访问正在开发中的版本。
-## Development Status
+我们目前正在开发版本2,并尝试进行一些代码重构和改进。但是请注意,它将不与版本1兼容。
-frp is currently under development. You can try the latest release version in the `master` branch, or use the `dev` branch to access the version currently in development.
+我们将从版本0过渡到版本1,届时将只接受错误修复和改进,而不是大的功能请求。
-We are currently working on version 2 and attempting to perform some code refactoring and improvements. However, please note that it will not be compatible with version 1.
-
-We will transition from version 0 to version 1 at the appropriate time and will only accept bug fixes and improvements, rather than big feature requests.
-
-## Architecture
+## 架构

-## Example Usage
+## 示例用法
-To begin, download the latest program for your operating system and architecture from the [Release](https://github.com/fatedier/frp/releases) page.
+首先,从[发布](https://github.com/fatedier/frp/releases)页面下载适用于您操作系统和架构的最新程序。
-Next, place the `frps` binary and `frps.ini` configuration file on Server A, which has a public IP address.
+接下来,将 `frps` 二进制文件和 `frps.ini` 配置文件放置在具有公网 IP 地址的服务器 A 上。
-Finally, place the `frpc` binary and `frpc.ini` configuration file on Server B, which is located on a LAN that cannot be directly accessed from the public internet.
+最后,将 `frpc` 二进制文件和 `frpc.ini` 配置文件放置在位于无法从公网直接访问的局域网上的服务器 B 上。
-### Access your computer in a LAN network via SSH
+### 通过 SSH 在局域网内访问您的计算机
-1. Modify `frps.ini` on server A by setting the `bind_port` for frp clients to connect to:
+1. 在服务器 A 上修改 `frps.ini`,设置 `bind_port` 以便 frp 客户端连接:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+```
-2. Start `frps` on server A:
+2. 在服务器 A 上启动 `frps`:
- `./frps -c ./frps.ini`
+`./frps -c ./frps.ini`
-3. Modify `frpc.ini` on server B and set the `server_addr` field to the public IP address of your frps server:
+3. 在服务器 B 上修改 `frpc.ini`,并将 `server_addr` 字段设置为您的 frps 服务器的公网 IP 地址:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- [ssh]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 22
- remote_port = 6000
- ```
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 6000
+```
-Note that the `local_port` (listened on the client) and `remote_port` (exposed on the server) are used for traffic going in and out of the frp system, while the `server_port` is used for communication between frps and frpc.
+请注意,`local_port`(客户端监听)和 `remote_port`(服务器上暴露)用于 frp 系统中的进出流量,而 `server_port` 用于 frps 和 frpc 之间的通信。
-4. Start `frpc` on server B:
+4. 在服务器 B 上启动 `frpc`:
- `./frpc -c ./frpc.ini`
+`./frpc -c ./frpc.ini`
-5. To access server B from another machine through server A via SSH (assuming the username is `test`), use the following command:
+5. 要从另一台机器通过服务器 A 通过 SSH 访问服务器 B(假设用户名为 `test`),请使用以下命令:
- `ssh -oPort=6000 test@x.x.x.x`
+`ssh -oPort=6000 test@x.x.x.x`
-### Accessing Internal Web Services with Custom Domains in LAN
+### 在局域网中使用自定义域名访问内部 Web 服务
-Sometimes we need to expose a local web service behind a NAT network to others for testing purposes with our own domain name.
+有时我们需要将位于 NAT 网络背后的本地 Web 服务暴露给其他人,以便使用自己的域名进行测试。
-Unfortunately, we cannot resolve a domain name to a local IP. However, we can use frp to expose an HTTP(S) service.
+不幸的是,我们无法将域名解析为本地 IP。然而,我们可以使用 frp 来暴露 HTTP(S)服务。
-1. Modify `frps.ini` and set the HTTP port for vhost to 8080:
+1. 修改 `frps.ini` 并将 vhost 的 HTTP 端口设置为 8080:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- vhost_http_port = 8080
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+vhost_http_port = 8080
+```
-2. Start `frps`:
+2. 启动 `frps`:
- `./frps -c ./frps.ini`
+`./frps -c ./frps.ini`
-3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Specify the `local_port` of your web service:
+3. 修改 `frpc.ini` 并将 `server_addr` 设置为远程 frps 服务器的 IP 地址。指定您的 Web 服务的 `local_port`:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- [web]
- type = http
- local_port = 80
- custom_domains = www.example.com
- ```
+[web]
+type = http
+local_port = 80
+custom_domains = www.example.com
+```
-4. Start `frpc`:
+4. 启动 `frpc`:
- `./frpc -c ./frpc.ini`
+`./frpc -c ./frpc.ini`
-5. Map the A record of `www.example.com` to either the public IP of the remote frps server or a CNAME record pointing to your original domain.
+5. 将 `www.example.com` 的 A 记录映射到远程 frps 服务器的公网 IP 地址或指向您原始域名的 CNAME 记录。
+
+6. 使用 url `http://www.example.com:8080` 访问您的本地 Web 服务。
+
-6. Visit your local web service using url `http://www.example.com:8080`.
+### 转发 DNS 查询请求
-### Forward DNS query requests
+1. 修改 `frps.ini`:
-1. Modify `frps.ini`:
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+```
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- ```
+2. 启动 `frps`:
-2. Start `frps`:
+`./frps -c ./frps.ini`
- `./frps -c ./frps.ini`
+3. 修改 `frpc.ini` 并将 `server_addr` 设置为远程 frps 服务器的 IP 地址。将 DNS 查询请求转发到谷歌公共 DNS 服务器 `8.8.8.8:53`:
-3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Forward DNS query requests to the Google Public DNS server `8.8.8.8:53`:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[dns]
+type = udp
+local_ip = 8.8.8.8
+local_port = 53
+remote_port = 6000
+```
- [dns]
- type = udp
- local_ip = 8.8.8.8
- local_port = 53
- remote_port = 6000
- ```
+4. 启动 frpc:
-4. Start frpc:
+`./frpc -c ./frpc.ini`
- `./frpc -c ./frpc.ini`
+5. 使用 `dig` 命令测试 DNS 解析:
-5. Test DNS resolution using the `dig` command:
+`dig @x.x.x.x -p 6000 www.google.com`
- `dig @x.x.x.x -p 6000 www.google.com`
+### 转发 Unix 域套接字
-### Forward Unix Domain Socket
+将 Unix 域套接字(例如 Docker 守护进程套接字)暴露为 TCP。
-Expose a Unix domain socket (e.g. the Docker daemon socket) as TCP.
+配置 `frps` 如上所述。
-Configure `frps` as above.
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[unix_domain_socket]
+type = tcp
+remote_port = 6000
+plugin = unix_domain_socket
+plugin_unix_path = /var/run/docker.sock
+```
- [unix_domain_socket]
- type = tcp
- remote_port = 6000
- plugin = unix_domain_socket
- plugin_unix_path = /var/run/docker.sock
- ```
+2. 使用 `curl` 获取 docker 版本以测试配置:
-2. Test the configuration by getting the docker version using `curl`:
+`curl http://x.x.x.x:6000/version`
- `curl http://x.x.x.x:6000/version`
+### 公开一个简单的 HTTP 文件服务器
-### Expose a simple HTTP file server
+暴露一个简单的 HTTP 文件服务器,以便从公网访问局域网中存储的文件。
-Expose a simple HTTP file server to access files stored in the LAN from the public Internet.
+按照上述说明配置 `frps`,然后:
-Configure `frps` as described above, then:
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[test_static_file]
+type = tcp
+remote_port = 6000
+plugin = static_file
+plugin_local_path = /tmp/files
+plugin_strip_prefix = static
+plugin_http_user = abc
+plugin_http_passwd = abc
+```
- [test_static_file]
- type = tcp
- remote_port = 6000
- plugin = static_file
- plugin_local_path = /tmp/files
- plugin_strip_prefix = static
- plugin_http_user = abc
- plugin_http_passwd = abc
- ```
+2. 使用浏览器访问 `http://x.x.x.x:6000/static/`,并指定正确的用户名和密码,以查看 `frpc` 机器上的 `/tmp/files` 目录中的文件。
-2. Visit `http://x.x.x.x:6000/static/` from your browser and specify correct username and password to view files in `/tmp/files` on the `frpc` machine.
+### 启用本地 HTTP(S)服务的 HTTPS
-### Enable HTTPS for a local HTTP(S) service
+您可以将插件中的 `https2https` 替换,并将 `plugin_local_addr` 指向一个 HTTPS 端点。
-You may substitute `https2https` for the plugin, and point the `plugin_local_addr` to a HTTPS endpoint.
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[test_https2http]
+type = https
+custom_domains = test.example.com
- [test_https2http]
- type = https
- custom_domains = test.example.com
+plugin = https2http
+plugin_local_addr = 127.0.0.1:80
+plugin_crt_path = ./server.crt
+plugin_key_path = ./server.key
+plugin_host_header_rewrite = 127.0.0.1
+plugin_header_X-From-Where = frp
+```
- plugin = https2http
- plugin_local_addr = 127.0.0.1:80
- plugin_crt_path = ./server.crt
- plugin_key_path = ./server.key
- plugin_host_header_rewrite = 127.0.0.1
- plugin_header_X-From-Where = frp
- ```
+2. 访问 `https://test.example.com`。
-2. Visit `https://test.example.com`.
+### 私密地公开您的服务
-### Expose your service privately
+为了减轻直接将某些服务暴露给公共网络所带来的风险,STCP(秘密 TCP)模式要求使用预共享密钥,以便其他客户端访问该服务。
-To mitigate risks associated with exposing certain services directly to the public network, STCP (Secret TCP) mode requires a preshared key to be used for access to the service from other clients.
+配置与上述相同的 `frps`。
-Configure `frps` same as above.
+1. 在机器 B 上使用以下配置启动 `frpc`。此示例用于公开 SSH 服务(端口 22),请注意预共享密钥的字段 `sk`,以及这里已移除的 `remote_port` 字段:
-1. Start `frpc` on machine B with the following config. This example is for exposing the SSH service (port 22), and note the `sk` field for the preshared key, and that the `remote_port` field is removed here:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[secret_ssh]
+type = stcp
+sk = abcdefg
+local_ip = 127.0.0.1
+local_port = 22
+```
- [secret_ssh]
- type = stcp
- sk = abcdefg
- local_ip = 127.0.0.1
- local_port = 22
- ```
+2. 启动另一个 `frpc`(通常在另一台机器 C 上)以以下配置使用安全密钥(`sk` 字段)访问 SSH 服务:
-2. Start another `frpc` (typically on another machine C) with the following config to access the SSH service with a security key (`sk` field):
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[secret_ssh_visitor]
+type = stcp
+role = visitor
+server_name = secret_ssh
+sk = abcdefg
+bind_addr = 127.0.0.1
+bind_port = 6000
+```
- [secret_ssh_visitor]
- type = stcp
- role = visitor
- server_name = secret_ssh
- sk = abcdefg
- bind_addr = 127.0.0.1
- bind_port = 6000
- ```
+3. 在机器 C 上,使用以下命令连接到机器 B 的 SSH:
-3. On machine C, connect to SSH on machine B, using this command:
+`ssh -oPort=6000 127.0.0.1`
- `ssh -oPort=6000 127.0.0.1`
+### P2P 模式
-### P2P Mode
+**xtcp** 旨在在客户端之间直接传输大量数据。仍然需要一个 frps 服务器,因为这里的 P2P 仅指实际的数据传输。
-**xtcp** is designed to transmit large amounts of data directly between clients. A frps server is still needed, as P2P here only refers to the actual data transmission.
+Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
-Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
+1. In `frps.ini` configure a UDP port for xtcp:
-1. In `frps.ini` configure a UDP port for xtcp:
+```ini
+# frps.ini
+bind_udp_port = 7001
+```
- ```ini
- # frps.ini
- bind_udp_port = 7001
- ```
+2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
-2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[p2p_ssh]
+type = xtcp
+sk = abcdefg
+local_ip = 127.0.0.1
+local_port = 22
+```
- [p2p_ssh]
- type = xtcp
- sk = abcdefg
- local_ip = 127.0.0.1
- local_port = 22
- ```
+3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
-3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[p2p_ssh_visitor]
+type = xtcp
+role = visitor
+server_name = p2p_ssh
+sk = abcdefg
+bind_addr = 127.0.0.1
+bind_port = 6000
+```
- [p2p_ssh_visitor]
- type = xtcp
- role = visitor
- server_name = p2p_ssh
- sk = abcdefg
- bind_addr = 127.0.0.1
- bind_port = 6000
- ```
+4. 在机器 C 上,使用以下命令连接到机器 B 的 SSH:
-4. On machine C, connect to SSH on machine B, using this command:
+`ssh -oPort=6000 127.0.0.1`
- `ssh -oPort=6000 127.0.0.1`
+## 功能
-## Features
+### 配置文件
-### Configuration Files
+阅读完整的示例配置文件,以了解更多此处未描述的功能。
-Read the full example configuration files to find out even more features not described here.
+[frps(服务器)的完整配置文件](./conf/frps_full.ini)
-[Full configuration file for frps (Server)](./conf/frps_full.ini)
+[frpc(客户端)完整配置文件](./conf/frpc_full.ini)
-[Full configuration file for frpc (Client)](./conf/frpc_full.ini)
+### 使用环境变量
-### Using Environment Variables
-
-Environment variables can be referenced in the configuration file, using Go's standard format:
+配置文件中可以使用 Go 的标准格式引用环境变量:
```ini
# frpc.ini
@@ -422,7 +406,7 @@ local_port = 22
remote_port = {{ .Envs.FRP_SSH_REMOTE_PORT }}
```
-With the config above, variables can be passed into `frpc` program like this:
+使用上述配置,可以将变量传递给 `frpc` 程序,如下所示:
```
export FRP_SERVER_ADDR="x.x.x.x"
@@ -430,11 +414,11 @@ export FRP_SSH_REMOTE_PORT="6000"
./frpc -c ./frpc.ini
```
-`frpc` will render configuration file template using OS environment variables. Remember to prefix your reference with `.Envs`.
+`frpc` 将使用操作系统环境变量渲染配置文件模板。请记住,在您的引用前加上 `.Envs`。
-### Split Configures Into Different Files
+### 将配置文件拆分为不同的文件
-You can split multiple proxy configs into different files and include them in the main file.
+您可以将多个代理配置拆分为不同的文件,并在主文件中包含它们。
```ini
# frpc.ini
@@ -453,11 +437,11 @@ local_port = 22
remote_port = 6000
```
-### Dashboard
+### 仪表板
-Check frp's status and proxies' statistics information by Dashboard.
+通过仪表板检查 frp 的状态和代理的统计信息。
-Configure a port for dashboard to enable this feature:
+配置仪表板的端口以启用此功能:
```ini
[common]
@@ -467,9 +451,9 @@ dashboard_user = admin
dashboard_pwd = admin
```
-Then visit `http://[server_addr]:7500` to see the dashboard, with username and password both being `admin`.
+然后访问 `http://[服务器地址]:7500` 查看仪表板,用户名和密码均为 `admin`。
-Additionally, you can use HTTPS port by using your domains wildcard or normal SSL certificate:
+此外,您还可以通过使用您的域名通配符或普通 SSL 证书来使用 HTTPS 端口:
```ini
[common]
@@ -482,15 +466,15 @@ dashboard_tls_cert_file = server.crt
dashboard_tls_key_file = server.key
```
-Then visit `https://[server_addr]:7500` to see the dashboard in secure HTTPS connection, with username and password both being `admin`.
+然后访问 `https://[服务器地址]:7500` 以安全 HTTPS 连接查看仪表板,用户名和密码均为 `admin`。

-### Admin UI
+### 管理员界面
-The Admin UI helps you check and manage frpc's configuration.
+管理员界面帮助您检查和管理 frpc 的配置。
-Configure an address for admin UI to enable this feature:
+配置管理员界面的地址以启用此功能:
```ini
[common]
@@ -500,43 +484,43 @@ admin_user = admin
admin_pwd = admin
```
-Then visit `http://127.0.0.1:7400` to see admin UI, with username and password both being `admin`.
+然后访问 `http://127.0.0.1:7400` 查看管理界面,用户名和密码都为 `admin`。
-### Monitor
+### 监控
-When dashboard is enabled, frps will save monitor data in cache. It will be cleared after process restart.
+当启用仪表板时,frps 将监控数据保存在缓存中。进程重启后将被清除。
-Prometheus is also supported.
+也支持 Prometheus。
#### Prometheus
-Enable dashboard first, then configure `enable_prometheus = true` in `frps.ini`.
+首先启用仪表板,然后在 `frps.ini` 中配置 `enable_prometheus = true`。
-`http://{dashboard_addr}/metrics` will provide prometheus monitor data.
+`http://{dashboard_addr}/metrics` 将提供 Prometheus 监控数据。
-### Authenticating the Client
+### 客户端认证
-There are 2 authentication methods to authenticate frpc with frps.
+有 2 种认证方法用于认证 frpc 与 frps。
-You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
+You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
-Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
+Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
-Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
+Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
-#### Token Authentication
+#### Token Authentication
-When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
+When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
-Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
+Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
-#### OIDC Authentication
+#### OIDC Authentication
-When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
+When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
-OIDC stands for OpenID Connect, and the flow used is called [Client Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.4).
+OIDC 代表 OpenID Connect,所使用的流程称为[客户端凭证授权](https://tools.ietf.org/html/rfc6749#section-4.4) 。
-To use this authentication type - configure `frpc.ini` and `frps.ini` as follows:
+要使用此认证类型 - 按照以下方式配置 `frpc.ini` 和 `frps.ini`:
```ini
# frps.ini
@@ -556,9 +540,9 @@ oidc_audience = https://oidc-audience.com/.default
oidc_token_endpoint_url = https://example-oidc-endpoint.com/oauth2/v2.0/token
```
-### Encryption and Compression
+### 加密和压缩
-The features are off by default. You can turn on encryption and/or compression:
+这些功能默认是关闭的。您可以选择开启加密和/或压缩:
```ini
# frpc.ini
@@ -570,17 +554,18 @@ use_encryption = true
use_compression = true
```
-#### TLS
+#### TLS
-frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
+frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
-For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
+For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
-Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
+Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
-To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+
+**`frpc` TLS settings (under the `[common]` section):**
-**`frpc` TLS settings (under the `[common]` section):**
```ini
tls_enable = true
tls_cert_file = certificate.crt
@@ -588,7 +573,8 @@ tls_key_file = certificate.key
tls_trusted_ca_file = ca.crt
```
-**`frps` TLS settings (under the `[common]` section):**
+**`frps` TLS settings (under the `[common]` section):**
+
```ini
tls_only = true
tls_enable = true
@@ -597,13 +583,14 @@ tls_key_file = certificate.key
tls_trusted_ca_file = ca.crt
```
-You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
+You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
-If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
+If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
-Given an example:
+Given an example:
+
+* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
-* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
```
cat > my-openssl.cnf << EOF
[ ca ]
@@ -632,13 +619,15 @@ basicConstraints = CA:true
EOF
```
-* build ca certificates:
+* build ca certificates:
+
```
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
```
-* build frps certificates:
+* 构建 frps 证书:
+
```
openssl genrsa -out server.key 2048
@@ -654,7 +643,8 @@ openssl x509 -req -days 365 -sha256 \
-out server.crt
```
-* build frpc certificates:
+* 构建 frpc 证书:
+
```
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
@@ -669,9 +659,9 @@ openssl x509 -req -days 365 -sha256 \
-out client.crt
```
-### Hot-Reloading frpc configuration
+### 热重载 frpc 配置
-The `admin_addr` and `admin_port` fields are required for enabling HTTP API:
+要启用 HTTP API,需要填写 `admin_addr` 和 `admin_port` 字段
```ini
# frpc.ini
@@ -680,19 +670,19 @@ admin_addr = 127.0.0.1
admin_port = 7400
```
-Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
+Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
-**Note that parameters in [common] section won't be modified except 'start'.**
+**Note that parameters in \[common\] section won't be modified except 'start'.**
-You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
+You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
-### Get proxy status from client
+### Get proxy status from client
-Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
+Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
-### Only allowing certain ports on the server
+### Only allowing certain ports on the server
-`allow_ports` in `frps.ini` is used to avoid abuse of ports:
+`allow_ports` in `frps.ini` is used to avoid abuse of ports:
```ini
# frps.ini
@@ -700,17 +690,17 @@ Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` a
allow_ports = 2000-3000,3001,3003,4000-50000
```
-`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
+`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
-### Port Reuse
+### Port Reuse
-`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
+`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
-We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
+We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
-### Bandwidth Limit
+### Bandwidth Limit
-#### For Each Proxy
+#### For Each Proxy
```ini
# frpc.ini
@@ -721,15 +711,15 @@ remote_port = 6000
bandwidth_limit = 1MB
```
-Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
+Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
-Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
+Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
-### TCP Stream Multiplexing
+### TCP Stream Multiplexing
-frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
+frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
-You can disable this feature by modify `frps.ini` and `frpc.ini`:
+You can disable this feature by modify `frps.ini` and `frpc.ini`:
```ini
# frps.ini and frpc.ini, must be same
@@ -737,91 +727,91 @@ You can disable this feature by modify `frps.ini` and `frpc.ini`:
tcp_mux = false
```
-### Support KCP Protocol
+### Support KCP Protocol
-KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
+KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
-KCP mode uses UDP as the underlying transport. Using KCP in frp:
+KCP mode uses UDP as the underlying transport. Using KCP in frp:
-1. Enable KCP in frps:
+1. Enable KCP in frps:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- # Specify a UDP port for KCP.
- kcp_bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+# Specify a UDP port for KCP.
+kcp_bind_port = 7000
+```
- The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
-2. Configure `frpc.ini` to use KCP to connect to frps:
+2. Configure `frpc.ini` to use KCP to connect to frps:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- # Same as the 'kcp_bind_port' in frps.ini
- server_port = 7000
- protocol = kcp
- ```
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+# Same as the 'kcp_bind_port' in frps.ini
+server_port = 7000
+protocol = kcp
+```
-### Support QUIC Protocol
+### Support QUIC Protocol
-QUIC is a new multiplexed transport built on top of UDP.
+QUIC is a new multiplexed transport built on top of UDP.
-Using QUIC in frp:
+Using QUIC in frp:
-1. Enable QUIC in frps:
+1. Enable QUIC in frps:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- # Specify a UDP port for QUIC.
- quic_bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+# Specify a UDP port for QUIC.
+quic_bind_port = 7000
+```
- The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
-2. Configure `frpc.ini` to use QUIC to connect to frps:
+2. Configure `frpc.ini` to use QUIC to connect to frps:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- # Same as the 'quic_bind_port' in frps.ini
- server_port = 7000
- protocol = quic
- ```
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+# Same as the 'quic_bind_port' in frps.ini
+server_port = 7000
+protocol = quic
+```
-### Connection Pooling
+### Connection Pooling
-By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
+By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
-This feature is suitable for a large number of short connections.
+This feature is suitable for a large number of short connections.
-1. Configure the limit of pool count each proxy can use in `frps.ini`:
+1. Configure the limit of pool count each proxy can use in `frps.ini`:
- ```ini
- # frps.ini
- [common]
- max_pool_count = 5
- ```
+```ini
+# frps.ini
+[common]
+max_pool_count = 5
+```
-2. Enable and specify the number of connection pool:
+2. Enable and specify the number of connection pool:
- ```ini
- # frpc.ini
- [common]
- pool_count = 1
- ```
+```ini
+# frpc.ini
+[common]
+pool_count = 1
+```
-### Load balancing
+### Load balancing
-Load balancing is supported by `group`.
+Load balancing is supported by `group`.
-This feature is only available for types `tcp`, `http`, `tcpmux` now.
+This feature is only available for types `tcp`, `http`, `tcpmux` now.
```ini
# frpc.ini
@@ -840,21 +830,21 @@ group = web
group_key = 123
```
-`group_key` is used for authentication.
+`group_key` is used for authentication.
-Connections to port 80 will be dispatched to proxies in the same group randomly.
+Connections to port 80 will be dispatched to proxies in the same group randomly.
-For type `tcp`, `remote_port` in the same group should be the same.
+For type `tcp`, `remote_port` in the same group should be the same.
-For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
+For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
-### Service Health Check
+### Service Health Check
-Health check feature can help you achieve high availability with load balancing.
+Health check feature can help you achieve high availability with load balancing.
-Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
+Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
-With health check type **tcp**, the service port will be pinged (TCPing):
+With health check type **tcp**, the service port will be pinged (TCPing):
```ini
# frpc.ini
@@ -872,7 +862,7 @@ health_check_max_failed = 3
health_check_interval_s = 10
```
-With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
+With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
```ini
# frpc.ini
@@ -891,11 +881,11 @@ health_check_max_failed = 3
health_check_interval_s = 10
```
-### Rewriting the HTTP Host Header
+### Rewriting the HTTP Host Header
-By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
+By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
-However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
+However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
```ini
# frpc.ini
@@ -906,11 +896,11 @@ custom_domains = test.example.com
host_header_rewrite = dev.example.com
```
-The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
+The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
-### Setting other HTTP Headers
+### Setting other HTTP Headers
-Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
+Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
```ini
# frpc.ini
@@ -922,23 +912,23 @@ host_header_rewrite = dev.example.com
header_X-From-Where = frp
```
-Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
+Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
-In this example, it will set header `X-From-Where: frp` in the HTTP request.
+In this example, it will set header `X-From-Where: frp` in the HTTP request.
-### Get Real IP
+### Get Real IP
-#### HTTP X-Forwarded-For
+#### HTTP X-Forwarded-For
-This feature is for http proxy only.
+This feature is for http proxy only.
-You can get user's real IP from HTTP request headers `X-Forwarded-For`.
+You can get user's real IP from HTTP request headers `X-Forwarded-For`.
-#### Proxy Protocol
+#### Proxy Protocol
-frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
+frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
-Here is an example for https service:
+Here is an example for https service:
```ini
# frpc.ini
@@ -951,15 +941,15 @@ custom_domains = test.example.com
proxy_protocol_version = v2
```
-You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
+You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
-### Require HTTP Basic Auth (Password) for Web Services
+### Require HTTP Basic Auth (Password) for Web Services
-Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
+Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
-This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
+This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
-It can only be enabled when proxy type is http.
+It can only be enabled when proxy type is http.
```ini
# frpc.ini
@@ -971,18 +961,18 @@ http_user = abc
http_pwd = abc
```
-Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
+Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
-### Custom Subdomain Names
+### Custom Subdomain Names
-It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
+It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
```ini
# frps.ini
subdomain_host = frps.com
```
-Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
+Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
```ini
# frpc.ini
@@ -992,15 +982,15 @@ local_port = 80
subdomain = test
```
-Now you can visit your web service on `test.frps.com`.
+Now you can visit your web service on `test.frps.com`.
-Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
+Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
-### URL Routing
+### URL Routing
-frp supports forwarding HTTP requests to different backend web services by url routing.
+frp supports forwarding HTTP requests to different backend web services by url routing.
-`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
+`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
```ini
# frpc.ini
@@ -1017,19 +1007,19 @@ custom_domains = web.example.com
locations = /news,/about
```
-HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
+HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
-### TCP Port Multiplexing
+### TCP Port Multiplexing
-frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
+frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
-The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
+The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
-When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
+When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
-The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
+The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
-For example:
+例如:
```ini
# frps.ini
@@ -1057,18 +1047,19 @@ custom_domains = test2
local_port = 8080
```
-In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
+In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
```
CONNECT test1 HTTP/1.1\r\n\r\n
```
-and the connection will be routed to `proxy1`.
-### Connecting to frps via HTTP PROXY
+and the connection will be routed to `proxy1`.
-frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+### Connecting to frps via HTTP PROXY
-It only works when protocol is tcp.
+frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+
+It only works when protocol is tcp.
```ini
# frpc.ini
@@ -1078,9 +1069,9 @@ server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
```
-### Range ports mapping
+### Range ports mapping
-Proxy with names that start with `range:` will support mapping range ports.
+Proxy with names that start with `range:` will support mapping range ports.
```ini
# frpc.ini
@@ -1091,17 +1082,17 @@ local_port = 6000-6006,6007
remote_port = 6000-6006,6007
```
-frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
+frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
-### Client Plugins
+### Client Plugins
-frpc only forwards requests to local TCP or UDP ports by default.
+frpc only forwards requests to local TCP or UDP ports by default.
-Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
+Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
-Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
+Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
-Using plugin **http_proxy**:
+Using plugin **http\_proxy**:
```ini
# frpc.ini
@@ -1113,40 +1104,39 @@ plugin_http_user = abc
plugin_http_passwd = abc
```
-`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
+`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
-### Server Manage Plugins
+### Server Manage Plugins
-Read the [document](/doc/server_plugin.md).
+Read the [document](/doc/server_plugin.md).
-Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
+Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
-## Development Plan
+## Development Plan
-* Log HTTP request information in frps.
+* Log HTTP request information in frps.
-## Contributing
+## 贡献
-Interested in getting involved? We would like to help you!
+Interested in getting involved? We would like to help you!
-* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
-* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
-* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
-* If you have great ideas, send an email to fatedier@gmail.com.
+* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
+* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
+* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
+* If you have great ideas, send an email to [fatedier@gmail.com](mailto:fatedier@gmail.com).
-**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
+**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
-## Donation
+## Donation
-If frp helps you a lot, you can support us by:
+If frp helps you a lot, you can support us by:
-### GitHub Sponsors
+### GitHub Sponsors
-Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
+Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
-You can have your company's logo placed on README file of this project.
+You can have your company's logo placed on README file of this project.
-### PayPal
-
-Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **fatedier@gmail.com**.
+### PayPal
+Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **[fatedier@gmail.com](mailto:fatedier@gmail.com)**.
\ No newline at end of file
diff --git a/apps/frpc/README_en.md b/apps/frpc/README_en.md
new file mode 100644
index 000000000..9e035d0ea
--- /dev/null
+++ b/apps/frpc/README_en.md
@@ -0,0 +1,1152 @@
+
+# frp
+
+[](https://circleci.com/gh/fatedier/frp)
+[](https://github.com/fatedier/frp/releases)
+
+[README](README.md) | [中文文档](README_zh.md)
+
+
+
+
+
+## What is frp?
+
+frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports **TCP** and **UDP**, as well as **HTTP** and **HTTPS** protocols, enabling requests to be forwarded to internal services via domain name.
+
+frp also offers a P2P connect mode.
+
+## Table of Contents
+
+
+
+- [frp](#frp)
+ - [What is frp?](#what-is-frp)
+ - [Table of Contents](#table-of-contents)
+ - [Development Status](#development-status)
+ - [Architecture](#architecture)
+ - [Example Usage](#example-usage)
+ - [Access your computer in a LAN network via SSH](#access-your-computer-in-a-lan-network-via-ssh)
+ - [Accessing Internal Web Services with Custom Domains in LAN](#accessing-internal-web-services-with-custom-domains-in-lan)
+ - [Forward DNS query requests](#forward-dns-query-requests)
+ - [Forward Unix Domain Socket](#forward-unix-domain-socket)
+ - [Expose a simple HTTP file server](#expose-a-simple-http-file-server)
+ - [Enable HTTPS for a local HTTP(S) service](#enable-https-for-a-local-https-service)
+ - [Expose your service privately](#expose-your-service-privately)
+ - [P2P Mode](#p2p-mode)
+ - [Features](#features)
+ - [Configuration Files](#configuration-files)
+ - [Using Environment Variables](#using-environment-variables)
+ - [Split Configures Into Different Files](#split-configures-into-different-files)
+ - [Dashboard](#dashboard)
+ - [Admin UI](#admin-ui)
+ - [Monitor](#monitor)
+ - [Prometheus](#prometheus)
+ - [Authenticating the Client](#authenticating-the-client)
+ - [Token Authentication](#token-authentication)
+ - [OIDC Authentication](#oidc-authentication)
+ - [Encryption and Compression](#encryption-and-compression)
+ - [TLS](#tls)
+ - [Hot-Reloading frpc configuration](#hot-reloading-frpc-configuration)
+ - [Get proxy status from client](#get-proxy-status-from-client)
+ - [Only allowing certain ports on the server](#only-allowing-certain-ports-on-the-server)
+ - [Port Reuse](#port-reuse)
+ - [Bandwidth Limit](#bandwidth-limit)
+ - [For Each Proxy](#for-each-proxy)
+ - [TCP Stream Multiplexing](#tcp-stream-multiplexing)
+ - [Support KCP Protocol](#support-kcp-protocol)
+ - [Support QUIC Protocol](#support-quic-protocol)
+ - [Connection Pooling](#connection-pooling)
+ - [Load balancing](#load-balancing)
+ - [Service Health Check](#service-health-check)
+ - [Rewriting the HTTP Host Header](#rewriting-the-http-host-header)
+ - [Setting other HTTP Headers](#setting-other-http-headers)
+ - [Get Real IP](#get-real-ip)
+ - [HTTP X-Forwarded-For](#http-x-forwarded-for)
+ - [Proxy Protocol](#proxy-protocol)
+ - [Require HTTP Basic Auth (Password) for Web Services](#require-http-basic-auth-password-for-web-services)
+ - [Custom Subdomain Names](#custom-subdomain-names)
+ - [URL Routing](#url-routing)
+ - [TCP Port Multiplexing](#tcp-port-multiplexing)
+ - [Connecting to frps via HTTP PROXY](#connecting-to-frps-via-http-proxy)
+ - [Range ports mapping](#range-ports-mapping)
+ - [Client Plugins](#client-plugins)
+ - [Server Manage Plugins](#server-manage-plugins)
+ - [Development Plan](#development-plan)
+ - [Contributing](#contributing)
+ - [Donation](#donation)
+ - [GitHub Sponsors](#github-sponsors)
+ - [PayPal](#paypal)
+
+
+
+## Development Status
+
+frp is currently under development. You can try the latest release version in the `master` branch, or use the `dev` branch to access the version currently in development.
+
+We are currently working on version 2 and attempting to perform some code refactoring and improvements. However, please note that it will not be compatible with version 1.
+
+We will transition from version 0 to version 1 at the appropriate time and will only accept bug fixes and improvements, rather than big feature requests.
+
+## Architecture
+
+
+
+## Example Usage
+
+To begin, download the latest program for your operating system and architecture from the [Release](https://github.com/fatedier/frp/releases) page.
+
+Next, place the `frps` binary and `frps.ini` configuration file on Server A, which has a public IP address.
+
+Finally, place the `frpc` binary and `frpc.ini` configuration file on Server B, which is located on a LAN that cannot be directly accessed from the public internet.
+
+### Access your computer in a LAN network via SSH
+
+1. Modify `frps.ini` on server A by setting the `bind_port` for frp clients to connect to:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ ```
+
+2. Start `frps` on server A:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` on server B and set the `server_addr` field to the public IP address of your frps server:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [ssh]
+ type = tcp
+ local_ip = 127.0.0.1
+ local_port = 22
+ remote_port = 6000
+ ```
+
+Note that the `local_port` (listened on the client) and `remote_port` (exposed on the server) are used for traffic going in and out of the frp system, while the `server_port` is used for communication between frps and frpc.
+
+4. Start `frpc` on server B:
+
+ `./frpc -c ./frpc.ini`
+
+5. To access server B from another machine through server A via SSH (assuming the username is `test`), use the following command:
+
+ `ssh -oPort=6000 test@x.x.x.x`
+
+### Accessing Internal Web Services with Custom Domains in LAN
+
+Sometimes we need to expose a local web service behind a NAT network to others for testing purposes with our own domain name.
+
+Unfortunately, we cannot resolve a domain name to a local IP. However, we can use frp to expose an HTTP(S) service.
+
+1. Modify `frps.ini` and set the HTTP port for vhost to 8080:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ vhost_http_port = 8080
+ ```
+
+2. Start `frps`:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Specify the `local_port` of your web service:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [web]
+ type = http
+ local_port = 80
+ custom_domains = www.example.com
+ ```
+
+4. Start `frpc`:
+
+ `./frpc -c ./frpc.ini`
+
+5. Map the A record of `www.example.com` to either the public IP of the remote frps server or a CNAME record pointing to your original domain.
+
+6. Visit your local web service using url `http://www.example.com:8080`.
+
+### Forward DNS query requests
+
+1. Modify `frps.ini`:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ ```
+
+2. Start `frps`:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Forward DNS query requests to the Google Public DNS server `8.8.8.8:53`:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [dns]
+ type = udp
+ local_ip = 8.8.8.8
+ local_port = 53
+ remote_port = 6000
+ ```
+
+4. Start frpc:
+
+ `./frpc -c ./frpc.ini`
+
+5. Test DNS resolution using the `dig` command:
+
+ `dig @x.x.x.x -p 6000 www.google.com`
+
+### Forward Unix Domain Socket
+
+Expose a Unix domain socket (e.g. the Docker daemon socket) as TCP.
+
+Configure `frps` as above.
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [unix_domain_socket]
+ type = tcp
+ remote_port = 6000
+ plugin = unix_domain_socket
+ plugin_unix_path = /var/run/docker.sock
+ ```
+
+2. Test the configuration by getting the docker version using `curl`:
+
+ `curl http://x.x.x.x:6000/version`
+
+### Expose a simple HTTP file server
+
+Expose a simple HTTP file server to access files stored in the LAN from the public Internet.
+
+Configure `frps` as described above, then:
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [test_static_file]
+ type = tcp
+ remote_port = 6000
+ plugin = static_file
+ plugin_local_path = /tmp/files
+ plugin_strip_prefix = static
+ plugin_http_user = abc
+ plugin_http_passwd = abc
+ ```
+
+2. Visit `http://x.x.x.x:6000/static/` from your browser and specify correct username and password to view files in `/tmp/files` on the `frpc` machine.
+
+### Enable HTTPS for a local HTTP(S) service
+
+You may substitute `https2https` for the plugin, and point the `plugin_local_addr` to a HTTPS endpoint.
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [test_https2http]
+ type = https
+ custom_domains = test.example.com
+
+ plugin = https2http
+ plugin_local_addr = 127.0.0.1:80
+ plugin_crt_path = ./server.crt
+ plugin_key_path = ./server.key
+ plugin_host_header_rewrite = 127.0.0.1
+ plugin_header_X-From-Where = frp
+ ```
+
+2. Visit `https://test.example.com`.
+
+### Expose your service privately
+
+To mitigate risks associated with exposing certain services directly to the public network, STCP (Secret TCP) mode requires a preshared key to be used for access to the service from other clients.
+
+Configure `frps` same as above.
+
+1. Start `frpc` on machine B with the following config. This example is for exposing the SSH service (port 22), and note the `sk` field for the preshared key, and that the `remote_port` field is removed here:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [secret_ssh]
+ type = stcp
+ sk = abcdefg
+ local_ip = 127.0.0.1
+ local_port = 22
+ ```
+
+2. Start another `frpc` (typically on another machine C) with the following config to access the SSH service with a security key (`sk` field):
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [secret_ssh_visitor]
+ type = stcp
+ role = visitor
+ server_name = secret_ssh
+ sk = abcdefg
+ bind_addr = 127.0.0.1
+ bind_port = 6000
+ ```
+
+3. On machine C, connect to SSH on machine B, using this command:
+
+ `ssh -oPort=6000 127.0.0.1`
+
+### P2P Mode
+
+**xtcp** is designed to transmit large amounts of data directly between clients. A frps server is still needed, as P2P here only refers to the actual data transmission.
+
+Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
+
+1. In `frps.ini` configure a UDP port for xtcp:
+
+ ```ini
+ # frps.ini
+ bind_udp_port = 7001
+ ```
+
+2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [p2p_ssh]
+ type = xtcp
+ sk = abcdefg
+ local_ip = 127.0.0.1
+ local_port = 22
+ ```
+
+3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [p2p_ssh_visitor]
+ type = xtcp
+ role = visitor
+ server_name = p2p_ssh
+ sk = abcdefg
+ bind_addr = 127.0.0.1
+ bind_port = 6000
+ ```
+
+4. On machine C, connect to SSH on machine B, using this command:
+
+ `ssh -oPort=6000 127.0.0.1`
+
+## Features
+
+### Configuration Files
+
+Read the full example configuration files to find out even more features not described here.
+
+[Full configuration file for frps (Server)](./conf/frps_full.ini)
+
+[Full configuration file for frpc (Client)](./conf/frpc_full.ini)
+
+### Using Environment Variables
+
+Environment variables can be referenced in the configuration file, using Go's standard format:
+
+```ini
+# frpc.ini
+[common]
+server_addr = {{ .Envs.FRP_SERVER_ADDR }}
+server_port = 7000
+
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = {{ .Envs.FRP_SSH_REMOTE_PORT }}
+```
+
+With the config above, variables can be passed into `frpc` program like this:
+
+```
+export FRP_SERVER_ADDR="x.x.x.x"
+export FRP_SSH_REMOTE_PORT="6000"
+./frpc -c ./frpc.ini
+```
+
+`frpc` will render configuration file template using OS environment variables. Remember to prefix your reference with `.Envs`.
+
+### Split Configures Into Different Files
+
+You can split multiple proxy configs into different files and include them in the main file.
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+includes=./confd/*.ini
+```
+
+```ini
+# ./confd/test.ini
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 6000
+```
+
+### Dashboard
+
+Check frp's status and proxies' statistics information by Dashboard.
+
+Configure a port for dashboard to enable this feature:
+
+```ini
+[common]
+dashboard_port = 7500
+# dashboard's username and password are both optional
+dashboard_user = admin
+dashboard_pwd = admin
+```
+
+Then visit `http://[server_addr]:7500` to see the dashboard, with username and password both being `admin`.
+
+Additionally, you can use HTTPS port by using your domains wildcard or normal SSL certificate:
+
+```ini
+[common]
+dashboard_port = 7500
+# dashboard's username and password are both optional
+dashboard_user = admin
+dashboard_pwd = admin
+dashboard_tls_mode = true
+dashboard_tls_cert_file = server.crt
+dashboard_tls_key_file = server.key
+```
+
+Then visit `https://[server_addr]:7500` to see the dashboard in secure HTTPS connection, with username and password both being `admin`.
+
+
+
+### Admin UI
+
+The Admin UI helps you check and manage frpc's configuration.
+
+Configure an address for admin UI to enable this feature:
+
+```ini
+[common]
+admin_addr = 127.0.0.1
+admin_port = 7400
+admin_user = admin
+admin_pwd = admin
+```
+
+Then visit `http://127.0.0.1:7400` to see admin UI, with username and password both being `admin`.
+
+### Monitor
+
+When dashboard is enabled, frps will save monitor data in cache. It will be cleared after process restart.
+
+Prometheus is also supported.
+
+#### Prometheus
+
+Enable dashboard first, then configure `enable_prometheus = true` in `frps.ini`.
+
+`http://{dashboard_addr}/metrics` will provide prometheus monitor data.
+
+### Authenticating the Client
+
+There are 2 authentication methods to authenticate frpc with frps.
+
+You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
+
+Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
+
+Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
+
+#### Token Authentication
+
+When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
+
+Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
+
+#### OIDC Authentication
+
+When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
+
+OIDC stands for OpenID Connect, and the flow used is called [Client Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.4).
+
+To use this authentication type - configure `frpc.ini` and `frps.ini` as follows:
+
+```ini
+# frps.ini
+[common]
+authentication_method = oidc
+oidc_issuer = https://example-oidc-issuer.com/
+oidc_audience = https://oidc-audience.com/.default
+```
+
+```ini
+# frpc.ini
+[common]
+authentication_method = oidc
+oidc_client_id = 98692467-37de-409a-9fac-bb2585826f18 # Replace with OIDC client ID
+oidc_client_secret = oidc_secret
+oidc_audience = https://oidc-audience.com/.default
+oidc_token_endpoint_url = https://example-oidc-endpoint.com/oauth2/v2.0/token
+```
+
+### Encryption and Compression
+
+The features are off by default. You can turn on encryption and/or compression:
+
+```ini
+# frpc.ini
+[ssh]
+type = tcp
+local_port = 22
+remote_port = 6000
+use_encryption = true
+use_compression = true
+```
+
+#### TLS
+
+frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
+
+For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
+
+Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
+
+To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+
+**`frpc` TLS settings (under the `[common]` section):**
+```ini
+tls_enable = true
+tls_cert_file = certificate.crt
+tls_key_file = certificate.key
+tls_trusted_ca_file = ca.crt
+```
+
+**`frps` TLS settings (under the `[common]` section):**
+```ini
+tls_only = true
+tls_enable = true
+tls_cert_file = certificate.crt
+tls_key_file = certificate.key
+tls_trusted_ca_file = ca.crt
+```
+
+You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
+
+If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
+
+Given an example:
+
+* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
+```
+cat > my-openssl.cnf << EOF
+[ ca ]
+default_ca = CA_default
+[ CA_default ]
+x509_extensions = usr_cert
+[ req ]
+default_bits = 2048
+default_md = sha256
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca
+string_mask = utf8only
+[ req_distinguished_name ]
+[ req_attributes ]
+[ usr_cert ]
+basicConstraints = CA:FALSE
+nsComment = "OpenSSL Generated Certificate"
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid,issuer
+[ v3_ca ]
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid:always,issuer
+basicConstraints = CA:true
+EOF
+```
+
+* build ca certificates:
+```
+openssl genrsa -out ca.key 2048
+openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
+```
+
+* build frps certificates:
+```
+openssl genrsa -out server.key 2048
+
+openssl req -new -sha256 -key server.key \
+ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \
+ -reqexts SAN \
+ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")) \
+ -out server.csr
+
+openssl x509 -req -days 365 -sha256 \
+ -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
+ -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com") \
+ -out server.crt
+```
+
+* build frpc certificates:
+```
+openssl genrsa -out client.key 2048
+openssl req -new -sha256 -key client.key \
+ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
+ -reqexts SAN \
+ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
+ -out client.csr
+
+openssl x509 -req -days 365 -sha256 \
+ -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
+ -extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") \
+ -out client.crt
+```
+
+### Hot-Reloading frpc configuration
+
+The `admin_addr` and `admin_port` fields are required for enabling HTTP API:
+
+```ini
+# frpc.ini
+[common]
+admin_addr = 127.0.0.1
+admin_port = 7400
+```
+
+Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
+
+**Note that parameters in [common] section won't be modified except 'start'.**
+
+You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
+
+### Get proxy status from client
+
+Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
+
+### Only allowing certain ports on the server
+
+`allow_ports` in `frps.ini` is used to avoid abuse of ports:
+
+```ini
+# frps.ini
+[common]
+allow_ports = 2000-3000,3001,3003,4000-50000
+```
+
+`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
+
+### Port Reuse
+
+`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
+
+We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
+
+### Bandwidth Limit
+
+#### For Each Proxy
+
+```ini
+# frpc.ini
+[ssh]
+type = tcp
+local_port = 22
+remote_port = 6000
+bandwidth_limit = 1MB
+```
+
+Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
+
+Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
+
+### TCP Stream Multiplexing
+
+frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
+
+You can disable this feature by modify `frps.ini` and `frpc.ini`:
+
+```ini
+# frps.ini and frpc.ini, must be same
+[common]
+tcp_mux = false
+```
+
+### Support KCP Protocol
+
+KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
+
+KCP mode uses UDP as the underlying transport. Using KCP in frp:
+
+1. Enable KCP in frps:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ # Specify a UDP port for KCP.
+ kcp_bind_port = 7000
+ ```
+
+ The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+
+2. Configure `frpc.ini` to use KCP to connect to frps:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ # Same as the 'kcp_bind_port' in frps.ini
+ server_port = 7000
+ protocol = kcp
+ ```
+
+### Support QUIC Protocol
+
+QUIC is a new multiplexed transport built on top of UDP.
+
+Using QUIC in frp:
+
+1. Enable QUIC in frps:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ # Specify a UDP port for QUIC.
+ quic_bind_port = 7000
+ ```
+
+ The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+
+2. Configure `frpc.ini` to use QUIC to connect to frps:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ # Same as the 'quic_bind_port' in frps.ini
+ server_port = 7000
+ protocol = quic
+ ```
+
+### Connection Pooling
+
+By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
+
+This feature is suitable for a large number of short connections.
+
+1. Configure the limit of pool count each proxy can use in `frps.ini`:
+
+ ```ini
+ # frps.ini
+ [common]
+ max_pool_count = 5
+ ```
+
+2. Enable and specify the number of connection pool:
+
+ ```ini
+ # frpc.ini
+ [common]
+ pool_count = 1
+ ```
+
+### Load balancing
+
+Load balancing is supported by `group`.
+
+This feature is only available for types `tcp`, `http`, `tcpmux` now.
+
+```ini
+# frpc.ini
+[test1]
+type = tcp
+local_port = 8080
+remote_port = 80
+group = web
+group_key = 123
+
+[test2]
+type = tcp
+local_port = 8081
+remote_port = 80
+group = web
+group_key = 123
+```
+
+`group_key` is used for authentication.
+
+Connections to port 80 will be dispatched to proxies in the same group randomly.
+
+For type `tcp`, `remote_port` in the same group should be the same.
+
+For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
+
+### Service Health Check
+
+Health check feature can help you achieve high availability with load balancing.
+
+Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
+
+With health check type **tcp**, the service port will be pinged (TCPing):
+
+```ini
+# frpc.ini
+[test1]
+type = tcp
+local_port = 22
+remote_port = 6000
+# Enable TCP health check
+health_check_type = tcp
+# TCPing timeout seconds
+health_check_timeout_s = 3
+# If health check failed 3 times in a row, the proxy will be removed from frps
+health_check_max_failed = 3
+# A health check every 10 seconds
+health_check_interval_s = 10
+```
+
+With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_ip = 127.0.0.1
+local_port = 80
+custom_domains = test.example.com
+# Enable HTTP health check
+health_check_type = http
+# frpc will send a GET request to '/status'
+# and expect an HTTP 2xx OK response
+health_check_url = /status
+health_check_timeout_s = 3
+health_check_max_failed = 3
+health_check_interval_s = 10
+```
+
+### Rewriting the HTTP Host Header
+
+By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
+
+However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+host_header_rewrite = dev.example.com
+```
+
+The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
+
+### Setting other HTTP Headers
+
+Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+host_header_rewrite = dev.example.com
+header_X-From-Where = frp
+```
+
+Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
+
+In this example, it will set header `X-From-Where: frp` in the HTTP request.
+
+### Get Real IP
+
+#### HTTP X-Forwarded-For
+
+This feature is for http proxy only.
+
+You can get user's real IP from HTTP request headers `X-Forwarded-For`.
+
+#### Proxy Protocol
+
+frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
+
+Here is an example for https service:
+
+```ini
+# frpc.ini
+[web]
+type = https
+local_port = 443
+custom_domains = test.example.com
+
+# now v1 and v2 are supported
+proxy_protocol_version = v2
+```
+
+You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
+
+### Require HTTP Basic Auth (Password) for Web Services
+
+Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
+
+This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
+
+It can only be enabled when proxy type is http.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+http_user = abc
+http_pwd = abc
+```
+
+Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
+
+### Custom Subdomain Names
+
+It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
+
+```ini
+# frps.ini
+subdomain_host = frps.com
+```
+
+Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+subdomain = test
+```
+
+Now you can visit your web service on `test.frps.com`.
+
+Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
+
+### URL Routing
+
+frp supports forwarding HTTP requests to different backend web services by url routing.
+
+`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
+
+```ini
+# frpc.ini
+[web01]
+type = http
+local_port = 80
+custom_domains = web.example.com
+locations = /
+
+[web02]
+type = http
+local_port = 81
+custom_domains = web.example.com
+locations = /news,/about
+```
+
+HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
+
+### TCP Port Multiplexing
+
+frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
+
+The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
+
+When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
+
+The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
+
+For example:
+
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+tcpmux_httpconnect_port = 1337
+```
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+
+[proxy1]
+type = tcpmux
+multiplexer = httpconnect
+custom_domains = test1
+local_port = 80
+
+[proxy2]
+type = tcpmux
+multiplexer = httpconnect
+custom_domains = test2
+local_port = 8080
+```
+
+In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
+
+```
+CONNECT test1 HTTP/1.1\r\n\r\n
+```
+and the connection will be routed to `proxy1`.
+
+### Connecting to frps via HTTP PROXY
+
+frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+
+It only works when protocol is tcp.
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+http_proxy = http://user:pwd@192.168.1.128:8080
+```
+
+### Range ports mapping
+
+Proxy with names that start with `range:` will support mapping range ports.
+
+```ini
+# frpc.ini
+[range:test_tcp]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 6000-6006,6007
+remote_port = 6000-6006,6007
+```
+
+frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
+
+### Client Plugins
+
+frpc only forwards requests to local TCP or UDP ports by default.
+
+Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
+
+Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
+
+Using plugin **http_proxy**:
+
+```ini
+# frpc.ini
+[http_proxy]
+type = tcp
+remote_port = 6000
+plugin = http_proxy
+plugin_http_user = abc
+plugin_http_passwd = abc
+```
+
+`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
+
+### Server Manage Plugins
+
+Read the [document](/doc/server_plugin.md).
+
+Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
+
+## Development Plan
+
+* Log HTTP request information in frps.
+
+## Contributing
+
+Interested in getting involved? We would like to help you!
+
+* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
+* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
+* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
+* If you have great ideas, send an email to fatedier@gmail.com.
+
+**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
+
+## Donation
+
+If frp helps you a lot, you can support us by:
+
+### GitHub Sponsors
+
+Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
+
+You can have your company's logo placed on README file of this project.
+
+### PayPal
+
+Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **fatedier@gmail.com**.
+
diff --git a/apps/frps/README.md b/apps/frps/README.md
index 9e035d0ea..c5c14c731 100644
--- a/apps/frps/README.md
+++ b/apps/frps/README.md
@@ -1,413 +1,397 @@
-
# frp
-[](https://circleci.com/gh/fatedier/frp)
-[](https://github.com/fatedier/frp/releases)
+[](https://circleci.com/gh/fatedier/frp) [](https://github.com/fatedier/frp/releases)
-[README](README.md) | [中文文档](README_zh.md)
-
+### 金牌赞助商
-
+ [](https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=frp&utm_source=github) [](https://asocks.com/c/vDu6Dk)
-## What is frp?
+## 什么是 frp?
-frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports **TCP** and **UDP**, as well as **HTTP** and **HTTPS** protocols, enabling requests to be forwarded to internal services via domain name.
+frp 是一个快速的逆向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露给互联网。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,使得请求可以通过域名转发到内部服务。
-frp also offers a P2P connect mode.
+frp 还提供了一种 P2P 连接模式。
-## Table of Contents
+## 目录
-
+* [frp](#frp)
+ * [什么是 frp?](#what-is-frp)
+ * [目录](#table-of-contents)
+ * [开发状态](#development-status)
+ * [架构](#architecture)
+ * [示例用法](#example-usage)
+ * [通过 SSH 访问局域网内的计算机](#access-your-computer-in-a-lan-network-via-ssh)
+ * [在局域网中通过自定义域名访问内部 Web 服务](#accessing-internal-web-services-with-custom-domains-in-lan)
+ * [正向 DNS 查询请求](#forward-dns-query-requests)
+ * [正向 Unix 域套接字](#forward-unix-domain-socket)
+ * [暴露一个简单的 HTTP 文件服务器](#expose-a-simple-http-file-server)
+ * [为本地 HTTP(S)服务启用 HTTPS](#enable-https-for-a-local-https-service)
+ * [私密地公开您的服务](#expose-your-service-privately)
+ * [点对点模式](#p2p-mode)
+ * [功能](#features)
+ * [配置文件](#configuration-files)
+ * [使用环境变量](#using-environment-variables)
+ * [将配置拆分到不同的文件中](#split-configures-into-different-files)
+ * [仪表板](#dashboard)
+ * [管理界面](#admin-ui)
+ * [监控](#monitor)
+ * [普罗米修斯](#prometheus)
+ * [客户端认证](#authenticating-the-client)
+ * [令牌认证](#token-authentication)
+ * [OIDC 身份验证](#oidc-authentication)
+ * [加密和压缩](#encryption-and-compression)
+ * [TLS](#tls)
+ * [热重载 frpc 配置](#hot-reloading-frpc-configuration)
+ * [从客户端获取代理状态](#get-proxy-status-from-client)
+ * [仅允许服务器上某些端口](#only-allowing-certain-ports-on-the-server)
+ * [端口重用](#port-reuse)
+ * [带宽限制](#bandwidth-limit)
+ * [对于每个代理](#for-each-proxy)
+ * [TCP 流复用](#tcp-stream-multiplexing)
+ * [支持 KCP 协议](#support-kcp-protocol)
+ * [支持 QUIC 协议](#support-quic-protocol)
+ * [连接池](#connection-pooling)
+ * [负载均衡](#load-balancing)
+ * [服务健康检查](#service-health-check)
+ * [重写 HTTP 主机头](#rewriting-the-http-host-header)
+ * [设置其他 HTTP 头](#setting-other-http-headers)
+ * [获取真实 IP](#get-real-ip)
+ * [HTTP X-Forwarded-For](#http-x-forwarded-for)
+ * [代理协议](#proxy-protocol)
+ * [需要为 Web 服务要求 HTTP 基本认证(密码)](#require-http-basic-auth-password-for-web-services)
+ * [自定义子域名](#custom-subdomain-names)
+ * [URL 路由](#url-routing)
+ * [TCP 端口复用](#tcp-port-multiplexing)
+ * [连接到 frps 通过 HTTP 代理](#connecting-to-frps-via-http-proxy)
+ * [端口映射范围](#range-ports-mapping)
+ * [客户端插件](#client-plugins)
+ * [服务器管理插件](#server-manage-plugins)
+ * [发展计划](#development-plan)
+ * [贡献](#contributing)
+ * [捐赠](#donation)
+ * [GitHub 赞助者](#github-sponsors)
+ * [PayPal](#paypal)
-- [frp](#frp)
- - [What is frp?](#what-is-frp)
- - [Table of Contents](#table-of-contents)
- - [Development Status](#development-status)
- - [Architecture](#architecture)
- - [Example Usage](#example-usage)
- - [Access your computer in a LAN network via SSH](#access-your-computer-in-a-lan-network-via-ssh)
- - [Accessing Internal Web Services with Custom Domains in LAN](#accessing-internal-web-services-with-custom-domains-in-lan)
- - [Forward DNS query requests](#forward-dns-query-requests)
- - [Forward Unix Domain Socket](#forward-unix-domain-socket)
- - [Expose a simple HTTP file server](#expose-a-simple-http-file-server)
- - [Enable HTTPS for a local HTTP(S) service](#enable-https-for-a-local-https-service)
- - [Expose your service privately](#expose-your-service-privately)
- - [P2P Mode](#p2p-mode)
- - [Features](#features)
- - [Configuration Files](#configuration-files)
- - [Using Environment Variables](#using-environment-variables)
- - [Split Configures Into Different Files](#split-configures-into-different-files)
- - [Dashboard](#dashboard)
- - [Admin UI](#admin-ui)
- - [Monitor](#monitor)
- - [Prometheus](#prometheus)
- - [Authenticating the Client](#authenticating-the-client)
- - [Token Authentication](#token-authentication)
- - [OIDC Authentication](#oidc-authentication)
- - [Encryption and Compression](#encryption-and-compression)
- - [TLS](#tls)
- - [Hot-Reloading frpc configuration](#hot-reloading-frpc-configuration)
- - [Get proxy status from client](#get-proxy-status-from-client)
- - [Only allowing certain ports on the server](#only-allowing-certain-ports-on-the-server)
- - [Port Reuse](#port-reuse)
- - [Bandwidth Limit](#bandwidth-limit)
- - [For Each Proxy](#for-each-proxy)
- - [TCP Stream Multiplexing](#tcp-stream-multiplexing)
- - [Support KCP Protocol](#support-kcp-protocol)
- - [Support QUIC Protocol](#support-quic-protocol)
- - [Connection Pooling](#connection-pooling)
- - [Load balancing](#load-balancing)
- - [Service Health Check](#service-health-check)
- - [Rewriting the HTTP Host Header](#rewriting-the-http-host-header)
- - [Setting other HTTP Headers](#setting-other-http-headers)
- - [Get Real IP](#get-real-ip)
- - [HTTP X-Forwarded-For](#http-x-forwarded-for)
- - [Proxy Protocol](#proxy-protocol)
- - [Require HTTP Basic Auth (Password) for Web Services](#require-http-basic-auth-password-for-web-services)
- - [Custom Subdomain Names](#custom-subdomain-names)
- - [URL Routing](#url-routing)
- - [TCP Port Multiplexing](#tcp-port-multiplexing)
- - [Connecting to frps via HTTP PROXY](#connecting-to-frps-via-http-proxy)
- - [Range ports mapping](#range-ports-mapping)
- - [Client Plugins](#client-plugins)
- - [Server Manage Plugins](#server-manage-plugins)
- - [Development Plan](#development-plan)
- - [Contributing](#contributing)
- - [Donation](#donation)
- - [GitHub Sponsors](#github-sponsors)
- - [PayPal](#paypal)
+## 开发状态
-
+frp 目前正在开发中。您可以在 `master` 分支尝试最新的发布版本,或者使用 `dev` 分支访问正在开发中的版本。
-## Development Status
+我们目前正在开发版本2,并尝试进行一些代码重构和改进。但是请注意,它将不与版本1兼容。
-frp is currently under development. You can try the latest release version in the `master` branch, or use the `dev` branch to access the version currently in development.
+我们将从版本0过渡到版本1,届时将只接受错误修复和改进,而不是大的功能请求。
-We are currently working on version 2 and attempting to perform some code refactoring and improvements. However, please note that it will not be compatible with version 1.
-
-We will transition from version 0 to version 1 at the appropriate time and will only accept bug fixes and improvements, rather than big feature requests.
-
-## Architecture
+## 架构

-## Example Usage
+## 示例用法
-To begin, download the latest program for your operating system and architecture from the [Release](https://github.com/fatedier/frp/releases) page.
+首先,从[发布](https://github.com/fatedier/frp/releases)页面下载适用于您操作系统和架构的最新程序。
-Next, place the `frps` binary and `frps.ini` configuration file on Server A, which has a public IP address.
+接下来,将 `frps` 二进制文件和 `frps.ini` 配置文件放置在具有公网 IP 地址的服务器 A 上。
-Finally, place the `frpc` binary and `frpc.ini` configuration file on Server B, which is located on a LAN that cannot be directly accessed from the public internet.
+最后,将 `frpc` 二进制文件和 `frpc.ini` 配置文件放置在位于无法从公网直接访问的局域网上的服务器 B 上。
-### Access your computer in a LAN network via SSH
+### 通过 SSH 在局域网内访问您的计算机
-1. Modify `frps.ini` on server A by setting the `bind_port` for frp clients to connect to:
+1. 在服务器 A 上修改 `frps.ini`,设置 `bind_port` 以便 frp 客户端连接:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+```
-2. Start `frps` on server A:
+2. 在服务器 A 上启动 `frps`:
- `./frps -c ./frps.ini`
+`./frps -c ./frps.ini`
-3. Modify `frpc.ini` on server B and set the `server_addr` field to the public IP address of your frps server:
+3. 在服务器 B 上修改 `frpc.ini`,并将 `server_addr` 字段设置为您的 frps 服务器的公网 IP 地址:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- [ssh]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 22
- remote_port = 6000
- ```
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 6000
+```
-Note that the `local_port` (listened on the client) and `remote_port` (exposed on the server) are used for traffic going in and out of the frp system, while the `server_port` is used for communication between frps and frpc.
+请注意,`local_port`(客户端监听)和 `remote_port`(服务器上暴露)用于 frp 系统中的进出流量,而 `server_port` 用于 frps 和 frpc 之间的通信。
-4. Start `frpc` on server B:
+4. 在服务器 B 上启动 `frpc`:
- `./frpc -c ./frpc.ini`
+`./frpc -c ./frpc.ini`
-5. To access server B from another machine through server A via SSH (assuming the username is `test`), use the following command:
+5. 要从另一台机器通过服务器 A 通过 SSH 访问服务器 B(假设用户名为 `test`),请使用以下命令:
- `ssh -oPort=6000 test@x.x.x.x`
+`ssh -oPort=6000 test@x.x.x.x`
-### Accessing Internal Web Services with Custom Domains in LAN
+### 在局域网中使用自定义域名访问内部 Web 服务
-Sometimes we need to expose a local web service behind a NAT network to others for testing purposes with our own domain name.
+有时我们需要将位于 NAT 网络背后的本地 Web 服务暴露给其他人,以便使用自己的域名进行测试。
-Unfortunately, we cannot resolve a domain name to a local IP. However, we can use frp to expose an HTTP(S) service.
+不幸的是,我们无法将域名解析为本地 IP。然而,我们可以使用 frp 来暴露 HTTP(S)服务。
-1. Modify `frps.ini` and set the HTTP port for vhost to 8080:
+1. 修改 `frps.ini` 并将 vhost 的 HTTP 端口设置为 8080:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- vhost_http_port = 8080
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+vhost_http_port = 8080
+```
-2. Start `frps`:
+2. 启动 `frps`:
- `./frps -c ./frps.ini`
+`./frps -c ./frps.ini`
-3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Specify the `local_port` of your web service:
+3. 修改 `frpc.ini` 并将 `server_addr` 设置为远程 frps 服务器的 IP 地址。指定您的 Web 服务的 `local_port`:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- [web]
- type = http
- local_port = 80
- custom_domains = www.example.com
- ```
+[web]
+type = http
+local_port = 80
+custom_domains = www.example.com
+```
-4. Start `frpc`:
+4. 启动 `frpc`:
- `./frpc -c ./frpc.ini`
+`./frpc -c ./frpc.ini`
-5. Map the A record of `www.example.com` to either the public IP of the remote frps server or a CNAME record pointing to your original domain.
+5. 将 `www.example.com` 的 A 记录映射到远程 frps 服务器的公网 IP 地址或指向您原始域名的 CNAME 记录。
+
+6. 使用 url `http://www.example.com:8080` 访问您的本地 Web 服务。
+
-6. Visit your local web service using url `http://www.example.com:8080`.
+### 转发 DNS 查询请求
-### Forward DNS query requests
+1. 修改 `frps.ini`:
-1. Modify `frps.ini`:
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+```
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- ```
+2. 启动 `frps`:
-2. Start `frps`:
+`./frps -c ./frps.ini`
- `./frps -c ./frps.ini`
+3. 修改 `frpc.ini` 并将 `server_addr` 设置为远程 frps 服务器的 IP 地址。将 DNS 查询请求转发到谷歌公共 DNS 服务器 `8.8.8.8:53`:
-3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Forward DNS query requests to the Google Public DNS server `8.8.8.8:53`:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[dns]
+type = udp
+local_ip = 8.8.8.8
+local_port = 53
+remote_port = 6000
+```
- [dns]
- type = udp
- local_ip = 8.8.8.8
- local_port = 53
- remote_port = 6000
- ```
+4. 启动 frpc:
-4. Start frpc:
+`./frpc -c ./frpc.ini`
- `./frpc -c ./frpc.ini`
+5. 使用 `dig` 命令测试 DNS 解析:
-5. Test DNS resolution using the `dig` command:
+`dig @x.x.x.x -p 6000 www.google.com`
- `dig @x.x.x.x -p 6000 www.google.com`
+### 转发 Unix 域套接字
-### Forward Unix Domain Socket
+将 Unix 域套接字(例如 Docker 守护进程套接字)暴露为 TCP。
-Expose a Unix domain socket (e.g. the Docker daemon socket) as TCP.
+配置 `frps` 如上所述。
-Configure `frps` as above.
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[unix_domain_socket]
+type = tcp
+remote_port = 6000
+plugin = unix_domain_socket
+plugin_unix_path = /var/run/docker.sock
+```
- [unix_domain_socket]
- type = tcp
- remote_port = 6000
- plugin = unix_domain_socket
- plugin_unix_path = /var/run/docker.sock
- ```
+2. 使用 `curl` 获取 docker 版本以测试配置:
-2. Test the configuration by getting the docker version using `curl`:
+`curl http://x.x.x.x:6000/version`
- `curl http://x.x.x.x:6000/version`
+### 公开一个简单的 HTTP 文件服务器
-### Expose a simple HTTP file server
+暴露一个简单的 HTTP 文件服务器,以便从公网访问局域网中存储的文件。
-Expose a simple HTTP file server to access files stored in the LAN from the public Internet.
+按照上述说明配置 `frps`,然后:
-Configure `frps` as described above, then:
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[test_static_file]
+type = tcp
+remote_port = 6000
+plugin = static_file
+plugin_local_path = /tmp/files
+plugin_strip_prefix = static
+plugin_http_user = abc
+plugin_http_passwd = abc
+```
- [test_static_file]
- type = tcp
- remote_port = 6000
- plugin = static_file
- plugin_local_path = /tmp/files
- plugin_strip_prefix = static
- plugin_http_user = abc
- plugin_http_passwd = abc
- ```
+2. 使用浏览器访问 `http://x.x.x.x:6000/static/`,并指定正确的用户名和密码,以查看 `frpc` 机器上的 `/tmp/files` 目录中的文件。
-2. Visit `http://x.x.x.x:6000/static/` from your browser and specify correct username and password to view files in `/tmp/files` on the `frpc` machine.
+### 启用本地 HTTP(S)服务的 HTTPS
-### Enable HTTPS for a local HTTP(S) service
+您可以将插件中的 `https2https` 替换,并将 `plugin_local_addr` 指向一个 HTTPS 端点。
-You may substitute `https2https` for the plugin, and point the `plugin_local_addr` to a HTTPS endpoint.
+1. 使用以下配置启动 `frpc`:
-1. Start `frpc` with the following configuration:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[test_https2http]
+type = https
+custom_domains = test.example.com
- [test_https2http]
- type = https
- custom_domains = test.example.com
+plugin = https2http
+plugin_local_addr = 127.0.0.1:80
+plugin_crt_path = ./server.crt
+plugin_key_path = ./server.key
+plugin_host_header_rewrite = 127.0.0.1
+plugin_header_X-From-Where = frp
+```
- plugin = https2http
- plugin_local_addr = 127.0.0.1:80
- plugin_crt_path = ./server.crt
- plugin_key_path = ./server.key
- plugin_host_header_rewrite = 127.0.0.1
- plugin_header_X-From-Where = frp
- ```
+2. 访问 `https://test.example.com`。
-2. Visit `https://test.example.com`.
+### 私密地公开您的服务
-### Expose your service privately
+为了减轻直接将某些服务暴露给公共网络所带来的风险,STCP(秘密 TCP)模式要求使用预共享密钥,以便其他客户端访问该服务。
-To mitigate risks associated with exposing certain services directly to the public network, STCP (Secret TCP) mode requires a preshared key to be used for access to the service from other clients.
+配置与上述相同的 `frps`。
-Configure `frps` same as above.
+1. 在机器 B 上使用以下配置启动 `frpc`。此示例用于公开 SSH 服务(端口 22),请注意预共享密钥的字段 `sk`,以及这里已移除的 `remote_port` 字段:
-1. Start `frpc` on machine B with the following config. This example is for exposing the SSH service (port 22), and note the `sk` field for the preshared key, and that the `remote_port` field is removed here:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[secret_ssh]
+type = stcp
+sk = abcdefg
+local_ip = 127.0.0.1
+local_port = 22
+```
- [secret_ssh]
- type = stcp
- sk = abcdefg
- local_ip = 127.0.0.1
- local_port = 22
- ```
+2. 启动另一个 `frpc`(通常在另一台机器 C 上)以以下配置使用安全密钥(`sk` 字段)访问 SSH 服务:
-2. Start another `frpc` (typically on another machine C) with the following config to access the SSH service with a security key (`sk` field):
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[secret_ssh_visitor]
+type = stcp
+role = visitor
+server_name = secret_ssh
+sk = abcdefg
+bind_addr = 127.0.0.1
+bind_port = 6000
+```
- [secret_ssh_visitor]
- type = stcp
- role = visitor
- server_name = secret_ssh
- sk = abcdefg
- bind_addr = 127.0.0.1
- bind_port = 6000
- ```
+3. 在机器 C 上,使用以下命令连接到机器 B 的 SSH:
-3. On machine C, connect to SSH on machine B, using this command:
+`ssh -oPort=6000 127.0.0.1`
- `ssh -oPort=6000 127.0.0.1`
+### P2P 模式
-### P2P Mode
+**xtcp** 旨在在客户端之间直接传输大量数据。仍然需要一个 frps 服务器,因为这里的 P2P 仅指实际的数据传输。
-**xtcp** is designed to transmit large amounts of data directly between clients. A frps server is still needed, as P2P here only refers to the actual data transmission.
+Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
-Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
+1. In `frps.ini` configure a UDP port for xtcp:
-1. In `frps.ini` configure a UDP port for xtcp:
+```ini
+# frps.ini
+bind_udp_port = 7001
+```
- ```ini
- # frps.ini
- bind_udp_port = 7001
- ```
+2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
-2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[p2p_ssh]
+type = xtcp
+sk = abcdefg
+local_ip = 127.0.0.1
+local_port = 22
+```
- [p2p_ssh]
- type = xtcp
- sk = abcdefg
- local_ip = 127.0.0.1
- local_port = 22
- ```
+3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
-3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- server_port = 7000
+[p2p_ssh_visitor]
+type = xtcp
+role = visitor
+server_name = p2p_ssh
+sk = abcdefg
+bind_addr = 127.0.0.1
+bind_port = 6000
+```
- [p2p_ssh_visitor]
- type = xtcp
- role = visitor
- server_name = p2p_ssh
- sk = abcdefg
- bind_addr = 127.0.0.1
- bind_port = 6000
- ```
+4. 在机器 C 上,使用以下命令连接到机器 B 的 SSH:
-4. On machine C, connect to SSH on machine B, using this command:
+`ssh -oPort=6000 127.0.0.1`
- `ssh -oPort=6000 127.0.0.1`
+## 功能
-## Features
+### 配置文件
-### Configuration Files
+阅读完整的示例配置文件,以了解更多此处未描述的功能。
-Read the full example configuration files to find out even more features not described here.
+[frps(服务器)的完整配置文件](./conf/frps_full.ini)
-[Full configuration file for frps (Server)](./conf/frps_full.ini)
+[frpc(客户端)完整配置文件](./conf/frpc_full.ini)
-[Full configuration file for frpc (Client)](./conf/frpc_full.ini)
+### 使用环境变量
-### Using Environment Variables
-
-Environment variables can be referenced in the configuration file, using Go's standard format:
+配置文件中可以使用 Go 的标准格式引用环境变量:
```ini
# frpc.ini
@@ -422,7 +406,7 @@ local_port = 22
remote_port = {{ .Envs.FRP_SSH_REMOTE_PORT }}
```
-With the config above, variables can be passed into `frpc` program like this:
+使用上述配置,可以将变量传递给 `frpc` 程序,如下所示:
```
export FRP_SERVER_ADDR="x.x.x.x"
@@ -430,11 +414,11 @@ export FRP_SSH_REMOTE_PORT="6000"
./frpc -c ./frpc.ini
```
-`frpc` will render configuration file template using OS environment variables. Remember to prefix your reference with `.Envs`.
+`frpc` 将使用操作系统环境变量渲染配置文件模板。请记住,在您的引用前加上 `.Envs`。
-### Split Configures Into Different Files
+### 将配置文件拆分为不同的文件
-You can split multiple proxy configs into different files and include them in the main file.
+您可以将多个代理配置拆分为不同的文件,并在主文件中包含它们。
```ini
# frpc.ini
@@ -453,11 +437,11 @@ local_port = 22
remote_port = 6000
```
-### Dashboard
+### 仪表板
-Check frp's status and proxies' statistics information by Dashboard.
+通过仪表板检查 frp 的状态和代理的统计信息。
-Configure a port for dashboard to enable this feature:
+配置仪表板的端口以启用此功能:
```ini
[common]
@@ -467,9 +451,9 @@ dashboard_user = admin
dashboard_pwd = admin
```
-Then visit `http://[server_addr]:7500` to see the dashboard, with username and password both being `admin`.
+然后访问 `http://[服务器地址]:7500` 查看仪表板,用户名和密码均为 `admin`。
-Additionally, you can use HTTPS port by using your domains wildcard or normal SSL certificate:
+此外,您还可以通过使用您的域名通配符或普通 SSL 证书来使用 HTTPS 端口:
```ini
[common]
@@ -482,15 +466,15 @@ dashboard_tls_cert_file = server.crt
dashboard_tls_key_file = server.key
```
-Then visit `https://[server_addr]:7500` to see the dashboard in secure HTTPS connection, with username and password both being `admin`.
+然后访问 `https://[服务器地址]:7500` 以安全 HTTPS 连接查看仪表板,用户名和密码均为 `admin`。

-### Admin UI
+### 管理员界面
-The Admin UI helps you check and manage frpc's configuration.
+管理员界面帮助您检查和管理 frpc 的配置。
-Configure an address for admin UI to enable this feature:
+配置管理员界面的地址以启用此功能:
```ini
[common]
@@ -500,43 +484,43 @@ admin_user = admin
admin_pwd = admin
```
-Then visit `http://127.0.0.1:7400` to see admin UI, with username and password both being `admin`.
+然后访问 `http://127.0.0.1:7400` 查看管理界面,用户名和密码都为 `admin`。
-### Monitor
+### 监控
-When dashboard is enabled, frps will save monitor data in cache. It will be cleared after process restart.
+当启用仪表板时,frps 将监控数据保存在缓存中。进程重启后将被清除。
-Prometheus is also supported.
+也支持 Prometheus。
#### Prometheus
-Enable dashboard first, then configure `enable_prometheus = true` in `frps.ini`.
+首先启用仪表板,然后在 `frps.ini` 中配置 `enable_prometheus = true`。
-`http://{dashboard_addr}/metrics` will provide prometheus monitor data.
+`http://{dashboard_addr}/metrics` 将提供 Prometheus 监控数据。
-### Authenticating the Client
+### 客户端认证
-There are 2 authentication methods to authenticate frpc with frps.
+有 2 种认证方法用于认证 frpc 与 frps。
-You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
+You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
-Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
+Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
-Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
+Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
-#### Token Authentication
+#### Token Authentication
-When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
+When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
-Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
+Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
-#### OIDC Authentication
+#### OIDC Authentication
-When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
+When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
-OIDC stands for OpenID Connect, and the flow used is called [Client Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.4).
+OIDC 代表 OpenID Connect,所使用的流程称为[客户端凭证授权](https://tools.ietf.org/html/rfc6749#section-4.4) 。
-To use this authentication type - configure `frpc.ini` and `frps.ini` as follows:
+要使用此认证类型 - 按照以下方式配置 `frpc.ini` 和 `frps.ini`:
```ini
# frps.ini
@@ -556,9 +540,9 @@ oidc_audience = https://oidc-audience.com/.default
oidc_token_endpoint_url = https://example-oidc-endpoint.com/oauth2/v2.0/token
```
-### Encryption and Compression
+### 加密和压缩
-The features are off by default. You can turn on encryption and/or compression:
+这些功能默认是关闭的。您可以选择开启加密和/或压缩:
```ini
# frpc.ini
@@ -570,17 +554,18 @@ use_encryption = true
use_compression = true
```
-#### TLS
+#### TLS
-frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
+frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
-For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
+For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
-Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
+Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
-To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+
+**`frpc` TLS settings (under the `[common]` section):**
-**`frpc` TLS settings (under the `[common]` section):**
```ini
tls_enable = true
tls_cert_file = certificate.crt
@@ -588,7 +573,8 @@ tls_key_file = certificate.key
tls_trusted_ca_file = ca.crt
```
-**`frps` TLS settings (under the `[common]` section):**
+**`frps` TLS settings (under the `[common]` section):**
+
```ini
tls_only = true
tls_enable = true
@@ -597,13 +583,14 @@ tls_key_file = certificate.key
tls_trusted_ca_file = ca.crt
```
-You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
+You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
-If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
+If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
-Given an example:
+Given an example:
+
+* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
-* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
```
cat > my-openssl.cnf << EOF
[ ca ]
@@ -632,13 +619,15 @@ basicConstraints = CA:true
EOF
```
-* build ca certificates:
+* build ca certificates:
+
```
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
```
-* build frps certificates:
+* 构建 frps 证书:
+
```
openssl genrsa -out server.key 2048
@@ -654,7 +643,8 @@ openssl x509 -req -days 365 -sha256 \
-out server.crt
```
-* build frpc certificates:
+* 构建 frpc 证书:
+
```
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
@@ -669,9 +659,9 @@ openssl x509 -req -days 365 -sha256 \
-out client.crt
```
-### Hot-Reloading frpc configuration
+### 热重载 frpc 配置
-The `admin_addr` and `admin_port` fields are required for enabling HTTP API:
+要启用 HTTP API,需要填写 `admin_addr` 和 `admin_port` 字段
```ini
# frpc.ini
@@ -680,19 +670,19 @@ admin_addr = 127.0.0.1
admin_port = 7400
```
-Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
+Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
-**Note that parameters in [common] section won't be modified except 'start'.**
+**Note that parameters in \[common\] section won't be modified except 'start'.**
-You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
+You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
-### Get proxy status from client
+### Get proxy status from client
-Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
+Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
-### Only allowing certain ports on the server
+### Only allowing certain ports on the server
-`allow_ports` in `frps.ini` is used to avoid abuse of ports:
+`allow_ports` in `frps.ini` is used to avoid abuse of ports:
```ini
# frps.ini
@@ -700,17 +690,17 @@ Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` a
allow_ports = 2000-3000,3001,3003,4000-50000
```
-`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
+`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
-### Port Reuse
+### Port Reuse
-`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
+`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
-We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
+We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
-### Bandwidth Limit
+### Bandwidth Limit
-#### For Each Proxy
+#### For Each Proxy
```ini
# frpc.ini
@@ -721,15 +711,15 @@ remote_port = 6000
bandwidth_limit = 1MB
```
-Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
+Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
-Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
+Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
-### TCP Stream Multiplexing
+### TCP Stream Multiplexing
-frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
+frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
-You can disable this feature by modify `frps.ini` and `frpc.ini`:
+You can disable this feature by modify `frps.ini` and `frpc.ini`:
```ini
# frps.ini and frpc.ini, must be same
@@ -737,91 +727,91 @@ You can disable this feature by modify `frps.ini` and `frpc.ini`:
tcp_mux = false
```
-### Support KCP Protocol
+### Support KCP Protocol
-KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
+KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
-KCP mode uses UDP as the underlying transport. Using KCP in frp:
+KCP mode uses UDP as the underlying transport. Using KCP in frp:
-1. Enable KCP in frps:
+1. Enable KCP in frps:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- # Specify a UDP port for KCP.
- kcp_bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+# Specify a UDP port for KCP.
+kcp_bind_port = 7000
+```
- The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
-2. Configure `frpc.ini` to use KCP to connect to frps:
+2. Configure `frpc.ini` to use KCP to connect to frps:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- # Same as the 'kcp_bind_port' in frps.ini
- server_port = 7000
- protocol = kcp
- ```
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+# Same as the 'kcp_bind_port' in frps.ini
+server_port = 7000
+protocol = kcp
+```
-### Support QUIC Protocol
+### Support QUIC Protocol
-QUIC is a new multiplexed transport built on top of UDP.
+QUIC is a new multiplexed transport built on top of UDP.
-Using QUIC in frp:
+Using QUIC in frp:
-1. Enable QUIC in frps:
+1. Enable QUIC in frps:
- ```ini
- # frps.ini
- [common]
- bind_port = 7000
- # Specify a UDP port for QUIC.
- quic_bind_port = 7000
- ```
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+# Specify a UDP port for QUIC.
+quic_bind_port = 7000
+```
- The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
-2. Configure `frpc.ini` to use QUIC to connect to frps:
+2. Configure `frpc.ini` to use QUIC to connect to frps:
- ```ini
- # frpc.ini
- [common]
- server_addr = x.x.x.x
- # Same as the 'quic_bind_port' in frps.ini
- server_port = 7000
- protocol = quic
- ```
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+# Same as the 'quic_bind_port' in frps.ini
+server_port = 7000
+protocol = quic
+```
-### Connection Pooling
+### Connection Pooling
-By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
+By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
-This feature is suitable for a large number of short connections.
+This feature is suitable for a large number of short connections.
-1. Configure the limit of pool count each proxy can use in `frps.ini`:
+1. Configure the limit of pool count each proxy can use in `frps.ini`:
- ```ini
- # frps.ini
- [common]
- max_pool_count = 5
- ```
+```ini
+# frps.ini
+[common]
+max_pool_count = 5
+```
-2. Enable and specify the number of connection pool:
+2. Enable and specify the number of connection pool:
- ```ini
- # frpc.ini
- [common]
- pool_count = 1
- ```
+```ini
+# frpc.ini
+[common]
+pool_count = 1
+```
-### Load balancing
+### Load balancing
-Load balancing is supported by `group`.
+Load balancing is supported by `group`.
-This feature is only available for types `tcp`, `http`, `tcpmux` now.
+This feature is only available for types `tcp`, `http`, `tcpmux` now.
```ini
# frpc.ini
@@ -840,21 +830,21 @@ group = web
group_key = 123
```
-`group_key` is used for authentication.
+`group_key` is used for authentication.
-Connections to port 80 will be dispatched to proxies in the same group randomly.
+Connections to port 80 will be dispatched to proxies in the same group randomly.
-For type `tcp`, `remote_port` in the same group should be the same.
+For type `tcp`, `remote_port` in the same group should be the same.
-For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
+For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
-### Service Health Check
+### Service Health Check
-Health check feature can help you achieve high availability with load balancing.
+Health check feature can help you achieve high availability with load balancing.
-Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
+Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
-With health check type **tcp**, the service port will be pinged (TCPing):
+With health check type **tcp**, the service port will be pinged (TCPing):
```ini
# frpc.ini
@@ -872,7 +862,7 @@ health_check_max_failed = 3
health_check_interval_s = 10
```
-With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
+With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
```ini
# frpc.ini
@@ -891,11 +881,11 @@ health_check_max_failed = 3
health_check_interval_s = 10
```
-### Rewriting the HTTP Host Header
+### Rewriting the HTTP Host Header
-By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
+By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
-However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
+However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
```ini
# frpc.ini
@@ -906,11 +896,11 @@ custom_domains = test.example.com
host_header_rewrite = dev.example.com
```
-The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
+The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
-### Setting other HTTP Headers
+### Setting other HTTP Headers
-Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
+Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
```ini
# frpc.ini
@@ -922,23 +912,23 @@ host_header_rewrite = dev.example.com
header_X-From-Where = frp
```
-Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
+Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
-In this example, it will set header `X-From-Where: frp` in the HTTP request.
+In this example, it will set header `X-From-Where: frp` in the HTTP request.
-### Get Real IP
+### Get Real IP
-#### HTTP X-Forwarded-For
+#### HTTP X-Forwarded-For
-This feature is for http proxy only.
+This feature is for http proxy only.
-You can get user's real IP from HTTP request headers `X-Forwarded-For`.
+You can get user's real IP from HTTP request headers `X-Forwarded-For`.
-#### Proxy Protocol
+#### Proxy Protocol
-frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
+frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
-Here is an example for https service:
+Here is an example for https service:
```ini
# frpc.ini
@@ -951,15 +941,15 @@ custom_domains = test.example.com
proxy_protocol_version = v2
```
-You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
+You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
-### Require HTTP Basic Auth (Password) for Web Services
+### Require HTTP Basic Auth (Password) for Web Services
-Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
+Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
-This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
+This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
-It can only be enabled when proxy type is http.
+It can only be enabled when proxy type is http.
```ini
# frpc.ini
@@ -971,18 +961,18 @@ http_user = abc
http_pwd = abc
```
-Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
+Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
-### Custom Subdomain Names
+### Custom Subdomain Names
-It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
+It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
```ini
# frps.ini
subdomain_host = frps.com
```
-Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
+Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
```ini
# frpc.ini
@@ -992,15 +982,15 @@ local_port = 80
subdomain = test
```
-Now you can visit your web service on `test.frps.com`.
+Now you can visit your web service on `test.frps.com`.
-Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
+Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
-### URL Routing
+### URL Routing
-frp supports forwarding HTTP requests to different backend web services by url routing.
+frp supports forwarding HTTP requests to different backend web services by url routing.
-`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
+`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
```ini
# frpc.ini
@@ -1017,19 +1007,19 @@ custom_domains = web.example.com
locations = /news,/about
```
-HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
+HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
-### TCP Port Multiplexing
+### TCP Port Multiplexing
-frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
+frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
-The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
+The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
-When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
+When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
-The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
+The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
-For example:
+例如:
```ini
# frps.ini
@@ -1057,18 +1047,19 @@ custom_domains = test2
local_port = 8080
```
-In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
+In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
```
CONNECT test1 HTTP/1.1\r\n\r\n
```
-and the connection will be routed to `proxy1`.
-### Connecting to frps via HTTP PROXY
+and the connection will be routed to `proxy1`.
-frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+### Connecting to frps via HTTP PROXY
-It only works when protocol is tcp.
+frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+
+It only works when protocol is tcp.
```ini
# frpc.ini
@@ -1078,9 +1069,9 @@ server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
```
-### Range ports mapping
+### Range ports mapping
-Proxy with names that start with `range:` will support mapping range ports.
+Proxy with names that start with `range:` will support mapping range ports.
```ini
# frpc.ini
@@ -1091,17 +1082,17 @@ local_port = 6000-6006,6007
remote_port = 6000-6006,6007
```
-frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
+frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
-### Client Plugins
+### Client Plugins
-frpc only forwards requests to local TCP or UDP ports by default.
+frpc only forwards requests to local TCP or UDP ports by default.
-Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
+Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
-Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
+Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
-Using plugin **http_proxy**:
+Using plugin **http\_proxy**:
```ini
# frpc.ini
@@ -1113,40 +1104,39 @@ plugin_http_user = abc
plugin_http_passwd = abc
```
-`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
+`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
-### Server Manage Plugins
+### Server Manage Plugins
-Read the [document](/doc/server_plugin.md).
+Read the [document](/doc/server_plugin.md).
-Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
+Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
-## Development Plan
+## Development Plan
-* Log HTTP request information in frps.
+* Log HTTP request information in frps.
-## Contributing
+## 贡献
-Interested in getting involved? We would like to help you!
+Interested in getting involved? We would like to help you!
-* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
-* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
-* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
-* If you have great ideas, send an email to fatedier@gmail.com.
+* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
+* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
+* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
+* If you have great ideas, send an email to [fatedier@gmail.com](mailto:fatedier@gmail.com).
-**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
+**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
-## Donation
+## Donation
-If frp helps you a lot, you can support us by:
+If frp helps you a lot, you can support us by:
-### GitHub Sponsors
+### GitHub Sponsors
-Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
+Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
-You can have your company's logo placed on README file of this project.
+You can have your company's logo placed on README file of this project.
-### PayPal
-
-Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **fatedier@gmail.com**.
+### PayPal
+Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **[fatedier@gmail.com](mailto:fatedier@gmail.com)**.
\ No newline at end of file
diff --git a/apps/frps/README_en.md b/apps/frps/README_en.md
new file mode 100644
index 000000000..9e035d0ea
--- /dev/null
+++ b/apps/frps/README_en.md
@@ -0,0 +1,1152 @@
+
+# frp
+
+[](https://circleci.com/gh/fatedier/frp)
+[](https://github.com/fatedier/frp/releases)
+
+[README](README.md) | [中文文档](README_zh.md)
+
+
+
+
+
+## What is frp?
+
+frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports **TCP** and **UDP**, as well as **HTTP** and **HTTPS** protocols, enabling requests to be forwarded to internal services via domain name.
+
+frp also offers a P2P connect mode.
+
+## Table of Contents
+
+
+
+- [frp](#frp)
+ - [What is frp?](#what-is-frp)
+ - [Table of Contents](#table-of-contents)
+ - [Development Status](#development-status)
+ - [Architecture](#architecture)
+ - [Example Usage](#example-usage)
+ - [Access your computer in a LAN network via SSH](#access-your-computer-in-a-lan-network-via-ssh)
+ - [Accessing Internal Web Services with Custom Domains in LAN](#accessing-internal-web-services-with-custom-domains-in-lan)
+ - [Forward DNS query requests](#forward-dns-query-requests)
+ - [Forward Unix Domain Socket](#forward-unix-domain-socket)
+ - [Expose a simple HTTP file server](#expose-a-simple-http-file-server)
+ - [Enable HTTPS for a local HTTP(S) service](#enable-https-for-a-local-https-service)
+ - [Expose your service privately](#expose-your-service-privately)
+ - [P2P Mode](#p2p-mode)
+ - [Features](#features)
+ - [Configuration Files](#configuration-files)
+ - [Using Environment Variables](#using-environment-variables)
+ - [Split Configures Into Different Files](#split-configures-into-different-files)
+ - [Dashboard](#dashboard)
+ - [Admin UI](#admin-ui)
+ - [Monitor](#monitor)
+ - [Prometheus](#prometheus)
+ - [Authenticating the Client](#authenticating-the-client)
+ - [Token Authentication](#token-authentication)
+ - [OIDC Authentication](#oidc-authentication)
+ - [Encryption and Compression](#encryption-and-compression)
+ - [TLS](#tls)
+ - [Hot-Reloading frpc configuration](#hot-reloading-frpc-configuration)
+ - [Get proxy status from client](#get-proxy-status-from-client)
+ - [Only allowing certain ports on the server](#only-allowing-certain-ports-on-the-server)
+ - [Port Reuse](#port-reuse)
+ - [Bandwidth Limit](#bandwidth-limit)
+ - [For Each Proxy](#for-each-proxy)
+ - [TCP Stream Multiplexing](#tcp-stream-multiplexing)
+ - [Support KCP Protocol](#support-kcp-protocol)
+ - [Support QUIC Protocol](#support-quic-protocol)
+ - [Connection Pooling](#connection-pooling)
+ - [Load balancing](#load-balancing)
+ - [Service Health Check](#service-health-check)
+ - [Rewriting the HTTP Host Header](#rewriting-the-http-host-header)
+ - [Setting other HTTP Headers](#setting-other-http-headers)
+ - [Get Real IP](#get-real-ip)
+ - [HTTP X-Forwarded-For](#http-x-forwarded-for)
+ - [Proxy Protocol](#proxy-protocol)
+ - [Require HTTP Basic Auth (Password) for Web Services](#require-http-basic-auth-password-for-web-services)
+ - [Custom Subdomain Names](#custom-subdomain-names)
+ - [URL Routing](#url-routing)
+ - [TCP Port Multiplexing](#tcp-port-multiplexing)
+ - [Connecting to frps via HTTP PROXY](#connecting-to-frps-via-http-proxy)
+ - [Range ports mapping](#range-ports-mapping)
+ - [Client Plugins](#client-plugins)
+ - [Server Manage Plugins](#server-manage-plugins)
+ - [Development Plan](#development-plan)
+ - [Contributing](#contributing)
+ - [Donation](#donation)
+ - [GitHub Sponsors](#github-sponsors)
+ - [PayPal](#paypal)
+
+
+
+## Development Status
+
+frp is currently under development. You can try the latest release version in the `master` branch, or use the `dev` branch to access the version currently in development.
+
+We are currently working on version 2 and attempting to perform some code refactoring and improvements. However, please note that it will not be compatible with version 1.
+
+We will transition from version 0 to version 1 at the appropriate time and will only accept bug fixes and improvements, rather than big feature requests.
+
+## Architecture
+
+
+
+## Example Usage
+
+To begin, download the latest program for your operating system and architecture from the [Release](https://github.com/fatedier/frp/releases) page.
+
+Next, place the `frps` binary and `frps.ini` configuration file on Server A, which has a public IP address.
+
+Finally, place the `frpc` binary and `frpc.ini` configuration file on Server B, which is located on a LAN that cannot be directly accessed from the public internet.
+
+### Access your computer in a LAN network via SSH
+
+1. Modify `frps.ini` on server A by setting the `bind_port` for frp clients to connect to:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ ```
+
+2. Start `frps` on server A:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` on server B and set the `server_addr` field to the public IP address of your frps server:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [ssh]
+ type = tcp
+ local_ip = 127.0.0.1
+ local_port = 22
+ remote_port = 6000
+ ```
+
+Note that the `local_port` (listened on the client) and `remote_port` (exposed on the server) are used for traffic going in and out of the frp system, while the `server_port` is used for communication between frps and frpc.
+
+4. Start `frpc` on server B:
+
+ `./frpc -c ./frpc.ini`
+
+5. To access server B from another machine through server A via SSH (assuming the username is `test`), use the following command:
+
+ `ssh -oPort=6000 test@x.x.x.x`
+
+### Accessing Internal Web Services with Custom Domains in LAN
+
+Sometimes we need to expose a local web service behind a NAT network to others for testing purposes with our own domain name.
+
+Unfortunately, we cannot resolve a domain name to a local IP. However, we can use frp to expose an HTTP(S) service.
+
+1. Modify `frps.ini` and set the HTTP port for vhost to 8080:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ vhost_http_port = 8080
+ ```
+
+2. Start `frps`:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Specify the `local_port` of your web service:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [web]
+ type = http
+ local_port = 80
+ custom_domains = www.example.com
+ ```
+
+4. Start `frpc`:
+
+ `./frpc -c ./frpc.ini`
+
+5. Map the A record of `www.example.com` to either the public IP of the remote frps server or a CNAME record pointing to your original domain.
+
+6. Visit your local web service using url `http://www.example.com:8080`.
+
+### Forward DNS query requests
+
+1. Modify `frps.ini`:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ ```
+
+2. Start `frps`:
+
+ `./frps -c ./frps.ini`
+
+3. Modify `frpc.ini` and set `server_addr` to the IP address of the remote frps server. Forward DNS query requests to the Google Public DNS server `8.8.8.8:53`:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [dns]
+ type = udp
+ local_ip = 8.8.8.8
+ local_port = 53
+ remote_port = 6000
+ ```
+
+4. Start frpc:
+
+ `./frpc -c ./frpc.ini`
+
+5. Test DNS resolution using the `dig` command:
+
+ `dig @x.x.x.x -p 6000 www.google.com`
+
+### Forward Unix Domain Socket
+
+Expose a Unix domain socket (e.g. the Docker daemon socket) as TCP.
+
+Configure `frps` as above.
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [unix_domain_socket]
+ type = tcp
+ remote_port = 6000
+ plugin = unix_domain_socket
+ plugin_unix_path = /var/run/docker.sock
+ ```
+
+2. Test the configuration by getting the docker version using `curl`:
+
+ `curl http://x.x.x.x:6000/version`
+
+### Expose a simple HTTP file server
+
+Expose a simple HTTP file server to access files stored in the LAN from the public Internet.
+
+Configure `frps` as described above, then:
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [test_static_file]
+ type = tcp
+ remote_port = 6000
+ plugin = static_file
+ plugin_local_path = /tmp/files
+ plugin_strip_prefix = static
+ plugin_http_user = abc
+ plugin_http_passwd = abc
+ ```
+
+2. Visit `http://x.x.x.x:6000/static/` from your browser and specify correct username and password to view files in `/tmp/files` on the `frpc` machine.
+
+### Enable HTTPS for a local HTTP(S) service
+
+You may substitute `https2https` for the plugin, and point the `plugin_local_addr` to a HTTPS endpoint.
+
+1. Start `frpc` with the following configuration:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [test_https2http]
+ type = https
+ custom_domains = test.example.com
+
+ plugin = https2http
+ plugin_local_addr = 127.0.0.1:80
+ plugin_crt_path = ./server.crt
+ plugin_key_path = ./server.key
+ plugin_host_header_rewrite = 127.0.0.1
+ plugin_header_X-From-Where = frp
+ ```
+
+2. Visit `https://test.example.com`.
+
+### Expose your service privately
+
+To mitigate risks associated with exposing certain services directly to the public network, STCP (Secret TCP) mode requires a preshared key to be used for access to the service from other clients.
+
+Configure `frps` same as above.
+
+1. Start `frpc` on machine B with the following config. This example is for exposing the SSH service (port 22), and note the `sk` field for the preshared key, and that the `remote_port` field is removed here:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [secret_ssh]
+ type = stcp
+ sk = abcdefg
+ local_ip = 127.0.0.1
+ local_port = 22
+ ```
+
+2. Start another `frpc` (typically on another machine C) with the following config to access the SSH service with a security key (`sk` field):
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [secret_ssh_visitor]
+ type = stcp
+ role = visitor
+ server_name = secret_ssh
+ sk = abcdefg
+ bind_addr = 127.0.0.1
+ bind_port = 6000
+ ```
+
+3. On machine C, connect to SSH on machine B, using this command:
+
+ `ssh -oPort=6000 127.0.0.1`
+
+### P2P Mode
+
+**xtcp** is designed to transmit large amounts of data directly between clients. A frps server is still needed, as P2P here only refers to the actual data transmission.
+
+Note that it may not work with all types of NAT devices. You might want to fallback to stcp if xtcp doesn't work.
+
+1. In `frps.ini` configure a UDP port for xtcp:
+
+ ```ini
+ # frps.ini
+ bind_udp_port = 7001
+ ```
+
+2. Start `frpc` on machine B, and expose the SSH port. Note that the `remote_port` field is removed:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [p2p_ssh]
+ type = xtcp
+ sk = abcdefg
+ local_ip = 127.0.0.1
+ local_port = 22
+ ```
+
+3. Start another `frpc` (typically on another machine C) with the configuration to connect to SSH using P2P mode:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ server_port = 7000
+
+ [p2p_ssh_visitor]
+ type = xtcp
+ role = visitor
+ server_name = p2p_ssh
+ sk = abcdefg
+ bind_addr = 127.0.0.1
+ bind_port = 6000
+ ```
+
+4. On machine C, connect to SSH on machine B, using this command:
+
+ `ssh -oPort=6000 127.0.0.1`
+
+## Features
+
+### Configuration Files
+
+Read the full example configuration files to find out even more features not described here.
+
+[Full configuration file for frps (Server)](./conf/frps_full.ini)
+
+[Full configuration file for frpc (Client)](./conf/frpc_full.ini)
+
+### Using Environment Variables
+
+Environment variables can be referenced in the configuration file, using Go's standard format:
+
+```ini
+# frpc.ini
+[common]
+server_addr = {{ .Envs.FRP_SERVER_ADDR }}
+server_port = 7000
+
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = {{ .Envs.FRP_SSH_REMOTE_PORT }}
+```
+
+With the config above, variables can be passed into `frpc` program like this:
+
+```
+export FRP_SERVER_ADDR="x.x.x.x"
+export FRP_SSH_REMOTE_PORT="6000"
+./frpc -c ./frpc.ini
+```
+
+`frpc` will render configuration file template using OS environment variables. Remember to prefix your reference with `.Envs`.
+
+### Split Configures Into Different Files
+
+You can split multiple proxy configs into different files and include them in the main file.
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+includes=./confd/*.ini
+```
+
+```ini
+# ./confd/test.ini
+[ssh]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 6000
+```
+
+### Dashboard
+
+Check frp's status and proxies' statistics information by Dashboard.
+
+Configure a port for dashboard to enable this feature:
+
+```ini
+[common]
+dashboard_port = 7500
+# dashboard's username and password are both optional
+dashboard_user = admin
+dashboard_pwd = admin
+```
+
+Then visit `http://[server_addr]:7500` to see the dashboard, with username and password both being `admin`.
+
+Additionally, you can use HTTPS port by using your domains wildcard or normal SSL certificate:
+
+```ini
+[common]
+dashboard_port = 7500
+# dashboard's username and password are both optional
+dashboard_user = admin
+dashboard_pwd = admin
+dashboard_tls_mode = true
+dashboard_tls_cert_file = server.crt
+dashboard_tls_key_file = server.key
+```
+
+Then visit `https://[server_addr]:7500` to see the dashboard in secure HTTPS connection, with username and password both being `admin`.
+
+
+
+### Admin UI
+
+The Admin UI helps you check and manage frpc's configuration.
+
+Configure an address for admin UI to enable this feature:
+
+```ini
+[common]
+admin_addr = 127.0.0.1
+admin_port = 7400
+admin_user = admin
+admin_pwd = admin
+```
+
+Then visit `http://127.0.0.1:7400` to see admin UI, with username and password both being `admin`.
+
+### Monitor
+
+When dashboard is enabled, frps will save monitor data in cache. It will be cleared after process restart.
+
+Prometheus is also supported.
+
+#### Prometheus
+
+Enable dashboard first, then configure `enable_prometheus = true` in `frps.ini`.
+
+`http://{dashboard_addr}/metrics` will provide prometheus monitor data.
+
+### Authenticating the Client
+
+There are 2 authentication methods to authenticate frpc with frps.
+
+You can decide which one to use by configuring `authentication_method` under `[common]` in `frpc.ini` and `frps.ini`.
+
+Configuring `authenticate_heartbeats = true` under `[common]` will use the configured authentication method to add and validate authentication on every heartbeat between frpc and frps.
+
+Configuring `authenticate_new_work_conns = true` under `[common]` will do the same for every new work connection between frpc and frps.
+
+#### Token Authentication
+
+When specifying `authentication_method = token` under `[common]` in `frpc.ini` and `frps.ini` - token based authentication will be used.
+
+Make sure to specify the same `token` in the `[common]` section in `frps.ini` and `frpc.ini` for frpc to pass frps validation
+
+#### OIDC Authentication
+
+When specifying `authentication_method = oidc` under `[common]` in `frpc.ini` and `frps.ini` - OIDC based authentication will be used.
+
+OIDC stands for OpenID Connect, and the flow used is called [Client Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.4).
+
+To use this authentication type - configure `frpc.ini` and `frps.ini` as follows:
+
+```ini
+# frps.ini
+[common]
+authentication_method = oidc
+oidc_issuer = https://example-oidc-issuer.com/
+oidc_audience = https://oidc-audience.com/.default
+```
+
+```ini
+# frpc.ini
+[common]
+authentication_method = oidc
+oidc_client_id = 98692467-37de-409a-9fac-bb2585826f18 # Replace with OIDC client ID
+oidc_client_secret = oidc_secret
+oidc_audience = https://oidc-audience.com/.default
+oidc_token_endpoint_url = https://example-oidc-endpoint.com/oauth2/v2.0/token
+```
+
+### Encryption and Compression
+
+The features are off by default. You can turn on encryption and/or compression:
+
+```ini
+# frpc.ini
+[ssh]
+type = tcp
+local_port = 22
+remote_port = 6000
+use_encryption = true
+use_compression = true
+```
+
+#### TLS
+
+frp supports the TLS protocol between `frpc` and `frps` since v0.25.0.
+
+For port multiplexing, frp sends a first byte `0x17` to dial a TLS connection.
+
+Configure `tls_enable = true` in the `[common]` section to `frpc.ini` to enable this feature.
+
+To **enforce** `frps` to only accept TLS connections - configure `tls_only = true` in the `[common]` section in `frps.ini`. **This is optional.**
+
+**`frpc` TLS settings (under the `[common]` section):**
+```ini
+tls_enable = true
+tls_cert_file = certificate.crt
+tls_key_file = certificate.key
+tls_trusted_ca_file = ca.crt
+```
+
+**`frps` TLS settings (under the `[common]` section):**
+```ini
+tls_only = true
+tls_enable = true
+tls_cert_file = certificate.crt
+tls_key_file = certificate.key
+tls_trusted_ca_file = ca.crt
+```
+
+You will need **a root CA cert** and **at least one SSL/TLS certificate**. It **can** be self-signed or regular (such as Let's Encrypt or another SSL/TLS certificate provider).
+
+If you using `frp` via IP address and not hostname, make sure to set the appropriate IP address in the Subject Alternative Name (SAN) area when generating SSL/TLS Certificates.
+
+Given an example:
+
+* Prepare openssl config file. It exists at `/etc/pki/tls/openssl.cnf` in Linux System and `/System/Library/OpenSSL/openssl.cnf` in MacOS, and you can copy it to current path, like `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`. If not, you can build it by yourself, like:
+```
+cat > my-openssl.cnf << EOF
+[ ca ]
+default_ca = CA_default
+[ CA_default ]
+x509_extensions = usr_cert
+[ req ]
+default_bits = 2048
+default_md = sha256
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca
+string_mask = utf8only
+[ req_distinguished_name ]
+[ req_attributes ]
+[ usr_cert ]
+basicConstraints = CA:FALSE
+nsComment = "OpenSSL Generated Certificate"
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid,issuer
+[ v3_ca ]
+subjectKeyIdentifier = hash
+authorityKeyIdentifier = keyid:always,issuer
+basicConstraints = CA:true
+EOF
+```
+
+* build ca certificates:
+```
+openssl genrsa -out ca.key 2048
+openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
+```
+
+* build frps certificates:
+```
+openssl genrsa -out server.key 2048
+
+openssl req -new -sha256 -key server.key \
+ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \
+ -reqexts SAN \
+ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")) \
+ -out server.csr
+
+openssl x509 -req -days 365 -sha256 \
+ -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
+ -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com") \
+ -out server.crt
+```
+
+* build frpc certificates:
+```
+openssl genrsa -out client.key 2048
+openssl req -new -sha256 -key client.key \
+ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
+ -reqexts SAN \
+ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
+ -out client.csr
+
+openssl x509 -req -days 365 -sha256 \
+ -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
+ -extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") \
+ -out client.crt
+```
+
+### Hot-Reloading frpc configuration
+
+The `admin_addr` and `admin_port` fields are required for enabling HTTP API:
+
+```ini
+# frpc.ini
+[common]
+admin_addr = 127.0.0.1
+admin_port = 7400
+```
+
+Then run command `frpc reload -c ./frpc.ini` and wait for about 10 seconds to let `frpc` create or update or remove proxies.
+
+**Note that parameters in [common] section won't be modified except 'start'.**
+
+You can run command `frpc verify -c ./frpc.ini` before reloading to check if there are config errors.
+
+### Get proxy status from client
+
+Use `frpc status -c ./frpc.ini` to get status of all proxies. The `admin_addr` and `admin_port` fields are required for enabling HTTP API.
+
+### Only allowing certain ports on the server
+
+`allow_ports` in `frps.ini` is used to avoid abuse of ports:
+
+```ini
+# frps.ini
+[common]
+allow_ports = 2000-3000,3001,3003,4000-50000
+```
+
+`allow_ports` consists of specific ports or port ranges (lowest port number, dash `-`, highest port number), separated by comma `,`.
+
+### Port Reuse
+
+`vhost_http_port` and `vhost_https_port` in frps can use same port with `bind_port`. frps will detect the connection's protocol and handle it correspondingly.
+
+We would like to try to allow multiple proxies bind a same remote port with different protocols in the future.
+
+### Bandwidth Limit
+
+#### For Each Proxy
+
+```ini
+# frpc.ini
+[ssh]
+type = tcp
+local_port = 22
+remote_port = 6000
+bandwidth_limit = 1MB
+```
+
+Set `bandwidth_limit` in each proxy's configure to enable this feature. Supported units are `MB` and `KB`.
+
+Set `bandwidth_limit_mode` to `client` or `server` to limit bandwidth on the client or server side. Default is `client`.
+
+### TCP Stream Multiplexing
+
+frp supports tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing, in which case all logic connections to the same frpc are multiplexed into the same TCP connection.
+
+You can disable this feature by modify `frps.ini` and `frpc.ini`:
+
+```ini
+# frps.ini and frpc.ini, must be same
+[common]
+tcp_mux = false
+```
+
+### Support KCP Protocol
+
+KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP.
+
+KCP mode uses UDP as the underlying transport. Using KCP in frp:
+
+1. Enable KCP in frps:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ # Specify a UDP port for KCP.
+ kcp_bind_port = 7000
+ ```
+
+ The `kcp_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+
+2. Configure `frpc.ini` to use KCP to connect to frps:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ # Same as the 'kcp_bind_port' in frps.ini
+ server_port = 7000
+ protocol = kcp
+ ```
+
+### Support QUIC Protocol
+
+QUIC is a new multiplexed transport built on top of UDP.
+
+Using QUIC in frp:
+
+1. Enable QUIC in frps:
+
+ ```ini
+ # frps.ini
+ [common]
+ bind_port = 7000
+ # Specify a UDP port for QUIC.
+ quic_bind_port = 7000
+ ```
+
+ The `quic_bind_port` number can be the same number as `bind_port`, since `bind_port` field specifies a TCP port.
+
+2. Configure `frpc.ini` to use QUIC to connect to frps:
+
+ ```ini
+ # frpc.ini
+ [common]
+ server_addr = x.x.x.x
+ # Same as the 'quic_bind_port' in frps.ini
+ server_port = 7000
+ protocol = quic
+ ```
+
+### Connection Pooling
+
+By default, frps creates a new frpc connection to the backend service upon a user request. With connection pooling, frps keeps a certain number of pre-established connections, reducing the time needed to establish a connection.
+
+This feature is suitable for a large number of short connections.
+
+1. Configure the limit of pool count each proxy can use in `frps.ini`:
+
+ ```ini
+ # frps.ini
+ [common]
+ max_pool_count = 5
+ ```
+
+2. Enable and specify the number of connection pool:
+
+ ```ini
+ # frpc.ini
+ [common]
+ pool_count = 1
+ ```
+
+### Load balancing
+
+Load balancing is supported by `group`.
+
+This feature is only available for types `tcp`, `http`, `tcpmux` now.
+
+```ini
+# frpc.ini
+[test1]
+type = tcp
+local_port = 8080
+remote_port = 80
+group = web
+group_key = 123
+
+[test2]
+type = tcp
+local_port = 8081
+remote_port = 80
+group = web
+group_key = 123
+```
+
+`group_key` is used for authentication.
+
+Connections to port 80 will be dispatched to proxies in the same group randomly.
+
+For type `tcp`, `remote_port` in the same group should be the same.
+
+For type `http`, `custom_domains`, `subdomain`, `locations` should be the same.
+
+### Service Health Check
+
+Health check feature can help you achieve high availability with load balancing.
+
+Add `health_check_type = tcp` or `health_check_type = http` to enable health check.
+
+With health check type **tcp**, the service port will be pinged (TCPing):
+
+```ini
+# frpc.ini
+[test1]
+type = tcp
+local_port = 22
+remote_port = 6000
+# Enable TCP health check
+health_check_type = tcp
+# TCPing timeout seconds
+health_check_timeout_s = 3
+# If health check failed 3 times in a row, the proxy will be removed from frps
+health_check_max_failed = 3
+# A health check every 10 seconds
+health_check_interval_s = 10
+```
+
+With health check type **http**, an HTTP request will be sent to the service and an HTTP 2xx OK response is expected:
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_ip = 127.0.0.1
+local_port = 80
+custom_domains = test.example.com
+# Enable HTTP health check
+health_check_type = http
+# frpc will send a GET request to '/status'
+# and expect an HTTP 2xx OK response
+health_check_url = /status
+health_check_timeout_s = 3
+health_check_max_failed = 3
+health_check_interval_s = 10
+```
+
+### Rewriting the HTTP Host Header
+
+By default frp does not modify the tunneled HTTP requests at all as it's a byte-for-byte copy.
+
+However, speaking of web servers and HTTP requests, your web server might rely on the `Host` HTTP header to determine the website to be accessed. frp can rewrite the `Host` header when forwarding the HTTP requests, with the `host_header_rewrite` field:
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+host_header_rewrite = dev.example.com
+```
+
+The HTTP request will have the `Host` header rewritten to `Host: dev.example.com` when it reaches the actual web server, although the request from the browser probably has `Host: test.example.com`.
+
+### Setting other HTTP Headers
+
+Similar to `Host`, You can override other HTTP request headers with proxy type `http`.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+host_header_rewrite = dev.example.com
+header_X-From-Where = frp
+```
+
+Note that parameter(s) prefixed with `header_` will be added to HTTP request headers.
+
+In this example, it will set header `X-From-Where: frp` in the HTTP request.
+
+### Get Real IP
+
+#### HTTP X-Forwarded-For
+
+This feature is for http proxy only.
+
+You can get user's real IP from HTTP request headers `X-Forwarded-For`.
+
+#### Proxy Protocol
+
+frp supports Proxy Protocol to send user's real IP to local services. It support all types except UDP.
+
+Here is an example for https service:
+
+```ini
+# frpc.ini
+[web]
+type = https
+local_port = 443
+custom_domains = test.example.com
+
+# now v1 and v2 are supported
+proxy_protocol_version = v2
+```
+
+You can enable Proxy Protocol support in nginx to expose user's real IP in HTTP header `X-Real-IP`, and then read `X-Real-IP` header in your web service for the real IP.
+
+### Require HTTP Basic Auth (Password) for Web Services
+
+Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.
+
+This enforces HTTP Basic Auth on all requests with the username and password specified in frpc's configure file.
+
+It can only be enabled when proxy type is http.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+custom_domains = test.example.com
+http_user = abc
+http_pwd = abc
+```
+
+Visit `http://test.example.com` in the browser and now you are prompted to enter the username and password.
+
+### Custom Subdomain Names
+
+It is convenient to use `subdomain` configure for http and https types when many people share one frps server.
+
+```ini
+# frps.ini
+subdomain_host = frps.com
+```
+
+Resolve `*.frps.com` to the frps server's IP. This is usually called a Wildcard DNS record.
+
+```ini
+# frpc.ini
+[web]
+type = http
+local_port = 80
+subdomain = test
+```
+
+Now you can visit your web service on `test.frps.com`.
+
+Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.
+
+### URL Routing
+
+frp supports forwarding HTTP requests to different backend web services by url routing.
+
+`locations` specifies the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.
+
+```ini
+# frpc.ini
+[web01]
+type = http
+local_port = 80
+custom_domains = web.example.com
+locations = /
+
+[web02]
+type = http
+local_port = 81
+custom_domains = web.example.com
+locations = /news,/about
+```
+
+HTTP requests with URL prefix `/news` or `/about` will be forwarded to **web02** and other requests to **web01**.
+
+### TCP Port Multiplexing
+
+frp supports receiving TCP sockets directed to different proxies on a single port on frps, similar to `vhost_http_port` and `vhost_https_port`.
+
+The only supported TCP port multiplexing method available at the moment is `httpconnect` - HTTP CONNECT tunnel.
+
+When setting `tcpmux_httpconnect_port` to anything other than 0 in frps under `[common]`, frps will listen on this port for HTTP CONNECT requests.
+
+The host of the HTTP CONNECT request will be used to match the proxy in frps. Proxy hosts can be configured in frpc by configuring `custom_domain` and / or `subdomain` under `type = tcpmux` proxies, when `multiplexer = httpconnect`.
+
+For example:
+
+```ini
+# frps.ini
+[common]
+bind_port = 7000
+tcpmux_httpconnect_port = 1337
+```
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+
+[proxy1]
+type = tcpmux
+multiplexer = httpconnect
+custom_domains = test1
+local_port = 80
+
+[proxy2]
+type = tcpmux
+multiplexer = httpconnect
+custom_domains = test2
+local_port = 8080
+```
+
+In the above configuration - frps can be contacted on port 1337 with a HTTP CONNECT header such as:
+
+```
+CONNECT test1 HTTP/1.1\r\n\r\n
+```
+and the connection will be routed to `proxy1`.
+
+### Connecting to frps via HTTP PROXY
+
+frpc can connect to frps using HTTP proxy if you set OS environment variable `HTTP_PROXY`, or if `http_proxy` is set in frpc.ini file.
+
+It only works when protocol is tcp.
+
+```ini
+# frpc.ini
+[common]
+server_addr = x.x.x.x
+server_port = 7000
+http_proxy = http://user:pwd@192.168.1.128:8080
+```
+
+### Range ports mapping
+
+Proxy with names that start with `range:` will support mapping range ports.
+
+```ini
+# frpc.ini
+[range:test_tcp]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 6000-6006,6007
+remote_port = 6000-6006,6007
+```
+
+frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
+
+### Client Plugins
+
+frpc only forwards requests to local TCP or UDP ports by default.
+
+Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
+
+Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
+
+Using plugin **http_proxy**:
+
+```ini
+# frpc.ini
+[http_proxy]
+type = tcp
+remote_port = 6000
+plugin = http_proxy
+plugin_http_user = abc
+plugin_http_passwd = abc
+```
+
+`plugin_http_user` and `plugin_http_passwd` are configuration parameters used in `http_proxy` plugin.
+
+### Server Manage Plugins
+
+Read the [document](/doc/server_plugin.md).
+
+Find more plugins in [gofrp/plugin](https://github.com/gofrp/plugin).
+
+## Development Plan
+
+* Log HTTP request information in frps.
+
+## Contributing
+
+Interested in getting involved? We would like to help you!
+
+* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
+* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
+* Sorry for my poor English. Improvements for this document are welcome, even some typo fixes.
+* If you have great ideas, send an email to fatedier@gmail.com.
+
+**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatedly.**
+
+## Donation
+
+If frp helps you a lot, you can support us by:
+
+### GitHub Sponsors
+
+Support us by [Github Sponsors](https://github.com/sponsors/fatedier).
+
+You can have your company's logo placed on README file of this project.
+
+### PayPal
+
+Donate money by [PayPal](https://www.paypal.me/fatedier) to my account **fatedier@gmail.com**.
+
diff --git a/apps/geekbench/6/4/.env.sample b/apps/geekbench/4/.env.sample
similarity index 100%
rename from apps/geekbench/6/4/.env.sample
rename to apps/geekbench/4/.env.sample
diff --git a/apps/geekbench/6/4/data.yml b/apps/geekbench/4/data.yml
similarity index 100%
rename from apps/geekbench/6/4/data.yml
rename to apps/geekbench/4/data.yml
diff --git a/apps/geekbench/6/4/docker-compose.yml b/apps/geekbench/4/docker-compose.yml
similarity index 86%
rename from apps/geekbench/6/4/docker-compose.yml
rename to apps/geekbench/4/docker-compose.yml
index 025e039db..1f4d8df23 100644
--- a/apps/geekbench/6/4/docker-compose.yml
+++ b/apps/geekbench/4/docker-compose.yml
@@ -1,6 +1,6 @@
services:
geekbench:
- image: "davidsarkany/geekbench:6"
+ image: davidsarkany/geekbench:4
container_name: ${CONTAINER_NAME}
restart: "no"
stdin_open: true
diff --git a/apps/geekbench/6/5/.env.sample b/apps/geekbench/5/.env.sample
similarity index 100%
rename from apps/geekbench/6/5/.env.sample
rename to apps/geekbench/5/.env.sample
diff --git a/apps/geekbench/6/5/data.yml b/apps/geekbench/5/data.yml
similarity index 100%
rename from apps/geekbench/6/5/data.yml
rename to apps/geekbench/5/data.yml
diff --git a/apps/geekbench/6/5/docker-compose.yml b/apps/geekbench/5/docker-compose.yml
similarity index 86%
rename from apps/geekbench/6/5/docker-compose.yml
rename to apps/geekbench/5/docker-compose.yml
index 025e039db..c5bd0935e 100644
--- a/apps/geekbench/6/5/docker-compose.yml
+++ b/apps/geekbench/5/docker-compose.yml
@@ -1,6 +1,6 @@
services:
geekbench:
- image: "davidsarkany/geekbench:6"
+ image: davidsarkany/geekbench:5
container_name: ${CONTAINER_NAME}
restart: "no"
stdin_open: true
diff --git a/apps/geekbench/6/docker-compose.yml b/apps/geekbench/6/docker-compose.yml
index 025e039db..70c91380d 100644
--- a/apps/geekbench/6/docker-compose.yml
+++ b/apps/geekbench/6/docker-compose.yml
@@ -1,6 +1,6 @@
services:
geekbench:
- image: "davidsarkany/geekbench:6"
+ image: davidsarkany/geekbench:6
container_name: ${CONTAINER_NAME}
restart: "no"
stdin_open: true
diff --git a/apps/geekbench/README.md b/apps/geekbench/README.md
index 6e7f1c391..322ae0b6e 100644
--- a/apps/geekbench/README.md
+++ b/apps/geekbench/README.md
@@ -2,9 +2,9 @@
[](https://hub.docker.com/r/davidsarkany/geekbench) [](https://hub.docker.com/r/davidsarkany/geekbench)
-Unofficial build of Geekbench, forked from [chrisdaish/geekbench](https://github.com/chrisdaish/docker-geekbench).
+Geekbench 非官方构建版本,源自 [chrisdaish/geekbench](https://github.com/chrisdaish/docker-geekbench)。
-### Usage
+### 使用方法
#### Geekbench 6
@@ -22,4 +22,4 @@ docker run -it --rm davidsarkany/geekbench:5 && docker rmi davidsarkany/geekbenc
```
docker run -it --rm davidsarkany/geekbench:4 && docker rmi davidsarkany/geekbench:4
-```
+```
\ No newline at end of file
diff --git a/apps/geekbench/README_en.md b/apps/geekbench/README_en.md
new file mode 100644
index 000000000..6e7f1c391
--- /dev/null
+++ b/apps/geekbench/README_en.md
@@ -0,0 +1,25 @@
+# Geekbench
+
+[](https://hub.docker.com/r/davidsarkany/geekbench) [](https://hub.docker.com/r/davidsarkany/geekbench)
+
+Unofficial build of Geekbench, forked from [chrisdaish/geekbench](https://github.com/chrisdaish/docker-geekbench).
+
+### Usage
+
+#### Geekbench 6
+
+```
+docker run -it --rm davidsarkany/geekbench && docker rmi davidsarkany/geekbench
+```
+
+#### Geekbench 5
+
+```
+docker run -it --rm davidsarkany/geekbench:5 && docker rmi davidsarkany/geekbench:5
+```
+
+#### Geekbench 4
+
+```
+docker run -it --rm davidsarkany/geekbench:4 && docker rmi davidsarkany/geekbench:4
+```
diff --git a/apps/gitlab-jh/18.1.0-jh.0/data.yml b/apps/gitlab-jh/18.1.1-jh.0/data.yml
similarity index 100%
rename from apps/gitlab-jh/18.1.0-jh.0/data.yml
rename to apps/gitlab-jh/18.1.1-jh.0/data.yml
diff --git a/apps/gitlab-jh/18.1.0-jh.0/docker-compose.yml b/apps/gitlab-jh/18.1.1-jh.0/docker-compose.yml
similarity index 89%
rename from apps/gitlab-jh/18.1.0-jh.0/docker-compose.yml
rename to apps/gitlab-jh/18.1.1-jh.0/docker-compose.yml
index 67689fe35..d4c6e6995 100644
--- a/apps/gitlab-jh/18.1.0-jh.0/docker-compose.yml
+++ b/apps/gitlab-jh/18.1.1-jh.0/docker-compose.yml
@@ -1,7 +1,7 @@
version: "3.6"
services:
gitlab-jh:
- image: registry.gitlab.cn/omnibus/gitlab-jh:18.1.0-jh.0
+ image: registry.gitlab.cn/omnibus/gitlab-jh:18.1.1-jh.0
container_name: ${CONTAINER_NAME}
hostname: localhost
restart: always
diff --git a/apps/grafana/README.md b/apps/grafana/README.md
index 9de75ac99..0b569485f 100644
--- a/apps/grafana/README.md
+++ b/apps/grafana/README.md
@@ -1,6 +1,7 @@
# 使用说明
默认账户与密码
+
```
username:admin
password:admin
@@ -10,50 +11,48 @@ password:admin

-The open-source platform for monitoring and observability
+开源平台用于监控和可观察性
-[](LICENSE)
-[](https://drone.grafana.net/grafana/grafana)
-[](https://goreportcard.com/report/github.com/grafana/grafana)
+[](LICENSE) [](https://drone.grafana.net/grafana/grafana) [](https://goreportcard.com/report/github.com/grafana/grafana)
-Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture:
+Grafana 允许您查询、可视化、警报并理解您的指标,无论它们存储在哪里。创建、探索和与您的团队共享仪表板,培养数据驱动文化:
-- **Visualizations:** Fast and flexible client side graphs with a multitude of options. Panel plugins offer many different ways to visualize metrics and logs.
-- **Dynamic Dashboards:** Create dynamic & reusable dashboards with template variables that appear as dropdowns at the top of the dashboard.
-- **Explore Metrics:** Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side.
-- **Explore Logs:** Experience the magic of switching from metrics to logs with preserved label filters. Quickly search through all your logs or streaming them live.
-- **Alerting:** Visually define alert rules for your most important metrics. Grafana will continuously evaluate and send notifications to systems like Slack, PagerDuty, VictorOps, OpsGenie.
-- **Mixed Data Sources:** Mix different data sources in the same graph! You can specify a data source on a per-query basis. This works for even custom datasources.
+* **可视化:** 快速灵活的客户端图表,具有多种选项。面板插件提供了许多不同的方式来可视化指标和日志。
+* **动态仪表板:** 创建动态且可重用的仪表板,其中模板变量作为下拉菜单出现在仪表板顶部。
+* **探索指标:** 通过临时查询和动态钻取探索您的数据。分割视图并对比不同的时间范围、查询和数据源。
+* **探索日志:** 体验从指标切换到日志的魔法,同时保留标签过滤器。快速搜索所有日志或实时流式传输它们。
+* **警报:** 直观地定义最重要的指标的警报规则。Grafana 将持续评估并发送通知到 Slack、PagerDuty、VictorOps、OpsGenie 等系统。
+* **混合数据源:** 在同一个图表中混合不同的数据源!您可以根据查询指定数据源。这甚至适用于自定义数据源。
-## Get started
+## 开始使用
-- [Get Grafana](https://grafana.com/get)
-- [Installation guides](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
+* [获取 Grafana](https://grafana.com/get)
+* [安装指南](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
-Unsure if Grafana is for you? Watch Grafana in action on [play.grafana.org](https://play.grafana.org/)!
+不确定 Grafana 是否适合您?观看 Grafana 在 [play.grafana.org](play.grafana.org) 上的实际应用!
-## Documentation
+## 文档
-The Grafana documentation is available at [grafana.com/docs](https://grafana.com/docs/).
+Grafana 文档可在 [grafana.com/docs](https://grafana.com/docs/) 找到。
-## Contributing
+## 贡献
-If you're interested in contributing to the Grafana project:
+如果您有兴趣为 Grafana 项目贡献力量:
-- Start by reading the [Contributing guide](https://github.com/grafana/grafana/blob/HEAD/CONTRIBUTING.md).
-- Learn how to set up your local environment, in our [Developer guide](https://github.com/grafana/grafana/blob/HEAD/contribute/developer-guide.md).
-- Explore our [beginner-friendly issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22).
-- Look through our [style guide and Storybook](https://developers.grafana.com/ui/latest/index.html).
+* 请先阅读[贡献指南](https://github.com/grafana/grafana/blob/HEAD/CONTRIBUTING.md) 。
+* 了解如何设置本地环境,请参阅我们的[开发者指南](https://github.com/grafana/grafana/blob/HEAD/contribute/developer-guide.md) 。
+* 探索我们的[入门问题](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22) 。
+* 查看我们的[风格指南和 Storybook](https://developers.grafana.com/ui/latest/index.html)。
-## Get involved
+## 参与其中
-- Follow [@grafana on Twitter](https://twitter.com/grafana/).
-- Read and subscribe to the [Grafana blog](https://grafana.com/blog/).
-- If you have a specific question, check out our [discussion forums](https://community.grafana.com/).
-- For general discussions, join us on the [official Slack](https://slack.grafana.com) team.
+* 关注 [@grafana](https://twitter.com/grafana/) 在 Twitter 上的动态。
+* 阅读并订阅 [Grafana 博客](https://grafana.com/blog/) 。
+* 如果您有具体问题,请查看我们的[讨论论坛](https://community.grafana.com/) 。
+* 对于一般讨论,加入我们的[官方 Slack 团队](https://slack.grafana.com) 。
-This project is tested with [BrowserStack](https://www.browserstack.com/)
+该项目与 [BrowserStack](https://www.browserstack.com/) 进行了测试。
-## License
+## 许可证
-Grafana is distributed under [AGPL-3.0-only](LICENSE). For Apache-2.0 exceptions, see [LICENSING.md](https://github.com/grafana/grafana/blob/HEAD/LICENSING.md).
+Grafana 遵循 [AGPL-3.0-only](LICENSE) 协议分发。有关 Apache-2.0 例外情况,请参阅 [LICENSING.md](https://github.com/grafana/grafana/blob/HEAD/LICENSING.md)。
\ No newline at end of file
diff --git a/apps/grafana/README_en.md b/apps/grafana/README_en.md
new file mode 100644
index 000000000..9de75ac99
--- /dev/null
+++ b/apps/grafana/README_en.md
@@ -0,0 +1,59 @@
+# 使用说明
+
+默认账户与密码
+```
+username:admin
+password:admin
+```
+
+# 原始相关
+
+
+
+The open-source platform for monitoring and observability
+
+[](LICENSE)
+[](https://drone.grafana.net/grafana/grafana)
+[](https://goreportcard.com/report/github.com/grafana/grafana)
+
+Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture:
+
+- **Visualizations:** Fast and flexible client side graphs with a multitude of options. Panel plugins offer many different ways to visualize metrics and logs.
+- **Dynamic Dashboards:** Create dynamic & reusable dashboards with template variables that appear as dropdowns at the top of the dashboard.
+- **Explore Metrics:** Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side.
+- **Explore Logs:** Experience the magic of switching from metrics to logs with preserved label filters. Quickly search through all your logs or streaming them live.
+- **Alerting:** Visually define alert rules for your most important metrics. Grafana will continuously evaluate and send notifications to systems like Slack, PagerDuty, VictorOps, OpsGenie.
+- **Mixed Data Sources:** Mix different data sources in the same graph! You can specify a data source on a per-query basis. This works for even custom datasources.
+
+## Get started
+
+- [Get Grafana](https://grafana.com/get)
+- [Installation guides](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
+
+Unsure if Grafana is for you? Watch Grafana in action on [play.grafana.org](https://play.grafana.org/)!
+
+## Documentation
+
+The Grafana documentation is available at [grafana.com/docs](https://grafana.com/docs/).
+
+## Contributing
+
+If you're interested in contributing to the Grafana project:
+
+- Start by reading the [Contributing guide](https://github.com/grafana/grafana/blob/HEAD/CONTRIBUTING.md).
+- Learn how to set up your local environment, in our [Developer guide](https://github.com/grafana/grafana/blob/HEAD/contribute/developer-guide.md).
+- Explore our [beginner-friendly issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22).
+- Look through our [style guide and Storybook](https://developers.grafana.com/ui/latest/index.html).
+
+## Get involved
+
+- Follow [@grafana on Twitter](https://twitter.com/grafana/).
+- Read and subscribe to the [Grafana blog](https://grafana.com/blog/).
+- If you have a specific question, check out our [discussion forums](https://community.grafana.com/).
+- For general discussions, join us on the [official Slack](https://slack.grafana.com) team.
+
+This project is tested with [BrowserStack](https://www.browserstack.com/)
+
+## License
+
+Grafana is distributed under [AGPL-3.0-only](LICENSE). For Apache-2.0 exceptions, see [LICENSING.md](https://github.com/grafana/grafana/blob/HEAD/LICENSING.md).
diff --git a/apps/h5ai/README.md b/apps/h5ai/README.md
index b7ebb5d69..54afc501b 100644
--- a/apps/h5ai/README.md
+++ b/apps/h5ai/README.md
@@ -1,73 +1,36 @@
# h5ai
-[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
+[](https://github.com/lrsjng/h5ai) [](https://larsjung.de/h5ai/) [](https://github.com/lrsjng/h5ai)
-A modern HTTP web server index for Apache httpd, lighttpd, and nginx.
+现代 HTTP 网络服务器索引,适用于 Apache httpd、lighttpd 和 nginx。
+## 重要
-## Important
+* 不要安装来自 `src` 文件夹的任何文件,它们需要预处理才能正确工作!
+* 找到预处理的软件包和详细的安装说明 [项目页面](https://larsjung.de/h5ai/) .
+* 对于错误报告和功能请求,请使用[问题](https://github.com/lrsjng/h5ai/issues) 。
-* Do **not** install any files from the `src` folder, they need to be
- preprocessed to work correctly!
-* Find a preprocessed package and detailed install instructions on the
- [project page][web].
-* For bug reports and feature requests please use [issues][github-issues].
+## 构建
+有针对最新[版本](https://release.larsjung.de/h5ai/)的安装准备包和 [开发版本](https://release.larsjung.de/h5ai/develop/) 。但若要自行构建 **h5ai**,则可以使用 `git clone` 或下载仓库。在根目录下运行以下命令,以在 `build` 文件夹中找到一个全新的 zip 文件(仅在 Linux 上测试,需要安装 [`node 10.0+`](https://nodejs.org),可能在其他配置下也能工作)。
-## Build
-
-There are installation ready packages for the latest [releases][release] and
-[dev builds][develop]. But to build **h5ai** yourself either `git clone` or
-download the repository. From within the root folder run the following
-commands to find a fresh zipball in folder `build` (tested on linux only,
-requires [`node 10.0+`][node] to be installed, might work on other
-configurations).
-
-~~~sh
+```sh
> npm install
> npm run build
-~~~
+```
+## 许可证
-## License
+MIT 许可证 (MIT)
-The MIT License (MIT)
+版权所有 (c) 2020 Lars Jung ([https://larsjung.de](https://larsjung.de))
-Copyright (c) 2020 Lars Jung (https://larsjung.de)
+本协议授予任何获得本软件及其相关文档副本(以下简称“软件”)的个人免费使用软件的权利,不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许向软件提供者提供软件的个人进行上述操作,但须遵守以下条件:
-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.
+## 参考文献
-
-## References
-
-**h5ai** profits from other projects, all of them licensed under the MIT license
-too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0).
-
-
-[web]: https://larsjung.de/h5ai/
-[github]: https://github.com/lrsjng/h5ai
-[github-issues]: https://github.com/lrsjng/h5ai/issues
-[release]: https://release.larsjung.de/h5ai/
-[develop]: https://release.larsjung.de/h5ai/develop/
-[node]: https://nodejs.org
-[material-design-icons]: https://github.com/google/material-design-icons
-
-[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
-[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square
-[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square
+从其他项目中获利,所有这些项目都同样采用 MIT 许可。例外情况是一些[材料设计图标](https://github.com/google/material-design-icons) (CC BY 4.0)。
\ No newline at end of file
diff --git a/apps/h5ai/README_en.md b/apps/h5ai/README_en.md
new file mode 100644
index 000000000..b7ebb5d69
--- /dev/null
+++ b/apps/h5ai/README_en.md
@@ -0,0 +1,73 @@
+# h5ai
+
+[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
+
+A modern HTTP web server index for Apache httpd, lighttpd, and nginx.
+
+
+## Important
+
+* Do **not** install any files from the `src` folder, they need to be
+ preprocessed to work correctly!
+* Find a preprocessed package and detailed install instructions on the
+ [project page][web].
+* For bug reports and feature requests please use [issues][github-issues].
+
+
+## Build
+
+There are installation ready packages for the latest [releases][release] and
+[dev builds][develop]. But to build **h5ai** yourself either `git clone` or
+download the repository. From within the root folder run the following
+commands to find a fresh zipball in folder `build` (tested on linux only,
+requires [`node 10.0+`][node] to be installed, might work on other
+configurations).
+
+~~~sh
+> npm install
+> npm run build
+~~~
+
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2020 Lars Jung (https://larsjung.de)
+
+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.
+
+
+## References
+
+**h5ai** profits from other projects, all of them licensed under the MIT license
+too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0).
+
+
+[web]: https://larsjung.de/h5ai/
+[github]: https://github.com/lrsjng/h5ai
+[github-issues]: https://github.com/lrsjng/h5ai/issues
+[release]: https://release.larsjung.de/h5ai/
+[develop]: https://release.larsjung.de/h5ai/develop/
+[node]: https://nodejs.org
+[material-design-icons]: https://github.com/google/material-design-icons
+
+[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
+[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square
+[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square
diff --git a/apps/hasty-paste/README.md b/apps/hasty-paste/README.md
index b6ab9403c..2fbfaf98e 100644
--- a/apps/hasty-paste/README.md
+++ b/apps/hasty-paste/README.md
@@ -1,63 +1,72 @@
# Hasty Paste
-
-
-
-
-
-A fast and minimal paste bin.
+    
-## Looking For Maintainers
-I don't find myself using this app much and not having infinite time; would like some assistance on maintaining this project. Since this project is mostly fully feature complete, I am looking for someone who can perform small maintenance.
+一个快速且简洁的粘贴板。
-You can contact at the links shown [here](https://github.com/enchant97#-how-to-reach-me) (or raise an issue), if you are interested.
+## 寻找维护者
-> This project is **not** being abandoned. Any security or major fixes will still be done, if needed.
+我发现自己不太使用这个应用,也没有无限的时间;希望有人能帮助维护这个项目。由于这个项目功能基本完善,我正在寻找能够进行小规模维护的人。
-## Features
-- Quickly paste and save, to share some text
-- Publicly accessible, no auth needed
-- Randomly generated id's, optional "long" id to reduce brute force attacks
-- Add expiring pastes
-- Dark theme
-- Optional syntax highlighting
-- No JavaScript needed
-- Uses minimal resources
-- REST API
-- Pick your file system
- - Custom flat-file system
- - :construction: S3 objects
-- Caching (Internal & Redis)
-- Lightweight Docker image (uses Alpine Linux)
+您可以通过以下链接[这里](https://github.com/enchant97#-how-to-reach-me) (或提出问题)联系我们,如果您感兴趣。
+
+> 本项目**不会**被放弃。如果需要,任何安全或重大修复仍将完成。
+
+## 功能
+
+* 快速粘贴并保存,以分享一些文本
+* 公开访问,无需身份验证
+* 随机生成的 ID,可选“长”ID 以减少暴力攻击
+* 添加过期粘贴
+* 暗色主题
+* 可选语法高亮
+* 无需 JavaScript
+* 资源占用最少
+* REST API
+* 选择您的文件系统
+ * 自定义平面文件系统
+ * :construction: S3 对象
+* 缓存(内部和 Redis)
+* 轻量级 Docker 镜像(使用 Alpine Linux)
+
+## 展示
-## Showcase
[](docs/assets/showcase.png)
## Docs
-Docs are located in the [/docs](docs/index.md) directory. Or on the site: [enchantedcode.co.uk/hasty-paste](https://enchantedcode.co.uk/hasty-paste)
-## Hastily Paste It CLI
-This is a simple script allowing the creation of pastes from the command-line. You can download your version [here](hastily-paste-it/README.md).
+文档位于 [/docs](docs/index.md) 目录中。或者可以在网站上找到:[enchantedcode.co.uk/hasty-paste](https://enchantedcode.co.uk/hasty-paste)
-## Branches
-| Name | Description | State |
-| :----------- | :--------------------- | :------------ |
-| main | Work ready for release | Stable |
-| next | Work for next version | Very Unstable |
-| historical-X | Historical versions | Unsupported |
+## Hasty Paste CLI
-> Choose a tag/release for most stable if running project
+这是一个简单的脚本,允许从命令行创建粘贴。您可以在此 [处](hastily-paste-it/README.md) 下载您的版本。
-## Why Is It Called "Hasty Paste"?
-The name was chosen not because the project is written badly, but because you use it so fast without a care in the world and "Fast Paste" was already taken!
+## 分支
-## License
-This project is Copyright (c) 2023 Leo Spratt, licences shown below:
+| 名称 | 描述 | 状态 |
+| --- | --- | --- |
+| 主分支 | 准备发布的作品 | 稳定 |
+| 下一个 | 为下一个版本工作 | 非常不稳定 |
+| 历史版本 | 历史版本 | 不支持 |
-Code
+> 如果正在运行项目,请选择最稳定的标签/版本
- AGPL-3 or any later version. Full license found in `LICENSE.txt`
+## 为什么叫“Hasty Paste”?
-Documentation
+这个名字的选择并不是因为项目写得不好,而是因为你使用它时如此迅速,毫不在意,而且“Fast Paste”这个名字已经被占用了!
- FDLv1.3 or any later version. Full license found in `docs/LICENSE.txt`
+## 许可证
+
+本项目版权所有(c)2023 年 Leo Spratt,以下显示许可证:
+
+代码
+
+```
+AGPL-3 or any later version. Full license found in `LICENSE.txt`
+```
+
+文档
+
+```
+FDLv1.3 or any later version. Full license found in `docs/LICENSE.txt`
+```
\ No newline at end of file
diff --git a/apps/hasty-paste/README_en.md b/apps/hasty-paste/README_en.md
new file mode 100644
index 000000000..b6ab9403c
--- /dev/null
+++ b/apps/hasty-paste/README_en.md
@@ -0,0 +1,63 @@
+# Hasty Paste
+
+
+
+
+
+
+A fast and minimal paste bin.
+
+## Looking For Maintainers
+I don't find myself using this app much and not having infinite time; would like some assistance on maintaining this project. Since this project is mostly fully feature complete, I am looking for someone who can perform small maintenance.
+
+You can contact at the links shown [here](https://github.com/enchant97#-how-to-reach-me) (or raise an issue), if you are interested.
+
+> This project is **not** being abandoned. Any security or major fixes will still be done, if needed.
+
+## Features
+- Quickly paste and save, to share some text
+- Publicly accessible, no auth needed
+- Randomly generated id's, optional "long" id to reduce brute force attacks
+- Add expiring pastes
+- Dark theme
+- Optional syntax highlighting
+- No JavaScript needed
+- Uses minimal resources
+- REST API
+- Pick your file system
+ - Custom flat-file system
+ - :construction: S3 objects
+- Caching (Internal & Redis)
+- Lightweight Docker image (uses Alpine Linux)
+
+## Showcase
+[](docs/assets/showcase.png)
+
+## Docs
+Docs are located in the [/docs](docs/index.md) directory. Or on the site: [enchantedcode.co.uk/hasty-paste](https://enchantedcode.co.uk/hasty-paste)
+
+## Hastily Paste It CLI
+This is a simple script allowing the creation of pastes from the command-line. You can download your version [here](hastily-paste-it/README.md).
+
+## Branches
+| Name | Description | State |
+| :----------- | :--------------------- | :------------ |
+| main | Work ready for release | Stable |
+| next | Work for next version | Very Unstable |
+| historical-X | Historical versions | Unsupported |
+
+> Choose a tag/release for most stable if running project
+
+## Why Is It Called "Hasty Paste"?
+The name was chosen not because the project is written badly, but because you use it so fast without a care in the world and "Fast Paste" was already taken!
+
+## License
+This project is Copyright (c) 2023 Leo Spratt, licences shown below:
+
+Code
+
+ AGPL-3 or any later version. Full license found in `LICENSE.txt`
+
+Documentation
+
+ FDLv1.3 or any later version. Full license found in `docs/LICENSE.txt`
diff --git a/apps/headscale-derp/1.84.2/.env.sample b/apps/headscale-derp/1.84.2/.env.sample
new file mode 100644
index 000000000..8fa5a1dbb
--- /dev/null
+++ b/apps/headscale-derp/1.84.2/.env.sample
@@ -0,0 +1,6 @@
+CONTAINER_NAME="headscale-derp"
+PANEL_APP_PORT_HTTPS="40184"
+PANEL_APP_PORT_STUN="3478"
+DATA_PATH="./data"
+DERP_DOMAIN="derper.your-domain.com"
+CLIENTS_VERIFY_SWITCH="false"
diff --git a/apps/headscale-derp/1.84.2/data.yml b/apps/headscale-derp/1.84.2/data.yml
new file mode 100644
index 000000000..549bd07b9
--- /dev/null
+++ b/apps/headscale-derp/1.84.2/data.yml
@@ -0,0 +1,39 @@
+additionalProperties:
+ formFields:
+ - default: 40184
+ edit: true
+ envKey: PANEL_APP_PORT_HTTPS
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: 3478
+ edit: true
+ envKey: PANEL_APP_PORT_STUN
+ labelEn: STUN Service Port
+ labelZh: STUN 服务端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: ./data
+ edit: true
+ envKey: DATA_PATH
+ labelEn: Data folder path (Domain certificate needs to be replaced, certificate file name is the same as the server hostname)
+ labelZh: 数据文件夹路径 (需要替换域名证书,证书文件名与服务器主机名相同)
+ required: true
+ type: text
+ - default: 'derper.your-domain.com'
+ edit: true
+ envKey: DERP_DOMAIN
+ labelEn: Derper server hostname
+ labelZh: Derper服务器主机名
+ required: true
+ type: text
+ - default: "false"
+ edit: true
+ envKey: CLIENTS_VERIFY_SWITCH
+ labelEn: "Client verify (On: true, Off: false)"
+ labelZh: 客户端验证(开启:true,关闭:false)
+ required: true
+ type: text
diff --git a/apps/headscale-derp/1.84.2/data/derper.your-domain.com.crt b/apps/headscale-derp/1.84.2/data/derper.your-domain.com.crt
new file mode 100644
index 000000000..1e9988a5a
--- /dev/null
+++ b/apps/headscale-derp/1.84.2/data/derper.your-domain.com.crt
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIICTzCCAfWgAwIBAgIUVimWHYcwGCEzjo2PIWRX+pk5xk4wCgYIKoZIzj0EAwIw
+czELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAcMC0xv
+cyBBbmdlbGVzMRgwFgYDVQQKDA9NeSBPcmdhbml6YXRpb24xHzAdBgNVBAMMFmRl
+cnBlci55b3VyLWRvbWFpbi5jb20wIBcNMjMxMjEzMTMzMTM1WhgPMjEyMzExMTkx
+MzMxMzVaMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYD
+VQQHDAtMb3MgQW5nZWxlczEYMBYGA1UECgwPTXkgT3JnYW5pemF0aW9uMR8wHQYD
+VQQDDBZkZXJwZXIueW91ci1kb21haW4uY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEuQsY4F6ixzijQoNJ5qhRwiXIQVRi8/4+ARi9y2XDqno+mRTe6kcqbWza
+o1Qvnb+bDQX3TlI0znR07/TBbnKm3KNlMGMwIQYDVR0RBBowGIIWZGVycGVyLnlv
+dXItZG9tYWluLmNvbTAdBgNVHQ4EFgQU42YYF2rWI639HjHPYr4T4XNDs5gwHwYD
+VR0jBBgwFoAUM05GUd0314M3wxC0/hXTJDS/RiswCgYIKoZIzj0EAwIDSAAwRQIg
+IeK6zsPY9KH9LooAzG5IMjTFfhL66I/LpMxwhD4ZoHkCIQDV4aWOeE/1SH9OJeUQ
+J9KKE11IOW5ieMP/UGLq5g7I8A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPTCCAeOgAwIBAgIUM8dtduktU0oMp6IbjUdN0NYfth4wCgYIKoZIzj0EAwIw
+czELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAcMC0xv
+cyBBbmdlbGVzMRgwFgYDVQQKDA9NeSBPcmdhbml6YXRpb24xHzAdBgNVBAMMFmRl
+cnBlci55b3VyLWRvbWFpbi5jb20wIBcNMjMxMjEzMTMzMTM0WhgPMjEyMzExMTkx
+MzMxMzRaMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYD
+VQQHDAtMb3MgQW5nZWxlczEYMBYGA1UECgwPTXkgT3JnYW5pemF0aW9uMR8wHQYD
+VQQDDBZkZXJwZXIueW91ci1kb21haW4uY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEYg7HUFZFXMrnG44AFGKASd5UX5Oo70k09G1+OSkCLcyqQPQyHnlLUnEg
+01kpVOxAM7hEl0WaDdiT6PuyJHO1xKNTMFEwHQYDVR0OBBYEFDNORlHdN9eDN8MQ
+tP4V0yQ0v0YrMB8GA1UdIwQYMBaAFDNORlHdN9eDN8MQtP4V0yQ0v0YrMA8GA1Ud
+EwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAJwSWKP0yDpBe8RAfwwm49Ym
+clETnK7i3vnFG/OE3Z6UAiBgT8UBSt5surHTtMQIYfezWBTx2pxYSKJxaUStFyDi
+tw==
+-----END CERTIFICATE-----
diff --git a/apps/headscale-derp/1.84.2/data/derper.your-domain.com.key b/apps/headscale-derp/1.84.2/data/derper.your-domain.com.key
new file mode 100644
index 000000000..a2e748a8b
--- /dev/null
+++ b/apps/headscale-derp/1.84.2/data/derper.your-domain.com.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFMO2b7macGU9gXYD
+NNVXS+NaDgVBT7chDLvRckGHNUmhRANCAAS5CxjgXqLHOKNCg0nmqFHCJchBVGLz
+/j4BGL3LZcOqej6ZFN7qRyptbNqjVC+dv5sNBfdOUjTOdHTv9MFucqbc
+-----END PRIVATE KEY-----
diff --git a/apps/headscale-derp/1.84.2/docker-compose.yml b/apps/headscale-derp/1.84.2/docker-compose.yml
new file mode 100644
index 000000000..ca4ab4226
--- /dev/null
+++ b/apps/headscale-derp/1.84.2/docker-compose.yml
@@ -0,0 +1,27 @@
+services:
+ headscale-derp:
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTPS}:${PANEL_APP_PORT_HTTPS}"
+ - "${PANEL_APP_PORT_STUN}:${PANEL_APP_PORT_STUN}/udp"
+ volumes:
+ - "${DATA_PATH}:/app/certs"
+ environment:
+ - DERP_DOMAIN=${DERP_DOMAIN}
+ - DERP_CERT_MODE=manual
+ - DERP_ADDR=:${PANEL_APP_PORT_HTTPS}
+ - DERP_HTTP_PORT=-1
+ - DERP_STUN=true
+ - DERP_STUN_PORT=${PANEL_APP_PORT_STUN}
+ - DERP_CERT_DIR=/app/certs
+ - DERP_VERIFY_CLIENTS=${CLIENTS_VERIFY_SWITCH}
+ image: fredliang/derper:v1.84.2
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/headscale-derp/README.md b/apps/headscale-derp/README.md
index b29afd2ba..0b386732d 100644
--- a/apps/headscale-derp/README.md
+++ b/apps/headscale-derp/README.md
@@ -1,28 +1,26 @@
# Derper
-[](https://hub.docker.com/r/fredliang/derper)
-[](https://hub.docker.com/r/fredliang/derper)
-[](https://hub.docker.com/r/fredliang/derper/tags)
+[](https://hub.docker.com/r/fredliang/derper) [](https://hub.docker.com/r/fredliang/derper) [](https://hub.docker.com/r/fredliang/derper/tags)
-# Setup
+# 设置
-> required: set env `DERP_DOMAIN` to your domain
+> required: 设置环境变量 `DERP_DOMAIN` 为您的域名
```bash
docker run -e DERP_DOMAIN=derper.your-domain.com -p 80:80 -p 443:443 -p 3478:3478/udp fredliang/derper
```
-| env | required | description | default value |
-| ------------------- | -------- | ---------------------------------------------------------------------- | ----------------- |
-| DERP_DOMAIN | true | derper server hostname | your-hostname.com |
-| DERP_CERT_DIR | false | directory to store LetsEncrypt certs(if addr's port is :443) | /app/certs |
-| DERP_CERT_MODE | false | mode for getting a cert. possible options: manual, letsencrypt | letsencrypt |
-| DERP_ADDR | false | listening server address | :443 |
-| DERP_STUN | false | also run a STUN server | true |
-| DERP_STUN_PORT | false | The UDP port on which to serve STUN. | 3478 |
-| DERP_HTTP_PORT | false | The port on which to serve HTTP. Set to -1 to disable | 80 |
-| DERP_VERIFY_CLIENTS | false | verify clients to this DERP server through a local tailscaled instance | false |
+| env | required | 描述 | 默认值 |
+| --- | --- | --- | --- |
+| DERP\_DOMAIN | true | derper 服务器主机名 | your-hostname.com |
+| DERP\_CERT\_DIR | false | 存储 Let's Encrypt 证书的目录(如果地址的端口是:443) | /app/certs |
+| DERP\_CERT\_MODE | false | 获取证书的模式。可能的选项:手动、Let's Encrypt | Let's Encrypt |
+| DERP\_ADDR | false | 监听服务器地址 | :443 |
+| DERP\_STUN | false | 同时运行一个 STUN 服务器 | true |
+| DERP\_STUN\_PORT | false | 用于提供 STUN 服务的 UDP 端口。 | 3478 |
+| DERP\_HTTP\_PORT | false | HTTP 服务的端口。设置为-1 以禁用 | 80 |
+| DERP\_VERIFY\_CLIENTS | false | 通过本地 tailscaled 实例验证此 DERP 服务器上的客户端 | false |
-# Usage
+# 使用方法
-Fully DERP setup offical documentation: https://tailscale.com/kb/1118/custom-derp-servers/
\ No newline at end of file
+完全 DERP 设置官方文档:[https://tailscale.com/kb/1118/custom-derp-servers/](https://tailscale.com/kb/1118/custom-derp-servers/)
\ No newline at end of file
diff --git a/apps/headscale-derp/README_en.md b/apps/headscale-derp/README_en.md
new file mode 100644
index 000000000..b29afd2ba
--- /dev/null
+++ b/apps/headscale-derp/README_en.md
@@ -0,0 +1,28 @@
+# Derper
+
+[](https://hub.docker.com/r/fredliang/derper)
+[](https://hub.docker.com/r/fredliang/derper)
+[](https://hub.docker.com/r/fredliang/derper/tags)
+
+# Setup
+
+> required: set env `DERP_DOMAIN` to your domain
+
+```bash
+docker run -e DERP_DOMAIN=derper.your-domain.com -p 80:80 -p 443:443 -p 3478:3478/udp fredliang/derper
+```
+
+| env | required | description | default value |
+| ------------------- | -------- | ---------------------------------------------------------------------- | ----------------- |
+| DERP_DOMAIN | true | derper server hostname | your-hostname.com |
+| DERP_CERT_DIR | false | directory to store LetsEncrypt certs(if addr's port is :443) | /app/certs |
+| DERP_CERT_MODE | false | mode for getting a cert. possible options: manual, letsencrypt | letsencrypt |
+| DERP_ADDR | false | listening server address | :443 |
+| DERP_STUN | false | also run a STUN server | true |
+| DERP_STUN_PORT | false | The UDP port on which to serve STUN. | 3478 |
+| DERP_HTTP_PORT | false | The port on which to serve HTTP. Set to -1 to disable | 80 |
+| DERP_VERIFY_CLIENTS | false | verify clients to this DERP server through a local tailscaled instance | false |
+
+# Usage
+
+Fully DERP setup offical documentation: https://tailscale.com/kb/1118/custom-derp-servers/
\ No newline at end of file
diff --git a/apps/headscale-ui/2025.05.22/.env.sample b/apps/headscale-ui/2025.05.22/.env.sample
new file mode 100644
index 000000000..6c018e30a
--- /dev/null
+++ b/apps/headscale-ui/2025.05.22/.env.sample
@@ -0,0 +1,2 @@
+CONTAINER_NAME="headscale-ui"
+PANEL_APP_PORT_HTTPS="40182"
diff --git a/apps/headscale-ui/2025.05.22/data.yml b/apps/headscale-ui/2025.05.22/data.yml
new file mode 100644
index 000000000..65dd56f48
--- /dev/null
+++ b/apps/headscale-ui/2025.05.22/data.yml
@@ -0,0 +1,10 @@
+additionalProperties:
+ formFields:
+ - default: 40182
+ edit: true
+ envKey: PANEL_APP_PORT_HTTPS
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
diff --git a/apps/headscale-ui/2025.05.22/docker-compose.yml b/apps/headscale-ui/2025.05.22/docker-compose.yml
new file mode 100644
index 000000000..c9f4fb3ea
--- /dev/null
+++ b/apps/headscale-ui/2025.05.22/docker-compose.yml
@@ -0,0 +1,15 @@
+services:
+ headscale-ui:
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTPS}:443"
+ image: ghcr.io/gurucomputing/headscale-ui:latest
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/headscale-ui/README.md b/apps/headscale-ui/README.md
index 25cfcb7f9..8b4285a53 100644
--- a/apps/headscale-ui/README.md
+++ b/apps/headscale-ui/README.md
@@ -3,15 +3,20 @@
**Headscale 服务器地址,只能用经过域名反向代理的地址。**
# 原始相关
-***
+
+* * *
+
# Headscale-UI
-A web frontend for the [headscale](https://github.com/juanfont/headscale) Tailscale-compatible coordination server.
-## Installation
-Headscale-UI is currently released as a static site: just take the release and host with your favorite web server. Headscale-UI expects to be served from the `/web` path to avoid overlap with headscale on the same domain. Note that due to CORS (see https://github.com/juanfont/headscale/issues/623), headscale UI *must* be served on the same subdomain, or CORS headers injected via reverse proxy.
+一个适用于 [headscale](https://github.com/juanfont/headscale) Tailscale 兼容协调服务器的网页前端。
-### Docker Installation
-If you are using docker, you can install `headscale` alongside `headscale-ui`, like so:
+## 安装
+
+Headscale-UI 目前以静态站点的形式发布:只需获取发布版本,并用您喜欢的网页服务器进行托管。Headscale-UI 预期将从 `/web` 路径提供服务,以避免与同一域名上的 headscale 发生冲突。请注意,由于 CORS(见 [https://github.com/juanfont/headscale/issues/623](https://github.com/juanfont/headscale/issues/623)),headscale UI *必须* 在同一子域名上提供服务,或者通过反向代理注入 CORS 标头。
+
+### Docker 安装
+
+如果您使用 docker,可以像这样安装 `headscale` 和 `headscale-ui`:
```yaml
version: '3.5'
@@ -34,17 +39,21 @@ services:
# - 9443:443
```
-Headscale UI serves on port 443 and uses a self signed cert by default. You will need to add a `config.yaml` file under your `container-config` folder so that `headscale` has all of the required settings declared. An example from the official `headscale` repo is [here](https://github.com/juanfont/headscale/blob/main/config-example.yaml).
+Headscale UI 在 443 端口上运行,默认使用自签名的证书。您需要在 `container-config` 文件夹下添加一个 `config.yaml` 文件,以便 `headscale` 声明所有必需的设置。官方 `headscale` 仓库的一个示例[在这里](https://github.com/juanfont/headscale/blob/main/config-example.yaml) 。
-### Additional Docker Settings
-The docker container lets you set the following settings:
-| Variable | Description | Example |
-|----|----|----|
-| HTTP_PORT | Sets the HTTP port to an alternate value | `80` |
-| HTTPS_PORT | Sets the HTTPS port to an alternate value | `443` |
+### 额外的 Docker 设置
+
+Docker 容器允许您设置以下设置:
+
+| 变量 | 描述 | 示例 |
+| --- | --- | --- |
+| HTTP\_PORT | 设置 HTTP 端口号为其他值 | 80 |
+| HTTPS\_PORT | 设置 HTTPS 端口号为其他值 | 443 |
+
+### 代理设置
+
+您需要在您的域名上安装 `headscale-ui` 时需要一个反向代理。以下是一个实现此功能的示例 [Caddy 配置](https://caddyserver.com/) :
-### Proxy Settings
-You will need a reverse proxy to install `headscale-ui` on your domain. Here is an example [Caddy Config](https://caddyserver.com/) to achieve this:
```
https://hs.yourdomain.com.au {
reverse_proxy /web* https://headscale-ui {
@@ -59,8 +68,10 @@ https://hs.yourdomain.com.au {
```
-### Cross Domain Installation
-If you do not want to configure headscale-ui on the same subdomain as headscale, you must intercept headscale traffic via your reverse proxy to fix CORS (see https://github.com/juanfont/headscale/issues/623). Here is an example fix with Caddy, replacing your headscale UI domain with `hs-ui.yourdomain.com.au`:
+### 跨域安装
+
+如果您不想在与 headscale 相同的子域名上配置 headscale-ui,您必须通过反向代理拦截 headscale 流量以修复 CORS(见 [https://github.com/juanfont/headscale/issues/623](https://github.com/juanfont/headscale/issues/623))。以下是一个使用 Caddy 的示例修复,将您的 headscale UI 域名替换为 `hs-ui.yourdomain.com.au`:
+
```
https://hs.yourdomain.com.au {
@hs-options {
@@ -89,40 +100,49 @@ https://hs.yourdomain.com.au {
```
-### Other Configurations
-See [Other Configurations](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/configuration.md) for further proxy examples, such as Traefik
+### 其他配置
-## Versioning
-The following versions correspond to the appropriate headscale version
-| Headscale Version | HS-UI Version |
-|-------------------|---------------|
-| 19+ | 2023-01-30+ |
-| <19 | <2023-01-30 |
+查看[其他配置](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/configuration.md)以获取更多代理示例,例如 Traefik
-## Troubleshooting
-Make sure you are using the latest version of headscale. Headscale-UI is only tested against:
+## 版本控制
-* The current stable version of headscale
-* Chrome/Chrome Mobile
-* Firefox/Firefox Mobile
+以下版本对应适当的 Headscale 版本
-Note that while mobile is checked for functionality, the web experience is not mobile optimised.
+| Headscale 版本 | HS-UI 版本 |
+| --- | --- |
+| 19+ | 2023-01-30+ |
+| <19 | <2023-01-30 |
-If you are getting errors about preflight checks, it's probably CORS related. Make sure your UI sits on the same subdomain as headscale or inject CORS headers.
+## 故障排除
-### Errors related to "Missing Bearer Prefix"
-Your API key is either not saved or you haven't configured your reverse proxy. Create an API key in `headscale` (via command line) with `headscale apikeys create` or `docker exec headscale apikeys create` and save it in `settings`.
+请确保您正在使用最新的 headscale 版本。Headscale-UI 仅针对以下版本进行测试:
-HS-UI *has* to be ran on the same subdomain as headscale or you need to configure CORS. Yes you need to use a reverse proxy to do this. Use a reverse proxy. If you are trying to use raw IPs and ports, it *will* not work.
+* 当前 headscale 的稳定版本
+* Chrome/Chrome 移动版
+* Firefox/Firefox 移动版
-## Security
-see [security](https://github.com/gurucomputing/headscale-ui/blob/master/SECURITY.md) for details
+请注意,虽然已检查移动版的功能,但网页体验并未针对移动设备进行优化。
-## Development
-see [development](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/development.md) for details
+如果您收到有关预检检查的错误,这可能是 CORS 相关的问题。请确保您的 UI 位于与 headscale 相同的子域名上,或者注入 CORS 头。
-## Style Guide
-see [style](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/style.md) for details
+### 与“缺少 Bearer 前缀”相关的错误
-## Architecture
-See [architecture](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/architecture.md) for details
\ No newline at end of file
+您的 API 密钥可能未保存,或者您尚未配置反向代理。在 `headscale`(通过命令行)中使用 `headscale apikeys create` 或 `docker exec headscale apikeys create` 创建 API 密钥,并将其保存在`设置`中。
+
+HS-UI *必须*在与 headscale 相同的子域名上运行或您需要配置 CORS。是的,您需要使用反向代理来完成此操作。使用反向代理。如果您尝试使用原始 IP 和端口,它*将不会工作* 。
+
+## 安全
+
+详情见[安全](https://github.com/gurucomputing/headscale-ui/blob/master/SECURITY.md)
+
+## 开发
+
+详情见[开发](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/development.md)
+
+## 风格指南
+
+查看[样式](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/style.md)详情
+
+## 架构
+
+查看[架构](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/architecture.md)详情
\ No newline at end of file
diff --git a/apps/headscale-ui/README_en.md b/apps/headscale-ui/README_en.md
new file mode 100644
index 000000000..25cfcb7f9
--- /dev/null
+++ b/apps/headscale-ui/README_en.md
@@ -0,0 +1,128 @@
+# 使用说明
+
+**Headscale 服务器地址,只能用经过域名反向代理的地址。**
+
+# 原始相关
+***
+# Headscale-UI
+A web frontend for the [headscale](https://github.com/juanfont/headscale) Tailscale-compatible coordination server.
+
+## Installation
+Headscale-UI is currently released as a static site: just take the release and host with your favorite web server. Headscale-UI expects to be served from the `/web` path to avoid overlap with headscale on the same domain. Note that due to CORS (see https://github.com/juanfont/headscale/issues/623), headscale UI *must* be served on the same subdomain, or CORS headers injected via reverse proxy.
+
+### Docker Installation
+If you are using docker, you can install `headscale` alongside `headscale-ui`, like so:
+
+```yaml
+version: '3.5'
+services:
+ headscale:
+ image: headscale/headscale:latest
+ container_name: headscale
+ volumes:
+ - ./container-config:/etc/headscale
+ - ./container-data/data:/var/lib/headscale
+ # ports:
+ # - 27896:8080
+ command: headscale serve
+ restart: unless-stopped
+ headscale-ui:
+ image: ghcr.io/gurucomputing/headscale-ui:latest
+ restart: unless-stopped
+ container_name: headscale-ui
+ # ports:
+ # - 9443:443
+```
+
+Headscale UI serves on port 443 and uses a self signed cert by default. You will need to add a `config.yaml` file under your `container-config` folder so that `headscale` has all of the required settings declared. An example from the official `headscale` repo is [here](https://github.com/juanfont/headscale/blob/main/config-example.yaml).
+
+### Additional Docker Settings
+The docker container lets you set the following settings:
+| Variable | Description | Example |
+|----|----|----|
+| HTTP_PORT | Sets the HTTP port to an alternate value | `80` |
+| HTTPS_PORT | Sets the HTTPS port to an alternate value | `443` |
+
+### Proxy Settings
+You will need a reverse proxy to install `headscale-ui` on your domain. Here is an example [Caddy Config](https://caddyserver.com/) to achieve this:
+```
+https://hs.yourdomain.com.au {
+ reverse_proxy /web* https://headscale-ui {
+ transport http {
+ tls_insecure_skip_verify
+ }
+ }
+
+ reverse_proxy * http://headscale:8080
+}
+
+
+```
+
+### Cross Domain Installation
+If you do not want to configure headscale-ui on the same subdomain as headscale, you must intercept headscale traffic via your reverse proxy to fix CORS (see https://github.com/juanfont/headscale/issues/623). Here is an example fix with Caddy, replacing your headscale UI domain with `hs-ui.yourdomain.com.au`:
+```
+https://hs.yourdomain.com.au {
+ @hs-options {
+ host hs.yourdomain.com.au
+ method OPTIONS
+ }
+ @hs-other {
+ host hs.yourdomain.com.au
+ }
+ handle @hs-options {
+ header {
+ Access-Control-Allow-Origin https://hs-ui.yourdomain.au
+ Access-Control-Allow-Headers *
+ Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE"
+ }
+ respond 204
+ }
+ handle @hs-other {
+ reverse_proxy http://headscale:8080 {
+ header_down Access-Control-Allow-Origin https://hs-ui.yourdomain.com.au
+ header_down Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE"
+ header_down Access-Control-Allow-Headers *
+ }
+ }
+}
+
+```
+
+### Other Configurations
+See [Other Configurations](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/configuration.md) for further proxy examples, such as Traefik
+
+## Versioning
+The following versions correspond to the appropriate headscale version
+| Headscale Version | HS-UI Version |
+|-------------------|---------------|
+| 19+ | 2023-01-30+ |
+| <19 | <2023-01-30 |
+
+## Troubleshooting
+Make sure you are using the latest version of headscale. Headscale-UI is only tested against:
+
+* The current stable version of headscale
+* Chrome/Chrome Mobile
+* Firefox/Firefox Mobile
+
+Note that while mobile is checked for functionality, the web experience is not mobile optimised.
+
+If you are getting errors about preflight checks, it's probably CORS related. Make sure your UI sits on the same subdomain as headscale or inject CORS headers.
+
+### Errors related to "Missing Bearer Prefix"
+Your API key is either not saved or you haven't configured your reverse proxy. Create an API key in `headscale` (via command line) with `headscale apikeys create` or `docker exec headscale apikeys create` and save it in `settings`.
+
+HS-UI *has* to be ran on the same subdomain as headscale or you need to configure CORS. Yes you need to use a reverse proxy to do this. Use a reverse proxy. If you are trying to use raw IPs and ports, it *will* not work.
+
+## Security
+see [security](https://github.com/gurucomputing/headscale-ui/blob/master/SECURITY.md) for details
+
+## Development
+see [development](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/development.md) for details
+
+## Style Guide
+see [style](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/style.md) for details
+
+## Architecture
+See [architecture](https://github.com/gurucomputing/headscale-ui/blob/master/documentation/architecture.md) for details
\ No newline at end of file
diff --git a/apps/headscale-webui/README.md b/apps/headscale-webui/README.md
index 319e4a640..64bc7c6eb 100644
--- a/apps/headscale-webui/README.md
+++ b/apps/headscale-webui/README.md
@@ -2,81 +2,79 @@
## 数据文件夹授权
-- 1、**必要操作:** 首次安装完成后,进入已安装应用界面,点击跳转数据目录,修改目录下的`data`文件夹为`1000`用户和用户组。
+* 1、**必要操作:** 首次安装完成后,进入已安装应用界面,点击跳转数据目录,修改目录下的`data`文件夹为`1000`用户和用户组。
命令行修改则类似如下,路径按需修改:
+
```
chown -R 1000:1000 /opt/1panel/apps/local/headscale-webui/headscale-webui/data
```
-- 2、回到已安装应用界面,重建应用。
-
+* 2、回到已安装应用界面,重建应用。
# 原始相关
-***
-
+
+---
+# Features
+1. Enable/Disable routes and exit nodes
+ * Manage failover routes as well
+2. Add, move, rename, and remove machines
+3. Add and remove users/namespaces
+4. Add and expire PreAuth keys
+5. Add and remove machine tags
+6. View machine details
+ * Hostname
+ * User associated with the machine
+ * IP addresses in the Tailnet
+ * Last seen by the control server
+ * Last update with the control server
+ * Creation date
+ * Expiration date (will also display a badge when nearing expiration)
+ * PreAuth key associated with the machine
+ * Enable / disable routes and exit nodes
+ * Add and delete machine tags
+7. Basic and OIDC Authentication
+ * OIDC Authentication tested with Authelia and Keycloak
+8. Change your color theme! See MaterializeCSS Documentation for Colors for examples.
+9. Search your machines and users.
+ * Machines have tags you can use to filter search:
+ * `tag:tagname` Searches only for specific tags
+ * `machine:machine-name` Searches only for specific machines
+ * `user:user-name` Searches only for specific users
+
+
+---
+# Installation
+* See [SETUP.md](SETUP.md) for installation and configuration instructions.
+
+---
+# Screenshots:
+
+
+
+
+
+
+---
+# Tech used:
+* Python - [Link](https://www.python.org/)
+* Poetry - [Link](https://python-poetry.org/)
+* MaterializeCSS - [Link](https://github.com/Dogfalo/materialize)
+* jQuery - [Link](https://jquery.com/)
+
+For Python libraries, see [pyproject.toml](https://github.com/iFargle/headscale-webui/blob/main/pyproject.toml)
+
+If you use this project, please reach out! It keeps me motivated! Thank you!
\ No newline at end of file
diff --git a/apps/heimdall/README.md b/apps/heimdall/README.md
index e94a8a7e8..eecd55349 100644
--- a/apps/heimdall/README.md
+++ b/apps/heimdall/README.md
@@ -1,44 +1,46 @@
-# Heimdall
+# 海姆达尔
[](https://heimdall.site)
-[](https://discord.gg/CCjHKn4)
-[](https://hub.docker.com/r/linuxserver/heimdall/)
-[](https://www.firsttimersonly.com/)
-[](https://www.paypal.me/heimdall)
+[](https://discord.gg/CCjHKn4) [](https://hub.docker.com/r/linuxserver/heimdall/) [](https://www.firsttimersonly.com/) [](https://www.paypal.me/heimdall)
-___
+* * *
-Visit the website - https://heimdall.site
-___
+访问网站 - [https://heimdall.site](https://heimdall.site)
-## About
-As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like.
+* * *
-Heimdall is an elegant solution to organise all your web applications. It’s dedicated to this purpose so you won’t lose your links in a sea of bookmarks.
+## 关于
-Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo.
+正如其名,海姆达尔应用仪表板是您所有网络应用的仪表板。不过,它并不仅限于应用,您还可以添加您喜欢的任何链接。
+
+海姆达尔是一个优雅的解决方案,用于组织您所有的网络应用程序。它专注于这个目的,所以您不会在书签的海洋中丢失链接。
+
+为什么不将其用作您的浏览器起始页呢?它甚至能够包含使用谷歌、必应或 DuckDuckGo 的搜索栏。

-## Video
-If you want to see a quick video of it in use, go to https://youtu.be/GXnnMAxPzMc
+## 视频
-## Supported applications
-You can use the app to link to any site or application, but Foundation apps will auto fill in the icon for the app and supply a default color for the tile. In addition Enhanced apps allow you provide details to an apps API, allowing you to view live stats directly on the dashboad. For example, the NZBGet and Sabnzbd Enhanced apps will display the queue size and download speed while something is downloading.
+如果您想快速查看其使用视频,请访问 [https://youtu.be/GXnnMAxPzMc](https://youtu.be/GXnnMAxPzMc)
-Supported applications are recognized by the title of the application as entered in the title field when adding an application. For example, to add a link to pfSense, begin by typing "p" in the title field and then select "pfSense" from the list of supported applications.
+## 支持的应用程序
+
+您可以使用该应用链接到任何网站或应用程序,但基础应用程序将自动填充应用程序的图标并为磁贴提供默认颜色。此外,增强型应用程序允许您向应用程序的 API 提供详细信息,让您可以直接在仪表板上查看实时统计数据。例如,NZBGet 和 Sabnzbd 增强型应用程序将在下载时显示队列大小和下载速度。
+
+支持的应用程序通过在添加应用程序时在标题字段中输入的应用程序标题来识别。例如,要添加 pfSense 的链接,请在标题字段中输入“p”,然后从支持的应用程序列表中选择“pfSense”。
[](https://apps.heimdall.site/applications/enhanced)
[](https://apps.heimdall.site/applications/foundation)
-## Installing
-Apart from the Laravel 8 dependencies, namely PHP >= 7.4.32, BCMath PHP Extension, INTL PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
+## 安装
-If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
+除了 Laravel 8 的依赖项,即 PHP >= 7.4.32、BCMath PHP 扩展、INTL PHP 扩展、Ctype PHP 扩展、Fileinfo PHP 扩展、JSON PHP 扩展、Mbstring PHP 扩展、OpenSSL PHP 扩展、PDO PHP 扩展、Tokenizer PHP 扩展、XML PHP 扩展之外,Heimdall 还需要 sqlite 支持和 zip 支持(php-zip)。
-Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
+如果你发现无法更改背景,请确保在 php.ini 中启用了 `php_fileinfo`。我相信它应该是默认启用的,但一位用户在 Windows 系统上遇到了这个问题。
+
+安装非常简单,只需将仓库克隆到某个位置,或者下载并解压 zip/tar 文件,然后将 httpd 文档根目录指向 `/public` 文件夹,然后创建.env 文件并生成加密密钥(所有这些操作都由 docker 为你处理)。
```
cd /path/to/heimdall
@@ -46,83 +48,91 @@ cp .env.example .env
php artisan key:generate
```
-For simple testing you could just go to the folder and type `php artisan serve`
+对于简单测试,你只需进入文件夹,输入 `php artisan serve`
-There is also a multi-arch Docker which supports x86-64, armhf and arm64, instructions on how to use them at
+也存在支持 x86-64、armhf 和 arm64 的多架构 Docker,如何在
-- https://hub.docker.com/r/linuxserver/heimdall/
+* [https://hub.docker.com/r/linuxserver/heimdall/](https://hub.docker.com/r/linuxserver/heimdall/)
-## Updating
-To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
+## 更新
-## Search Providers
-v2.3.0 added the ability for users to customise the search options.
+要更新您的实例,只需克隆此仓库或下载包含新版本的 zip/tar 文件,并将其复制到旧安装上。
-Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
+## 搜索提供商
-Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
+v2.3.0 版本增加了用户自定义搜索选项的功能。
-The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
+选项存储在 `/storage/app/searchproviders.yaml` (在 Docker 安装中为 `/config/www/searchproviders.yaml` ),您可以随意调整选项顺序,添加新的选项,删除不使用的选项等。
-## New background image not being set
-If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
+请考虑向 [https://github.com/linuxserver/Heimdall/discussions/categories/search-providers](https://github.com/linuxserver/Heimdall/discussions/categories/search-providers) 做出贡献,以帮助他人添加新的选项。
-If you are using the linuxserver.io docker image simply edit `/path/to/config/php/php-local.ini` and add `upload_max_filesize = 30M` to the end.
+列表顶部的项目`瓷砖`允许您通过名称在仪表板上搜索应用程序,当您有很多图标时非常有用。
-## Docker and enhanced apps
-If you are running the docker and the EnhancedApps you are using are also in dockers, you may need to use the docker networking addresses to communicate with them.
+## 新背景图片未设置
-You can do this by using `http(s)://docker_name:port` in the config section. Instead of the name you can use the internal docker ip, this usually starts with `172.`
+如果您正在使用 docker 镜像或默认的 php 安装,您可能会发现超过 2MB 的图片无法设置为背景图片,您只需更改 php.ini 中的 `upload_max_filesize`。
-## Languages
-The app has been translated into several languages; however, the quality of the translations could do with work. If you would like to improve them, or help with other translations, they are stored in `/resources/lang/`.
+如果您正在使用 linuxserver.io docker 镜像,只需编辑 `/path/to/config/php/php-local.ini` ,并在末尾添加 `upload_max_filesize = 30M`。
-To create a new language translation, make a new folder with the ISO 3166-1 alpha-2 code as the name, copy `app.php` from `/resources/lang/en/app.php` into your new folder and replace the English strings.
+## Docker 和增强应用
-When you are finished, create a pull request.
+如果您正在运行 docker,并且您使用的 EnhancedApps 也位于 docker 中,您可能需要使用 docker 网络地址来与它们通信。
-Currently added languages are
+您可以通过在配置部分使用 `http(s)://docker_name:port` 来实现这一点。代替名称,您可以使用内部 Docker IP,这通常以 `172.` 开头。
-- Breton
-- Chinese
-- Danish
-- Dutch
-- English
-- Finnish
-- French
-- German
-- Greek
-- Hungarian
-- Italian
-- Japanese
-- Korean
-- Lombard
-- Norwegian
-- Polish
-- Portuguese
-- Russian
-- Slovenian
-- Spanish
-- Swedish
-- Turkish
+## 语言
-## Web Server Configuration
+该应用已翻译成多种语言;然而,翻译质量有待提高。如果您想改进它们或帮助进行其他翻译,它们存储在 `/resources/lang/`。
+
+要创建一种新的语言翻译,创建一个以 ISO 3166-1 alpha-2 代码命名的文件夹,将 `app.php` 从 `/resources/lang/en/app.php` 复制到您的文件夹中,并替换英文字符串。
+
+完成之后,创建一个 pull request。
+
+目前添加的语言有
+
+* 布列塔尼语
+* 中文
+* 丹麦语
+* 荷兰语
+* 英语
+* 芬兰语
+* 法语
+* 德语
+* 希腊语
+* 匈牙利语
+* 意大利语
+* 日语
+* 韩语
+* 伦巴第
+* 挪威语
+* 波兰语
+* 葡萄牙语
+* 俄语
+* 斯洛文尼亚语
+* 西班牙语
+* 瑞典语
+* 土耳其
+
+## Web 服务器配置
### Apache
-A `.htaccess` file ships with the app, however, a lot of apache installations disallow `.htaccess` files by default.
-You will notice this due to some links not working like `/settings`.
-In addition mod-rewrite needs to be enabled if it isn't already.
-#### Fixes & work around options
-##### - Apache global allow .htaccess
-Find the `AllowOverride None` line in your apache configuration and change this to `AllowOverride All`
+应用程序附带一个 `.htaccess` 文件,然而,许多 Apache 安装默认禁止 `.htaccess` 文件。您会注意到一些链接无法正常工作,如 `/settings`。此外,如果尚未启用,还需要启用 mod-rewrite 模块。
-##### - Apache vhost configuration allow .htaccess
-In the apache vhost configuration in the `` block add `AllowOverride All`
+#### 修复和绕过选项
+
+##### \- Apache 全局允许 .htaccess
+
+在您的 Apache 配置中找到 `AllowOverride None` 行,并将其更改为 `AllowOverride All`
+
+##### \- Apache vhost 配置允许 .htaccess
+
+在 apache vhost 配置中的 `` 块中添加 `AllowOverride All`
+
+##### \- 在 apache 配置中添加.htaccess 内容
+
+您可以将完整的 `.htaccess` 添加到您的 apache 配置中,这样您就不需要允许 `.htaccess` 文件。您甚至可以在将其插入到 apache 配置中时缩短 `.htaccess` 的内容:
-##### - Add .htaccess content in apache configuration
-You can add the full `.htaccess` into your apache configuration, this way you do not need to allow `.htaccess` files.
-You can even shorten the content of the `.htaccess` when inserting it into the apache configuration to:
```
Options +FollowSymLinks
RewriteEngine On
@@ -131,33 +141,36 @@ RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
```
-#### More info
-More info about `AllowOverride` can be found here:
-https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
+#### 更多信息
+更多关于 `AllowOverride` 的信息可以在这里找到: [https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride](https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride)
### Nginx
-If you are using Nginx, the following directive in your site configuration will direct all requests to the `index.php` front controller:
+
+如果您正在使用 Nginx,您的站点配置中的以下指令将把所有请求导向 `index.php` 前端控制器:
```
location / {
try_files $uri $uri/ /index.php?$query_string;
}
```
-Someone was using the same nginx setup to both run this and reverse proxy Plex, Plex is served from `/web` so their location was interfering with the `/webfonts`.
-Therefore, if your fonts aren't showing because you have a location for `/web`, add the following
+有人使用相同的 nginx 配置来运行这个和反向代理 Plex,Plex 是从 `/web` 提供的,所以它们的位置干扰了 `/webfonts`。
+
+因此,如果你的字体没有显示,因为你有一个位于 `/web` 的位置,请添加以下内容
+
```
location /webfonts {
try_files $uri $uri/;
}
```
-If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
-### Reverse proxy
-If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
-You can either reverse proxy from the root location, or from a subdomain (subfolder method is currently not supported). For HTTPS proxy, make sure you use the HTTPS port of Heimdall webserver, otherwise some links may break. You can add security through `.htpasswd`
+如果有任何其他位置可能会干扰到 `/public` 文件夹中的任何文件夹,您可能也需要对它们做同样的处理,但这只是一个极边缘的情况。
+
+### 反向代理
+
+如果您想反向代理此应用,我们建议使用我们的 letsencrypt/nginx docker 镜像:\[SWAG - Secure Web Application Gateway\](#0) 您可以从根位置或子域名(目前不支持子文件夹方法)进行反向代理。对于 HTTPS 代理,请确保您使用 Heimdall web 服务器的 HTTPS 端口,否则某些链接可能会中断。您可以通过 `.htpasswd` 添加安全性。
```
location / {
@@ -169,44 +182,50 @@ location / {
}
```
-### Self-signed certificates and local CAs
-Per default Heimdall uses the standard certificate bundle file (`ca-certificates.crt`) to verify HTTPS sites and will ignore additional certificates placed in `/etc/ssl/certs`. If you wish to use enhanced apps with HTTPS sites that use a self-signed certificate or certs signed with your own local CA, you can override the default bundle:
+### 自签名证书和本地 CA
-- Create a unified certificate `.pem` file that contains all CAs and certificates that Heimdall has to verify. For example, if you use both LetsEncrypt and a local CA for your internal apps, concatenate the LetsEncrypt intermediate CA (export via browser) and your local CA `cert.pem` (or any number of self-signed certs) into one `heimdall.pem` file.
-- Place the `heimdall.pem` into the container (if you use Docker), for example by placing it in the path that you mapped to `/config`. Make sure that the Heimdall user has read access (`chmod a+r`).
-- Set the `openssl.cafile` setting in `/config/php/php-local.ini` to your cert bundle:
+默认情况下,Heimdall 使用标准证书捆绑文件(`ca-certificates.crt`)来验证 HTTPS 站点,并将忽略放置在 `/etc/ssl/certs` 中的附加证书。如果您希望使用带有自签名证书或使用您自己的本地 CA 签名的证书的增强型 HTTPS 站点应用,您可以覆盖默认捆绑:
+
+* 创建一个包含所有 CA 和证书的统一证书文件 `.pem`,以便 Heimdall 进行验证。例如,如果您同时使用 Let's Encrypt 和本地 CA 为您的内部应用,将 Let's Encrypt 的中间 CA(通过浏览器导出)和您的本地 CA `cert.pem`(或任何数量的自签名证书)合并到一个 `heimdall.pem` 文件中。
+* 将 `heimdall.pem` 放入容器中(如果您使用 Docker),例如将其放置在映射到 `/config` 的路径中。确保 Heimdall 用户有读取权限(`chmod a+r`)。
+* 在 `/config/php/php-local.ini` 中设置 `openssl.cafile` 设置为您证书包:
```
# /config/php/php-local.ini
openssl.cafile = /config/heimdall.pem
```
-Restart the container and the enhanced apps should now be able to access your local HTTP websites. This configuration will survive updating or recreating the Heimdall container.
+重启容器,增强后的应用现在应该能够访问您的本地 HTTP 网站。此配置将在更新或重新创建 Heimdall 容器时保持不变。
-## Running offline
-The apps list is hosted on github, you have a couple of options if you want to run without a connection to the outside world:
-1) Clone the repository and host it yourself, look at the .github actions file to see how to generate the apps list.
-2) Download the apps list and store it as a json accessible to heimdall named `list.json`
+## 离线运行
-With both options all you need to do is add the following to your `.env`
-`APP_SOURCE=http://localhost/` Where `http://localhost/` is the path to the apps list without the name of the file, so if your file is stored at `https://heimdall.local/list.json` you would put `APP_SOURCE=https://heimdall.local/`
+应用程序列表托管在 GitHub 上,如果您想在无外部连接的情况下运行,有以下几种选择:
-## Support
-https://discord.gg/CCjHKn4 or through GitHub issues
+1. 克隆仓库并自行托管,查看.gitignore 文件了解如何生成应用程序列表。
+2. 下载应用程序列表并将其存储为名为 `list.json` 的可供 heimdall 访问的 json 文件。
-## Donate
-If you would like to show your appreciation, feel free to use the link below.
+只需将以下内容添加到您的 `.env``APP_SOURCE=http://localhost/`,其中 `http://localhost/` 是不带文件名的应用列表路径,所以如果您的文件存储在 `https://heimdall.local/list.json` ,您应该输入 `APP_SOURCE=https://heimdall.local/`
+
+## 支持
+
+[https://discord.gg/CCjHKn4](https://discord.gg/CCjHKn4) 或通过 GitHub issues
+
+## 捐赠
+
+如果您想表达感谢,请随意使用下面的链接。
[](https://www.paypal.me/heimdall)
-## Credits
-- PHP Framework - [Laravel](https://laravel.com/)
-- Icons - [FontAwesome 5](https://fontawesome.com/)
-- JavaScript - [jQuery](https://jquery.com/)
-- Colour picker - [Huebee](http://huebee.buzz/)
-- Background image - [pexels](https://www.pexels.com)
-- Trianglify library - [Trianglify](https://github.com/qrohlf/trianglify)
-- Everyone at Linuxserver.io that has helped with the app and let's not forget IronicBadger for the following question that started it all:
+## 致谢
+
+* PHP 框架 - [Laravel](https://laravel.com/)
+* 图标 - [FontAwesome 5](https://fontawesome.com/)
+* JavaScript - [jQuery](https://jquery.com/)
+* 颜色选择器 - [Huebee](http://huebee.buzz/)
+* 背景图片 - [pexels](https://www.pexels.com)
+* 三角形图案库 - [Trianglify](https://github.com/qrohlf/trianglify)
+* Linuxserver.io 上的每个人都帮助了这款应用,还有不要忘了 IronicBadger,正是以下问题开启了这一切:
+
```
you know, i would love something like this landing page for all my servers apps
that gives me the ability to pin favourites
@@ -214,6 +233,6 @@ and / or search
@Stark @Kode do either of you think you'd be able to rustle something like this up ?
```
-## License
+## 许可证
-This app is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
+此应用是开源软件,许可协议为 [MIT 许可协议](https://opensource.org/licenses/MIT) 。
\ No newline at end of file
diff --git a/apps/heimdall/README_en.md b/apps/heimdall/README_en.md
new file mode 100644
index 000000000..e94a8a7e8
--- /dev/null
+++ b/apps/heimdall/README_en.md
@@ -0,0 +1,219 @@
+# Heimdall
+
+[](https://heimdall.site)
+
+[](https://discord.gg/CCjHKn4)
+[](https://hub.docker.com/r/linuxserver/heimdall/)
+[](https://www.firsttimersonly.com/)
+[](https://www.paypal.me/heimdall)
+
+___
+
+Visit the website - https://heimdall.site
+___
+
+## About
+As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like.
+
+Heimdall is an elegant solution to organise all your web applications. It’s dedicated to this purpose so you won’t lose your links in a sea of bookmarks.
+
+Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo.
+
+
+
+## Video
+If you want to see a quick video of it in use, go to https://youtu.be/GXnnMAxPzMc
+
+## Supported applications
+You can use the app to link to any site or application, but Foundation apps will auto fill in the icon for the app and supply a default color for the tile. In addition Enhanced apps allow you provide details to an apps API, allowing you to view live stats directly on the dashboad. For example, the NZBGet and Sabnzbd Enhanced apps will display the queue size and download speed while something is downloading.
+
+Supported applications are recognized by the title of the application as entered in the title field when adding an application. For example, to add a link to pfSense, begin by typing "p" in the title field and then select "pfSense" from the list of supported applications.
+
+[](https://apps.heimdall.site/applications/enhanced)
+
+[](https://apps.heimdall.site/applications/foundation)
+
+## Installing
+Apart from the Laravel 8 dependencies, namely PHP >= 7.4.32, BCMath PHP Extension, INTL PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
+
+If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
+
+Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
+
+```
+cd /path/to/heimdall
+cp .env.example .env
+php artisan key:generate
+```
+
+For simple testing you could just go to the folder and type `php artisan serve`
+
+There is also a multi-arch Docker which supports x86-64, armhf and arm64, instructions on how to use them at
+
+- https://hub.docker.com/r/linuxserver/heimdall/
+
+## Updating
+To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
+
+## Search Providers
+v2.3.0 added the ability for users to customise the search options.
+
+Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
+
+Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
+
+The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
+
+## New background image not being set
+If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
+
+If you are using the linuxserver.io docker image simply edit `/path/to/config/php/php-local.ini` and add `upload_max_filesize = 30M` to the end.
+
+## Docker and enhanced apps
+If you are running the docker and the EnhancedApps you are using are also in dockers, you may need to use the docker networking addresses to communicate with them.
+
+You can do this by using `http(s)://docker_name:port` in the config section. Instead of the name you can use the internal docker ip, this usually starts with `172.`
+
+## Languages
+The app has been translated into several languages; however, the quality of the translations could do with work. If you would like to improve them, or help with other translations, they are stored in `/resources/lang/`.
+
+To create a new language translation, make a new folder with the ISO 3166-1 alpha-2 code as the name, copy `app.php` from `/resources/lang/en/app.php` into your new folder and replace the English strings.
+
+When you are finished, create a pull request.
+
+Currently added languages are
+
+- Breton
+- Chinese
+- Danish
+- Dutch
+- English
+- Finnish
+- French
+- German
+- Greek
+- Hungarian
+- Italian
+- Japanese
+- Korean
+- Lombard
+- Norwegian
+- Polish
+- Portuguese
+- Russian
+- Slovenian
+- Spanish
+- Swedish
+- Turkish
+
+## Web Server Configuration
+
+### Apache
+A `.htaccess` file ships with the app, however, a lot of apache installations disallow `.htaccess` files by default.
+You will notice this due to some links not working like `/settings`.
+In addition mod-rewrite needs to be enabled if it isn't already.
+
+#### Fixes & work around options
+##### - Apache global allow .htaccess
+Find the `AllowOverride None` line in your apache configuration and change this to `AllowOverride All`
+
+##### - Apache vhost configuration allow .htaccess
+In the apache vhost configuration in the `` block add `AllowOverride All`
+
+##### - Add .htaccess content in apache configuration
+You can add the full `.htaccess` into your apache configuration, this way you do not need to allow `.htaccess` files.
+You can even shorten the content of the `.htaccess` when inserting it into the apache configuration to:
+```
+Options +FollowSymLinks
+RewriteEngine On
+
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^ index.php [L]
+```
+#### More info
+More info about `AllowOverride` can be found here:
+https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
+
+
+
+### Nginx
+If you are using Nginx, the following directive in your site configuration will direct all requests to the `index.php` front controller:
+
+```
+location / {
+ try_files $uri $uri/ /index.php?$query_string;
+}
+```
+Someone was using the same nginx setup to both run this and reverse proxy Plex, Plex is served from `/web` so their location was interfering with the `/webfonts`.
+
+Therefore, if your fonts aren't showing because you have a location for `/web`, add the following
+```
+location /webfonts {
+ try_files $uri $uri/;
+}
+```
+If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
+
+### Reverse proxy
+If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
+You can either reverse proxy from the root location, or from a subdomain (subfolder method is currently not supported). For HTTPS proxy, make sure you use the HTTPS port of Heimdall webserver, otherwise some links may break. You can add security through `.htpasswd`
+
+```
+location / {
+ auth_basic "Restricted";
+ auth_basic_user_file /config/nginx/.htpasswd;
+ include /config/nginx/proxy.conf;
+ proxy_set_header X-Forwarded-Proto https;
+ proxy_pass http://heimdall;
+}
+```
+
+### Self-signed certificates and local CAs
+Per default Heimdall uses the standard certificate bundle file (`ca-certificates.crt`) to verify HTTPS sites and will ignore additional certificates placed in `/etc/ssl/certs`. If you wish to use enhanced apps with HTTPS sites that use a self-signed certificate or certs signed with your own local CA, you can override the default bundle:
+
+- Create a unified certificate `.pem` file that contains all CAs and certificates that Heimdall has to verify. For example, if you use both LetsEncrypt and a local CA for your internal apps, concatenate the LetsEncrypt intermediate CA (export via browser) and your local CA `cert.pem` (or any number of self-signed certs) into one `heimdall.pem` file.
+- Place the `heimdall.pem` into the container (if you use Docker), for example by placing it in the path that you mapped to `/config`. Make sure that the Heimdall user has read access (`chmod a+r`).
+- Set the `openssl.cafile` setting in `/config/php/php-local.ini` to your cert bundle:
+
+```
+# /config/php/php-local.ini
+openssl.cafile = /config/heimdall.pem
+```
+
+Restart the container and the enhanced apps should now be able to access your local HTTP websites. This configuration will survive updating or recreating the Heimdall container.
+
+## Running offline
+The apps list is hosted on github, you have a couple of options if you want to run without a connection to the outside world:
+1) Clone the repository and host it yourself, look at the .github actions file to see how to generate the apps list.
+2) Download the apps list and store it as a json accessible to heimdall named `list.json`
+
+With both options all you need to do is add the following to your `.env`
+`APP_SOURCE=http://localhost/` Where `http://localhost/` is the path to the apps list without the name of the file, so if your file is stored at `https://heimdall.local/list.json` you would put `APP_SOURCE=https://heimdall.local/`
+
+## Support
+https://discord.gg/CCjHKn4 or through GitHub issues
+
+## Donate
+If you would like to show your appreciation, feel free to use the link below.
+
+[](https://www.paypal.me/heimdall)
+
+## Credits
+- PHP Framework - [Laravel](https://laravel.com/)
+- Icons - [FontAwesome 5](https://fontawesome.com/)
+- JavaScript - [jQuery](https://jquery.com/)
+- Colour picker - [Huebee](http://huebee.buzz/)
+- Background image - [pexels](https://www.pexels.com)
+- Trianglify library - [Trianglify](https://github.com/qrohlf/trianglify)
+- Everyone at Linuxserver.io that has helped with the app and let's not forget IronicBadger for the following question that started it all:
+```
+you know, i would love something like this landing page for all my servers apps
+that gives me the ability to pin favourites
+and / or search
+@Stark @Kode do either of you think you'd be able to rustle something like this up ?
+```
+
+## License
+
+This app is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
diff --git a/apps/hexo/README.md b/apps/hexo/README.md
index 6ed5f7bce..d5f0d4a72 100644
--- a/apps/hexo/README.md
+++ b/apps/hexo/README.md
@@ -1,102 +1,87 @@
-
+
# Hexo
-> A fast, simple & powerful blog framework, powered by [Node.js](https://nodejs.org).
+> 一个快速、简单且强大的博客框架,由 [Node.js](https://nodejs.org) 驱动。
-[Website](https://hexo.io) |
-[Documentation](https://hexo.io/docs/) |
-[Installation Guide](https://hexo.io/docs/#Installation) |
-[Contribution Guide](https://hexo.io/docs/contributing) |
-[Code of Conduct](CODE_OF_CONDUCT.md) |
-[API](https://hexo.io/api/) |
-[Twitter](https://twitter.com/hexojs)
+[网站](https://hexo.io) | [文档](https://hexo.io/docs/) | [安装指南](https://hexo.io/docs/#Installation) | [贡献指南](https://hexo.io/docs/contributing) | [行为准则](CODE_OF_CONDUCT.md) | [API](https://hexo.io/api/) | [推特](https://twitter.com/hexojs)
-[](https://www.npmjs.com/package/hexo)
-
-[](https://github.com/hexojs/hexo/actions?query=workflow%3ATester)
-[](https://libraries.io/npm/hexo)
-[](https://coveralls.io/r/hexojs/hexo?branch=master)
-[](https://gitter.im/hexojs/hexo)
-[](https://discord.gg/teM2Anj)
-[](https://t.me/hexojs)
-[](https://app.fossa.com/projects/git%2Bgithub.com%2Fhexojs%2Fhexo?ref=badge_shield)
-[](CODE_OF_CONDUCT.md)
+[](https://www.npmjs.com/package/hexo)  [](https://github.com/hexojs/hexo/actions?query=workflow%3ATester) [](https://libraries.io/npm/hexo) [](https://coveralls.io/r/hexojs/hexo?branch=master) [](https://gitter.im/hexojs/hexo) [](https://discord.gg/teM2Anj) [](https://t.me/hexojs) [](https://app.fossa.com/projects/git%2Bgithub.com%2Fhexojs%2Fhexo?ref=badge_shield) [](CODE_OF_CONDUCT.md)
-## Features
+## 功能
-- Blazing fast generating
-- Support for GitHub Flavored Markdown and most Octopress plugins
-- One-command deploy to GitHub Pages, Heroku, etc.
-- Powerful API for limitless extensibility
-- Hundreds of [themes](https://hexo.io/themes/) & [plugins](https://hexo.io/plugins/)
+* 闪电般的生成速度
+* 支持 GitHub Flavored Markdown 和大多数 Octopress 插件
+* 一键部署到 GitHub Pages、Heroku 等
+* 强大的 API,无限可扩展
+* 数百个[主题](https://hexo.io/themes/) & [插件](https://hexo.io/plugins/)
-## Quick Start
+## 快速开始
-**Install Hexo**
+**安装 Hexo**
-``` bash
+```bash
$ npm install hexo-cli -g
```
-Install with [brew](https://brew.sh/) on macOS and Linux:
+使用 [brew](https://brew.sh/) 在 macOS 和 Linux 上安装:
```bash
$ brew install hexo
```
-**Setup your blog**
+**设置您的博客**
-``` bash
+```bash
$ hexo init blog
$ cd blog
```
-**Start the server**
+**启动服务器**
-``` bash
+```bash
$ hexo server
```
-**Create a new post**
+**创建一篇新文章**
-``` bash
+```bash
$ hexo new "Hello Hexo"
```
-**Generate static files**
+**生成静态文件**
-``` bash
+```bash
$ hexo generate
```
-## More Information
+## 更多信息
-- Read the [documentation](https://hexo.io/)
-- Visit the [Awesome Hexo](https://github.com/hexojs/awesome-hexo) list
-- Find solutions in [troubleshooting](https://hexo.io/docs/troubleshooting.html)
-- Join discussion on [Google Group](https://groups.google.com/group/hexo), [Discord](https://discord.gg/teM2Anj), [Gitter](https://gitter.im/hexojs/hexo) or [Telegram](https://t.me/hexojs)
-- See the [plugin list](https://hexo.io/plugins/) and the [theme list](https://hexo.io/themes/) on wiki
-- Follow [@hexojs](https://twitter.com/hexojs) for latest news
+* 阅读[文档](https://hexo.io/)
+* 访问 [Awesome Hexo](https://github.com/hexojs/awesome-hexo) 列表
+* 找到[故障排除](https://hexo.io/docs/troubleshooting.html)中的解决方案
+* 在 [Google Group](https://groups.google.com/group/hexo)、[Discord](https://discord.gg/teM2Anj)、[Gitter](https://gitter.im/hexojs/hexo) 或 [Telegram](https://t.me/hexojs) 上参与讨论
+* 在 wiki 上查看[插件列表](https://hexo.io/plugins/)和[主题列表](https://hexo.io/themes/)
+* 关注 [@hexojs](https://twitter.com/hexojs) 获取最新消息
-## Contributing
+## 贡献
-We welcome you to join the development of Hexo. Please see [contributing document](https://hexo.io/docs/contributing). 🤗
+我们欢迎您加入 Hexo 的开发。请参阅[贡献文档](https://hexo.io/docs/contributing) 。🤗
-Also, we welcome PR or issue to [official-plugins](https://github.com/hexojs).
+此外,我们也欢迎向[官方插件](https://github.com/hexojs)提交 PR 或 issue。
-## Contributors
+## 贡献者
[](https://github.com/hexojs/hexo/graphs/contributors)
-## Backers
+## 支持者
[](https://opencollective.com/hexo)
-## Sponsors
+## 赞助商
-
+[](https://linktr.ee/rss3)
-## License
+## 许可证
-[](https://app.fossa.com/projects/git%2Bgithub.com%2Fhexojs%2Fhexo?ref=badge_large)
+[](https://app.fossa.com/projects/git%2Bgithub.com%2Fhexojs%2Fhexo?ref=badge_large)
\ No newline at end of file
diff --git a/apps/homarr/1.18.1/data.yml b/apps/homarr/1.18.1/data.yml
deleted file mode 100644
index 67b5feac2..000000000
--- a/apps/homarr/1.18.1/data.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-additionalProperties:
- formFields:
- - default: "/home/homarr"
- edit: true
- envKey: HOMARR_ROOT_PATH
- labelZh: 数据持久化路径
- labelEn: Data persistence path
- required: true
- type: text
- - default: 7575
- edit: true
- envKey: PANEL_APP_PORT_HTTP
- labelZh: WebUI 端口
- labelEn: WebUI port
- required: true
- rule: paramPort
- type: number
- - default: "b7fa3f6f09ac8084ca03b94589d799e6a9225212e8f691c6b419a139acf412c7"
- edit: true
- envKey: SECRET_ENCRYPTION_KEY
- labelZh: 密钥
- labelEn: Secret key
- required: true
- type: text
diff --git a/apps/homarr/1.18.1/docker-compose.yml b/apps/homarr/1.18.1/docker-compose.yml
deleted file mode 100644
index d8af35842..000000000
--- a/apps/homarr/1.18.1/docker-compose.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-networks:
- 1panel-network:
- external: true
-
-services:
- homarr:
- image: ghcr.io/ajnart/homarr:0.15.10
- container_name: ${CONTAINER_NAME}
- labels:
- createdBy: "Apps"
- restart: always
- network_mode: ${NETWORK_MODE}
- ports:
- - ${PANEL_APP_PORT_HTTP}:7575
- env_file:
- - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env}
- - ${ENV_FILE:-/etc/1panel/envs/default.env}
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- - ${HOMARR_ROOT_PATH}/appdata:/appdata
diff --git a/apps/home-assistant/README.md b/apps/home-assistant/README.md
index 1e199104d..9a7776466 100644
--- a/apps/home-assistant/README.md
+++ b/apps/home-assistant/README.md
@@ -1,6 +1,7 @@
# 使用说明
-- 默认访问地址
+* 默认访问地址
+
```
IP:8123
```
@@ -9,25 +10,16 @@ IP:8123
# Home Assistant [](https://www.home-assistant.io/join-chat/)
-Open source home automation that puts local control and privacy first.
-Powered by a worldwide community of tinkerers and DIY enthusiasts.
-Perfect to run on a Raspberry Pi or a local server.
+开源智能家居自动化系统,将本地控制和隐私放在首位。由全球的 DIY 爱好者和技术爱好者社区支持。非常适合在树莓派或本地服务器上运行。
-Check out [home-assistant.io](https://home-assistant.io) for [ademo](https://demo.home-assistant.io), [installation instructions](https://home-assistant.io/getting-started/),[tutorials](https://home-assistant.io/getting-started/automation/) and [documentation](https://home-assistant.io/docs/).
+访问 [home-assistant.io](https://home-assistant.io) 获取[演示](https://demo.home-assistant.io) 、 [安装说明](https://home-assistant.io/getting-started/) 、 [教程](https://home-assistant.io/getting-started/automation/)和[文档](https://home-assistant.io/docs/) 。
[](https://demo.home-assistant.io)
-## Featured integrations
+## 特色集成
[](https://home-assistant.io/integrations/)
-The system is built using a modular approach so support for other
-devices or actions can be implemented easily. See also the [section on
-architecture](https://developers.home-assistant.io/docs/architecture_index/)
-and the [section on creating your own
-components](https://developers.home-assistant.io/docs/creating_component_index/).
+系统采用模块化方法构建,因此可以轻松实现其他设备或动作的支持。请参阅[架构部分](https://developers.home-assistant.io/docs/architecture_index/)和[创建自己的组件部分](https://developers.home-assistant.io/docs/creating_component_index/) 。
-If you run into issues while using Home Assistant or during development
-of a component, check the [Home Assistant help
-section](https://home-assistant.io/help/) of our website for further
-help and information.
+如果您在使用 Home Assistant 或开发组件时遇到问题,请访问我们网站上的 [Home Assistant 帮助部分](https://home-assistant.io/help/)以获取更多帮助和信息。
\ No newline at end of file
diff --git a/apps/home-assistant/README_en.md b/apps/home-assistant/README_en.md
new file mode 100644
index 000000000..1e199104d
--- /dev/null
+++ b/apps/home-assistant/README_en.md
@@ -0,0 +1,33 @@
+# 使用说明
+
+- 默认访问地址
+```
+IP:8123
+```
+
+# 原始相关
+
+# Home Assistant [](https://www.home-assistant.io/join-chat/)
+
+Open source home automation that puts local control and privacy first.
+Powered by a worldwide community of tinkerers and DIY enthusiasts.
+Perfect to run on a Raspberry Pi or a local server.
+
+Check out [home-assistant.io](https://home-assistant.io) for [ademo](https://demo.home-assistant.io), [installation instructions](https://home-assistant.io/getting-started/),[tutorials](https://home-assistant.io/getting-started/automation/) and [documentation](https://home-assistant.io/docs/).
+
+[](https://demo.home-assistant.io)
+
+## Featured integrations
+
+[](https://home-assistant.io/integrations/)
+
+The system is built using a modular approach so support for other
+devices or actions can be implemented easily. See also the [section on
+architecture](https://developers.home-assistant.io/docs/architecture_index/)
+and the [section on creating your own
+components](https://developers.home-assistant.io/docs/creating_component_index/).
+
+If you run into issues while using Home Assistant or during development
+of a component, check the [Home Assistant help
+section](https://home-assistant.io/help/) of our website for further
+help and information.
diff --git a/apps/homepage/README.md b/apps/homepage/README.md
index 895a17fea..e0a62ad15 100644
--- a/apps/homepage/README.md
+++ b/apps/homepage/README.md
@@ -1,40 +1,21 @@
-
- A modern, fully static, fast, secure fully proxied, highly customizable application dashboard with integrations for over 100 services and translations into multiple languages. Easily configured via YAML files or through docker label discovery.
-
+[](https://github.com/gethomepage/homepage/actions/workflows/docker-publish.yml) [](https://crowdin.com/project/gethomepage) [](https://discord.gg/k4ruYNrudu) [](http://gethomepage.dev/latest/ "Docs") [](https://paypal.me/phelpsben "Donate")
-# Features
+# 功能
-With features like quick search, bookmarks, weather support, a wide range of integrations and widgets, an elegant and modern design, and a focus on performance, Homepage is your ideal start to the day and a handy companion throughout it.
+具有快速搜索、书签、天气支持、广泛的集成和小部件、优雅现代的设计以及注重性能等特点,首页是您每天理想的开始,也是全天候的便捷伴侣。
-- **Fast** - The site is statically generated at build time for instant load times.
-- **Secure** - All API requests to backend services are proxied, keeping your API keys hidden. Constantly reviewed for security by the community.
-- **For Everyone** - Images built for AMD64, ARM64, ARMv7, and ARMv6.
-- **Full i18n** - Support for over 40 languages.
-- **Service & Web Bookmarks** - Add custom links to the homepage.
-- **Docker Integration** - Container status and stats. Automatic service discovery via labels.
-- **Service Integration** - Over 100 service integrations, including popular starr and self-hosted apps.
-- **Information & Utility Widgets** - Weather, time, date, search, and more.
-- **And much more...**
+* **快速** \- 网站在构建时静态生成,实现即时加载时间。
+* **安全** \- 所有后端服务的 API 请求都经过代理,隐藏您的 API 密钥。社区持续审查以确保安全。
+* **面向所有人** \- 为 AMD64、ARM64、ARMv7 和 ARMv6 构建的镜像。
+* **全国际化** \- 支持 40 多种语言。
+* **服务与网页书签** \- 将自定义链接添加到主页。
+* **Docker 集成** \- 容器状态和统计信息。通过标签自动服务发现。
+* **服务集成** \- 超过 100 种服务集成,包括流行的第三方和自托管应用。
+* **信息与实用小部件** \- 天气、时间、日期、搜索等。
+* **还有更多...**
\ No newline at end of file
diff --git a/apps/homepage/README_en.md b/apps/homepage/README_en.md
new file mode 100644
index 000000000..895a17fea
--- /dev/null
+++ b/apps/homepage/README_en.md
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+ A modern, fully static, fast, secure fully proxied, highly customizable application dashboard with integrations for over 100 services and translations into multiple languages. Easily configured via YAML files or through docker label discovery.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Features
+
+With features like quick search, bookmarks, weather support, a wide range of integrations and widgets, an elegant and modern design, and a focus on performance, Homepage is your ideal start to the day and a handy companion throughout it.
+
+- **Fast** - The site is statically generated at build time for instant load times.
+- **Secure** - All API requests to backend services are proxied, keeping your API keys hidden. Constantly reviewed for security by the community.
+- **For Everyone** - Images built for AMD64, ARM64, ARMv7, and ARMv6.
+- **Full i18n** - Support for over 40 languages.
+- **Service & Web Bookmarks** - Add custom links to the homepage.
+- **Docker Integration** - Container status and stats. Automatic service discovery via labels.
+- **Service Integration** - Over 100 service integrations, including popular starr and self-hosted apps.
+- **Information & Utility Widgets** - Weather, time, date, search, and more.
+- **And much more...**
diff --git a/apps/it-tools/README.md b/apps/it-tools/README.md
index 828f8309b..3a65c8a31 100644
--- a/apps/it-tools/README.md
+++ b/apps/it-tools/README.md
@@ -1,45 +1,46 @@

-Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech).
+有用的工具,适用于开发人员和 IT 行业工作者。 [看看吧!](https://it-tools.tech)。
-## Functionalities and roadmap
+## 功能与路线图
-Please check the [issues](https://github.com/CorentinTh/it-tools/issues) to see if some feature listed to be implemented.
+请查看 [问题](https://github.com/CorentinTh/it-tools/issues) ,看看是否有列出的功能即将实现。
-You have an idea of a tool? Submit a [feature request](https://github.com/CorentinTh/it-tools/issues/new/choose)!
+您有一个工具的想法吗?提交一个 [功能请求](https://github.com/CorentinTh/it-tools/issues/new/choose) !
-## Self host
+## 自托管
-Self host solutions for your homelab
+为您的家庭实验室提供自托管解决方案
-**From docker hub:**
+**从 Docker Hub 获取:**
```sh
docker run -d --name it-tools --restart unless-stopped -p 8080:80 corentinth/it-tools:latest
```
-**From github packages:**
+**从 GitHub 包获取:**
```sh
docker run -d --name it-tools --restart unless-stopped -p 8080:80 ghcr.io/corentinth/it-tools:latest
```
-**Other solutions:**
+**其他解决方案:**
-- [Tipi](https://www.runtipi.io/docs/apps-available)
-- [Unraid](https://unraid.net/community/apps?q=it-tools)
+* [帐篷](https://www.runtipi.io/docs/apps-available)
+* [Unraid](https://unraid.net/community/apps?q=it-tools)
-## Contribute
+## 贡献
-### Recommended IDE Setup
+### 推荐 IDE 设置
-[VSCode](https://code.visualstudio.com/) with the following extensions:
-- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur)
-- [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
-- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
-- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally)
+[VSCode](https://code.visualstudio.com/) 配置以下扩展:
-with the following settings:
+* [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)(并禁用 Vetur)
+* [TypeScript Vue 插件(Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
+* [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
+* [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally)
+
+使用以下设置:
```json5
{
@@ -57,64 +58,63 @@ with the following settings:
### Type Support for `.vue` Imports in TS
-TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
+TypeScript 默认无法处理 `.vue` 导入的类型信息,因此我们用 `vue-tsc` 替换 `tsc` CLI 进行类型检查。在编辑器中,我们需要 [TypeScript Vue 插件 (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) 来让 TypeScript 语言服务了解 `.vue` 类型。
-If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
+如果您觉得独立的 TypeScript 插件不够快,Volar 还实现了更高效的 [接管模式](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) 。您可以通过以下步骤启用它:
-1. Disable the built-in TypeScript Extension
- 1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette
- 2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
-2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+1. 禁用内置的 TypeScript 扩展
+ 1. 从 VSCode 的命令面板运行 `Extensions: Show Built-in Extensions`
+ 2. 找到 `TypeScript and JavaScript Language Features` ,右键单击并选择 `禁用(工作区)`
+2. 通过从命令面板运行 `开发者:重新加载窗口` 来重新加载 VSCode 窗口。
-### Project Setup
+### 项目设置
```sh
pnpm install
```
-### Compile and Hot-Reload for Development
+### 编译和热重载以进行开发
```sh
pnpm dev
```
-### Type-Check, Compile and Minify for Production
+### 类型检查、编译和压缩以用于生产
```sh
pnpm build
```
-### Run Unit Tests with [Vitest](https://vitest.dev/)
+### 使用 [Vitest](https://vitest.dev/) 运行单元测试
```sh
pnpm test
```
-### Lint with [ESLint](https://eslint.org/)
+### 使用 [ESLint](https://eslint.org/) 进行代码检查
```sh
pnpm lint
```
-### Create a new tool
+### 创建一个新工具
-To create a new tool, there is a script that generate the boilerplate of the new tool, simply run:
+要创建一个新工具,有一个脚本可以生成新工具的模板,只需运行:
```sh
pnpm run script:create-new-tool my-tool-name
```
-It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the imported tool in the proper category and develop the tool.
+它将在 `src/tools` 目录下创建正确的文件,并在 `src/tools/index.ts` 中添加导入。你只需将导入的工具添加到正确的类别并开发工具即可。
-## Credits
+## 致谢
-Coded with ❤️ by [Corentin Thomasset](https://corentin-thomasset.fr/).
+由 [Corentin Thomasset](https://corentin-thomasset.fr/) 用 ❤️ 编写。
-This project is continuously deployed using [vercel.com](https://vercel.com).
+该项目使用 [vercel.com](https://vercel.com) 持续部署。
-
-
+[](https://www.producthunt.com/posts/it-tools?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-it-tools) [](https://www.producthunt.com/posts/it-tools?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-it-tools)
-## License
+## 许可证
-This project is under the [GNU GPLv3](https://github.com/CorentinTh/it-tools/blob/main/LICENSE).
+此项目遵循 [GNU GPLv3](https://github.com/CorentinTh/it-tools/blob/main/LICENSE) 协议。
\ No newline at end of file
diff --git a/apps/it-tools/README_en.md b/apps/it-tools/README_en.md
new file mode 100644
index 000000000..828f8309b
--- /dev/null
+++ b/apps/it-tools/README_en.md
@@ -0,0 +1,120 @@
+
+
+Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech).
+
+## Functionalities and roadmap
+
+Please check the [issues](https://github.com/CorentinTh/it-tools/issues) to see if some feature listed to be implemented.
+
+You have an idea of a tool? Submit a [feature request](https://github.com/CorentinTh/it-tools/issues/new/choose)!
+
+## Self host
+
+Self host solutions for your homelab
+
+**From docker hub:**
+
+```sh
+docker run -d --name it-tools --restart unless-stopped -p 8080:80 corentinth/it-tools:latest
+```
+
+**From github packages:**
+
+```sh
+docker run -d --name it-tools --restart unless-stopped -p 8080:80 ghcr.io/corentinth/it-tools:latest
+```
+
+**Other solutions:**
+
+- [Tipi](https://www.runtipi.io/docs/apps-available)
+- [Unraid](https://unraid.net/community/apps?q=it-tools)
+
+## Contribute
+
+### Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) with the following extensions:
+- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur)
+- [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
+- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
+- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally)
+
+with the following settings:
+
+```json5
+{
+ "editor.formatOnSave": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
+ },
+ "i18n-ally.localesPaths": [
+ "locales",
+ "src/tools/*/locales"
+ ],
+ "i18n-ally.keystyle": "nested"
+}
+```
+
+### Type Support for `.vue` Imports in TS
+
+TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
+
+If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
+
+1. Disable the built-in TypeScript Extension
+ 1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+### Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+pnpm lint
+```
+
+### Create a new tool
+
+To create a new tool, there is a script that generate the boilerplate of the new tool, simply run:
+
+```sh
+pnpm run script:create-new-tool my-tool-name
+```
+
+It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the imported tool in the proper category and develop the tool.
+
+## Credits
+
+Coded with ❤️ by [Corentin Thomasset](https://corentin-thomasset.fr/).
+
+This project is continuously deployed using [vercel.com](https://vercel.com).
+
+
+
+
+## License
+
+This project is under the [GNU GPLv3](https://github.com/CorentinTh/it-tools/blob/main/LICENSE).
diff --git a/apps/jellyfin/README.md b/apps/jellyfin/README.md
index 2362741b4..91f308e23 100644
--- a/apps/jellyfin/README.md
+++ b/apps/jellyfin/README.md
@@ -1,176 +1,133 @@
-
+* * *
----
+
+ [](https://github.com/jellyfin/jellyfin)[ ](https://github.com/jellyfin/jellyfin/releases)[ ](https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/?utm_source=widget)[ ](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=29)[](https://hub.docker.com/r/jellyfin/jellyfin)
+ [](https://opencollective.com/jellyfin)[ ](https://features.jellyfin.org)[ ](https://matrix.to/#/#jellyfinorg:matrix.org)[ ](https://www.reddit.com/r/jellyfin)[ ](https://github.com/jellyfin/jellyfin/releases.atom)[](https://github.com/jellyfin/jellyfin/commits/master.atom)
-Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest!
+* * *
-For further details, please see [our documentation page](https://jellyfin.org/docs/). To receive the latest updates, get help with Jellyfin, and join the community, please visit [one of our communication channels](https://jellyfin.org/docs/general/getting-help). For more information about the project, please see our [about page](https://jellyfin.org/docs/general/about).
+Jellyfin 是一个免费软件媒体系统,让您掌控媒体管理和流媒体播放。它是 Emby 和 Plex 等专有软件的替代品,通过多个应用程序从专用服务器向终端设备提供媒体。Jellyfin 源自 Emby 的 3.5.2 版本,并移植到.NET Core 框架以实现全平台支持。没有任何附加条件,没有高级许可证或功能,也没有隐藏议程:只有一个想要打造更好产品并共同努力实现目标的团队。我们欢迎任何有兴趣加入我们追求的人!
-Want to get started?
-Check out our downloads page or our installation guide, then see our quick start guide. You can also build from source.
+有关详细信息,请参阅[我们的文档页面](https://jellyfin.org/docs/) 。要获取最新更新,获取 Jellyfin 的帮助并加入社区,请访问[我们的沟通渠道之一](https://jellyfin.org/docs/general/getting-help) 。有关项目的更多信息,请参阅我们的[关于页面](https://jellyfin.org/docs/general/about) 。
-Something not working right?
-Open an Issue on GitHub.
+**想要开始吗?**
+查看我们的[下载页面](https://jellyfin.org/downloads)或我们的[安装指南](https://jellyfin.org/docs/general/installation/) ,然后查看我们的[快速入门指南](https://jellyfin.org/docs/general/quick-start) 。您还可以[从源代码构建](https://jellyfin.org/docs/general/installation/source) 。
-Want to contribute?
-Check out our contributing choose-your-own-adventure to see where you can help, then see our contributing guide and our community standards.
+**有什么问题吗?**
+在 GitHub 上[提交问题](https://jellyfin.org/docs/general/contributing/issues) 。
-New idea or improvement?
-Check out our feature request hub.
+**想要贡献?**
+查看我们的[贡献选择冒险](https://jellyfin.org/contribute) ,看看你可以在哪里提供帮助,然后查看我们的[贡献指南](https://jellyfin.org/docs/general/contributing/)和我们的[社区标准](https://jellyfin.org/docs/general/community-standards) 。
-Don't see Jellyfin in your language?
-Check out our Weblate instance to help translate Jellyfin and its subprojects.
+**有新想法或改进建议?**
+查看我们的[功能请求中心](https://features.jellyfin.org/?view=most-wanted) 。
-
-
-
+**没看到 Jellyfin 支持你的语言?**
+访问我们的 [Weblate 实例](https://translate.jellyfin.org)来帮助翻译 Jellyfin 及其子项目。
----
+[](https://translate.jellyfin.org/engage/jellyfin/?utm_source=widget)
-## Jellyfin Server
+* * *
-This repository contains the code for Jellyfin's backend server. Note that this is only one of many projects under the Jellyfin GitHub [organization](https://github.com/jellyfin/) on GitHub. If you want to contribute, you can start by checking out our [documentation](https://jellyfin.org/docs/general/contributing/index.html) to see what to work on.
+## Jellyfin 服务器
-## Server Development
+此存储库包含 Jellyfin 后端服务器的代码。请注意,这仅仅是 GitHub 上 Jellyfin GitHub [组织](https://github.com/jellyfin/)下的众多项目之一。如果你想贡献,可以从查看我们的[文档](https://jellyfin.org/docs/general/contributing/index.html)开始,了解可以做什么工作。
-These instructions will help you get set up with a local development environment in order to contribute to this repository. Before you start, please be sure to completely read our [guidelines on development contributions](https://jellyfin.org/docs/general/contributing/development.html). Note that this project is supported on all major operating systems except FreeBSD, which is still incompatible.
+## 服务器开发
-### Prerequisites
+以下说明将帮助您设置本地开发环境,以便为这个仓库做出贡献。在开始之前,请务必完全阅读我们关于开发贡献的[指南](https://jellyfin.org/docs/general/contributing/development.html) 。请注意,本项目支持所有主流操作系统,除了 FreeBSD,它仍然不兼容。
-Before the project can be built, you must first install the [.NET 7.0 SDK](https://dotnet.microsoft.com/download/dotnet) on your system.
+### 先决条件
-Instructions to run this project from the command line are included here, but you will also need to install an IDE if you want to debug the server while it is running. Any IDE that supports .NET 6 development will work, but two options are recent versions of [Visual Studio](https://visualstudio.microsoft.com/downloads/) (at least 2022) and [Visual Studio Code](https://code.visualstudio.com/Download).
+在构建项目之前,您必须首先在您的系统上安装 [.NET 7.0 SDK](https://dotnet.microsoft.com/download/dotnet)。
-[ffmpeg](https://github.com/jellyfin/jellyfin-ffmpeg) will also need to be installed.
+在此包含运行此项目的命令行说明,但如果您想在服务器运行时进行调试,还需要安装一个 IDE。任何支持.NET 6 开发的 IDE 都可以使用,但两种选项是 [Visual Studio](https://visualstudio.microsoft.com/downloads/) 的最新版本(至少 2022 年)和 [Visual Studio Code](https://code.visualstudio.com/Download)。
-### Cloning the Repository
+[ffmpeg](https://github.com/jellyfin/jellyfin-ffmpeg) 也需要安装。
-After dependencies are installed you will need to clone a local copy of this repository. If you just want to run the server from source you can clone this repository directly, but if you are intending to contribute code changes to the project, you should [set up your own fork](https://jellyfin.org/docs/general/contributing/development.html#set-up-your-copy-of-the-repo) of the repository. The following example shows how you can clone the repository directly over HTTPS.
+### 克隆仓库
+
+在安装依赖项之后,您需要克隆此仓库的本地副本。如果您只想从源代码运行服务器,可以直接克隆此仓库,但如果您打算向项目贡献代码更改,您应该 [设置自己的仓库分支](https://jellyfin.org/docs/general/contributing/development.html#set-up-your-copy-of-the-repo) 。以下示例显示了如何直接通过 HTTPS 克隆仓库。
```bash
git clone https://github.com/jellyfin/jellyfin.git
```
-### Installing the Web Client
+### 安装 Web 客户端
-The server is configured to host the static files required for the [web client](https://github.com/jellyfin/jellyfin-web) in addition to serving the backend by default. Before you can run the server, you will need to get a copy of the web client since they are not included in this repository directly.
+服务器配置为托管 [Web 客户端](https://github.com/jellyfin/jellyfin-web)所需的静态文件,同时默认提供后端服务。在您运行服务器之前,您需要获取 Web 客户端的副本,因为这些文件并未直接包含在本存储库中。
-Note that it is also possible to [host the web client separately](#hosting-the-web-client-separately) from the web server with some additional configuration, in which case you can skip this step.
+请注意,您还可以通过一些额外的配置将 [Web 客户端单独托管](#hosting-the-web-client-separately)在 Web 服务器之外,在这种情况下,您可以跳过此步骤。
-There are three options to get the files for the web client.
+获取 Web 客户端文件有三种选项。
-1. Download one of the finished builds from the [Azure DevOps pipeline](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27). You can download the build for a specific release by looking at the [branches tab](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27&_a=summary&repositoryFilter=6&view=branches) of the pipelines page.
-2. Build them from source following the instructions on the [jellyfin-web repository](https://github.com/jellyfin/jellyfin-web)
-3. Get the pre-built files from an existing installation of the server. For example, with a Windows server installation the client files are located at `C:\Program Files\Jellyfin\Server\jellyfin-web`
+1. 从 [Azure DevOps 管道](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27)下载一个完成的构建。您可以通过查看管道页面的[分支选项卡](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27&_a=summary&repositoryFilter=6&view=branches)来下载特定版本的构建。
+2. 从源代码构建,按照 [jellyfin-web 仓库](https://github.com/jellyfin/jellyfin-web)上的说明进行
+3. 从现有服务器安装中获取预构建文件。例如,在 Windows 服务器安装中,客户端文件位于 `C:\Program Files\Jellyfin\Server\jellyfin-web`
-### Running The Server
+### 运行服务器
-The following instructions will help you get the project up and running via the command line, or your preferred IDE.
+以下说明将帮助您通过命令行或您首选的 IDE 启动项目。
-#### Running With Visual Studio
+#### 使用 Visual Studio 运行
-To run the project with Visual Studio you can open the Solution (`.sln`) file and then press `F5` to run the server.
+要使用 Visual Studio 运行项目,您可以打开解决方案文件(`.sln`),然后按 `F5` 键运行服务器。
-#### Running With Visual Studio Code
+#### 使用 Visual Studio Code 运行
-To run the project with Visual Studio Code you will first need to open the repository directory with Visual Studio Code using the `Open Folder...` option.
+要使用 Visual Studio Code 运行项目,您首先需要使用`打开文件夹...` 选项,用 Visual Studio Code 打开仓库目录。
-Second, you need to [install the recommended extensions for the workspace](https://code.visualstudio.com/docs/editor/extension-gallery#_recommended-extensions). Note that extension recommendations are classified as either "Workspace Recommendations" or "Other Recommendations", but only the "Workspace Recommendations" are required.
+其次,您需要[安装工作空间推荐扩展](https://code.visualstudio.com/docs/editor/extension-gallery#_recommended-extensions) 。请注意,扩展推荐分为“工作空间推荐”和“其他推荐”两类,但仅需要“工作空间推荐”。
-After the required extensions are installed, you can run the server by pressing `F5`.
+安装所需扩展后,您可以通过按下 `F5` 来运行服务器。
-#### Running From The Command Line
+#### 从命令行运行
-To run the server from the command line you can use the `dotnet run` command. The example below shows how to do this if you have cloned the repository into a directory named `jellyfin` (the default directory name) and should work on all operating systems.
+要从命令行运行服务器,您可以使用 `dotnet run` 命令。以下示例展示了如果您已将仓库克隆到名为 `jellyfin`(默认目录名)的目录中,应该如何操作,并且应在所有操作系统上有效。
```bash
cd jellyfin # Move into the repository directory
dotnet run --project Jellyfin.Server --webdir /absolute/path/to/jellyfin-web/dist # Run the server startup project
```
-A second option is to build the project and then run the resulting executable file directly. When running the executable directly you can easily add command line options. Add the `--help` flag to list details on all the supported command line options.
+第二种选项是先构建项目,然后直接运行生成的可执行文件。直接运行可执行文件时,您可以轻松添加命令行选项。添加 `--help` 标志可以列出所有支持的命令行选项的详细信息。
-1. Build the project
+1. 构建项目
```bash
dotnet build # Build the project
cd Jellyfin.Server/bin/Debug/net7.0 # Change into the build output directory
```
-2. Execute the build output. On Linux, Mac, etc. use `./jellyfin` and on Windows use `jellyfin.exe`.
+2. 执行构建输出。在 Linux、Mac 等系统上,使用 `./jellyfin`,在 Windows 上使用 `jellyfin.exe`。
-### Running The Tests
+### 运行测试
-This repository also includes unit tests that are used to validate functionality as part of a CI pipeline on Azure. There are several ways to run these tests.
+此存储库还包括用于在 Azure 上的 CI 管道中验证功能的单元测试。有几种方法可以运行这些测试。
-1. Run tests from the command line using `dotnet test`
-2. Run tests in Visual Studio using the [Test Explorer](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer)
-3. Run individual tests in Visual Studio Code using the associated [CodeLens annotation](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests)
+1. 使用 `dotnet test` 从命令行运行测试
+2. 使用[测试资源管理器](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer)在 Visual Studio 中运行测试
+3. 使用相关的 [CodeLens 批注](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests)在 Visual Studio Code 中运行单个测试
-### Advanced Configuration
+### 高级配置
-The following sections describe some more advanced scenarios for running the server from source that build upon the standard instructions above.
+以下章节描述了从源代码运行服务器的一些更高级场景,这些场景基于上述标准说明。
-#### Hosting The Web Client Separately
+#### 单独托管 Web 客户端
-It is not necessary to host the frontend web client as part of the backend server. Hosting these two components separately may be useful for frontend developers who would prefer to host the client in a separate webpack development server for a tighter development loop. See the [jellyfin-web](https://github.com/jellyfin/jellyfin-web#getting-started) repo for instructions on how to do this.
+没有必要将前端 Web 客户端作为后端服务器的一部分进行托管。将这两个组件分别托管可能对希望在前端开发服务器中单独托管客户端以实现更紧密的开发循环的前端开发者来说很有用。有关如何操作的说明,请参阅 [jellyfin-web](https://github.com/jellyfin/jellyfin-web#getting-started) 仓库。
-To instruct the server not to host the web content, there is a `nowebclient` configuration flag that must be set. This can specified using the command line
-switch `--nowebclient` or the environment variable `JELLYFIN_NOWEBCONTENT=true`.
+要指示服务器不托管网页内容,必须设置一个 `nowebclient` 配置标志。这可以通过命令行开关 `--nowebclient` 或环境变量 `JELLYFIN_NOWEBCONTENT=true` 来指定。
-Since this is a common scenario, there is also a separate launch profile defined for Visual Studio called `Jellyfin.Server (nowebcontent)` that can be selected from the 'Start Debugging' dropdown in the main toolbar.
+由于这是一个常见场景,还有一个单独的 Visual Studio 启动配置文件,称为 `Jellyfin.Server (nowebcontent)` ,可以从主工具栏的“开始调试”下拉菜单中选择。
-**NOTE:** The setup wizard can not be run if the web client is hosted separately.
+**注意:** 如果网页客户端是单独托管的,则无法运行设置向导。
----
-
-This project is supported by:
-
-
-
-
-
-
+* * *
+
+本项目由以下组织支持:
+[](https://www.digitalocean.com) [](https://www.jetbrains.com)
\ No newline at end of file
diff --git a/apps/jellyfin/README_en.md b/apps/jellyfin/README_en.md
new file mode 100644
index 000000000..2362741b4
--- /dev/null
+++ b/apps/jellyfin/README_en.md
@@ -0,0 +1,176 @@
+
+
+---
+
+Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest!
+
+For further details, please see [our documentation page](https://jellyfin.org/docs/). To receive the latest updates, get help with Jellyfin, and join the community, please visit [one of our communication channels](https://jellyfin.org/docs/general/getting-help). For more information about the project, please see our [about page](https://jellyfin.org/docs/general/about).
+
+Want to get started?
+Check out our downloads page or our installation guide, then see our quick start guide. You can also build from source.
+
+Something not working right?
+Open an Issue on GitHub.
+
+Want to contribute?
+Check out our contributing choose-your-own-adventure to see where you can help, then see our contributing guide and our community standards.
+
+New idea or improvement?
+Check out our feature request hub.
+
+Don't see Jellyfin in your language?
+Check out our Weblate instance to help translate Jellyfin and its subprojects.
+
+
+
+
+
+---
+
+## Jellyfin Server
+
+This repository contains the code for Jellyfin's backend server. Note that this is only one of many projects under the Jellyfin GitHub [organization](https://github.com/jellyfin/) on GitHub. If you want to contribute, you can start by checking out our [documentation](https://jellyfin.org/docs/general/contributing/index.html) to see what to work on.
+
+## Server Development
+
+These instructions will help you get set up with a local development environment in order to contribute to this repository. Before you start, please be sure to completely read our [guidelines on development contributions](https://jellyfin.org/docs/general/contributing/development.html). Note that this project is supported on all major operating systems except FreeBSD, which is still incompatible.
+
+### Prerequisites
+
+Before the project can be built, you must first install the [.NET 7.0 SDK](https://dotnet.microsoft.com/download/dotnet) on your system.
+
+Instructions to run this project from the command line are included here, but you will also need to install an IDE if you want to debug the server while it is running. Any IDE that supports .NET 6 development will work, but two options are recent versions of [Visual Studio](https://visualstudio.microsoft.com/downloads/) (at least 2022) and [Visual Studio Code](https://code.visualstudio.com/Download).
+
+[ffmpeg](https://github.com/jellyfin/jellyfin-ffmpeg) will also need to be installed.
+
+### Cloning the Repository
+
+After dependencies are installed you will need to clone a local copy of this repository. If you just want to run the server from source you can clone this repository directly, but if you are intending to contribute code changes to the project, you should [set up your own fork](https://jellyfin.org/docs/general/contributing/development.html#set-up-your-copy-of-the-repo) of the repository. The following example shows how you can clone the repository directly over HTTPS.
+
+```bash
+git clone https://github.com/jellyfin/jellyfin.git
+```
+
+### Installing the Web Client
+
+The server is configured to host the static files required for the [web client](https://github.com/jellyfin/jellyfin-web) in addition to serving the backend by default. Before you can run the server, you will need to get a copy of the web client since they are not included in this repository directly.
+
+Note that it is also possible to [host the web client separately](#hosting-the-web-client-separately) from the web server with some additional configuration, in which case you can skip this step.
+
+There are three options to get the files for the web client.
+
+1. Download one of the finished builds from the [Azure DevOps pipeline](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27). You can download the build for a specific release by looking at the [branches tab](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=27&_a=summary&repositoryFilter=6&view=branches) of the pipelines page.
+2. Build them from source following the instructions on the [jellyfin-web repository](https://github.com/jellyfin/jellyfin-web)
+3. Get the pre-built files from an existing installation of the server. For example, with a Windows server installation the client files are located at `C:\Program Files\Jellyfin\Server\jellyfin-web`
+
+### Running The Server
+
+The following instructions will help you get the project up and running via the command line, or your preferred IDE.
+
+#### Running With Visual Studio
+
+To run the project with Visual Studio you can open the Solution (`.sln`) file and then press `F5` to run the server.
+
+#### Running With Visual Studio Code
+
+To run the project with Visual Studio Code you will first need to open the repository directory with Visual Studio Code using the `Open Folder...` option.
+
+Second, you need to [install the recommended extensions for the workspace](https://code.visualstudio.com/docs/editor/extension-gallery#_recommended-extensions). Note that extension recommendations are classified as either "Workspace Recommendations" or "Other Recommendations", but only the "Workspace Recommendations" are required.
+
+After the required extensions are installed, you can run the server by pressing `F5`.
+
+#### Running From The Command Line
+
+To run the server from the command line you can use the `dotnet run` command. The example below shows how to do this if you have cloned the repository into a directory named `jellyfin` (the default directory name) and should work on all operating systems.
+
+```bash
+cd jellyfin # Move into the repository directory
+dotnet run --project Jellyfin.Server --webdir /absolute/path/to/jellyfin-web/dist # Run the server startup project
+```
+
+A second option is to build the project and then run the resulting executable file directly. When running the executable directly you can easily add command line options. Add the `--help` flag to list details on all the supported command line options.
+
+1. Build the project
+
+```bash
+dotnet build # Build the project
+cd Jellyfin.Server/bin/Debug/net7.0 # Change into the build output directory
+```
+
+2. Execute the build output. On Linux, Mac, etc. use `./jellyfin` and on Windows use `jellyfin.exe`.
+
+### Running The Tests
+
+This repository also includes unit tests that are used to validate functionality as part of a CI pipeline on Azure. There are several ways to run these tests.
+
+1. Run tests from the command line using `dotnet test`
+2. Run tests in Visual Studio using the [Test Explorer](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer)
+3. Run individual tests in Visual Studio Code using the associated [CodeLens annotation](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests)
+
+### Advanced Configuration
+
+The following sections describe some more advanced scenarios for running the server from source that build upon the standard instructions above.
+
+#### Hosting The Web Client Separately
+
+It is not necessary to host the frontend web client as part of the backend server. Hosting these two components separately may be useful for frontend developers who would prefer to host the client in a separate webpack development server for a tighter development loop. See the [jellyfin-web](https://github.com/jellyfin/jellyfin-web#getting-started) repo for instructions on how to do this.
+
+To instruct the server not to host the web content, there is a `nowebclient` configuration flag that must be set. This can specified using the command line
+switch `--nowebclient` or the environment variable `JELLYFIN_NOWEBCONTENT=true`.
+
+Since this is a common scenario, there is also a separate launch profile defined for Visual Studio called `Jellyfin.Server (nowebcontent)` that can be selected from the 'Start Debugging' dropdown in the main toolbar.
+
+**NOTE:** The setup wizard can not be run if the web client is hosted separately.
+
+---
+
+This project is supported by:
+
+
+
+
+
+
diff --git a/apps/joplin/README.md b/apps/joplin/README.md
index ae555d7db..2afbc06c7 100644
--- a/apps/joplin/README.md
+++ b/apps/joplin/README.md
@@ -1,6 +1,7 @@
# 使用说明
-- 默认账户密码
+* 默认账户密码
+
```
username:admin@localhost
password:admin
@@ -8,314 +9,303 @@ password:admin
# 原始相关
-
[](https://www.paypal.com/donate/?business=E8JMYD2LQ8MMA&no_recurring=0&item_name=I+rely+on+donations+to+maintain+and+improve+the+Joplin+open+source+project.+Thank+you+for+your+help+-+it+makes+a+difference%21¤cy_code=EUR) [](https://github.com/sponsors/laurent22/) [](https://www.patreon.com/joplin) [](https://joplinapp.org/donate/#donations)
-
- **Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
+Joplin 是一个免费的开源笔记和待办事项应用程序,可以处理大量组织在笔记本中的笔记。笔记可以搜索、复制、标记和修改,既可以从中应用程序直接操作,也可以从您自己的文本编辑器操作。笔记以 [Markdown 格式](#markdown) 存储。
-Notes exported from Evernote [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
+Evernote 导出的笔记可以导入 Joplin,包括格式化的内容(转换为 Markdown)、资源(图片、附件等)和完整的元数据(地理位置、更新时间、创建时间等)。纯 Markdown 文件也可以导入。
-The notes can be securely [synchronised](#synchronisation) using [end-to-end encryption](#encryption) with various cloud services including Nextcloud, Dropbox, OneDrive and [Joplin Cloud](https://joplinapp.org/plans/).
+笔记可以通过 [端到端加密](#encryption) 安全地与 Nextcloud、Dropbox、OneDrive 和 [Joplin Cloud](https://joplinapp.org/plans/) 等各种云服务同步。
-Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own.
+所有平台上都支持全文搜索,以便快速找到您需要的信息。该应用程序可以通过插件和主题进行自定义,您也可以轻松创建自己的自定义设置。
-The application is available for Windows, Linux, macOS, Android and iOS. A [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB).
+该应用程序适用于 Windows、Linux、macOS、Android 和 iOS。此外,Firefox 和 Chrome 浏览器还提供了名为的网页和屏幕截图保存工具。
-
+
-# Installation
+# 安装
-Three types of applications are available: for **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS, Linux and FreeBSD). All the applications have similar user interfaces and can synchronise with each other.
+有三种类型的应用程序:适用于桌面(Windows、macOS 和 Linux)、适用于移动设备(Android 和 iOS)以及适用于终端(Windows、macOS、Linux 和 FreeBSD)。所有应用程序具有相似的用户界面,并且可以相互同步。
-## Desktop applications
+## 桌面应用程序
-Operating System | Download
----|---
-Windows (32 and 64-bit) |
-macOS |
-Linux |
+| 操作系统 | 下载 |
+| --- | --- |
+| Windows(32 位和 64 位) | |
+| macOS | |
+| Linux | |
-**On Windows**, you may also use the Portable version. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
+在 Windows 上,你也可以使用 [便携版](https://objects.joplinusercontent.com/v2.11.11/JoplinPortable.exe?source=JoplinWebsite&type=New) 。便携应用程序允许将软件安装在便携设备(如 USB 驱动器)上。只需将 JoplinPortable.exe 文件复制到 USB 驱动器上的任意目录;应用程序随后会在可执行文件旁边创建一个名为 "JoplinProfile" 的目录。
-**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
+在 Linux 上,推荐使用以下安装脚本,因为它还会处理桌面图标:
-
By default, the application binary will be installed under `~/.joplin-bin`. You may change this directory if needed. Alternatively, if your npm permissions are setup as described [here](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory) (Option 2) then simply running `npm -g install joplin` would work.
+| 操作系统 | 方法 |
+| --- | --- |
+| macOS、Linux 或 Windows(通过 WSL) | 重要: 首先,请安装 Node 12+。NPM_CONFIG_PREFIX=~/.joplin-bin npm install -g joplinsudo ln -s ~/.joplin-bin/bin/joplin /usr/bin/joplin默认情况下,应用程序二进制文件将安装在 ~/.joplin-bin 目录下。如果需要,您可以更改此目录。或者,如果您按照 此处 (选项 2)描述的 npm 权限设置,则只需运行 npm -g install joplin 即可。 |
-To start it, type `joplin`.
+要启动它,请输入 `joplin`。
-For usage information, please refer to the full [Joplin Terminal Application Documentation](https://joplinapp.org/terminal/).
+如需使用信息,请参阅完整的 [Joplin 终端应用程序文档](https://joplinapp.org/terminal/) 。
-## Web Clipper
+## 网页剪辑器
-The Web Clipper is a browser extension that allows you to save web pages and screenshots from your browser. For more information on how to install and use it, see the [Web Clipper Help Page](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md).
+Web 剪辑器是浏览器扩展程序,允许您从浏览器中保存网页和屏幕截图。如需安装和使用方法,请参阅 [Web 剪辑器帮助页面](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) 。
-## Unofficial Alternative Distributions
+## 非官方替代发行版
-There are a number of unofficial alternative Joplin distributions. If you do not want to or cannot use appimages or any of the other officially supported releases then you may wish to consider these.
+存在一些非官方的 Joplin 替代发行版。如果你不想或不能使用 appimages 或其他任何官方支持的版本,那么你可能希望考虑这些发行版。
-However these come with a caveat in that they are not officially supported so certain issues may not be supportable by the main project. Rather support requests, bug reports and general advice would need to go to the maintainers of these distributions.
+然而,这些发行版带有警告,即它们没有官方支持,因此某些问题可能无法得到主要项目的支持。相反,支持请求、错误报告和一般建议需要提交给这些发行版的维护者。
-A community maintained list of these distributions can be found here: [Unofficial Joplin distributions](https://discourse.joplinapp.org/t/unofficial-alternative-joplin-distributions/23703)
+这些发行版的社区维护列表可以在这里找到: [非官方 Joplin 发行版](https://discourse.joplinapp.org/t/unofficial-alternative-joplin-distributions/23703)
-# Sponsors
+# 赞助商
-
-
-
+[](https://seirei.ne.jp) [](https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-webseite&mtm_medium=banner) [](https://residence-greece.com/) [](https://grundstueckspreise.info/) [](https://tranio.com/spain/) [](https://citricsheep.com)
* * *
-
-| | | | |
-| :---: | :---: | :---: | :---: |
-| [avanderberg](https://github.com/avanderberg) | [chr15m](https://github.com/chr15m) | [CyberXZT](https://github.com/CyberXZT) | [dbrandonjohnson](https://github.com/dbrandonjohnson) |
-| [dchecks](https://github.com/dchecks) | [fats](https://github.com/fats) | [fourstepper](https://github.com/fourstepper) | [Hegghammer](https://github.com/Hegghammer) |
-| [iamwillbar](https://github.com/iamwillbar) | [jknowles](https://github.com/jknowles) | [KentBrockman](https://github.com/KentBrockman) | [kianenigma](https://github.com/kianenigma) |
-| [konishi-t](https://github.com/konishi-t) | [marcdw1289](https://github.com/marcdw1289) | [matmoly](https://github.com/matmoly) | [maxtruxa](https://github.com/maxtruxa) |
-| [mcejp](https://github.com/mcejp) | [saarantras](https://github.com/saarantras) | [sif](https://github.com/sif) | [taskcruncher](https://github.com/taskcruncher) |
-| [tateisu](https://github.com/tateisu) | | | |
-
-
-
-# Table of contents
-
-- Applications
-
- - [Desktop application](https://github.com/laurent22/joplin/blob/dev/readme/desktop.md)
- - [Mobile applications](https://github.com/laurent22/joplin/blob/dev/readme/mobile.md)
- - [Terminal application](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md)
- - [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md)
-
-- Support
-
- - [Joplin Forum](https://discourse.joplinapp.org)
- - [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md)
- - [How to enable end-to-end encryption](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md)
- - [What is a conflict?](https://github.com/laurent22/joplin/blob/dev/readme/conflict.md)
- - [How to enable debug mode](https://github.com/laurent22/joplin/blob/dev/readme/debugging.md)
- - [About the Rich Text editor limitations](https://github.com/laurent22/joplin/blob/dev/readme/rich_text_editor.md)
- - [External links](https://github.com/laurent22/joplin/blob/dev/readme/external_links.md)
- - [FAQ](https://github.com/laurent22/joplin/blob/dev/readme/faq.md)
-
-- Joplin Cloud
-
- - [Sharing a notebook](https://github.com/laurent22/joplin/blob/dev/readme/share_notebook.md)
- - [Publishing a note](https://github.com/laurent22/joplin/blob/dev/readme/publish_note.md)
- - [Email to Note](https://github.com/laurent22/joplin/blob/dev/readme/email_to_note.md)
-
-- Joplin API - Get Started
-
- - [Joplin API Overview](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md)
- - [Plugin development](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md)
- - [Plugin tutorial](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md)
-
-
-- Joplin API - References
-
- - [Plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html)
- - [Data API](https://github.com/laurent22/joplin/blob/dev/readme/api/references/rest_api.md)
- - [Plugin manifest](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_manifest.md)
- - [Plugin loading rules](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_loading_rules.md)
- - [Plugin theming](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_theming.md)
-
-- Development
-
- - [How to build the apps](https://github.com/laurent22/joplin/blob/dev/BUILD.md)
- - [Writing a technical spec](https://github.com/laurent22/joplin/blob/dev/readme/technical_spec.md)
- - [Desktop application styling](https://github.com/laurent22/joplin/blob/dev/readme/spec/desktop_styling.md)
- - [Note history spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/history.md)
- - [Synchronisation spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync.md)
- - [Sync Lock spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_lock.md)
- - [Synchronous Scroll spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_scroll.md)
- - [Overall Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/architecture.md)
- - [Plugin Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/plugins.md)
- - [Search Sorting spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md)
- - [E2EE: Technical spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md)
- - [E2EE: Workflow](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee/workflow.md)
- - [Server: File URL Format](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_file_url_format.md)
- - [Server: Delta Sync](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_delta_sync.md)
- - [Server: Sharing](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md)
- - [Read-only items](https://github.com/laurent22/joplin/blob/dev/readme/spec/read_only.md)
+| | | | |
+| --- | --- | --- | --- |
+| avanderberg | chr15m | CyberXZT | dbrandonjohnson |
+| dchecks | fats | 四步进器 | Hegghammer |
+| iamwillbar | jknowles | KentBrockman | kianenigma |
+| konishi-t | marcdw1289 | matmoly | maxtruxa |
+| mcejp | saarantras | sif | taskcruncher |
+| 比例 | | | |
+
+# 目录
+
+* 应用程序
+
+ * [桌面应用程序](https://github.com/laurent22/joplin/blob/dev/readme/desktop.md)
+ * [移动应用程序](https://github.com/laurent22/joplin/blob/dev/readme/mobile.md)
+ * [终端应用](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md)
+ * [网页剪辑器](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md)
+* 支持
+
+ * [Joplin 论坛](https://discourse.joplinapp.org)
+ * [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md)
+ * [如何启用端到端加密](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md)
+ * [什么是冲突?](https://github.com/laurent22/joplin/blob/dev/readme/conflict.md)
+ * [如何启用调试模式](https://github.com/laurent22/joplin/blob/dev/readme/debugging.md)
+ * [Rich Text 编辑器的限制](https://github.com/laurent22/joplin/blob/dev/readme/rich_text_editor.md)
+ * [外部链接](https://github.com/laurent22/joplin/blob/dev/readme/external_links.md)
+ * [常见问题](https://github.com/laurent22/joplin/blob/dev/readme/faq.md)
+* Joplin 云
+
+ * [共享笔记本](https://github.com/laurent22/joplin/blob/dev/readme/share_notebook.md)
+ * [发布便签](https://github.com/laurent22/joplin/blob/dev/readme/publish_note.md)
+ * [邮件转笔记](https://github.com/laurent22/joplin/blob/dev/readme/email_to_note.md)
+* Joplin API - 快速上手
+
+ * [Joplin API 概览](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md)
+ * [插件开发](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md)
+ * [插件教程](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md)
+* Joplin API - 参考资料
+
+ * [插件 API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html)
+ * [数据 API](https://github.com/laurent22/joplin/blob/dev/readme/api/references/rest_api.md)
+ * [插件清单](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_manifest.md)
+ * [插件加载规则](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_loading_rules.md)
+ * [插件主题化](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_theming.md)
+* 开发
+
+ * [如何构建应用](https://github.com/laurent22/joplin/blob/dev/BUILD.md)
+ * [编写技术规范](https://github.com/laurent22/joplin/blob/dev/readme/technical_spec.md)
+ * [桌面应用程序样式化](https://github.com/laurent22/joplin/blob/dev/readme/spec/desktop_styling.md)
+ * [注释历史规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/history.md)
+ * [同步规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync.md)
+ * [同步锁规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_lock.md)
+ * [同步滚动规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_scroll.md)
+ * [整体架构规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/architecture.md)
+ * [插件架构规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/plugins.md)
+ * [搜索排序规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md)
+ * [端到端加密:技术规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md)
+ * [E2EE:工作流](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee/workflow.md)
+ * [服务器: 文件 URL 格式](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_file_url_format.md)
+ * [服务器: 差异同步](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_delta_sync.md)
+ * [服务器: 共享](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md)
+ * [只读项](https://github.com/laurent22/joplin/blob/dev/readme/spec/read_only.md)
+* Google Summer of Code 2022
+
+ * [Google 夏令营 2022](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/index.md)
+ * [如何提交 GSoC 拉取请求](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/pull_request_guidelines.md)
+ * [项目想法](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/ideas.md)
+* 关于
+
+ * [桌面应用变更日志](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
+ * [更新日志(Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
+ * [iOS 变更日志](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
+ * [命令行应用变更日志](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
+ * [更新日志(服务器)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
+ * [设计原则](https://github.com/laurent22/joplin/blob/dev/readme/principles.md)
+ * [数据统计](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
+ * [品牌指南](https://joplinapp.org/brand)
+ * [捐赠](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)
+
+# 功能
+
+* 桌面、移动和终端应用程序。
+* [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) 适用于 Firefox 和 Chrome。
+* 端到端加密(E2EE)。
+* 笔记历史(修订)。
+* 与 Nextcloud、Dropbox、WebDAV 和 OneDrive 等多种服务同步。
+* 离线优先,因此即使没有互联网连接,设备上的所有数据也始终可用。
+* 导入 Enex 文件(Evernote 导出格式)和 Markdown 文件。
+* 导出 JEX 文件(Joplin 导出格式)和原始文件。
+* 支持笔记、待办事项、标签和笔记本。
+* 可根据多个标准对笔记进行排序——标题、更新时间等。
+* 支持提醒(通知)功能,适用于移动和桌面应用程序。
+* 支持 Markdown 格式的笔记,在桌面和移动应用程序中会以图片和格式呈现。支持额外功能,如数学公式和复选框。
+* 支持选择 Markdown 和富文本(WYSIWYG)编辑器。
+* 文件附件支持 - 图片直接显示,其他文件链接可打开,并在相应应用程序中打开。
+* PDF、视频和音频文件的内联显示。
+* Goto Anything 功能。
+* 搜索功能。
+* 地理位置支持。
+* 支持多种语言。
+* 外部编辑器支持 - 在 Joplin 中点击一下即可打开笔记到您喜欢的外部编辑器。
+* 通过插件和数据 API 扩展功能。
+* 支持自定义 CSS,可用于自定义渲染的 Markdown 和整体用户界面。
+* 可自定义布局,允许切换、移动和调整各种元素的大小。
+* 键盘快捷键可编辑,并允许绑定大多数 Joplin 命令,具有导出/导入功能。
+* 多配置文件支持。
+
+# 导入
+
+## 从 Evernote 导入
+
+Joplin 是为替代 Evernote 设计的,因此可以导入完整的 Evernote 笔记本,以及笔记、标签、资源(附加文件)和笔记元数据(如作者、地理位置等)通过 ENEX 文件。从数据角度来看,只有两项可能会略有不同:
+
+* 识别数据 - 特别是扫描(或拍摄)的文档,Evernote 会与它们关联识别数据。这是 Evernote 在文档中识别出的文本。当笔记导入 Joplin 时,这些数据不会被保留。然而,如果将来在搜索工具或其他 Joplin 部分支持这项功能,由于实际的图片仍然可用,应该可以重新生成这些识别数据。
+
+* 颜色、字体大小和字体类型 - Evernote 中的文本存储为 HTML 格式,在导入过程中会转换为 Markdown。对于主要由纯文本或基本格式(加粗、斜体、项目符号、链接等)组成的笔记,这种转换是无损的,一旦重新渲染为 HTML 格式,笔记应该与原始格式非常相似。表格也会被导入并转换为 Markdown 表格。对于非常复杂的笔记,可能会丢失一些格式数据,特别是颜色、字体大小和字体类型不会被导入。然而,文本本身总是会完整地被导入,无论其格式如何。如果需要保留这些额外的数据,Joplin 也允许导入 ENEX 文件为 HTML 格式。
+
+
+要导入 Evernote 数据,请首先按照此处 [描述](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks) 将 Evernote 笔记本导出为 ENEX 文件。然后按照以下步骤操作:
+
+在 **桌面应用程序** 中,打开“文件”>“导入”>“ENEX”,并选择您的文件。笔记将被导入到一个新的独立笔记本中。如果需要,可以将笔记移动到不同的笔记本,或重命名笔记本等。
+
+在终端应用中,在命令行模式下输入 `import /path/to/file.enex`。这将把笔记导入一个以文件名命名的新笔记本。
+
+## 从 Markdown 文件导入
+
+Joplin 可以从普通的 Markdown 文件导入笔记。你可以导入整个 Markdown 文件目录,也可以导入单独的文件。
-- Google Summer of Code 2022
+在**桌面应用程序**中:
- - [Google Summer of Code 2022](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/index.md)
- - [How to submit a GSoC pull request](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/pull_request_guidelines.md)
- - [Project Ideas](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/ideas.md)
+* **文件导入** : 请转到文件 > 导入 > MD - Markdown (文件),然后选择要导入的 Markdown 文件。该文件将被导入到当前选中的笔记本中。
+* **目录导入** : 请转到文件 > 导入 > MD - Markdown (目录),然后选择要导入的目录的顶层目录。导入的目录结构将在 Joplin 中的笔记本 > 子笔记本 > 笔记结构中得以保留。
-- About
+在 **终端应用** 中,在 [命令行模式](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode) 下,输入 `import --format md /path/to/file.md` 或 `import --format md /path/to/directory/` 。
- - [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
- - [Changelog (Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
- - [Changelog (iOS)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
- - [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
- - [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
- - [Guiding principles](https://github.com/laurent22/joplin/blob/dev/readme/principles.md)
- - [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
- - [Brand guidelines](https://joplinapp.org/brand)
- - [Donate](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)
-
+## 从其他应用导入
-# Features
+一般来说,将任何应用程序中的笔记导入 Joplin 的方法是将笔记转换为 ENEX 文件(Evernote 格式),然后使用上述方法导入这些 ENEX 文件。大多数笔记应用程序都支持 ENEX 文件,因此操作应该相对简单。对于特定应用程序的帮助,请参见以下内容:
-- Desktop, mobile and terminal applications.
-- [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) for Firefox and Chrome.
-- End To End Encryption (E2EE).
-- Note history (revisions).
-- Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.
-- Offline first, so the entire data is always available on the device even without an internet connection.
-- Import Enex files (Evernote export format) and Markdown files.
-- Export JEX files (Joplin Export format) and raw files.
-- Support notes, to-dos, tags and notebooks.
-- Sort notes by multiple criteria - title, updated time, etc.
-- Support for alarms (notifications) in mobile and desktop applications.
-- Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.
-- Choice of both Markdown and Rich Text (WYSIWYG) editors.
-- File attachment support - images are displayed, other files are linked and can be opened in the relevant application.
-- Inline display of PDF, video and audio files.
-- Goto Anything feature.
-- Search functionality.
-- Geo-location support.
-- Supports multiple languages.
-- External editor support - open notes in your favorite external editor with one click in Joplin.
-- Extensible functionality through plugin and data APIs.
-- Custom CSS support for customisation of both the rendered markdown and overall user interface.
-- Customisable layout allows toggling, movement and sizing of various elements.
-- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
-- Multiple profile support.
+* Standard Notes:请参见 [此教程](https://programadorwebvalencia.com/migrate-notes-from-standard-notes-to-joplin/)
+* Tomboy Notes:将笔记导出为 ENEX 文件(如 [此处所述](https://askubuntu.com/questions/243691/how-can-i-export-my-tomboy-notes-into-evernote/608551) ),然后将这些 ENEX 文件导入 Joplin。
+* OneNote:首先 [将 OneNote 中的笔记导入 Evernote](https://discussion.evernote.com/topic/107736-is-there-a-way-to-import-from-onenote-into-evernote-on-the-mac/)。然后从 Evernote 导出 ENEX 文件并将其导入 Joplin。
+* NixNote:与 Evernote 同步后,导出 ENEX 文件并导入 Joplin。更多信息请参见[该帖子](https://discourse.joplinapp.org/t/import-from-nixnote/183/3) 。
-# Importing
+# 导出
-## Importing from Evernote
+Joplin 可以导出为 JEX 格式(Joplin 导出文件),这是一种 tar 文件,可以包含多个笔记、笔记本等。这是一种无损格式,所有笔记以及元数据(如地理位置、更新时间、标签等)都会被保留。这种格式便于备份,并且可以重新导入到 Joplin 中。还提供了一种“原始”格式。这种格式与 JEX 格式相同,只是数据保存在一个目录中,每个项目由单个文件表示。Joplin 还可以导出为其他格式,包括 HTML 和 PDF,可以针对单个笔记、笔记本或所有内容进行导出。
-Joplin was designed as a replacement for Evernote and so can import complete Evernote notebooks, as well as notes, tags, resources (attached files) and note metadata (such as author, geo-location, etc.) via ENEX files. In terms of data, the only two things that might slightly differ are:
+# 同步
-- Recognition data - Evernote images, in particular scanned (or photographed) documents have [recognition data](https://en.wikipedia.org/wiki/Optical_character_recognition) associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.
+Joplin 的一个目标是避免绑定到任何特定的公司或服务,无论是 Evernote、Google 还是 Microsoft。因此,同步设计时没有依赖于任何特定的服务。同步过程大多在抽象层次上进行,访问外部服务(如 Nextcloud 或 Dropbox)是通过轻量级驱动程序完成的。通过创建简单的提供类似文件系统接口的驱动程序,可以轻松支持新的服务,即提供读取、写入、删除和列出项的能力。还可以轻松地从一个服务切换到另一个服务,甚至可以同时同步到多个服务。在同步过程中,每个笔记、笔记本、标签以及项目之间的关系都以纯文本文件的形式传输,这意味着数据也可以转移到其他应用程序,可以轻松备份、检查等。
-- Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting. If it is essential that this extra data is preserved then Joplin also allows import of ENEX files as HTML.
+目前,与 Nextcloud、WebDAV、Dropbox、OneDrive 或本地文件系统同步是可能的。要启用同步,请按照以下说明操作。之后,应用程序将在运行时在后台自动同步,或者您可以点击“同步”以手动开始同步。Joplin 会在本地应用程序做出任何内容更改后自动后台同步。
-To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps:
+如果已安装了**终端客户端** ,还可以通过在终端中输入 `joplin sync` 来在用户界面之外进行同步。这可以用于设置一个 cron 脚本,在固定的时间间隔内进行同步。例如,这会每 30 分钟执行一次:
-In the **desktop application**, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.
+`*/30 * * * * /path/to/joplin sync`
-In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import /path/to/file.enex`. This will import the notes into a new notebook named after the filename.
+## Nextcloud 同步
-## Importing from Markdown files
+[Nextcloud](https://nextcloud.com/) 是一个自托管的私有云解决方案。它可以存储文档、图片和视频,也可以存储日历、密码以及其他无数种事物,并可以将其同步到你的笔记本电脑或手机上。由于你可以托管自己的 Nextcloud 服务器,因此你既拥有设备上的数据,也拥有用于同步的基础设施。因此,它非常适合 Joplin。该平台还得到了良好的支持,并且拥有强大的社区,所以它很可能会长期存在——由于它是开源的,所以不会被关闭,可以在服务器上一直运行下去,只要有人愿意。
-Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.
+在 **桌面应用程序** 或 **移动应用程序** 中,进入 [配置界面](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) ,选择 Nextcloud 作为同步目标。然后输入 WebDAV 地址(在页面左下角的设置中可以找到,通常为 `https://example.com/nextcloud/remote.php/webdav/Joplin` ),请确保在 Nextcloud 中创建一个名为“Joplin”的目录,然后设置用户名和密码。如果不起作用,请参阅 [此处的说明](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) 以获取更多详细信息。
-In the **desktop application**:
-* **File import**: Go to File > Import > MD - Markdown (file) and select the Markdown file. This file will then be imported to the currently selected Notebook.
-* **Directory import**: Go to File > Import > MD - Markdown (directory) and select the top level of the directory that is being imported. Directory (folder) structure will be preserved in the Notebook > Subnotebook > Note structure within Joplin.
+在终端应用中,您需要设置 `sync.target` 配置变量以及所有 `sync.5.path`、`sync.5.username` 和 `sync.5.password` 配置变量,分别对应 Nextcloud WebDAV 的 URL、您的用户名和密码。这可以通过命令行模式使用以下方式完成:
-In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`.
+```
+:config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
+:config sync.5.username YOUR_USERNAME
+:config sync.5.password YOUR_PASSWORD
+:config sync.target 5
+```
-## Importing from other applications
+如果同步不工作,请查看应用配置文件目录中的日志,通常是因为 URL 或密码配置错误。日志会指出具体的问题。
-In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:
+## WebDAV 同步
-* Standard Notes: Please see [this tutorial](https://programadorwebvalencia.com/migrate-notes-from-standard-notes-to-joplin/)
-* Tomboy Notes: Export the notes to ENEX files [as described here](https://askubuntu.com/questions/243691/how-can-i-export-my-tomboy-notes-into-evernote/608551) for example, and import these ENEX files into Joplin.
-* OneNote: First [import the notes from OneNote into Evernote](https://discussion.evernote.com/topic/107736-is-there-a-way-to-import-from-onenote-into-evernote-on-the-mac/). Then export the ENEX file from Evernote and import it into Joplin.
-* NixNote: Synchronise with Evernote, then export the ENEX files and import them into Joplin. More info [in this thread](https://discourse.joplinapp.org/t/import-from-nixnote/183/3).
+选择“WebDAV”同步目标,并遵循上述 Nextcloud 的相同步骤(对于终端应用,您需要选择同步目标 6 而不是 5)。
-# Exporting
+与 Joplin 兼容的 WebDAV 兼容服务:
-Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.
-Joplin is also capable of exporting to a number of other formats including HTML and PDF which can be done for single notes, notebooks or everything.
+* [Apache WebDAV 模块](https://httpd.apache.org/docs/current/mod/mod_dav.html)
+* [DriveHQ](https://www.drivehq.com)
+* [Fastmail](https://www.fastmail.com/)
+* [HiDrive](https://www.strato.fr/stockage-en-ligne/) 来自 Strato。 [安装帮助](https://github.com/laurent22/joplin/issues/309)
+* [Nginx WebDAV 模块](https://nginx.org/en/docs/http/ngx_http_dav_module.html)
+* [Nextcloud](https://nextcloud.com/)
+* [OwnCloud](https://owncloud.org/)
+* [Seafile](https://www.seafile.com/)
+* [Stack](https://www.transip.nl/stack/)
+* [Synology WebDAV 服务器](https://www.synology.com/en-us/dsm/packages/WebDAVServer)
+* [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/),一个 macOS 服务器。
+* [Zimbra](https://www.zimbra.com/)
-# Synchronisation
+## Dropbox 同步
-One of the goals of Joplin is to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
+在与 Dropbox 同步时,Joplin 会在 Dropbox 中创建一个子目录,在 ``/Apps/Joplin`` 中读写笔记和笔记本。应用程序不会访问此目录之外的任何内容。
-Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application.
+在 **桌面应用** 或 **移动应用** 中,选择“Dropbox”作为同步目标(默认已选中)。然后,要启动同步过程,请在侧边栏中点击“同步”按钮并按照提示操作。
-If the **terminal client** has been installed, it is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:
+在终端应用程序中,要启动同步过程,请输入 `:sync`。您将被要求点击一个链接以授权该应用程序。
-` */30 * * * * /path/to/joplin sync`
+## OneDrive 同步
-## Nextcloud synchronisation
+在与 OneDrive 同步时,Joplin 会在 OneDrive 中创建一个子目录,路径为 /Apps/Joplin,并在此目录中读取和写入笔记和笔记本。该应用程序不会访问此目录之外的任何内容。
-Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
+在桌面应用程序或移动应用程序中,选择“OneDrive”作为同步目标,在 [配置界面](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) 中。然后,要启动同步过程,请点击侧边栏中的“同步”按钮并按照指示操作。
-In the **desktop application** or **mobile application**, go to the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details.
+在**终端应用**中,要启动同步过程,请输入 `:sync`。系统会要求您点击链接进行授权(只需输入您的 Microsoft 凭证 - 您无需注册 OneDrive 即可)。
-In the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:
+## S3 同步
- :config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
- :config sync.5.username YOUR_USERNAME
- :config sync.5.password YOUR_PASSWORD
- :config sync.target 5
+从 Joplin 2.x.x 版本开始,Joplin 支持多个 S3 提供商。我们将提供一些需要根据您选择的提供商进行配置的选项。我们已经测试了 UpCloud、AWS 和 Linode,其他提供商也应该可以正常工作。
-If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.
+在**桌面应用**或**移动应用**中,选择“S3(测试版)”作为同步目标,在[配置界面](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md)中进行设置。
-## WebDAV synchronisation
+* **S3 Bucket:** 桶的名称,例如 `joplin-bucket`
+* **S3 URL:** 完整的 URL;对于 AWS,应为 `https://s3..amazonaws.com/`
+* **S3 Access Key & S3 Secret Key:** 用户的编程访问密钥。要在 AWS 上创建新的密钥和密钥,请访问 [IAM 安全凭证](https://console.aws.amazon.com/iam/home#/security_credentials) 。对于其他提供商,请遵循其文档。
+* **S3 Region:** 一些提供商要求您提供桶所在的区域。这通常以“eu-west1”或类似的形式表示,具体取决于您的区域。对于不需要指定区域的提供商,您可以留空。
+* **强制路径风格** : 此设置使 Joplin 能够使用较旧的 S3 路径风格与 S3 提供商进行通信。根据您的提供商,您可能需要尝试开启和关闭此设置。
-Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above (for the **terminal application** you will need to select sync target 6 rather than 5)
+在为 Joplin 创建新的存储桶时,请禁用**存储桶版本控制** ,启用**阻止所有公共访问** ,并启用**默认加密** ,加密方式为 `Amazon S3 密钥(SSE-S3)`。一些提供商不提供这些选项,可能会导致同步问题。请尝试并反馈,以便我们更新文档。
-WebDAV-compatible services that are known to work with Joplin:
+要在 AWS S3 Web 控制台中添加**存储桶策略** ,请导航到**权限**选项卡。暂时禁用**阻止所有公共访问**以编辑存储桶策略,类似于以下内容:
-- [Apache WebDAV Module](https://httpd.apache.org/docs/current/mod/mod_dav.html)
-- [DriveHQ](https://www.drivehq.com)
-- [Fastmail](https://www.fastmail.com/)
-- [HiDrive](https://www.strato.fr/stockage-en-ligne/) from Strato. [Setup help](https://github.com/laurent22/joplin/issues/309)
-- [Nginx WebDAV Module](https://nginx.org/en/docs/http/ngx_http_dav_module.html)
-- [Nextcloud](https://nextcloud.com/)
-- [OwnCloud](https://owncloud.org/)
-- [Seafile](https://www.seafile.com/)
-- [Stack](https://www.transip.nl/stack/)
-- [Synology WebDAV Server](https://www.synology.com/en-us/dsm/packages/WebDAVServer)
-- [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/), a macOS server.
-- [Zimbra](https://www.zimbra.com/)
-
-## Dropbox synchronisation
-
-When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in `/Apps/Joplin` and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
-
-In the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
-
-In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application.
-
-## OneDrive synchronisation
-
-When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
-
-In the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
-
-In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
-
-## S3 synchronisation
-
-As of Joplin 2.x.x, Joplin supports multiple S3 providers. We expose some options that will need to be configured depending on your provider of choice. We have tested with UpCloud, AWS, and Linode. others should work as well.
-
-In the **desktop application** or **mobile application**, select "S3 (Beta)" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
-
-- **S3 Bucket:** The name of your Bucket, such as `joplin-bucket`
-- **S3 URL:** Fully qualified URL; For AWS this should be `https://s3..amazonaws.com/`
-- **S3 Access Key & S3 Secret Key:** The User's programmatic access key. To create a new key & secret on AWS, visit [IAM Security Credentials](https://console.aws.amazon.com/iam/home#/security_credentials). For other providers follow their documentation.
-- **S3 Region:** Some providers require you to provide the region of your bucket. This is usually in the form of "eu-west1" or something similar depending on your region. For providers that do not require a region, you can leave it blank.
-- **Force Path Style**: This setting enables Joplin to talk to S3 providers using an older style S3 Path. Depending on your provider you may need to try with this on and off.
-
-
-While creating a new Bucket for Joplin, disable **Bucket Versioning**, enable **Block all public access** and enable **Default encryption** with `Amazon S3 key (SSE-S3)`. Some providers do not expose these options, and it could create a syncing problem. Do attempt and report back so we can update the documentation appropriately.
-
-To add a **Bucket Policy** from the AWS S3 Web Console, navigate to the **Permissions** tab. Temporarily disable **Block all public access** to edit the Bucket policy, something along the lines of:
```
{
"Version": "2012-10-17",
@@ -340,213 +330,215 @@ To add a **Bucket Policy** from the AWS S3 Web Console, navigate to the **Permis
}
```
-### Configuration settings for tested providers
+### 已测试提供商的配置设置
-All providers will require a bucket, Access Key, and Secret Key.
+所有提供商都需要一个存储桶、访问密钥和密钥。
-If you provide a configuration and you receive "success!" on the "check config" then your S3 sync should work for your provider. If you do not receive success, you may need to adjust your settings, or save them, restart the app, and attempt a sync. This may reveal more clear error messaging that will help you deduce the problem.
+如果提供了配置并在“检查配置”中收到“success!”,那么您的 S3 同步应该可以正常工作。如果没有收到成功消息,您可能需要调整设置,或者保存设置、重启应用并尝试同步。这可能会揭示更清晰的错误信息,帮助您找出问题所在。
### AWS
-- URL: `https://s3..amazonaws.com/` (fill in your region, a complete list of endpoint adresses can be found [here](https://docs.aws.amazon.com/general/latest/gr/s3.html))
-- Region: required
-- Force Path Style: unchecked
+
+* URL: `https://s3..amazonaws.com/` (填入您的区域,完整的端点地址列表可以在这里找到 [这里](https://docs.aws.amazon.com/general/latest/gr/s3.html) )
+* 区域: 必填
+* 强制路径样式: 未选中
### Linode
-- URL: `https://.linodeobjects.com` (region is in the URL provided by Linode; this URL is also the same as the URL provided by Linode with the bucket name removed)
-- Region: Anything you want to type, can't be left empty
-- Force Path Style: unchecked
+
+* URL: `https://.linodeobjects.com` (区域在 Linode 提供的 URL 中;此 URL 也与移除桶名后的 Linode 提供的 URL 相同)
+* 区域: 你想输入的内容不能为空
+* 强制路径样式: 未选中
### UpCloud
-- URL: `https://..upcloudobjects.com` (They will provide you with multiple URLs, the one that follows this pattern should work.)
-- Region: required
-- Force Path Style: unchecked
-# Encryption
+* URL: `https://..upcloudobjects.com` (他们会提供给你多个 URL,符合这个模式的应该有效。)
+* 区域: 必填
+* 强制路径样式: 未选中
-Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the [End-To-End Encryption Tutorial](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md) for more information about this feature and how to enable it.
+# 加密
-For a more technical description, mostly relevant for development or to review the method being used, please see the [Encryption specification](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md).
+Joplin 在所有应用程序中支持端到端加密(E2EE)。E2EE 是一种系统,只有笔记、笔记本、标签或资源的所有者才能阅读它们。这可以防止潜在的窃听者——包括电信提供商、互联网提供商,甚至 Joplin 的开发者——无法访问数据。请参阅 [端到端加密教程](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md) 以获取更多关于此功能及其启用方法的信息。
-# Note history
+对于更详细的描述,主要适用于开发或审查所使用的方法,请参阅 [加密规范](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md) 。
-The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the "Information" button on a note, then click on "Previous version of this note". From this screen you can view the previous versions of the note as well as restore any of them.
+# 历史记录
-This feature can be disabled from the "Note history" section in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), and it is also possible to change for how long the history of a note is saved.
+Joplin 应用程序会定期自动保存笔记的先前版本。这些版本会在设备之间同步,并且可以从桌面应用程序中查看。要查看这些版本,请点击笔记上的“信息”按钮,然后点击“此笔记的先前版本”。从这个界面,您可以查看笔记的先前版本并恢复其中任何一个版本。
-More information please see the [Note History page](https://github.com/laurent22/joplin/blob/dev/readme/note_history.md).
+此功能可以在“配置屏幕”的“笔记历史”部分禁用,并且还可以更改笔记历史保存的时间长度。
-# External text editor
+更多信息请参见“笔记历史”页面。
-Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under "Text editor command".
+# 外部文本编辑器
-# Attachments
+Joplin 笔记可以使用您选择的外部编辑器打开和编辑。这可以是一个简单的文本编辑器,如 Notepad++ 或 Sublime Text,也可以是一个实际的 Markdown 编辑器,如 Typora。在这种情况下,图片也会在编辑器中显示。要使用外部编辑器打开笔记,请点击工具栏中的图标或按 Ctrl+E(或 Cmd+E)。默认的文本编辑器将用于打开笔记。如果需要,您也可以在“文本编辑器命令”下直接指定编辑器。
-Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment, clicking on this link will open the file in the default application. In the case of audio, video and pdf files, these will be displayed inline with the note and so can be viewed or played within Joplin.
+# 附件
-In the **desktop application**, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.
+任何类型的文件都可以附加到一个笔记中。在 Markdown 中,这些文件的链接表示为一个简单的附件 ID,点击这个链接将在默认应用程序中打开文件。对于音频、视频和 PDF 文件,这些文件将在笔记中嵌入显示,因此可以在 Joplin 中查看或播放。
-Resources that are not attached to any note will be automatically deleted in accordance to the [Note History](#note-history) settings.
+在 **桌面应用程序** 中,可以通过点击编辑器中的“附加文件”图标或通过拖放来附加文件。如果你更愿意创建一个指向本地文件的链接,可以在执行拖放操作时按住 ALT 键。你也可以通过 Ctrl+V 将图片直接粘贴到编辑器中。
-**Important:** Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.
+未附加到任何笔记中的资源将根据 [笔记历史](#note-history) 设置自动删除。
-## Downloading attachments
+**重要:** 目前,大小超过 10 MB 的资源在移动设备上不被支持。在同步时它们会导致应用程序崩溃,因此目前建议不要附加此类资源。这个问题正在被解决。
-The way the attachments are downloaded during synchronisation can be customised in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), under "Attachment download behaviour". The default option ("Always") is to download all the attachments, all the time, so that the data is available even when the device is offline. There is also the option to download the attachments manually (option "Manual"), by clicking on it, or automatically (Option "Auto"), in which case the attachments are downloaded only when a note is opened. These options should help saving disk space and network bandwidth, especially on mobile.
+## 下载附件
-# Notifications
+在同步过程中下载附件的方式可以在[配置屏幕](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md)下的“附件下载行为”中进行自定义。默认选项(“始终”)是始终下载所有附件,这样即使在设备离线时数据也是可用的。还可以选择手动下载(选项“手动”),通过点击触发,或者自动下载(选项“自动”),在这种情况下,只有在打开笔记时才会下载附件。这些选项有助于节省磁盘空间和网络带宽,特别是在移动设备上。
-In the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:
+# 通知
-- **Windows**: >= 8. Make sure the Action Center is enabled on Windows. Task bar balloon for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
-- **macOS**: >= 10.8 or Growl if earlier.
-- **Linux**: `notify-send` tool, delivered through packages `notify-osd`, `libnotify-bin` or `libnotify-tools`. GNOME should have this by default, but install `libnotify-tools` if using KDE Plasma.
+在桌面和移动应用程序中,可以将任何待办事项与警报关联。该警报将在指定时间通过显示通知来触发。通知的显示方式取决于操作系统,因为每个操作系统处理这种方式的方式不同。请参阅以下桌面应用程序的要求:
-See [documentation and flow chart for reporter choice](https://github.com/mikaelbr/node-notifier/blob/master/DECISION_FLOW.md)
+* **Windows**: >= 8. 确保在 Windows 中启用了行动中心。Windows 任务栏气球 < 8. 作为备选方案使用 Growl。Growl 优先于 Windows 气球。
+* macOS: >= 10.8 或 Growl(如果更早)。
+* Linux: `notify-send` 工具,通过软件包 `notify-osd`、`libnotify-bin` 或 `libnotify-tools` 提供。GNOME 默认包含此工具,但如果使用 KDE Plasma,请安装 `libnotify-tools`。
-On mobile, the alarms will be displayed using the built-in notification system.
+请参阅 [报告者选择的文档和流程图](https://github.com/mikaelbr/node-notifier/blob/master/DECISION_FLOW.md)
-If for any reason the notifications do not work, please [open an issue](https://github.com/laurent22/joplin/issues).
+在移动设备上,警报将使用内置的通知系统显示。
-# Sub-notebooks
+如果通知不工作,请[提交问题](https://github.com/laurent22/joplin/issues) 。
-Sub-notebooks allow organising multiple notebooks into a tree of notebooks. For example it can be used to regroup all the notebooks related to work, to family or to a particular project under a parent notebook.
+# 子笔记本
+
+子笔记本允许将多个笔记本组织成笔记本树。例如,可以将所有与工作、家庭或特定项目相关的笔记本归类到一个父笔记本下。

-- In the **desktop application**, to create a subnotebook, drag and drop it onto another notebook. To move it back to the root, drag and drop it on the "Notebooks" header. Currently only the desktop app can be used to organise the notebooks.
-- The **mobile application** supports displaying and collapsing/expanding the tree of notebooks, however it does not currently support moving the subnotebooks to different notebooks.
-- The **terminal app** supports displaying the tree of subnotebooks but it does not support collapsing/expanding them or moving the subnotebooks around.
+* 在**桌面应用程序**中,要创建子笔记本,请将其拖放到另一个笔记本上。要将其移回根目录,请将其拖放到“笔记本”标题上。目前只有桌面应用程序可以用于组织笔记本。
+* 在**移动应用程序**中,支持显示和折叠/展开笔记本树,但目前不支持将子笔记本移动到不同的笔记本中。
+* 终端应用支持显示子笔记本树结构,但不支持折叠/展开它们或移动子笔记本。
# Markdown
-Joplin uses and renders a Github-flavoured Markdown with a few variations and additions. In particular it adds math formula support, interactive checkboxes and support for note links. Joplin also supports Markdown plugins which allow enabling and disabling various advanced Markdown features. Have a look at the [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md) for more information.
+Joplin 使用并渲染一种带有少量变体和扩展的 Github 风格的 Markdown。特别是它增加了数学公式支持、交互式复选框和笔记链接支持。Joplin 还支持 Markdown 插件,允许启用和禁用各种高级 Markdown 功能。请参阅 [Markdown 指南](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md) 以获取更多信息。
-# Custom CSS
+# 自定义 CSS
-Rendered markdown can be customized by placing a userstyle file in the profile directory `~/.config/joplin-desktop/userstyle.css` (This path might be different on your device - check at the top of the `General` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) for the exact path). This file supports standard CSS syntax. Joplin ***must*** be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).
+渲染的 Markdown 可以通过在配置文件目录中放置用户样式文件来自定义 `~/.config/joplin-desktop/userstyle.css` (此路径在您的设备上可能不同,请在 [配置屏幕](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) 的 `通用` 页面顶部检查确切路径)。此文件支持标准 CSS 语法。Joplin ***必须*** 重启以应用新的 CSS,确保 Joplin 真正退出而不是仅最小化到托盘中。请注意,此文件同时用于显示笔记和打印笔记。请注意 CSS 在打印时可能的外观(例如,打印白色文本在黑色背景上通常不是想要的效果)。
-The whole UI can be customized by placing a custom editor style file in the profile directory `~/.config/joplin-desktop/userchrome.css`.
+整个 UI 可以通过在配置目录中放置自定义编辑器样式文件来自定义 `~/.config/joplin-desktop/userchrome.css` 。
-Important: userstyle.css and userchrome.css are provided for your convenience, but they are advanced settings, and styles you define may break from one version to the next. If you want to use them, please know that it might require regular development work from you to keep them working. The Joplin team cannot make a commitment to keep the application HTML structure stable.
+重要提示:userstyle.css 和 userchrome.css 是为了方便提供的,但它们是高级设置,您定义的样式可能会在不同版本之间失效。如果您打算使用它们,请了解这可能需要您定期进行开发工作来保持它们的正常运行。Joplin 团队无法保证应用程序的 HTML 结构保持稳定。
-# Plugins
+# 插件
-The **desktop app** has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin [plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html) and can be installed & configured within the application via the `Plugins` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
+桌面应用可以通过插件扩展其标准功能。这些插件遵循 Joplin 的 [插件 API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html),并通过应用中的 `插件` 页面在 [配置屏幕](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) 中进行安装和配置。
-From this menu you can search for plugins uploaded to the [Joplin plugins](https://github.com/joplin/plugins) repository as well as manual installation of plugins using a 'Joplin Plugin Archive' (*.jpl) file.
-Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.
+从这个菜单中,您可以搜索上传到 [Joplin 插件](https://github.com/joplin/plugins) 仓库的插件,也可以使用 'Joplin 插件存档' (*.jpl) 文件手动安装插件。
+重新加载应用程序后,插件将出现在插件菜单中,可以在其中启用/禁用或完全移除这些插件。
-For more information see [Plugins](https://github.com/laurent22/joplin/blob/dev/readme/plugins.md)
+更多信息,请参见[插件]
-# Searching
+# 搜索
-Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both [Simple FTS Queries](https://www.sqlite.org/fts3.html#simple_fts_queries) and [Full-Text Index Queries](https://www.sqlite.org/fts3.html#full_text_index_queries) are supported. See below for the list of supported queries:
+Joplin 实现了 SQLite 全文搜索(FTS4)扩展。这意味着所有笔记的内容会实时索引,搜索查询会非常快速地返回结果。支持[简单全文查询]和[全文索引查询]。以下为支持的查询列表:
-One caveat of SQLite FTS is that it does not support languages which do not use Latin word boundaries (spaces, tabs, punctuation). To solve this issue, Joplin has a custom search mode, that does not use FTS, but still has all of its features (multi term search, filters, etc.). One of its drawbacks is that it can get slow on larger note collections. Also, the sorting of the results will be less accurate, as the ranking algorithm (BM25) is, for now, only implemented for FTS. Finally, in this mode there are no restrictions on using the `*` wildcard (`swim*`, `*swim` and `ast*rix` all work). This search mode is currently enabled if one of the following languages are detected:
- - Chinese
- - Japanese
- - Korean
- - Thai
+SQLite FTS 的一个限制是它不支持不使用拉丁词边界(空格、制表符、标点符号)的语言。为了解决这个问题,Joplin 提供了一种自定义搜索模式,该模式不使用 FTS,但仍保留了所有功能(多词搜索、过滤器等)。其缺点之一是在较大的笔记集合中可能会变慢。此外,结果的排序也会不够准确,因为目前排名算法(BM25)仅实现了对 FTS 的支持。最后,在这种模式下,可以使用通配符 ``*``(``swim*``、````*swim` 和 ``ast*rix`` 都有效)。当前,如果检测到以下语言之一,此搜索模式将被启用:```
-## Supported queries
+* 中文
+* 日文
+* 韩文
+* 泰语
-Search type | Description | Example
-------------|-------------|---------
-Single word | Returns all the notes that contain this term. | For example, searching for `cat` will return all the notes that contain this exact word. Note: it will not return the notes that contain the substring - thus, for "cat", notes that contain "cataclysmic" or "prevaricate" will **not** be returned.
-Multiple word | Returns all the notes that contain **all** these words, but not necessarily next to each other. | `dog cat` - will return any notes that contain the words "dog" and "cat" anywhere in the note, no necessarily in that order nor next to each other. It will **not** return results that contain "dog" or "cat" only.
-Phrase | Add double quotes to return the notes that contain exactly this phrase. | `"shopping list"` - will return the notes that contain these **exact terms** next to each other and in this order. It will **not** return for example a note that contains "going shopping with my list".
-Prefix | Add a wildcard to return all the notes that contain a term with a specified prefix. | `swim*` - will return all the notes that contain eg. "swim", but also "swimming", "swimsuit", etc. IMPORTANT: The wildcard **can only be at the end** - it will be ignored at the beginning of a word (eg. `*swim`) and will be treated as a literal asterisk in the middle of a word (eg. `ast*rix`)
-Switch to basic search | One drawback of Full Text Search is that it ignores most non-alphabetical characters. However in some cases you might want to search for this too. To do that, you can use basic search. You switch to this mode by prefixing your search with a slash `/`. This won't provide the benefits of FTS but it will allow searching exactly for what you need. Note that it can also be much slower, even extremely slow, depending on your query. | `/"- [ ]"` - will return all the notes that contain unchecked checkboxes.
+## 支持的查询
-## Search filters
-
-You can also use search filters to further restrict the search.
-
-| Operator | Description | Example |
+| 查询类型 | 描述 | 示例 |
| --- | --- | --- |
-|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`. `office -trash` searches for all notes with the word `office` and without the word `trash`.|
-|**any:**|Return notes that satisfy any/all of the required conditions. `any:0` is the default, which means all conditions must be satisfied.|`any:1 cat dog` will return notes that have the word `cat` or `dog`. `any:0 cat dog` will return notes with both the words `cat` and `dog`. |
-| **title:** **body:**|Restrict your search to just the title or the body field.|`title:"hello world"` searches for notes whose title contains `hello` and `world`. `title:hello -body:world` searches for notes whose title contains `hello` and body does not contain `world`.
-| **tag:** |Restrict the search to the notes with the specified tags.|`tag:office` searches for all notes having tag office. `tag:office tag:important` searches for all notes having both office and important tags. `tag:office -tag:spam` searches for notes having tag `office` which do not have tag `spam`. `any:1 tag:office tag:spam` searches for notes having tag `office` or tag `spam`. `tag:be*ful` does a search with wildcards. `tag:*` returns all notes with tags. `-tag:*` returns all notes without tags.|
-| **notebook:** | Restrict the search to the specified notebook(s). |`notebook:books` limits the search scope within `books` and all its subnotebooks. `notebook:wheel*time` does a wildcard search.|
-| **created:** **updated:** **due:**| Searches for notes created/updated on dates specified using YYYYMMDD format. You can also search relative to the current day, week, month, or year. | `created:20201218` will return notes created on or after December 18, 2020. `-updated:20201218` will return notes updated before December 18, 2020. `created:20200118 -created:20201215` will return notes created between January 18, 2020, and before December 15, 2020. `created:202001 -created:202003` will return notes created on or after January and before March 2020. `updated:1997 -updated:2020` will return all notes updated between the years 1997 and 2019. `created:day-2` searches for all notes created in the past two days. `updated:year-0` searches all notes updated in the current year. `-due:day+7` will return all todos which are due or will be due in the next seven days. `-due:day-5` searches all todos that are overdue for more than 5 days.|
-| **type:** |Restrict the search to either notes or todos. | `type:note` to return all notes `type:todo` to return all todos |
-| **iscompleted:** | Restrict the search to either completed or uncompleted todos. | `iscompleted:1` to return all completed todos `iscompleted:0` to return all uncompleted todos|
-|**latitude:** **longitude:** **altitude:**|Filter by location|`latitude:40 -latitude:50` to return notes with latitude >= 40 and < 50 |
-|**resource:**|Filter by attachment MIME type|`resource:image/jpeg` to return notes with a jpeg attachment. `-resource:application/pdf` to return notes without a pdf attachment. `resource:image/*` to return notes with any images.|
-|**sourceurl:**|Filter by source URL|`sourceurl:https://www.google.com` `sourceurl:*joplinapp.org` to perform a wildcard search.|
-|**id:**|Filter by note ID|`id:9cbc1b4f242043a9b8a50627508bccd5` return a note with the specified id |
+| 单个词 | 包含此术语的所有便签。 | 例如,搜索 `cat` 将返回包含此确切单词的所有便签。注意:它不会返回包含该子字符串的便签——因此,“cat”不会返回包含“cataclysmic”或“prevaricate”的便签。 |
+| 多个词 | 包含所有这些单词的所有便签,但不一定相邻。 | dog cat - 将返回包含“dog”和“cat”这两个词的任何笔记,但不一定按这个顺序或相邻出现。它将不返回只包含“dog”或“cat”其中之一的结果。 |
+| 短语 | 在需要时添加双引号,以返回包含这些**确切词语**且顺序不变的笔记。 | "shopping list" - 将返回包含这些确切词语且顺序不变的笔记。它将不返回例如包含“going shopping with my list”的笔记。 |
+| 前缀 | 添加通配符以返回包含指定前缀的所有笔记。 | swim* - 将返回包含“swim”等的所有笔记,例如“swimming”、“swimsuit”等。重要提示:通配符只能位于末尾 - 在单词开头(例如 *swim)时将被忽略,并且在单词中间(例如 ast*rix)将被视为一个实际的星号。 |
+| 切换到基本搜索 | 全文搜索的一个缺点是它会忽略大多数非字母字符。然而,在某些情况下,你可能也需要搜索这些字符。要实现这一点,你可以使用基本搜索。通过在搜索前加上斜杠 `/`(/)来切换到这种模式。这不会提供全文搜索的好处,但它可以让你精确地搜索你需要的内容。请注意,这可能会导致搜索速度大幅下降,甚至非常慢,这取决于你的查询。 | /"- [ ]" - 将返回包含未选中复选框的所有笔记。 |
-Note: In the CLI client you have to escape the query using `--` when using negated filters.
-Eg. `:search -- "-tag:tag1"`.
+## 搜索过滤器
-The filters are implicitly connected by and/or connectives depending on the following rules:
+你还可以使用搜索过滤器进一步限制搜索范围。
-- By default, all filters are connected by "AND".
-- To override this default behaviour, use the `any` filter, in which case the search terms will be connected by "OR" instead.
-- There's an exception for the `notebook` filters which are connected by "OR". The reason being that no note can be in multiple notebooks at once.
+| 操作符 | 描述 | 示例 |
+| --- | --- | --- |
+| - | 如果放在文本术语之前,它会排除包含该术语的注释。你也可以将其放在过滤器之前以否定该过滤器。 | `-spam` 搜索所有不包含单词 `spam` 的注释。`office -trash` 搜索所有包含单词 `office` 但不包含单词 `trash` 的注释。 |
+| any: | 返回满足任意/所有必需条件的注释。any:0 是默认值,表示所有条件都必须满足。 | any:1 cat dog 将返回包含单词 cat 或 dog 的笔记。any:0 cat dog 将返回同时包含单词 cat 和 dog 的注释。 |
+| 标题: 主体: | 将搜索范围限制为仅标题或正文字段。 | title:"hello world" 搜索标题包含 hello 和 world 的笔记。title:hello -body:world 搜索标题包含 hello 且正文不包含 world 的笔记。 |
+| 标签: | 限制搜索范围为指定标签的笔记。 | tag:office 搜索所有带有标签 office 的笔记。tag:office tag:important 搜索同时带有 office 和 important 标签的所有笔记。tag:office -tag:spam 搜索带有 tag office 但不带有 tag spam 的笔记。any:1 tag:office tag:spam 搜索带有 tag office 或 tag spam 的笔记。tag:be*ful 使用通配符进行搜索。tag:* 返回所有带有标签的笔记。-tag:* 返回所有不带标签的笔记。 |
+| 笔记本: | 限制搜索范围为指定的笔记本。 | notebook:books 将搜索范围限制在 books 以及其所有子笔记本内。notebook:wheel*time 进行通配符搜索。 |
+| 创建时间: updated: 到期时间: | 使用 YYYYMMDD 格式指定日期创建或更新的笔记。您也可以相对于当前日期、周、月或年进行搜索。 | created:20201218 将返回 2020 年 12 月 18 日或之后创建的笔记。-updated:20201218 将返回 2020 年 12 月 18 日之前更新的笔记。 created:20200118 -created:20201215 将返回2020年1月18日至2020年12月14日之间创建的笔记。 created:202001 -created:202003 将返回2020年1月至2020年2月之间创建的笔记。updated:1997 -updated:2020 将返回 1997 年至 2019 年之间更新的所有笔记。created:day-2 搜索最近两天内创建的所有笔记。updated:year-0 搜索当前年份内更新的所有笔记。-due:day+7 将返回所有在接下来的七天内到期或即将到期的任务。-due:day-5 搜索所有逾期超过五天的任务。 |
+| 类型: | 将搜索范围限制在笔记或待办事项中。 | 输入 type:note 以返回所有笔记输入 type:todo 以返回所有待办事项 |
+| iscompleted: | 将搜索限制在已完成或未完成的任务中。 | iscompleted:1 用于返回所有已完成的任务iscompleted:0 用于返回所有未完成的任务 |
+| 纬度: 经度: 海拔: | 按位置筛选 | latitude:40 -latitude:50 返回纬度 >= 40 且 < 50 的笔记 |
+| 资源: | 按附件 MIME 类型筛选 | resource:image/jpeg 用于返回带有 jpeg 附件的笔记。-resource:application/pdf 用于返回不带有 pdf 附件的笔记。resource:image/* 用于返回包含任何图片的笔记。 |
+| 源链接: | 按源 URL 过滤 | sourceurl:https://www.google.comsourceurl:*joplinapp.org 进行通配符搜索。 |
+| ID: | 按笔记 ID 过滤 | id:9cbc1b4f242043a9b8a50627508bccd5 返回指定 id 的笔记 |
-Incorrect search filters are interpreted as a phrase search, e.g. misspelled `nootebook:Example` or non-existing `https://joplinapp.org`.
+注意:在命令行客户端中,使用否定过滤器时需要使用 `--` 转义查询。例如:`:search -- "-tag:tag1"`。
-## Search order
+过滤器默认通过“AND”连接,具体连接方式取决于以下规则:
-Notes are sorted by "relevance". Currently it means the notes that contain the requested terms the most times are on top. For queries with multiple terms, it also matters how close to each other the terms are. This is a bit experimental so if you notice a search query that returns unexpected results, please report it in the forum, providing as many details as possible to replicate the issue.
+* 默认情况下,所有过滤器通过“AND”连接。
+* 若要覆盖这种默认行为,请使用 `any` 过滤器,此时搜索项将通过“OR”连接。
+* `notebook` 过滤器有例外情况,它们通过“OR”连接。原因是笔记不能同时存在于多个笔记本中。
+
+错误的搜索过滤条件会被解释为短语搜索,例如拼写错误的 ``nootebook:Example`` 或不存在的 ``https://joplinapp.org``。
+
+## 搜索顺序
+
+笔记按“相关性”排序。目前这意味着包含请求词汇次数最多的笔记排在最前面。对于包含多个词汇的查询,词汇之间的距离也会影响排序。这还处于实验阶段,如果您发现某个搜索查询返回了意外的结果,请在论坛中报告该问题,并尽可能提供详细信息以便重现问题。
# Goto Anything
-In the desktop application, press Ctrl+P or Cmd+P and type a note title or part of its content to jump to it. Or type # followed by a tag name, or @ followed by a notebook name.
+在桌面应用程序中,按下 ` Ctrl+P ` 或 ` Cmd+P `,然后输入笔记标题或部分内容以跳转到该笔记。或者输入 ` # ` 后跟标签名称,或输入 ` @ ` 后跟笔记本名称。
-# Multiple profile support
-
-To create a new profile, open File > Switch profile and select Create new profile, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.
+# 多配置文件支持
-To switch back to the previous profile, again open File > Switch profile and select Default.
+要创建一个新的配置文件,请打开“文件”>“切换配置文件”,然后选择“创建新配置文件”,输入配置文件名称并点击“确定”。应用程序会自动切换到这个新配置文件,你可以对其进行配置。
-Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.
+要切换回之前的配置文件,请再次打开“文件”>“切换配置文件”,然后选择“默认”。
-The feature is available on desktop only for now, and should be ported to mobile relatively soon.
-
-# Donations
+请注意,所有配置文件共享某些设置,例如语言、字体大小、主题等。这样做的目的是在切换配置文件时不需要重新配置每个细节。其他设置,如同步配置,则是针对每个配置文件的。
-Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.
+该功能目前仅在桌面端可用,不久后会移植到移动设备。
-Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/readme/donate.md) for information on how to support the development of Joplin.
+# 捐赠
-# Community
+捐赠给 Joplin 可以支持项目的开发。开发高质量的应用程序主要需要时间,但还有一些费用,例如用于签署应用程序的数字证书、应用商店费用、托管费用等。最重要的是,您的捐赠可以让开发保持当前的标准。
-Name | Description
---- | ---
-[Support Forum](https://discourse.joplinapp.org/) | This is the main place for general discussion about Joplin, user support, software development questions, and to discuss new features. Also where the latest beta versions are released and discussed.
-[Twitter feed](https://twitter.com/joplinapp) | Follow us on Twitter
-[Mastodon feed](https://mastodon.social/@joplinapp) | Follow us on Mastodon
-[Patreon page](https://www.patreon.com/joplin) |The latest news are often posted there
-[Discord server](https://discord.gg/VSj7AFHvpq) | Our chat server
-[LinkedIn](https://www.linkedin.com/company/joplin) | Our LinkedIn page
-[Lemmy Community](https://sopuli.xyz/c/joplinapp) | Also a good place to get help
+请参阅[捐赠页面](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)了解如何支持 Joplin 的开发。
-# Contributing
+# 社区
-Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
+| 名称 | 描述 |
+| --- | --- |
+| 支持论坛 | 这是关于 Joplin 的一般讨论区,用户支持、软件开发问题以及讨论新功能的地方。也是最新测试版本的发布和讨论的地方。 |
+| Twitter 动态 | 在 Twitter 上关注我们 |
+| Mastodon 动态 | 在 Mastodon 上关注我们 |
+| Patreon 页面 | 最新消息通常会发布在那里 |
+| Discord 服务器 | 我们的聊天服务器 |
+| LinkedIn | 我们的 LinkedIn 页面 |
+| Lemmy 社区 | 也是一个获取帮助的好地方 |
-# Localisation
+# 贡献
-Joplin is currently available in the languages below. If you would like to contribute a **new translation**, it is quite straightforward, please follow these steps:
+请参阅指南,了解如何为 Joplin 的开发做出贡献:[https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md](https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md)
-- [Download Poedit](https://poedit.net/), the translation editor, and install it.
-- [Download the file to be translated](https://raw.githubusercontent.com/laurent22/joplin/dev/packages/tools/locales/joplin.pot).
-- In Poedit, open this .pot file, go into the Catalog menu and click Configuration. Change "Country" and "Language" to your own country and language.
-- From then you can translate the file.
-- Once it is done, please [open a pull request](https://github.com/laurent22/joplin/pulls) and add the file to it.
+# 本地化
-This translation will apply to the three applications - desktop, mobile and terminal.
+Joplin 目前提供以下语言版本。如果您希望贡献一种新的翻译,请按照以下步骤操作:
-To **update a translation**, follow the same steps as above but instead of getting the .pot file, get the .po file for your language from the table below.
+* 请下载 Poedit,这是一个翻译编辑器,并进行安装。
+* [下载待翻译的文件](https://raw.githubusercontent.com/laurent22/joplin/dev/packages/tools/locales/joplin.pot) 。
+* 在 Poedit 中,打开这个.pot 文件,进入 Catalog 菜单并点击 Configuration。将“Country”和“Language”改为你的国家和语言。
+* 从那时起,你就可以开始翻译文件了。
+* 完成后,请[提交一个拉取请求](https://github.com/laurent22/joplin/pulls)并将文件添加到其中。
-Current translations:
+此翻译将适用于桌面、移动和终端三个应用程序。
-
- | Language | Po File | Last translator | Percent done
----|---|---|---|---
+要更新翻译,请按照上述步骤操作,但不要获取 .pot 文件,而是从下方表格中获取您语言的 .po 文件。
+
+当前翻译:
+
+| | 语言 | Po 文件 | 最后翻译者 | 完成百分比 |
+| --- | --- | --- | --- | --- |
| Arabic | [ar](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ar.po) | [Whaell O](mailto:Whaell@protonmail.com) | 79%
| Basque | [eu](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/eu.po) | juan.abasolo@ehu.eus | 22%
| Bosnian (Bosna i Hercegovina) | [bs_BA](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/bs_BA.po) | [Derviš T.](mailto:dervis.t@pm.me) | 57%
@@ -588,87 +580,84 @@ Current translations:
| 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/zh_TW.po) | [Kevin Hsu](mailto:kevin.hsu.hws@gmail.com) | 88%
| 日本語 (日本) | [ja_JP](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ja_JP.po) | [genneko](mailto:genneko217@gmail.com) | 88%
| 한국어 | [ko](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ko.po) | [Ji-Hyeon Gim](mailto:potatogim@potatogim.net) | 88%
-
-# Contributors
+# 贡献者
-Thank you to everyone who've contributed to Joplin's source code!
+感谢所有为 Joplin 源代码做出贡献的人!
-
-| | | | | |
-| :---: | :---: | :---: | :---: | :---: |
-| [laurent22](https://github.com/laurent22) | [tessus](https://github.com/tessus) | [CalebJohn](https://github.com/CalebJohn) | [mic704b](https://github.com/mic704b) | [roman-r-m](https://github.com/roman-r-m) |
-| [genneko](https://github.com/genneko) | [j-krl](https://github.com/j-krl) | [tanrax](https://github.com/tanrax) | [naviji](https://github.com/naviji) | [PackElend](https://github.com/PackElend) |
-| [rtmkrlv](https://github.com/rtmkrlv) | [fmrtn](https://github.com/fmrtn) | [potatogim](https://github.com/potatogim) | [devonzuegel](https://github.com/devonzuegel) | [anjulalk](https://github.com/anjulalk) |
-| [gabcoh](https://github.com/gabcoh) | [matsest](https://github.com/matsest) | [abonte](https://github.com/abonte) | [Abijeet](https://github.com/Abijeet) | [ishantgupta777](https://github.com/ishantgupta777) |
-| [JackGruber](https://github.com/JackGruber) | [Ardakilic](https://github.com/Ardakilic) | [rabeehrz](https://github.com/rabeehrz) | [coderrsid](https://github.com/coderrsid) | [foxmask](https://github.com/foxmask) |
-| [innocuo](https://github.com/innocuo) | [Rahulm2310](https://github.com/Rahulm2310) | [readingsnail](https://github.com/readingsnail) | [mablin7](https://github.com/mablin7) | [XarisA](https://github.com/XarisA) |
-| [jonath92](https://github.com/jonath92) | [alexdevero](https://github.com/alexdevero) | [Runo-saduwa](https://github.com/Runo-saduwa) | [marcosvega91](https://github.com/marcosvega91) | [petrz12](https://github.com/petrz12) |
-| [rnbastos](https://github.com/rnbastos) | [ProgramFan](https://github.com/ProgramFan) | [zblesk](https://github.com/zblesk) | [vsimkus](https://github.com/vsimkus) | [moltenform](https://github.com/moltenform) |
-| [nishantwrp](https://github.com/nishantwrp) | [zuphilip](https://github.com/zuphilip) | [Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | [metbril](https://github.com/metbril) | [WhiredPlanck](https://github.com/WhiredPlanck) |
-| [milotype](https://github.com/milotype) | [yaozeye](https://github.com/yaozeye) | [ylc395](https://github.com/ylc395) | [RenatoXSR](https://github.com/RenatoXSR) | [RedDocMD](https://github.com/RedDocMD) |
-| [q1011](https://github.com/q1011) | [amitsin6h](https://github.com/amitsin6h) | [Atalanttore](https://github.com/Atalanttore) | [Mannivu](https://github.com/Mannivu) | [martonpaulo](https://github.com/martonpaulo) |
-| [mmahmoudian](https://github.com/mmahmoudian) | [rccavalcanti](https://github.com/rccavalcanti) | [ShaneKilkelly](https://github.com/ShaneKilkelly) | [sinkuu](https://github.com/sinkuu) | [stweil](https://github.com/stweil) |
-| [conyx](https://github.com/conyx) | [anihm136](https://github.com/anihm136) | [archont00](https://github.com/archont00) | [bradmcl](https://github.com/bradmcl) | [tfinnberg](https://github.com/tfinnberg) |
-| [amandamcg](https://github.com/amandamcg) | [marcushill](https://github.com/marcushill) | [nathanleiby](https://github.com/nathanleiby) | [RaphaelKimmig](https://github.com/RaphaelKimmig) | [Vaso3](https://github.com/Vaso3) |
-| [sensor-freak](https://github.com/sensor-freak) | [lkiThakur](https://github.com/lkiThakur) | [infinity052](https://github.com/infinity052) | [BartBucknill](https://github.com/BartBucknill) | [mrwulf](https://github.com/mrwulf) |
-| [chrisb86](https://github.com/chrisb86) | [chrmoritz](https://github.com/chrmoritz) | [Daeraxa](https://github.com/Daeraxa) | [Elaborendum](https://github.com/Elaborendum) | [ethan42411](https://github.com/ethan42411) |
-| [JOJ0](https://github.com/JOJ0) | [jalajcodes](https://github.com/jalajcodes) | [jblunck](https://github.com/jblunck) | [jdrobertso](https://github.com/jdrobertso) | [Jesssullivan](https://github.com/Jesssullivan) |
-| [jmontane](https://github.com/jmontane) | [johanhammar](https://github.com/johanhammar) | [solariz](https://github.com/solariz) | [maicki](https://github.com/maicki) | [mjjzf](https://github.com/mjjzf) |
-| [rt-oliveira](https://github.com/rt-oliveira) | [sebastienjust](https://github.com/sebastienjust) | [sealch](https://github.com/sealch) | [StarFang208](https://github.com/StarFang208) | [Subhra264](https://github.com/Subhra264) |
-| [SubodhDahal](https://github.com/SubodhDahal) | [TobiasDev](https://github.com/TobiasDev) | [Whaell](https://github.com/Whaell) | [jyuvaraj03](https://github.com/jyuvaraj03) | [kowalskidev](https://github.com/kowalskidev) |
-| [alexchee](https://github.com/alexchee) | [axq](https://github.com/axq) | [barbowza](https://github.com/barbowza) | [eresytter](https://github.com/eresytter) | [lightray22](https://github.com/lightray22) |
-| [lscolombo](https://github.com/lscolombo) | [mrkaato](https://github.com/mrkaato) | [pf-siedler](https://github.com/pf-siedler) | [ruuti](https://github.com/ruuti) | [s1nceri7y](https://github.com/s1nceri7y) |
-| [kornava](https://github.com/kornava) | [ShuiHuo](https://github.com/ShuiHuo) | [ikunya](https://github.com/ikunya) | [Ahmad45123](https://github.com/Ahmad45123) | [bedwardly-down](https://github.com/bedwardly-down) |
-| [dcaveiro](https://github.com/dcaveiro) | [hexclover](https://github.com/hexclover) | [2jaeyeol](https://github.com/2jaeyeol) | [thackeraaron](https://github.com/thackeraaron) | [aaronxn](https://github.com/aaronxn) |
-| [xUser5000](https://github.com/xUser5000) | [iamabhi222](https://github.com/iamabhi222) | [Aksh-Konda](https://github.com/Aksh-Konda) | [alanfortlink](https://github.com/alanfortlink) | [AverageUser2](https://github.com/AverageUser2) |
-| [afischer211](https://github.com/afischer211) | [a13xk](https://github.com/a13xk) | [apankratov](https://github.com/apankratov) | [teterkin](https://github.com/teterkin) | [avanderberg](https://github.com/avanderberg) |
-| [serenitatis](https://github.com/serenitatis) | [lex111](https://github.com/lex111) | [Alkindi42](https://github.com/Alkindi42) | [Jumanjii](https://github.com/Jumanjii) | [AlphaJack](https://github.com/AlphaJack) |
-| [Lord-Aman](https://github.com/Lord-Aman) | [richtwin567](https://github.com/richtwin567) | [ajilderda](https://github.com/ajilderda) | [adrynov](https://github.com/adrynov) | [andrewperry](https://github.com/andrewperry) |
-| [tekdel](https://github.com/tekdel) | [anshuman9999](https://github.com/anshuman9999) | [rasklaad](https://github.com/rasklaad) | [Technik-J](https://github.com/Technik-J) | [Shaxine](https://github.com/Shaxine) |
-| [antonio-ramadas](https://github.com/antonio-ramadas) | [heyapoorva](https://github.com/heyapoorva) | [assimd](https://github.com/assimd) | [Atrate](https://github.com/Atrate) | [Beowulf2](https://github.com/Beowulf2) |
-| [bimlas](https://github.com/bimlas) | [brenobaptista](https://github.com/brenobaptista) | [brttbndr](https://github.com/brttbndr) | [carlbordum](https://github.com/carlbordum) | [carlosedp](https://github.com/carlosedp) |
-| [chaifeng](https://github.com/chaifeng) | [charles-e](https://github.com/charles-e) | [cyy5358](https://github.com/cyy5358) | [Chillu1](https://github.com/Chillu1) | [Techwolf12](https://github.com/Techwolf12) |
-| [cloudtrends](https://github.com/cloudtrends) | [idcristi](https://github.com/idcristi) | [damienmascre](https://github.com/damienmascre) | [daniellandau](https://github.com/daniellandau) | [danil-tolkachev](https://github.com/danil-tolkachev) |
-| [darshani28](https://github.com/darshani28) | [daukadolt](https://github.com/daukadolt) | [NeverMendel](https://github.com/NeverMendel) | [dervist](https://github.com/dervist) | [diego-betto](https://github.com/diego-betto) |
-| [erdody](https://github.com/erdody) | [domgoodwin](https://github.com/domgoodwin) | [b4mboo](https://github.com/b4mboo) | [donbowman](https://github.com/donbowman) | [sirnacnud](https://github.com/sirnacnud) |
-| [dflock](https://github.com/dflock) | [drobilica](https://github.com/drobilica) | [educbraga](https://github.com/educbraga) | [eduardokimmel](https://github.com/eduardokimmel) | [VodeniZeko](https://github.com/VodeniZeko) |
-| [ei-ke](https://github.com/ei-ke) | [einverne](https://github.com/einverne) | [eodeluga](https://github.com/eodeluga) | [fathyar](https://github.com/fathyar) | [fer22f](https://github.com/fer22f) |
-| [fpindado](https://github.com/fpindado) | [FleischKarussel](https://github.com/FleischKarussel) | [talkdirty](https://github.com/talkdirty) | [gmaubach](https://github.com/gmaubach) | [gmag11](https://github.com/gmag11) |
-| [Jackymancs4](https://github.com/Jackymancs4) | [Glandos](https://github.com/Glandos) | [vibraniumdev](https://github.com/vibraniumdev) | [gusbemacbe](https://github.com/gusbemacbe) | [HOLLYwyh](https://github.com/HOLLYwyh) |
-| [Fvbor](https://github.com/Fvbor) | [bennetthanna](https://github.com/bennetthanna) | [harshitkathuria](https://github.com/harshitkathuria) | [Vistaus](https://github.com/Vistaus) | [ianjs](https://github.com/ianjs) |
-| [iahmedbacha](https://github.com/iahmedbacha) | [IrvinDominin](https://github.com/IrvinDominin) | [ishammahajan](https://github.com/ishammahajan) | [ffadilaputra](https://github.com/ffadilaputra) | [JRaiden16](https://github.com/JRaiden16) |
-| [jacobherrington](https://github.com/jacobherrington) | [jamesadjinwa](https://github.com/jamesadjinwa) | [jrwrigh](https://github.com/jrwrigh) | [jaredcrowe](https://github.com/jaredcrowe) | [volatilevar](https://github.com/volatilevar) |
-| [innkuika](https://github.com/innkuika) | [JoelRSimpson](https://github.com/JoelRSimpson) | [joeltaylor](https://github.com/joeltaylor) | [exic](https://github.com/exic) | [JonathanPlasse](https://github.com/JonathanPlasse) |
-| [joesfer](https://github.com/joesfer) | [joybinchen](https://github.com/joybinchen) | [kaustubhsh](https://github.com/kaustubhsh) | [y-usuzumi](https://github.com/y-usuzumi) | [xuhcc](https://github.com/xuhcc) |
-| [kirtanprht](https://github.com/kirtanprht) | [k0ur0x](https://github.com/k0ur0x) | [kklas](https://github.com/kklas) | [xmlangel](https://github.com/xmlangel) | [troilus](https://github.com/troilus) |
-| [lboullo0](https://github.com/lboullo0) | [dbinary](https://github.com/dbinary) | [marc-bouvier](https://github.com/marc-bouvier) | [mvonmaltitz](https://github.com/mvonmaltitz) | [mlkood](https://github.com/mlkood) |
-| [plextoriano](https://github.com/plextoriano) | [Marmo](https://github.com/Marmo) | [mcejp](https://github.com/mcejp) | [freaktechnik](https://github.com/freaktechnik) | [martinkorelic](https://github.com/martinkorelic) |
-| [Petemir](https://github.com/Petemir) | [matsair](https://github.com/matsair) | [mgroth0](https://github.com/mgroth0) | [silentmatt](https://github.com/silentmatt) | [maxs-test](https://github.com/maxs-test) |
-| [MichBoi](https://github.com/MichBoi) | [MichipX](https://github.com/MichipX) | [MrTraduttore](https://github.com/MrTraduttore) | [sanjarcode](https://github.com/sanjarcode) | [Mustafa-ALD](https://github.com/Mustafa-ALD) |
-| [NJannasch](https://github.com/NJannasch) | [zomglings](https://github.com/zomglings) | [Frichetten](https://github.com/Frichetten) | [nicolas-suzuki](https://github.com/nicolas-suzuki) | [Ouvill](https://github.com/Ouvill) |
-| [shorty2380](https://github.com/shorty2380) | [dist3r](https://github.com/dist3r) | [rakleed](https://github.com/rakleed) | [idle-code](https://github.com/idle-code) | [bobchao](https://github.com/bobchao) |
-| [Diadlo](https://github.com/Diadlo) | [pranavmodx](https://github.com/pranavmodx) | [R3dError](https://github.com/R3dError) | [rajprakash00](https://github.com/rajprakash00) | [rahil1304](https://github.com/rahil1304) |
-| [rasulkireev](https://github.com/rasulkireev) | [reinhart1010](https://github.com/reinhart1010) | [Retew](https://github.com/Retew) | [ambrt](https://github.com/ambrt) | [Derkades](https://github.com/Derkades) |
-| [fourstepper](https://github.com/fourstepper) | [rodgco](https://github.com/rodgco) | [Ronnie76er](https://github.com/Ronnie76er) | [roryokane](https://github.com/roryokane) | [ruzaq](https://github.com/ruzaq) |
-| [szokesandor](https://github.com/szokesandor) | [SamuelBlickle](https://github.com/SamuelBlickle) | [livingc0l0ur](https://github.com/livingc0l0ur) | [bronson](https://github.com/bronson) | [semperor](https://github.com/semperor) |
-| [shawnaxsom](https://github.com/shawnaxsom) | [SFoskitt](https://github.com/SFoskitt) | [kcrt](https://github.com/kcrt) | [xissy](https://github.com/xissy) | [tams](https://github.com/tams) |
-| [Tekki](https://github.com/Tekki) | [ThatcherC](https://github.com/ThatcherC) | [TheoDutch](https://github.com/TheoDutch) | [tbroadley](https://github.com/tbroadley) | [Kriechi](https://github.com/Kriechi) |
-| [tkilaker](https://github.com/tkilaker) | [Tim-Erwin](https://github.com/Tim-Erwin) | [tcyrus](https://github.com/tcyrus) | [tobias-grasse](https://github.com/tobias-grasse) | [strobeltobias](https://github.com/strobeltobias) |
-| [kostegit](https://github.com/kostegit) | [tbergeron](https://github.com/tbergeron) | [Ullas-Aithal](https://github.com/Ullas-Aithal) | [MyTheValentinus](https://github.com/MyTheValentinus) | [vassudanagunta](https://github.com/vassudanagunta) |
-| [vijayjoshi16](https://github.com/vijayjoshi16) | [max-keviv](https://github.com/max-keviv) | [vandreykiv](https://github.com/vandreykiv) | [WisdomCode](https://github.com/WisdomCode) | [xsak](https://github.com/xsak) |
-| [ymitsos](https://github.com/ymitsos) | [abolishallprivateproperty](https://github.com/abolishallprivateproperty) | [aerotog](https://github.com/aerotog) | [albertopasqualetto](https://github.com/albertopasqualetto) | [asrient](https://github.com/asrient) |
-| [bestlibre](https://github.com/bestlibre) | [boring10](https://github.com/boring10) | [cadolphs](https://github.com/cadolphs) | [colorchestra](https://github.com/colorchestra) | [cybertramp](https://github.com/cybertramp) |
-| [dartero](https://github.com/dartero) | [delta-emil](https://github.com/delta-emil) | [doc75](https://github.com/doc75) | [dsp77](https://github.com/dsp77) | [ebayer](https://github.com/ebayer) |
-| [elsiehupp](https://github.com/elsiehupp) | [espinosa](https://github.com/espinosa) | [exponentactivity](https://github.com/exponentactivity) | [exprez135](https://github.com/exprez135) | [fab4x](https://github.com/fab4x) |
-| [fabianski7](https://github.com/fabianski7) | [rasperepodvipodvert](https://github.com/rasperepodvipodvert) | [gasolin](https://github.com/gasolin) | [githubaccount073](https://github.com/githubaccount073) | [hms5232](https://github.com/hms5232) |
-| [hydrandt](https://github.com/hydrandt) | [iamtalwinder](https://github.com/iamtalwinder) | [jabdoa2](https://github.com/jabdoa2) | [jduar](https://github.com/jduar) | [jibedoubleve](https://github.com/jibedoubleve) |
-| [johanvanheusden](https://github.com/johanvanheusden) | [jtagcat](https://github.com/jtagcat) | [konhi](https://github.com/konhi) | [krzysiekwie](https://github.com/krzysiekwie) | [lighthousebulb](https://github.com/lighthousebulb) |
-| [luzpaz](https://github.com/luzpaz) | [majsterkovic](https://github.com/majsterkovic) | [mak2002](https://github.com/mak2002) | [nmiquan](https://github.com/nmiquan) | [nullpointer666](https://github.com/nullpointer666) |
-| [oscaretu](https://github.com/oscaretu) | [oskarsh](https://github.com/oskarsh) | [osso73](https://github.com/osso73) | [over-soul](https://github.com/over-soul) | [pensierocrea](https://github.com/pensierocrea) |
-| [pomeloy](https://github.com/pomeloy) | [rhtenhove](https://github.com/rhtenhove) | [rikanotank1](https://github.com/rikanotank1) | [rxliuli](https://github.com/rxliuli) | [simonsan](https://github.com/simonsan) |
-| [stellarpower](https://github.com/stellarpower) | [suixinio](https://github.com/suixinio) | [sumomo-99](https://github.com/sumomo-99) | [xtatsux](https://github.com/xtatsux) | [taw00](https://github.com/taw00) |
-| [tcassaert](https://github.com/tcassaert) | [victante](https://github.com/victante) | [Voltinus](https://github.com/Voltinus) | [xcffl](https://github.com/xcffl) | [yourcontact](https://github.com/yourcontact) |
-| [zaoyifan](https://github.com/zaoyifan) | [zawnk](https://github.com/zawnk) | [zen-quo](https://github.com/zen-quo) | [zozolina123](https://github.com/zozolina123) | [xcession](https://github.com/xcession) |
-| [paventyang](https://github.com/paventyang) | [jackytsu](https://github.com/jackytsu) | [zhangmx](https://github.com/zhangmx) | | |
-
+| | | | | |
+| --- | --- | --- | --- | --- |
+| laurent22 | tessus | CalebJohn | mic704b | roman-r-m |
+| genneko | j-krl | tanrax | naviji | PackElend |
+| rtmkrlv | fmrtn | potatogim | devonzuegel | anjulalk |
+| gabcoh | matsest | abonte | Abijeet | ishantgupta777 |
+| JackGruber | Ardakilic | rabeerz | coderrsid | foxmask |
+| innocuo | Rahulm2310 | readingsnail | mablin7 | XarisA |
+| jonath92 | alexdevero | Runo-saduwa | marcosvega91 | petrz12 |
+| rnbastos | ProgramFan | zblesk | vsimkus | moltenform |
+| nishantwrp | zuphilip | Rishabh-malhotraa | metbril | WhiredPlanck |
+| milotype | 药 ayer | ylc395 | RenatoXSR | RedDocMD |
+| q1011 | amitsin6h | Atalanttore | Mannivu | martonpaulo |
+| mmahmoudian | rccavalcanti | ShaneKilkelly | sinkuu | stweil |
+| conyx | anihm136 | archont00 | bradmcl | tfinnberg |
+| amandamcg | marcushill | nathanleiby | RaphaelKimmig | Vaso3 |
+| sensor-freak | lkiThakur | infinity052 | BartBucknill | mrwulf |
+| chrisb86 | chrmoritz | Daeraxa | 阐述 | ethan42411 |
+| JOJ0 | jalajcodes | jblunck | jdrobertso | Jesssullivan |
+| jmontane | johanhammar | solariz | maicki | mjjzf |
+| rt-oliveira | sebastienjust | sealch | StarFang208 | Subhra264 |
+| SubodhDahal | TobiasDev | Whaell | jyuvaraj03 | kowalskidev |
+| alexchee | axq | barbowza | eresytter | lightray22 |
+| lscolombo | mrkaato | pf-siedler | ruuti | s1nceri7y |
+| cornava | 浇水 | ikunya | Ahmad45123 | bedwardly-down |
+| dcaveiro | hexclover | 2jaeyeol | thackeraaron | aaronxn |
+| xUser5000 | iamabhi222 | Aksh-Konda | alanfortlink | AverageUser2 |
+| afischer211 | a13xk | apankratov | teterkin | avanderberg |
+| 宁静 | lex111 | Alkindi42 | Jumanjii | AlphaJack |
+| Lord-Aman | richtwin567 | ajilderda | adrynov | andrewperry |
+| tekdel | anshuman9999 | 拉克拉德 | 技术-J | 沙欣 |
+| 安东尼-拉马达斯 | heyapoorva | assimd | Atrate | Beowulf2 |
+| bimlas | brenobaptista | brttbndr | carlbordum | carlosedp |
+| chaifeng | charles-e | cyy5358 | Chillu1 | Techwolf12 |
+| cloudtrends | idcristi | damienmascre | daniellandau | danil-tolkachev |
+| darshani28 | daukadolt | NeverMendel | dervist | diego-betto |
+| erdody | domgoodwin | b4mboo | donbowman | sirnacnud |
+| dflock | drobilica | educbraga | eduardokimmel | VodeniZeko |
+| ei-ke | einverne | eodeluga | fathyar | fer22f |
+| fpindado | FleischKarussel | talkdirty | gmaubach | gmag11 |
+| Jackymancs4 | Glandos | vibraniumdev | gusbemacbe | HOLLYwyh |
+| Fvbor | bennetthanna | harshitkathuria | 视图 | ianjs |
+| iahmedbacha | IrvinDominin | ishammahajan | ffadilaputra | JRaiden16 |
+| jacobherrington | 詹姆斯·阿吉纳 | jrwrigh | 杰拉德·克劳夫 | 易变变量 |
+| innkuika | JoelRSimpson | joeltaylor | exc | JonathanPlasse |
+| joesfer | joybinchen | kaustubhsh | y-usuzumi | xuhcc |
+| kirtanprht | k0ur0x | kklas | xmlangel | troilus |
+| lboullo0 | dbinary | marc-bouvier | mvonmaltitz | mlkood |
+| plextoriano | Marmo | mcejp | freaktechnik | martinkorelic |
+| Petemir | matsair | mgroth0 | silentmatt | maxs-test |
+| MichBoi | MichipX | MrTraduttore | sanjarcode | Mustafa-ALD |
+| NJannasch | zomglings | Frichetten | nicolas-suzuki | Ouvill |
+| shorty2380 | dist3r | rakleed | idle-code | bobchao |
+| Diadlo | pranavmodx | R3dError | rajprakash00 | rahil1304 |
+| rasulkireev | reinhart1010 | 重写 | ambrt | 德卡德斯 |
+| 四步进器 | rodgco | Ronnie76er | roryokane | ruzaq |
+| szokesandor | SamuelBlickle | livingc0l0ur | bronson | semperor |
+| shawnaxsom | SFoskitt | kcrt | xissy | tams |
+| Tekki | ThatcherC | TheoDutch | tbroadley | Kriechi |
+| tkilaker | Tim-Erwin | tcyrus | tobias-grasse | strobeltobias |
+| kostegit | tbergeron | Ullas-Aithal | MyTheValentinus | vassudanagunta |
+| vijayjoshi16 | max-keviv | vandreykiv | WisdomCode | xsak |
+| ymitos | 废除所有私有财产 | aerotog | albertopasqualetto | asrient |
+| bestlibre | 无聊10 | 卡多夫 | colorchestra | 网络流浪者 |
+| dartero | delta-emil | doc75 | dsp77 | ebayer |
+| elsiehupp | espinosa | exponentactivity | exprez135 | fab4x |
+| fabianski7 | rasperepodvipodvert | gasolin | githubaccount073 | hms5232 |
+| hydrandt | iamtalwinder | jabdoa2 | jduar | jibedoubleve |
+| johanvanheusden | jtagcat | konhi | krzysiekwie | 灯塔灯泡 |
+| luzpaz | majsterkovic | mak2002 | nmiquan | nullpointer666 |
+| oscaretu | oskarsh | osso73 | 超灵 | pensierocrea |
+| pomeloy | rhtenhove | rikanotank1 | rxliuli | simonsan |
+| stellarpower | suixinio | sumomo-99 | xtatsux | taw00 |
+| tcassaert | victante | Voltinus | xcffl | yourcontact |
+| zaoyifan | zawnk | zen-quo | zozolina123 | 许可 |
+| paventyang | jackytsu | zhangmx | | |
\ No newline at end of file
diff --git a/apps/joplin/README_en.md b/apps/joplin/README_en.md
new file mode 100644
index 000000000..ae555d7db
--- /dev/null
+++ b/apps/joplin/README_en.md
@@ -0,0 +1,674 @@
+# 使用说明
+
+- 默认账户密码
+```
+username:admin@localhost
+password:admin
+```
+
+# 原始相关
+
+
+[](https://www.paypal.com/donate/?business=E8JMYD2LQ8MMA&no_recurring=0&item_name=I+rely+on+donations+to+maintain+and+improve+the+Joplin+open+source+project.+Thank+you+for+your+help+-+it+makes+a+difference%21¤cy_code=EUR) [](https://github.com/sponsors/laurent22/) [](https://www.patreon.com/joplin) [](https://joplinapp.org/donate/#donations)
+
+
+ **Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
+
+Notes exported from Evernote [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
+
+The notes can be securely [synchronised](#synchronisation) using [end-to-end encryption](#encryption) with various cloud services including Nextcloud, Dropbox, OneDrive and [Joplin Cloud](https://joplinapp.org/plans/).
+
+Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own.
+
+The application is available for Windows, Linux, macOS, Android and iOS. A [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB).
+
+
+
+# Installation
+
+Three types of applications are available: for **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS, Linux and FreeBSD). All the applications have similar user interfaces and can synchronise with each other.
+
+## Desktop applications
+
+Operating System | Download
+---|---
+Windows (32 and 64-bit) |
+macOS |
+Linux |
+
+**On Windows**, you may also use the Portable version. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
+
+**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
+
+
+
+The install and update script supports the [following flags](https://github.com/laurent22/joplin/blob/dev/Joplin_install_and_update.sh#L50) (around line 50 at the time of this writing).
+
+## Mobile applications
+
+Operating System | Download | Alt. Download
+---|---|---
+Android | | or download the [APK file](https://objects.joplinusercontent.com/v2.11.31/joplin-v2.11.31.apk?source=JoplinWebsite&type=New)
+iOS | | -
+
+## Terminal application
+
+Operating system | Method
+-----------------|----------------
+macOS, Linux, or Windows (via [WSL](https://msdn.microsoft.com/en-us/commandline/wsl/faq?f=255&MSPPError=-2147217396)) | **Important:** First, [install Node 12+](https://nodejs.org/en/download/package-manager/).
By default, the application binary will be installed under `~/.joplin-bin`. You may change this directory if needed. Alternatively, if your npm permissions are setup as described [here](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory) (Option 2) then simply running `npm -g install joplin` would work.
+
+To start it, type `joplin`.
+
+For usage information, please refer to the full [Joplin Terminal Application Documentation](https://joplinapp.org/terminal/).
+
+## Web Clipper
+
+The Web Clipper is a browser extension that allows you to save web pages and screenshots from your browser. For more information on how to install and use it, see the [Web Clipper Help Page](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md).
+
+## Unofficial Alternative Distributions
+
+There are a number of unofficial alternative Joplin distributions. If you do not want to or cannot use appimages or any of the other officially supported releases then you may wish to consider these.
+
+However these come with a caveat in that they are not officially supported so certain issues may not be supportable by the main project. Rather support requests, bug reports and general advice would need to go to the maintainers of these distributions.
+
+A community maintained list of these distributions can be found here: [Unofficial Joplin distributions](https://discourse.joplinapp.org/t/unofficial-alternative-joplin-distributions/23703)
+
+# Sponsors
+
+
+
+
+
+* * *
+
+
+| | | | |
+| :---: | :---: | :---: | :---: |
+| [avanderberg](https://github.com/avanderberg) | [chr15m](https://github.com/chr15m) | [CyberXZT](https://github.com/CyberXZT) | [dbrandonjohnson](https://github.com/dbrandonjohnson) |
+| [dchecks](https://github.com/dchecks) | [fats](https://github.com/fats) | [fourstepper](https://github.com/fourstepper) | [Hegghammer](https://github.com/Hegghammer) |
+| [iamwillbar](https://github.com/iamwillbar) | [jknowles](https://github.com/jknowles) | [KentBrockman](https://github.com/KentBrockman) | [kianenigma](https://github.com/kianenigma) |
+| [konishi-t](https://github.com/konishi-t) | [marcdw1289](https://github.com/marcdw1289) | [matmoly](https://github.com/matmoly) | [maxtruxa](https://github.com/maxtruxa) |
+| [mcejp](https://github.com/mcejp) | [saarantras](https://github.com/saarantras) | [sif](https://github.com/sif) | [taskcruncher](https://github.com/taskcruncher) |
+| [tateisu](https://github.com/tateisu) | | | |
+
+
+
+# Table of contents
+
+- Applications
+
+ - [Desktop application](https://github.com/laurent22/joplin/blob/dev/readme/desktop.md)
+ - [Mobile applications](https://github.com/laurent22/joplin/blob/dev/readme/mobile.md)
+ - [Terminal application](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md)
+ - [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md)
+
+- Support
+
+ - [Joplin Forum](https://discourse.joplinapp.org)
+ - [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md)
+ - [How to enable end-to-end encryption](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md)
+ - [What is a conflict?](https://github.com/laurent22/joplin/blob/dev/readme/conflict.md)
+ - [How to enable debug mode](https://github.com/laurent22/joplin/blob/dev/readme/debugging.md)
+ - [About the Rich Text editor limitations](https://github.com/laurent22/joplin/blob/dev/readme/rich_text_editor.md)
+ - [External links](https://github.com/laurent22/joplin/blob/dev/readme/external_links.md)
+ - [FAQ](https://github.com/laurent22/joplin/blob/dev/readme/faq.md)
+
+- Joplin Cloud
+
+ - [Sharing a notebook](https://github.com/laurent22/joplin/blob/dev/readme/share_notebook.md)
+ - [Publishing a note](https://github.com/laurent22/joplin/blob/dev/readme/publish_note.md)
+ - [Email to Note](https://github.com/laurent22/joplin/blob/dev/readme/email_to_note.md)
+
+- Joplin API - Get Started
+
+ - [Joplin API Overview](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md)
+ - [Plugin development](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md)
+ - [Plugin tutorial](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md)
+
+
+- Joplin API - References
+
+ - [Plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html)
+ - [Data API](https://github.com/laurent22/joplin/blob/dev/readme/api/references/rest_api.md)
+ - [Plugin manifest](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_manifest.md)
+ - [Plugin loading rules](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_loading_rules.md)
+ - [Plugin theming](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_theming.md)
+
+- Development
+
+ - [How to build the apps](https://github.com/laurent22/joplin/blob/dev/BUILD.md)
+ - [Writing a technical spec](https://github.com/laurent22/joplin/blob/dev/readme/technical_spec.md)
+ - [Desktop application styling](https://github.com/laurent22/joplin/blob/dev/readme/spec/desktop_styling.md)
+ - [Note history spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/history.md)
+ - [Synchronisation spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync.md)
+ - [Sync Lock spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_lock.md)
+ - [Synchronous Scroll spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_scroll.md)
+ - [Overall Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/architecture.md)
+ - [Plugin Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/plugins.md)
+ - [Search Sorting spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md)
+ - [E2EE: Technical spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md)
+ - [E2EE: Workflow](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee/workflow.md)
+ - [Server: File URL Format](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_file_url_format.md)
+ - [Server: Delta Sync](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_delta_sync.md)
+ - [Server: Sharing](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md)
+ - [Read-only items](https://github.com/laurent22/joplin/blob/dev/readme/spec/read_only.md)
+
+- Google Summer of Code 2022
+
+ - [Google Summer of Code 2022](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/index.md)
+ - [How to submit a GSoC pull request](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/pull_request_guidelines.md)
+ - [Project Ideas](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/ideas.md)
+
+- About
+
+ - [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
+ - [Changelog (Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
+ - [Changelog (iOS)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
+ - [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
+ - [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
+ - [Guiding principles](https://github.com/laurent22/joplin/blob/dev/readme/principles.md)
+ - [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
+ - [Brand guidelines](https://joplinapp.org/brand)
+ - [Donate](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)
+
+
+# Features
+
+- Desktop, mobile and terminal applications.
+- [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) for Firefox and Chrome.
+- End To End Encryption (E2EE).
+- Note history (revisions).
+- Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.
+- Offline first, so the entire data is always available on the device even without an internet connection.
+- Import Enex files (Evernote export format) and Markdown files.
+- Export JEX files (Joplin Export format) and raw files.
+- Support notes, to-dos, tags and notebooks.
+- Sort notes by multiple criteria - title, updated time, etc.
+- Support for alarms (notifications) in mobile and desktop applications.
+- Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.
+- Choice of both Markdown and Rich Text (WYSIWYG) editors.
+- File attachment support - images are displayed, other files are linked and can be opened in the relevant application.
+- Inline display of PDF, video and audio files.
+- Goto Anything feature.
+- Search functionality.
+- Geo-location support.
+- Supports multiple languages.
+- External editor support - open notes in your favorite external editor with one click in Joplin.
+- Extensible functionality through plugin and data APIs.
+- Custom CSS support for customisation of both the rendered markdown and overall user interface.
+- Customisable layout allows toggling, movement and sizing of various elements.
+- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
+- Multiple profile support.
+
+# Importing
+
+## Importing from Evernote
+
+Joplin was designed as a replacement for Evernote and so can import complete Evernote notebooks, as well as notes, tags, resources (attached files) and note metadata (such as author, geo-location, etc.) via ENEX files. In terms of data, the only two things that might slightly differ are:
+
+- Recognition data - Evernote images, in particular scanned (or photographed) documents have [recognition data](https://en.wikipedia.org/wiki/Optical_character_recognition) associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.
+
+- Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting. If it is essential that this extra data is preserved then Joplin also allows import of ENEX files as HTML.
+
+To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps:
+
+In the **desktop application**, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.
+
+In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import /path/to/file.enex`. This will import the notes into a new notebook named after the filename.
+
+## Importing from Markdown files
+
+Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.
+
+In the **desktop application**:
+* **File import**: Go to File > Import > MD - Markdown (file) and select the Markdown file. This file will then be imported to the currently selected Notebook.
+* **Directory import**: Go to File > Import > MD - Markdown (directory) and select the top level of the directory that is being imported. Directory (folder) structure will be preserved in the Notebook > Subnotebook > Note structure within Joplin.
+
+In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`.
+
+## Importing from other applications
+
+In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:
+
+* Standard Notes: Please see [this tutorial](https://programadorwebvalencia.com/migrate-notes-from-standard-notes-to-joplin/)
+* Tomboy Notes: Export the notes to ENEX files [as described here](https://askubuntu.com/questions/243691/how-can-i-export-my-tomboy-notes-into-evernote/608551) for example, and import these ENEX files into Joplin.
+* OneNote: First [import the notes from OneNote into Evernote](https://discussion.evernote.com/topic/107736-is-there-a-way-to-import-from-onenote-into-evernote-on-the-mac/). Then export the ENEX file from Evernote and import it into Joplin.
+* NixNote: Synchronise with Evernote, then export the ENEX files and import them into Joplin. More info [in this thread](https://discourse.joplinapp.org/t/import-from-nixnote/183/3).
+
+# Exporting
+
+Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.
+Joplin is also capable of exporting to a number of other formats including HTML and PDF which can be done for single notes, notebooks or everything.
+
+# Synchronisation
+
+One of the goals of Joplin is to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
+
+Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application.
+
+If the **terminal client** has been installed, it is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:
+
+` */30 * * * * /path/to/joplin sync`
+
+## Nextcloud synchronisation
+
+Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
+
+In the **desktop application** or **mobile application**, go to the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details.
+
+In the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:
+
+ :config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
+ :config sync.5.username YOUR_USERNAME
+ :config sync.5.password YOUR_PASSWORD
+ :config sync.target 5
+
+If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.
+
+## WebDAV synchronisation
+
+Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above (for the **terminal application** you will need to select sync target 6 rather than 5)
+
+WebDAV-compatible services that are known to work with Joplin:
+
+- [Apache WebDAV Module](https://httpd.apache.org/docs/current/mod/mod_dav.html)
+- [DriveHQ](https://www.drivehq.com)
+- [Fastmail](https://www.fastmail.com/)
+- [HiDrive](https://www.strato.fr/stockage-en-ligne/) from Strato. [Setup help](https://github.com/laurent22/joplin/issues/309)
+- [Nginx WebDAV Module](https://nginx.org/en/docs/http/ngx_http_dav_module.html)
+- [Nextcloud](https://nextcloud.com/)
+- [OwnCloud](https://owncloud.org/)
+- [Seafile](https://www.seafile.com/)
+- [Stack](https://www.transip.nl/stack/)
+- [Synology WebDAV Server](https://www.synology.com/en-us/dsm/packages/WebDAVServer)
+- [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/), a macOS server.
+- [Zimbra](https://www.zimbra.com/)
+
+## Dropbox synchronisation
+
+When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in `/Apps/Joplin` and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
+
+In the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
+
+In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application.
+
+## OneDrive synchronisation
+
+When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
+
+In the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
+
+In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
+
+## S3 synchronisation
+
+As of Joplin 2.x.x, Joplin supports multiple S3 providers. We expose some options that will need to be configured depending on your provider of choice. We have tested with UpCloud, AWS, and Linode. others should work as well.
+
+In the **desktop application** or **mobile application**, select "S3 (Beta)" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
+
+- **S3 Bucket:** The name of your Bucket, such as `joplin-bucket`
+- **S3 URL:** Fully qualified URL; For AWS this should be `https://s3..amazonaws.com/`
+- **S3 Access Key & S3 Secret Key:** The User's programmatic access key. To create a new key & secret on AWS, visit [IAM Security Credentials](https://console.aws.amazon.com/iam/home#/security_credentials). For other providers follow their documentation.
+- **S3 Region:** Some providers require you to provide the region of your bucket. This is usually in the form of "eu-west1" or something similar depending on your region. For providers that do not require a region, you can leave it blank.
+- **Force Path Style**: This setting enables Joplin to talk to S3 providers using an older style S3 Path. Depending on your provider you may need to try with this on and off.
+
+
+While creating a new Bucket for Joplin, disable **Bucket Versioning**, enable **Block all public access** and enable **Default encryption** with `Amazon S3 key (SSE-S3)`. Some providers do not expose these options, and it could create a syncing problem. Do attempt and report back so we can update the documentation appropriately.
+
+To add a **Bucket Policy** from the AWS S3 Web Console, navigate to the **Permissions** tab. Temporarily disable **Block all public access** to edit the Bucket policy, something along the lines of:
+```
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "VisualEditor0",
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:DeleteObject",
+ "s3:DeleteObjectVersion",
+ "s3:PutObject"
+ ],
+ "Resource": [
+ "arn:aws:s3:::joplin-bucket",
+ "arn:aws:s3:::joplin-bucket/*"
+ ]
+ }
+ ]
+}
+```
+
+### Configuration settings for tested providers
+
+All providers will require a bucket, Access Key, and Secret Key.
+
+If you provide a configuration and you receive "success!" on the "check config" then your S3 sync should work for your provider. If you do not receive success, you may need to adjust your settings, or save them, restart the app, and attempt a sync. This may reveal more clear error messaging that will help you deduce the problem.
+
+### AWS
+- URL: `https://s3..amazonaws.com/` (fill in your region, a complete list of endpoint adresses can be found [here](https://docs.aws.amazon.com/general/latest/gr/s3.html))
+- Region: required
+- Force Path Style: unchecked
+
+### Linode
+- URL: `https://.linodeobjects.com` (region is in the URL provided by Linode; this URL is also the same as the URL provided by Linode with the bucket name removed)
+- Region: Anything you want to type, can't be left empty
+- Force Path Style: unchecked
+
+### UpCloud
+- URL: `https://..upcloudobjects.com` (They will provide you with multiple URLs, the one that follows this pattern should work.)
+- Region: required
+- Force Path Style: unchecked
+
+# Encryption
+
+Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the [End-To-End Encryption Tutorial](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md) for more information about this feature and how to enable it.
+
+For a more technical description, mostly relevant for development or to review the method being used, please see the [Encryption specification](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md).
+
+# Note history
+
+The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the "Information" button on a note, then click on "Previous version of this note". From this screen you can view the previous versions of the note as well as restore any of them.
+
+This feature can be disabled from the "Note history" section in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), and it is also possible to change for how long the history of a note is saved.
+
+More information please see the [Note History page](https://github.com/laurent22/joplin/blob/dev/readme/note_history.md).
+
+# External text editor
+
+Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under "Text editor command".
+
+# Attachments
+
+Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment, clicking on this link will open the file in the default application. In the case of audio, video and pdf files, these will be displayed inline with the note and so can be viewed or played within Joplin.
+
+In the **desktop application**, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.
+
+Resources that are not attached to any note will be automatically deleted in accordance to the [Note History](#note-history) settings.
+
+**Important:** Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.
+
+## Downloading attachments
+
+The way the attachments are downloaded during synchronisation can be customised in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), under "Attachment download behaviour". The default option ("Always") is to download all the attachments, all the time, so that the data is available even when the device is offline. There is also the option to download the attachments manually (option "Manual"), by clicking on it, or automatically (Option "Auto"), in which case the attachments are downloaded only when a note is opened. These options should help saving disk space and network bandwidth, especially on mobile.
+
+# Notifications
+
+In the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:
+
+- **Windows**: >= 8. Make sure the Action Center is enabled on Windows. Task bar balloon for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
+- **macOS**: >= 10.8 or Growl if earlier.
+- **Linux**: `notify-send` tool, delivered through packages `notify-osd`, `libnotify-bin` or `libnotify-tools`. GNOME should have this by default, but install `libnotify-tools` if using KDE Plasma.
+
+See [documentation and flow chart for reporter choice](https://github.com/mikaelbr/node-notifier/blob/master/DECISION_FLOW.md)
+
+On mobile, the alarms will be displayed using the built-in notification system.
+
+If for any reason the notifications do not work, please [open an issue](https://github.com/laurent22/joplin/issues).
+
+# Sub-notebooks
+
+Sub-notebooks allow organising multiple notebooks into a tree of notebooks. For example it can be used to regroup all the notebooks related to work, to family or to a particular project under a parent notebook.
+
+
+
+- In the **desktop application**, to create a subnotebook, drag and drop it onto another notebook. To move it back to the root, drag and drop it on the "Notebooks" header. Currently only the desktop app can be used to organise the notebooks.
+- The **mobile application** supports displaying and collapsing/expanding the tree of notebooks, however it does not currently support moving the subnotebooks to different notebooks.
+- The **terminal app** supports displaying the tree of subnotebooks but it does not support collapsing/expanding them or moving the subnotebooks around.
+
+# Markdown
+
+Joplin uses and renders a Github-flavoured Markdown with a few variations and additions. In particular it adds math formula support, interactive checkboxes and support for note links. Joplin also supports Markdown plugins which allow enabling and disabling various advanced Markdown features. Have a look at the [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md) for more information.
+
+# Custom CSS
+
+Rendered markdown can be customized by placing a userstyle file in the profile directory `~/.config/joplin-desktop/userstyle.css` (This path might be different on your device - check at the top of the `General` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) for the exact path). This file supports standard CSS syntax. Joplin ***must*** be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).
+
+The whole UI can be customized by placing a custom editor style file in the profile directory `~/.config/joplin-desktop/userchrome.css`.
+
+Important: userstyle.css and userchrome.css are provided for your convenience, but they are advanced settings, and styles you define may break from one version to the next. If you want to use them, please know that it might require regular development work from you to keep them working. The Joplin team cannot make a commitment to keep the application HTML structure stable.
+
+# Plugins
+
+The **desktop app** has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin [plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html) and can be installed & configured within the application via the `Plugins` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
+
+From this menu you can search for plugins uploaded to the [Joplin plugins](https://github.com/joplin/plugins) repository as well as manual installation of plugins using a 'Joplin Plugin Archive' (*.jpl) file.
+Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.
+
+For more information see [Plugins](https://github.com/laurent22/joplin/blob/dev/readme/plugins.md)
+
+# Searching
+
+Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both [Simple FTS Queries](https://www.sqlite.org/fts3.html#simple_fts_queries) and [Full-Text Index Queries](https://www.sqlite.org/fts3.html#full_text_index_queries) are supported. See below for the list of supported queries:
+
+One caveat of SQLite FTS is that it does not support languages which do not use Latin word boundaries (spaces, tabs, punctuation). To solve this issue, Joplin has a custom search mode, that does not use FTS, but still has all of its features (multi term search, filters, etc.). One of its drawbacks is that it can get slow on larger note collections. Also, the sorting of the results will be less accurate, as the ranking algorithm (BM25) is, for now, only implemented for FTS. Finally, in this mode there are no restrictions on using the `*` wildcard (`swim*`, `*swim` and `ast*rix` all work). This search mode is currently enabled if one of the following languages are detected:
+ - Chinese
+ - Japanese
+ - Korean
+ - Thai
+
+## Supported queries
+
+Search type | Description | Example
+------------|-------------|---------
+Single word | Returns all the notes that contain this term. | For example, searching for `cat` will return all the notes that contain this exact word. Note: it will not return the notes that contain the substring - thus, for "cat", notes that contain "cataclysmic" or "prevaricate" will **not** be returned.
+Multiple word | Returns all the notes that contain **all** these words, but not necessarily next to each other. | `dog cat` - will return any notes that contain the words "dog" and "cat" anywhere in the note, no necessarily in that order nor next to each other. It will **not** return results that contain "dog" or "cat" only.
+Phrase | Add double quotes to return the notes that contain exactly this phrase. | `"shopping list"` - will return the notes that contain these **exact terms** next to each other and in this order. It will **not** return for example a note that contains "going shopping with my list".
+Prefix | Add a wildcard to return all the notes that contain a term with a specified prefix. | `swim*` - will return all the notes that contain eg. "swim", but also "swimming", "swimsuit", etc. IMPORTANT: The wildcard **can only be at the end** - it will be ignored at the beginning of a word (eg. `*swim`) and will be treated as a literal asterisk in the middle of a word (eg. `ast*rix`)
+Switch to basic search | One drawback of Full Text Search is that it ignores most non-alphabetical characters. However in some cases you might want to search for this too. To do that, you can use basic search. You switch to this mode by prefixing your search with a slash `/`. This won't provide the benefits of FTS but it will allow searching exactly for what you need. Note that it can also be much slower, even extremely slow, depending on your query. | `/"- [ ]"` - will return all the notes that contain unchecked checkboxes.
+
+## Search filters
+
+You can also use search filters to further restrict the search.
+
+| Operator | Description | Example |
+| --- | --- | --- |
+|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`. `office -trash` searches for all notes with the word `office` and without the word `trash`.|
+|**any:**|Return notes that satisfy any/all of the required conditions. `any:0` is the default, which means all conditions must be satisfied.|`any:1 cat dog` will return notes that have the word `cat` or `dog`. `any:0 cat dog` will return notes with both the words `cat` and `dog`. |
+| **title:** **body:**|Restrict your search to just the title or the body field.|`title:"hello world"` searches for notes whose title contains `hello` and `world`. `title:hello -body:world` searches for notes whose title contains `hello` and body does not contain `world`.
+| **tag:** |Restrict the search to the notes with the specified tags.|`tag:office` searches for all notes having tag office. `tag:office tag:important` searches for all notes having both office and important tags. `tag:office -tag:spam` searches for notes having tag `office` which do not have tag `spam`. `any:1 tag:office tag:spam` searches for notes having tag `office` or tag `spam`. `tag:be*ful` does a search with wildcards. `tag:*` returns all notes with tags. `-tag:*` returns all notes without tags.|
+| **notebook:** | Restrict the search to the specified notebook(s). |`notebook:books` limits the search scope within `books` and all its subnotebooks. `notebook:wheel*time` does a wildcard search.|
+| **created:** **updated:** **due:**| Searches for notes created/updated on dates specified using YYYYMMDD format. You can also search relative to the current day, week, month, or year. | `created:20201218` will return notes created on or after December 18, 2020. `-updated:20201218` will return notes updated before December 18, 2020. `created:20200118 -created:20201215` will return notes created between January 18, 2020, and before December 15, 2020. `created:202001 -created:202003` will return notes created on or after January and before March 2020. `updated:1997 -updated:2020` will return all notes updated between the years 1997 and 2019. `created:day-2` searches for all notes created in the past two days. `updated:year-0` searches all notes updated in the current year. `-due:day+7` will return all todos which are due or will be due in the next seven days. `-due:day-5` searches all todos that are overdue for more than 5 days.|
+| **type:** |Restrict the search to either notes or todos. | `type:note` to return all notes `type:todo` to return all todos |
+| **iscompleted:** | Restrict the search to either completed or uncompleted todos. | `iscompleted:1` to return all completed todos `iscompleted:0` to return all uncompleted todos|
+|**latitude:** **longitude:** **altitude:**|Filter by location|`latitude:40 -latitude:50` to return notes with latitude >= 40 and < 50 |
+|**resource:**|Filter by attachment MIME type|`resource:image/jpeg` to return notes with a jpeg attachment. `-resource:application/pdf` to return notes without a pdf attachment. `resource:image/*` to return notes with any images.|
+|**sourceurl:**|Filter by source URL|`sourceurl:https://www.google.com` `sourceurl:*joplinapp.org` to perform a wildcard search.|
+|**id:**|Filter by note ID|`id:9cbc1b4f242043a9b8a50627508bccd5` return a note with the specified id |
+
+Note: In the CLI client you have to escape the query using `--` when using negated filters.
+Eg. `:search -- "-tag:tag1"`.
+
+The filters are implicitly connected by and/or connectives depending on the following rules:
+
+- By default, all filters are connected by "AND".
+- To override this default behaviour, use the `any` filter, in which case the search terms will be connected by "OR" instead.
+- There's an exception for the `notebook` filters which are connected by "OR". The reason being that no note can be in multiple notebooks at once.
+
+Incorrect search filters are interpreted as a phrase search, e.g. misspelled `nootebook:Example` or non-existing `https://joplinapp.org`.
+
+## Search order
+
+Notes are sorted by "relevance". Currently it means the notes that contain the requested terms the most times are on top. For queries with multiple terms, it also matters how close to each other the terms are. This is a bit experimental so if you notice a search query that returns unexpected results, please report it in the forum, providing as many details as possible to replicate the issue.
+
+# Goto Anything
+
+In the desktop application, press Ctrl+P or Cmd+P and type a note title or part of its content to jump to it. Or type # followed by a tag name, or @ followed by a notebook name.
+
+# Multiple profile support
+
+To create a new profile, open File > Switch profile and select Create new profile, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.
+
+To switch back to the previous profile, again open File > Switch profile and select Default.
+
+Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.
+
+The feature is available on desktop only for now, and should be ported to mobile relatively soon.
+
+# Donations
+
+Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.
+
+Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/readme/donate.md) for information on how to support the development of Joplin.
+
+# Community
+
+Name | Description
+--- | ---
+[Support Forum](https://discourse.joplinapp.org/) | This is the main place for general discussion about Joplin, user support, software development questions, and to discuss new features. Also where the latest beta versions are released and discussed.
+[Twitter feed](https://twitter.com/joplinapp) | Follow us on Twitter
+[Mastodon feed](https://mastodon.social/@joplinapp) | Follow us on Mastodon
+[Patreon page](https://www.patreon.com/joplin) |The latest news are often posted there
+[Discord server](https://discord.gg/VSj7AFHvpq) | Our chat server
+[LinkedIn](https://www.linkedin.com/company/joplin) | Our LinkedIn page
+[Lemmy Community](https://sopuli.xyz/c/joplinapp) | Also a good place to get help
+
+# Contributing
+
+Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
+
+# Localisation
+
+Joplin is currently available in the languages below. If you would like to contribute a **new translation**, it is quite straightforward, please follow these steps:
+
+- [Download Poedit](https://poedit.net/), the translation editor, and install it.
+- [Download the file to be translated](https://raw.githubusercontent.com/laurent22/joplin/dev/packages/tools/locales/joplin.pot).
+- In Poedit, open this .pot file, go into the Catalog menu and click Configuration. Change "Country" and "Language" to your own country and language.
+- From then you can translate the file.
+- Once it is done, please [open a pull request](https://github.com/laurent22/joplin/pulls) and add the file to it.
+
+This translation will apply to the three applications - desktop, mobile and terminal.
+
+To **update a translation**, follow the same steps as above but instead of getting the .pot file, get the .po file for your language from the table below.
+
+Current translations:
+
+
+ | Language | Po File | Last translator | Percent done
+---|---|---|---|---
+ | Arabic | [ar](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ar.po) | [Whaell O](mailto:Whaell@protonmail.com) | 79%
+ | Basque | [eu](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/eu.po) | juan.abasolo@ehu.eus | 22%
+ | Bosnian (Bosna i Hercegovina) | [bs_BA](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/bs_BA.po) | [Derviš T.](mailto:dervis.t@pm.me) | 57%
+ | Bulgarian (България) | [bg_BG](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/bg_BG.po) | | 45%
+ | Catalan | [ca](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ca.po) | [Xavi Ivars](mailto:xavi.ivars@gmail.com) | 88%
+ | Croatian (Hrvatska) | [hr_HR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/hr_HR.po) | [Milo Ivir](mailto:mail@milotype.de) | 99%
+ | Czech (Česká republika) | [cs_CZ](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/cs_CZ.po) | Fejby | 98%
+ | Dansk (Danmark) | [da_DK](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/da_DK.po) | ERYpTION | 98%
+ | Deutsch (Deutschland) | [de_DE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/de_DE.po) | [MrKanister](mailto:pueblos_spatulas@aleeas.com) | 98%
+ | Eesti Keel (Eesti) | [et_EE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/et_EE.po) | | 44%
+ | English (United Kingdom) | [en_GB](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/en_GB.po) | | 100%
+ | English (United States of America) | [en_US](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/en_US.po) | | 100%
+ | Español (España) | [es_ES](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/es_ES.po) | [Francisco Villaverde](mailto:teko.gr@gmail.com) | 97%
+ | Esperanto | [eo](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/eo.po) | Marton Paulo | 25%
+ | Finnish (Suomi) | [fi_FI](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fi_FI.po) | mrkaato0 | 98%
+ | Français (France) | [fr_FR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fr_FR.po) | Laurent Cozic | 100%
+ | Galician (España) | [gl_ES](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/gl_ES.po) | [Marcos Lans](mailto:marcoslansgarza@gmail.com) | 29%
+ | Indonesian (Indonesia) | [id_ID](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/id_ID.po) | [Wisnu Adi Santoso](mailto:waditos@gmail.com) | 88%
+ | Italiano (Italia) | [it_IT](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/it_IT.po) | [Manuel Tassi](mailto:mannivuwiki@gmail.com) | 80%
+ | Magyar (Magyarország) | [hu_HU](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/hu_HU.po) | [Magyari Balázs](mailto:balmag@gmail.com) | 77%
+ | Nederlands (België, Belgique, Belgien) | [nl_BE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nl_BE.po) | | 78%
+ | Nederlands (Nederland) | [nl_NL](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nl_NL.po) | [MHolkamp](mailto:mholkamp@users.noreply.github.com) | 87%
+ | Norwegian (Norge, Noreg) | [nb_NO](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nb_NO.po) | [Mats Estensen](mailto:code@mxe.no) | 87%
+ | Persian | [fa](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fa.po) | [Kourosh Firoozbakht](mailto:kourox@protonmail.com) | 54%
+ | Polski (Polska) | [pl_PL](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pl_PL.po) | [X3NO](mailto:X3NO@disroot.org) | 89%
+ | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pt_BR.po) | [Douglas Leão](mailto:djlsplays@gmail.com) | 87%
+ | Português (Portugal) | [pt_PT](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pt_PT.po) | [Diogo Caveiro](mailto:dcaveiro@yahoo.com) | 72%
+ | Română | [ro](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ro.po) | [Cristi Duluta](mailto:cristi.duluta@gmail.com) | 50%
+ | Slovenian (Slovenija) | [sl_SI](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sl_SI.po) | [Martin Korelič](mailto:martin.korelic@protonmail.com) | 79%
+ | Svenska | [sv](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sv.po) | [Jonatan Nyberg](mailto:jonatan@autistici.org) | 99%
+ | Thai (ประเทศไทย) | [th_TH](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/th_TH.po) | | 36%
+ | Tiếng Việt | [vi](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/vi.po) | | 77%
+ | Türkçe (Türkiye) | [tr_TR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/tr_TR.po) | [Arda Kılıçdağı](mailto:arda@kilicdagi.com) | 99%
+ | Ukrainian (Україна) | [uk_UA](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/uk_UA.po) | [Vyacheslav Andreykiv](mailto:vandreykiv@gmail.com) | 71%
+ | Ελληνικά (Ελλάδα) | [el_GR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/el_GR.po) | [Harris Arvanitis](mailto:xaris@tuta.io) | 87%
+ | Русский (Россия) | [ru_RU](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ru_RU.po) | [Dmitriy K](mailto:dmitry@atsip.ru) | 99%
+ | српски језик (Србија) | [sr_RS](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sr_RS.po) | | 64%
+ | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/zh_CN.po) | [wh201906](mailto:wh201906@yandex.com) | 96%
+ | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/zh_TW.po) | [Kevin Hsu](mailto:kevin.hsu.hws@gmail.com) | 88%
+ | 日本語 (日本) | [ja_JP](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ja_JP.po) | [genneko](mailto:genneko217@gmail.com) | 88%
+ | 한국어 | [ko](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ko.po) | [Ji-Hyeon Gim](mailto:potatogim@potatogim.net) | 88%
+
+
+# Contributors
+
+Thank you to everyone who've contributed to Joplin's source code!
+
+
+| | | | | |
+| :---: | :---: | :---: | :---: | :---: |
+| [laurent22](https://github.com/laurent22) | [tessus](https://github.com/tessus) | [CalebJohn](https://github.com/CalebJohn) | [mic704b](https://github.com/mic704b) | [roman-r-m](https://github.com/roman-r-m) |
+| [genneko](https://github.com/genneko) | [j-krl](https://github.com/j-krl) | [tanrax](https://github.com/tanrax) | [naviji](https://github.com/naviji) | [PackElend](https://github.com/PackElend) |
+| [rtmkrlv](https://github.com/rtmkrlv) | [fmrtn](https://github.com/fmrtn) | [potatogim](https://github.com/potatogim) | [devonzuegel](https://github.com/devonzuegel) | [anjulalk](https://github.com/anjulalk) |
+| [gabcoh](https://github.com/gabcoh) | [matsest](https://github.com/matsest) | [abonte](https://github.com/abonte) | [Abijeet](https://github.com/Abijeet) | [ishantgupta777](https://github.com/ishantgupta777) |
+| [JackGruber](https://github.com/JackGruber) | [Ardakilic](https://github.com/Ardakilic) | [rabeehrz](https://github.com/rabeehrz) | [coderrsid](https://github.com/coderrsid) | [foxmask](https://github.com/foxmask) |
+| [innocuo](https://github.com/innocuo) | [Rahulm2310](https://github.com/Rahulm2310) | [readingsnail](https://github.com/readingsnail) | [mablin7](https://github.com/mablin7) | [XarisA](https://github.com/XarisA) |
+| [jonath92](https://github.com/jonath92) | [alexdevero](https://github.com/alexdevero) | [Runo-saduwa](https://github.com/Runo-saduwa) | [marcosvega91](https://github.com/marcosvega91) | [petrz12](https://github.com/petrz12) |
+| [rnbastos](https://github.com/rnbastos) | [ProgramFan](https://github.com/ProgramFan) | [zblesk](https://github.com/zblesk) | [vsimkus](https://github.com/vsimkus) | [moltenform](https://github.com/moltenform) |
+| [nishantwrp](https://github.com/nishantwrp) | [zuphilip](https://github.com/zuphilip) | [Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | [metbril](https://github.com/metbril) | [WhiredPlanck](https://github.com/WhiredPlanck) |
+| [milotype](https://github.com/milotype) | [yaozeye](https://github.com/yaozeye) | [ylc395](https://github.com/ylc395) | [RenatoXSR](https://github.com/RenatoXSR) | [RedDocMD](https://github.com/RedDocMD) |
+| [q1011](https://github.com/q1011) | [amitsin6h](https://github.com/amitsin6h) | [Atalanttore](https://github.com/Atalanttore) | [Mannivu](https://github.com/Mannivu) | [martonpaulo](https://github.com/martonpaulo) |
+| [mmahmoudian](https://github.com/mmahmoudian) | [rccavalcanti](https://github.com/rccavalcanti) | [ShaneKilkelly](https://github.com/ShaneKilkelly) | [sinkuu](https://github.com/sinkuu) | [stweil](https://github.com/stweil) |
+| [conyx](https://github.com/conyx) | [anihm136](https://github.com/anihm136) | [archont00](https://github.com/archont00) | [bradmcl](https://github.com/bradmcl) | [tfinnberg](https://github.com/tfinnberg) |
+| [amandamcg](https://github.com/amandamcg) | [marcushill](https://github.com/marcushill) | [nathanleiby](https://github.com/nathanleiby) | [RaphaelKimmig](https://github.com/RaphaelKimmig) | [Vaso3](https://github.com/Vaso3) |
+| [sensor-freak](https://github.com/sensor-freak) | [lkiThakur](https://github.com/lkiThakur) | [infinity052](https://github.com/infinity052) | [BartBucknill](https://github.com/BartBucknill) | [mrwulf](https://github.com/mrwulf) |
+| [chrisb86](https://github.com/chrisb86) | [chrmoritz](https://github.com/chrmoritz) | [Daeraxa](https://github.com/Daeraxa) | [Elaborendum](https://github.com/Elaborendum) | [ethan42411](https://github.com/ethan42411) |
+| [JOJ0](https://github.com/JOJ0) | [jalajcodes](https://github.com/jalajcodes) | [jblunck](https://github.com/jblunck) | [jdrobertso](https://github.com/jdrobertso) | [Jesssullivan](https://github.com/Jesssullivan) |
+| [jmontane](https://github.com/jmontane) | [johanhammar](https://github.com/johanhammar) | [solariz](https://github.com/solariz) | [maicki](https://github.com/maicki) | [mjjzf](https://github.com/mjjzf) |
+| [rt-oliveira](https://github.com/rt-oliveira) | [sebastienjust](https://github.com/sebastienjust) | [sealch](https://github.com/sealch) | [StarFang208](https://github.com/StarFang208) | [Subhra264](https://github.com/Subhra264) |
+| [SubodhDahal](https://github.com/SubodhDahal) | [TobiasDev](https://github.com/TobiasDev) | [Whaell](https://github.com/Whaell) | [jyuvaraj03](https://github.com/jyuvaraj03) | [kowalskidev](https://github.com/kowalskidev) |
+| [alexchee](https://github.com/alexchee) | [axq](https://github.com/axq) | [barbowza](https://github.com/barbowza) | [eresytter](https://github.com/eresytter) | [lightray22](https://github.com/lightray22) |
+| [lscolombo](https://github.com/lscolombo) | [mrkaato](https://github.com/mrkaato) | [pf-siedler](https://github.com/pf-siedler) | [ruuti](https://github.com/ruuti) | [s1nceri7y](https://github.com/s1nceri7y) |
+| [kornava](https://github.com/kornava) | [ShuiHuo](https://github.com/ShuiHuo) | [ikunya](https://github.com/ikunya) | [Ahmad45123](https://github.com/Ahmad45123) | [bedwardly-down](https://github.com/bedwardly-down) |
+| [dcaveiro](https://github.com/dcaveiro) | [hexclover](https://github.com/hexclover) | [2jaeyeol](https://github.com/2jaeyeol) | [thackeraaron](https://github.com/thackeraaron) | [aaronxn](https://github.com/aaronxn) |
+| [xUser5000](https://github.com/xUser5000) | [iamabhi222](https://github.com/iamabhi222) | [Aksh-Konda](https://github.com/Aksh-Konda) | [alanfortlink](https://github.com/alanfortlink) | [AverageUser2](https://github.com/AverageUser2) |
+| [afischer211](https://github.com/afischer211) | [a13xk](https://github.com/a13xk) | [apankratov](https://github.com/apankratov) | [teterkin](https://github.com/teterkin) | [avanderberg](https://github.com/avanderberg) |
+| [serenitatis](https://github.com/serenitatis) | [lex111](https://github.com/lex111) | [Alkindi42](https://github.com/Alkindi42) | [Jumanjii](https://github.com/Jumanjii) | [AlphaJack](https://github.com/AlphaJack) |
+| [Lord-Aman](https://github.com/Lord-Aman) | [richtwin567](https://github.com/richtwin567) | [ajilderda](https://github.com/ajilderda) | [adrynov](https://github.com/adrynov) | [andrewperry](https://github.com/andrewperry) |
+| [tekdel](https://github.com/tekdel) | [anshuman9999](https://github.com/anshuman9999) | [rasklaad](https://github.com/rasklaad) | [Technik-J](https://github.com/Technik-J) | [Shaxine](https://github.com/Shaxine) |
+| [antonio-ramadas](https://github.com/antonio-ramadas) | [heyapoorva](https://github.com/heyapoorva) | [assimd](https://github.com/assimd) | [Atrate](https://github.com/Atrate) | [Beowulf2](https://github.com/Beowulf2) |
+| [bimlas](https://github.com/bimlas) | [brenobaptista](https://github.com/brenobaptista) | [brttbndr](https://github.com/brttbndr) | [carlbordum](https://github.com/carlbordum) | [carlosedp](https://github.com/carlosedp) |
+| [chaifeng](https://github.com/chaifeng) | [charles-e](https://github.com/charles-e) | [cyy5358](https://github.com/cyy5358) | [Chillu1](https://github.com/Chillu1) | [Techwolf12](https://github.com/Techwolf12) |
+| [cloudtrends](https://github.com/cloudtrends) | [idcristi](https://github.com/idcristi) | [damienmascre](https://github.com/damienmascre) | [daniellandau](https://github.com/daniellandau) | [danil-tolkachev](https://github.com/danil-tolkachev) |
+| [darshani28](https://github.com/darshani28) | [daukadolt](https://github.com/daukadolt) | [NeverMendel](https://github.com/NeverMendel) | [dervist](https://github.com/dervist) | [diego-betto](https://github.com/diego-betto) |
+| [erdody](https://github.com/erdody) | [domgoodwin](https://github.com/domgoodwin) | [b4mboo](https://github.com/b4mboo) | [donbowman](https://github.com/donbowman) | [sirnacnud](https://github.com/sirnacnud) |
+| [dflock](https://github.com/dflock) | [drobilica](https://github.com/drobilica) | [educbraga](https://github.com/educbraga) | [eduardokimmel](https://github.com/eduardokimmel) | [VodeniZeko](https://github.com/VodeniZeko) |
+| [ei-ke](https://github.com/ei-ke) | [einverne](https://github.com/einverne) | [eodeluga](https://github.com/eodeluga) | [fathyar](https://github.com/fathyar) | [fer22f](https://github.com/fer22f) |
+| [fpindado](https://github.com/fpindado) | [FleischKarussel](https://github.com/FleischKarussel) | [talkdirty](https://github.com/talkdirty) | [gmaubach](https://github.com/gmaubach) | [gmag11](https://github.com/gmag11) |
+| [Jackymancs4](https://github.com/Jackymancs4) | [Glandos](https://github.com/Glandos) | [vibraniumdev](https://github.com/vibraniumdev) | [gusbemacbe](https://github.com/gusbemacbe) | [HOLLYwyh](https://github.com/HOLLYwyh) |
+| [Fvbor](https://github.com/Fvbor) | [bennetthanna](https://github.com/bennetthanna) | [harshitkathuria](https://github.com/harshitkathuria) | [Vistaus](https://github.com/Vistaus) | [ianjs](https://github.com/ianjs) |
+| [iahmedbacha](https://github.com/iahmedbacha) | [IrvinDominin](https://github.com/IrvinDominin) | [ishammahajan](https://github.com/ishammahajan) | [ffadilaputra](https://github.com/ffadilaputra) | [JRaiden16](https://github.com/JRaiden16) |
+| [jacobherrington](https://github.com/jacobherrington) | [jamesadjinwa](https://github.com/jamesadjinwa) | [jrwrigh](https://github.com/jrwrigh) | [jaredcrowe](https://github.com/jaredcrowe) | [volatilevar](https://github.com/volatilevar) |
+| [innkuika](https://github.com/innkuika) | [JoelRSimpson](https://github.com/JoelRSimpson) | [joeltaylor](https://github.com/joeltaylor) | [exic](https://github.com/exic) | [JonathanPlasse](https://github.com/JonathanPlasse) |
+| [joesfer](https://github.com/joesfer) | [joybinchen](https://github.com/joybinchen) | [kaustubhsh](https://github.com/kaustubhsh) | [y-usuzumi](https://github.com/y-usuzumi) | [xuhcc](https://github.com/xuhcc) |
+| [kirtanprht](https://github.com/kirtanprht) | [k0ur0x](https://github.com/k0ur0x) | [kklas](https://github.com/kklas) | [xmlangel](https://github.com/xmlangel) | [troilus](https://github.com/troilus) |
+| [lboullo0](https://github.com/lboullo0) | [dbinary](https://github.com/dbinary) | [marc-bouvier](https://github.com/marc-bouvier) | [mvonmaltitz](https://github.com/mvonmaltitz) | [mlkood](https://github.com/mlkood) |
+| [plextoriano](https://github.com/plextoriano) | [Marmo](https://github.com/Marmo) | [mcejp](https://github.com/mcejp) | [freaktechnik](https://github.com/freaktechnik) | [martinkorelic](https://github.com/martinkorelic) |
+| [Petemir](https://github.com/Petemir) | [matsair](https://github.com/matsair) | [mgroth0](https://github.com/mgroth0) | [silentmatt](https://github.com/silentmatt) | [maxs-test](https://github.com/maxs-test) |
+| [MichBoi](https://github.com/MichBoi) | [MichipX](https://github.com/MichipX) | [MrTraduttore](https://github.com/MrTraduttore) | [sanjarcode](https://github.com/sanjarcode) | [Mustafa-ALD](https://github.com/Mustafa-ALD) |
+| [NJannasch](https://github.com/NJannasch) | [zomglings](https://github.com/zomglings) | [Frichetten](https://github.com/Frichetten) | [nicolas-suzuki](https://github.com/nicolas-suzuki) | [Ouvill](https://github.com/Ouvill) |
+| [shorty2380](https://github.com/shorty2380) | [dist3r](https://github.com/dist3r) | [rakleed](https://github.com/rakleed) | [idle-code](https://github.com/idle-code) | [bobchao](https://github.com/bobchao) |
+| [Diadlo](https://github.com/Diadlo) | [pranavmodx](https://github.com/pranavmodx) | [R3dError](https://github.com/R3dError) | [rajprakash00](https://github.com/rajprakash00) | [rahil1304](https://github.com/rahil1304) |
+| [rasulkireev](https://github.com/rasulkireev) | [reinhart1010](https://github.com/reinhart1010) | [Retew](https://github.com/Retew) | [ambrt](https://github.com/ambrt) | [Derkades](https://github.com/Derkades) |
+| [fourstepper](https://github.com/fourstepper) | [rodgco](https://github.com/rodgco) | [Ronnie76er](https://github.com/Ronnie76er) | [roryokane](https://github.com/roryokane) | [ruzaq](https://github.com/ruzaq) |
+| [szokesandor](https://github.com/szokesandor) | [SamuelBlickle](https://github.com/SamuelBlickle) | [livingc0l0ur](https://github.com/livingc0l0ur) | [bronson](https://github.com/bronson) | [semperor](https://github.com/semperor) |
+| [shawnaxsom](https://github.com/shawnaxsom) | [SFoskitt](https://github.com/SFoskitt) | [kcrt](https://github.com/kcrt) | [xissy](https://github.com/xissy) | [tams](https://github.com/tams) |
+| [Tekki](https://github.com/Tekki) | [ThatcherC](https://github.com/ThatcherC) | [TheoDutch](https://github.com/TheoDutch) | [tbroadley](https://github.com/tbroadley) | [Kriechi](https://github.com/Kriechi) |
+| [tkilaker](https://github.com/tkilaker) | [Tim-Erwin](https://github.com/Tim-Erwin) | [tcyrus](https://github.com/tcyrus) | [tobias-grasse](https://github.com/tobias-grasse) | [strobeltobias](https://github.com/strobeltobias) |
+| [kostegit](https://github.com/kostegit) | [tbergeron](https://github.com/tbergeron) | [Ullas-Aithal](https://github.com/Ullas-Aithal) | [MyTheValentinus](https://github.com/MyTheValentinus) | [vassudanagunta](https://github.com/vassudanagunta) |
+| [vijayjoshi16](https://github.com/vijayjoshi16) | [max-keviv](https://github.com/max-keviv) | [vandreykiv](https://github.com/vandreykiv) | [WisdomCode](https://github.com/WisdomCode) | [xsak](https://github.com/xsak) |
+| [ymitsos](https://github.com/ymitsos) | [abolishallprivateproperty](https://github.com/abolishallprivateproperty) | [aerotog](https://github.com/aerotog) | [albertopasqualetto](https://github.com/albertopasqualetto) | [asrient](https://github.com/asrient) |
+| [bestlibre](https://github.com/bestlibre) | [boring10](https://github.com/boring10) | [cadolphs](https://github.com/cadolphs) | [colorchestra](https://github.com/colorchestra) | [cybertramp](https://github.com/cybertramp) |
+| [dartero](https://github.com/dartero) | [delta-emil](https://github.com/delta-emil) | [doc75](https://github.com/doc75) | [dsp77](https://github.com/dsp77) | [ebayer](https://github.com/ebayer) |
+| [elsiehupp](https://github.com/elsiehupp) | [espinosa](https://github.com/espinosa) | [exponentactivity](https://github.com/exponentactivity) | [exprez135](https://github.com/exprez135) | [fab4x](https://github.com/fab4x) |
+| [fabianski7](https://github.com/fabianski7) | [rasperepodvipodvert](https://github.com/rasperepodvipodvert) | [gasolin](https://github.com/gasolin) | [githubaccount073](https://github.com/githubaccount073) | [hms5232](https://github.com/hms5232) |
+| [hydrandt](https://github.com/hydrandt) | [iamtalwinder](https://github.com/iamtalwinder) | [jabdoa2](https://github.com/jabdoa2) | [jduar](https://github.com/jduar) | [jibedoubleve](https://github.com/jibedoubleve) |
+| [johanvanheusden](https://github.com/johanvanheusden) | [jtagcat](https://github.com/jtagcat) | [konhi](https://github.com/konhi) | [krzysiekwie](https://github.com/krzysiekwie) | [lighthousebulb](https://github.com/lighthousebulb) |
+| [luzpaz](https://github.com/luzpaz) | [majsterkovic](https://github.com/majsterkovic) | [mak2002](https://github.com/mak2002) | [nmiquan](https://github.com/nmiquan) | [nullpointer666](https://github.com/nullpointer666) |
+| [oscaretu](https://github.com/oscaretu) | [oskarsh](https://github.com/oskarsh) | [osso73](https://github.com/osso73) | [over-soul](https://github.com/over-soul) | [pensierocrea](https://github.com/pensierocrea) |
+| [pomeloy](https://github.com/pomeloy) | [rhtenhove](https://github.com/rhtenhove) | [rikanotank1](https://github.com/rikanotank1) | [rxliuli](https://github.com/rxliuli) | [simonsan](https://github.com/simonsan) |
+| [stellarpower](https://github.com/stellarpower) | [suixinio](https://github.com/suixinio) | [sumomo-99](https://github.com/sumomo-99) | [xtatsux](https://github.com/xtatsux) | [taw00](https://github.com/taw00) |
+| [tcassaert](https://github.com/tcassaert) | [victante](https://github.com/victante) | [Voltinus](https://github.com/Voltinus) | [xcffl](https://github.com/xcffl) | [yourcontact](https://github.com/yourcontact) |
+| [zaoyifan](https://github.com/zaoyifan) | [zawnk](https://github.com/zawnk) | [zen-quo](https://github.com/zen-quo) | [zozolina123](https://github.com/zozolina123) | [xcession](https://github.com/xcession) |
+| [paventyang](https://github.com/paventyang) | [jackytsu](https://github.com/jackytsu) | [zhangmx](https://github.com/zhangmx) | | |
+
diff --git a/apps/jsonhero/README.md b/apps/jsonhero/README.md
index 6592d64f4..301cc5e7a 100644
--- a/apps/jsonhero/README.md
+++ b/apps/jsonhero/README.md
@@ -1,141 +1,140 @@
-
+[](https://console.algora.io/org/triggerdotdev/bounties?status=open) [](https://console.algora.io/org/triggerdotdev/bounties?status=completed)
-# Brought to you by Trigger.dev
+# 由 Trigger.dev 提供
-JSON Hero was created and is maintained by the team behind [Trigger.dev](https://trigger.dev). With Trigger.dev you can trigger workflows from APIs, on a schedule, or on demand. We make API calls easy with authentication handled for you, and you can add durable delays that survive server restarts.
+JSON Hero 由 Trigger.dev 团队创建和维护。使用 Trigger.dev,您可以从 API、定时或按需触发工作流。我们让 API 调用变得简单,为您处理身份验证,并且您可以添加持久延迟,即使服务器重启也能保持有效。
# JSON Hero
-JSON Hero makes reading and understand JSON files easy by giving you a clean and beautiful UI packed with extra features.
+JSON Hero 通过提供一个干净且美观的界面以及额外功能,使阅读和理解 JSON 文件变得容易。
-- View JSON any way you'd like: Column View, Tree View, Editor View, and more.
-- Automatically infers the contents of strings and provides useful previews
-- Creates an inferred JSON Schema that could be used to validate your JSON
-- Quickly scan related values to check for edge cases
-- Search your JSON files (both keys and values)
-- Keyboard accessible
-- Easily sharable URLs with path support
+* 以你喜欢的任何方式查看 JSON:列视图、树视图、编辑器视图,等等。
+* 自动推断字符串的内容并提供有用的预览
+* 生成一个推断出的 JSON 方案,可用于验证你的 JSON
+* 快速扫描相关值以检查边缘情况
+* 搜索你的 JSON 文件(包括键和值)
+* 键盘可访问
+* 带有路径支持的可分享 URL

-## Features
+## 功能
-### Send to JSON Hero
+### 发送给 JSON 英雄
-Send your JSON to JSON Hero in a variety of ways
+以多种方式将 JSON 发送到 JSON Hero
-- Head to [jsonhero.io](https://jsonhero.io) and Drag and Drop a JSON file, or paste JSON or a JSON url in the provided form
-- Include a Base64 encoded string of a JSON payload: [jsonhero.io/new?j=eyAiZm9vIjogImJhciIgfQ==](https://jsonhero.io/new?j=eyAiZm9vIjogImJhciIgfQ==)
-- Include a JSON URL to the `new` endpoint: [jsonhero.io/new?url=https://jsonplaceholder.typicode.com/todos/1](https://jsonhero.io/new?url=https://jsonplaceholder.typicode.com/todos/1)
-- Install the [VS Code extension](https://marketplace.visualstudio.com/items?itemName=JSONHero.jsonhero-vscode) and open JSON from VS Code
-- Raycast user? Check out our extension [here](https://www.raycast.com/maverickdotdev/open-in-json-hero)
-- Use the unofficial API:
+* 访问 [jsonhero.io](https://jsonhero.io),并拖放 JSON 文件,或在提供的表单中粘贴 JSON 或 JSON URL
+
+* 包含 JSON 载荷的 Base64 编码字符串:[jsonhero.io/new?j=eyAiZm9vIjogImJhciIgfQ==](https://jsonhero.io/new?j=eyAiZm9vIjogImJhciIgfQ==)
+
+* 包含指向 `new` 端点的 JSON URL:[jsonhero.io/new?url=https://jsonplaceholder.typicode.com/todos/1](https://jsonhero.io/new?url=https://jsonplaceholder.typicode.com/todos/1)
+
+* 安装 [VS Code 扩展](https://marketplace.visualstudio.com/items?itemName=JSONHero.jsonhero-vscode) ,然后从 VS Code 打开 JSON
+
+* Raycast 用户?请访问我们的扩展 [这里](https://www.raycast.com/maverickdotdev/open-in-json-hero)
+
+* 使用非官方 API:
+
+ * 向 `jsonhero.io/api/create.json` 发送一个 `POST` 请求,并附带以下 JSON 体:
+
+ ```json
+ {
+ "title": "test 123",
+ "content": { "foo": "bar" },
+ "readOnly": false, // this is optional, will make it so the document title cannot be edited or document cannot be deleted
+ "ttl": 3600 // this will expire the document after 3600 seconds, also optional
+ }
+ ```
+
+ JSON 响应如下:
+
+ ```json
+ {
+ "id": "YKKduNySH7Ub",
+ "title": "test 123",
+ "location": "https://jsonhero.io/j/YKKduNySH7Ub"
+ }
+ ```
+
- - Make a `POST` request to `jsonhero.io/api/create.json` with the following JSON body:
+### 列视图
- ```json
- {
- "title": "test 123",
- "content": { "foo": "bar" },
- "readOnly": false, // this is optional, will make it so the document title cannot be edited or document cannot be deleted
- "ttl": 3600 // this will expire the document after 3600 seconds, also optional
- }
- ```
-
- The JSON response will be the following:
-
- ```json
- {
- "id": "YKKduNySH7Ub",
- "title": "test 123",
- "location": "https://jsonhero.io/j/YKKduNySH7Ub"
- }
- ```
-
-### Column view
-
-Inspired by macOS Finder, Column View is a new way to browse a JSON document.
+列视图借鉴了 macOS Finder 的设计,是一种浏览 JSON 文档的新方式。

-It has all the features you'd expect: Keyboard navigation, Path bar, history.
+它具有你所期望的所有功能:键盘导航、路径栏、历史记录。
-It also has a nifty feature that allows you to "hold" a descendent selected and travel up through the hierarchy, and then move between siblings and view the different values found at that path. It's hard to describe, but here is an animation to help demonstrate:
+它还具有一项便捷的功能,允许你“保持”一个后代的选择,并向上遍历层次结构,然后在不同兄弟节点之间移动并查看该路径下找到的不同值。很难用语言描述,但这里有一个动画来帮助演示:

-As you can see, holding the `Option` (or `Alt` key on Windows) while moving to a parent keeps the part of the document selected and shows it in context of it's surrounding JSON. Then you can traverse between items in an array and compare the values of the selection across deep hierarchy cahnges.
+如你所见,在移动到父节点时按住 `Option`(或在 Windows 上按住 `Alt` 键),可以保持文档的部分选择,并在上下文中显示这部分。然后你可以在数组项之间遍历,并在深层次结构变化时比较选择项的值。
-### Editor view
+### 编辑器视图
-View your entire JSON document in an editor, but keep the nice previews and related values you get from the sidebar as you move around the document:
+在编辑器中查看整个 JSON 文档,但在移动文档时仍然保留侧边栏提供的漂亮预览和相关值:

-### Tree view
+### 树状视图
-Use a traditional tree view to traverse your JSON document, with collapsible sections and keyboard shortcuts. All while keeping the nice previews:
+使用传统的树状视图遍历您的 JSON 文档,具有可折叠部分和键盘快捷键。同时保持漂亮的预览:

-### Search
+### 搜索
-Quickly open a search panel and fuzzy search your entire JSON file in milliseconds. Searches through key names, key paths, values, and even pretty formatted values (e.g. Searching for `"Dec"` will find datetime strings in the month of December.)
+快速打开搜索面板,并在毫秒内对整个 JSON 文件进行模糊搜索。可以在键名、键路径、值,甚至漂亮的格式化值中进行搜索(例如,搜索 \``"Dec"`\` 将找到十二月的日期时间字符串)。

-### Content Previews
+### 内容预览
-JSON Hero automatically infers the content of strings and provides useful previews and properties of the value you've selected. It's "Show Don't Tell" for JSON:
+JSON Hero 会自动推断字符串的内容,并提供所选值的有用预览和属性。这就是 JSON 的“展示而不是讲述”:
-#### Dates and Times
+#### 日期和时间

-#### Image URLs
+#### 图片 URL

-#### Website URLs
+#### 网站链接

-#### Tweet URLS
+#### 推文链接

-#### JSON URLs
+#### JSON 链接

-#### Colors
+#### 颜色

-### Related Values
+### 相关值
-Easily see all the related values across your entire JSON document for a specific field, including any `undefined` or `null` values.
+轻松查看整个 JSON 文档中特定字段的所有相关值,包括任何 `undefined` 或 `null` 值。

-
+## 已知问题和功能请求
-## Bugs and Feature Requests
+遇到已知问题或有功能请求?欢迎随时 [创建一个新的 Issue](https://github.com/triggerdotdev/jsonhero-web/issues)。
-Have a bug or a feature request? Feel free to [open a new issue](https://github.com/triggerdotdev/jsonhero-web/issues).
+你还可以加入我们的 [Discord 频道](https://discord.gg/JtBAxBr2m3)来聊天和讨论任何你想讨论的内容。
-You can also join our [Discord channel](https://discord.gg/JtBAxBr2m3) to hang out and discuss anything you'd like.
+## 开发中
-## Developing
-
-To run locally, first clone the repo and install the dependencies:
+要本地运行,首先克隆仓库并安装依赖:
```bash
git clone https://github.com/triggerdotdev/jsonhero-web.git
@@ -143,12 +142,12 @@ cd jsonhero-web
npm install
```
-Then, create a file at the root of the repo called `.env` and set the `SESSION_SECRET` value:
+然后,在仓库根目录下创建一个名为 `.env` 的文件,并设置 `SESSION_SECRET` 的值:
```
SESSION_SECRET=abc123
```
-Then, run `npm run build` or `npm run dev` to build.
+然后,运行 `npm run build` 或 `npm run dev` 来构建。
-Now, run `npm start` and open your browser to `http://localhost:8787`
\ No newline at end of file
+现在运行 `npm start`,并在浏览器中打开 `http://localhost:8787`
\ No newline at end of file
diff --git a/apps/jsonhero/README_en.md b/apps/jsonhero/README_en.md
new file mode 100644
index 000000000..6592d64f4
--- /dev/null
+++ b/apps/jsonhero/README_en.md
@@ -0,0 +1,154 @@
+