Skip to content

Commit

Permalink
fix: correct typos and update URLs in README.md (#968)
Browse files Browse the repository at this point in the history
* fix: correct typos and update URLs in README.md

- Corrected "Savlo" to "Salvo"
- Changed "offical" to "official"
- Updated the URL for Example Projects
- Improved the sentence "This is official crate" to "This is an official crate"

* fix: correct mixed punctuation in README files

- Standardized punctuation marks in `README.md`
- Standardized punctuation marks in `README.zh-hans.md`
- Standardized punctuation marks in `README.zh-hant.md`

* fix typo
  • Loading branch information
houseme authored Nov 1, 2024
1 parent df11e3e commit a59a64e
Show file tree
Hide file tree
Showing 26 changed files with 168 additions and 145 deletions.
29 changes: 21 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div align="center">
<p><img alt="Savlo" width="132" style="max-width:40%;min-width:60px;" src="https://salvo.rs/images/logo-text.svg" /></p>
<p><img alt="Salvo" width="132" style="max-width:40%;min-width:60px;" src="https://salvo.rs/images/logo-text.svg" /></p>
<p>
<a href="https://github.com/salvo-rs/salvo/blob/main/README.md">English</a>&nbsp;&nbsp;
<a href="https://github.com/salvo-rs/salvo/blob/main/README.zh-hans.md">简体中文</a>&nbsp;&nbsp;
Expand Down Expand Up @@ -48,11 +48,13 @@ Salvo is an extremely simple and powerful Rust web backend framework. Only basic
- Support Tower Service and Layer;

## ⚡️ Quick Start

You can view samples [here](https://github.com/salvo-rs/salvo/tree/main/examples), or view [official website](https://salvo.rs).

### Hello World with ACME and HTTP3

**It only takes a few lines of code to implement a server that supports ACME to automatically obtain certificates and supports HTTP1, HTTP2, and HTTP3 protocols.**
**It only takes a few lines of code to implement a server that supports ACME to automatically obtain certificates and
supports HTTP1, HTTP2, and HTTP3 protocols.**

```rust
use salvo::prelude::*;
Expand All @@ -76,7 +78,8 @@ async fn main() {

### Middleware

There is no difference between Handler and Middleware, Middleware is just Handler. **So you can write middlewares without to know concepts like associated type, generic type. You can write middleware if you can write function!!!**
There is no difference between Handler and Middleware, Middleware is just Handler. **So you can write middlewares
without to know concepts like associated type, generic type. You can write middleware if you can write function!!!**

```rust
use salvo::http::header::{self, HeaderValue};
Expand All @@ -99,7 +102,7 @@ This is a very simple middleware, it adds `Header` to `Response`, view [full sou

### Chainable tree routing system

Normally we write routing like this
Normally we write routing like this:

```rust
Router::with_path("articles").get(list_articles).post(create_article);
Expand All @@ -118,13 +121,15 @@ Router::with_path("articles")
```

Then write the routers that require the user to login together, and use the corresponding middleware to verify whether the user is logged in:

```rust
Router::with_path("articles")
.hoop(auth_check)
.push(Router::with_path("<id>").patch(edit_article).delete(delete_article));
```

Although these two routes have the same `path("articles")`, they can still be added to the same parent route at the same time, so the final route looks like this:
Although these two routes have the same
`path("articles")`, they can still be added to the same parent route at the same time, so the final route looks like this:

```rust
Router::new()
Expand All @@ -140,9 +145,10 @@ Router::new()
);
```

`<id>` matches a fragment in the path, under normal circumstances, the article `id` is just a number, which we can use regular expressions to restrict `id` matching rules, `r"<id:/\d+/>"`.
`<id>` matches a fragment in the path, under normal circumstances, the article`id` is just a number, which we can use regular expressions to restrict `id` matching rules, `r"<id:/\d+/>"`.

You can also use `<**>`, `<*+>` or `<*?>` to match all remaining path fragments. In order to make the code more readable, you can also add appropriate name to make the path semantics more clear, for example: `<**file_path>`.
You can also use `<**>`, `<*+>` or`<*?>` to match all remaining path fragments.
In order to make the code more readable, you can also add appropriate name to make the path semantics more clear, for example: `<**file_path>`.

Some regular expressions for matching paths need to be used frequently, and it can be registered in advance, such as GUID:

Expand Down Expand Up @@ -265,16 +271,22 @@ async fn main() {
```

### 🛠️ Salvo CLI

Salvo CLI is a command-line tool that simplifies the creation of new Salvo projects, supporting templates for web APIs, websites, databases (including SQLite, PostgreSQL, and MySQL via SQLx, SeaORM, Diesel, Rbatis), and basic middleware.
You can use [salvo-cli](https://github.com/salvo-rs/salvo-cli) to create a new Salvo project:

#### install

```bash
cargo install salvo-cli
```

#### create a new salvo project

```bash
salvo new project_name
```

___

### More Examples
Expand Down Expand Up @@ -304,7 +316,8 @@ Benchmark testing result can be found from here:

## ☕ Donate

Salvo is an open source project. If you want to support Salvo, you can ☕ [**buy me a coffee here**](https://ko-fi.com/chrislearn).
Salvo is an open source project. If you want to support Salvo, you can ☕ [**buy me a coffee here
**](https://ko-fi.com/chrislearn).

## ⚠️ License

Expand Down
68 changes: 36 additions & 32 deletions README.osc.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div align="center">
<p><img alt="Savlo" width="132" style="max-width:40%;min-width:60px;" src="https://salvo.rs/images/logo-text.svg" /></p>
<p><img alt="Salvo" width="132" style="max-width:40%;min-width:60px;" src="https://salvo.rs/images/logo-text.svg" /></p>
<p>
<a href="https://github.com/salvo-rs/salvo/blob/main/README.md">English</a>&nbsp;&nbsp;
<a href="https://github.com/salvo-rs/salvo/blob/main/README.zh-hans.md">简体中文</a>&nbsp;&nbsp;
Expand Down Expand Up @@ -33,9 +33,9 @@
</p>
</div>

Salvo(赛风) 是一个极其简单且功能强大的 Rust Web 后端框架. 仅仅需要基础 Rust 知识即可开发后端服务.
Salvo(赛风) 是一个极其简单且功能强大的 Rust Web 后端框架仅仅需要基础 Rust 知识即可开发后端服务

> 中国用户可以添加我微信(chrislearn), 拉微信讨论群或者直接加入QQ群:823441777.
> 中国用户可以添加我微信 (chrislearn), 拉微信讨论群或者直接加入 QQ 群:823441777.
## 🎯 功能特色

Expand All @@ -46,16 +46,16 @@ Salvo(赛风) 是一个极其简单且功能强大的 Rust Web 后端框架. 仅
- 集成 Multipart 表单处理;
- 支持 WebSocket, WebTransport;
- 支持 OpenAPI;
- 支持 Acme, 自动从 [let's encrypt](https://letsencrypt.org/) 获取 TLS 证书.
- 支持 Tower Serivce 和 Layer.
- 支持 Acme, 自动从 [let's encrypt](https://letsencrypt.org/)获取 TLS 证书
- 支持 Tower Service 和 Layer.

## ⚡️ 快速开始

你可以查看[实例代码](https://github.com/salvo-rs/salvo/tree/main/examples), 或者访问[官网](https://salvo.rs).
你可以查看[实例代码](https://github.com/salvo-rs/salvo/tree/main/examples), 或者访问[官网](https://salvo.rs).

### 支持 ACME 自动获取证书和 HTTP3 的 Hello World

**只需要几行代码就可以实现一个同时支持 ACME 自动获取证书以及支持 HTTP1,HTTP2, HTTP3 协议的服务器.**
**只需要几行代码就可以实现一个同时支持 ACME 自动获取证书以及支持 HTTP1,HTTP2,HTTP3 协议的服务器**

```rust
use salvo::prelude::*;
Expand All @@ -70,7 +70,7 @@ async fn main() {
let mut router = Router::new().get(hello);
let listener = TcpListener::new("0.0.0.0:443")
.acme()
.add_domain("test.salvo.rs") // 用你自己的域名替换此域名.
.add_domain("test.salvo.rs") // 用你自己的域名替换此域名
.http01_challenge(&mut router).quinn("0.0.0.0:443");
let acceptor = listener.join(TcpListener::new("0.0.0.0:80")).bind().await;
Server::new(acceptor).serve(router).await;
Expand All @@ -79,7 +79,8 @@ async fn main() {

### 中间件

Salvo 中的中间件其实就是 Handler, 没有其他任何特别之处. **所以书写中间件并不需要像其他某些框架需要掌握泛型关联类型等知识. 只要你会写函数就会写中间件, 就是这么简单!!!**
Salvo 中的中间件其实就是 Handler, 没有其他任何特别之处。**所以书写中间件并不需要像其他某些框架需要掌握泛型关联类型等知识。
只要你会写函数就会写中间件,就是这么简单!!!**

```rust
use salvo::http::header::{self, HeaderValue};
Expand All @@ -92,14 +93,13 @@ async fn add_header(res: &mut Response) {
}
```

然后将它添加到路由中:
然后将它添加到路由中

```rust
Router::new().hoop(add_header).get(hello)
```

这就是一个简单的中间件, 它向 `Response` 的头部添加了 `Header`, 查看[完整源码](https://github.com/salvo-rs/salvo/blob/main/examples/middleware-add-header/src/main.rs).

这就是一个简单的中间件,它向 `Response` 的头部添加了 `Header`, 查看[完整源码](https://github.com/salvo-rs/salvo/blob/main/examples/middleware-add-header/src/main.rs).

### 可链式书写的树状路由系统

Expand All @@ -113,23 +113,23 @@ Router::with_path("articles/<id>")
.delete(delete_article);
```

往往查看文章和文章列表是不需要用户登录的, 但是创建, 编辑, 删除文章等需要用户登录认证权限才可以. Salvo 中支持嵌套的路由系统可以很好地满足这种需求. 我们可以把不需要用户登录的路由写到一起:
往往查看文章和文章列表是不需要用户登录的但是创建,编辑,删除文章等需要用户登录认证权限才可以Salvo 中支持嵌套的路由系统可以很好地满足这种需求我们可以把不需要用户登录的路由写到一起:

```rust
Router::with_path("articles")
.get(list_articles)
.push(Router::with_path("<id>").get(show_article));
```

然后把需要用户登录的路由写到一起, 并且使用相应的中间件验证用户是否登录:
然后把需要用户登录的路由写到一起,并且使用相应的中间件验证用户是否登录:

```rust
Router::with_path("articles")
.hoop(auth_check)
.push(Router::with_path("<id>").patch(edit_article).delete(delete_article));
```

虽然这两个路由都有这同样的 `path("articles")`, 然而它们依然可以被同时添加到同一个父路由, 所以最后的路由长成了这个样子:
虽然这两个路由都有这同样的 `path("articles")`, 然而它们依然可以被同时添加到同一个父路由所以最后的路由长成了这个样子

```rust
Router::new()
Expand All @@ -145,11 +145,11 @@ Router::new()
);
```

`<id>` 匹配了路径中的一个片段, 正常情况下文章的 `id` 只是一个数字, 这是我们可以使用正则表达式限制 `id` 的匹配规则, `r"<id:/\d+/>"`.
`<id>`匹配了路径中的一个片段,正常情况下文章的的 `id`只是一个数字,这是我们可以使用正则表达式限制制 `id`的匹配规则`r"<id:/\d+/>"`.

还可以通过 `<**>`, `<*+>` 或者 `<*?>` 匹配所有剩余的路径片段. 为了代码易读性性强些, 也可以添加适合的名字, 让路径语义更清晰, 比如: `<**file_path>`.
还可以通过 `<**>`, `<*+>` 或者 `<*?>`匹配所有剩余的路径片段为了代码易读性性强些也可以添加适合的名字让路径语义更清晰,比如:: `<**file_path>`.

有些用于匹配路径的正则表达式需要经常被使用, 可以将它事先注册, 比如 GUID:
有些用于匹配路径的正则表达式需要经常被使用可以将它事先注册比如 GUID:

```rust
PathFilter::register_wisp_regex(
Expand All @@ -158,7 +158,7 @@ PathFilter::register_wisp_regex(
);
```

这样在需要路径匹配时就变得更简洁:
这样在需要路径匹配时就变得更简洁

```rust
Router::with_path("<id:guid>").get(index)
Expand All @@ -168,7 +168,7 @@ Router::with_path("<id:guid>").get(index)

### 文件上传

可以通过 `Request` 中的 `file` 异步获取上传的文件:
可以通过 `Request` 中的 `file`异步获取上传的文件

```rust
#[handler]
Expand All @@ -189,7 +189,7 @@ async fn upload(req: &mut Request, res: &mut Response) {

### 提取请求数据

可以轻松地从多个不同数据源获取数据, 并且组装为你想要的类型. 可以先定义一个自定义的类型, 比如:
可以轻松地从多个不同数据源获取数据并且组装为你想要的类型可以先定义一个自定义的类型,比如:

```rust
#[derive(Serialize, Deserialize, Extractible, Debug)]
Expand All @@ -206,7 +206,7 @@ struct GoodMan<'a> {
}
```

然后在 `Handler` 中可以这样获取数据:
然后在 `Handler`中可以这样获取数据

```rust
#[handler]
Expand All @@ -215,8 +215,7 @@ async fn edit(req: &mut Request) {
}
```

甚至于可以直接把类型作为参数传入函数, 像这样:

甚至于可以直接把类型作为参数传入函数,像这样:

```rust
#[handler]
Expand All @@ -227,7 +226,6 @@ async fn edit<'a>(good_man: GoodMan<'a>) {

查看[完整源码](https://github.com/salvo-rs/salvo/blob/main/examples/extract-nested/src/main.rs)


### OpenAPI 支持

无需对项目做大的改动,即可实现对 OpenAPI 的完美支持。
Expand Down Expand Up @@ -272,21 +270,27 @@ async fn main() {
```

### 🛠️ Salvo CLI
Salvo CLI是一个命令行工具,可以简化创建新的Salvo项目的过程,支持Web API、网站、数据库(包括通过SQLx、SeaORM、Diesel、Rbatis支持的SQLite、PostgreSQL、MySQL)和基本的中间件的模板。
你可以使用 [salvo-cli](https://github.com/salvo-rs/salvo-cli) 来创建一个新的 Salvo 项目:

Salvo CLI 是一个命令行工具,可以简化创建新的 Salvo 项目的过程,支持 Web API、网站、数据库(包括通过 SQLx、SeaORM、Diesel、Rbatis 支持的 SQLite、PostgreSQL、MySQL)和基本的中间件的模板。
你可以使用 [salvo-cli](https://github.com/salvo-rs/salvo-cli)来创建一个新的 Salvo 项目:

#### 安装

```bash
cargo install salvo-cli
```
#### 创建一个salvo项目

#### 创建一个 Salvo 项目

```bash
salvo new project_name
```

___

### 更多示例

您可以从 [examples](./examples/) 文件夹下查看更多示例代码, 您可以通过以下命令运行这些示例:
您可以从 [examples](./examples/)文件夹下查看更多示例代码您可以通过以下命令运行这些示例:

```bash
cd examples
Expand All @@ -297,7 +301,7 @@ cargo run --bin example-basic-auth

## 🚀 性能

Benchmark 测试结果可以从这里查看:
Benchmark 测试结果可以从这里查看

[https://web-frameworks-benchmark.netlify.app/result?l=rust](https://web-frameworks-benchmark.netlify.app/result?l=rust)

Expand All @@ -311,14 +315,14 @@ Benchmark 测试结果可以从这里查看:

## ☕ 捐助

`Salvo`是一个开源项目, 如果想支持本项目, 可以 ☕ [**请我喝杯咖啡**](https://ko-fi.com/chrislearn).
`Salvo`是一个开源项目如果想支持本项目可以 ☕ [**请我喝杯咖啡**](https://ko-fi.com/chrislearn).
<p style="text-align: center;">
<img src="https://salvo.rs/images/alipay.png" alt="Alipay" width="180"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://salvo.rs/images/weixin.png" alt="Weixin" width="180"/>
</p>

## ⚠️ 开源协议

Salvo 项目采用以下开源协议:
Salvo 项目采用以下开源协议

- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))

Expand Down
Loading

0 comments on commit a59a64e

Please sign in to comment.