Устранение неполадок локализации в 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.
В число распространенных проблем с библиотеками классов входят следующие:
- из-за отсутствия класса
ResourceLocationAttribute
в библиотеке классовResourceManagerStringLocalizerFactory
не сможет обнаруживать ресурсы; - именование файлов ресурсов. Дополнительные сведения см. в разделе Проблемы именования файлов ресурсов.
- Изменение корневого пространства имен библиотеки классов. Дополнительные сведения см. в разделе Проблемы с корневым пространством имен.
CustomRequestCultureProvider не работает должным образом
У класса RequestLocalizationOptions
есть три поставщика по умолчанию:
QueryStringRequestCultureProvider
CookieRequestCultureProvider
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 с полезными советами по решению проблем
ASP.NET Core
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по