[英]Routed localization in ASP.NET Core 3.0 Razor Pages
我想在我的 ASP.NET Core 3.0 Razor Pages 應用程序中使用路由本地化。
https://stackoverflow.com/a/52976625/107718似乎有 2.2 的解決方案,但是在 3.0 中是否有更好的方法來做到這一點,因為它已經重新設計了路由/端點?
ASP.NET Core 3.0 引入了 Endpoint Routing 的新功能,通過它我們可以在路由數據進入 MVC 之前從路由數據中獲取文化。 這使我們能夠根據當前路線對內容進行本地化,而無需付出太多努力。
首先,確保已注冊本地化服務並且您已配置支持的文化,如下所示:
services.AddLocalization(opts => opts.ResourcesPath = "Resources" );
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
// ... others
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
然后添加一個UseRequestLocalization
中間件並為文化配置一個路由,以便它可以正確獲取文化信息:
app.UseRouting(); app.UseRequestLocalization(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
請注意,上述命令很重要。
[編輯]
抱歉,我沒有注意到您要求 Razor 頁面。 要使用 Razor 頁面 WebApp,請創建一個自定義IPageRouteModelConvention
到 map 路由:
public class CustomCultureRouteRouteModelConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
List<SelectorModel> selectorModels = new List<SelectorModel>();
foreach (var selector in model.Selectors.ToList())
{
var template = selector.AttributeRouteModel.Template;
selectorModels.Add(new SelectorModel(){
AttributeRouteModel = new AttributeRouteModel
{
Template = "/{culture}" + "/" + template
}
});
}
foreach(var m in selectorModels){
model.Selectors.Add(m);
}
}
}
並添加此頁面約定:
services.AddRazorPages().AddRazorPagesOptions(opts =>
{
opts.Conventions.Add(new CustomCultureRouteRouteModelConvention());
});
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
new CultureInfo("zh"),
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
中間件:
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
//endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
//endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.