Breeze 如何在SPA中实现多语言

Breeze 如何在SPA中实现多语言,breeze,single-page-application,durandal,hottowel,Breeze,Single Page Application,Durandal,Hottowel,我目前正在一家水疗中心努力解决使用多种语言的问题 我提出了几种解决方案,比如为资源resx文件构建包装器,或者在数据库中保存所有标签,但我想知道你们是否找到了一些自动化这些步骤的解决方案 是否有针对此问题的特定实践?对于合理数量的文本,我建议将资源保存在DB或服务器的.RESX文件中。当用户登录或检测到将使用的语言时,应用程序会请求文本,并将其保存在翻译模块的集合或浏览器的本地存储中(这可能是处理大型数据的一种好方法)。 然后这个模块可以有一些方法来检索消息,可能传递一个密钥 使用此解决方案,您

我目前正在一家水疗中心努力解决使用多种语言的问题

我提出了几种解决方案,比如为资源resx文件构建包装器,或者在数据库中保存所有标签,但我想知道你们是否找到了一些自动化这些步骤的解决方案


是否有针对此问题的特定实践?

对于合理数量的文本,我建议将资源保存在DB或服务器的.RESX文件中。当用户登录或检测到将使用的语言时,应用程序会请求文本,并将其保存在翻译模块的集合或浏览器的本地存储中(这可能是处理大型数据的一种好方法)。 然后这个模块可以有一些方法来检索消息,可能传递一个密钥

使用此解决方案,您可以将此模块插入需要显示翻译文本的viewmodels中,并通过视图访问它们:

<p data-bind="text: resourceManager.get('M01')"></a>

对于需要传输大量本地化数据的大型应用程序,可能可以应用某种模块化,只加载每个模块/部分真正需要的资源

我不认为经常向服务器请求以获取翻译的文本是一种好的做法。SPA应该提供良好的用户体验,从服务器加载翻译的文本可能是一个阻塞问题。文本与图像不同,您可以在没有加载所有图像的情况下渲染页面,想象一下在没有文本的情况下渲染页面:o


无论如何,我认为最好的解决方案是将服务器保留为存储库,并创建一个自定义JS模块,该模块负责在一个或多个加载中获取数据,并能够将数据存储在客户端的某个位置。

我已经解决了自己的问题,使用了自定义绑定和i18next

首先,我已经实现了标签/按钮和其他资源的翻译

其次,我添加了一个定制的击倒bindingHandler:

ko.bindingHandlers.i18n = {
    init: function (element, valueAccessor) {        
        var translateKey = valueAccessor();
        ko.utils.setTextContent(element, $.t(translateKey));
    }
};
最后,您可以将以下代码添加到视图中:

<span data-bind="i18n : 'buttons.cancel'"></span>

这将自动获得正确的资源,而Knockout将处理绑定

希望这能帮助其他人解决同样的问题