La función de páginas multilingües de SharePoint Online gestiona razonablemente bien la mecánica de la traducción. Creas una página, añades idiomas, notificas a tus traductores, y el framework se encarga de vincular las páginas origen con sus contrapartes traducidas. Lo que no gestiona es la pregunta que llega seis meses después: ¿siguen siendo precisas esas traducciones?
El contenido cambia. Las políticas se actualizan. Los procedimientos se revisan. Una página que estaba perfectamente traducida en octubre puede estar significativamente desactualizada en marzo, y a menos que alguien esté revisando manualmente el panel de Traducción en cada página — una por una — no hay forma de saberlo. Esto es el drift de traducción, y es uno de los fallos de gobernanza más comunes y menos visibles en los despliegues de intranets multilingües.
Este artículo trata sobre un toolkit de gobernanza de traducción construido para resolver ese problema: dos scripts de PnP PowerShell y un SPFx web part que juntos proporcionan una vista del estado de las traducciones a nivel de sitio, actualizada a demanda o de forma programada.
Lo Que Realmente Cuesta el Drift de Traducción
El coste inmediato es obvio — los usuarios que leen la versión en francés de una página ven contenido que ya no refleja la política o el proceso actual. Para una intranet cuyo propósito es comunicar información precisa a una plantilla multilingüe, eso es un fallo fundamental de su razón de ser.
El coste menos obvio es la confianza. Una vez que los usuarios aprenden que no pueden fiarse de que el contenido en francés coincida con el inglés, dejan de usarlo — y la inversión en la infraestructura multilingüe se vuelve difícil de justificar. Recuperar esa confianza requiere no solo corregir las páginas desactualizadas, sino demostrar que existe un proceso de gobernanza para evitar que vuelva a ocurrir.
Un dashboard de drift de traducción es a la vez la herramienta de diagnóstico y la prueba del proceso. Muestra qué está desactualizado, quién es responsable de corregirlo y — cuando se ejecuta con regularidad — proporciona el rastro de auditoría que demuestra que el proceso de traducción se está gestionando activamente.
Cómo SharePoint Vincula las Páginas Origen con sus Traducciones
Antes de construir nada, conviene entender cómo la función de páginas multilingües de SharePoint conecta realmente las páginas origen con sus traducciones por debajo.
Cuando se crea una página traducida, SharePoint establece un campo llamado _SPTranslationSourceItemId en la página de traducción. Este campo contiene el UniqueId de la página origen — el identificador interno de SharePoint, distinto del campo GUID que devuelven las consultas de lista estándar. La página traducida también lleva _SPIsTranslation (un booleano que confirma que es una traducción) y _SPTranslationLanguage (el código de idioma, por ejemplo fr-fr).
Este es el vínculo que aprovecha el script de drift. Cargando todas las páginas de la biblioteca Site Pages, separando las páginas origen de las traducciones, y emparejándolas mediante _SPTranslationSourceItemId contra los valores UniqueId de las páginas origen, podemos emparejar de forma fiable cada página en inglés con su contraparte en francés — o marcarla como ausente.
Un matiz importante descubierto durante el desarrollo: _SPTranslationSourceItemId apunta al UniqueId de la página, no al campo GUID que devuelve Get-PnPListItem por defecto. Son valores distintos. El script solicita explícitamente UniqueId como campo y lo usa como clave de emparejamiento.
El Toolkit
La solución consta de tres piezas que trabajan juntas:
- Create-TranslationDriftList.ps1 — un script de configuración única que aprovisiona la lista de SharePoint TranslationDrift con 15 columnas que cubren identificación de página, cálculo de drift, propiedad del traductor y seguimiento de avisos. Idempotente — seguro de volver a ejecutar.
- Get-TranslationDrift.ps1 — el script de detección de drift. Escanea Site Pages, empareja páginas origen con traducciones, calcula el drift en días y rellena la lista TranslationDrift con un estado de In Sync, Stale o Missing por página. Puede ejecutarse manualmente o programarse mediante un Azure Automation Runbook.
- Translation Drift Dashboard SPFx web part — lee la lista TranslationDrift y renderiza un dashboard interactivo con tiles de resumen, una tabla ordenable y filtrable, indicadores de estado con código de color, y enlaces directos tanto a la página origen como a la traducida.
Lógica del Estado de Drift
Cada página recibe uno de tres estados:
In Sync — existe una traducción en francés y fue modificada dentro del umbral de obsolescencia configurado (7 días por defecto) respecto a la última modificación de la página origen en inglés. La traducción se considera actual. Ten en cuenta que una página en francés modificada después de su origen en inglés también aparece como In Sync — este es el comportamiento correcto bajo la suposición de que los cambios siempre fluyen de inglés a francés. Si alguien actualiza la página en francés de forma independiente sin actualizar primero el origen en inglés, el dashboard no lo marcará. Ese caso límite es un matiz de gobernanza genuino: el toolkit asume que el inglés es siempre la fuente de verdad, y cualquier edición independiente de páginas traducidas que no corresponda a una actualización en inglés queda fuera de lo que la detección de drift por sí sola puede captar. Una política de gobernanza de contenido que haga explícita esta expectativa — junto con una revisión manual periódica de las fechas de modificación en francés — es el control complementario.
Stale — existe una traducción en francés, pero el origen en inglés se ha modificado más recientemente que la traducción, superando el número de días del umbral. Es posible que la traducción ya no refleje el contenido actual.
Missing — no existe ninguna página de traducción en francés para esta página origen. O nunca se tradujo, o la traducción fue eliminada.
El umbral de obsolescencia es configurable tanto en el script (variable $StaleDays) como en el panel de propiedades del web part, de modo que organizaciones con distintos SLA de traducción puedan ajustarlo en consecuencia.
Qué Muestra el Dashboard
Los tiles de resumen en la parte superior ofrecen una instantánea inmediata del estado de salud. Al hacer clic en cualquier tile se filtra la tabla a ese grupo de estado — de modo que un propietario de sitio puede hacer clic en Stale y ver inmediatamente solo las páginas que necesitan atención, ordenadas por días de drift descendente para priorizar primero las más atrasadas.
Las columnas de la tabla cuentan toda la historia de gobernanza para cada página:
- Page — el título de la página origen en inglés, enlazado directamente a la página
- Status — indicador con código de color: verde (In Sync), ámbar (Stale), rojo (Missing)
- Days drift — cuántos días de desajuste tiene la traducción; se muestra en rojo cuando supera los 30 días
- EN modified — cuándo se actualizó por última vez el origen en inglés
- FR modified — cuándo se actualizó por última vez la traducción en francés
- Translator — el propietario del sitio, responsable de la gobernanza de traducción en ese sitio
- FR page — un enlace View directo a la traducción en francés para acceso rápido
Construyéndolo: Los Problemas Técnicos Interesantes
Dos cosas que no eran obvias al empezar y que merece la pena documentar para cualquiera que construya algo similar.
El Problema de UniqueId vs GUID
Como se mencionó antes, _SPTranslationSourceItemId no coincide con el campo GUID de Get-PnPListItem. Pasar tiempo intentando emparejar por GUID y obtener cero resultados cada vez es un buen indicador de que este es tu problema. La solución es solicitar explícitamente UniqueId como campo:
Get-PnPListItem -List "Site Pages" -Fields "Title","FileRef","UniqueId","_SPTranslationSourceItemId"
Luego construye tu tabla hash de búsqueda indexada por UniqueId.ToString().ToLower() y empareja contra _SPTranslationSourceItemId.ToString().ToLower().
Elementos de Carpeta en Site Pages
La biblioteca Site Pages utiliza carpetas para la navegación de secciones — elementos como Policies, Guidelines, Process Manuals que aparecen como carpetas en la biblioteca pero se muestran como elementos de lista en Get-PnPListItem. Estos deben excluirse del cálculo de drift, ya que son contenedores de navegación, no páginas de contenido traducibles. La solución es filtrar por la extensión .aspx:
$_.FieldValues["FileRef"] -match "\.aspx$"
Sencillo, pero no inmediatamente obvio cuando ves carpetas apareciendo en tus resultados con estado Missing.
Ejecutarlo
Configuración inicial:
# 1. Provision the list
.\Create-TranslationDriftList.ps1
# 2. Run the drift scan
.\Get-TranslationDrift.ps1
Ejecuciones posteriores — simplemente ejecuta Get-TranslationDrift.ps1. Detecta los elementos de lista existentes mediante una búsqueda en tabla hash y los actualiza en lugar de crear duplicados.
Para gobernanza continua — ejecuta el script de drift mensualmente (o semanalmente para sitios de alta actividad) mediante Azure Automation con autenticación basada en certificado. El web part siempre refleja la ejecución más reciente, de modo que el dashboard se mantiene actualizado sin intervención manual.
Qué Viene Después
El toolkit, tal como está construido, cubre la detección y la visibilidad. Los siguientes pasos naturales son:
Notificaciones de aviso — un flujo de Power Automate desencadenado por la ejecución del script de drift que envía un correo al traductor con la lista de sus páginas obsoletas y ausentes. Las columnas TranslatorEmail y NudgeSent de la lista TranslationDrift ya están diseñadas para esto.
Escaneo multi-sitio — extender el script de drift para aceptar una lista de URLs de sitios y rellenar un único dashboard cruzado entre sitios, dando a los gestores de la intranet visibilidad sobre todo un tenant en lugar de sitio por sitio.
Soporte multi-idioma — el script actualmente apunta específicamente a fr-fr. Extenderlo para recorrer todos los idiomas de traducción configurados lo haría útil para organizaciones con tres o más idiomas de intranet.