SharePoint2013与SharePoint2016语言切换原理以及如何使用代码进行语言切换
1、前言
在SharePoint 2010版本,在首页面直接"选择显示语言"的菜单(如下图所示),如下图 :

在sharepoint2013和sharepoint2016并非如此。
-
这里首先需要安装语言包,SharePoint2016语言包下载地址:
https://www.microsoft.com/en-us/download/details.aspx?id=51492
SharePoint2013语言包下载地址:
https://www.microsoft.com/zh-cn/download/details.aspx?id=37140
注意:下载安装完毕后都要进行重新配置
-
在【网站设置】-【语言设置】设置备用语言,这里为英语,如下图
![]()
![]()
-
进行【关于我】进行【语言区域设置】如下图:
![]()
![]()
![]()
2、原理
上面说到SharePoint2010的语言切换根据记录cookie的方式可以快速进行切换,只要记录cookie的值lcid值,对于SharePoint2013和SharePoint2016的语言采用此方式不行,根据IE语言版本来确定显示哪个语言?,因此我们这里使用Fiddler工具进行http头文件的获取分析,主要分析:Accept-Language
说明:
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;根据http头的情况,用代码修改Accept-Language的设置来模拟设置语言版本的切换
-
我们打开英文站点:http://sp2016 用Fiddler抓取分析,如下图:
![]()
分析结果:
![]()
-
我们打开中文站点:http://sp2016(切换后)的Fiddler抓取图,如下图:
![]()
既然知道这个原理,切换代码把每次要切换的语言版本保存到cookie值里,那么我们第一次系统用代码切换前cookie值为空设置一个默认为中文,使用httpModule方式来分析http头的Accept-Language的值,如果包含en-US就设置为英文版本,如果包含zh-CN就设置为中文。明白原理写代码就方便多了。
3、代码
-
HttpModule.cs源码如下:
using System;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;
using System.Threading;
using Microsoft.SharePoint.Utilities;
namespace CSSharePointLangSwitcher.LangSwitcherPage
{
public class HTTPSwitcherModule : IHttpModule
{
/// <summary>
/// You will need to configure this module in the web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
/// <summary>
/// Init event
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
// Below is an example of how you can handle Request event and provide
// custom logging implementation for it
context.PreRequestHandlerExecute += context_PreRequestHandlerExecute;
}
#endregion
/// <summary>
/// Assuming the selected language is stored in a cookie. Firstly, get the selected
/// language from cookie. Then add the selected language to the request header.
/// Finally, use the selected language for the current culture.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
// Get current application.
HttpApplication httpApp = sender as HttpApplication;
// Get all HTTP-specific information about current HTTP request.
HttpContext context = httpApp.Context;
// Current language.
string strLanguage = string.Empty;
// The key of current selected language in the cookies.
string strKeyName = "LangSwitcher_Setting";
try
{
// Set the current language.
if (httpApp.Request.Cookies[strKeyName] != null)
{
strLanguage = httpApp.Request.Cookies[strKeyName].Value;
}
else
{
strLanguage = "zh-cn";
}
var lang = context.Request.Headers["Accept-Language"];
if (lang != null)
{
if (!lang.Contains(strLanguage))
context.Request.Headers["Accept-Language"] = strLanguage + "," + context.Request.Headers["Accept-Language"];
var culture = new System.Globalization.CultureInfo(strLanguage);
// Apply the culture.
SPUtility.SetThreadCulture(culture, culture);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
}
}
-
切换代码如下:
/// <summary> /// Save current selected language to cookie. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnSave_Click(object sender, EventArgs e) { if (ddlLanguages.SelectedIndex > 0) { // Selected language. string strLanguage = ddlLanguages.SelectedValue; // Set the Cookies. HttpCookie acookie = new HttpCookie(strKeyName); acookie.Value = strLanguage; acookie.Expires = DateTime.MaxValue; Response.Cookies.Add(acookie); Response.Redirect(Request.RawUrl); } }
4、效果
-
测试切换效果,先测试切换到中文,如下:

切换后,我们访问下http://sp2016 为中文效果,如下图:

-
测试切换效果,先测试切换到英文,如下:

切换后,我们访问下http://sp2016 为英文效果,如下图:











浙公网安备 33010602011771号