SHARP

RoBoHoN

RoBoHoN

TIPS:多言語対応で言語毎のシナリオを作らない方法

フォーラム RoBoHoN SDKについて TIPS:多言語対応で言語毎のシナリオを作らない方法

タグ: 

  • 作成者
    トピック
  • #541

    多言語対応で言語毎のシナリオを用意するのが面倒くさい!!という時に使えるかも?

    onVoiceUIResolveVariableを用いて、String.xmlを参照することでAndroid標準の多言語リソースの仕組みを活用します。

    • このトピックはとのさま とのさまが2 年、 5 ヶ月前に変更しました。
    • このトピックはとのさま とのさまが2 年、 5 ヶ月前に変更しました。
1件の返信を表示中 - 1 - 1件目 (全1件中)
  • 投稿者
    返信
  • #542

    修正箇所(テンプレートをベースにしています)
    ・jp_co_sharp_android_rb_myapplication_hello.hvml
    speechタグ内の発話や、situationタグ内の発話条件を変数で定義します。

    
    <?xml version="1.0" ?>
    <hvml version="2.0">
        <head>
            <producer>jp.co.sharp.android.rb.myapplication</producer>
            <!-- TODO このシナリオの説明文を入力してください(プログラムに影響はありません) -->
            <description>テンプレートシナリオ</description>
            <scene value="jp.co.sharp.android.rb.myapplication.scene01"/>
            <version value="1.0"/>
            <situation priority="75" topic_id="reply" trigger="user-word">${Lvcsr:Basic} include
                ${jp.co.sharp.android.rb.myapplication:listen_1}
            </situation>
            <accost priority="75" topic_id="say" word="jp.co.sharp.android.rb.myapplication.hello.say"/>
        </head>
        <body>
            <topic id="say" listen="false">
                <action index="1">
                    <speech>${jp.co.sharp.android.rb.myapplication:speech_1}</speech>
                    <behavior id="assign" type="normal"/>
                </action>
            </topic>
            <topic id="reply" listen="false">
                <action index="1">
                    <speech>${jp.co.sharp.android.rb.myapplication:speech_2}</speech>
                    <behavior id="assign" type="normal"/>
                </action>
            </topic>
        </body>
    </hvml>
    

    ・MainActivityVoiceUIListener
    onVoiceUIResolveVariableにて、hvmlファイルより参照される変数をリソースファイルから取得する実装をします。

    
    ~中略~
        private Context mContext;
        @Override
        public void onVoiceUIResolveVariable(List<VoiceUIVariable> variables) {
            //アプリ側での変数解決用コールバック(シナリオ側にパッケージ名をつけた変数を書いておくと呼び出される).
            Log.v(TAG, "onVoiceUIResolveVariable");
            for (VoiceUIVariable variable : variables) {
                String key = variable.getName();
                Log.d(TAG, "onVoiceUIResolveVariable: " + key + ": " + variable.getStringValue());
                if(key.startsWith(mContext.getPackageName()+":speech") || key.startsWith(mContext.getPackageName()+":listen")){
                    Resources res = mContext.getResources();
                    String[] keys = key.split(":");
                    int strId = res.getIdentifier(keys[1], "string", mContext.getPackageName());
                    variable.setStringValue(res.getString(strId));
                }
            }
        }
    

    あとは、strings.xmlにそれぞれの言語毎のテキストを記述します
    ・strings.xml

    
    <resources>
        <string name="app_name">My Application</string>
        <string name="hello">Hello RoBoHoN!!</string>
        <string name="accost">発話</string>
        <string name="speech_1">おはよう</string>
        <string name="speech_2">ありがとう</string>
        <string name="listen_1">[おはよう,こんにちは,こんばんわ]</string>
    </resources>
    

    ・en\strings.xml

    
    <resources>
        <string name="app_name">My Application</string>
        <string name="hello">Hello RoBoHoN!!</string>
        <string name="accost">Speech</string>
        <string name="speech_1">Good Morning</string>
        <string name="speech_2">Thank you</string>
        <string name="listen_1">[hello,hi,good_morning,good_evening]</string>
    </resources>
    

    ・zh\strings.xml

    
    <resources>
        <string name="app_name">My Application</string>
        <string name="hello">Hello RoBoHoN!!</string>
        <string name="accost">发言</string>
        <string name="speech_1">早上好</string>
        <string name="speech_2">謝謝</string>
        <string name="listen_1">[早上好,你好,晚上好]</string>
    </resources>
    

    このようにすることで、通常は言語毎に、つまり3つのjp_co_sharp_android_rb_myapplication_hello.hvmlを準備する必要があるところを、1つのファイルで記述することができます。

    ◎デメリット/制限事項
    ・アプリが起動している前提(Listenerがいる前提)なのでHOMEシナリオでは使えません
    ・strings.xmlで記述する際に、[‘]はエスケープが必要。
    例)
    <string name=”speech_1″>I’m Robohon.</string> → <string name=”speech_1″>I\’m Robohon.</string>

    お試しください! わからないところがあったら、ご質問いただければ!

    • この返信は2 年、 5 ヶ月前に ロボホン 零号 ロボホン 零号 さんが編集しました。
    • この返信は2 年、 5 ヶ月前に ロボホン 零号 ロボホン 零号 さんが編集しました。
    • この返信は2 年、 5 ヶ月前に とのさま とのさま さんが編集しました。
    • この返信は2 年、 5 ヶ月前に とのさま とのさま さんが編集しました。
1件の返信を表示中 - 1 - 1件目 (全1件中)

このトピックに返信するにはログインが必要です。