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 程序 ...
随机推荐
- MFC使用SQLite 学习系列 一: SQLITE_MISUSE错误
一 为什么要选择SQLite 由于使用文本文件来记录测试数据,速度越来越慢的问题,经过园友推荐,使用了SQLite来进行数据的存储,再次感谢园友@LightSmaile. 关于这个问题,可以参考一下上 ...
- Windows下JIRA6.3.6安装、汉化、破解
一.MySQL建库和建账号 1. mysql中创建数据库jiradb create database jiradb character set 'UTF8'; 2.创建数据库用户并赋于权限 creat ...
- ios runtime部分事例方法说明
一.场景--动态改变变量 unsigned ; Ivar *ivar = class_copyIvarList([self.person class], &count); ; i<cou ...
- 关于mysql查询区分大小写
使用查询语句时,携带collate utf8_bin 在SQL语句中使用collate 使用collate子句,能够为一个比较覆盖任何默认校对规则.collate可以用于多种SQL语句中,比如wher ...
- Mac 下载安装MySQL
step 1. 从官网上下载MySQL Community Server step 2. 安装MySQL step 3. 配置mysql和mysqladmin的alias $ vim ~/.bashr ...
- SpringMVC4+MyBatis+SQL Server2014 基于SqlSession实现读写分离(也可以实现主从分离)
前言 上篇文章我觉的使用拦截器虽然方便快捷,但是在使用读串还是写串上你无法控制,我更希望我们像jdbc那样可以手动控制我使用读写串,那么这篇则在sqlsession的基础上实现读写分离, 这种方式则需 ...
- Android 如何本地加载pdf文件
大部分app打开pdf文件是通过intent调起手机中能打开pdf文件的工具,来查看pdf文件,如果需求是,用户在app内下载好pdf文件后,不通过第三方的工具,本地打开. 这样的需求要怎么实现呢?上 ...
- Java计算两个程序运行时间
一.获取系统当前时间 long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTim ...
- 在Angular项目下使用Umeditor
Umeditor是百度旗下的开源富文本编辑器项目,目前用于百度贴吧,是ueditor的迷你版本. 公司的Angular后台管理项目需要上传一些新闻,用Umeditor十分适合.但是目前官方只提供Jsp ...
- linux 下启动程序的时候会显示坏的解释器,或者没有那个文件
又一次开发的时候在windowns上编写完的程序放到linux下运行的时候,比如:./start.sh的时候显示:"坏的解释器,没有那个文件"错误, 原因是windowns下写的s ...