带gettext的动态消息(AngularJS)

时间:2014-07-30 20:06:24

标签: django angularjs internationalization translation gettext

我有一个带Django后端和AngularJS前端的应用程序。 我使用angular-gettext plugin和Grunt来处理翻译。

问题是,我有时会通过API从后端收到动态字符串。例如,关于外键约束或重复键条目的MySQL错误。 如何将此字符串添加到.pot文件或非编码字符串中?

我试过跟随,但当然不能奏效:

 angular.module('app').factory('HttpInterceptor', ['$q', '$injector', '$rootScope', '$cookieStore', 'gettext', function ($q, $injector, $rootScope, $cookieStore, gettext) {

            responseError: function (rejection) {
                    gettext('static string'); //it works
                    gettext(rejection.data.error); //does not work
                    $rootScope.$emit('errorModal', rejection.data);
                }

                // Return the promise rejection.
                return $q.reject(rejection);
            }
        };
    }]);

})();

我能想到的一个解决方案是将每个动态字符串写入JSON对象。将此json发送到服务器并从那里写入包含这些字符串的静态文件,以便gettext可以提取它们。

你有什么建议?

1 个答案:

答案 0 :(得分:3)

我还使用angular-gettext并从服务器返回需要翻译的字符串。我们不喜欢为这些消息设置单独的翻译系统,所以我们用普通的默认语言发送它们。

为了实现这一点,我们做了两件事。我们在后端创建了一个函数,我们可以调用它来检索要翻译的所有可能的字符串。在我们的例子中,它主要是静态数据,只是偶尔会改变一次。理想情况下,这将是自动化的,但现在还可以。

该列表通过代码正确格式化为带有translate标签的html。此文件未部署,只是允许提取任务查找字符串。

其次,我们创建了一个过滤器来对插值进行翻译,因此如果它是foo的值,它将翻译{{foo}}而不是翻译bar。我们称之为postTranslate,这很简单:

angular
.module('app')
.filter('postTranslate', ['gettextCatalog', function (gettextCatalog) {
    return function (s) {
        return gettextCatalog.getString(s);
    };
}]);

对于 in 数据库中的东西,我们有另一个文件用于我们手动输入的文件。所以你的错误信息可能会在这里。

如果您只是担心错误,您可能会考虑不直接显示所有错误消息,而是确定要显示的用户友好错误消息。该用户友好的错误消息位于前端,因此可以避免所有其他问题:)