我正在开发一个多语言的网络项目。例如,项目的一部分涉及一些自定义谷歌映射,利用客户端interace使用jquery / .net将点添加到地图并将其保存到数据库。
将有一些必须进行本地化的验证和其他信息性消息(例如,“请在地图中添加至少一个点”)。
我现在能想到的唯一选择是:
在javascript中使用代码渲染块从资源文件中提取本地化消息
使用带有meta:resourcekey的隐藏字段,使用当前文化自动从资源文件中获取正确的本地化消息,并在必要时在jquery中获取.val()。
每次发送消息时,都要进行网络服务调用,以便按键/语言获取正确的消息。
任何想法,经历?
编辑:
我更喜欢使用.net资源文件来保持与应用程序的其余部分保持一致。
答案 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]
...根据需要添加更多列。