Эй, Кортана, как обрабатывать несколько языков 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 ответа

Поскольку 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>

а затем определить в коде, какая команда была вызвана:

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

Другие вопросы по тегам