【问题标题】:Localize javascript messages and validation text本地化 javascript 消息和验证文本
【发布时间】:2009-06-12 16:17:59
【问题描述】:

我正在开发一个多语言的网络项目。例如,该项目的一部分涉及一些自定义 google 映射,该映射利用客户端接口使用 jquery/.net 将点添加到地图并将它们保存到数据库中。

会有一些验证和其他信息性消息(例如“请在地图上至少添加一个点”)必须本地化。

我现在能想到的唯一选择是:

  1. 在 javascript 中使用代码渲染块从资源文件中提取本地化消息

  2. 使用带有 meta:resourcekey 的隐藏字段,以使用当前文化自动从资源文件中获取正确的本地化消息,并在必要时在 jquery 中获取 .val()。

  3. 每次需要消息时,调用 Web 服务以按键/语言获取正确的消息。

有什么想法、经验吗?

编辑:

我更喜欢使用 .net 资源文件来与应用程序的其余部分保持一致。

【问题讨论】:

    标签: asp.net javascript jquery localization


    【解决方案1】:

    好的,我构建了一个通用 Web 服务,让我可以抓取资源并将它们返回到字典中(可能是转换为字典的更好方法)...

    <WebMethod()> _    
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=True)> _
        Public Function GetResources(ByVal resourceFileName As String, ByVal culture As String) As Dictionary(Of String, String)
    
            Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture))
            If reader IsNot Nothing Then
                Dim d As New Dictionary(Of String, String)
                Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator()
                While enumerator.MoveNext
                    d.Add(enumerator.Key, enumerator.Value)
                End While
                Return d
            End If
    
            Return Nothing
    
        End Function
    

    然后,我可以获取这个 json 结果并将其分配给一个局部变量:

    // load resources
    $.ajax({
        type: "POST",
        url: "mapping.asmx/GetResources",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: '{"resourceFileName":"common","culture":"en-CA"}',
        cache: true,
        async: false, 
        success: function(data) {
            localizations = data.d;                
        }
    });
    

    然后,您可以像这样从局部变量中获取您的值:

    localizations.Key1

    这里唯一的问题是,如果您想将本地化分配给一个全局变量,您必须运行它 async=false,否则您将无法在需要时获得翻译。我正在尝试使用“获取”,以便可以缓存响应,但它对我不起作用。看到这个问题:

    Can't return Dictionary(Of String, String) via GET ajax web request, works with POST

    【讨论】:

    • 好主意。不过那不是很大吗?
    • 我想。这比将所有本地化都写入隐藏字段要好。代码渲染块会有同样的问题 - 无论如何都写入 js。目的更多是针对界面/验证消息,而不是大块内容或 html。
    • 您可以设置一些脚本来调查 JavaScript 文件,以找出其中真正使用了哪些本地化消息。然后,您可以只将那些仅在那里使用的消息发送到 JavaScript。这样可以缩小尺寸。我正在使用这种方法将 GNU Gettext 引入 JavaScript,如下所述:stackoverflow.com/questions/431672/…
    • 非常有趣的方法。同样,鉴于我依赖共享的 .net 资源文件,我认为我不能使用它。
    • 好的,我现在已经实现了这个技术。尽管 ajax 调用必须同步运行,但速度非常快,因此阻塞是难以察觉的。效果很好!
    【解决方案2】:

    我之前已经这样做了,其中隐藏字段的值在 Page_Init() 和 Page_Load() 上设置,并具有来自全局和本地资源文件的适当值。然后,javascript 代码将使用这些隐藏值。

    代码背后

    this.hfInvalidCheckDateMessage.Value = this.GetLocalResourceObject("DatesRequired").ToString();
    

    Page.aspx

    $('#<%= btnSearch.ClientID %>').click(function(e) {
        if (!RequiredFieldCheck()) {
            var message = $("#<%= hfInvalidCheckDateMessage.ClientID %>").val();
            alert(message);
            e.preventDefault();
            $("#<%= txtAuthDateFrom.ClientID %>").focus();
         }
     });
    

    免责声明...不确定这是否是最佳路线,但它似乎运作良好。

    【讨论】:

    • 是的,我不喜欢将代码渲染块混合到 javascript 中。我想到的另一种选择是将资源文件键/值从 Web 服务加载为 json,然后根据需要查找值。
    【解决方案3】:

    我已经实现了此处描述的解决方案的修改版本:http://madskristensen.net/post/Localize-text-in-JavaScript-files-in-ASPNET.aspx

    如果需要,我通过更改正则表达式并使用HttpContext.GetGlobalResourceObject 方法检索资源字符串,将其更改为允许多个资源文件名。

    【讨论】:

      【解决方案4】:

      我使用这种技术。它使几乎没有编码经验的任何人都可以轻松编辑短语 JavaScript 文件。

      var lang = 0 // 0 = english, 1 = french
      var phrases=[]
      
      phrases["plans"] = "Rate Plans and Features|Forfaits et options").split("|")
      

      然后你将它输出为:

      phrases["plans"][lang]
      

      ...根据需要添加更多列。

      【讨论】:

      • 这里不太适合我,因为我想使用共享的 .net 资源文件。
      • 使用这种依赖于数组位置的方法并不是一个很好的做法。这导致代码不是很清晰。
      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多