我正在开发一个ASP.NET Core 3.1 MVC网站,该网站使用域名来确定本地化的区域性。
例如,所有去往域example.com
的请求都将具有en-US
区域性,而所有去往域名example.org
的请求都具有de-DE
区域性。
我修改了以前未本地化的网站,在视图等中使用本地化。我使用了自己的RequestCultureProvider
实现来基于域名设置区域性。结果如下:
https://example.com/Products/My-Application/Help
使用en-US
作为文化并且具有英文文本https://example.org/Products/My-Application/Help
使用de-DE
作为文化,并具有德语文本
注意:Products
是控制器,My-Application
是应用程序的名称(数据库中的URL段(,Help
是Products
控制器中的操作。URL结构是我为我的网站使用的实际结构
然而,我还想在实际源代码(控制器类和操作函数(中依赖仅英文名称的情况下翻译URL
例如,这里有一个具有单个操作的伪控制器(由于简化,与上面的示例URL断开(。
[Controller]
[Route("/Products")]
public class ProductController : Controller
{
[ActionName("EnglishName")]
public IActionResult EnglishName()
{
return View();
}
}
对于这个简化的例子:
- URL示例:
- 英文URL:
https://example.com/Products/EnglishName
- 德语URL:
https://example.org/Produkte/GermanName
- 英文URL:
- 在源代码中(为了清楚起见(,控制器的
Route
的值不应更改 - 在源代码中(为了清楚起见(,
EnglishName
动作函数的ActionName
的值不应更改 - 在源代码中(为了清楚起见(,动作
EnglishName
的函数名称不应更改 - 在路由上下文中,
Route
的值在de-DE
区域性中应为">/Produkte"> - 在路由上下文中,
EnglishName
操作的ActionName
的值在de-DE
区域性中应为">GermanName"> - 所有本地化都应使用"常用方式"(.resx文件,如视图的库存本地化等(
如果不手动构建动态路由表,如何实现这一点
目前,我没有起点。例如,ASP.NET Core路由本地化的搜索结果只会给出URL中具有区域性的答案(域名除外(,但这不是我的用例。我尝试为属性使用变量名,但这当然不起作用。
Filip Woj在他的博客文章中指出了一个解决方案。
他展示了MapDynamicControllerRoute
与DynamicRouteValueTransformer
类结合用于翻译路由的用法。