本地化javascript消息和验证文本

时间:2009-06-12 16:17:59

标签: asp.net javascript jquery localization

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

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

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

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

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

  3. 每次发送消息时,都要进行网络服务调用,以便按键/语言获取正确的消息。

  4. 任何想法,经历?

    编辑:

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

4 个答案:

答案 0 :(得分:4)

好的,我构建了一个通用的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,否则在需要时将无法使用这些翻译。我正在尝试使用'get',所以我可以缓存响应,但它不适合我。看到这个问题:

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

答案 1 :(得分:3)

我之前已经完成了这个,其中隐藏字段的值设置在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();
     }
 });

免责声明 ...不确定这是否是最好的路线,但似乎确实有效。

答案 2 :(得分:2)

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

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

答案 3 :(得分:-1)

我使用这种技术。它使编码经验很少的任何人都可以轻松编辑JavaScript文件。

var lang = 0 // 0 = english, 1 = french
var phrases=[]

phrases["plans"] = "Rate Plans and Features|Forfaits et options").split("|")

然后输出为:

phrases["plans"][lang]

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