Jeśli prowadzisz swój sklep NopCommerce od lat, prawdopodobnie wprowadziłeś wiele własnych modyfikacji w zasobach ciągów lokalizacyjnych.Z tego powodu importowanie nowego pakietu językowego może wydawać się ryzykowne — jedno kliknięcie i możesz nadpisać dziesiątki, a nawet setki tłumaczeń, które starannie dostosowywałeś przez lata.
Oficjalna rekomendacja NopCommerce to wyeksportowanie obecnych zasobów językowych, ręczne porównanie ich z nowym pakietem językowym za pomocą narzędzi takich jak WinMerge, a następnie skopiowanie różnic pojedynczo.
To podejście działa, ale jest powolne i podatne na błędy, szczególnie jeśli twój sklep ma tysiące wpisów.
Aby uczynić ten proces łatwiejszym i bezpieczniejszym, stworzyłem prosty skrypt PowerShell, który porównuje dwa pliki XML i mówi ci dokładnie, co się zmieniło — bez potrzeby używania ręcznych narzędzi do porównywania.
Co robi skrypt
Skrypt porównuje dwa pliki XML:
-
old.xml — twoje obecne zasoby ciągów językowych
-
new.xml — najnowszy pakiet językowy dla twojej wersji NopCommerce
Dopasowuje wpisy według ich atrybutu Name i generuje trzy przejrzyste pliki wyjściowe:
added.xml
Zawiera zasoby, które istnieją w nowym pakiecie językowym, ale brakuje ich w twoim obecnym.
removed.xml
Zawiera zasoby, które istnieją w twojej obecnej instalacji, ale nie są już obecne w nowym pakiecie językowym.
changed.xml
Zawiera zasoby, które istnieją w obu plikach, ale mają różne wartości (twoje własne tłumaczenie vs.zaktualizowaną).
Daje to przejrzysty przegląd wszystkich zmian — bez modyfikowania czegokolwiek w Twoim sklepie.
Chcesz jeszcze prostszego rozwiązania?Wypróbuj EasyTranslate
Jeśli jesteś otwarty na wydanie niewielkiego budżetu, aby jeszcze bardziej uprościć to zadanie, zapoznaj się z moją wtyczką EasyTranslate .
Dzięki EasyTranslate możesz:
-
Zobaczyć brakujące i nieprzetłumaczone zasoby językowe bezpośrednio w panelu administracyjnym NopCommerce
-
Przetłumaczyć je natychmiast za pomocą API Tłumacza Google
-
Eksportować je jako XML, jeśli wolisz ręczną edycję
-
Wykrywać nieprzetłumaczoną treść w całym sklepie
(katalog, wpisy na blogu, aktualności, tematy — wszystko, co można przetłumaczyć) -
Przetłumaczyć całą tę treść za pomocą Google w zaledwie kilku kliknięciach
Dla sklepów z wieloma językami EasyTranslate oszczędza godziny ręcznej pracy.
Jak używać skryptu PowerShell (Windows)
Wykonaj te kroki, aby bezpiecznie porównać swoje obecne tłumaczenia z najnowszym pakietem językowym.
1.Zainstaluj PowerShell
Większość instalacji Windows już go posiada.
Jeśli nie, pobierz go od Microsoft.
2. Pobierz skrypt
Pobierz nop-lang-compare.ps1 i umieść go w swoim folderze roboczym.

3. Otwórz PowerShell w swoim folderze roboczym
Masz dwie opcje:
Opcja A: Użycie polecenia cd
Opcja B: Korzystanie z Eksploratora plików (łatwiejsze)
Otwórz swój folder → kliknij w pasek adresu → wpisz powershell → naciśnij Enter.
PowerShell otworzy się bezpośrednio w tym folderze.
4.Eksportuj bieżące zasoby językowe
W panelu administracyjnym NopCommerce:
Konfiguracja → Języki → wybierz język → Eksportuj zasoby
Przenieś pobrany plik XML do folderu roboczego i zmień jego nazwę na:
5.Pobierz najnowszy pakiet językowy
Przejdź na oficjalną stronę tłumaczeń na stronie NopCommerce i pobierz najnowszy pakiet dla swojej wersji.
Umieść plik w swoim folderze roboczym i zmień jego nazwę na:
6.Potwierdź, że wszystkie pliki są obecne
W PowerShell, uruchom:
Powinieneś zobaczyć:
-
nop-lang-compare.ps1
-
old.xml
-
new.xml

7.Uruchom Skrypt
Wykonaj:

Skrypt utworzy:
-
added.xml
-
removed.xml
-
changed.xml
w tym samym folderze.
Co zrobić z wynikami
✔ Zaimportuj added.xml
Bezpieczne do zaimportowania — dodaje tylko brakujące elementy.
✔ Przejrzyj changed.xml
Zdecyduj, które wartości chcesz zachować:
-
Jeśli wpis zawiera twoje własne tłumaczenie → usuń ten wpis z changed.xml
-
Jeśli chcesz nowe tłumaczenie → zostaw bez zmian
Zapisz plik i zaimportuj go.
Zostaną zaktualizowane tylko wpisy, które pozostają.
✔ Zwykle ignoruj removed.xml
Służy tylko do celów referencyjnych.
Zazwyczaj nie musisz importować usuniętych wpisów z powrotem do swojego sklepu.
nop-lang-compare.ps1
# Określenie katalogu wyjściowego (katalog, w którym znajduje się ten skrypt)
$OutDir = $PSScriptRoot
# Załaduj pliki XML
[xml]$old = Get-Content "old.xml"
[xml]$new = Get-Content "new.xml"
# Zbuduj tablicę skrótów: Nazwa -> Przycięta Wartość
$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()
}
# Funkcja pomocnicza do tworzenia dokumentu XML z zasobami
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
}
# --- Określ DODANE ---
$added = @()
foreach ($key in $newMap.Keys) {
if (-not $oldMap.ContainsKey($key)) {
$added += [pscustomobject]@{
Name = $key
Value = $newMap[$key]
}
}
}
# --- Określ USUNIĘTE ---
$removed = @()
foreach ($key in $oldMap.Keys) {
if (-not $newMap.ContainsKey($key)) {
$removed += [pscustomobject]@{
Name = $key
Value = $oldMap[$key]
}
}
}
# --- Określ ZMIENIONE ---
$changed = @()
foreach ($key in $oldMap.Keys) {
if ($newMap.ContainsKey($key) -and $oldMap[$key] -ne $newMap[$key]) {
$changed += [pscustomobject]@{
Name = $key
Value = $newMap[$key] # zapisz NOWĄ przyciętą wartość
}
}
}
# Zapisz pliki różnicowe XML w folderze skryptu
(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 "Utworzono added.xml, removed.xml, changed.xml w $OutDir" -ForegroundColor Green
