Устранение неполадок локализации в 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 существуют предопределенные правила и рекомендации для именования файлов ресурсов локализации, которые подробно описаны здесь.

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

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

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

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

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

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

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

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

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

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

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

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

  • Вставьте настраиваемый поставщик в позицию 0 в списке RequestCultureProviders, как показано ниже.

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

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

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

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

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

Ресурсы и действие при сборке

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

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