消息外部化 (i18n)
ArcartX-Suite 提供 消息外部化框架,让模块的所有用户可见文本从硬编码迁移到可编辑的 messages.yml。服主可自定义措辞、翻译为其他语言,无需改动代码。
核心组件
| 组件 | 位置 | 职责 |
|---|---|---|
MessageProvider | api.message | 加载 messages.yml,提供 get(key, args...) 取值 |
AbstractAXSModule#messagesFileName() | api | 声明消息文件名,基类自动导出+加载 |
AbstractAXSModule#messages() | api | 获取已加载的 MessageProvider |
工作原理
模块 jar 内 messages.yml
│ (onEnable 时 context.exportConfigResource 导出)
▼
data/<moduleId>/messages.yml ← 用户可编辑
│ (MessageProvider.load 读取)
▼
messages().get("key", args) ← 代码中使用消息文件与 config.yml 走同一套资源导出管线。
接入步骤
1. 创建默认消息文件
在模块 src/main/resources/messages.yml:
yaml
# 支持 & 颜色码和 {0} {1} 占位符
prefix: "&3◆ &6ArcartX-Suite &7| &r"
no-permission: "&c你没有权限执行这个命令。"
toggle:
enabled: "&a功能已开启。"
disabled: "&e功能已关闭。"
status:
mode: "&7当前模式: &f{0}"嵌套键用点号路径访问:
status.mode→"当前模式: {0}"。
2. 模块声明消息文件
java
@Override
protected String messagesFileName() {
return "messages.yml";
}3. 注入到命令/服务
messages() 在 startService() 之前已就绪,可直接传给命令:
java
@Override
protected Map<String, TabExecutor> commandBindings() {
return Map.of("mycommand", new MyCommand(messages()));
}4. 替换硬编码文本
java
// 改造前
player.sendMessage(PREFIX + ChatColor.RED + "你没有权限执行这个命令。");
// 改造后
player.sendMessage(messages.get("prefix") + messages.get("no-permission"));带占位符:
java
// messages.yml: status.mode: "&7当前模式: &f{0}"
player.sendMessage(messages.get("status.mode", modeName));API 速查
| 方法 | 说明 |
|---|---|
get(key) | 取消息;键不存在时返回键名本身(便于发现遗漏) |
get(key, args...) | 取消息并替换 {0} {1} ... 占位符;null 参数替换为空串 |
has(key) | 判断键是否存在 |
size() | 已加载消息条数 |
get 自动翻译 & 颜色码为 §。
注意事项
- 键命名:用
kebab-case+ 点号分层(如toggle.enabled) - 前缀复用:把
prefix也放进messages.yml,连品牌前缀都可定制 - reload 生效:用户编辑
data/<moduleId>/messages.yml后/axs reload <module>即可 - 新增字段无需迁移声明:
messages.yml不是配置,不走ConfigDiagnosticEngine,新增键直接在 jar 默认文件补充即可