在 Web API 上尝试构建 SPA 应用程序时,我遇到了一个问题。 在我的项目中,我使用 Resource.resx 文件来本地化显示的信息。 当我以 .cshtml 格式创建 View 时,这不是问题,但当我使用 Knockout 模板时,我会遇到问题,因为它们是 .html,并且我无法再直接访问 Resource.resx。
我考虑了一些选项,包括从 Web API 发送本地化字符串和模型,在 .cshtml 文件中创建 javascript 变量并在 .html 中访问它们,以及创建一个 javascript 本地化文件(包含常量,或从 .resx 获取值)。
有人对如何解决这个问题有什么好主意吗?
编辑: 好的,我能想到的两个最可行的解决方案是在 .cshtml 文件中打印本地化字符串,如下所示:
@functions{
public string LocalizedString()
{
return Resource.MyLocalizedString;
}
}
<input id="LocalizedString" type="hidden" value="@LocalizedString()" />
然后使用 jquery 和输入的 id 获取值
$("#LocalizedString").val()
这样我就可以填充一个 localized.js 文件,我可以在整个应用程序中引用该文件。
另一个选项是创建一个 wep api 服务,该服务提供我的应用程序中所需的字符串的 json 列表。
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);
}
女巫会返回这个 JSON
{
fullName: "Fullt navn",
lastName: "Etternavn",
firstName: "Fornavn"
}
然后可以将其存储在本地存储中(我知道最初的问题与 knockout 相关,并且此代码是 angularjs,但我知道您可以使用 knockout 以类似的方式做到这一点)
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);
});
}
然后可以在页面上使用女巫
localStorage.getItem('Key')
编辑:对于 AngularJS,你可以利用 $http 内置缓存,非常聪明。
第一个解决方案可能会使 DOM 中的变量更快可用,至少在脚本执行时它们会在那里,但我不喜欢用不应该在那里的东西来弄乱我的 html。 另一个解决方案清理了 html,但我必须进行 api 调用来获取值,并且在返回该调用之前这些值将不可用。女巫意味着我可能需要延迟执行依赖于那里的值的脚本,直到它完成。但响应不会很大,我们总共讨论的可能是 50-100 个字符串(至少对于我的网站而言)。
现在,我自己还没有实现任何这些解决方案,我不知道它们是否有任何好处。因此,如果有人有任何意见或想法,我想听听。
最佳答案
我也遇到了类似的问题。由于我没有使用 Knockout.js 的经验,我不确定它是否对您有帮助。我的资源文件中有一个名为 Test 的字符串,我可以使用 cshtml 中的以下代码行将其显示在前端:
@Html.Raw(WmsWebMvcProto.Properties.Resources.Test)
关于javascript - Knockoutjs 模板文件和本地化 resx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17213782/