Globalizando Nuestras Aplicaciones en APEX 5.0 - Parte II

Por Clarisa Maman Orfali Oracle ACE
Publicado en Mayo 2016

En el artículo anterior Globalizando Nuestras Aplicaciones en APEX 5.0 - Parte I estuvimos viendo el proceso completo para traducir una aplicación desarrollada en APEX utilizando la herramienta de “Traducir Aplicación” localizada en Componentes Compartidos dentro de la sección Globalización.

En esta segunda parte aprenderemos cómo implementar en nuestra aplicación el cambio de idioma y luego completaremos el recorrido a través de la sección Globalización para aprender a traducir textos usados en código PL/SQL y los mensajes internos usados por Oracle Application Express.

Manejar los idiomas en la Aplicación

Vamos a crear un enlace de idioma en la aplicación para que el usuario pueda cambiar el idioma con el que desea ver la aplicación.

Anteriormente hemos configurado en atributos de Globalización de la Aplicación que se determine el idioma de la aplicación mediante la sesión, es por ello que lo que necesitamos hacer es cambiar el valor de sesión y refrescar la página que es mostrada en APEX.

Una forma de hacerlo es a través del uso de Acciones Dinámicas para que cambie el lenguaje en la sesión usando las APIs APEX_UTIL.GET_SESSION_LANG y APEX_UTIL.SET_SESSION_LANG y JavaScript para recargar la página, una solución presentada por Francis Mignault que me gustó mucho y por ello lo quiero compartir.

En nuestro caso tendremos la aplicación principal en español y queremos traducirla al inglés. Lo que necesitamos hacer es mostrar el link en nuestra aplicación del idioma disponible para poder cambiar de idioma, es decir, en la versión de la aplicación en español se mostrará el link del idioma Ingles y en la versión de la aplicación en ingles se va a mostrar el link del idioma español, de esa forma el usuario podrá cambiar de idioma muy fácilmente.

Para realizar la tarea de agregar el enlace en cada página vamos a realizar un pequeño cambio en la plantilla utilizada en la Barra de Navegación.

Primero de todo haremos una copia de la plantilla:

Desde la página de inicio de la aplicación:

  1. Hacemos clic en “Componentes Compartidos”
  2. En la sección “Interfaz de Usuario”, hacemos clic en “Plantillas”
  3. En el listado de plantillas buscamos la Lista que tiene el nombre “Navigation Bar” y hacemos una copia haciendo clic en el botón de copia y le colocamos el nombre por ejemplo: “Menu-Navegación-Demo”
  4. Hacemos clic en la Plantilla de Lista recién creada para editarla.

En la ficha “Definición de la Plantilla” ingresamos un Identificador (ID) de clase CSS llamado id=cambiaridioma el cual usando este ID podremos asignarlo a la Acción Dinámica que crearemos más adelante, este cambio lo necesitamos realizar tanto en el recuadro de “Plantilla de Lista Actual” como en el recuadro de “Plantilla de Lista No Actual”

Para realizar esta añadidura en la plantilla vamos a hacer uso de una variable de sustitución disponible en la plantilla, para ver qué variables de sustitución tiene la plantilla podemos hacer clic en la ficha “Cadenas de Sustitución” y allí visualizar el listado de las mismas:

Como podemos observar la cadena de sustitución #A03# está disponible como un atributo Opcional y haremos uso de la misma para ingresarlo en la Plantilla de Lista.

Regresamos a la ficha de “Definición de la Plantilla” y colocamos el id=#A03# en la siguiente ubicación del recuadro de Plantilla de Lista Actual:

De igual modo procedemos para el recuadro de Plantilla de Lista No Actual.

Nos desplazamos a la sección “Descripción de la Plantilla” y allí ingresamos en la fila que corresponde a la Descripción de #A03# la siguiente descripción: Cambiar Idioma ID

Para finalizar, Aplicamos los cambios.

Asignar Plantilla de Lista a la Aplicación

Ahora necesitamos asignar la plantilla modificada a nuestra aplicación y para ello regresamos a la página de inicio de la misma y hacemos clic en el botón “Editar Propiedades de Aplicación”.

  1. Hacemos clic en la ficha “Interfaz de Usuario”
  2. Hacemos clic en el icono de lápiz para editar la interfaz de usuario del Escritorio
  3. En la sección Barra de Navegación indicamos en Plantilla de Lista que use “Menu-Navegacion-Demo”

Hacemos clic en el botón Aplicar Cambios.

Crear Nueva Entrada en la Barra de Navegación

Desde la página de inicio de la aplicación:

  1. Hacemos clic en “Componentes Compartidos”
  2. En la sección “Navegación”, hacemos clic en “Lista de Barra de Navegación”
  3. Seleccionamos la barra de navegación “Escritorio Barra de Navegación”
  4. Podemos ver que sólo tenemos asignado una sola entrada llamada “Desconectar”
  5. Hacemos clic en el botón “Crear Entrada de Lista”
  6. En Etiqueta de Entrada de Lista colocamos: English
  7. En Tipo de Destino: URL
  8. En Destino de URL: javascript:void();

Nos desplazamos hacia la ficha “Atributos Definidos por el Usuario” y agregamos en el tercer recuadro el nombre cambiaridioma.

Y aplicamos los cambios.

Crear Página Global y las Acciones Dinámicas

Vamos a crear una página global en nuestra aplicación para que allí podamos crear las Acciones Dinámicas que realicen la tarea de cambiar el idioma.

Desde la página de inicio de la aplicación, hacemos clic en el botón Crear Página y seleccionamos Página Global. Esta página se crea con el número de página 0 y todo el contenido de la página será presentado en todas las páginas de la aplicación.

Ingresamos al Diseñador de Páginas de la Página Global y hacemos clic en la ficha Acciones Dinámicas.

Añadimos una Acción Dinámica con el evento Clic basado en un Selector de jQuery con un selector de jquery igual a #cambiaridioma, y que tenga dos Acciones Verdaderas.

En la Acción  Verdadera “Ejecutar Código PL/SQL” ingresamos el siguiente código:

if  nvl(apex_util.get_session_lang,'es-ar') = 'es-ar'
then apex_util.set_session_lang('en-us');
else apex_util.set_session_lang('es-ar');
end  if;

 

Y configuramos en la sección de “Opciones de Configuración” --- Arrancar al Cargar la Página = No.

En la Acción Verdadera “Ejecutar Código JavaScript” ingresamos en el recuadro Código, lo siguiente:

location.reload();
 

Y también configuramos en la sección de “Opciones de Configuración” --- Arrancar al Cargar la Página = No.

Hacemos clic en el botón Guardar.

Re-publicar la Aplicación traducida

Como hemos hechos cambios en la aplicación primaria necesitamos realizar las traducciones permitentes para que se actualicen las cadenas de traducción.

Si volvemos a la página de traducciones veremos que nos indica que el archivo XLIFF necesita una Sincronización.

Y es por ello que debemos volver a realizar el proceso de extraer, luego modificar el texto en el repositorio de traducciones y finalmente publicar las traducciones.

Hacemos clic en Publicar aplicaciones traducidas, seleccionamos la aplicación 112 y luego hacemos clic en el botón Extraer.

Posteriormente volvemos a seleccionar la aplicación 112 y luego nos vamos al repositorio de traducciones y allí modificamos las cadenas de textos nuevas.

Por ejemplo podemos buscar en el Informe Interactivo la palabra Buscar y editamos la palabra colocando en la columna Traducir a: Search

De igual modo necesitamos indicar en la Barra de Navegación que cuando la aplicación está en español la entrada se lea English y cuando la aplicación este en idioma inglés, la entrada se lea Español.’

Para ello buscamos en el listado del repositorio de traducciones la palabra English y en el texto a traducir ingresamos Español y aplicamos los cambios.

Una vez que tenemos hechas las traducciones de las cadenas de texto nuevas, regresamos a la Página de Traducciones y hacemos  clic en el enlace “Publicar aplicaciones traducidas”, seleccionamos la aplicación traducida marcando la casilla de control (veremos que nos indica que se necesita

Sincronización) y hacemos clic en el botón Publicar. Después de la publicación la aplicación traducida nos indica que no necesita sincronización.

Ejecutar la Aplicación

Ahora es momento de ejecutar la aplicación y podemos observar en la Barra de Navegación el enlace del idioma English porque la preferencia de la aplicación mostró la aplicación en “Español”.  Podemos ver que todos los textos de la página están en español, (sin tener en cuenta los datos del Informe Interactivo que muestra los datos de la tabla EMP cuya data está en inglés).

Si cambiamos el idioma a English, podemos observar que el idioma de nuestra página ha cambiado según las modificaciones que se hizo en el repositorio de traducciones de APEX.

Ahora volvemos a la sección de Globalización en los Componentes Compartidos.

Atributos de Globalización

Dentro de la sección de Globalización tenemos la posibilidad de ingresar directamente a los atributos de Globalización de nuestra aplicación para modificar cualquier valor de los atributos presentados.

Tenemos que tener en cuenta de activar la codificación de CSV Automática en , ya que esto controla la codificación de toda la salida del CSV del informe en una aplicación. Es decir, la salida del CSV del informe se convertirá correctamente en un juego de caracteres compatible con las aplicaciones de escritorio localizadas. El juego de caracteres para la codificación de CSV estará determinado por el valor de idioma de la aplicación.

Traducir Mensajes Usados en Código PL/SQL

Para completar el aprendizaje de toda la sección de Globalización veremos ahora la funcionalidad “Mensaje de Texto”.

Podemos utilizar los mensajes de texto para crear cadenas de texto traducibles con variables de sustitución que se pueden llamar desde código PL/SQL, paquetes, procedimientos y funciones.

¿Cuándo necesitamos usar la funcionalidad “Mensajes de Texto”? básicamente cuando en nuestra aplicación tenemos regiones de PL/SQL, procesos, paquetes o funciones y seguramente necesitamos traducir el HTML generado.

También trabajaríamos con esta funcionalidad si estamos desarrollando nuestra aplicación en un idioma que no está dentro de los 10 idiomas con el cual Oracle Application está traducido.

Veamos un ejemplo básico de traducción de un mensaje de saludo inicial.

Desde la Página de Inicio de la Aplicación:

  1. Hacemos clic en Componentes Compartidos
  2. En la sección Globalización, hacemos clic en “Mensaje de Texto”
  3. Hacemos clic en el botón “Crear Mensaje de Texto”
  4. Nombre: GREETING_MSG
  5. Idioma: Español (Argentina) (es-ar)
  6. Texto: Buen día %0
  7. Hacemos clic en el botón “Crear y Crear Otro”
  8. Nombre: GREETING_MSG
  9. Idioma: Inglés (Estados Unidos) (en-us)
  10. Texto: Good morning %0
  11. Hacemos clic en el botón “Crear Mensaje de Texto”

Para traducir los mensajes usamos la API APEX_LANG.MESSAGE, cuya sintaxis es:

APEX_LANG.MESSAGE  (
 p_name    IN    VARCHAR2 DEFAULT NULL,
 p0         IN    VARCHAR2 DEFAULT NULL,
 p1         IN    VARCHAR2 DEFAULT NULL,
 p2        IN     VARCHAR2 DEFAULT NULL,
 ...
 p9        IN    VARCHAR2 DEFAULT NULL,
 p_lang     IN    VARCHAR2 DEFAULT NULL)
 RETURN VARCHAR2;


Donde:
p_name: corresponde al nombre de mensaje definido en Oracle APEX.
p0 …. p9: corresponde al valor de sustitución dinámica, p0 corresponde a 0% en el mensaje; p1 corresponde a 1% en el mensaje, p2 corresponde a 2% en el mensaje y así para los siguientes valores.
p_lang: corresponde al código del lenguaje para el mensaje que se necesita recuperar. Si no se especifica, APEX utiliza el idioma actual para el usuario tal como está definido en el “Idioma de Aplicación Derivado del atributo”.

Ahora vamos a implementar el saludo en nuestra aplicación.

En la página de Inicio de la aplicación agregamos una región de contenido PL/SQL con el siguiente código:

begin
htp.p(apex_lang.message('GREETING_MSG', V('APP_USER')));
end;
 

Y guardamos los cambios realizados.

Re-publicar la Aplicación traducida

Como hemos hecho otra vez cambios en la aplicación original necesitamos realizar las traducciones permitentes para que se actualicen las cadenas de traducción.

Volvemos a realizar el proceso de extracción, modificación de las cadenas de textos nuevas y finalmente realizamos la publicación.

Ejecutamos la Aplicación

Al ejecutar la aplicación veremos nuestro saludo de bienvenida en el idioma Español.

Y al cambiar el idioma a English, podemos ver que el mensaje de saludo ha cambiado usando el Mensaje de Texto.

También tenemos la opción de personalizar los mensajes usados internamente por APEX, con el solo hecho de encontrar el nombre del mensaje  podemos ingresarlo como como un nuevo Mensaje de Texto y colocamos el texto personalizado según nuestros requerimientos de la aplicación. Aquí tenemos disponible una lista de los nombres de mensajes usados en APEX internamente.

Traducir Datos de Nuestra Aplicación

Para traducir los datos de las tablas ya se necesita un esfuerzo mayor ya que existen diferentes métodos de implementación, uno de ellos por ejemplo sería agregar una columna a cada tabla de nuestro esquema que sea la que guarde el lenguaje del registro (es/en) y luego cargar cada registro especificando el lenguaje que corresponde. Posteriormente seleccionar en la forma en que APEX determina el lenguaje la opción Sesión, como lo presentamos en este artículo en su primera parte y en la consulta SQL del Informe Interactivo indicar en la cláusula WHERE que la columna lenguaje sea igual a APEX_UTIL.GET_SESSION_LANG.

Conclusión

Hemos llegado al final de este paseo por las diferentes opciones que nos brinda APEX para traducir nuestras aplicaciones web.
A lo largo de todo el artículo hemos cubierto el proceso completo de traducción de una aplicación, la configuración de los atributos de globalización y una de las tantas formas de implementar el cambio de idioma dentro de la aplicación como también el uso de la funcionalidad de “Mensaje de Texto” para personalizar los mensajes usados internamente en APEX como también para traducir mensajes de textos utilizados en código PL/SQL, procedimientos, paquetes y/o funciones.

 


Clarisa Maman Orfali es fundadora y CEO de ClarTech Solutions Inc. Se ha convertido en Oracle ACE hace algunos años, tiene más de 15 años de experiencia en el desarrollo y la capacitación en tecnologías de la información. Hace unos años descubrió la belleza de Oracle Application Express (APEX) y se ha especializado en esa área. Ella también es una Co-Fundadora y Directora del Argentina Oracle User Group (AROUG) y ha participado activamente en la organización de grandes y populares eventos. Ella tiene una gran pasión por las tecnologías de Oracle y quiere ampliar esa pasión e influencia transfiriendo su conocimiento y experiencia a la totalidad de las comunidades de Oracle América Latina y en todo el mundo.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.