【问题标题】:Multi language support in Client and Server at once客户端和服务器同时支持多语言
【发布时间】:2014-02-21 01:23:05
【问题描述】:

我正在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 页面中呈现视图?

【问题讨论】:

  • var home = 'dom' 不正确。好的是var home = 'дом' :)
  • 这可能是波兰语文件而不是俄语 ;)
  • 文件名是russian.js :))
  • 但可能是 Polish.js :D

标签: javascript html asp.net-mvc multilingual


【解决方案1】:

为什么不能直接在视图中呈现本地化字符串? 比如:

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

甚至根据客户端语言包含 js 文件?

例如您有一些名为 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做,取决于域名扩展

【讨论】:

  • 你能举个例子,你如何在客户端和服务器视图中组合一次?
【解决方案2】:

我为此使用了一个自定义的 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>

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 2020-09-19
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多