Windows phone 嘿,Cortana,如何在代码中处理多种VCD语言?

Windows phone 嘿,Cortana,如何在代码中处理多种VCD语言?,windows-phone,windows-10,uwp,cortana,vcd,Windows Phone,Windows 10,Uwp,Cortana,Vcd,在我的应用程序中,我想让用户有机会通过Cortana等语音命令打开和关闭电灯。我理解VCD的概念,非常喜欢,但我不知道如何处理代码中的不同语言 鉴于我有英语和德语两种语言: <CommandSet xml:lang="en" Name="LightSwitch_en"> <CommandPrefix>Switch the light</CommandPrefix> <Example>Switch the light on.</

在我的应用程序中,我想让用户有机会通过Cortana等语音命令打开和关闭电灯。我理解VCD的概念,非常喜欢,但我不知道如何处理代码中的不同语言

鉴于我有英语和德语两种语言:

<CommandSet xml:lang="en" Name="LightSwitch_en">
    <CommandPrefix>Switch the light</CommandPrefix>
    <Example>Switch the light on.</Example>
    <Command Name="switchLight">
        <Example>on</Example>
        <ListenFor>{status}</ListenFor>
        <Feedback>Light will be switched {status}.</Feedback>
        <Navigate />
    </Command>
    <PhraseList Label="status">
        <Item>on</Item>
        <Item>off</Item>
    </PhraseList>        
</CommandSet>

<CommandSet xml:lang="de" Name="LightSwitch_de">
    <CommandPrefix>Schalte das licht</CommandPrefix>
    <Example>Schalte das Licht ein.</Example>
    <Command Name="switchLight">
        <Example>ein</Example>
        <ListenFor>{status}</ListenFor>
        <Feedback>Licht wird {status}geschaltet.</Feedback>
        <Navigate />
    </Command>
    <PhraseList Label="status">
        <Item>ein</Item>
        <Item>aus</Item>
    </PhraseList>        
</CommandSet>
但这只适用于英语,而不适用于德语。我讨厌在所有语言中检查所有不同的字符串,这不是正确的方法。不幸的是,由于标记只是字符串,因此也不可能为它们赋予额外的属性

我可以做一些事情,比如arg.Equalson | | arg.equalsen Light.On;但正如你所看到的,这真的很难看,每次我改变一些东西时,我都要调整它,好吧,想象一下我有大约15种语言要检查


您知道更智能的解决方案吗?

因为Cortana将使用与内置应用程序本地化方法相同的本地化方法,您不能将所有字符串放入资源文件中,然后将返回的字符串与本地化资源进行比较吗?

因为Cortana将使用与内置应用程序本地化方法相同的本地化方法,您不能将所有字符串放入资源文件中吗您可以在资源文件中输入字符串,然后将返回的字符串与本地化的资源进行比较?

如果您只需要解决特定的问题,您可以执行以下操作,而不是在列表中为每种语言定义两个命令:

 <Command Name="oncommand" >
    <Example>switch on</Example>
    <ListenFor>switch on</ListenFor>
    <Feedback>Light will be switched on.</Feedback>
    <Navigate />
</Command>

<Command Name="offcommand">
    <Example>switch off</Example>
    <ListenFor>switch off</ListenFor>
    <Feedback>Light will be switched off.</Feedback>
    <Navigate />
</Command>

其中voiceCommandName为“oncommand”或“offcommand”。

如果您只需要解决特定情况,您可以执行以下操作,而不是一个列表,每个语言只定义两个命令:

 <Command Name="oncommand" >
    <Example>switch on</Example>
    <ListenFor>switch on</ListenFor>
    <Feedback>Light will be switched on.</Feedback>
    <Navigate />
</Command>

<Command Name="offcommand">
    <Example>switch off</Example>
    <ListenFor>switch off</ListenFor>
    <Feedback>Light will be switched off.</Feedback>
    <Navigate />
</Command>

其中voiceCommandName是'oncommand'或'offcommand'。

我不熟悉这个API,但问题到底是什么?它返回arg,您询问如何处理arg是什么?为什么不打开灯呢;?此外,ResourceDictionary API可能对您有所帮助;这正是我想要避免的。想象一下,我有15种不同的语言。。。ResourceDictionary的想法可能是一个很好的解决方案,就像Matt Lacey指出的那样。我不熟悉这个API,但问题到底是什么?它返回arg,您询问如何处理arg是什么?为什么不打开灯呢;?此外,ResourceDictionary API可能对您有所帮助;这正是我想要避免的。想象一下,我有15种不同的语言。。。ResourceDictionary的想法可能是一个很好的解决方案,就像Matt Lacey指出的那样。是的,对于这个例子来说,这可能是一个很好的解决方案,正如您已经指出的。但是想象一下,我还想为Lamp创建一个变量,用户可以在Lamp、加热器和TV之间进行选择。然后我必须为每一个可能的电子设备执行一个命令。。。但我喜欢你的解决方案,我想我会在这种情况下使用它。当然,希望团队意识到这一点,并创建键,或者有一种方法来获取所选项目的索引。是的,我想在短语列表中处理项目不仅是字符串,而且是我可以提供标识符的对象将是一个很好的解决方案。是的,正如您已经指出的,对于这个例子来说,这可能是一个很好的解决方案。但是想象一下,我还想为Lamp创建一个变量,用户可以在Lamp、加热器和TV之间进行选择。然后我必须为每一个可能的电子设备执行一个命令。。。但是我喜欢你的解决方案,我想我会在这种情况下使用它。当然,希望团队意识到这一点,并创建键,或者有一种方法来获得所选项目的索引。是的,我想处理短语列表中的项目不仅仅是作为字符串,而是作为我可以提供标识符的对象将是一个很好的解决方案。好主意,但是我还必须调整这两个文件中的这些属性。但是你给了我一个想法:我可以从一个资源文件中生成短语列表。我会尝试一下,如果成功的话,我会发布。@einRobby是的,你会把文本放在两个地方,但是你也有硬编码字符串。如果您正在本地化内容,我希望您有一个管理所有本地化资源的过程,这样这些资源就可以成为该过程的额外输出。好主意,但我还必须调整两个文件中的这些属性。但是你给了我一个想法:我可以从一个资源文件中生成短语列表。我会尝试一下,如果成功的话,我会发布。@einRobby是的,你会把文本放在两个地方,但是你也有硬编码字符串。如果您正在本地化内容,我希望您有一个管理所有本地化资源的流程,这样这些资源就可以成为该流程的额外输出。
if (args.Kind == ActivationKind.VoiceCommand)
        {
            var commandArgs = args as VoiceCommandActivatedEventArgs;
            var speechRecognitionResult = commandArgs.Result;
            string voiceCommandName = speechRecognitionResult.RulePath.First();
            string textSpoken = speechRecognitionResult.Text;
            return voiceCommandName;
        }