AngularJS:如何在RestangularProvider错误拦截器中实现翻译?
解决方案
问题根源在于AngularJS的config阶段仅允许注入Provider类型服务,无法直接使用$filter这类实例服务,以下两种方案可解决该问题:
方法一:在config阶段通过$injector延迟获取翻译服务
修改你的配置函数,注入$injector后在拦截器中动态获取翻译服务:
export const config = ['RestangularProvider', '$injector', function (RestangularProvider, $injector) { // 响应拦截器 RestangularProvider.addResponseInterceptor(function (data, operation, what, url, response, deferred) { // 获取翻译过滤器(替换为你项目实际使用的过滤器名称,比如'translate') const translate = $injector.get('$filter')('translate'); handlerResponseStatus(response, translate); return data; }); // 错误拦截器 RestangularProvider.setErrorInterceptor(function (response, deferred, responseHandler) { const translate = $injector.get('$filter')('translate'); handlerResponseStatus(response, translate); return true; }); }];
更新handlerResponseStatus函数,接收翻译函数作为参数完成翻译:
function handlerResponseStatus(response, translate) { var message = ''; var type = 'info'; var title = translate('Request Info'); // 默认标题也做翻译 if (response.data && response.data.responseStatus) { if (response.data.responseStatus.message) { // 翻译后端返回的消息键 message = translate(response.data.responseStatus.message); } if (response.data.responseStatus.type) { type = response.data.responseStatus.type; } if (response.data.responseStatus.title) { // 翻译后端返回的标题键 title = translate(response.data.responseStatus.title); } events.publish('notify', { 'type': type, 'message': message, 'title': title, 'debug': response.data.requestDebug }); } }
如果你的项目使用angular-translate的$translate服务而非过滤器,可改为:
const $translate = $injector.get('$translate'); message = $translate.instant(response.data.responseStatus.message);
方法二:将拦截器配置移至run阶段
AngularJS的run阶段可直接注入实例服务,把拦截器配置移到此处更直观:
// 原config块仅保留Restangular基础配置(如baseUrl等) export const config = ['RestangularProvider', function (RestangularProvider) { // 此处添加Restangular基础配置 }]; // 新增run块配置拦截器 export const run = ['Restangular', '$filter', function(Restangular, $filter) { const translate = $filter('translate'); // 配置响应拦截器 Restangular.addResponseInterceptor(function (data, operation, what, url, response, deferred) { handlerResponseStatus(response, translate); return data; }); // 配置错误拦截器 Restangular.setErrorInterceptor(function (response, deferred, responseHandler) { handlerResponseStatus(response, translate); return true; }); }];
handlerResponseStatus函数的修改与方法一完全一致。
注意事项
- 确保后端返回的
message和title是翻译键而非原始文本,这样翻译服务才能匹配到对应语言包内容。 - 若翻译为异步加载模式,需调整逻辑等待翻译完成;错误场景下建议使用同步的
instant方法,或确保语言包已提前加载。
内容的提问来源于stack exchange,提问作者DirkKolbe
相关产品推荐
相关产品推荐

