就在最近,我正在为Razor MVC项目实现一个多语言功能,这个项目叫做全球化、本地化等等。最终效果是一键切换全站语言,开发时只需要写一套页面。
让我们言归正传
首先,我们需要创建一个CultureConfigurer类来管理本地化资源并完成“翻译”:
这里我用的是静态类,然后在MVC项目启动的时候执行Init()方法,其实有点蠢。当然,您也可以先编写一个接口,然后将其注入到一个具有依赖关系的实例中。
使用系统。集合。通用;使用系统。IO;使用系统。反思;使用Newtonsoft。Json命名空间本地化{公共枚举区域性{ Cn,En }公共静态类CultureConfigurer {私有静态Dictionary,string _ enDictionary私有静态Dictionarystring,string _ cnDictionary公共静态void Init(){ var Assembly=Assembly。加载(新程序集名称(“本地化”));var resourceNames=程序集。GetManifestResourceNames();foreach(resource name中的var resource name){ if(resource name。EndsWith(' en-us . JSON ')| | resource name。EndsWith(' zh-cn . JSON '){使用(var stream=assembly。GetManifestResourceStream(resource name)){ if(stream!=null) {使用(stream reader reader=new stream reader(stream)){ var content=reader。ReadToEnd();Dictionarystring,字符串localization dictionary=JsonConvert。反序列化对象字典字符串,字符串(内容);if (resourceName。EndsWith(' en-us . JSON '){ _ enDictionary=localizationdictiondictionary;} else { _ cn dictionary=localization dictionary;} } } } } } }公共静态字符串GetValue(字符串键,区域性区域性){ switch(区域性){ case(区域性。Cn): { if (_cnDictionary。contains KeY(key)){ return _ CNdictionary[KeY];} else { return $ '[{ key }]';} }案例(文化。En): { if (_enDictionary。contains KeY(key)){ return _ Endictionary[KeY];} else { return $ '[{ key }]';} } default : { return $ '[{ key }]';}}}}}这里有几点需要注意:
1.枚举类区域性用于表示要实现的语言。这里我简单实现了中文和英文(别的我就不知道了),对应的CultureConfigurer类有两个Dictionary,中文和英文。
2.用组件装载组件。Load,参数是你自己的程序集名称,所以我就在这里写了一个。
3.我选择了json文件作为资源文件,这也便于在js中调用。当然,您也可以使用xml或任何您想要的格式,只需调整解析方法并将文件内容加载到相应的Dictionary中
4.看到GetValue方法,相信大家都已经明白了,其实不管是什么语言,多语的人都会用某个单词作为键,然后调用这个方法来“翻译”当前语言的单词。例如,如果用“开”作为键,汉语词典中的一个键值对应该是“开”:“开”,对应的英语应该是“开”:“开”。当文化是中文时,显示意味着“开放”,英文意味着“开放”。
5.资源文件可以在程序集中的任何位置创建。如果您的项目有一个project.json文件,请将其添加到buildOptions中,并注意根据您自己的文件位置修改路径
嵌入' : { '包括' : ['本地化/源文件/*。JSON']}如果是VS2017或csproj文件,右键点击要添加的资源文件,选择“属性”,配置将更改为“所有配置”,高级配置属性中的“生成操作”将更改为“嵌入式资源”
至此,我们已经编写了实现本地化的核心类,现在需要解决如何在页面上显示它们的问题:
在MVC项目中创建新类MyRazorPage
使用系统;使用微软。AspNetCore . Mvc.Razor使用本地化;命名空间MVC。视图{公共抽象类MyRazorPageTModel : RazorPageTModel {公共虚拟字符串L(字符串源){ var值=Context。请求。Cookies[' _ _区域性'];文化c;if(字符串。IsNullOrEmpty(值)||!枚举。特里帕斯(值,out c)){ c=Culture.Cn;}返回CultureConfigurer。GetValue(来源,c);}}}注意,这个类是一个抽象类,继承了RazorPageTModel。然后在“视图”文件夹中找到file _ ViewImports.cshtml,并在其中添加一行“@ inherismvc . Views . myrazorpage model”,这样你所有的razorpage都会继承myrazorpage这个类,也就是说你可以在myrazorpage中编写自己想用的方法,直接在cshtml中调用。我在这里写了一个l方法,调用CultureConfigurer的GetValue方法。然后,页面上需要翻译的单词只需要写成@ L(‘Open’)。
如您所见,我将用户的语言保存在Cookie中,每个人都可以有自己的实现方法。我的实现方法很简单。当用户切换语言时,他访问一个接口,修改代表语言的Cookie,然后刷新页面。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。