💡 Introducción
En un entorno empresarial cada vez más globalizado, es habitual que las organizaciones desplieguen soluciones que deben ser utilizadas por equipos en distintos países y regiones.
Detección del Idioma del Usuario
Para que la experiencia del usuario sea fluida, la aplicación debe detectar automáticamente el idioma del sistema operativo o del navegador del usuario. Power Fx proporciona la función Language() para este propósito.
Esta función devuelve una cadena de texto con el formato de código de cultura (por ejemplo, «es-ES» para Español de España, o «en-US» para Inglés de Estados Unidos). Para simplificar nuestras búsquedas, se recomienda extraer únicamente los dos primeros caracteres usando la función Left():
Set(varIdiomaUsuario, Left(Language(), 2))
De este modo, obtendremos códigos universales como «es», «en», «fr» o «pt», facilitando la correspondencia con nuestro catálogo de traducciones.
Estrategias Clave para la Localización
A la hora de estructurar traducciones en Power Apps, existen tres enfoques principales. La elección de uno u otro dependerá de la complejidad de la aplicación, el número de idiomas a soportar y los requerimientos de rendimiento.
1. Enfoque Basado en Tablas Externas (Dataverse / SharePoint / Excel)
Consiste en almacenar todas las cadenas de texto (etiquetas, marcadores de posición, mensajes de error) en un repositorio externo. Durante el inicio de la aplicación (OnStart), estos datos se descargan en una colección local.
- Ventajas: Los traductores pueden editar los textos directamente en la base de datos sin necesidad de abrir Power Apps Studio. Soporta un número ilimitado de idiomas.
- Desventajas: Requiere una llamada de red inicial para cargar los datos, lo que puede demorar en el inicio de la app.

2. Enfoque de Colección Local Estática
Adecuado para aplicaciones medianas con un número controlado de idiomas (por ejemplo, Español, Inglés y Portugués). Consiste en declarar la matriz de traducciones directamente en el código de la aplicación usando Power Fx.
- Ventajas: Rendimiento óptimo, ya que no depende de conexiones a bases de datos externas durante la carga.
- Desventajas: Cada modificación de texto o adición de idioma requiere editar y volver a publicar la aplicación.
3. Traducción Dinámica con Servicios Cognitivos (Microsoft Translator)
Usa el conector nativo de Microsoft Translator para traducir textos en tiempo real a través de API.
- Ventajas: Traducción automática al instante para cualquier idioma del mundo.
- Desventajas: Consumo de llamadas API, costo asociado, dependencia de conexión a internet constante y posibles discrepancias gramaticales típicas de la traducción automática.
Comparativa Técnica de Estrategias
| Criterio | Tabla Externa (Recomendado) | Colección Local (OnStart) | Traductor Dinámico (API) |
|---|---|---|---|
| Rendimiento | Medio-Alto (Carga inicial) | Excelente (Instantáneo) | Bajo (Llamadas bajo demanda) |
| Mantenibilidad | Excelente (Por usuarios clave) | Bajo (Requiere desarrollador) | Fácil (Automático) |
| Calidad Gramatical | Perfecta (Traducción humana) | Perfecta (Traducción humana) | Variable (Traducción de máquina) |
| Soporte Sin Conexión | Sí (Si se almacena en caché) | Sí (Totalmente nativo) | No |
✍️ Ejercicio Práctico: Implementación de Traducción Local Estática
A continuación, crearemos un sistema multilingüe funcional desde cero utilizando colecciones de Power Fx locales.
Paso 1: Definir la Colección de Traducciones
Selecciona el objeto App en el árbol de navegación izquierdo, dirígete a la propiedad OnStart y pega el siguiente código para inicializar la colección y definir el idioma por defecto:
ClearCollect( colTraducciones, { Clave: "lbl_Bienvenido", ES: "¡Bienvenido a la App!", EN: "Welcome to the App!", PT: "Bem-vindo ao aplicativo!" }, { Clave: "lbl_Guardar", ES: "Guardar Cambios", EN: "Save Changes", PT: "Salvar Alterações" }, { Clave: "lbl_Cancelar", ES: "Cancelar", EN: "Cancel", PT: "Cancelar" }, { Clave: "lbl_SeleccionIdioma", ES: "Seleccione Idioma", EN: "Select Language", PT: "Selecione o idioma" });;// Detectar idioma del navegador del usuario y validar si está soportado. Si no, por defecto usar "en" (Inglés)Set( varIdiomaSeleccionado, If( Left(Language(), 2) in ["es", "en", "pt"], Left(Language(), 2), "en" ));;
Paso 2: Crear el Selector de Idiomas en la Interfaz
Inserta un control de tipo Dropdown (Desplegable) en tu pantalla principal y configúralo con los siguientes valores:
- Items: [«es», «en», «pt»]
- Default: varIdiomaSeleccionado
- OnChange:
Set(varIdiomaSeleccionado, Self.Selected.Value)
Paso 3: Aplicar las Traducciones a los Controles
Ahora, en lugar de escribir texto estático en las propiedades Text de tus etiquetas y botones, utilizaremos una función de búsqueda dinámica basada en la variable de idioma seleccionada.
Inserta una etiqueta de texto (Label) y escribe la siguiente fórmula en su propiedad Text:
LookUp( colTraducciones, Clave = "lbl_Bienvenido", If( varIdiomaSeleccionado = "es", ES, varIdiomaSeleccionado = "en", EN, PT ))
Para un botón de confirmación, aplica lo siguiente en su propiedad Text:
LookUp( colTraducciones, Clave = "lbl_Guardar", If( varIdiomaSeleccionado = "es", ES, varIdiomaSeleccionado = "en", EN, PT ))
¡Listo! Al cambiar la opción en el menú desplegable, todos los textos de la interfaz de usuario se actualizarán instantáneamente sin parpadeos de pantalla ni llamadas de red adicionales.


Deja una respuesta