我正在ASP.NET MVC 4
建立一个网站。虽然有时我会返回一个完整的视图,有时我会从视图中调用Ajax
,获取一些数据并使用JavaScript构建一个新页面。
例如:
myDiv.append("<div class=\"test\">some text </div>");
我想支持多语言,如果它只在客户端没有ASP.NET
视图
我将使用JavaScript
按语言
english.js
-------------------------
var home = 'home';
russian.js
------------------------
var home = 'дом';
我如何支持多语言,以便在JavaScript
页面中呈现视图时在客户端使用ASP.NET
?
答案 0 :(得分:0)
为什么不能在视图中正确呈现本地化字符串? 像是:
<script>
var home = '@SomeResource.SomeStringValue'
</script>
甚至包含js文件,具体取决于客户端语言?
E.g。您有一些名为LocalizedStrings.resx
的资源文件,其默认语言。对于不同的语言,您有名为LocalizedStrings.en-US.resx
,LocalizedStrings.kk-KZ.resx
等的文件......
在视图中,您执行以下操作:
@Html.RenderPartial('MyLocalizedView')
和MyLocalizedView
本身看起来像:
<script>
var home = '@LocalizedStrings.Home';
var street = '@LocalizedStrings.Street';
var wtf = '@LocalizedStrings.Wtf';
...
</script>
因此,当渲染主视图时,您已经使用适当的本地化值初始化了所有js变量。 当然,您需要确保将当前文化设置为正确的值,例如:
var culture = CultureInfo.GetCultureInfo("ru-RU");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
我不知道你是如何控制它的,我会在global.asax
中根据域扩展名进行控制
答案 1 :(得分:0)
我正在使用自定义http处理程序,它动态生成我的所有资源作为js对象。
名为JS_PageTitle的资源的结果对象可能如下所示:
var resources = { PageTitle: "page title en" }.
http处理程序实现:
public class JavascriptResourceHandler : IHttpHandler
{
#region IHttpHandler Members
public bool IsReusable
{
// Return false in case your Managed Handler cannot be reused for another request.
// Usually this would be false in case you have some state information preserved per request.
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
var sb = new StringBuilder();
sb.Append(" var resources = { ");
var properties = typeof (WebRes).GetProperties(BindingFlags.Static | BindingFlags.Public).Where(p => p.Name.StartsWith("JS_")).ToList();
for (int i=0; i<properties.Count; i++)
{
var property = properties[i];
if (property.PropertyType == typeof(string))
{
sb.Append(property.Name.Replace("JS_", string.Empty));
sb.Append(":");
sb.Append("'");
sb.Append(HttpUtility.JavaScriptStringEncode((string)property.GetValue(null, null)));
sb.Append("'");
if (i != properties.Count - 1)
sb.Append(",");
}
}
sb.Append("};");
context.Response.Clear();
context.Response.ContentType = "text/javascript";
context.Response.Write(sb.ToString());
}
#endregion
}
web.config中的配置条目
<add name="JavascriptResourceHandler" verb="GET" path="JavascriptResourceHandler.axd" type="Web.Infrastructure.HttpHandlers.JavascriptResourceHandler, Web, Version=1.0.*, Culture=neutral" />
然后从_Layout.cshtml中引用它:
<script src="~/JavascriptResourceHandler.axd"></script>