C# 使用主全局资源文件处理所有翻译
我有一个ASP.Net网站,其应用程序GlobalResources结构如下: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
<%@ 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();
}
资料来源:-
要解决此问题,您可以创建一个所有特定页面都继承的基本页面:
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