恰好近来手上在给一个Razor MVC项目完成一个多言语功用,叫Globalization也好,Localization也好,whatever。终究要完成的结果呢,就是一键切换全站言语,而且开辟的时刻只须要写一套页面。
下面进入正题
起首,我们要建立一个CultureConfigurer类,用于治理本地化资本,完成“翻译”环节:
这里我用了静态类,然后在MVC项目StartUp的时刻实行Init()要领,实在有点蠢,固然你们也能够先写一个接口然后用依靠注入成单例。
using System.Collections.Generic; using System.IO; using System.Reflection; using Newtonsoft.Json; namespace Localization { public enum Culture { Cn, En } public static class CultureConfigurer { private static Dictionary<string, string> _enDictionary; private static Dictionary<string, string> _cnDictionary; public static void Init() { var assembly = Assembly.Load(new AssemblyName("Localization")); var resourceNames = assembly.GetManifestResourceNames(); foreach (var resourceName in resourceNames) { if (resourceName.EndsWith("en-US.json") || resourceName.EndsWith("zh-CN.json")) { using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream != null) { using (StreamReader reader = new StreamReader(stream)) { var content = reader.ReadToEnd(); Dictionary<string, string> localizationDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(content); if (resourceName.EndsWith("en-US.json")) { _enDictionary = localizationDictionary; } else { _cnDictionary = localizationDictionary; } } } } } } } public static string GetValue(string key, Culture culture) { switch (culture) { case (Culture.Cn): { if (_cnDictionary.ContainsKey(key)) { return _cnDictionary[key]; } else { return $"[{key}]"; } } case (Culture.En): { if (_enDictionary.ContainsKey(key)) { return _enDictionary[key]; } else { return $"[{key}]"; } } default: { return $"[{key}]"; } } } } }
这里须要注重几点:
1. enum类Culture用于代表要完成的言语,这里我只是简朴的完成了中文和英文(其他我也不懂),对应的CultureConfigurer类就有中文和英文两个Dictionary
2. 使用了Assembly.Load加载了顺序集,参数为你本身的顺序集称号,我这里就随意写了一个
3. 资本文件我挑选了json文件,也是为了轻易js中挪用,固然你也能够用xml或许任何你想要用的花样,只须要调解剖析要领,把文件内容加载到对应的Dictionary中就能够了
4. 看到GetValue要领,置信人人都已邃晓了,实在就是多言语不论是什么言语,都用某个词做key,然后挪用这个要领“翻译”成当前言语的词。比如以“Open”作为Key,那末中文Dictionary中就应该有一个KeyValuePair是"Open":"翻开",而响应的英文中应该有一个"Open":"Open",那末Culture为中文时,显现就是“翻开”,英文就是“Open”。
5. 资本文件能够建立在顺序集合的任何位置,假如你的项目有project.json文件,那末就在buildOptions内里增加,注重依据本身的文件位置修正途径
"embed": { "include": [ "Localization/SourceFiles/*.json" ] }
假如是VS2017,是csproj文件,那末右击要增加的资本文件,挑选“属性”,设置改成“一切设置”,设置属性的高等中“生成操纵”修正为“嵌入的资本”,如下图:
到这里,我们已写好了完成本地化的中心类,下面要处理如安在页面上显现的题目:
在MVC项目中新建一个类MyRazorPage
using System; using Microsoft.AspNetCore.Mvc.Razor; using Localization; namespace MVC.Views { public abstract class MyRazorPage<TModel> : RazorPage<TModel> { public virtual string L(string source) { var value = Context.Request.Cookies["culture"]; Culture c; if (string.IsNullOrEmpty(value) || !Enum.TryParse(value, out c)) { c = Culture.Cn; } return CultureConfigurer.GetValue(source, c); } } }
注重这个类是一个抽象类,继续了RazorPage<TModel>。然后在Views文件夹下找到_ViewImports.cshtml文件,在内里增加一行“@inherits MVC.Views.MyRazorPage<TModel>”,如许你的一切RazorPage就会继续MyRazorPage这个类,也就是说你能够在MyRazorPage里写本身想要用的要领,在cshtml里就能够直接挪用啦。这里我写了一个L要领,挪用了CultureConfigurer的GetValue要领。那末,在页面上须要翻译的笔墨就只要写成@L("Open")如许的就能够啦。
能够看到,我是将用户言语保存在Cookie中的,这里人人能够有各自的完成要领。我的完成要领很简朴,用户切换言语的时刻就接见一个接口,修正了代表言语的Cookie,然后革新页面就能够了。
以上就是细致引见Asp.Net Core MVC项目完成多言语的示例代码的细致内容,更多请关注ki4网别的相干文章!