Если вы управляете своим магазином NopCommerce уже несколько лет, скорее всего, вы внесли множество пользовательских изменений в ресурсы локализованных строк. Из-за этого импорт нового языкового пакета может казаться рискованным — одним кликом вы можете перезаписать десятки или даже сотни переводов, которые тщательно настраивали со временем.
Официальная рекомендация от NopCommerce — экспортировать ваши текущие локализованные ресурсы, сравнить их вручную с новым языковым пакетом с помощью таких инструментов, как WinMerge, а затем скопировать различия по одному.
Этот подход работает, но он медленный и подвержен ошибкам, особенно если в вашем магазине тысячи записей.
Чтобы сделать этот процесс проще и безопаснее, я создал простой скрипт PowerShell, который сравнивает два XML-файла и показывает вам точно, что изменилось — без необходимости в ручных инструментах сравнения.
Что делает скрипт
Скрипт сравнивает два XML-файла:
-
old.xml — ваши текущие строковые ресурсы локали
-
new.xml — новейший языковой пакет для вашей версии NopCommerce
Он сопоставляет записи по их атрибуту Name и генерирует три понятных выходных файла:
added.xml
Содержит ресурсы, которые есть в новом языковом пакете, но отсутствуют в вашем текущем.
removed.xml
Содержит ресурсы, которые есть в вашей текущей установке, но больше не присутствуют в новом языковом пакете.
changed.xml
Содержит ресурсы, которые есть в обоих файлах, но имеют разные значения (ваш пользовательский перевод vs.обновленную).
Это дает вам четкий обзор всех изменений — без внесения каких-либо изменений в ваш магазин.
Хотите еще более простое решение? Попробуйте EasyTranslate
Если вы готовы потратить небольшой бюджет, чтобы ещё больше упростить эту задачу, взгляните на мой плагин EasyTranslate .
С EasyTranslate вы можете:
-
Видеть отсутствующие и непереведённые локализованные ресурсы прямо в панели администратора NopCommerce
-
Мгновенно переводить их с помощью Google Translation API
-
Экспортировать их в XML, если предпочитаете ручное редактирование
-
Обнаруживать непереведённый контент по всему вашему магазину
(каталог, записи блога, новости, темы — всё, что можно перевести) -
Перевести весь этот контент с помощью Google всего за несколько кликов
Для магазинов со многими языками EasyTranslate экономит часы ручной работы.
Как использовать скрипт PowerShell (Windows)
Следуйте этим шагам, чтобы безопасно сравнить ваши текущие переводы с новейшим языковым пакетом.
1.Установите PowerShell
В большинстве установок Windows он уже есть. Если нет, скачайте его с сайта Microsoft.
2. Скачайте скрипт
Скачать nop-lang-compare.ps1 и поместите его в вашу рабочую папку.

3. Откройте PowerShell в вашей рабочей папке
У вас есть два варианта:
Вариант A: Использование команды cd
Вариант Б: Использование Проводника (проще)
Откройте вашу папку → кликните в адресной строке → введите powershell → нажмите Enter.
PowerShell откроется прямо в этой папке.
4. Экспорт текущих ресурсов локализации
В панели администратора NopCommerce:
Конфигурация → Языки → выберите язык → Экспорт ресурсов
Переместите загруженный XML-файл в вашу рабочую папку и переименуйте его в:
5. Загрузите Новейший Языковой Пакет
Перейдите на официальную страницу переводов на сайте NopCommerce и загрузите новейший пакет для вашей версии.
Поместите файл в вашу рабочую папку и переименуйте его в:
6. Подтвердите наличие всех файлов
В PowerShell выполните:
Вы должны увидеть:
-
nop-lang-compare.ps1
-
old.xml
-
new.xml

7.Запустите скрипт
Выполните:

Скрипт создаст:
-
added.xml
-
removed.xml
-
changed.xml
в той же папке.
Что делать с результатами
✔ Импортировать added.xml
Безопасно для импорта — добавляет только отсутствующие элементы.
✔ Проверить changed.xml
Решите, какие значения вы хотите сохранить:
-
Если запись содержит ваш собственный перевод → удалите эту запись из changed.xml
-
Если вы хотите использовать новый перевод → оставьте как есть
Сохраните файл и импортируйте его.
Обновятся только оставшиеся записи.
✔ Обычно игнорируйте removed.xml
Он только для справки.
Обычно вам не нужно импортировать удалённые записи обратно в ваш магазин.
nop-lang-compare.ps1
# Определить выходной каталог (каталог, в котором находится этот скрипт)
$OutDir = $PSScriptRoot
# Загрузить XML-файлы
[xml]$old = Get-Content "old.xml"
[xml]$new = Get-Content "new.xml"
# Построить хеш-таблицу: Имя -> Обрезанное Значение
$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()
}
# Вспомогательная функция для создания XML-документа с ресурсами
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
}
# --- Определить ДОБАВЛЕННЫЕ ---
$added = @()
foreach ($key in $newMap.Keys) {
if (-not $oldMap.ContainsKey($key)) {
$added += [pscustomobject]@{
Name = $key
Value = $newMap[$key]
}
}
}
# --- Определить УДАЛЁННЫЕ ---
$removed = @()
foreach ($key in $oldMap.Keys) {
if (-not $newMap.ContainsKey($key)) {
$removed += [pscustomobject]@{
Name = $key
Value = $oldMap[$key]
}
}
}
# --- Определить ИЗМЕНЁННЫЕ ---
$changed = @()
foreach ($key in $oldMap.Keys) {
if ($newMap.ContainsKey($key) -and $oldMap[$key] -ne $newMap[$key]) {
$changed += [pscustomobject]@{
Name = $key
Value = $newMap[$key] # сохранить НОВОЕ обрезанное значение
}
}
}
# Сохранить XML-файлы сравнения в папку скрипта
(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 "Созданы файлы added.xml, removed.xml, changed.xml в $OutDir" -ForegroundColor Green
