我想翻译我的斜杠命令。
setNameLocalizations()
和 setDescriptionLocalizations
按预期工作。如果我添加带有选项的字符串选项,使用 name_localizations
也可以; Discord 上的选择是本地化的。
但是,如果我想翻译自动完成的值,它只显示英文版本(即
name
字段)。文档指出 interaction.respond()
接受具有 ApplicationCommandOptionChoiceData
键的
nameLocalizations
数组,但它不执行任何操作。
有什么办法可以翻译这些吗?
export const command = {
data: new SlashCommandBuilder()
.setName('example')
.setDescription('Some description')
.setNameLocalizations({ de: 'Beispiel' })
.setDescriptionLocalizations({ de: 'Einige Beschreibung' })
.addStringOption((option) =>
option
.setName('month')
.setDescription('Month')
.setNameLocalizations({ de: 'monat' })
.setDescriptionLocalizations({ de: 'Monat' })
.addChoices(
{
name: 'January',
name_localizations: { de: 'Januar' },
value: '01',
},
{
name: 'February',
name_localizations: { de: 'Februar' },
value: '02',
},
{
name: 'March',
name_localizations: { de: 'März' },
value: '03',
},
// ... and so on
)
.setRequired(true),
)
.addStringOption((option) =>
option
.setName('gift')
.setNameLocalizations({ de: 'Geschenk' })
.setDescription('What gift you want?')
.setDescriptionLocalizations({ de: 'Welches Geschenk willst du?' })
.setAutocomplete(true)
.setRequired(true),
),
async autocomplete(interaction) {
const focusedValue = interaction.options.getFocused();
const filtered = values.filter((choice) =>
choice.name.en.toLowerCase().includes(focusedValue.toLowerCase()),
);
await interaction.respond(
filtered
.map((choice) => ({
name: choice.name.en,
// it's completely ignored
nameLocalizations: {
de: choice.name.de,
},
value: choice.value,
}))
.slice(0, 25),
);
},
// ... execute
};
我知道我有点晚了,但我刚刚找到了一种解决方法,似乎可以解决问题而不会出现进一步的复杂情况。
该函数接收到的
interaction
对象包含适合用户的 locale
,因此使用此值访问您的名称对象应该不需要 nameLocalizations
键。
我注意到您没有使用与语言环境对象相同的格式,因此我包含了获取 2 位语言环境格式的函数。
async autocomplete(interaction) {
const focusedValue = interaction.options.getFocused();
const locale = interaction.locale;
const locale2digit = locale.split('-')[0];
const filtered = values.filter((choice) => choice.name.en.toLowerCase().includes(focusedValue.toLowerCase()));
await interaction.respond(
filtered
.map((choice) => ({
name: choice.name[locale2digit],
value: choice.value,
}))
.slice(0, 25)
);
}