Устранение неполадок локализации ASP.NET Core

Автор: Хишам Бин Атея (Hisham Bin Ateya)

В этой статье содержатся инструкции по диагностике проблем с локализацией приложений ASP.NET Core.

Проблемы с конфигурацией локализации

Порядок промежуточного слоя для локализации
Приложение может не локализоваться, так как программное обеспечение промежуточного уровня локализации неправильно упорядочено.

Убедитесь, что промежуточное ПО для локализации зарегистрировано перед промежуточным ПО MVC, чтобы устранить эту проблему. В противном случае посредническое программное обеспечение для локализации не применяется.

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc();
}

Путь к ресурсам локализации не найден

Поддерживаемые культуры в RequestCultureProvider не соответствуют зарегистрированным культурам

Проблемы с именованием файлов ресурсов

ASP.NET Core имеет предопределенные правила и рекомендации по именованию файлов ресурсов локализации, которые описаны в разделе "Глобализация и локализация" в ASP.NET Core.

Отсутствующие ресурсы

Распространенные причины, по которым ресурсы не найдены, включают:

  • Имена ресурсов имеют ошибки в файле ресурсов XML .NET (.resx) или в запросе на локализацию.
  • Ресурс отсутствует в файле ресурсов для некоторых языков, но существует в других.
  • Если у вас по-прежнему возникли проблемы, проверьте сообщения журнала локализации (зарегистрированные на Debug уровне журнала) для получения дополнительных сведений о отсутствующих ресурсах.

Подсказка

При использовании CookieRequestCultureProvider убедитесь, что одинарные кавычки не используются с культурами внутри значения локализации cookie. Например, c='en-UK'|uic='en-US' является недопустимым cookie значением, а c=en-UK|uic=en-US допустимо.

Проблемы с ресурсами и библиотеками классов

ASP.NET Core по умолчанию предоставляет способ, позволяющий библиотекам классов находить файлы ресурсов с помощью ResourceLocationAttribute.

Распространенные проблемы с библиотеками классов:

CustomRequestCultureProvider не работает должным образом

Класс RequestLocalizationOptions имеет три поставщика по умолчанию:

Элемент CustomRequestCultureProvider позволяет настроить способ обеспечения культурных настроек локализации. Используется CustomRequestCultureProvider, если поставщики по умолчанию не соответствуют вашим требованиям.

Распространенная причина неправильной работы пользовательского поставщика заключается в том, что он не является первым поставщиком в списке RequestCultureProviders . Для разрешения этой проблемы:

  • Вставьте настраиваемого поставщика на позицию ноль в списке RequestCultureProviders.

    options.AddInitialRequestCultureProvider(
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    
  • Вставьте настраиваемого поставщика на позицию ноль в списке RequestCultureProviders.

    options.RequestCultureProviders.Insert(0, 
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    
  • AddInitialRequestCultureProvider Примените метод расширения, чтобы установить настраиваемого поставщика в качестве исходного.

Проблемы с корневым пространством имен

Если корневое пространство имен сборки отличается от имени сборки, локализация не работает по умолчанию. Чтобы избежать этой проблемы, используйте RootNamespace атрибут, описанный в разделе "Глобализация и локализация" в ASP.NET Core.

Предупреждение

Проблема с корневым пространством имен может возникать, если имя проекта не является допустимым идентификатором .NET. Например, my-project-name.csproj использует корневое пространство имен my_project_name и имя сборки my-project-name, что приводит к этой ошибке.

Ресурсы и операция сборки

Если вы используете файлы ресурсов для локализации, важно, чтобы они имели соответствующее действие сборки. Используйте внедренный ресурс, иначе ResourceStringLocalizer не сможет найти эти ресурсы.

Переопределение расположения с помощью области "Датчики" в средствах разработчика

При использовании переопределения расположения с помощью области датчиков в средствах разработчика Google Chrome или Microsoft Edge резервный язык сбрасывается после предварительной отрисовки. Избегайте настройки языка с помощью области датчиков при тестировании. Задайте язык с помощью параметров языка браузера.

Дополнительные сведения см. в статье Blazor "Локализация" не работает с InteractiveServer (dotnet/aspnetcore #53707).

Проблемы с GitHub с полезными советами по решению проблем