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