ASP.NETCore 3.1路由(Route,ActionName)本地化怎么做?
How to do ASP.NET Core 3.1 routing (Route, ActionName) localization?
我正在开发一个 ASP.NET 核心 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来自数据库的slug),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
- 在源代码中(为了清晰起见),控制器的
Route
的值不应更改。
- 在源代码中(为清楚起见),
EnglishName
动作函数的 ActionName
的值不应更改。
- 在源代码中(为清楚起见),动作的函数名称
EnglishName
不得更改。
- 在路由上下文中,
Route
的值应为 de-DE
文化中的“/Produkte”。
- 在路由上下文中,
EnglishName
操作的 ActionName
的值在 de-DE
文化中应为“GermanName”。
- 所有本地化应使用 "usual way"(.resx 文件,如视图等的库存本地化)。
如何在不手动构建动态路由的情况下实现这一点table?
目前,我没有起点。搜索结果例如ASP.NET 核心路由本地化 只是提出在 URL 中具有文化的答案(域名除外),但这不是我的用例。我尝试为属性使用变量名,但这当然行不通。
Filip Woj 在他的 blog post.
中指出了一个解决方案
他展示了 MapDynamicControllerRoute
与 DynamicRouteValueTransformer
class 结合使用来转换路由。
我正在开发一个 ASP.NET 核心 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来自数据库的slug),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”。 - 所有本地化应使用 "usual way"(.resx 文件,如视图等的库存本地化)。
如何在不手动构建动态路由的情况下实现这一点table?
目前,我没有起点。搜索结果例如ASP.NET 核心路由本地化 只是提出在 URL 中具有文化的答案(域名除外),但这不是我的用例。我尝试为属性使用变量名,但这当然行不通。
Filip Woj 在他的 blog post.
中指出了一个解决方案他展示了 MapDynamicControllerRoute
与 DynamicRouteValueTransformer
class 结合使用来转换路由。