如何从Resx中获取文本以在Javascript中使用?

时间:2011-06-24 09:21:34

标签: javascript asp.net resx

我们正在构建大型ASP.NET应用程序,以便在多种语言/文化中使用Intranet。我们利用带有RESX文件的Globalization并在服务器端使用 GetResourceText 来获取本地化文本。

最近我们用JQuery做了越来越多的客户端逻辑。

如何在Javascript中使用RESX文本?

  • e.g。用于验证的文本,动态消息等。

我们所有的Javascripts都在.JS文件中,我们不想在ASPX页面和Javascript块中混合HTML。

感谢您的帮助。

7 个答案:

答案 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文件。请查看以下链接:

Using server side method in an external JavaScript file

答案 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,可以选择以下两个选项:

  1. 使用ASP.NET生成包含可变到字符串分配的脚本文件,例如var mystring = 'my value';。然后,您的主脚本将使用变量名称而不是嵌入值来引用本地化文本。如果那还是“肮脏的”#34;对于您来说,您可以使用HttpHandler而非直接.aspx将字符串编码为JSON而不是变量赋值。

  2. 让您的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)中写入资源键的语法写在这里:

Js localization

Css localization

答案 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”以缩短或缩短某些内容,但这是我的方法。如果你有一大堆字符串,也许这可能不起作用,但对于可管理的情况,这可能有效。