Skip to content

消息外部化 (i18n)

ArcartX-Suite 提供 消息外部化框架,让模块的所有用户可见文本从硬编码迁移到可编辑的 messages.yml。服主可自定义措辞、翻译为其他语言,无需改动代码。

核心组件

组件位置职责
MessageProviderapi.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 默认文件补充即可

基于 GPL-3.0 许可发布