Как обновить ресурсы строк локализации без потери пользовательских изменений в NopCommerce

Если вы управляете своим магазином NopCommerce уже несколько лет, скорее всего, вы внесли множество пользовательских изменений в ресурсы локализованных строк. Из-за этого импорт нового языкового пакета может казаться рискованным — одним кликом вы можете перезаписать десятки или даже сотни переводов, которые тщательно настраивали со временем.

Официальная рекомендация от NopCommerce — экспортировать ваши текущие локализованные ресурсы, сравнить их вручную с новым языковым пакетом с помощью таких инструментов, как WinMerge, а затем скопировать различия по одному.
Этот подход работает, но он медленный и подвержен ошибкам, особенно если в вашем магазине тысячи записей.

Чтобы сделать этот процесс проще и безопаснее, я создал простой скрипт PowerShell, который сравнивает два XML-файла и показывает вам точно, что изменилось — без необходимости в ручных инструментах сравнения.

Что делает скрипт

Скрипт сравнивает два XML-файла:

  • old.xml — ваши текущие строковые ресурсы локали

  • new.xml — новейший языковой пакет для вашей версии NopCommerce

Он сопоставляет записи по их атрибуту Name и генерирует три понятных выходных файла:

added.xml

Содержит ресурсы, которые есть в новом языковом пакете, но отсутствуют в вашем текущем.

removed.xml

Содержит ресурсы, которые есть в вашей текущей установке, но больше не присутствуют в новом языковом пакете.

changed.xml

Содержит ресурсы, которые есть в обоих файлах, но имеют разные значения (ваш пользовательский перевод vs.обновленную).

Это дает вам четкий обзор всех изменений — без внесения каких-либо изменений в ваш магазин.

Хотите еще более простое решение? Попробуйте EasyTranslate

Если вы готовы потратить небольшой бюджет, чтобы ещё больше упростить эту задачу, взгляните на мой плагин EasyTranslate .
EasyTranslate plugin for multilingual NopCommerce stores

С EasyTranslate вы можете:

  • Видеть отсутствующие и непереведённые локализованные ресурсы прямо в панели администратора NopCommerce

  • Мгновенно переводить их с помощью Google Translation API

  • Экспортировать их в XML, если предпочитаете ручное редактирование

  • Обнаруживать непереведённый контент по всему вашему магазину
    (каталог, записи блога, новости, темы — всё, что можно перевести)

  • Перевести весь этот контент с помощью Google всего за несколько кликов

Для магазинов со многими языками EasyTranslate экономит часы ручной работы.

Как использовать скрипт PowerShell (Windows)

Следуйте этим шагам, чтобы безопасно сравнить ваши текущие переводы с новейшим языковым пакетом.

1.Установите PowerShell

В большинстве установок Windows он уже есть. Если нет, скачайте его с сайта Microsoft.

2. Скачайте скрипт

Скачать nop-lang-compare.ps1 и поместите его в вашу рабочую папку.

3. Откройте PowerShell в вашей рабочей папке

У вас есть два варианта:

Вариант A: Использование команды cd

 
cd C:\Path\To\Your\Dir


Вариант Б: Использование Проводника (проще)

Откройте вашу папку → кликните в адресной строке → введите powershell → нажмите Enter.
PowerShell откроется прямо в этой папке.

4. Экспорт текущих ресурсов локализации

В панели администратора NopCommerce:

Конфигурация → Языки → выберите язык → Экспорт ресурсов

Переместите загруженный XML-файл в вашу рабочую папку и переименуйте его в:

old.xml


5. Загрузите Новейший Языковой Пакет

Перейдите на официальную страницу переводов на сайте NopCommerce и загрузите новейший пакет для вашей версии.

Поместите файл в вашу рабочую папку и переименуйте его в:

new.xml


6. Подтвердите наличие всех файлов

В PowerShell выполните:

dir

Вы должны увидеть:

  • nop-lang-compare.ps1

  • old.xml

  • new.xml



7.Запустите скрипт

Выполните:

.\nop-lang-compare.ps1



Скрипт создаст:

  • 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

Leave your comment
*
Only registered users can leave comments.