我创建了一个空项目。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(s => s.ResourcesPath = "Resources");
var supportedCultures = new CultureInfo[]
{
new CultureInfo("de-CH"),
new CultureInfo("en-GB"),
};
services.Configure<RequestLocalizationOptions>(s =>
{
s.SupportedCultures = supportedCultures;
s.SupportedUICultures = supportedCultures;
s.DefaultRequestCulture = new RequestCulture(culture: "de-CH", uiCulture: "de-CH");
});
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticFiles();
// Using localization
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseMvc();
}
文件夹结构
Resources
|
|--Controllers
| HomeController.de.resx
| HomeController.en.resx
| HomeController.resx
控制器
public class HomeController : Controller
{
private readonly IStringLocalizer<HomeController> _stringLocalizer;
public HomeController(IStringLocalizer<HomeController> stringLocalizer)
{
_stringLocalizer = stringLocalizer;
}
public IActionResult Index()
{
string testValue = _stringLocalizer["Test"];
return View();
}
}
我是关于asp.net核心的新手,我只是想了解,为什么testValue总是返回Test,它有点令人困惑。我做错了什么?如果你帮助我,我会很高兴。
答案 0 :(得分:8)
只需添加包 Microsoft.Extensions.Localization
即可
这样做之后就行了
ResourcePath是可选的,如果保留为null,则资源文件组织样式与经典Asp.Net应用程序相同(在目标类的相同位置)。
答案 1 :(得分:2)
此处有两个不同的错误会阻止正确加载本地化资源。
您在ResourcesPath
电话中设置了错误的AddLocalization()
。由于您的resx文件放在Resources/Controllers
目录中,您应该替换call
services.AddLocalization(s => s.ResourcesPath = "Resources");
与
services.AddLocalization(s => s.ResourcesPath = "Resources/Controllers");
您对resx文件使用了错误的名称。查看Resource file naming文章中的Globalization and localization in ASP.NET Core部分:
资源以其类的完整类型名称减去 装配名称。例如,项目中的法语资源主要是 该课程的汇编为
LocalizationWebsite.Web.dll
LocalizationWebsite.Web.Startup
将命名为 Startup.fr.resx 。一个 班级资源LocalizationWebsite.Web.Controllers.HomeController
将被命名 Controllers.HomeController.fr.resx 。如果你的目标类的命名空间 与程序集名称相同,您需要完整的类型名称。 例如,在示例项目中为该类型的资源ExtraNamespace.Tools
将命名为 ExtraNamespace.Tools.fr.resx 。
因此,如果您的程序集被调用TestMvcApplication
且HomeController
驻留在名称空间TestMvcApplication.Controllers
中,那么您应该按以下方式调用resx文件:
Resources
|
|--Controllers
| Controllers.HomeController.de.resx
| Controllers.HomeController.en.resx
| Controllers.HomeController.resx
我相信在您对项目进行上述更改后,本地化将正常运行。