Sabtu, 02 November 2013

MULTI LANGUAGE PAGE ASP.NET MVC PART 2

Sabtu siang ga tau ma ngapain, pengen nonton film di laptop tapi tetangga sebelah lagi hajatan jadi kurang syahdu, jadi saya memutuskan untuk coding saja 8), saya akan melanjutkan tulisan tentang multi language page pada ASP.NET MVC. pada tulisan sebelumnya kita telah berhasil membuat sebuah halaman web yang multi language, tapi untuk merubah halaman kita masih harus menuliskan pada url-nya, pada tulisan kali ini kita akan membuat sebuah link yang bisa merubah bahasa suatu halaman.

Yang pertama-tama kita lakukan adalah membuah sebuah html helper kalau mau tahu tentang html helper bisa dibaca disini, kita buat class baru kita beri nama SwitchLanguageHelper
public static class SwitchLanguageHelper
    {
        public class Language
        {
            public string Url { get; set; }
            public string ActionName { get; set; }
            public string ControllerName { get; set; }
            //  public string Area { get; set; }
            public RouteValueDictionary RouteValues { get; set; }
            public bool IsSelected { get; set; }
            public MvcHtmlString HtmlSafeUrl { get; set; }
        }

        public static Language LanguageUrl(this HtmlHelper helper, string cultureName, string languageRouteName = "lang", bool stringSelected = false)
        {
            //set the input language to lower
            cultureName = cultureName.ToLower();

            //retrive the route values from the view context
            var routeValues = new RouteValueDictionary(helper.ViewContext.RouteData.Values);

            //copy the query string into route values to generate the link
            var queryString = helper.ViewContext.HttpContext.Request.QueryString;
            foreach (string key in queryString)
            {
                if (queryString[key] != null && string.IsNullOrWhiteSpace(key))
                {
                    if (routeValues.ContainsKey(key))
                    {
                        routeValues[key] = queryString[key];
                    }
                    else
                    {
                        routeValues.Add(key, queryString[key]);
                    }
                }
            }

            var actionName = routeValues["action"].ToString();
            var controllerName = routeValues["controller"].ToString();
            //  var areaName = routeValues["area"].ToString();

            //set language into route values
            routeValues[languageRouteName] = cultureName;
            //generate the language specify url
            var urlHelper = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection);
            var url = urlHelper.RouteUrl("Localization", routeValues);

            //check whether the current thread ui culture is set to language
            var current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower();
            var isSelected = stringSelected
                                 ? current_lang_name == cultureName
                                 : current_lang_name.StartsWith(cultureName);

            return new Language()
                {
                    Url = url,
                    ActionName = actionName,
                    ControllerName = controllerName,
                    //  Area = areaName,
                    RouteValues = routeValues,
                    IsSelected = isSelected
                };
        }

        public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper,
           string cultureName, string selectedText, string unselectedText,
            IDictionary htmlAttributes, string languageRouteName = "lang", bool stringSelected = false)
        {
            var language = helper.LanguageUrl(cultureName, languageRouteName, stringSelected);
            var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText,
                "Localization", language.RouteValues, htmlAttributes);
            return link;
        }


    }

    public class LocalizationDisplayNameAttribute : DisplayNameAttribute
    {
        private DisplayAttribute display;

        public LocalizationDisplayNameAttribute(string resourceName, Type resourceType)
        {
            this.display = new DisplayAttribute()
                {
                    ResourceType = resourceType,
                    Name = resourceName
                };
        }

        public override string DisplayName
        {
            get { return display.GetName(); }
        }
    }
Class ini berfungsi untuk menyimpan informasi dari language links, LanguageUrl method mempunyai fungsi untuk men-generate informasi yang digunakan pada selector seperti URL, RouteValues, dsb.  method ini memuat RuteData dan query string dari request yang datang dan kemudian men-generate URL pada current page dengan bahasa yang dipilih.

Bagaimana menggunakan html helper tersebut, tinggal kita tambahkan saja di halamana _Layout.cshtml

kemudian kita jalankan, maka hasilnya akan seperti ini


sekarang sumber air sudekat, eh sekarang untuk mengganti halaman kita hanya perlu memilih.menekan link yang baru kita buat. Mungkin cukup sekian tulisan kali ini terima kasih.

 source code https://dl.dropboxusercontent.com/u/62442361/MultiLanguage.rar