Localización de aptitudes

Puede diseñar aptitudes para usuarios cuyo idioma nativo no sea el inglés. Aunque el motor de procesamiento de lenguaje natural (NLP) funciona en inglés, puede diseñar aptitudes para interactuar con usuarios en otros idiomas mediante una combinación de un servicio de traducción, componentes de traducción especiales y grupos de recursos.

Servicios de traducción

Para que las aptitudes puedan interactuar con los usuarios en un idioma distinto del inglés, antes tiene que configurar un servicio de traducción en Oracle Digital Assistant. Puede utilizar Microsoft Translator o la API Translation de Google.

Si un usuario introduce una solicitud o una respuesta en un idioma distinto al inglés, la aptitud utiliza el servicio de traducción para convertir la entrada al inglés. Tras efectuar la traducción, el motor de procesamiento de lenguaje natural (NLP) puede resolverla en una intención y parear las entidades. A continuación, la aptitud puede responder al usuario utilizando el servicio de traducción para traducir las etiquetas y las peticiones de datos o haciendo referencia a cadenas específicas del idioma de los grupos de recursos.

En el caso de las aptitudes que disponen de un corpus de entrenamiento en un idioma distinto del inglés, el servicio de traducción se utiliza también en la fase de diseño. Al entrenar una aptitud en un idioma distinto del inglés, se crean versiones en inglés de las expresiones de ejemplo y los valores de entidades personalizadas que se van a utilizar en el modelo de entrenamiento (si bien estas traducciones no se muestran en el diseñador de aptitudes).

API Translation de Google

Para utilizar la API Translation de Google, debe generar la clave de API. Esta clave se crea desde la consola de GCP (API y servicios > Credenciales). Para obtener más información, consulte la documentación de Google Cloud Platform.

Microsoft Translator

Si desea utilizar Microsoft Translator como servicio de traducción en Oracle Digital Assistant, debe suscribirse a Translator o al servicio múltiple de Cognitive Services y obtener una clave secreta. Consulte https://docs.microsoft.com/en-gb/azure/cognitive-services/translator/reference/v3-0-reference.

Estos son los puntos más importante que debe saber:

  • Debe utilizar la región Global y su URL correspondiente (https://api.cognitive.microsofttranslator.com/).
  • Debe obtener una clave secreta para la autenticación. Puede obtenerla en la sección Keys and Endpoints de Azure Portal.

Registro de un servicio de traducción en Oracle Digital Assistant

  1. Haga clic en icono para abrir el menú lateral para abrir el menú lateral y seleccione Configuración > Servicio de traducción.

  2. Haga clic en Agregar servicio.

  3. En el cuadro de diálogo Servicios de traducción, introduzca la URL y la clave de autorización (para el servicio Microsoft Translator) o el token de autorización (para la API de Google Translation).

    1. URL
    2. Clave de autorización (para el servicio Microsoft Translator) o token de autorización (para la API de Google Translation).

Agregar un servicio de traducción a una aptitud

  1. Si todavía no lo ha hecho, registre un servicio de traducción en Oracle Digital Assistant.
  2. Haga clic en icono para abrir el menú lateral para abrir el menú lateral, seleccione Desarrollo > Aptitudes y elija la aptitud.
  3. En la barra de navegación izquierda de la aptitud, haga clic en el icono Configuración (imagen del icono Configuración de la barra de navegación izquierda) y seleccione el separador General.
  4. Vaya al menú desplegable Servicio de traducción y seleccione el servicio de traducción.

Idioma predominante

Si ha configurado un servicio de traducción para una aptitud, Oracle Digital Assistant asigna de modo automático un idioma predominante para dicha aptitud, en función del idioma de las expresiones de ejemplo de la aptitud.

Para ver qué idioma predominante se ha asignado a una aptitud, pulse el icono Configuración(imagen del icono Configuración de la barra de navegación izquierda) en la barra de navegación izquierda de la aptitud, seleccione el separador General y compruebe el valor de la propiedad Idioma predominante.

Asegúrese de que todas las expresiones de ejemplo de las intenciones, las entidades y el texto de respuesta del diálogo estén en el idioma predominante.

Si está diseñando la aptitud para que admita varios idiomas, el idioma predominante debe ser el inglés.

El idioma predominante del asistente digital lo determina el idioma predominante de la primera aptitud que se agrega al asistente digital. Cualquier otra aptitud que se agregue al asistente digital deberá tener el mismo idioma predominante.

Si la primera aptitud que se agrega no tiene un idioma predominante (porque no se ha especificado ningún servicio de traducción en la aptitud), el idioma predominante del asistente digital se establecerá en inglés. En este caso, puede agregar aptitudes que tengan el inglés como idioma predominante (o que no tengan ningún idioma predominante establecido).

Enfoques de traducción de las aptitudes

Para desarrollar aptitudes que conversen en idiomas distintos del inglés, puede utilizar uno de estos métodos:

  • Cree aptitudes en un solo idioma distinto del inglés en las que:
    • Prepare el corpus de entrenamiento en el idioma de destino de la aptitud.

    Cuando se desarrollan asistentes digitales en un solo idioma distinto al inglés, estos se rellenan con aptitudes únicamente en ese idioma (si todas las aptitudes de un asistente digital determinado tienen el mismo idioma predominante).

  • Cree aptitudes multilingües en las que:
    • Prepare el corpus de entrenamiento en inglés.
    • Mejore el flujo de diálogo de la aptitud para gestionar la traducción de las entradas del usuario y las respuestas de la aptitud.
    • Como paso opcional (aunque recomendado), puede crear grupos de recursos para uno o más idiomas para las etiquetas, peticiones de datos y mensajes de la aptitud. Esto le permite controlar el texto de las respuestas de la aptitud.

En ambos casos, Digital Assistant utiliza el servicio de traducción para traducir la entrada del usuario al idioma base. Para las respuestas, utiliza grupos de recursos (si se proporcionan en la aptitud) o el servicio de traducción para traducir la respuesta de la aptitud al idioma del usuario.

Aptitudes con un solo idioma distinto del inglés

Para desarrollar una aptitud para un idioma único distinto del inglés, siga estos pasos:

  1. Si aún no lo ha hecho, agregue un servicio de traducción a la aptitud.

  2. Cree las expresiones para la aptitud en el idioma de destino de la aptitud (no en inglés):
    1. Haga clic en icono para abrir el menú lateral para abrir el menú lateral, seleccione Desarrollo > Aptitudes y abra la aptitud.
    2. En la navegación izquierda de la aptitud, haga clic en Imagen del icono Intención.
    3. Seleccione una intención.
    4. En el campo de texto Ejemplos, escriba la expresión y pulse Intro.
    5. Repita los dos pasos anteriores para cada intención.
  3. Para cualquier entidad personalizada de la aptitud, asegúrese de que los valores estén en el idioma predominante de la aptitud.

    Puede agregar y editar entidades personalizadas haciendo clic en Imagen del icono Entidades, en la navegación izquierda de la aptitud.

    Si no proporciona valores de entidad personalizados en el idioma predominante, la aptitud no podrá procesar correctamente las entradas de usuario que contengan valores que tengan que parearse mediante una entidad personalizada.

  4. En la aptitud, actualice todos los mensajes de configuración y las peticiones de datos para utilizar el idioma predominante:

    Para acceder a estos mensajes y peticiones de datos:

    • En la navegación izquierda de la aptitud, haga clic en Icono Configuración de la barra de navegación izquierda.

    Los mensajes y peticiones de datos se encuentran en los separadores Configuración y Asistente digital.

Hay otros aspectos que se deben tener en cuenta:
  • No se pueden traducir los nombres de las entidades incorporadas.

  • Cuando se configura una aptitud de este modo, el marco de procesamiento de idioma detecta una entrada que no está en inglés y la traduce al inglés (el idioma del modelo de entrenamiento) en segundo plano. Después de evaluar la entrada, determina la respuesta adecuada y la traduce al idioma de destino.

    Esto puede afectar a los costos de la traducción, ya que requiere más llamadas al servicio de traducción que una aptitud en la que el corpus de entrenamiento ya está en inglés.

Aptitudes multilingües con traducción automática

Puede activar la aptitud para que detecte automáticamente el idioma del usuario y se comunique con él en este idioma.

Para ello, debe actualizar el flujo de diálogo para manejar la traducción. Puesto que el motor de NLP solo reconoce el inglés, debe configurar el flujo para que:

  • Detecte el idioma del usuario.
  • Traduzca la entrada del usuario de manera que pueda resolverla el componente System.Intent.

Puede manejar la traducción de las entradas de usuario utilizando cualquiera de las siguientes estrategias:

  • Inclusiva: defina individualmente la propiedad translate en true para cada componente que quiera traducir.
  • Exclusiva: defina la variable de contexto autoTranslate en true para que la entrada de cada componente se traduzca por defecto. Si hay algún componente que no necesite traducción, defina su propiedad translate en false.

Traducción inclusiva

Estos son los pasos que debe seguir si quiere especificar individualmente qué componentes traducir:

  1. Si aún no lo ha hecho, agregue un servicio de traducción a la aptitud.
  2. Asegúrese de que la variable de contexto autoTranslate no esté definida (o esté definida en false).
  3. Encima del estado del componente System.Intent, agregue el componente System.DetectLanguage:
      detect:
        component: "System.DetectLanguage"
        properties:
          useExistingProfileLanguageTag: true
        transitions: {}
    Nota

    La propiedad useExistingProfileLanguageTag se utiliza cuando una aptitud forma parte de un asistente digital que tiene un servicio de traducción. Esto permite a la aptitud utilizar el idioma detectado por el asistente digital inmediatamente. De lo contrario, la aptitud puede proporcionar un mensaje o una petición de datos en inglés antes de que se detecte (o se vuelva a detectar) el idioma. Si la aptitud no está en un asistente digital con la función de traducción activada, se ignora la propiedad.
  4. En el componente System.Intent, defina la propiedad translate en true.
      intent:
        component: "System.Intent"
        properties:
          variable: "iResult"
          translate: true
  5. Para el resto de componentes de entrada, establezca también la propiedad translate en true.
Ejemplo: aptitud multilingüe con traducción automática (inclusiva)
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"
    properties:
      useExistingProfileLanguageTag: true
    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:"
            ...
  ...  

Traducción exclusiva

Estos son los pasos que debe seguir si quiere utilizar la traducción automática por defecto (y especificar individualmente los componentes que no se van a traducir) :

  1. Si aún no lo ha hecho, agregue un servicio de traducción a la aptitud.
  2. Agregue autoTranslate: "boolean" como variable al nodo context.
    context:
      variables:
        ...
        autoTranslate: "boolean"
  3. En el nodo states, encima del componente System.Intent, agregue un componente System.SetVariable. A continuación, defina la propiedad variable para utilizar la variable de contexto autoTranslate y establezca la propiedad value en true.
      setAutoTranslate:
        component: "System.SetVariable"
        properties:
          variable: "autoTranslate"
          value: true
        transitions: {}
  4. Para el siguiente estado, agregue el componente System.DetectLanguage:
      detect:
        component: "System.DetectLanguage"
        properties:
          useExistingProfileLanguageTag: true
        transitions: {}
    Nota

    La propiedad useExistingProfileLanguageTag se utiliza cuando una aptitud forma parte de un asistente digital que tiene un servicio de traducción. Esto permite a la aptitud utilizar el idioma detectado por el asistente digital inmediatamente. De lo contrario, la aptitud puede proporcionar un mensaje o una petición de datos en inglés antes de que se detecte (o se vuelva a detectar) el idioma. Si la aptitud no está en un asistente digital con la función de traducción activada, se ignora la propiedad.
  5. Para los componentes que no quiera traducir de forma automática, defina la propiedad translate en false. Por ejemplo:
      done:
        component: "System.Output"
        properties:
          text: "${rb('OnTheWay','${size.value}','${type.value}')}"
          translate: false
        transitions:
          return: "done"
Ejemplo: aptitud multilingüe con traducción automática (exclusiva)
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"
    properties:
      useExistingProfileLanguageTag: true
    transitions: {}
  intent:
    component: "System.Intent"
    properties:
      variable: "iResult" 

Manipulación de las entradas antes de la traducción

Si quiere manipular el texto de entrada antes de enviarlo al servicio de traducción, puede utilizar el componente System.TranslateInput. Por ejemplo, puede que quiera procesar la entrada de usuario para eliminar datos personales antes de enviarla al servicio de traducción.

En el siguiente fragmento, la variable sourceString incluye el texto que se debe traducir. (Esta entrada, por ejemplo, puede haber sido recopilada por un componente System.Text y procesada por otro componente). Una vez que System.TranslateInput termina su procesamiento, la traducción al inglés se almacena en la variable translatedString.
context:
  variables:
    autoTranslate: "boolean" 
    translatedString: "string"
    sourceString: "string"    
   ...
states:
   ...
  translateInputString:
    component: "System.TranslateInput"
    properties:
      source: "sourceString"
      variable: "translatedString"
    transitions: {}

Grupos de recursos para las aptitudes

Si quiere controlar la redacción de las respuestas de la aptitud (en lugar de basarse en el texto proporcionado por el servicio de traducción), utilice grupos de recursos. Puede proporcionar grupos de recursos para tantos idiomas y dialectos como sea necesario.

Creación de una clave de grupo de recursos

Para cada aptitud, puede definir claves de grupos de recursos que identifican el texto de salida que se debe traducir y, a continuación, proporcionar valores para esas claves en uno o más idiomas. Las claves se definen automáticamente para el nombre de conversación de cualquier intención que haya creado, así como para las respuestas de cualquier intención de respuesta. Sin embargo, usted debe crear claves para otro texto de salida que desee traducir, como texto del flujo de diálogo.

Para crear entradas de grupos de recursos:
  1. En la navegación de la izquierda de la aptitud, haga clic en icono Grupo de recursos..

  2. Haga clic en el separador Definido por el usuario.
  3. Haga clic en Agregar grupo.

    Por defecto, el idioma de la primera clave es el inglés.

  4. Introduzca la clave y su texto. Por ejemplo, para la petición de datos de usuario How old are you?, puede introducir HowOld en el campo Clave y, a continuación. How old are you? en el campo Texto.

  5. Haga clic en Crear entrada.

  6. Para agregar una versión de la cadena en un idioma extranjero, haga clic en Agregar Idioma.

    Descripción de resource_bundles_entries.png a continuación

  7. Complete el cuadro de diálogo Crear entrada:
    • Idioma: agregue una etiqueta de idioma IETF BCP 47 como, por ejemplo, fr para francés o de para alemán.

    • Texto: cadena de salida. Por ejemplo, para una traducción al francés (fr) de la clave HowOld, debe agregar una cadena como quel âge avez-vous?

      Nota

      También puede utilizar configuraciones regionales más específicas (como en-US), pero, en la mayoría de los casos, no son útiles. Por ejemplo, si está utilizando un servicio de traducción (mediante el componente System.DetectLanguage) para detectar el idioma, solo se devolverá un código de dos letras.

      Si la aptitud no puede parear el idioma de entrada con una etiqueta de idioma definida en el grupo, se establece por defecto en una etiqueta menos específica (si hay alguna disponible). Si ninguna de las entradas coincide con el idioma del explorador, la aptitud utiliza la entrada por defecto, inglés. Consulte Resolución de entrada de grupo de recursos para obtener más información.

  8. Si quiere traducir otras cadenas, haga clic en Agregar clave para crear otra entrada en el grupo de recursos.

  9. Haga referencia al grupo de recursos en el flujo de diálogo. Puede definir las peticiones de datos de entidades como un grupo de recursos.

Nota

Las entidades personalizadas no se pueden traducir con grupos de recursos. En su lugar, puede agregar traducciones como sinónimos en la lista de valores de las entidades personalizadas.

Traducción del nombre de conversación

En algunos puntos de una conversación, como cuando la aptitud intenta determinar qué flujo quiere seguir el usuario, la aptitud puede presentar un cuadro de diálogo que hace referencia a una o varias intenciones. En estos casos, la aptitud hace referencia a las intenciones por sus nombres de conversación, para los que se generan claves y entradas por defecto en el grupo de recursos.

Para proporcionar una traducción para un nombre de conversación:

  1. Haga clic en Grupo de recursos en la barra de navegación izquierda (Imagen del icono Grupo de recursos de la barra de navegación izquierda.).

  2. Haga clic en el separador Intenciones de la página Grupos de recursos.


    Descripción de rb_conversation- name.png a continuación

  3. Seleccione la intención.

  4. Haga clic en Agregar idioma.

  5. Complete el cuadro de diálogo Crear entrada:
    • Idioma: agregue una etiqueta de idioma IETF BCP 47 como, por ejemplo, fr para francés, de para alemán o en-US para inglés estadounidense.

    • Texto: cadena de salida. Por ejemplo, para una traducción al francés (fr) de la clave HowOld, debe agregar una cadena como quel âge avez-vous?

Nota

Si la intención cuyo nombre de conversación quiere cambiar no aparece en la lista, haga clic en Imagen del icono Intención. para volver a la página Intenciones, seleccione la intención y edite el campo Nombre de conversación. Al volver a la página Grupos de recursos, debería aparecer bajo el separador Intenciones.

Traducción de las respuestas para intenciones de respuesta

Al crear una intención de respuesta, se crea automáticamente una clave de grupo de recursos para la respuesta.

Para proporcionar una traducción de una respuesta en una intención de respuesta:

  1. Haga clic en Grupo de recursos en la barra de navegación izquierda (Imagen del icono Grupo de recursos de la barra de navegación izquierda.).

  2. Haga clic en el separador Preguntas y respuestas de la página Grupos de recursos.

  3. Seleccione la clave para la respuesta que desea traducir.

  4. Haga clic en Agregar idioma.

  5. Complete el cuadro de diálogo Crear entrada:
    • Idioma: agregue una etiqueta de idioma IETF BCP 47 como, por ejemplo, fr para francés, de para alemán o en-US para inglés estadounidense.

    • Texto: cadena de salida.

Grupos de recursos de referencia en el flujo de diálogo

Para definir la salida de un componente incorporado, haga referencia a la clave del mensaje y a la variable de contexto del grupo de recursos.

En el siguiente fragmento de OBotML para una aptitud pizza, el grupo de recursos se declara como la variable, rb, en la sección de contexto. Más abajo, las expresiones de valor definen la propiedad de texto para los componentes System.Output y hacen referencia a la variable rb y las claves WhatType y OnTheWay. La primera genera una cadena simple y la otra utiliza valores dinámicos.
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 key.
  transitions:
    return: "done"
Para mensajes más sencillos, también puede hacer referencia a grupos de recursos utilizando la notación de puntos (${rb.WhatType}).

Consejo:

Para probar los grupos de recursos utilizando el comprobador, configure el explorador en otro idioma.

Grupos de recursos y traducción automática de aptitudes

Aunque se utilicen grupos de recursos, se sigue utilizando un servicio de traducción para que los usuarios puedan proporcionar entradas en su idioma nativo. Sin embargo, no querrá que los componentes que utilicen los grupos de recursos se traduzcan automáticamente.

Estos son los pasos generales para configurar una aptitud para usar un servicio de traducción para entradas del usuario cuando se utilizan grupos de recursos para las respuestas de la aptitud:

  1. Si aún no lo ha hecho, agregue un servicio de traducción a la aptitud.
  2. Utilice el componente System.DetectLanguage para determinar el idioma de la entrada del usuario.
  3. Aplique los grupos de recursos para manejar las respuestas de la aptitud al usuario.
  4. En el caso de componentes que hagan referencia a grupos de recursos, asegúrese de que la traducción automática esté desactivada. Para ello, puede:
    • Utilizar el método inclusivo:
      1. Establezca la variable de contexto autoTranslate en false (o no la establezca).
      2. Defina la propiedad translate en true para System.Intent, System.Text y otros componentes de entrada.
    • Utilizar el método exclusivo:
      1. Establezca la variable de contexto autoTranslate en true.
      2. Sustituya autoTranslate para los componentes que utilicen grupos de recursos (como los componentes System.Output y System.CommonResponse) estableciendo la propiedad translate para esos componentes en false.

      Una desventaja de este método es que puede resultar más difícil observar dónde se ha configurado involuntariamente la traducción automática de un componente que debería utilizar, en su lugar, grupos de recursos.

Si la aptitud usa grupos de recursos para algunos componentes, pero se basa en la traducción automática para otros componentes, puede:

  • Establezca la variable de contexto autoTranslate en true.
  • Defina la propiedad translate en false para cada componente que utilice un grupo de recursos.
Ejemplo: traducción con grupos de recursos

El siguiente código de ejemplo de flujo de diálogo muestra la parte relevante del flujo de diálogo para una aptitud que acepta una entrada de usuario en un idioma distinto al inglés, la traduce al inglés para la resolución de intenciones y responde en el idioma del usuario utilizando texto de los grupos de recursos.

La variable de contexto autotranslate no está establecida, por lo que los componentes no se traducen automáticamente por defecto. Sin embargo, la propiedad translate está definida en true para el componente System.Intent, de manera que la entrada de usuario se traduce automáticamente.

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: {}
  ...

En este ejemplo:

  • Se presupone que hay un servicio de traducción activado para la aptitud.
  • La variable de contexto rb va acompañada de otra variable denominada translated.
  • Se ha definido System.DetectLanguage. El valor de profile.languageTag se define en el código de dos letras del idioma detectado. Este valor también tiene prioridad sobre el valor de profile.locale.
  • Dado que los componentes System.DetectLanguage y System.TranslateInput preceden al componente System.Intent, permiten que la entrada de usuario inicial se traduzca al inglés para que el componente System.Intent pueda utilizarla y se resuelva en una de las intenciones.
Nota

También puede detectar el idioma desde el cliente de mensajería a través de la variable profile.locale (y no utilizar el componente System.DetectLanguage). Sin embargo, este enfoque requiere que los usuarios llamen inicialmente a la aptitud en inglés (por ejemplo, “Hello, PizzaJoe!”).

Resolución de entrada del grupo de recursos

El grupo de recursos que se aplica depende del valor almacenado para las dos variables de contexto de usuario específicas de la ubicación, profile.languageTag y profile.locale. Si se establecen ambas variables, profile.languageTag tiene prioridad.

profile.languageTag se define en el idioma de la entrada del usuario mediante el componente System.DetectLanguage, si se dispone de dicho componente en el flujo de diálogo. El valor de profile.languageTag tiene el formato de un código de idioma de dos caracteres (por ejemplo, en para inglés).

El cliente de mensajería define profile.locale. El valor de profile.locale puede tener el formato idioma-país-variante (por ejemplo, en-AU-sydney), idioma-país (por ejemplo, en-AU) o idioma (por ejemplo, en).

Para resolver el idioma que utilizar, Oracle Digital Assistant busca en primer lugar una coincidencia exacta. Si no la encuentra, amplía incrementalmente la búsqueda hasta que lo consigue. Si sigue sin encontrar ninguna coincidencia, devuelve el idioma por defecto, que es el inglés (en).

Por ejemplo, si el valor de ${profile.locale} es en-AU-sydney (y profile.languageTag no se ha definido), Oracle Digital Assistant realiza las siguientes acciones para buscar la mejor coincidencia de idioma:
  1. Busca en el grupo los criterios de idioma-país-variante (en-AU-sydney).

  2. Si no obtiene resultados, busca en el grupo el idioma y el país (en-AU).

  3. Si tampoco así obtiene resultados, amplía su búsqueda al idioma (en).

Exportación e importación de grupos de recursos

Puede exportar e importar grupos de recursos como formato de archivo CSV, lo que permite trabajar con los grupos fuera de línea.

El archivo CSV debe tener las siguientes columnas:

  • languageTag
  • key
  • message
  • annotation

Para exportar un archivo CSV con el grupo de recursos existente:

  • En la página Grupo de recursos de la aptitud o el asistente digital, haga clic en icono Exportar grupo de recursos para exportar un archivo CSV con el grupo de recursos existente.

    Incluso si aún no ha agregado ninguna clave al grupo de recursos, se exportará un archivo con el formato necesario del CSV.

Para importar un archivo de grupo de recursos:

  • En la página Grupo de recursos de la aptitud o el asistente digital, haga clic en icono Importar grupo de recursos .

¿Cómo se traducen las respuestas de componentes personalizados?

Hay tres métodos para devolver contenido traducido de los componentes personalizados:
  1. Almacene un objeto de datos enviado desde un componente personalizado en una variable de contexto. A continuación, puede hacer referencia a esta variable en los componentes de la interfaz de usuario incorporada, como System.Output, System.Text o System.CommonResponse.
  2. Guarde los mensajes de cadena en una variable de contexto y, a continuación, transfiera el nombre de la variable de contexto como un parámetro de entrada a los componentes del sistema, como System.Output, System.List, System.CommonResponse o System.TranslateOutput.
  3. Traduzca la salida del componente personalizado en el propio componente y, a continuación, escriba directamente la respuesta en el cliente de mensajería (evitando así los componentes del sistema por completo).

Opción 1: almacenamiento de datos en una variable de contexto

Los componentes personalizados que consultan servicios de backend pueden devolver datos en un formato complejo, como un objeto o una matriz de objetos. Si es necesario traducir estos datos:
  1. Guarde los datos en una variable de contexto del flujo de diálogo.

    Para escribir datos de un objeto de datos en una variable de contexto, agregue el siguiente código al componente personalizado:
    conversation.variable('dialogVar', dataObject);
    conversation.transition();
    done();
    
    Para que esta línea de código en particular funcione, debe agregar una variable de contexto correspondiente a la definición del flujo de diálogo denominada dialogVar, de tipo string:
    dialogVar: "string"

    Consejo:

    Se recomienda transferir el nombre de la variable de contexto en la que el componente personalizado debería escribir como un parámetro de entrada en el componente personalizado. De esta forma, se asegura de que el parámetro de contexto existe realmente al acceder a él.
  2. Incluya la propiedad translate: true en una definición del componente de salida o utilice el componente System.TranslateOutput para traducirlo al idioma del usuario.

    Los componentes del sistema no pueden traducir un objeto de datos como un todo, por lo que, si necesita traducir los objetos de datos almacenados en una variable de contexto, deberá hacer referencia a la variable de contexto junto con el nombre del atributo del objeto de datos que se muestra al usuario y se traduce mediante un componente de salida. En el siguiente ejemplo, la variable de contexto es dialogVar. El objeto de datos que se transfiere del componente personalizado a esta variable de contexto es {product: "an apple", type: "fruit", origin: "Spain" }. Para mostrar y traducir este objeto, debe hacer referencia a un componente System.Output y activar su traducción:
    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
    
    Si se activa un servicio de traducción para la aptitud, este mensaje se traduce al idioma del usuario. El componente personalizado también transfiere el contenido traducido al objeto de datos.

Opción 2: guardado de mensajes en una variable de contexto

En este enfoque, puede transferir al componente personalizado el nombre de la variable de contexto que contiene la respuesta del componente como parámetro de entrada. Así, se garantiza que los componentes personalizados no dependan de un código de implantación de OBotML específico y que se puedan seguir reutilizando.

El siguiente ejemplo de OBotML hace referencia a un componente personalizado en el estado initializeReceipt y transfiere el nombre de la variable de contexto (receipt), que contiene la respuesta del componente, y purchaseId como parámetros de entrada.
initializeReceipt:
  component: "sample.receipt.dataresponse"
  properties:
    dataVariable: "receipt"
    purchaseid: "${purchaseId.value}

printReceipt:
  component: "System.Output"
  properties:
    text:"${receipt.value}"
    translate: true
 ...
El código personalizado para acceder a estos parámetros de entrada es el siguiente:
...
invoke: (conversation, done) => {
  var responseVariable = conversation.properties().dataVariable;
  var purchaseId = conversation.properties().purchaseId;
  ...
  var message = queryRemoteServiceForReceipt(purchaseId);
  ...
  conversation.variable(responseVariable, message);
  conversation.transition(); 
  done();
}
Para mostrar mensajes en el idioma de usuario detectado, puede utilizar el componente System.TranslateOutput o definir la propiedad translate en un componente de salida, como System.CommonResponse o System.Output, como se puede ver en el estado printReceipt: si un componente personalizado devuelve un mensaje en un idioma distinto al inglés, que, por lo tanto, es necesario procesar con el motor de procesamiento de lenguaje natural (NLP), el componente System.TranslateInput se ubicaría antes de System.Intent en el flujo de diálogo. Esto permite al componente System.Intent procesar la versión en inglés del mensaje.
translateMessage:
  component: "System.TranslateInput"
  properties:
    source: "variable_populated_by_custom_component"
    variable: "translationStringVar"
getIntent:
  component: "System.Intent"
  properties:
    variable: "iResult"
    sourceVariable: "translationStringVar"
...

Opción 3: envío de respuestas directamente al usuario

En algunos casos, los componentes personalizados pueden ser independientes: no envían un mensaje directamente a un canal de mensajes ni guardan datos en una variable de contexto. Estos componentes personalizados devuelven las respuestas directamente al usuario porque usan el método auxiliar conversation.reply.
Nota

Las respuestas que se envían directamente a un usuario no pueden ser traducidas por un servicio de traducción. En este caso, deberá codificar las traducciones en el componente personalizado
Hay dos formas de traducir las respuestas de aptitud que se envían directamente desde un componente personalizado:
  1. En el código del componente personalizado, llame a un servicio de traducción antes de enviar el mensaje. Utilice este método cuando el mensaje no se origine en el componente personalizado, sino que se haya consultado desde un backend remoto. En este caso, la traducción automática convierte las cadenas al idioma que espera la aptitud.
  2. Use los grupos de mensajes para proporcionar respuestas traducidas para los idiomas que quiera que admita la aptitud. Los grupos de mensajes pueden utilizar marcadores de posición en las cadenas traducidas en las que el componente personalizado inserta el valor de los datos en tiempo de ejecución. Los grupos de mensajes de los componentes personalizados son una opción viable si el componente personalizado consulta los datos de un servicio remoto.
    Para detectar el idioma preferido en el componente personalizado, puede transferir la configuración regional como un parámetro de entrada al componente o acceder a las variables profile.locale y profile.languageTag, como se muestra en el siguiente ejemplo:
    //detect user locale. If not set, define a default
    var locale = conversation.variable('profile.locale')?
                 conversation.variable('profile.locale') : 'en';
    //when profile languageTag is set, use it. If not, use profile.locale
    var languageTag = conversation.variable('profile.langageTag')?
                      conversation.variable('profile.langageTag') : locale;