Discord.js 本地化适用于命令名称、描述和选择,但不适用于自动完成

问题描述 投票:0回答:1

我想翻译我的斜杠命令。

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
};
javascript node.js discord discord.js localization
1个回答
0
投票

我知道我有点晚了,但我刚刚找到了一种解决方法,似乎可以解决问题而不会出现进一步的复杂情况。

该函数接收到的

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)
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.