You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:05:01