Ответ 1
У меня была аналогичная проблема. Чем я понял, что " Localization.AspNetCore.TagHelpers" nuget packag отсутствовал в моем проекте. Похоже, это необходимый пакет для QueryStringRequestCultureProvider.
Пытаясь локализовать свое приложение, я выполнил следующие действия: https://docs.asp.net/en/latest/fundamentals/localization.html
Вот мой код:
Startup.cs
public List<IRequestCultureProvider> RequestCultureProviders { get; private set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(options => options.ResourcesPath = "Resources")
.AddDataAnnotationsLocalization();
services.AddOptions();
services.AddTransient<IViewRenderingService, ViewRenderingService>();
services.AddTransient<IEmailSender, EmailSender>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseStaticFiles();
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory())),
EnableDirectoryBrowsing = true
});
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("fr"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures,
RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider
{
QueryStringKey = "culture",
UIQueryStringKey = "ui-culture"
}
}
});
}
MyController.cs
public class MyController : Controller
{
private readonly IViewRenderingService _viewRenderingService;
private IStringLocalizer<MyController> _localizer;
private MyOptions _options;
//Constructor for dependency injection principle
public MyController(IViewRenderingService viewRenderingService, IStringLocalizer<MyController> localizer, IOptions<MyOptions> options)
{
_viewRenderingService = viewRenderingService;
_localizer = localizer;
_options = options.Value;
}
[HttpGet]
public string Get()
{
// _localizer["Name"]
return _localizer["Product"];
}
}
Файл *.resx
хранится в папке " Resources
" с именем Controllers.MyController.fr.resx
(в нем есть запись для "Product").
Тем не менее, он не может найти файл ресурсов, и "Продукт" никогда не возвращается на французском языке. Я использую строку запроса, поэтому вот строка запроса:
localhost:3333/my?culture=fr
Также в представлении @Localizer["Product"]
возвращает "Product".
Может кто-нибудь, пожалуйста, помогите мне найти то, что пропало?
РЕДАКТИРОВАТЬ:
После некоторого исследования я обнаружил, что культура меняется, но он не может найти файл ресурсов. Я использую VS2015. кто-нибудь может помочь?
У меня была аналогичная проблема. Чем я понял, что " Localization.AspNetCore.TagHelpers" nuget packag отсутствовал в моем проекте. Похоже, это необходимый пакет для QueryStringRequestCultureProvider.
Вам нужно добавить эти ссылки из nuget
:
Microsoft.Extensions.Localization
а также Localization.AspNetCore.TagHelpers
может быть хорошим помощником по тегам вместо того, чтобы каждый раз вводить материалы локализации в представления
Для меня было проблемой, что имя папки проекта отличалось от корневого пространства имен! Core 3.0.
По умолчанию Visual Studio IDE разрешает ссылки на сборки, но для этого требуются NuGets Microsoft.Extensions.Localization и Microsoft.Extensions.Localization.Abstractions. После того, как я добавил их в ссылку на проект, локатор ресурсов может найти файлы ресурсов!
У меня была такая же проблема в .net core 2.2. Я вижу в отладчике свойства SearchedLocation
Итак, я сначала создал файлы Controllers.HomesController.rsx без расширения языка с модификатором доступа "Public" для доступа к свойству
и с помощью localizer ["Property] я нашел значение goood.
После того как я создал Controllers.HomeController.fr.resx, и он нашел хорошее значение с культурой в URL.
У меня была та же проблема, и я исправил ее, удалив встроенных поставщиков, чтобы можно было использовать культуру запросов по умолчанию. Для этого вам нужно добавить этот код в ваши службы. Настройте в классе запуска:
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
Пожалуйста, посмотрите на этот другой ответ: Язык ASP.NET Core по умолчанию всегда английский
Если корневое пространство имен сборки отличается от имени сборки:
Локализация не работает по умолчанию. Сбой локализации из-за способа поиска ресурсов в сборке. RootNamespace - это значение времени сборки, которое недоступно для выполняющегося процесса.
Если RootNamespace отличается от AssemblyName, включите в AssemblyInfo.cs следующее (значения параметров заменены фактическими значениями):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
Я использую VS 2017 с таргетингом на .NET Core 2.1, и в моем случае файл проекта (.csproj) содержал несколько странных тегов ItemGroup, например:
<ItemGroup>
<EmbeddedResource Remove="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
<ItemGroup>
<None Include="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
Когда я удалил строки, он начал работать.
Ранее я экспериментировал с добавлением и удалением файлов ресурсов, что могло вызвать появление групп элементов, но странно, что Visual Studio вообще вставила эти строки. Похоже, ошибка.