2016-07-05 30 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のソース・コードに)追加:URL - の値を取って、ASP.NETが局在化する方法

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

これが優先されますパラメータin_sprache(in_spracheは、ブラウザのユーザ言語ではなくレポートのパラメータでなければなりません)。あなただけそうすることができ

日付ピッカーが正しく動作するために今、残念ながら、あなたもcontext.Request.UserLanguagesをオーバーライドする必要があります...(文化はEN-USおよび> 12日であればそうでない場合は、あなたがエラーを取得する)
レポートサーバー

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

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

のweb.configファイルにHTTP-モジュール(libRequestLanguageChanger.dll)
を添加することによって。 (このHTTPモジュールを許可するようにrosetta-policyを変更する方法を理解できない限り、rosettaから "Full"に変更する必要があります)。

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 

そしてそこには、ブラウザの言語を変更するようにユーザーに伝えるためになくても、「カスタム」-culture日付フォーマットでレポートサーバーです。

{@language}のテキストをユーザーのカルチャー名(私の場合はDE、FR、IT、EN)に置き換えることができるSQLテーブルからリンクをフェッチできます。これらはスイスで使用されている言語)。

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 
関連する問題