Files
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

184 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
front:
hard: 入门
time: 8分钟
---
# 语言文件
## 介绍
用于提高插件的灵活性增加插件的国际化应用
一般情况下语言文件是形如这样的
> lang/zh_CN.yml
```yaml
editor-input-enums: '请选择 {0}'
editor-input-chat:
- ==: JSON
text: ' &5&l &r &7请在聊天框中输入你要设置的值, 当前值为: &f&n[{0}]'
args:
- suggest: '{0}'
hover: '点击复制'
```
## 文件格式
通用语言文件使用 .yml 作为文件后缀,并以 zh_CN 等语言代码作为文件名。
- zh_CN.yml 为简体中文语言文件
- zh_TW.yml 为繁体中文语言文件
- en_US.yml 为英文语言文件
在文件中,每一行都是一个 键值对,键值对的格式为 键: 值 或 键: [值1, 值2, 值3]。
```yaml
example-language-list:
- '这是一个示例语言文件'
- '这是一个示例语言文件'
- '这是一个示例语言文件'
```
整个文件必须采用扁平化的结构(即不允许使用 键1: { 键2: 值 } 的格式)。
## 复合文本模式
通常一个节点可以有很多表现
```yaml
node:
- type: text
text: hello world!
- type: title
title: hello world!
subtitle: sub
fadein: 1
stay: 1
fadeout: 1
- type: sound
sound: block_stone_break
volume: 1
pitch: 1
- type: json
text:
- [hello] [world!]
args:
- hover: hello
command: say hello
- hover: world!
command: say world
```
我们举个例子 以Trmenu的 打开UI提示PAPI拓展不足举例
```yaml
Menu-Expansions-Header:
- '&8[&3Tr&bMenu&8] &7你必须安装 PAPI &f{0} &7个拓展以使用此菜单.'
- type: JSON
text: '&7请在安装后 [&3&n点击重载] &7拓展'
args:
- hover: '&7点击重载 PAPI 拓展'
command: '/papi reload'
Menu-Expansions-Format:
- type: JSON
text: '&8- [&a{0}]&r'
args:
- hover: '&7点击下载'
command: '/papi ecloud download {0}'
```
如果你觉得上文的复合文本模式比较复杂且难以编写,那么是时候了解一下 `TabooComponent` 了这是类似于 `MiniMessage` 的功能。
它允许你在单行内设置相应参数。需要操作的文本使用 `[]` 框住,在其后面加上 `()` 用以配置具体参数。参数之间使用 `;` 分隔。
如果我们想在语言文件中使用这个功能时,需要手动打开这个功能:
```kotlin
object ExamplePlugin : Plugin() {
override fun onEnable() {
//你的启动逻辑...
// 启用 TabooLibComponent
Language.enableSimpleComponent = true
}
}
```
```yaml
node: 'TabooLib真[强]b;u啊'
node1: '[点我]hover=快点我啊!;suggest=测试)送屠龙宝刀'
```
使用 sendLang 发送给玩家后得到的效果就是:
![](../images/0_10.png)
那么如果你需要在发送的文本中显示 `[]`,那么就需要进行转义。转义的方法很简单,只需要在对应文本前加上 `\` 符号即可,例如:
```yaml
node: '[\[点我\]]command=/stop关服'
# 复合文本要套在一个 [] 内
nodes: 这是一条[红色的[\[可点击\]]command=sb;hover=测试)的]测试信息。
# [红色的[可点击]command=test;hover=测试)的]
```
已知支持转义的字符有:`[ ]` `( )` `;` `=` `\\`
## 可选参数
`TabooComponent` 支持很多参数,如下表格为已知的可选参数:
| 名称 | 别名 | 功能 | 案例 | 效果图 |
|---------|-----|-----------------------|-----------------------------------------------------|-------------------------|
| s | | 删除下划线 | [删除线]s | ![](../images/0_11.png) |
| u | | 添加下划线 | [下划线]u | ![](../images/0_12.png) |
| italic | i | 添加斜体 | [斜体]i | ![](../images/0_13.png) |
| bold | b | 添加粗体 | [粗体]b | ![](../images/0_14.png) |
| obf | o | 添加模糊,也就是一直变化的代码 | [模糊]o | ![](../images/0_16.png) |
| reset | r | 移除所有装饰和颜色 | [&6移除]r | ![](../images/0_15.png) |
| newline | nl | 换行 | 坏黑,[]nl我爱你 | ![](../images/0_18.png) |
| font | f | 改变字体 | [TabooLib]f=uniform | ![](../images/0_19.png) |
| url | | 点击后打开链接 | [\[点击\]]url=https://tabooproject.org/打开TabooLib官网 | ![](../images/0_20.png) |
| command | cmd | 点击后执行对应指令 | 点击[\[关服\]]cmd=/stop | ![](../images/0_21.png) |
| hover | h | 鼠标悬停显示内容使用`<br>`,可以换行 | [悬浮]h=这是悬浮信息) | ![](../images/0_22.png) |
| suggest | | 点击后在输入框填入内容 | [建议]suggest=喵喵喵!) | ![](../images/0_23.png) |
| copy | | 点击后将内容复制到剪切板 | [点击以复制喵喵喵]copy=喵喵喵!) | ![](../images/0_24.png) |
| color | c | 设置颜色支持hex或原版颜色 | [我是粉色的]c=#e44b8d | ![](../images/0_25.png) |
| gradient | g | 设置渐变色 | []gradient=#f6d365,#fda085 | ![](../images/0_26.png) |
| insertion | insert | 按住shift点击后插入文本 | [&6按住shift点我]insert=坏黑爱我)告诉你一个秘密 | ![](../images/0_27.png) |
| keybind | key | 替换文本为键位 | 按下[key.jump]key以跳跃 | ![](../images/0_28.png) |
| translate | trans | 替换文本为当前语言下的译名 | 我叫[block.minecraft.diamond_block]trans | ![](../images/0_29.png) |
## 调用 - 直接发送
那么语言相关内容在代码里如何书写呢?
可以直接使用 `CommandSender#sendLang("路径节点",参数0,参数1,参数2)` 方法
```kotlin
if (expansions.isNotEmpty()) {
e.isCancelled = true
viewer.sendLang("Menu-Expansions-Header", expansions.size)
expansions.forEach { viewer.sendLang("Menu-Expansions-Format", it) }
}
```
## 调用 - 获取文本
结合菜单功能 我想给菜单也做 I18n 我应该如何写呢
```kotlin
fun openMenu(player: Player) {
player.openMenu<Chest>(player.asLangText("ui-title")) {
map(
"#########",
"# A #",
"#########",
)
set('A', buildItem(XMaterial.APPLE) {
name = player.asLangText("ui-apple-name")
lore.addAll(player.asLangTextList("ui-apple-lore"))
colored()
}) {
player.sendLang("ui-apple-click")
}
}
}
```
## 设置语言文件
```kotlin
@SubscribeEvent
fun lang(event: PlayerSelectLocaleEvent) {
event.locale = config.getString("Lang", "zh_CN")!!
}
@SubscribeEvent
fun lang(event: SystemSelectLocaleEvent) {
event.locale = config.getString("Lang", "zh_CN")!!
}
```