2016-07-05 101 views

回答

0

在您的设计器中,日期格式取决于操作系统的文化。

一旦部署,日期格式由浏览器的语言确定。

1

Necromancing。
是的,你可以实际上这样做 - 有点。
首先,请注意,SSRS将采用浏览器中指定语言的日期格式。

所以你可以改变浏览器的语言。
很显然,你不想告诉每个用户都这样做(如果他们首先拥有这些权利&技能)。

所以你传递一个额外的参数到您的报告:
我把它叫做in_sprache(SPRACHE意味着在德国的语言,有可能值“DE “FR”, “IT”, “EN”)

。现在,你需要改变本地化进程,通过重写ReportViewer.aspx虚方法“InitializeCulture”。

可以在

C:\Program Files\Microsoft SQL Server\MSRS<Version>.MSSQLSERVER 
C:\Program Files\Microsoft SQL Server\MSRS<Version>.<Instance> 

发现的ReportViewer
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER 

有添加(在/ReportServer/Pages/ReportViewer.aspx的源代码):

<script type="text/C#" runat="server"> 

protected override void InitializeCulture() 
{ 
    string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"]; 

    if(string.IsNullOrEmpty(sprache)) 
     sprache = ""; 

    switch(sprache.ToLowerInvariant()) 
    { 
     case "de": 
      sprache = "de-CH"; 
      break; 
     case "fr": 
      sprache = "fr-CH"; 
      break; 
     case "it": 
      sprache = "it-CH"; 
      break; 
     case "en": 
      sprache = "en-US"; 
      break; 
     default: 
      sprache = ""; 
      break; 
    } 

    // System.Web.HttpContext.Current.Response.Write(sprache); 
    if(!String.IsNullOrEmpty(sprache)) 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache); 
    } 

    base.InitializeCulture(); 
} 

</script> 

这将覆盖ASP.NET如何局部化,走的是URL-的价值参数in_sprache(in_sprache必须是报表的参数)而不是浏览器用户语言。

现在,不幸的是,你还必须重写context.Request.UserLanguages的日期选择器正常工作......(否则你会得到一个错误,如果文化为en-US和天> 12)
你可以做到只通过添加HTTP模块(libRequestLanguageChanger.dll)
成的ReportServer

<system.web> 
    [...] 
    <httpModules> 
     [...] 
     <add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" /> 

    </httpModules> 
    [...] 
    </system.web> 

web.config中。 (需要将信任级别从rosetta更改为“Full”,除非您可以确定如何更改rosetta策略以允许此http-module)。

由于我们也可以重写HTTP模块中的InitializeCulture,所以您不必将runat =“server”脚本添加到ReportViewer.aspx。

namespace libRequestLanguageChanger 
{ 


    public class RequestLanguageChanger : System.Web.IHttpModule 
    { 


     void System.Web.IHttpModule.Dispose() 
     { 
      // throw new NotImplementedException(); 
     } 


     void System.Web.IHttpModule.Init(System.Web.HttpApplication context) 
     { 
      // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order 
      context.BeginRequest += new System.EventHandler(context_BeginRequest); 
     } 


     void context_BeginRequest(object sender, System.EventArgs e) 
     { 
      System.Web.HttpApplication application = sender as System.Web.HttpApplication; 
      System.Web.HttpContext context = application.Context; 

      if (context.Request != null) 
      { 
       // string language = context.Request.Headers["Accept-Language"]; 
       string language = null; 
       // string url = context.Request.RawUrl; 
       // string referrer = null; 


       if (context.Request.UrlReferrer != null) 
       { 
        // referrer = context.Request.UrlReferrer.OriginalString; 

        string queryString = context.Request.UrlReferrer.Query; 
        System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString); 
        language = queryStrings["in_sprache"]; 
       } 

       if(context.Request.QueryString["in_sprache"] != null) 
        language = context.Request.QueryString["in_sprache"]; 

       if (!string.IsNullOrEmpty(language)) 
       { 
        language = language.ToLowerInvariant(); 

        switch (language) 
        { 
         case "de": 
          language = "de-CH"; 
          break; 
         case "fr": 
          language = "fr-CH"; 
          break; 
         case "it": 
          language = "it-CH"; 
          break; 
         case "en": 
          language = "en-US"; 
          break; 
         default: 
          language = ""; 
          break; 
        } 

       } // End if (!string.IsNullOrEmpty(sprache)) 

       // SQL.Log(url, referrer, sprache); 


       // Simulate Browser-Language = in_sprache 
       if (!string.IsNullOrEmpty(language)) 
       { 
        // context.Request.Headers["Accept-Language"] = language; 

        System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language); 
        System.Threading.Thread.CurrentThread.CurrentCulture = culture; 
        System.Threading.Thread.CurrentThread.CurrentUICulture = culture; 

        if (context.Request.UserLanguages != null) 
        { 

         // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(context.Request.UserLanguages[0]); 
         for (int i = 0; i < context.Request.UserLanguages.Length; ++i) 
         { 
          // context.Request.UserLanguages[i] = "en-US"; 
          context.Request.UserLanguages[i] = language; 
         } // Next i 

        } // End if (context.Request.UserLanguages != null) 

       } // End if (!string.IsNullOrEmpty(language)) 

      } // End if (context.Request != null) 


     } // End Sub context_BeginRequest 


    } // End Class 


} // End Namespace 

在那里,ReportServer采用“自定义”文化日期格式,而不必告诉用户更改浏览器语言。

您可以从SQL表中获取链接,您可以将文本{@language}替换为用户的文化名(在我的案例中为DE,FR,IT,EN,因为这些是瑞士语言)。

SELECT 
    REPLACE(RE_Link, '{@language}', T_Users.USR_Language) 
FROM T_Reports 
LEFT JOIN T_Users ON USR_ID = @usr 


-- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=de 
-- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=fr 
-- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=it 
-- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=en