Tôi đang làm việc với một khách hàng muốn URL trong ứng dụng web của chúng tôi bằng tiếng Pháp. Tôi là một nhà phát triển tiếng Anh và chúng tôi cũng có khách hàng tiếng Anh. Đây là một vấn đề thú vị nhưng tôi không nghĩ rằng cái gì đó của ASP.NET MVC Framework sẽ hỗ trợ.Có thể bản địa hóa URL/định tuyến trong ASP.NET MVC không?
Đây là kịch bản. Các tuyến đường ...
ví dụ cụ thể
tiếng Anh URL
www.stackoverflow.com/questions/ask
cũng sẽ hỗ trợ
URL Pháp
www.stackoverflow.com/problème/poser
VÍ DỤ chung
tiếng Anh URL
http://clientA.product.com/AreaNameEnglish/ControllerNameEnglish/ActionNameEnglish/params
cũng cần hỗ trợ
URL Pháp
http://clientB.product.com/AreaNameFrench/ControllerNameFrench/ActionNameFrench/params
Vì vậy, trong MVC Diện tích của tôi, điều khiển và hành động tất cả cần phải có cả tiếng Anh và bản dịch tiếng Pháp.
Rõ ràng khả năng bảo trì sẽ là vấn đề HUGE nếu tôi đi và mã hóa tất cả các tên Bộ điều khiển, Chế độ xem và Hành động của tôi sang tiếng Pháp. Có anyway để bản địa hóa các tuyến đường được trình bày trong trình duyệt mà không làm điều này? Lưu ý rằng có rất nhiều tuyến đường khác nhau trong ứng dụng. Một vài khu vực với một số ít các bộ điều khiển mỗi với nhiều hành động?
Cảm ơn,
Justin
EDIT
Nhờ @womp đây là những gì tôi đã đi lên với cho đến nay ... Mặc dù cuối cùng thì tôi lấy phương pháp mà tôi được đăng như một câu trả lời .
public class LocalizedControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
if (string.IsNullOrEmpty(controllerName))
throw new ArgumentNullException("controllerName");
if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "fr")
{
controllerName = this.ReplaceControllerName(requestContext, controllerName);
this.ReplaceActionName(requestContext);
this.ReplaceAreaName(requestContext);
}
return base.CreateController(requestContext, controllerName);
}
private string ReplaceControllerName(RequestContext requestContext, string controllerName)
{
// would use the language above to pick the propery controllerMapper. For now just have french
Dictionary<string, string> controllerMapper = new Dictionary<string, string>()
{
{"frenchControllerA", "englishControllerA"},
{"frenchControllerB", "englishControllerB"}
};
return this.ReplaceRouteValue(requestContext, "controller", controllerMapper);
}
private void ReplaceAreaName(RequestContext requestContext)
{
// would use the language above to pick the propery areaMapper. For now just have french
Dictionary<string, string> areaMapper = new Dictionary<string, string>()
{
{"frenchAreaX", "englishAreaX"},
{"frenchAreaY", "englishAreaY"}
};
this.ReplaceRouteValue(requestContext, "area", areaMapper);
}
private void ReplaceActionName(RequestContext requestContext)
{
// would use the language above to pick the propery actionMapper. For now just have french
Dictionary<string, string> actionMapper = new Dictionary<string, string>()
{
{"frenchAction1", "englishAction1"},
{"frenchAction2", "englishAction2"}
};
this.ReplaceRouteValue(requestContext, "action", actionMapper);
}
private string ReplaceRouteValue(RequestContext requestContext, string paramName, Dictionary<string, string> translationLookup)
{
if (requestContext.RouteData.Values[paramName] == null)
{
return null;
}
string srcRouteValue = requestContext.RouteData.Values[paramName] as string;
if (srcRouteValue != null && translationLookup.ContainsKey(srcRouteValue))
{
requestContext.RouteData.Values[paramName] = translationLookup[srcRouteValue];
}
return requestContext.RouteData.Values[paramName] as string;
}
}
Khởi đầu tốt. Nếu tôi chỉ bản địa hóa ControllerName và ActionName trong Url, nó sẽ tìm và hiển thị View thích hợp. Tuy nhiên tôi có những vấn đề sau.
Diện tích Tên không thể được dịch
Phối khu vực có nghĩa là phương pháp Controller.View() thất bại trong việc tìm xem. Mặc dù tôi đã thay thế tên Khu vực trong ngữ cảnh yêu cầu nhưng phương thức ViewEngineCollection.Find() dường như không nhận được nó. Bất cứ nơi nào trong lớp điều khiển của tôi mà không "trở lại View()" không tìm thấy xem mặc định cho hành động của nó. Nếu tôi không bản địa hóa Khu vực thì các bước khác sẽ hoạt động.
RedirectToAction hoặc Html.ActionLink
Bất kỳ khi nào ứng dụng gọi RedirectToAction hoặc nếu tôi sử dụng một helper Html.ActionLink hoặc một cái gì đó tương tự các url tạo là những người Anh. Có vẻ như tôi sẽ phải thêm logic ở đâu đó có thể ở nhiều điểm để chuyển đổi một Url tiếng Anh sang tiếng Pháp (hoặc ngôn ngữ khác).
Rất đẹp. Về cơ bản nó là khái niệm tương tự, ngoại trừ đóng gói trong định tuyến, thay vì trong logic điều khiển instantiation. Tôi đồng ý, nó có lẽ thanh lịch hơn một chút, có vẻ như một miền phù hợp hơn cho giải pháp. – womp
Tôi biết đây là một bài đăng cũ, nhưng bạn chỉ cần lưu da của tôi. Câu trả lời chính xác! –