【问题标题】:Get value from language specific resource file without changing the site language在不更改站点语言的情况下从特定于语言的资源文件中获取价值
【发布时间】:2013-03-26 16:29:53
【问题描述】:

我有几个资源文件,例如

default.aspx.resx、default.aspx.nl.resx、default.aspx.en.resx

现在,当我在荷兰域上时,会加载 default.aspx.nl.resx。 但是现在我想从 default.aspx.en.resx 中获取值,并获取属于名称“title”的英文值。

我现在可以通过更改当前的文化服务器端来实现这一点,访问该值然后将其更改回来,如下所示:

Dim culture As CultureInfo = New CultureInfo("en")
Threading.Thread.CurrentThread.CurrentCulture = culture
Threading.Thread.CurrentThread.CurrentUICulture = culture
Dim title as String = GetLocalResourceObject("title")
culture = New CultureInfo("nl")
Threading.Thread.CurrentThread.CurrentCulture = culture
Threading.Thread.CurrentThread.CurrentUICulture = culture

但是有更好/更快的方法吗?最好不必更改当前线程的文化,这样我就可以定义我想要访问的资源文件以及使用哪种语言?

【问题讨论】:

    标签: asp.net resources cultureinfo currentculture


    【解决方案1】:

    您可以在参数中添加您的目标文化

    GetLocalResourceObject("title","YourCulture");
    

    链接:http://msdn.microsoft.com/fr-fr/library/ms149953.aspx

    【讨论】:

    • 谢谢...你能提供一个如何使用它的示例吗?我在您提供的页面上没有看到任何示例。再次感谢!
    • 我尝试了您的建议:GetLocalResourceObject("title", "en"),但这不起作用。我正在使用 ASP.NET 4.5 顺便说一句
    • 尝试使用 GetLocalResourceObject("title", "en-EN")
    • 问题在于我只传递了 2 个参数...我收到错误:重载解析失败,因为没有可访问的“GetLocalResourceObject”接受这个数量的参数。但我不知道如何调用它然后访问返回值。
    • 啊,显然我没有。我现在将其更改为: lblStatus.Text = HttpContext.GetLocalResourceObject("~/freemediadetails.aspx.nl.resx", "backtosearchresults").ToString 但后来我收到此错误:找不到任何适合指定文化的资源或中立文化。确保“freemediadetails.aspx.nl.resx.resources”在编译时正确嵌入或链接到程序集“App_LocalResources.root._j2bta_i”中,或者所有所需的附属程序集都是可加载的并且完全签名。但是这个文件确实不存在:freemediadetails.aspx.nl.resx.resources
    【解决方案2】:

    编辑:(抱歉,我不知道您想要另一种与此不同的方法,但这是我设法做到的唯一方法:)

    我设法做到了:

    var userLanguage = "en-US";
    
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(userLanguage);
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(userLanguage);
    
    HttpContext.GetGlobalResourceObject("MyAppResource", "KeyThatIWantToGet");
    

    MyAppResource 是您的 .resx 文件的命名方式,KeyThatIWantToGet 会自行解释。

    【讨论】:

      【解决方案3】:

      当不使用 HttpContext(一般 .NET 应用程序)时,我使用以下帮助程序:

      /// <summary>
      /// Disposable class that lets us assume a specific culture while executing 
      /// a certain block of code. You'd typically use it like this:
      /// 
      /// using (new CultureContext("de"))
      /// {
      ///     // Will return the German translation of "Please click here"
      ///     string text = SharedResource.Please_click_here;
      /// }
      /// </summary>
      public class CultureContext : IDisposable
      {
          private readonly CultureInfo _previousCulture;
          private readonly CultureInfo _previousUiCulture;
      
          public CultureContext(CultureInfo culture)
          {
              // Save off the previous culture (we'll restore this on disposal)
              _previousCulture = Thread.CurrentThread.CurrentCulture;
              _previousUiCulture = Thread.CurrentThread.CurrentUICulture;
              Thread.CurrentThread.CurrentCulture = culture;
              Thread.CurrentThread.CurrentUICulture = culture;
          }
      
          public CultureContext(string cultureCode)
              : this(new CultureInfo(cultureCode))
          {
      
          }
      
          /// <summary>
          /// Syntactic sugar so that we can switch to a culture context as follows:
          /// 
          /// using (CultureContext.For("de"))
          /// {
          ///     // Will return the German translation of "Please click here"
          ///     string text = SharedResource.Please_click_here;
          /// }
          /// </summary>
          public static CultureContext For(string cultureCode)
          {
              return new CultureContext(cultureCode);
          }
      
          public void Dispose()
          {
              // Restore the culture settings that were in place before switching
              // to this context
              Thread.CurrentThread.CurrentCulture = _previousCulture;
              Thread.CurrentThread.CurrentUICulture = _previousUiCulture;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        相关资源
        最近更新 更多