Oracle Cloud Infrastructureドキュメント

ローカライズ

ネイティブ言語が英語でないユーザーのスキルおよびデジタル・アシスタントを設計できます。 自然言語処理(NLP)エンジンは英語で動作しますが、翻訳サービス、特殊翻訳コンポーネントおよびリソース・バンドルを組み合せて使用することで、他の言語のユーザーとやり取りするようにスキルを設計できます。

翻訳サービス

スキルを英語以外の言語のユーザーと対話させるには、まずOracle Digital Assistantで翻訳サービスを設定する必要があります。 MicrosoftトランスレータまたはGoogle翻訳APIのいずれかを使用できます。

ユーザーが英語以外のリクエストまたはレスポンスを入力した場合、スキルは変換サービスを使用して、この入力を英語に変換します。 翻訳が完了すると、自然言語処理(NLP)エンジンはそれをインテントに解決し、エンティティに一致させることができます。 これにより、このスキルは、翻訳サービスを使用してラベルやプロンプトを翻訳するか、リソース・バンドルで言語固有の文字列を参照することで、ユーザーに応答できます。

英語以外の言語のトレーニング・コーパスを持つスキルの場合は、設計時に翻訳サービスも使用されます。 このような英語以外のスキルをトレーニングすると、トレーニング・モデルで使用する英語のバージョンの例発話およびカスタム・エンティティの値が作成されます(これらの翻訳はスキル・デザイナには表示されません)。

Oracle Digital Assistantに翻訳サービスを登録

  1. サイド・メニューを開くアイコンをクリックしてサイド・メニューを開き、設定>翻訳サービスを選択します。
  2. +サービスをクリックします。
  3. Microsoftトランスレータ・サービスまたはGoogle翻訳APIのURLおよび認可トークンを「翻訳サービス」ダイアログ・ボックスに入力します。
URLおよびアクセス・トークンの取得方法については、MicrosoftトランスレータおよびGoogle翻訳APIのドキュメントを参照してください。
ノート

Google翻訳APIを使用するには、APIキーを生成する必要があります。
このキーはGCPコンソール(API &サービス > 資格証明)から作成します。 詳細は、「Google Cloud Platformドキュメント」を参照してください。

スキルへの翻訳サービスの追加

  1. Oracle Digital Assistantに翻訳サービスを登録」がまだ実行していない場合には実行します。
  2. サイド・メニューを開くアイコンをクリックしてサイド・メニューを開き、開発>スキルを選択してスキルを選択します。
  3. スキルの左ナビゲーション・バーで、設定 (左側のナビゲーション・バーの設定アイコンのイメージ)アイコンをクリックし、一般タブを選択します。
  4. 翻訳サービスドロップダウンに移動し、翻訳サービスを選択します。

主要な言語

スキルの翻訳サービスを設定した場合、Oracle Digital Assistantでは、スキル例発話の言語に基づいて、そのスキルの主要言語が自動的に割り当てられます。

スキルに対して事前に割り当てられている言語を確認するには、左側のスキル・バーで設定 (左側のナビゲーション・バーの設定アイコンのイメージ)アイコンをクリックし、一般タブを選択して、主要な言語プロパティの値をチェックします。

インテントの例のすべての発話、エンティティおよびダイアログのレスポンス・テキストが主要な言語にあることを確認します。

複数の言語をサポートするようにスキルを設計する場合、主要な言語は英語である必要があります。

デジタル・アシスタントの主な言語は、デジタル・アシスタントに追加する最初のスキルの主な言語によって決定されます。 デジタル・アシスタントに追加する他のスキルには、主に同じ言語を使用する必要があります。

最初に追加したスキルに大部分の言語がない場合(スキルでは翻訳サービスが指定されていないため)、デジタル・アシスタントの主語は英語に設定されます。 この場合は、英語のスキルを主要言語として追加するか(主に言語が設定されていないか)できます。

翻訳アプローチ

英語以外の言語での会話スキルを開発するには、次の方法のいずれかを使用します:

  • 英語以外の単一言語スキルを次のように作成します:
    • スキルのターゲット言語でトレーニング・コーパスを準備します。

    このアプローチを使用するが、複数の言語をサポートする必要がある場合は、各言語に個別のスキルを作成するだけです。

    「英語以外のデジタル・アシスタント」を開発する際には、このような単一言語スキルを移入します(特定のデジタル・アシスタントのすべてのスキルには、主に同じ言語が使用されます)。

  • 複数言語のスキルを次のように作成します:
    • トレーニング・コーパスを英語で準備します。
    • スキルのダイアログ・フローを拡張して、ユーザー入力の翻訳およびスキル・レスポンスを管理します。
    • オプション(できれば)スキル・ラベル、プロンプトおよびメッセージについて1つ以上の言語のリソース・バンドルを作成します。 スキル・レスポンスの表現を制御できるため、これが望ましいと言えます。
    ノート

    スキルは多言語にできますが、デジタル・アシスタントでは1つの言語しかサポートされません。
    複数の言語での会話にスキルが必要な場合、デジタル・アシスタントを使用せずに、スキル自体をチャネルに直接公開できます。

英語以外の単一言語スキル

英語以外の単一言語のスキルを開発するには、次のようにします:

  1. 「スキルに翻訳サービスを追加」をまだ実行していない場合。

  2. スキルのターゲット言語にスキルの発話を作成します(英語ではなく):
    1. サイド・メニューを開くアイコンをクリックしてサイド・メニューを開き、開発>スキルを選択してスキルを開きます。
    2. スキルの左ナビゲーションで、これはインテント・アイコンのイメージです。をクリック
    3. インテントを選択します。
    4. 例テキスト・フィールドに発話を入力し、Enterキーを押します。
    5. 各インテントについて、前の2つのサブ・ステップを繰り返します。
  3. スキルのカスタム・エンティティの場合は、各値が主言語のスキルにあることを確認します。

    スキルの左ナビゲーションでエンティティ・アイコンのイメージですをクリックすると、カスタム・エンティティを追加および編集できます。

    主言語でカスタム・エンティティ値を入力しない場合、スキルはカスタム・エンティティによる照合が必要な値を含むユーザー入力を正しく処理できません。

  4. このスキルで、すべての構成メッセージとプロンプトを更新して、主要な言語を使用します:

    これらのメッセージとプロンプトにアクセスするには:

    • スキルの左ナビゲーションで、左側のナビゲーション・バーの設定アイコンをクリックします。

    メッセージおよびプロンプトは、構成およびDigital Assistantのタブにあります。

次の点に注意してください:
  • 組込みエンティティの名前は翻訳できません。

  • この方法でスキルを設定すると、言語処理フレームワークでは英語以外の入力が検出され、その入力が内部的に英語(トレーニング・モデルの言語)に変換されます。 入力を評価した後、適切なレスポンスを判断して、ターゲット言語に戻します。

    これは、トレーニング・コーパスが英語にすでに存在するスキルよりも、翻訳サービスへのコールが必要になるため、翻訳コストに影響を与える可能性があります。

自動翻訳がある複数言語スキル

スキルを有効にすると、ユーザーの言語を自動的に検出し、その言語でコミュニケーションを取ることができます。

これを設定するには、翻訳を処理するダイアログ・フローを更新する必要があります。 NLPエンジンでは英語しか認識できないため、フローを次の目的で設定する必要があります:

  • ユーザー言語を検出します。
  • ユーザー入力をSystem.Intentコンポーネントで解決できるように変換します。

ユーザー入力の翻訳は、次のいずれかの方法を使用して処理できます:

  • Opt-in: 翻訳するコンポーネントごとにtranslateプロパティをtrueに個別に設定します。
  • Opt-out: autoTranslateコンテキスト変数をtrueに設定し、各コンポーネントの入力がデフォルトで翻訳されるようにします。 変換が不要なコンポーネントがある場合は、translateプロパティをfalseに設定します。

オプトイン翻訳

翻訳するコンポーネントを個別に指定するステップは、次のとおりです :

  1. 「スキルに翻訳サービスを追加」をまだ実行していない場合。
  2. autoTranslateコンテキスト変数が設定されていないこと(またはfalseに設定されていないこと)を確認します。
  3. System.Intentコンポーネントの状態の上に、System.DetectLanguageコンポーネントを追加します:
      detect:
        component: "System.DetectLanguage"
        transitions: {}
  4. System.Intentコンポーネントで、「変換プロパティ」trueに設定します。
      intent:
        component: "System.Intent"
        properties:
          variable: "iResult"
          translate: true
  5. その他すべての入力コンポーネントについても、「変換プロパティ」プロパティをtrueに設定します。
例: 自動翻訳を使用した複数言語スキル(オプトイン)
metadata:
  platformVersion: "1.0"
main: true
name: "AutoTranslatePizzaJoe"
parameters:
  age: 18
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult" 
states:
  detect:
    component: "System.DetectLanguage"
    transitions: {}
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult" 
      translate: true
  ShowMenu:
    component: "System.CommonResponse"
    properties:
      processUserMessage: true
      translate: true
      metadata:
        responseItems:
          - type: "text"
            text: "Hello ${profile.firstName}, this is our menu today:"
            ...
  ...  

オプトアウト翻訳

デフォルトで自動翻訳を使用するステップを次に示します(さらに、翻訳しないコンポーネントを個別に指定します) :

  1. 「スキルに翻訳サービスを追加」をまだ実行していない場合。
  2. autoTranslate: "boolean"を変数としてcontextノードに追加します。
    context:
      variables:
        ...
        autoTranslate: "boolean"
  3. System.Intentコンポーネントの上にあるstatesノード内に、System.SetVariableコンポーネントを追加します。 次にvariableプロパティを設定して、autoTranslateコンテキスト変数を使用し、valueプロパティをtrueに設定します。
      setAutoTranslate:
        component: "System.SetVariable"
        properties:
          variable: "autoTranslate"
          value: true
        transitions: {}
  4. 次の状態で、System.DetectLanguageコンポーネントを追加します:
      detect:
        component: "System.DetectLanguage"
        transitions: {}
  5. 自動翻訳が不要なコンポーネントについては、「変換プロパティ」からfalseを参照してください:
      done:
        component: "System.Output"
        properties:
          text: "${rb('OnTheWay','${size.value}','${type.value}')}"
          translate: false
        transitions:
          return: "done"
例: 自動翻訳(オプトアウト)を使用する複数言語スキル
metadata:
  platformVersion: "1.0"
main: true
name: "AutoTranslatePizzaJoe"
parameters:
  age: 18
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"
    autoTranslate: "boolean" 
states:
  setAutoTranslate:
    component: "System.SetVariable"
    properties:
      variable: "autoTranslate"
      value: true
    transitions: {}
  detect:
    component: "System.DetectLanguage"
    transitions: {}
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult" 

翻訳前の入力の操作

変換サービスに送信する前に入力テキストを操作できるようにする場合、System.TranslateInputコンポーネントを使用できます。 たとえば、個人データを翻訳サービスに送信する前に、ユーザー入力を処理して個人データを削除できます。

次のスニペットでは、sourceString変数に変換するテキストを保持しています。 (この入力は、たとえば、System.Textコンポーネントによって収集され、別のコンポーネントで処理された可能性があります。) System.TranslateInputが処理を完了すると、英語変換はtranslatedString変数に格納されます。
context:
  variables:
    autoTranslate: "boolean" 
    translatedString: "string"
    sourceString: "string"    
   ...
states:
   ...
  translateInputString:
    component: "System.TranslateInput"
    properties:
      source: "sourceString"
      variable: "translatedString"
    transitions: {}

リソース・バンドル

スキルのレスポンスの表現を(翻訳サービスによって提供されるテキストに依存せずに)制御する場合は、リソース・バンドルを使用します。 リソース・バンドルは、必要な数の言語やダイスに応じて提供できます。

リソース・バンドルの作成

翻訳が必要な出力テキストを識別する様々なキーで構成されるスキルごとに1つのバンドルを定義します。

リソース・バンドルを作成するには:
  1. 左側のナビゲーション・バーでリソース・バンドル (これは、左側のナビゲーション・バーのリソース・バンドル・アイコンのイメージです。)をクリックします。

  2. User-Definedタブをクリックします。
  3. バンドルの追加をクリックします。

    デフォルトでは、最初のキーは英語です。

  4. キーとそのテキストを入力します。 たとえば、どれだけ古いものですか。にユーザー・プロンプトの場合は、キーフィールドにHowOldと入力し、次にテキストフィールドにどれだけ古いものですか。を入力します。

  5. エントリの作成をクリックします。

  6. 文字列の外部言語バージョンを追加するには、言語の追加をクリックします。
  7. 「エントリの作成」ダイアログを完了します:
    • 言語-フランス語の場合はfr、ドイツ語の場合はdeの場合のように、IETF BCP 47言語タグを追加します。

    • テキスト-出力文字列。 たとえば、HowOldキーのフランス語変換(fr)の場合、ソーラス州などの文字列を追加

      ノート

      en-USなど、より具体的なロケールを使用することもできますが、ほとんどの場合に有用ではありません。
      たとえば、(System.DetectLanguageコンポーネントを介して)翻訳サービスを使用して言語を検出した場合は、2文字のコードのみが返されます。

      スキルがバンドルで定義された言語タグと入力言語を一致させない場合、このスキルはデフォルトで低レベルのタグになります(使用可能な場合)。 エントリのいずれもブラウザの言語に一致しない場合、スキルではデフォルトのエントリである英語が使用されます。 詳細は「リソース・バンドル・エントリの解決」を参照してください。

  8. 他の文字列を翻訳する場合は、キーの追加をクリックしてリソース・バンドルに別のエントリを作成します。

  9. ダイアログ・フローのリソース・バンドルを参照します。 エンティティ・プロンプトは、リソース・バンドルとして定義できます。

ノート

カスタム・エンティティはリソース・バンドルでは変換できません。
かわりに、カスタム・エンティティの値リストでシノニムとして翻訳を追加できます。

会話名のエントリの作成

スキルがユーザーがフォローするフローを判断しようとしている場合など、会話内のポイントに、スキルによって、1つ以上のインテントを参照するダイアログが表示される場合があります。 このような場合、スキルでは会話名によりインテントが参照され、リソース・バンドルにキーとデフォルト・エントリが生成されます。

会話名の翻訳を指定するには:

  1. 左側のナビゲーション・バーでリソース・バンドル (これは、左側のナビゲーション・バーのリソース・バンドル・アイコンのイメージです。)をクリックします。

  2. 「リソース・バンドル」ページのインテントタブをクリックします。



  3. インテントの選択

  4. 言語の追加をクリックします。

  5. 「エントリの作成」ダイアログを完了します:
    • 言語-フランス語の場合はfr、ドイツ語の場合はde、米国英語の場合はen-USなど、IETF BCP 47言語タグを追加します。

    • テキスト-出力文字列。 たとえば、HowOldキーのフランス語変換(fr)の場合、ソーラス州などの文字列を追加

ノート

会話の名前を変更する意図がリストに表示されない場合は、これはインテント・アイコンのイメージです。をクリックしてインテント・ページに戻り、インテントを選択して会話名フィールドを編集します。
「リソース・バンドル」ページに戻ると、インテントタブの下に表示されます。

ダイアログ・フローでの参照リソース・バンドル

組込みコンポーネントの出力を設定するには、リソース・バンドル・コンテキスト変数およびメッセージ・キーを参照します。

次のピザ・スキルのOBotMLスニペットでは、リソース・バンドルは、コンテキスト・セクションで変数rbとして宣言されます。 さらに下で、値式では、rb変数およびキー(WhatTypeおよびOnTheWay)を参照するSystem.Outputコンポーネントのテキスト・プロパティを定義します。 1番目は単純な文字列を出力し、もう1つは動的な値を使用します。
context:
  variables:
    rb: "resourcebundle"
...

pizzaType:
  component: "System.Output"
  properties:
    text: "${rb('WhatType')}" # rb refers to the variable, WhatType is the key to the message in the resource bundle.
  transitions: {}
...

done:
  component: "System.Output"
  properties:
    text: "${rb('OnTheWay','${size.value}','${type.value}')}" # size.value and type.value are the arguments for the 'OnTheWay' message code.
  transitions:
    return: "done"
単純なメッセージの場合、ドット表記法(${rb.WhatType})を使用してリソース・バンドルを参照することもできます。

ヒント:

テスターを使用してリソース・バンドルをテストするには、ブラウザを別の言語に設定します。

リソース・バンドルと自動変換

リソース・バンドルを使用している場合でも、ユーザーがネイティブ言語で入力できるように翻訳サービスを使用できます。 ただし、リソース・バンドルを使用するコンポーネントを自動的に翻訳する必要はありません。

スキル・レスポンスにリソース・バンドルを使用する際に、ユーザー入力を翻訳するスキルを設定する一般的なステップは次のとおりです:

  1. 「スキルに翻訳サービスを追加」をまだ実行していない場合。
  2. System.DetectLanguageコンポーネントを使用して、ユーザー入力の言語を決定します。
  3. リソース・バンドルを適用して、スキル・レスポンスをユーザーに処理します。
  4. リソース・バンドルを参照するコンポーネントの場合は、自動変換が無効になっていることを確認します。 これは、次のいずれかで処理できます:
    • オプトイン・アプローチを使用する場合:
      1. autoTranslateコンテキスト変数をfalseに設定します(または設定しないでください)。
      2. translateプロパティをtrue for System.IntentSystem.Textおよびその他の入力コンポーネントに設定します。
    • オプトアウト・アプローチの使用:
      1. autoTranslateコンテキスト変数をtrueに設定します。
      2. コンポーネントfalsetranslateプロパティを設定し、リソース・バンドルを使用する各コンポーネント(System.OutputSystem.CommonResponseコンポーネントなど)をオーバーライドします。

      この方法のデメリットの1つは、リソース・バンドルを使用する必要のあるコンポーネントに自動変換を誤って設定した場合の注意が難しいことです。

スキルで、一部のコンポーネントのリソース・バンドルを使用し、他のコンポーネントの自動変換に依存する場合は、次のことが可能です:

  • autoTranslateコンテキスト変数をtrueに設定します。
  • リソース・バンドルを使用するコンポーネントごとにtranslateプロパティをfalseに設定します。
例: リソース・バンドルでの変換

次のダイアログ・フロー・サンプル・コードに、ユーザーの英語以外の入力を受け入れ、インテント解決のために入力を英語に変換し、リソース・バンドルからのテキストを使用してユーザー言語でレスポンスするスキルのダイアログ・フローの関連部分を示します。

autotranslateコンテキスト変数が設定されていないため、コンポーネントはデフォルトで自動的に変換されません。 ただし、System.Intentコンポーネントでtranslateプロパティがtrueに設定されているため、ユーザー入力が自動的に翻訳されます。

metadata:
  platformVersion: "1.0"
main: true
name: "PizzaJoe"
parameters:
  age: 18
context:
  variables:
    size: "PizzaSize"
    type: "PizzaType"
    crust: "PizzaCrust"
    iResult: "nlpresult"
    rb: "resourcebundle"
    
states:
   # add DetectLanguage component
  detect:
    component: "System.DetectLanguage"
    transitions: {}
   
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult"
      translate: true 
    transitions:
      actions:
        OrderPizza: "resolvesize"
        CancelPizza: "cancelorder"
        unresolvedIntent: "unresolved"
  ...

  pizzaType:
    component: "System.Output"
    properties:
      text: "${rb('WhatType')}" 
    transitions: {}
  ...

このサンプルでは次のようになります:

  • このスキルに対して翻訳サービスが有効になっていると仮定します。
  • rbコンテキスト変数には、translatedという別の変数が付随しています。
  • System.DetectLanguageが設定されます。 これにより、profile.languageTagの値が、検出された言語の2文字コードに設定されます。 この値は、profile.localeの値にも優先されます。
  • System.DetectLanguageおよびSystem.TranslateInputの両コンポーネントはSystem.Intentコンポーネントより前に配置されるため、System.Intentコンポーネントで使用されてインテントの1つに解決される前に、初期ユーザー入力を英語に翻訳できます。
ノート

profile.locale変数を介して(およびSystem.DetectLanguageコンポーネントを使用せずに)メッセンジャ・クライアントから言語を検出することもできます。
ただし、このアプローチでは、ユーザーは最初に英語でスキルを起動する必要があります(Hello, PizzaJoe!など)。

リソース・バンドル・エントリ解決

適用されるリソース・バンドルは、2つの「ロケーション固有のユーザー・コンテキスト変数」profile.languageTagおよびprofile.localeに格納されている値に依存します。 両方の変数が設定されている場合、profile.languageTagが優先されます。

profile.languageTagは、ダイアログ・フローにそのコンポーネントがある場合、System.DetectLanguageコンポーネントによって入力されたユーザーの言語に設定されます。 profile.languageTagの値は、2文字の言語コードの形式になります(たとえば、英語はen)。

profile.localeはメッセンキング・クライアントによって設定されています。 profile.localeの値は、言語-国バリアント(en-AU-sydneyなど)、言語-国(en-AUなど)または言語(enなど)の形式にすることができます。

使用する言語を解決するとき、Oracle Digital Assistantは最初に完全一致を検索します。 これが見つからない場合は、成功するまで検索範囲が徐々に広げられます。 一致が見つからない場合は、デフォルト言語である英語(en)が返されます。

たとえば、${profile.locale}の値がen-AU-sydney (およびprofile.languageTagが設定されていない)の場合、Oracle Digital Assistantは次を実行して最も一致する言語を見つけます:
  1. 言語-国-バリアント基準(en-AU-sydney)でバンドルを検索します。

  2. それが見つからない場合は、言語および国(en-AU)でバンドルを検索します。

  3. それに失敗すると、言語(en)の検索範囲が広くなります。

カスタム・コンポーネント・レスポンスの変換方法

カスタム・コンポーネントから翻訳されたコンテンツを返すには、次の3つのメソッドがあります:
  1. カスタム・コンポーネントから送信されたデータ・オブジェクトをコンテキスト変数に格納します。 これにより、System.OutputSystem.TextSystem.CommonResponseなどの組込みのユーザー・インタフェース・コンポーネントで、この変数を参照できるようになります。
  2. 文字列メッセージをコンテキスト変数に保存し、コンテキスト変数の名前を入力パラメータとしてSystem.OutputSystem.ListSystem.CommonResponseSystem.TranslateOutputなどのシステム・コンポーネントに渡します。
  3. コンポーネント自体でカスタム・コンポーネント出力を翻訳してから、レスポンスをメッセンジャ・クライアントに直接書き込みます(このため、システム・コンポーネントはすべてではありません)。

オプション1: コンテキスト変数へのデータの格納

バックエンド・サービスを問い合せるカスタム・コンポーネントは、オブジェクトやオブジェクトの配列などの複雑な形式でデータを戻すことができます。 このデータに換算が必要な場合:
  1. ダイアログ・フローのコンテキスト変数にデータを保存します。

    データ・オブジェクトのデータをコンテキスト変数に書き込むには、カスタム・コンポーネントに次のコードを追加します:
    conversation.variable('dialogVar', dataObject);
    conversation.transition();
    done();
    
    このコード行を動作させるには、string型のダイアログ・フロー定義dialogVarに対応するコンテキスト変数を追加する必要があります :
    dialogVar: "string"

    ヒント:

    ベスト・プラクティスとして、カスタム・コンポーネントが入力パラメータとしてカスタム・コンポーネントに書き込むコンテキスト変数の名前をカスタム・コンポーネントに渡します。 このように、コンテキスト・パラメータにアクセスするとき、実際にコンテキスト・パラメータが存在していることを確認します。
  2. translate: trueプロパティを出力コンポーネント定義に含めるか、System.TranslateOutputコンポーネントを使用してユーザーの言語に翻訳します。

    システム・コンポーネントではデータ・オブジェクトを全体として変換できないため、コンテキスト変数に格納されたデータ・オブジェクトを翻訳する必要がある場合は、コンテキスト変数を、ユーザーに表示され、出力コンポーネントによって変換されるデータ・オブジェクト属性の名前とともに参照する必要があります。 次の例では、コンテキスト変数はdialogVarです。 カスタム・コンポーネントからこのコンテキスト変数に渡されるデータ・オブジェクトは{product: "an apple", type: "fruit", origin: "Spain" }です。 このオブジェクトを表示および翻訳するには、System.Outputコンポーネントを参照して、翻訳を有効にします:
    printProduct:
      component: "System.Output"
      properties:
        text: "The product in your cart is a ${dialogVar.value.type}. It is
               ${dialogVar.value.product} from ${dialogVar.value.origin}"
        translate: true
    
    スキルに対して翻訳サービスが有効になっている場合、このメッセージはユーザーの言語に翻訳されます。 カスタム・コンポーネントも、データ・オブジェクトの翻訳済コンテンツを渡します。

オプション2: コンテキスト変数でのメッセージの保存

この方法では、コンポーネント・レスポンスを入力パラメータとして保持するコンテキスト変数の名前をカスタム・コンポーネントに渡すことができます。 これにより、カスタム・コンポーネントは特定のOBotML実装コードに依存せず、再利用可能な状態に維持されます。

次のOBotMLサンプルは、initializeReceipt状態のカスタム・コンポーネントを参照し、コンポーネント・レスポンスを保持するコンテキスト変数(receipt)とpurchaseIdを入力パラメータとして渡します。
initializeReceipt:
  component: "sample.receipt.dataresponse"
  properties:
    dataVariable: "receipt"
    purchaseid: "${purchaseId.value}

printReceipt:
  component: "System.Output"
  properties:
    text:"${receipt.value}"
    translate: true
 ...
これらの入力パラメータにアクセスするカスタム・コードは、次のとおりです:
...
invoke: (conversation, done) => {
  var responseVariable = conversation.properties().dataVariable;
  var purchaseId = conversation.properties().purchaseId;
  ...
  var message = queryRemoteServiceForReceipt(purchaseId);
  ...
  conversation.variable(responseVariable, message);
  conversation.transition(); 
  done();
}
検出されたユーザー言語でメッセージを表示するには、System.CommonResponseSystem.Outputなどの出力コンポーネントで、System.TranslateOutputコンポーネントを使用するかtranslateプロパティを設定します(printReceiptの状態を参照)。カスタム・コンポーネントから英語以外のメッセージが戻され、したがって自然言語処理(NLP)エンジンによる処理が必要な場合は、System.TranslateInput