在尝试本地化我的应用程序时,我已按照此处的步骤操作: 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
(其中包含&#34条;产品&#34;)。
然而,它无法找到资源文件,并且&#34;产品&#34;永远不会用法语返回。我正在使用查询字符串,所以这里是查询字符串:
localhost:3333/my?culture=fr
同样在视图中,@Localizer["Product"]
返回&#34;产品&#34;。
任何人都可以帮我找到丢失的东西吗?
修改
经过一番调查后,我发现文化正在发生变化,但无法找到资源文件。我正在使用VS2015。有人可以帮忙吗?
答案 0 :(得分:27)
我有类似的问题。比我想通了 我的项目中缺少“ Localization.AspNetCore.TagHelpers ”nuget packag。 它看起来像是QueryStringRequestCultureProvider的必需包。
答案 1 :(得分:3)
答案 2 :(得分:1)
您需要从nuget
添加以下引用:
Microsoft.Extensions.Localization
还有Localization.AspNetCore.TagHelpers
可能是一个很好的标签帮助者,而不是每次都将本地化内容注入视图中
答案 3 :(得分:1)
在我的情况下,问题是我在指定:
services.AddLocalization(options => options.ResourcesPath = "Resources");
和:
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(DataAnnotations));
我的DataAnnotations.resx资源文件也位于“资源”命名空间下。这导致本地化程序在“ MyApp.Resources.Resources.DataAnnotations”中搜索字符串,而不是在“ MyApp.Resources.DataAnnotations”中搜索字符串。
将第一行更改为:
services.AddLocalization();
帮助解决了这个问题。
答案 4 :(得分:0)
默认情况下,Visual Studio IDE解析程序集引用,但需要Microsoft.Extensions.Localization和Microsoft.Extensions.Localization.Abstractions NuGets。将它们添加到项目参考中后,资源定位器便可以找到资源文件!
答案 5 :(得分:0)
对我来说,项目文件夹的名称与根名称空间不同是一个问题!核心3.0。
答案 6 :(得分:0)
.net core 2.2中存在相同的问题 我在调试器中看到属性SearchedLocation
因此,我首先创建了不带语言扩展名的Controllers.HomesController.rsx文件,并使用了访问修饰符“ Public”来访问该属性
并使用localizer [“ Property],我发现了很好的值。
创建了Controllers.HomeController.fr.resx之后,他发现URL中的文化具有很好的价值。
答案 7 :(得分:0)
我遇到了同样的问题,并通过删除内置提供程序来解决此问题,以便能够使用默认的请求区域性。 为此,您需要将此代码添加到服务中。在启动类中进行配置:
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
答案 8 :(得分:0)
如果程序集的根名称空间与程序集名称不同:
默认情况下,本地化无效。 由于在程序集中搜索资源的方式,本地化失败。 RootNamespace是一个构建时值,不适用于执行过程。
如果RootNamespace与AssemblyName不同,请在AssemblyInfo.cs中添加以下内容(用实际值替换参数值):
subject_id time_1 val
0 1 2173-04-03 12:35:00 5
1 1 2173-04-04 11:30:00 5
2 1 2173-04-05 16:00:00 5
5 1 2173-04-06 04:00:00 3
答案 9 :(得分:0)
我正在使用针对.NET Core 2.1的VS 2017,在我的情况下,项目文件(.csproj)包含一些奇怪的ItemGroup标记,如下所示:
<ItemGroup>
<EmbeddedResource Remove="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
<ItemGroup>
<None Include="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
删除行后,它开始工作。
我之前已经在尝试添加和删除资源文件,以便可能导致项目组的出现,但是奇怪的是Visual Studio完全插入了这些行。好像是个错误。
答案 10 :(得分:0)
您只需使用以下命令在项目中添加“ Localization.AspNetCore.TagHelpers” NuGet程序包
Install-Package Localization.AspNetCore.TagHelpers -Version 0.6.0
我希望它能解决您的问题
答案 11 :(得分:0)
就我而言,我实际上缺少ResourcesPath
的显式设置:
services.AddLocalization(options => options.ResourcesPath = "Resources");
答案 12 :(得分:0)
答案 13 :(得分:-1)
我对这个问题的解决方案是重命名生成的资源代码命名空间,例如:
来自
命名空间 ProjectName.Resources 到 命名空间项目名称
它对我有用。