2016-07-05 12 views

Antwort

0

In Ihrem Designer wird das Datumsformat durch die Kultur des Betriebssystems bestimmt.

Nach der Bereitstellung wird das Datumsformat durch die Sprache des Browsers festgelegt.

1

Necromancing.
Ja, Sie können tatsächlich tun, dass - Art.
Beachten Sie, dass SSRS das Datumsformat aus der in Ihrem Browser angegebenen Sprache übernimmt.

Sie könnten also nur die Sprache Ihres Browsers ändern.
Offensichtlich wollen Sie nicht jedem Ihrer Benutzer das sagen (wenn sie die Rechte & Fähigkeiten haben, dies zu tun, in erster Linie).

So übergeben Sie einen zusätzlichen Parameter in den Bericht:
ich es genannt in_sprache (Sprache Sprache in Deutsch bedeutet, mit den möglichen Werten „DE "FR", "IT", "EN")

. nun müssen Sie den Lokalisierungsprozess ändern, indem Sie die virtuelle Methode "InitializeCulture" in ReportViewer.aspx überschrieben.

Sie können Report finden in

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

zB

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER 

Es Sie hinzufügen (in der Quelle-Code des /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> 

Dies wird außer Kraft setzen, wie ASP.NET lokalisiert, um den Wert des URL- nehmen Parameter in_sprache (in_sprache muss ein Parameter Ihres Berichts sein) anstelle der Browser-Benutzersprache.

nun leider, müssen Sie auch context.Request.UserLanguages ​​außer Kraft für die Datepicker richtig funktioniert ... (sonst erhalten Sie einen Fehler, wenn Kultur en-US und Tag ist> 12)
Sie nur so tun können, durch eine HTTP-Modul Zugabe (libRequestLanguageChanger.dll)
in die web.config von Report

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

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

. (Erfordert die Änderung der Vertrauensstufe von Rosetta zu "Full", es sei denn, Sie können herausfinden, wie Sie die Rosetta-Richtlinie ändern, um dieses http-Modul zuzulassen).

Da wir auch InitializeCulture im HTTP-Modul überschreiben können, müssen Sie das Skript runat = "server" nicht unbedingt zu ReportViewer.aspx hinzufügen.

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 

Und da sind Sie, Reportserver mit einem „custom“ -Kultur Datum-Format, ohne den Benutzer zu sagen, mit der Browser-Sprache zu ändern.

Sie können die Links aus einer SQL-Tabelle holen, wo Sie den Text {@language} durch den Kulturnamen Ihres Benutzers ersetzen können (in meinem Fall DE, FR, IT, EN, da dies die in der Schweiz gesprochenen Sprachen sind)).

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 
Verwandte Themen