2016-07-05 98 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