Tạo URL thân thiện với đa ngôn ngữ trong Asp.Net MVC


19/02/2020- duocnt    2417 Views    


Các bước cần thực hiện:

  1. Tạo colum Metatitle cho table.
  2. Tạo phương thức chuyển chuỗi tiếng việt có dấu thành không dấu.
  3. Gọi phương thức này mỗi khi Insert hoặc Update dữ liệu.
  4. Tạo ID trong 2 file resources, 1 cho ngôn ngữ tiếng Việt, 1 cho ngôn ngữ tiếng Anh.
  5. Tạo 2 Route trong RouteConfig.cs, 1 dùng cho ngôn ngữ tiếng Việt, 1 dùng cho ngôn ngữ tiếng Anh.
  6. Tạo URL trên View.

Thực hiện.

1 - Tạo colum Metatitle cho table.

Table in design mode


2 - Tạo phương thức chuyển chuỗi tiếng Việt có dấu thành không dấu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Models.CommonFunctions
{
    public static class Strings
    {
      static Dictionary<stringstring> foreign_characters = new Dictionary<stringstring>
    {
        { "äæǽ""ae" },
        { "öœ""oe" },
        { "ü""ue" },
        { "Ä""Ae" },
        { "Ü""Ue" },
        { "Ö""Oe" },
        { "ÀÁÂÃÄÅǺĀĂĄǍΑΆẢẠẦẪẨẬẰẮẴẲẶА""A" },
        { "àáâãåǻāăąǎªαάảạầấẫẩậằắẵẳặа""a" },
        { "Б""B" },
        { "б""b" },
        { "ÇĆĈĊČ""C" },
        { "çćĉċč""c" },
        { "Д""D" },
        { "д""d" },
        { "ÐĎĐΔ""D" },
        { "ðďđδ""d" },
        { "ÈÉÊËĒĔĖĘĚΕΈẼẺẸỀẾỄỂỆЕЭ""E" },
        { "èéêëēĕėęěέεẽẻẹềếễểệеэ""e" },
        { "Ф""F" },
        { "ф""f" },
        { "ĜĞĠĢΓГҐ""G" },
        { "ĝğġģγгґ""g" },
        { "ĤĦ""H" },
        { "ĥħ""h" },
        { "ÌÍÎÏĨĪĬǏĮİΗΉΊΙΪỈỊИЫ""I" },
        { "ìíîïĩīĭǐįıηήίιϊỉịиыї""i" },
        { "Ĵ""J" },
        { "ĵ""j" },
        { "ĶΚК""K" },
        { "ķκк""k" },
        { "ĹĻĽĿŁΛЛ""L" },
        { "ĺļľŀłλл""l" },
        { "М""M" },
        { "м""m" },
        { "ÑŃŅŇΝН""N" },
        { "ñńņňʼnνн""n" },
        { "ÒÓÔÕŌŎǑŐƠØǾΟΌΩΏỎỌỒỐỖỔỘỜỚỠỞỢО""O" },
        { "òóôõōŏǒőơøǿºοόωώỏọồốỗổộờớỡởợо""o" },
        { "П""P" },
        { "п""p" },
        { "ŔŖŘΡР""R" },
        { "ŕŗřρр""r" },
        { "ŚŜŞȘŠΣС""S" },
        { "śŝşșšſσςс""s" },
        { "ȚŢŤŦτТ""T" },
        { "țţťŧт""t" },
        { "ÙÚÛŨŪŬŮŰŲƯǓǕǗǙǛŨỦỤỪỨỮỬỰУ""U" },
        { "ùúûũūŭůűųưǔǖǘǚǜυύϋủụừứữửựу""u" },
        { "ÝŸŶΥΎΫỲỸỶỴЙ""Y" },
        { "ýÿŷỳỹỷỵй""y" },
        { "В""V" },
        { "в""v" },
        { "Ŵ""W" },
        { "ŵ""w" },
        { "ŹŻŽΖЗ""Z" },
        { "źżžζз""z" },
        { "ÆǼ""AE" },
        { "ß""ss" },
        { "IJ""IJ" },
        { "ij""ij" },
        { "Œ""OE" },
        { "ƒ""f" },
        { "ξ""ks" },
        { "π""p" },
        { "β""v" },
        { "μ""m" },
        { "ψ""ps" },
        { "Ё""Yo" },
        { "ё""yo" },
        { "Є""Ye" },
        { "є""ye" },
        { "Ї""Yi" },
        { "Ж""Zh" },
        { "ж""zh" },
        { "Х""Kh" },
        { "х""kh" },
        { "Ц""Ts" },
        { "ц""ts" },
        { "Ч""Ch" },
        { "ч""ch" },
        { "Ш""Sh" },
        { "ш""sh" },
        { "Щ""Shch" },
        { "щ""shch" },
        { "ЪъЬь""" },
        { "Ю""Yu" },
        { "ю""yu" },
        { "Я""Ya" },
        { "я""ya" },
        { "@"" " },
        { "."" " },
        { "&""and" },
    };
        public static char RemoveDiacritics(this char c)
        {
            foreach (KeyValuePair<stringstring> entry in foreign_characters)
            {
                if (entry.Key.IndexOf(c) != -1)
                {
                    return entry.Value[0];
                }
            }
            return c;
        }
        public static string RemoveDiacritics(this string s)
        {
            //StringBuilder sb = new StringBuilder ();
            string text = "";
            foreach (char c in s)
            {
                int len = text.Length;
 
                foreach (KeyValuePair<stringstring> entry in foreign_characters)
                {
                    if (entry.Key.IndexOf(c) != -1)
                    {
                        text += entry.Value;
                        break;
                    }
                }
                if (len == text.Length)
                {
                    text += c.ToString().ToLower();
                }
            }
            return text;
        }
    }
}

3 - Gọi phương thức này mỗi khi Insert hoặc Update dữ liệu.




4 - Tạo ID trong 2 file resources, 1 cho ngôn ngữ tiếng Việt, 1 cho ngôn ngữ tiếng Anh.



5 - Tạo 2 Route trong RouteConfig.cs, 1 dùng cho ngôn ngữ tiếng Việt, 1 dùng cho ngôn ngữ tiếng Anh.

 //Route hiển thị cho bài viết theo PostID
            routes.MapRoute(
             name: "Posts by PostID (VN)",
             url: "chi-tiet-bai-viet-{Metatitle}-{postId}",
             defaults: new { controller = "Posts", action = "PostByID", postId = UrlParameter.Optional },
             namespaces: new[] { "CodeMiAnLien.Controllers" }
         );
            routes.MapRoute(
              name: "Posts by PostID (EN)",
              url: "post-detail-{Metatitle}-{postId}",
               defaults: new { controller = "Posts", action = "PostByID", postId = UrlParameter.Optional },
              namespaces: new[] { "CodeMiAnLien.Controllers" }
          );

6 - Tạo URL trên View.


<div class="widget">
    <h5 class="widgetheading"><b>@language.LatestPosts</b></h5>
    <ul class="recent">
         @if (listLastedPosted != null)
         {
              foreach (Post pst in Model.ListOfLastedPost)
               {
                 var routeURL = "/" + language.PostByPostIdRoute + "-" + pst.Metatitle + "-" + pst.Id;
                 <li>
                    <i class="icon-angle-right"></i>
                    <a href="@routeURL">
                        @pst.Title
                    </a>
                    </li>
                  }
           }
     </ul>
</div>

7 - Khi hoàn thành, URL trên trình duyệt sẽ như hình.


Góp ý kiến

;
;