我正在开发一个Asp.net mvc webSite,其要求是用户应该能够更改语言并且页面内容应该自动翻译。 问题是:我在我的模型中使用自定义属性来显示本地化,如下所示:[CommonCustomAttributes.LocalizedDisplayName(" Register"," UserEmail")]。
LocalizedIdsplayname实现如下:[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,AllowMultiple = false)] public sealed class LocalizedDisplayNameAttribute:DisplayNameAttribute { public LocalizedDisplayNameAttribute(string resourceFileName,string keyName) :base(GetMessageFromResource(resourceFileName,keyName)) {}
private static string GetMessageFromResource(string resourceFileName, string keyName)
{
try
{
return CustomLocalizationUtility.GetKeyValue(HttpContext.Current, resourceFileName, keyName);
}
catch (Exception)
{
return "";
}
}
}
因此,当我在语言之间切换时,它不会改变。我的意思是使用它的模型的显示名称,如@ Html.LabelFor(m => m.UserEmailAddress,new {@class =" col- md-3 control-label"})。
但是在我使用@placeholder = @ CustomLocalizationUtility.GetKeyValue(" Register"," EnterEmail")的.cshtml中,当我改变语言时,它可以正常工作。我错过了什么严肃吗?我已经使用Cookie来设置当前文化,我也在基础控制器中覆盖了BeginExecuteCore方法。我已经从Action方法设置了当前文化的Cookie。我们是否需要根据当前的文化变化为JQuery Obstrusive验证和模型Displayname更改添加额外的javascript?
答案 0 :(得分:0)
除非您在更改lang时以及在调用上述标签之前更改应用程序中的区域性,否则它将无法工作,即UserEmailAddress。您可以创建一个actionfilter属性并在控制器中调用它。
这是我的应用程序中的代码
public static List<languages> Availablelanguages = new List<languages>()
{
new languages{ LangFullNmae="English" , LangCultureName="en" },
new languages{ LangFullNmae="دری" , LangCultureName="prs-AF" },
new languages{ LangFullNmae="پښتو" , LangCultureName="ps-AF" }
};
public static string GetDefaultlanguage()
{
string lang = Availablelanguages[0].LangCultureName;
var cultureInfo = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
// HttpCookie langCookie = new HttpCookie("culture", lang);
// langCookie.Expires = DateTime.Now.AddDays(2);
return lang;
}
这些资源可以提供进一步的帮助
讨论你可以设置文化的所有地方
Best place to set CurrentCulture for multilingual ASP.NET MVC web applications
另一个
Set Culture in an ASP.Net MVC app
更新
<tr>
<td>
@Resource.DeputyMinisterText
</td>
<td>
@Html.EditorFor(model => model.DeputyMinister
, new { htmlAttributes = new { style = "dir:ltr;text-align:left" } })
@Html.ValidationMessageFor(model => model.DeputyMinister)
</td>
</tr>
答案 1 :(得分:0)
用于本地化
1)制作资源文件并添加键值对。
例如
Resources.resx //Make this file Public
Resources.fr.resx
2)设置语言的文化(用lang语言,您必须通过LanguageCulture)
public string SetLanguage(string lang)
{
try
{
if (!isLanguageAvailable(lang))
{
lang = getDefaultLanguage();
}
var cultureinfo = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = cultureinfo;
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(cultureinfo.Name);
HttpCookie langCookie = new HttpCookie("culture", lang);
langCookie.Expires = DateTime.Now.AddYears(1);
HttpContext.Current.Response.Cookies.Add(langCookie);
}
catch (Exception)
{
}
return lang;
}
3)现在您可以在视图中调用资源 这是使用键值调用资源的两种方式
@{Resources.Add_Value
ResourcesIndex.ResourceManager.GetString("Add_Value")
}