ASP.NET 核心 3.0 中的本地化
Localization in ASP.NET Core 3.0
我正在尝试使用 .resx 文件使我的项目本地化。
对我来说它不起作用,对我的同事来说,他也在做这个项目。
关于代码的一些细节:
Startup.cs 文件
public void ConfigureServices(IServiceCollection services)
{
.
.
.
// Localization
services.AddLocalization(options => options.ResourcesPath = "Lang/");
services.AddMvc(option => option.EnableEndpointRouting = false)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("cs"),
//new CultureInfo("en")
};
options.DefaultRequestCulture = new RequestCulture(culture: "cs", uiCulture: "cs");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
services.AddTransient<Messages>();
// Localization end
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
// Localization
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
// Localization end
.
.
.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
我的控制器:
public class AccountController : BasicController
{
private readonly UserManager<User> userManager;
private readonly IPasswordHasher<User> passwordHasher;
private IStringLocalizer<Default> _localizer;
public AccountController(UserManager<User> userManager, SignInManager<User> signInManager, IPasswordHasher<User> passwordHasher,
IStringLocalizer<Default> LangDefault, IDataProtectionProvider provider) : base(signInManager,provider)
{
this.userManager = userManager;
this.passwordHasher = passwordHasher;
_localizer = LangDefault;
}
我的登录视图:
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
Layout = "_LayoutLogin";
ViewData["Title"] = Localizer["TitleLogin"];
My project structure
对我来说 returns "TitleLogin" 并且值 "ResourceNotFound" 是真实的。
对于我的同事,它 returns 使用相同代码的正确值...
你能帮帮我吗 - 我做错了什么?
非常感谢。
我不知道哪个 resx 文件包含 TitleLogin
。为了显示正确的本地化数据,当我将 services.AddLocalization(options => options.ResourcesPath = "Lang/");
修改为
时它起作用了
services.AddLocalization(options => options.ResourcesPath = "Lang");
然后在Lang
文件夹中添加一个名为Views.Account.Login.cs.resx
的resx文件。
2020 年 3 月 19 日更新
事实证明,在 asp.net 核心 3.1 中,您需要将 Default.cs
放在 Resources 文件夹(这里是您的 Lang
文件夹)之外,请参阅此 github issue。
如果class Default.cs
和Default.*.resx
在同一个文件夹中,命名空间在编译的dll中会出错xxx.lang.dll。
所以,解决方案是
1.Delete原来Default.cs
直接在项目下新建:
namespace MyApp
{
public class Default
{
}
}
2.Add Default.cs.resx
在 Lang
文件夹中
3._ViewImports.cshtml
@using MyApp
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<Default> LangDefault
我正在尝试使用 .resx 文件使我的项目本地化。
对我来说它不起作用,对我的同事来说,他也在做这个项目。
关于代码的一些细节: Startup.cs 文件
public void ConfigureServices(IServiceCollection services)
{
.
.
.
// Localization
services.AddLocalization(options => options.ResourcesPath = "Lang/");
services.AddMvc(option => option.EnableEndpointRouting = false)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("cs"),
//new CultureInfo("en")
};
options.DefaultRequestCulture = new RequestCulture(culture: "cs", uiCulture: "cs");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
services.AddTransient<Messages>();
// Localization end
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
// Localization
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
// Localization end
.
.
.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
我的控制器:
public class AccountController : BasicController
{
private readonly UserManager<User> userManager;
private readonly IPasswordHasher<User> passwordHasher;
private IStringLocalizer<Default> _localizer;
public AccountController(UserManager<User> userManager, SignInManager<User> signInManager, IPasswordHasher<User> passwordHasher,
IStringLocalizer<Default> LangDefault, IDataProtectionProvider provider) : base(signInManager,provider)
{
this.userManager = userManager;
this.passwordHasher = passwordHasher;
_localizer = LangDefault;
}
我的登录视图:
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
Layout = "_LayoutLogin";
ViewData["Title"] = Localizer["TitleLogin"];
My project structure
对我来说 returns "TitleLogin" 并且值 "ResourceNotFound" 是真实的。
对于我的同事,它 returns 使用相同代码的正确值...
你能帮帮我吗 - 我做错了什么?
非常感谢。
我不知道哪个 resx 文件包含 TitleLogin
。为了显示正确的本地化数据,当我将 services.AddLocalization(options => options.ResourcesPath = "Lang/");
修改为
services.AddLocalization(options => options.ResourcesPath = "Lang");
然后在Lang
文件夹中添加一个名为Views.Account.Login.cs.resx
的resx文件。
2020 年 3 月 19 日更新
事实证明,在 asp.net 核心 3.1 中,您需要将 Default.cs
放在 Resources 文件夹(这里是您的 Lang
文件夹)之外,请参阅此 github issue。
如果class Default.cs
和Default.*.resx
在同一个文件夹中,命名空间在编译的dll中会出错xxx.lang.dll。
所以,解决方案是
1.Delete原来Default.cs
直接在项目下新建:
namespace MyApp
{
public class Default
{
}
}
2.Add Default.cs.resx
在 Lang
文件夹中
3._ViewImports.cshtml
@using MyApp
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<Default> LangDefault