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

时间:2015-11-25 14:14:08

标签: 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.</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>

当我的应用程序通过语音命令启动时,我可以轻松提取口语单词并可以访问status参数。但是因为它是一个字符串,我将根据用户说的语言得到不同的结果。

因此,如果用户说英语,则字符串为"on",但如果他说德语,则字符串为"ein"。那我怎么知道,我需要在我的应用程序中监听哪个字符串?我的目标是这样的:

if (arg.Equals("on"))
    Light.On();
else if (arg.Equals("off"))
    Light.Off();

但这只适用于英语,而不是德语。我不喜欢检查所有语言中的所有不同字符串,这可能是正确的方法。遗憾的是,由于它们只是字符串,因此也无法为<Item>标记提供额外的属性。

我可以做类似if (arg.Equals("on") || arg.Equals("ein")) Light.On();的事情,但你可以看到这真的很难看,我每次改变一些东西时都要调整它,想象我有大约15种语言要检查......

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

2 个答案:

答案 0 :(得分:2)

由于Cortana将使用与内置应用程序本地化方法相同的本地化,您是否可以将所有字符串放在资源文件中,然后将返回的字符串与本地化资源进行比较?

答案 1 :(得分:2)

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

 <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>

然后在代码中检测调用了什么命令:

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;
        }

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