Asp.Net Core MVC项目实现多语言(Globalization/Localization)
正好最近手上在给一个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项目实现多语言(Globalization/Localization)的更多相关文章
- 使用EF Core+CodeFirst建立ASP.NET Core MVC项目
本篇随笔介绍如何使用.NET Core+EF Core创建Web应用程序 首先借用官网的话简单介绍一下ASP.NET Core ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且 ...
- 新建 ASP.NET Core MVC 项目 -- Hello World!
一.创建一个空项目 请查看 新建 .NET Core 项目 -- Hello World! 一节,新建一个项目: 二.添加引用并修改配置为 MVC 修改 .vscode\launch.json 文件 ...
- 使用Asp.Net Core MVC 开发项目实践[第五篇:缓存的使用]
项目中我们常常会碰到一些数据,需要高频率用到但是又不会频繁变动的这类,我们就可以使用缓存把这些数据缓存起来(比如说本项目的导航数据,帖子频道数据). 我们项目中常用到有Asp.Net Core 本身提 ...
- Pro ASP.NET Core MVC 6th 第三章
第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...
- 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...
- ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...
- 使用 ASP.NET Core MVC 创建 Web API(一)
从今天开始来学习如何在 ASP.NET Core 中构建 Web API 以及每项功能的最佳适用场景.关于此次示例的数据库创建请参考<学习ASP.NET Core Razor 编程系列一> ...
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API
2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...
随机推荐
- linux sort命令详解(转)
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容,以行为单位来排序. 参 数 ...
- C#中的DateTime是值类型还是引用类型
近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容 结论:DateTime是值类型,因为DateTime是结构体,而结构体继承自Syste.Val ...
- 【react学习】关于react框架使用的一些细节要点的思考
( _(:3 」∠)_给园友们提个建议,无论是API文档还是书籍,一定要多看几遍!特别是隔一段时间后,会有意想不到的收获的) 这篇文章主要是写关于学习react中的一些自己的思考: 1.set ...
- druid 连接kafuk
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.realtime.specFile=examples/indexing/ ...
- AngularJS学习笔记2
3.AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}.AngularJS 表达式把数据绑定到 HTML,这与 ng-bind 指令有异曲同工之妙. ...
- js中的IP格式正则匹配校验详解~
IPV4的格式为x:y:z:w,其中{x,y,z,w}属于{0~255}的正整数: 下面是其校验的正则表达式: function isIP(ip) { var re = /^(\d{1,2}|1\d ...
- NSString 为什么要使用copy,而不是retain
NSString 为什么要使用copy,而不是retain1.首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好2.但是使用copy安全.因为NSString 为 NSMuta ...
- Unity CommandInvokationFailure: Failed to re-package resources. 解决方案
在导入谷歌的SDK的时候,打包出来报错CommandInvokationFailure: Failed to re-package resources. 把Android SDK更新一下就轻松搞定了, ...
- 【STL】reverse函数用法
reverse函数的功能是反转排序一个容器中指定元素的内容. 函数参数:reverse(first,last), 其中first,last分别指向被反转序列中初始及末尾位置的双向迭代器(Bidirec ...
- 2017/4/27-Gradle的配置与Spring的下载
Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...