Web API の上に SPA アプリを構築して実験すると、問題が発生しました。私のプロジェクトでは、表示される情報をローカライズするために Resource.resx ファイルを使用しています。ビューを .cshtml 形式で作成する場合は問題ありませんが、Knockout テンプレートを使用すると、それらが .html であり、Resource.resx に直接アクセスできなくなるため、問題が発生します。
Web API からモデルと一緒にローカライズされた文字列を送信する、.cshtml ファイルで JavaScript 変数を作成し、.html でそれらにアクセスする、JavaScript ローカリゼーション ファイルを作成する (定数を含む、または.resx から値を取得します)。
これを回避する方法について何か良いアイデアはありますか?
編集:わかりました、私が考えることができる2つの最も実行可能な解決策は、次のように.cshtmlファイルにローカライズされた文字列を出力することです:
@functions{
public string LocalizedString()
{
return Resource.MyLocalizedString;
}
}
<input id="LocalizedString" type="hidden" value="@LocalizedString()" />
次に、jquery と入力の id を使用して値を取得します
$("#LocalizedString").val()
そのため、アプリケーション全体で参照できる localized.js ファイルを作成できます。
もう 1 つのオプションは、アプリケーションで必要な文字列の json リストを提供する wep API サービスを作成することです。
public HttpResponseMessage Get()
{
var localString = new Dictionary<string, string> {
{"FullName", Resource.ACC_FullName},
{"LastName", Resource.ACC_LastName},
{"FirstName", Resource.ACC_FirstName}
};
return Request.CreateResponse(HttpStatusCode.OK, localString);
}
witch はこの JSON を返します
{
fullName: "Fullt navn",
lastName: "Etternavn",
firstName: "Fornavn"
}
これは localstorage に保存できます(最初の質問はノックアウト関連であり、このコードはangularjsであることは知っていますが、ノックアウトを使用して同様の問題で実行できることは知っています)
gets(): void {
this.http({ method: 'GET', url: '/api/locals' }).
success(function (data, status, headers, config) {
angular.forEach(data, function (value, key) {
localStorage.setItem(key, value);
});
}).
error(function (data, status, headers, config) {
this.$log.warn(data, status, headers, config);
});
}
witch は、次を使用してページで使用できます
localStorage.getItem('Key')
編集: AngularJS の場合、組み込みの $http キャッシュを使用するだけで、非常にスマートです。
最初の解決策はおそらく DOM で変数をより速く利用できるようにするでしょう。もう1つの解決策はhtmlをクリーンアップしますが、値を取得するにはAPI呼び出しを行う必要があり、その呼び出しが返されるまで値は利用できません。魔女は、おそらく、そこにある値に依存するスクリプトの実行を、完了するまで遅らせる必要があることを意味します。しかし、応答はそれほど大きくはありません。合計でおそらく 50 ~ 100 個の文字列について話していることになります (少なくとも私のサイトでは)。
現在、私はまだこれらのソリューションを自分で実装したことがなく、それらが有効かどうかもわかりません。誰かが何かコメントやアイデアを持っているなら、私はそれらを聞きたい.