ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ASP.NET MVC 多语言方案

2019-07-17 16:03:39  阅读:135  来源: 互联网

标签:ASP return string CultureItem MVC static 語系 NET public


最近发现资源文件是个好东西, 用的好了可以给开发人员节约不少的时间. 例如做一个多语言的网站, 资源文件就有不小的用处.

 public class Culture
    {
        public static CultureItem ENU = new CultureItem("en-US", "English", "EN");
        public static CultureItem CHS = new CultureItem("zh-CN", "簡体中文", "CN");
        public static CultureItem CHT = new CultureItem("zh-TW", "繁體中文", "TW");
        public static CultureItem JPN = new CultureItem("ja-JP", "日本語", "JP");
        public static CultureItem DE = new CultureItem("de-DE", "Deutsch", "DE");
        public static CultureItem FR = new CultureItem("fr-FR", "French", "FR");
        public static CultureItem ES = new CultureItem("es-ES", "Spanish", "ES");
        public static CultureItem IT = new CultureItem("it-IT", "Italian", "IT");

        /// <summary>
        /// 取得實作語系
        /// </summary>
        public static List<CultureItem> All
        {
            get { return _cultures; }
        }

        // 實作語系
        private static readonly List<CultureItem> _cultures = new List<CultureItem>
        {
            ENU,
            CHS,
            CHT,
            //"en-GB",
            //"en-CA",
            //"de-DE",
            //"es-ES",
            //"it-IT",
            //"ja-JP",
            //"fr-FR",
        };

        /// <summary>
        /// 驗證culture資料是否超出範圍
        /// </summary>
        /// <param name="cultureName"></param>
        /// <returns></returns>
        public static string GetValidBigTrackerCulture(string cultureName)
        {
            //不確定預設是否為en - US, or cultureName的值超出預期的範圍
            if (_cultures.Where(w => w.LanguageCultureName == cultureName).Count() == 0)
            {
                cultureName = ENU.LanguageCultureName;
            }

            return cultureName;
        }

        /// <summary>
        /// 依照「name」參數回傳有效並已實作之語系名稱。
        /// 若無合適語系名稱,則回傳預設語系名稱。
        /// 本專案的預設語系名稱為「en-US」
        /// </summary>
        /// <param name="name">語系名稱</param>
        public static string GetImplementedCulture(string name)
        {
            // 確認是否為空字串
            if (string.IsNullOrEmpty(name))
                return GetDefaultCulture();  // 若是空字串則回傳預設語系

            // 如果該語系名稱已被實作,則接受使用該語系名稱
            var selectedCulture = _cultures.FirstOrDefault(c => c.LanguageCultureName.Equals(name, StringComparison.InvariantCultureIgnoreCase));
            if (selectedCulture != null)
            {
                return selectedCulture.LanguageCultureName; // 接受這個語系
            }

            // 取得最接近之語系名稱。例如,如果已經實作了「en-US」而使用者的請求是「en-GB」, 
            // 則回傳最接近的「en-US」因為這樣至少是相同的語言(例如:英文)  
            var n = GetNeutralCulture(name);
            foreach (var c in _cultures)
                if (c.LanguageCultureName.StartsWith(n))
                    return c.LanguageCultureName;

            // 如果沒有合適的,就回傳預設語系名稱
            return GetDefaultCulture();
        }


        /// <summary>
        /// 回傳預設的語系名稱        
        /// </summary>    
        public static string GetDefaultCulture()
        {
            return ENU.LanguageCultureName;
        }

        /// <summary>
        /// 取得目前語系名稱
        /// </summary>    
        public static string GetCurrentCulture()
        {
            return Thread.CurrentThread.CurrentCulture.Name;
        }

        public static bool IsTW
        {
            get
            {
                return GetCurrentCulture().Equals(CHT.LanguageCultureName, StringComparison.OrdinalIgnoreCase);
            }
        }

        public static CultureInfo GetCurrentCultureInfo()
        {
            return Thread.CurrentThread.CurrentCulture;
        }

        /// <summary>
        /// 取得目前的中性語系名稱
        /// </summary>    
        public static string GetCurrentNeutralCulture()
        {
            return GetNeutralCulture(Thread.CurrentThread.CurrentCulture.Name);
        }

        public static void SetCurrentCulture(string userCulture)
        {
            //驗證culture是否超出系統支援範圍
            userCulture = GetValidBigTrackerCulture(userCulture);

            if (Thread.CurrentThread.CurrentCulture.Name != userCulture)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo(userCulture);
                Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
            }
        }

        /// <summary>
        /// 取得中性語系名稱
        /// </summary>        
        public static string GetNeutralCulture(string name)
        {
            if (name.Length < 2)
                return name;

            return name.Substring(0, 2); // 回傳前兩個字元,例如:"en", "es"
        }


        public static string CookieName
        {
            get
            {
                return Models.Enum.CookieName.BulidCookieKey(Models.Enum.CookieName.Culture);
            }
        }

    }

  

 1 using BigZata.Common;
 2 using BigZata.Resources.Mapping.TitleMapping;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading;
 8 using System.Threading.Tasks;
 9 
10 namespace Resources
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             Console.Write(Thread.CurrentThread.CurrentCulture);
17 
18            // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-us", true);
19            // Thread.CurrentThread.CurrentCulture = culture;
20             Culture.SetCurrentCulture("en-us");
21 
22             Console.Write(Thread.CurrentThread.CurrentCulture);
23             //  System.Globalization.CultureInfo Culture=new System.Globalization.CultureInfo
24             Console.Write(TitleMapping.LandingPage);
25             Console.ReadKey();
26         }
27     }
28 }

 

标签:ASP,return,string,CultureItem,MVC,static,語系,NET,public
来源: https://www.cnblogs.com/lyl6796910/p/11201443.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有