2016-07-05 6 views

ответ

0

В вашем дизайнере формат даты определяется культурой операционной системы.

После развертывания формат даты определяется по языку браузера.

1

Некронирование.
Да, вы можете действительно сделать это - вид.
Во-первых, обратите внимание, что SSRS принимает формат даты с языка, указанного в вашем браузере.

Таким образом, вы можете просто изменить язык своего браузера.
Очевидно, что вы не хотите, чтобы каждый из ваших пользователей это делал (если у них есть права & навыков, чтобы сделать это в первую очередь).

Таким образом, вы передать дополнительный параметр в отчет:
Я назвал его in_sprache (Sprache означает язык на немецком языке, с возможными значениями «DE "FR", "IT", "EN")

. Теперь вам нужно изменить процесс локализации, путем переопределения виртуального метода «InitializeCulture» в ReportViewer.aspx.

вы можете найти ReportViewer в

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

например

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 ​​для DatePicker, чтобы работать должным образом ... (в противном случае вы получите сообщение об ошибке, если культура ан-США и день> 12)
вы можете сделать это только путем добавления HTTP-модуль (libRequestLanguageChanger.dll)
в web.config из ReportServer

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

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

. (Требуется изменить доверительный уровень от rosetta до «Полный», если вы не можете выяснить, как изменить политику розетки, чтобы разрешить этот http-модуль).

Поскольку мы также можем переопределить InitializeCulture в HTTP-модуле, вам действительно не нужно добавлять сценарий 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