Устранение неполадок локализации 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 есть три поставщика по умолчанию:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
Позволяет 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 с полезными советами по решению проблем
ASP.NET Core