Si has estado gestionando tu tienda NopCommerce durante años, es probable que hayas realizado muchos ajustes personalizados en tus recursos de cadenas de texto locales.
Por eso, importar un nuevo paquete de idioma puede sentirse arriesgado — un clic y podrías sobrescribir docenas o incluso cientos de traducciones que ajustaste cuidadosamente con el tiempo.La recomendación oficial de NopCommerce es exportar tus recursos de localización actuales, compararlos manualmente con el nuevo paquete de idioma usando herramientas como WinMerge, y luego copiar las diferencias una por una.
Este enfoque funciona, pero es lento y propenso a errores, especialmente si tu tienda tiene miles de entradas.
Para hacer este proceso más fácil y seguro, creé un sencillo script de PowerShell que compara dos archivos XML y te dice exactamente qué cambió — sin necesidad de herramientas de comparación manual.
Qué Hace el Script
El script compara dos archivos XML:
-
old.xml — tus recursos de cadenas de localización actuales
-
new.xml — el paquete de idioma más reciente para tu versión de NopCommerce
Empareja las entradas por su atributo Name y genera tres archivos de salida claros:
added.xml
Contiene recursos que existen en el nuevo paquete de idioma pero faltan en tu actual.
removed.xml
Contiene recursos que existen en tu instalación actual pero ya no están presentes en el nuevo paquete de idioma.
changed.xml
Contiene recursos que existen en ambos archivos pero tienen valores diferentes (tu traducción personalizada vs.la actualizada).
Esto te da una visión clara de todo lo que ha cambiado — sin modificar nada en tu tienda.
¿Quieres una solución aún más fácil?Prueba EasyTranslate
Si estás dispuesto a invertir un pequeño presupuesto para simplificar aún más esta tarea, echa un vistazo a mi plugin EasyTranslate .
Con EasyTranslate, puedes:
-
Ver los recursos locales faltantes y no traducidos directamente en el panel de administración de NopCommerce
-
Traducirlos al instante utilizando la API de Google Translate
-
Exportarlos como XML si prefieres la edición manual
-
Detectar contenido no traducido en toda tu tienda
(catálogo, entradas del blog, noticias, temas — cualquier cosa traducible) -
Traducir todo este contenido con Google en solo unos clics
Para tiendas con muchos idiomas, EasyTranslate ahorra horas de trabajo manual.
Cómo Usar el Script de PowerShell (Windows)
Sigue estos pasos para comparar de forma segura tus traducciones actuales con el paquete de idioma más reciente.
1.Instalar PowerShell
La mayoría de las instalaciones de Windows ya lo tienen.
Si no, descárgalo desde Microsoft.
2. Descargar el Script
Descargar nop-lang-compare.ps1 y colócalo en tu carpeta de trabajo.

3.Abrir PowerShell en tu Carpeta de Trabajo
Tienes dos opciones:
Opción A: Usando el comando cd
Opción B: Usando el Explorador de archivos (más fácil)
Abre tu carpeta → haz clic en la barra de direcciones → escribe powershell → presiona Enter.
PowerShell se abrirá directamente en esa carpeta.
4.Exportar los Recursos de la Configuración Regional Actual
En el Administrador de NopCommerce:
Configuración → Idiomas → selecciona un idioma → Exportar Recursos
Mueve el archivo XML descargado a tu carpeta de trabajo y renómbralo a:
5.Descarga el Paquete de Idioma Más Reciente
Ve a la página oficial de traducciones en el sitio web de NopCommerce y descarga el paquete más nuevo para tu versión.
Coloca el archivo en tu carpeta de trabajo y cámbiale el nombre a:
6.Confirmar que todos los archivos están presentes
En PowerShell, ejecuta:
Deberías ver:
-
nop-lang-compare.ps1
-
old.xml
-
new.xml

7.Ejecutar el Script
Ejecutar:

El script creará:
-
added.xml
-
removed.xml
-
changed.xml
en la misma carpeta.
Qué Hacer Con Los Resultados
✔ Importar added.xml
Es seguro importarlo — solo añade elementos faltantes.
✔ Revisar changed.xml
Decide qué valores quieres conservar:
-
Si la entrada contiene tu traducción personalizada → elimina esa entrada de changed.xml
-
Si quieres la nueva traducción → déjala tal cual
Guarda el archivo e impórtalo.Solo se actualizarán las entradas que permanezcan.
✔ Normalmente ignora removed.xml
Solo es de referencia.
Normalmente no necesitas importar las entradas eliminadas de vuelta a tu tienda.
nop-lang-compare.ps1
# Determinar el directorio de salida (directorio donde se encuentra este script)
$OutDir = $PSScriptRoot
# Cargar archivos XML
[xml]$old = Get-Content "old.xml"
[xml]$new = Get-Content "new.xml"
# Construir tabla hash: Nombre -> Valor Recortado
$oldMap = @{}
$newMap = @{}
foreach ($n in $old.Language.LocaleResource) {
$oldMap[$n.Name] = $n.Value.Trim()
}
foreach ($n in $new.Language.LocaleResource) {
$newMap[$n.Name] = $n.Value.Trim()
}
# Función auxiliar para crear un documento XML con recursos
function New-LangXml {
param ($resources)
$xml = New-Object System.Xml.XmlDocument
$decl = $xml.CreateXmlDeclaration("1.0", "utf-8", $null)
$xml.AppendChild($decl) | Out-Null
$root = $xml.CreateElement("Language")
$root.SetAttribute("Name", "Diff")
$root.SetAttribute("SupportedVersion", "1.0")
$xml.AppendChild($root) | Out-Null
foreach ($r in $resources) {
$node = $xml.CreateElement("LocaleResource")
$node.SetAttribute("Name", $r.Name)
$valueNode = $xml.CreateElement("Value")
$valueNode.InnerText = $r.Value
$node.AppendChild($valueNode) | Out-Null
$root.AppendChild($node) | Out-Null
}
return $xml
}
# --- Determinar AÑADIDAS ---
$added = @()
foreach ($key in $newMap.Keys) {
if (-not $oldMap.ContainsKey($key)) {
$added += [pscustomobject]@{
Name = $key
Value = $newMap[$key]
}
}
}
# --- Determinar ELIMINADAS ---
$removed = @()
foreach ($key in $oldMap.Keys) {
if (-not $newMap.ContainsKey($key)) {
$removed += [pscustomobject]@{
Name = $key
Value = $oldMap[$key]
}
}
}
# --- Determinar MODIFICADAS ---
$changed = @()
foreach ($key in $oldMap.Keys) {
if ($newMap.ContainsKey($key) -and $oldMap[$key] -ne $newMap[$key]) {
$changed += [pscustomobject]@{
Name = $key
Value = $newMap[$key] # almacenar el valor NUEVO recortado
}
}
}
# Guardar archivos XML de diferencias en la carpeta del script
(New-LangXml $added).Save( (Join-Path $OutDir "added.xml") )
(New-LangXml $removed).Save( (Join-Path $OutDir "removed.xml") )
(New-LangXml $changed).Save( (Join-Path $OutDir "changed.xml") )
Write-Host "Creados added.xml, removed.xml, changed.xml en $OutDir" -ForegroundColor Green
