C# 使用主全局资源文件处理所有翻译

C# 使用主全局资源文件处理所有翻译,c#,asp.net,visual-studio-2013,globalization,C#,Asp.net,Visual Studio 2013,Globalization,我有一个ASP.Net网站,其应用程序GlobalResources结构如下: <%@ Page Title='<%$ Resources:ResourceStaticStuff, HelpIntroductionTitle %>' Language="C#" MasterPageFile="~/App_Resources/PlainDefault.master" AutoEventWireup="true" CodeBehind="Introduc

我有一个ASP.Net网站,其应用程序GlobalResources结构如下:

  <%@ Page Title='<%$ Resources:ResourceStaticStuff, HelpIntroductionTitle %>' Language="C#" MasterPageFile="~/App_Resources/PlainDefault.master" 
           AutoEventWireup="true" CodeBehind="Introduction.aspx.cs" Inherits="Software.PasswordReset.Registration.Web.Help.Introduction" %>

  <asp:Content ID="ContentWelcome" ContentPlaceHolderID="BodyContentPlaceholder" runat="server">
    <h1 class="title-regular clearfix">
      <asp:Literal ID="LiteralHeader" runat="server" Text='<%$ Resources:ResourceStaticStuff, HelpIntroductionTitle %>' />
    </h1>
    <asp:Literal ID="LiteralHelp" runat="server" Text='<%$ Resources:ResourceStaticStuff, HelpIntroductionLiteralHelpText %>' />
    <br />
    <br />
  </asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
  try
  {
    if (!Page.IsPostBack)
    {
      SiteLogger.NLogger.Info("Loading Languages and Directories");

      if (!LoadLanguages() || !LoadDirectories())
      {
        SiteLogger.NLogger.Info("Loading Languages or Directories failed!");
        return;
      }

      SiteLogger.NLogger.Info("Completed : PublicLogOn.PageLoad");
    }
  }
  catch (Exception ex)
  {
    SiteLogger.NLogger.Error("Error in PublicLogOn.Page_Load", ex.Message);
  }

}

private Boolean LoadLanguages()
{
  Boolean methodResult;
  try
  {
    SiteLogger.NLogger.Info("In Load Languages");
    DDLLanguages.Items.Clear();
    var fetchedLanguages = UserManagePage.GetOrganizationLanguages();

    foreach (var oneFetchedLanguage in fetchedLanguages)
    {
      DDLLanguages.Items.Add(new ListItem(oneFetchedLanguage.LanguageSymbol, oneFetchedLanguage.LanguageSymbol));
    }

    if (fetchedLanguages.Count() == 1)
    {
      DDLLanguages.Enabled = false;
    }

    // The first place where the language is pushed in. Everything that follows afterwards will be translated
    Session["UserLanguage"] = DDLLanguages.SelectedValue;
    UpdateLanguage();

    methodResult = true;
  }
  catch (Exception exp)
  {
    SiteLogger.NLogger.Error("Error in load languages : ", exp.ToString());
    // Nlogger.LogError(exp);
    labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("Error retrieving organization languages.");
    methodResult = false;
  }

  return methodResult;
}

private void UpdateLanguage(String languageCode="")
{
  if (String.IsNullOrEmpty(languageCode))
  {
    languageCode = Session["UserLanguage"].ToString();
  }

  System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(languageCode);
  System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCode);

  var isRtl = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft;

  if (isRtl)
  {
    Master.BodyTag.Attributes["dir"] = "rtl";
  }
  else
  {
    Master.BodyTag.Attributes["dir"] = "ltr";
  }

  base.InitializeCulture();
}

protected void DDLLanguages_SelectedIndexChanged(object sender, EventArgs e)
{
  Session["UserLanguage"] = DDLLanguages.SelectedValue;
  UpdateLanguage();
}

我使用此文件检索标记中所需的本地化字符串,如下所示:

  <%@ Page Title='<%$ Resources:ResourceStaticStuff, HelpIntroductionTitle %>' Language="C#" MasterPageFile="~/App_Resources/PlainDefault.master" 
           AutoEventWireup="true" CodeBehind="Introduction.aspx.cs" Inherits="Software.PasswordReset.Registration.Web.Help.Introduction" %>

  <asp:Content ID="ContentWelcome" ContentPlaceHolderID="BodyContentPlaceholder" runat="server">
    <h1 class="title-regular clearfix">
      <asp:Literal ID="LiteralHeader" runat="server" Text='<%$ Resources:ResourceStaticStuff, HelpIntroductionTitle %>' />
    </h1>
    <asp:Literal ID="LiteralHelp" runat="server" Text='<%$ Resources:ResourceStaticStuff, HelpIntroductionLiteralHelpText %>' />
    <br />
    <br />
  </asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
  try
  {
    if (!Page.IsPostBack)
    {
      SiteLogger.NLogger.Info("Loading Languages and Directories");

      if (!LoadLanguages() || !LoadDirectories())
      {
        SiteLogger.NLogger.Info("Loading Languages or Directories failed!");
        return;
      }

      SiteLogger.NLogger.Info("Completed : PublicLogOn.PageLoad");
    }
  }
  catch (Exception ex)
  {
    SiteLogger.NLogger.Error("Error in PublicLogOn.Page_Load", ex.Message);
  }

}

private Boolean LoadLanguages()
{
  Boolean methodResult;
  try
  {
    SiteLogger.NLogger.Info("In Load Languages");
    DDLLanguages.Items.Clear();
    var fetchedLanguages = UserManagePage.GetOrganizationLanguages();

    foreach (var oneFetchedLanguage in fetchedLanguages)
    {
      DDLLanguages.Items.Add(new ListItem(oneFetchedLanguage.LanguageSymbol, oneFetchedLanguage.LanguageSymbol));
    }

    if (fetchedLanguages.Count() == 1)
    {
      DDLLanguages.Enabled = false;
    }

    // The first place where the language is pushed in. Everything that follows afterwards will be translated
    Session["UserLanguage"] = DDLLanguages.SelectedValue;
    UpdateLanguage();

    methodResult = true;
  }
  catch (Exception exp)
  {
    SiteLogger.NLogger.Error("Error in load languages : ", exp.ToString());
    // Nlogger.LogError(exp);
    labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("Error retrieving organization languages.");
    methodResult = false;
  }

  return methodResult;
}

private void UpdateLanguage(String languageCode="")
{
  if (String.IsNullOrEmpty(languageCode))
  {
    languageCode = Session["UserLanguage"].ToString();
  }

  System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(languageCode);
  System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCode);

  var isRtl = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft;

  if (isRtl)
  {
    Master.BodyTag.Attributes["dir"] = "rtl";
  }
  else
  {
    Master.BodyTag.Attributes["dir"] = "ltr";
  }

  base.InitializeCulture();
}

protected void DDLLanguages_SelectedIndexChanged(object sender, EventArgs e)
{
  Session["UserLanguage"] = DDLLanguages.SelectedValue;
  UpdateLanguage();
}
有趣的是,页面从右到左或从左到右都很好,但是用的是英语。因此,*.ur-PK.resx似乎不受欢迎


有什么想法吗?

以编程方式设置ASP.NET网页的区域性和UI区域性
覆盖该网页的InitializeCulture方法

protected override void InitializeCulture()
{
    if (Session["UserLanguage"] != null)
    {
        String selectedLanguage = Session["UserLanguage"].ToString();
        UICulture = selectedLanguage ;
        Culture = selectedLanguage ;

        Thread.CurrentThread.CurrentCulture = 
            CultureInfo.CreateSpecificCulture(selectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new 
            CultureInfo(selectedLanguage);
    }
    base.InitializeCulture();
}
资料来源:-

要解决此问题,您可以创建一个所有特定页面都继承的基本页面:

  • 创建一个新类(不是Webform),称它为BasePage,或者其他任何你想要的东西 需要
  • 使其继承System.Web.UI.Page
  • 使所有其他页面继承BasePage
  • 下面是一个例子:

    public class BasePage : System.Web.UI.Page
    {
        protected override void InitializeCulture()
        {
            //Do the logic you want for all pages that inherit the BasePage.
        }
    }
    
    具体页面应如下所示:

    public partial class _Default : BasePage //Instead of it System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Your logic.
        }
    
        //Your logic.
    }
    

    可以但当切换到另一个页面时,我又回到了英语。这是不是每页都要重复?我已经这样做了,因为这是唯一可行的解决方案。测试一下。我不知道为什么,但一旦我把其中一个页面上的语言改成,比方说,你的PK,那个页面和其他页面就会变成空白。除了母版的东西。稍后我将处理母版页,但我需要修复此空白问题。资源在那里,并已正确加载。不知道本地化DLL是如何生成的。我想知道我是否在母版页级别执行此操作,而不是继承自定义BaseWebForm