Устранение неполадок локализации 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.

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

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

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

Совет

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

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

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

В число распространенных проблем с библиотеками классов входят следующие:

  • Отсутствие ResourceLocationAttribute в библиотеке классов не позволяет ResourceManagerStringLocalizerFactory обнаруживать ресурсы.
  • именование файлов ресурсов. Дополнительные сведения см. в разделе "Проблемы именования файлов ресурсов".
  • Изменение корневого пространства имен библиотеки классов. Дополнительные сведения см. в разделе "Проблемы с корневым пространством имен".

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 с полезными советами по решению проблем