zoukankan      html  css  js  c++  java
  • SharePoint2013与SharePoint2016语言切换原理以及如何使用代码进行语言切换

    1、前言

    SharePoint 2010版本,在首页面直接"选择显示语言"的菜单(如下图所示),如下图 :

    在sharepoint2013和sharepoint2016并非如此。

    1. 这里首先需要安装语言包,SharePoint2016语言包下载地址:

    https://www.microsoft.com/en-us/download/details.aspx?id=51492

    SharePoint2013语言包下载地址:

    https://www.microsoft.com/zh-cn/download/details.aspx?id=37140

    注意:下载安装完毕后都要进行重新配置

    1. 在【网站设置】-【语言设置】设置备用语言,这里为英语,如下图

       

    2. 进行【关于我】进行【语言区域设置】如下图:

       

       

       

    2、原理

    上面说到SharePoint2010的语言切换根据记录cookie的方式可以快速进行切换,只要记录cookie的值lcid值,对于SharePoint2013和SharePoint2016的语言采用此方式不行,根据IE语言版本来确定显示哪个语言?,因此我们这里使用Fiddler工具进行http头文件的获取分析,主要分析:Accept-Language

    说明:

    Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;根据http头的情况,用代码修改Accept-Language的设置来模拟设置语言版本的切换

    1. 我们打开英文站点:http://sp2016 用Fiddler抓取分析,如下图:

      分析结果:

    2. 我们打开中文站点:http://sp2016(切换后)的Fiddler抓取图,如下图:

    既然知道这个原理,切换代码把每次要切换的语言版本保存到cookie值里,那么我们第一次系统用代码切换前cookie值为空设置一个默认为中文,使用httpModule方式来分析http头的Accept-Language的值,如果包含en-US就设置为英文版本,如果包含zh-CN就设置为中文。明白原理写代码就方便多了。

    3、代码

    1. 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);
    
    }
    
    }
    
    }
    
    }
    1. 切换代码如下:
      /// <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、效果

    1. 测试切换效果,先测试切换到中文,如下:

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

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

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

    源码可以去我QQ群下载:203613636 谢谢

  • 相关阅读:
    pyCharm django 中新加app
    Amazon Redshift 架构
    Amazon DynamoDB 概述
    Amazon EFS 性能
    Amazon RDS 现在支持 Storage Auto Scaling
    只读副本与多可用区部署
    RDS也和EC2一样支持snapshot的跨Region复制:Cross-Region Snapshot Copy for Amazon RDS
    Automated Cross-Region Snapshot Copy for Amazon Redshift
    EC2的跨Region复制或部署,Cross Region EC2 AMI Copy
    RDS for MySQL, PostgreSQL, Aurora 都支持Cross-Region Read Replicas。采用异步复制,只读副本有网络时延
  • 原文地址:https://www.cnblogs.com/love007/p/6696476.html
Copyright © 2011-2022 走看看