Локализация ASP.Net: не находит файл локализации
Всем привет. Я работаю над проектом ASP.NET Core и мне нужно реализовать локализацию сообщений на бэке. Я хочу использовать два файла ресурсов (один для английского и один для русского), которые будут общими для всех классов в решении, а также использовать локализатор в моих контроллерах следующим образом: localizer["message"]
. Я настроил Startup.cs:
public void ConfigureServices(IServiceCollection services)
...
// Localization
services.AddControllers().AddDataAnnotationsLocalization();
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { "ru", "en" };
options.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures);
});
...
Также создал отдельный класс SharedResource соответственно в контроллере выглядит это так IStringLocalizer<SharedResource> localizer
. У меня есть два файла SharedResources.ru.resx и SharedResource.en.resx. которые находятся в папке Resources.
Примитивная структура:
Solution
│
├── Web
│ ├── Startup.cs
│ ├── Program.cs
│ ├── SharedResource.cs
│ │ Controllers
│ │ └── ...
│ ├── Resources
│ │ ├── SharedResource.en.resx
│ │ ├── SharedResource.ru.resx
│ └── ...
└── Other projects
И вся проблема в том, что когда я шлю запрос на api, мне возвращает не сообщение, а ключ, который указан в localizer["message"]
, то есть message. Как я понял, что такое возникает в случае когда не найден файл ресурсов.
И я не понимаю почему такое происходит. Заранее спасибо!
Обновлено: проблема кроется в namespace'ах. У SharedResource.cs он <App Name>.<Name Service>.Web
, а вот ресурсы ищет в Web.Resources.<App Name>.<Name Service>.Web.SharedResource
. Но незадача в том, что последний зависит от SharedResource.cs и как решить эту проблему я не понимаю.
Ответы (1 шт):
Вся проблема кроется не в том, что что-то не так настроено, а в том, что мое решение имеет кастомный namespace
(см. обновление вопроса).
Ввиду этого в классе SharedResource.cs
нужно было указать корневое пространство имен сборки [assembly: RootNamespace("Namespace")]
, после чего все заработало.