2016-04-12 11 views
1

Ich habe eine API <> SPA-Architektur.Best Practice für die Behandlung von API-Fehlern mit Winkel translate

Aber ich weiß nicht genau wo Übersetzungen zu setzen, besonders wenn Fehler gesendet werden.

Ich hätte lieber nur übersetzten Text (i18n etc) in meiner eckigen App. Die API sollte nur englische Texte senden.

Aber ich weiß nicht, wie man

eine Fehlermeldung wie diese Stellen Sie sich vor: (NodeJS + restify)

server.get('/api/', function (req, res, next) { 
    return next(new server.errors.UnauthorizedError('You are not authorized')); 
}); 

Dies wird ein 401 mit json in Körper senden.

Wenn die API nur Englisch spricht, wie kann ich sie am besten im SPA übersetzen?

Wie kann ich dies zu setzen, eine dieser Übersetzung Ansätze:

<span>{{message | translate}}</span>

oder

<span>{{lang.message}}</span>

Natürlich habe ich die $ translateProvider bei Angular verwenden und haben eine Dateien lokalisieren mit Übersetzung darin.

Gibt es keinen anderen Weg, Sprachschlüssel zu senden? Wie folgt aus:

server.get('/api/', function (req, res, next) { 
    return next(new server.errors.UnauthorizedError('NOT_AUTHORIZED_ERROR')); 
}); 

Damit konnte ich habe eine locate-en.json Datei wie:

{ 
    errors: { 
     NOT_AUTHORIZED_ERROR: "You are not authorized" 
    } 
} 

ich diese Art von ungewöhnlich finden.

Antwort

1

Sie haben zwei Möglichkeiten: Entweder nehmen Sie an, dass Ihr Client alle Fehler kennt, die die API auslösen kann. Dies ist normalerweise nur der Fall, wenn sowohl die API als auch der Client vom selben Team implementiert werden. In diesem Fall lassen Sie Ihre API einen Fehler Objekt zurückgeben, das enthält einen Code:

{ 
    "code": "unauthorized", 
    "message": "some reason in english, usefull for debugging/logging" 
} 

Dann diesen Code verwenden, um die Fehler Client-Seite zu übersetzen:

<span>{{error.code | translate}}</span> 

Die zweite Möglichkeit ist, zu lassen Die API übersetzt die Fehlermeldung. Verwenden Sie diese Option, wenn die API ohne Wissen des Clients weiterentwickelt werden kann (und neue Fehler auslösen kann). In diesem Fall sind Sie natürlich auf die Sprachen beschränkt, die die API unterstützt.

+0

Danke für die Antwort. Sowohl Client als auch API werden vom selben Team entwickelt. Ich mag die zweite Option nicht, weil die API die Sprache des Clients kennen muss und ich Locate-Dateien an beiden Orten, Client und API implementieren muss. Leider muss ich solche Fehler mit restify erstellen: 'next (new server.errors.UnauthorizedError ({body: {code: 'mein_unerlaubter_code', nachricht: 'Sie sind nicht autorisiert'}})); ' Zusätzlich gibt es noch Mungo-Validierungsfehler, die ich ebenfalls behandeln muss: -/ – Stefan

+0

Die erste Option würde verwendet werden sei meine Vorliebe. Stellen Sie sicher, dass Sie einen Fallback für einen unbekannten Fehlercode haben, z. Implementieren Sie einen 'errorcodetranslate' Filter, der eine generische Fehlermeldung anzeigt, falls der Code unbekannt ist. – fikkatra

2

über den Umgang mit Code und Nachricht in $ translateProvider setzen dictonary und den Fehler aus dem lokalen Speicher lesen, wie folgt aus:

app.config(['$translateProvider', function ($translateProvider) { 
    $translateProvider.translations('en', { 
     error : 'messageEN' 
    }) 
    $translateProvider.translations('de', { 
     error : 'messageDE' 
    }) 
    $translateProvider.preferredLanguage('en'); 
    // remember language 
    $translateProvider.useLocalStorage(); 
}]);