Come Aggiornare le Risorse delle Stringhe di Localizzazione Senza Perdere le Modifiche Personalizzate in NopCommerce

Se gestisci il tuo negozio NopCommerce da anni, è probabile che tu abbia apportato molte personalizzazioni alle risorse delle stringhe locali.Per questo motivo, importare un nuovo pacchetto linguistico può sembrare rischioso — un clic e potresti sovrascrivere dozzine o addirittura centinaia di traduzioni che hai accuratamente modificato nel tempo.

La raccomandazione ufficiale di NopCommerce è di esportare le tue risorse locali attuali, confrontarle manualmente con il nuovo pacchetto linguistico utilizzando strumenti come WinMerge, e poi copiare le differenze una per una.
Questo approccio funziona, ma è lento e soggetto a errori, specialmente se il tuo negozio ha migliaia di voci.

Per rendere questo processo più facile e sicuro, ho creato un semplice script PowerShell che confronta due file XML e ti dice esattamente cosa è cambiato — senza la necessità di strumenti di confronto manuali.

Cosa Fa lo Script

Lo script confronta due file XML:

  • old.xml — le tue attuali risorse di stringhe locali

  • new.xml — il più recente pacchetto linguistico per la tua versione di NopCommerce

Abbina le voci in base al loro attributo Name e genera tre file di output chiari:

added.xml

Contiene risorse che esistono nel nuovo pacchetto linguistico ma mancano in quello attuale.

removed.xml

Contiene risorse che esistono nella tua installazione attuale ma non sono più presenti nel nuovo pacchetto linguistico.

changed.xml

Contiene risorse che esistono in entrambi i file ma hanno valori diversi (la tua traduzione personalizzata vs.quello aggiornato).

Questo ti offre una panoramica chiara di tutto ciò che è cambiato — senza modificare nulla nel tuo negozio.

Vuoi una Soluzione Ancora Più Semplice?Prova EasyTranslate

Se sei disposto a investire un piccolo budget per semplificare ulteriormente questo compito, dai un'occhiata al mio plugin EasyTranslate .
EasyTranslate plugin for multilingual NopCommerce stores

Con EasyTranslate, puoi:

  • Visualizzare le risorse locali mancanti e non tradotte direttamente nel pannello di amministrazione di NopCommerce

  • Tradurle istantaneamente utilizzando l'API di Google Translate

  • Esportarle come XML se preferisci la modifica manuale

  • Rilevare contenuti non tradotti in tutto il tuo negozio
    (catalogo, post del blog, notizie, argomenti — qualsiasi cosa traducibile)

  • Tradurre tutti questi contenuti con Google in pochi clic

Per i negozi con molte lingue, EasyTranslate fa risparmiare ore di lavoro manuale.

Come Utilizzare lo Script PowerShell (Windows)

Segui questi passaggi per confrontare in modo sicuro le tue traduzioni attuali con il pacchetto linguistico più recente.

1.Installazione di PowerShell

La maggior parte delle installazioni di Windows lo include già. In caso contrario, scaricalo da Microsoft.

2. Scarica lo Script

Scarica nop-lang-compare.ps1 e posizionalo nella tua cartella di lavoro.

3. Apri PowerShell nella tua cartella di lavoro

Hai due opzioni:

Opzione A: Utilizzando il comando cd

 
cd C:\Percorso\Verso\La\Tua\Cartella


Opzione B: Utilizzando Esplora File (più semplice)

Apri la tua cartella → clicca nella barra degli indirizzi → digita powershell → premi Invio.
PowerShell si aprirà direttamente in quella cartella.

4.

Esporta le Risorse Locali Correnti

In NopCommerce Admin:

Configurazione → Lingue → seleziona una lingua → Esporta Risorse

Sposta il file XML scaricato nella tua cartella di lavoro e rinominalo come:

old.xml


5.Scarica il Pacchetto Linguistico Più Recente

Vai alla pagina ufficiale delle traduzioni sul sito di NopCommerce e scarica il pacchetto più recente per la tua versione.

Posiziona il file nella tua cartella di lavoro e rinominalo come:

new.xml


6.

Verifica che Tutti i File Siano Presenti

In PowerShell, esegui:

dir

Dovresti vedere:

  • nop-lang-compare.ps1

  • old.xml

  • new.xml



7.Esegui lo Script

Esegui:

.\nop-lang-compare.ps1



Lo script creerà:

  • added.xml

  • removed.xml

  • changed.xml

nella stessa cartella.



Cosa Fare con i Risultati

✔ Importa added.xml

Sicuro da importare — aggiunge solo gli elementi mancanti.

✔ Rivedi changed.xml

Decidi quali valori vuoi mantenere:

  • Se la voce contiene la tua traduzione personalizzata → elimina quella voce da changed.xml

  • Se vuoi la nuova traduzione → lasciala così com'è

Salva il file e importalo.

Solo le voci che rimangono verranno aggiornate.

✔ Normalmente ignora removed.xml

Serve solo come riferimento.
Di solito non è necessario reimportare le voci rimosse nel tuo negozio.

nop-lang-compare.ps1

# Determina la directory di output (directory dove si trova questo script) $OutDir = $PSScriptRoot # Carica i file XML [xml]$old = Get-Content "old.xml" [xml]$new = Get-Content "new.xml" # Costruisce hashtable: Nome -> Valore Trimmed $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() } # Funzione helper per creare un documento XML con le risorse 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 } # --- Determina AGGIUNTE --- $added = @() foreach ($key in $newMap.Keys) { if (-not $oldMap.ContainsKey($key)) { $added += [pscustomobject]@{ Name = $key Value = $newMap[$key] } } } # --- Determina RIMOSSE --- $removed = @() foreach ($key in $oldMap.Keys) { if (-not $newMap.ContainsKey($key)) { $removed += [pscustomobject]@{ Name = $key Value = $oldMap[$key] } } } # --- Determina MODIFICATE --- $changed = @() foreach ($key in $oldMap.Keys) { if ($newMap.ContainsKey($key) -and $oldMap[$key] -ne $newMap[$key]) { $changed += [pscustomobject]@{ Name = $key Value = $newMap[$key] # memorizza il nuovo valore trimmed } } } # Salva i file XML di diff nella cartella dello 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 "Creati added.xml, removed.xml, changed.xml in $OutDir" -ForegroundColor Green

Leave your comment
*
Only registered users can leave comments.