複数の言語/文化でイントラネットを使用するための大規模なASP.NETアプリケーションを構築しています。 RESXファイルを使用したグローバリゼーションを利用し、サーバー側でGetResourceTextを使用してローカライズされたテキストを取得します。
最近、JQueryを使用してクライアント側のロジックをますます実行しています。
RESXテキストをJavascriptで使用するにはどうすればよいですか?
すべてのJavascriptは.JSファイルに含まれているため、ASPXページとJavascriptブロックにHTMLを混在させたくありません。
ご協力いただきありがとうございます。
残念ながら、外部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ファイルに表示できます。
HTMLではなくJavascriptのみを出力する.aspxファイルを作成する別の回避策もあります。以下のリンクをチェックしてください:
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]);
}
});
機能を人間が読める文字列から常に分離します。
JQueryプラグインを作成している場合は、さまざまなjQuery関数を呼び出すときに、ローカライズされた文字列の配列をパラメーターとして渡すことができるはずです。配列は、さまざまなjQueryプラグインを呼び出すページで直接インラインJavaScriptとして定義することも、/scripts/localization/strings.js?ci=en-US
の形式で外部リソースからロードして 汎用ASP.Netハンドラー をWebに登録することもできます。 scripts/localization/strings.js
に応答する.config
DatePicker コントロールは、jQuery datepickコントロールのテキストをローカライズする方法の良い例です このjsファイル リソースファイル(resx)から動的に作成され、ページに含まれる場合カレンダーコントロールにデンマーク語のテキストが含まれるようにします。
ASP.NETを使用してメインのJavaScriptを生成したくない場合は、他に2つのオプションがあります。
ASP.NETを使用して、var mystring = 'my value';
などの変数から文字列への割り当てを含むスクリプトファイルを生成します。メインスクリプトは、埋め込まれた値としてではなく、変数名を使用してローカライズされたテキストを参照します。それでも「ダーティ」な場合は、文字列を変数割り当てではなくJSONとしてエンコードし、ストレート.aspx
ではなくHttpHandler
を使用できます。
JavaScriptコードにAjax呼び出しを発行させて、サーバーからローカライズされた文字列の配列またはリストを取得します。呼び出しのサーバー側の部分は、resxファイルからテキストを取得します。
$.ajax
をASP.NETWebMethodsと組み合わせて使用することを検討しましたか? JavaScript/jQueryがリソースをどのように消費/処理するかを理解せずに、この問題に対するより具体的な解決策を提案することは困難です。それらは論理グループに編成されている(またはそうなる可能性がある)と思います。そこでは、単一のページに属する複数のリソース文字列を返すことができます。
非常に単純なC#クラスを作成するか、Dictionary<string, string>
を使用して、ASP.NETWebMethodからデータを返すことができると仮定します。結果は次のようになります。
[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);
}
}
遅いことはわかっていますが、このタスクでの私の経験を共有したいと思います)
私はAjaxMinを使用しています。ビルドイベント時にresxキー値をjsファイルに挿入できます。これは一般的な方法ではありませんが、不要なスクリプトブロックなしでhtmlを保持し、必要に応じて縮小プロセス中に実行できます。
それはこのように動作します:
ajaxmin.exe test.js -RES:Strings resource.resx -o test.min.js
また、echロケールが多数ある場合は、同じことを行う必要があります。 js(およびcss)でリソースキーを書き込むための構文は次のとおりです。
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」と呼んで短くすることもできますが、これが私のアプローチです。文字列がたくさんある場合はこれが機能しない可能性がありますが、管理しやすい場合は機能する可能性があります。