Tôi đang làm việc trên trang web MVC sẽ có nhiều bản dịch. Chúng tôi đang tìm cách thực hiện điều đó thông qua các tên miền phụ như http://en.domain.com
hoặc http://fr.domain.com
. Chúng tôi cũng muốn hỗ trợ miền thông thường http://domain.com
.Nhận tên miền phụ trong MVC để quốc tế hóa
Bản dịch đang làm việc với điều kiện bạn thay đổi tên miền phụ theo cách thủ công, nhưng tôi đang tìm cách tự động hóa điều này và duy trì toàn bộ URL hiện tại để cho phép người dùng tìm thấy http://en.domain.com/product
để nhấp vào liên kết và nhận phiên bản ngôn ngữ khác của cùng một trang. Có vẻ như đơn giản chỉ cần tách biệt tên miền phụ nếu nó tồn tại, loại bỏ nó khỏi url hiện tại và thay thế bằng phiên bản ngôn ngữ được chỉ định.
Về bản chất:
http://en.domain.com/product
(gốc)
http://domain.com/product
(làm sạch)
http://fr.domain.com/product
hoặc http://de.domain.com/product
vv ... (đầu ra)
Tôi bắt đầu tìm kiếm được xây dựng trong chức năng như Request.Url.Subdomain
nhưng đã kết luận không có sinh vật kỳ diệu như vậy. Sau đó tôi chuyển sang thao tác chuỗi cơ bản, nhưng nó dường như thực sự bị pha trộn vì vậy tôi đặt ra để tìm một giải pháp regex.
Tôi đã thử nghiệm regex này với một số người kiểm tra regex trực tuyến thường làm việc cho tôi và họ đang xác định chính xác tên miền phụ khi nó tồn tại, nhưng không tìm thấy kết quả khi mã thực sự chạy.
Tôi chỉ sử dụng cụm từ thông dụng một chút và tôi hy vọng có điều gì đó thực sự rõ ràng là tôi đang làm sai ở đây. Nếu có một giải pháp tốt hơn, tôi sẽ mở ra cho những sự cố gắng khác.
C#
string url = Request.Url.AbsoluteUri; //http://en.domain.com/
Regex regex = new Regex(@"/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
Dưới đây là giải pháp tôi có bây giờ. Không thanh lịch như tôi muốn, nhưng đối với một cái gì đó mà ăn quá nhiều thời gian nó hiện đang làm việc như dự định.
Xem
<a href="@Html.Action("ChangeLanguage", new { lang = "en" })">English</a>
<a href="@Html.Action("ChangeLanguage", new { lang = "fr" })">French</a>
Action
public string ChangeLanguage(string controller, string lang)
{
string url = Request.Url.AbsoluteUri;
Regex regex = new Regex(@"(?:https*://)?.*?\.(?=[^/]*\..{2,5})", RegexOptions.IgnoreCase);
GroupCollection results = regex.Match(url).Groups;
Group result = results[0];
if (result.Success)
{
string[] resultParts = result.Value.Split('/');
string newSubDomain = resultParts[0] + "//" + lang + ".";
url = url.Replace(result.Value, newSubDomain);
}
else
{
string[] urlParts = url.Split('/');
string oldParts = urlParts[0] + "//";
string newParts = urlParts[0] + "//" + lang + ".";
url = url.Replace(oldParts, newParts);
}
return url;
}
Điều hiển nhiên: bạn không cần phân cách regex trong C#. Hãy thử '@" (?: Https *: //)?. *? \. (? = [^ /] * \ .. {2,5}) '. –
Bạn đã cân nhắc sử dụng thứ gì đó khác với tên miền phụ?' Http : // domain.com/fr/product' cũng hoạt động tốt và không yêu cầu mỗi "bản dịch" mới được đăng ký dưới dạng mục nhập DNS. –
@stribizhev Đó là nó. Tôi không chắc chắn 100% lý do tại sao phần giữa hoạt động, nhưng có vẻ như từ thử nghiệm –