我已经建立了一个支持 6 种不同语言的网站。整个语言系统都疯了。它要么以所请求的语言打开,要么以所请求的语言的一半和另一种语言的一半打开,或者完全以另一种语言打开。
这是我如何构建系统的描述。
在 global.asax 我已经这样做了;
protected void Application_AcquireRequestState(object sender,EventArgs e)
{
//just to show my point
if(RouteData.Values["language"] =! null){
switch(RouteData.Values["language"].toString())
{
case "en-us":
// at this point i'm changing the value of static enum that i've already defined in another class ,
// just to reach it from other pages. You'll see what i mean in a second.
Statics.Language = LanguageEnum.EN;
break;
}
// Here is the culture changing codes. ConvertToCulture method is a custom method to get ISO code for language from LanguageEnum
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ConvertToCulture(Statics.Language));
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(ConvertToCulture(Statics.Language));
}
这是 global.asax 文件。而且我对每个实体都有扩展方法(顺便说一句,我正在使用实体框架)来获取给定语言的字符串。
当然,您可能想知道我为什么要在实体上编写扩展方法。在我的数据库中,没有一个字符串在同一个表中。我的意思是这样;
对于“产品”表,我有 [ ID(int),Name(int) ] 列。
对于“LanguageStrings”表,我有 [ ID(int) , EN(string) , FR(string)] 列。
并且产品上的“名称”列引用了 LanguageStrings 表上的 ID 列。
这是一个扩展方法示例;
public static string GetName(this Product pr)
{
try
{
return pr.LanguageStrings.GetType().
GetProperty(Statics.Language.ToString()).
GetValue(pr.LanguageStrings, null).ToString();
}
catch (Exception ex)
{
return "null";
}
}
在我网站上的每一页中,我都使用这些扩展名来获取名称、描述、技术信息。而且我还有从“.resx”文件中获取字符串的方法,即:
public static string ResGet(string key)
{
return Resources.Strings.ResourceManager.GetString(key);
}
切中要害;
例如,当请求默认页面时,它有时全是英文。有时页面的大厅是英文,页面的一半是法文。有时它全是法语。
使用请求的语言打开整个页面,或者请求的一半和另一个的一半或完全另一个。我的意思是它出现了 2 或 1 种语言...
这真的让我发疯。它是随机发生的。我想不通。
如果你们能帮助我,那就太好了!