ASP.NET MVC多語言 仿微軟網站效果(轉)

来源:https://www.cnblogs.com/hao987/archive/2018/09/20/9681863.html
-Advertisement-
Play Games

本文轉自: https://blog.csdn.net/Cooldiok/article/details/7831351 2017年10月22日 21:31:22 Cooldiok 微軟作為ASP.NET的創造者,它對於官網的結構設計肯定有值得我們借鑒和參考的地方 本項目是基於VS2017 pro開 ...


本文轉自: https://blog.csdn.net/Cooldiok/article/details/7831351

2017年10月22日 21:31:22

微軟作為ASP.NET的創造者,它對於官網的結構設計肯定有值得我們借鑒和參考的地方

本項目是基於VS2017 pro開發的,將從你已經創建了一個MVC項目開始介紹:
流程圖
這裡寫圖片描述

1.創建語言文件
創建App_GlobalResources文件夾
這裡寫圖片描述

創建Language文件夾
這裡寫圖片描述

創建資源文件
這裡寫圖片描述

這些操作做完後,目錄結構應該是以下這樣的
這裡寫圖片描述

我們打開每個資源文件,在裡面添加一條TiTle數據
這裡寫圖片描述

我推薦使用ResX Manager來管理語言文件
比如我已經創建了中文、英語、日語這三個語言文件,我如果要做修改的話就需要每個文件輪流修改,使用ResX Manager就能直接同時修改這三個語言文件,它還提供語言翻譯功能。具體使用方法與此文無關,就不再贅述了。
這裡寫圖片描述

2.創建一個過濾器
這裡寫圖片描述

 1 namespace MvcEdu.Filters
 2 {
 3     public class LocalizationAttribute : ActionFilterAttribute
 4     {
 5         public override void OnActionExecuting(ActionExecutingContext filterContext)
 6         {
 7 
 8             bool isSkipLocalization = filterContext.ActionDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true);
 9 
10             if (!isSkipLocalization)
11             {
12                 if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
13                 {
14                     ///從路由數據(url)里設置語言
15                     var lang = filterContext.RouteData.Values["lang"].ToString();
16                     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
17                 }
18                 else
19                 {
20                     ///從cookie里讀取語言設置
21                     var cookie = filterContext.HttpContext.Request.Cookies["Localization.CurrentUICulture"];
22                     var langHeader = string.Empty;
23                     if (cookie != null && cookie.Value != "")
24                     {
25                         ///根據cookie設置語言
26                         langHeader = cookie.Value;
27                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
28                     }
29                     else
30                     {
31                         ///如果讀取cookie失敗則設置預設語言
32                         langHeader = filterContext.HttpContext.Request.UserLanguages[0];
33                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
34                     }
35                     ///把語言值設置到路由值里
36                     filterContext.RouteData.Values["lang"] = langHeader;
37                     //如果url中不包含語言設置則重定向到包含語言值設置的url里
38                     string ReturnUrl = $"/{filterContext.RouteData.Values["lang"]}/{filterContext.RouteData.Values["controller"]}/{filterContext.RouteData.Values["action"]}";
39                     filterContext.Result = new RedirectResult(ReturnUrl);
40                 }
41 
42                 /// 把設置保存進cookie
43                 HttpCookie _cookie = new HttpCookie("Localization.CurrentUICulture", Thread.CurrentThread.CurrentUICulture.Name);
44                 _cookie.Expires = DateTime.Now.AddYears(1);
45                 filterContext.HttpContext.Response.SetCookie(_cookie);
46 
47                 base.OnActionExecuting(filterContext);
48             }
49 
50         }
51     }
52 
53     public class WithoutLocalizationAttribute : Attribute
54     {
55     }
56 }
View Code

 

3.配置路由文件
我這邊因為只有三個語言文件,所以我對於語言項的輸入做了限制。

 1 namespace MvcEdu
 2 {
 3     public class RouteConfig
 4     {
 5         public static void RegisterRoutes(RouteCollection routes)
 6         {
 7             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 8 
 9             routes.MapRoute(
10               name: "Localization", // 路由名稱
11               url: "{lang}/{controller}/{action}/{id}", // 帶有參數的 URL\
12               constraints: new { lang = "zh-CN|en-US|ja-JP" }, //限制可輸入的語言項
13               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//參數預設值
14             );
15 
16             routes.MapRoute(
17                 name: "Default",
18                 url: "{controller}/{action}/{id}",
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20             );
21         }
22     }
23 }
View Code

 

4.修改HomeController.cs文件,添加修改語言函數

 1 namespace MvcEdu.Controllers
 2 {
 3     [Localization] //HomeController里的函數都要走Localization過濾器
 4     public class HomeController : Controller
 5     {
 6         public ActionResult Index()
 7         {
 8             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件里的Title值
 9             return View();
10         }
11 
12         public ActionResult About()
13         {
14             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件里的Title值
15             ViewBag.Message = "Your application description page.";
16 
17             return View();
18         }
19 
20         public ActionResult Contact()
21         {
22             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件里的Title值
23             ViewBag.Message = "Your contact page.";
24 
25             return View();
26         }
27         [WithoutLocalization]//這個函數不走Localization過濾器
28         public ActionResult ChangeLanguage(String NewLang, String ReturnUrl)
29         {
30             if (!ReturnUrl.EndsWith("/"))
31             {
32                 ReturnUrl += "/";
33             }
34             //use NewLang replace old lang,include input judgment
35             if (!string.IsNullOrEmpty(ReturnUrl) && ReturnUrl.Length > 3 && ReturnUrl.StartsWith("/") && ReturnUrl.IndexOf("/", 1) > 0 && new string[] { "zh-CN", "en-US","ja-JP" }.Contains(ReturnUrl.Substring(1, ReturnUrl.IndexOf("/", 1) - 1)))
36             {
37                 ReturnUrl = $"/{NewLang}{ReturnUrl.Substring(ReturnUrl.IndexOf("/", 1))}";
38             }
39             else
40             {
41                 ReturnUrl = $"/{NewLang}{ReturnUrl}";
42             }
43             return Redirect(ReturnUrl);//redirect to new url
44         }
45     }
46 }
View Code

 

註意:我在使用vs2015 express for web時,出現了使用Resources.Language時智能提示沒出現Title的情況,此時去找一下Language.designer.cs里有無以下代碼,如果沒有的話則以後添加鍵值對的時候你們都要在此手動添加,或者把Language文件夾建在Controllers的同級目錄下然後再新建資源文件等操作也能解決該問題。

1 /// <summary>
2         ///  查找類似 標題 的本地化字元串。
3         /// </summary>
4         internal static string Title {
5             get {
6                 return ResourceManager.GetString("Title", resourceCulture);
7             }
8         }
View Code

 

5.修改母版頁,添加了修改語言的link

 1 <div class="navbar-collapse collapse">
 2                 <ul class="nav navbar-nav">
 3                     <li>@Html.ActionLink("主頁", "Index", "Home")</li>
 4                     <li>@Html.ActionLink("關於", "About", "Home")</li>
 5                     <li>@Html.ActionLink("聯繫方式", "Contact", "Home")</li>
 6                     @*以下是添加的內容*@
 7                     <li>@Html.ActionLink("en-US", "ChangeLanguage", "Home",new { NewLang = "en-US",ReturnUrl=Request.RawUrl},new { @class="testclass"})</li>
 8                     <li>@Html.ActionLink("zh-CN", "ChangeLanguage", "Home", new { NewLang = "zh-CN", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
 9                     <li>@Html.ActionLink("ja-JP", "ChangeLanguage", "Home", new { NewLang = "ja-JP", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
10                 </ul>
11             </div>
View Code

 

6.Views/Home的三個頁面我都加了顯示ViewBag.Title值的代碼

1 <h2>@ViewBag.Title.</h2>

 

7.現在我們來運行,看一下效果
首次登錄的時候因為url是localhost:50062/,沒有語言項,所以讀取瀏覽器預設語言“zh-CN”,然後重定向。
這裡寫圖片描述

以下是點擊導航欄的en-US和ja-JP時的情況
這裡寫圖片描述

這裡寫圖片描述

8.如果用戶直接輸入http://localhost:50062/Home/Index/
程式會重定向到http://localhost:50062/cookie里保存的語言項OR瀏覽器預設語言/Home/Index/

基本做到了和MSDN效果一樣。

本文Demo下載:

本文參考了:

http://www.cnblogs.com/zoro-zero/p/6674442.html
http://www.cnblogs.com/CameronWu/p/5709442.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 面向對象的概念,面向對象是一種編程思想。 是對現實世界中一類事物的抽象,在編程中可以理解為是一種建立現實世界事物的模型 2. 面向對象和麵向過程的區別: 面向過程關註的是完成工作的步驟。 面向對象關註的是誰能完成工作。 面向對象是在完成工作的時候關註哪些個體能夠完成對應的工作,找到對應的個體即 ...
  • 在做軟體的時候我們可能會遇到這樣的問題,就是在使用EF的時候,有時候精度不一樣, 我們用整數來計算肯定是比浮點數來得快的,但我在MySQL裡面存儲的數據類型是decimal的,我生成EF後, 裡面的數據模型變成了float,那麼這時候我們就需要對數據模型進行修改 1.首先,我們找到下麵這個 2.找到 ...
  • 在使用EF的情況下,可能也會存在說我有多個站點,同時去訪問一個資料庫,操作同一條數據的同一個值,那麼我們怎麼來進行事物的處理呢 有這麼一個很好的解決方式 EF6裡面提供了這麼一個方式來處理事物 Database.BeginTransaction() : 為用戶提供一種簡單易用的方案,在dbEntit ...
  • 首先也要明白一點,什麼是SQL註入 所謂SQL註入,就是通過把SQL命令插入到Web表單提交或輸入功能變數名稱或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令註入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得 ...
  • 環境:win7 64位, VS2010 1、首先用VS2010創建命令行工程NLogDemo 2、在程式包管理器控制臺中輸入:Install-Package NLog -Version 4.4.12 這句是怎麼來的,要是你用過nuget包管理工具,那就可以跳過這裡的說明瞭。 要使用nuget添加NL ...
  • 1.其一 在運行速度方面:StringBuilder > StringBuffer > String 上實例 上述兩個例子只是for迴圈 從0 到99 博主筆記本有點卡 當數據龐大時優勢就展示出了 鐵證如山 ,就是有圖有真相的那種 那麼, 為什麼會出現這種運行速度的差別,引出其二區別 2.其二 數據 ...
  • 概念 枚舉是一組命名整型常量 枚舉類型是使用 enum 關鍵字聲明的 例如定義一個變數,該變數的值表示一周中的一天: enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; 聲明枚舉變數 一般語法: e ...
  • 註解:最近做了一個小工具,在Winform中對Picture控制項有一個需求,可以通過滑鼠從外部拖拽圖片到控制項的上,釋放滑鼠,顯示圖片! //函數從動態鏈接庫中倒入(模擬滑鼠事件) 4.在來設置PictureBox的事件 5.以上就可以完成推拽圖片顯示圖片(無論是本地還是QQ消息框中的圖片都可以實現) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...