新增
- 适配器 [Mirai(官方)](https://github.com/nonebot/adapter-mirai)
- 适配器 [TailChat](https://github.com/eya46/nonebot-adapter-tailchat)
- `Text` 新增 `.bold()`, `.italic()` 等一系列便捷方法
- 新增 `I18n` 通用消息段(在发送前会转为 UniMessage)
- `AlconnaMatcher` 新增 `.i18n()` 方法,与 `I18n` 作用相同
- 新增内置插件 `lang`,可以切换或列出可用的语言模式
改进
- 升级 `Tarina` 至 0.5.0 以使用 tarina-lang 新特性
i18n 说明
plugin-alconna 的 i18n 支持基于 [`tarina.lang`](https://github.com/ArcletProject/Tarina/tree/main/src/tarina/lang),其提供了一个 tarina-lang 命令行工具
首先可以通过 `tarina-lang new` 创建文件夹 `i18n`
之后使用 `cd ./i18n` 和 `tarina-lang init`,会生成如下文件:
diff
📦 awesome-bot
├──📂 i18n
++ ├── __init__.py
++ ├── .config.json
++ ├── .template.json
++ └── .template.schema.json
├── xxx.py
└── ...
你需要将你语言文件中所有包含的项目声明在 `.template.json` 中,例如:
json
{
"$schema": ".template.schema.json",
"scopes" : [
{
"scope": "example",
"types": [
"test",
{
"subtype": "test1",
"types": [
"test2"
]
}
]
}
]
}
然后通过 `tarina-lang schema` 和 `tarina-lang create XXX` 来创建新的语言文件。以下为使用命令创建 `en-US` 和 `zh-CN` 语言文件后的文件结构:
diff
📦 awesome-bot
├──📂 i18n
│ ├── __init__.py
│ ├── .config.json
++ ├── .lang.schema.json
│ ├── .template.json
│ ├── .template.schema.json
++ ├── en-US.json
++ └── zh-CN.json
├── plugin.py
└── ...
其中一个语言文件如下所示:
json5
// en-US.json
{
"$schema": "./.lang.schema.json",
"example": {
"test": "Test",
"test1": {
"test2": "Test2"
}
}
}
> [!NOTE]
> `tarina-lang` 支持创建和读取 YAML 格式的语言文件。当然首先你需要额外安装 `tarina[yaml]`
>
> 然后通过 `tarina-lang create XXX --yaml` 创建 `.yml` 文件
>
> 一个 yaml 格式的语言文件如下所示:
yaml
$schema: .lang.schema.json
example:
test: Test
test1:
test2: Test2
之后,在 `plugin` 里面,你可以用如下方法来使用i18n条目:
python
from .i18n import lang
...
async def _():
await matcher.send(lang.require("example", "test")) Test
await matcher.send(lang.require("example", "test1.test2")) Test2
高级一点,你可以通过 `tarina-lang model` 来生成一个模型文件:
diff
📦 awesome-bot
├──📂 i18n
│ ├── __init__.py
│ ├── .config.json
│ ├── .lang.schema.json
│ ├── .template.json
│ ├── .template.schema.json
│ ├── en-US.json
++ ├── model.py
│ └── zh-CN.json
├── plugin.py
└── ...
其中 `model.py`:
python
from tarina.lang.model import LangItem, LangModel
class ExampleTest1:
test2: LangItem = LangItem("example", "test1.test2")
class Example:
test: LangItem = LangItem("example", "test")
test1: ExampleTest1
class Lang(LangModel):
example = Example
之后便可以这样使用:
python
from .i18n import Lang
...
async def _():
await matcher.send(Lang.example.test())
如果你的条目是模板字符串,你可以使用 Lang.example.test(...)
await matcher.send(Lang.example.test1.test2())
基于此,`I18n` 和 `AlconnaMatcher.i18n` 可以如下使用:
python
await AlconnaMatcher.send(UniMessage.i18n(Lang.example.test, ...))
await AlconnaMatcher.send(UniMessage.i18n("example", "test", ...))
await AlconnaMatcher.send(AlconnaMatcher.i18n(Lang.example.test1.test2, ...))
await AlconnaMatcher.send(AlconnaMatcher.i18n("example", "test1.test2", ...))
> [!NOTE]
> 在 `plugin-alconna` 中, i18n 条目会先被转换成 UniMessageTemplate
> 所以 UniMessageTemplate 的所有特性都可用于 i18n 条目
> 例如:
python
example.test: "{:At(user, $event.get_user_id())} Hello!"
await XXX.send(XXX.i18n("example", "test"))
> 特别的,因为 `I18n` 是一个通用消息段,所以 i18n 条目可以嵌套:
json
{
"example": {
"test": "XXXX",
"foo": "{:I18n(example, test)}, XXXX!"
}
}
**Full Changelog**: https://github.com/nonebot/plugin-alconna/compare/v0.45.4...v0.46.0