客户端和服务器中的多语言支持

时间:2014-01-29 10:05:22

标签: javascript html asp.net-mvc multilingual

我正在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

2 个答案:

答案 0 :(得分:0)

为什么不能在视图中正确呈现本地化字符串? 像是:

<script>
    var home = '@SomeResource.SomeStringValue'
</script>

甚至包含js文件,具体取决于客户端语言?

E.g。您有一些名为LocalizedStrings.resx的资源文件,其默认语言。对于不同的语言,您有名为LocalizedStrings.en-US.resxLocalizedStrings.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>