本文详解如何在 discord.js 中结合用户语言设置与临时消息特性,创建既支持多语言又仅对触发者可见的 slash 命令响应。
在 Discord.js(v14+)中,为 Slash 命令实现本地化(Localized)且临时(Ephemeral)的回复是常见需求,尤其适用于需要尊重用户语言偏好、同时避免频道刷屏的管理类或工具类指令。关键在于正确使用 interaction.reply() 的参数格式——它支持两种调用方式,但只有对象形式才能启用 ephemeral 等高级选项。
interaction.reply() 接收一个 InteractionReplyOptions 对象作为唯一参数。要同时实现本地化和临时性,需将语言映射值赋给 content 字段,并显式设置 ephemeral: true:
async execute(interaction) {
const locales = {
'pl': 'Witaj Świecie!',
'de': 'Hallo Welt!',
'fr': 'Bonjour le monde !',
'ja': 'こんにちは世界!',
};
// ✅ 正确:以对象形式传递 content + ephemeral
await interaction.reply({
content: locales[interaction.locale] ?? 'Hello World!',
ephemeral: true,
});
}? interaction.locale 自动返回用户的客户端语言(如 'fr'、'zh-CN'),无需额外解析。若用户语言未在 locales 中定义,?? 提供默认英文兜底。
以下写法会报错(语法错误或行为异常):
// ⛔ 错误:试图将字符串和命名参数混用(JS 不支持)
await interaction.reply(
locales[interaction.locale] ?? 'Hello World!',
ephemeral: true // ❌ 语法错误:这不是合法的 JS 参数写法
);
// ⛔ 错误:传入字符串后额外加选项(reply 不接受第二个参数)
await interaction.reply(
locales[interaction.locale] ?? 'Hello World!',
{ ephemeral: true } // ❌ 第二个参数被忽略,消息仍为非临时
);通过统一采用对象参数格式,你既能保持代码简洁,又能灵活组合 content、ephe
meral、embeds、components 等所有响应选项,为用户提供真正个性化、隐私友好的 Discord 体验。