我们正在构建大型ASP.NET应用程序,以便在多种语言/文化中使用Intranet。我们利用带有RESX文件的Globalization并在服务器端使用 GetResourceText 来获取本地化文本。
最近我们用JQuery做了越来越多的客户端逻辑。
如何在Javascript中使用RESX文本?
我们所有的Javascripts都在.JS文件中,我们不想在ASPX页面和Javascript块中混合HTML。
感谢您的帮助。
答案 0 :(得分:6)
不幸的是,在外部JS文件中,服务器未处理服务器端代码。但是我看到了一种解决方法,您可以在页面上的隐藏字段中设置翻译的值 - 这样您的javascript就能够读取其中的值。
例如:
<%-- This goes into your page --%>
<input type="hidden" id="translatedField" name="translatedField" value="<%=Resources.Resources.translatedText %>" />
并在您的javascript文件中使用:
// This is the js file
$(document).ready(function() {
alert($("#translatedField").attr("value"));
});
您将能够分离这些值,并仍然可以在外部JS文件中看到它。
还有另一种解决方法是创建一个只输出Javascript而不是HTML的.aspx文件。请查看以下链接:
答案 1 :(得分:2)
始终将功能与人类可读字符串分开。
如果你正在创建jQuery-plugins,那么在调用不同的jQuery函数时,你应该能够将一组本地化字符串作为参数传递。可以在调用不同jQuery插件的页面上直接将数组定义为内联javascript,也可以以/scripts/localization/strings.js?ci=en-US
格式加载外部资源,并在web.config中注册Generic ASP.Net Handler,以响应{ {1}}
DatePicker控件是如何本地化jQuery datepick控件的文本的一个很好的例子 - this js file是从资源文件(resx)动态创建的,当它包含在页面上时,它将确保日历控件将有丹麦文本。
答案 2 :(得分:2)
创建一个HttpHandler(.ashx文件),并返回带有文本资源字符串的JSON。
您也可以将其“发布”到全局命名空间,即
Response.Write("window.Resources=");
Response.Write((new JavaScriptSerializer()).Serialize(strings));
设置HTML,如:
<script src="Resx.ashx?lang=en-US" />
<button class="LogoutButtonResourceId OtherButtonClasses">(generic logout text)</button>
<a href="#"><span class="SomeLinkTextResourceId OtherClasses">
(generic link text)
</span></a>
并应用以下文字:
$(document).ready(function() {
for(var resId in Resources){
$("."+resId).html(Resources[resId]);
}
});
答案 3 :(得分:0)
如果您不想使用ASP.NET生成主JavaScript,可以选择以下两个选项:
使用ASP.NET生成包含可变到字符串分配的脚本文件,例如var mystring = 'my value';
。然后,您的主脚本将使用变量名称而不是嵌入值来引用本地化文本。如果那还是“肮脏的”#34;对于您来说,您可以使用HttpHandler
而非直接.aspx
将字符串编码为JSON而不是变量赋值。
让您的JavaScript代码发出Ajax调用,以从服务器检索数组或本地化字符串列表。调用的服务器端部分将从resx文件中检索文本。
答案 4 :(得分:0)
您是否考虑过将$.ajax
与ASP.NET WebMethods结合使用?如果不了解JavaScript / jQuery如何使用/处理资源,很难为这个问题提出更具体的解决方案。我假设它们被组织成逻辑组(或可能),您可以返回属于单个页面的多个资源字符串。
假设您可以编写一个非常简单的C#类 - 或使用Dictionary<string, string>
- 从ASP.NET WebMethod返回数据。结果看起来像:
[WebMethod]
public Dictionary<string, string> GetPageResources(string currentPage)
{
// ... Organizational stuff goes here.
}
我总是把我的AJAX调用分成单独的.js文件/对象;看起来像是:
function GetPageResources (page, callback)
$.ajax({ // Setup the AJAX call to your WebMethod
data: "{ 'currentPage':'" + page + "' }",
url: /Ajax/Resources.asmx/GetPageResources, // Or similar.
success: function (result) { // To be replaced with .done in jQuery 1.8
callback(result.d);
}
});
然后,在页面上执行的.js中,您应该能够使用以下数据:
// Whatever first executes when you load a page and its JS files
// -- I assume that you aren't using something like $(document).ready(function () {});
GetPageResources(document.location, SetPageResources);
function SetPageResources(resources) {
for (currentResource in resources) {
$("#" + currentResource.Key).html(currentResource.Value);
}
}
答案 5 :(得分:0)
我知道这是为时已晚,但希望分享我在此任务中的经验)
我使用AjaxMin。它可以在构建事件中将resx键值插入js文件中。 这不是常见的方式,但它保留了html而没有不需要的脚本块,如果你有它,可以在缩小过程中完成。
它的工作原理如下:
ajaxmin.exe test.js -RES:Strings resource.resx -o test.min.js
如果你有很多,你也需要为ech语言环境做同样的事情。 在js(以及css)中写入资源键的语法写在这里:
答案 6 :(得分:0)
如何将其作为javascript控件初始化的一部分注入?我的工作如下:
我有一个自包含的javascript控件 - 称之为CRMControl,它有一个名为setupCRMControl的init方法,我传递了一个设置对象。当我初始化它时,我传递一个包含我在javascript中需要的所有资源的对象,如下所示:
CRMControl.setupCRMControl({
numOfCRMs: 3,
maxNumOfItems: 10,
// then i pass a resources object with the strings i need inside
Resources: {
Cancel: '@Resources.Cancel',
Done: '@Resources.Done',
Title: '@Resources.Title'
}
});
然后,在这个javascript控件里面:
var crmSettings = {};
this.setupCRMControl(settings) {
crmSettings = settings;
};
每当我想要显示资源时,我说(例如,显示一个警告说'完成'):
alert(crmSettings.Resources.Done);
您可以将其称为“R”以缩短或缩短某些内容,但这是我的方法。如果你有一大堆字符串,也许这可能不起作用,但对于可管理的情况,这可能有效。