【问题标题】:Using a main Global resource file to handle all translations使用主全局资源文件来处理所有翻译
【发布时间】:2013-12-05 14:01:39
【问题描述】:

我有一个 ASP.Net 网站,其 App-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>

即使更改了文化 + ui 文化,我也总是得到默认的英文文本。我在运行时改变文化如下:

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 似乎没有被娱乐。

有什么想法吗?

【问题讨论】:

    标签: c# asp.net visual-studio-2013 globalization


    【解决方案1】:

    以编程方式为 ASP.NET 网页设置文化和 UI 文化override the InitializeCulture method for the page

    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();
    }
    

    来源:-Set the Culture and UI Culture for ASP.NET Web Page

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

    1. 创建一个新类(不是 Webform),将其命名为 BasePage 或任何您喜欢的名称 想要。
    2. 使其继承 System.Web.UI.Page。
    3. 让所有其他页面都继承 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.
    }
    

    【讨论】:

    • 好的。但是在切换到不同的页面后,我再次回退到 Eng。是否要在每一页上重复?
    • 我已经这样做了,因为这是唯一可行的解​​决方案。测试一下。
    • 我不知道为什么,但是一旦我将其中一个页面上的语言更改为 ur-PK,该页面和其他页面就会变为空白。除了 MasterPage 的东西。稍后我会处理 MasterPage,但我需要解决这个空白问题。资源在那里并正确加载。不知道本地化 DLL 是如何生成的。
    • 我想知道我是否在 MasterPage 级别执行此操作,而不是继承自定义 BaseWebForm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2013-10-16
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多