Skip to content

Commit 48d6448

Browse files
authored
Merge pull request #34 from ziyadonji/catalog-error-message
Add language support for getCatalogedErrorMessage
2 parents 2a30877 + 2f1fadb commit 48d6448

5 files changed

Lines changed: 166 additions & 7 deletions

File tree

lib/message-catalog-manager.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ MessageCatalogManager.prototype.getMessage = function (catalogName, code, namedI
236236

237237
};
238238

239-
MessageCatalogManager.prototype.getCatalogedErrorMessage = function (catalogedError) {
239+
MessageCatalogManager.prototype.getCatalogedErrorMessage = function (catalogedError, language) {
240240
if (catalogedError.inserts !== undefined && catalogedError.positionalInserts === undefined)
241241
{
242242
//Tolerate V0 style catalogedError
@@ -248,7 +248,7 @@ MessageCatalogManager.prototype.getCatalogedErrorMessage = function (catalogedEr
248248
// this could be a plain JSON serialisation of a pre v2.1 message, where the getter is not available
249249
messageCode = catalogedError.messageNumber;
250250
}
251-
let msg = this.getMessage(catalogedError.catalog,messageCode,catalogedError.namedInserts,catalogedError.positionalInserts);
251+
let msg = this.getMessage(catalogedError.catalog,messageCode,catalogedError.namedInserts,catalogedError.positionalInserts,language);
252252

253253
return msg;
254254
};

lib/middleware/errorMiddleware.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ const CatalogedError = require('../catalogedError.js');
1414
* @param {string} catalogIndex - path to message catalog file
1515
* @param {function} [preProcessorFunction] - optional function to transform a message before formatting it
1616
* the function can return either a {CatalogedError}, or a {Promise<CatalogedError>}
17+
* @param {string} [language] - optional language code (e.g., 'en', 'es', 'fr'). If not provided, will default to 'en'
1718
* @returns {function} - Express-compatible middleware function
1819
*/
19-
function formattingMiddleware (catalogIndex, preProcessorFunction){
20+
function formattingMiddleware (catalogIndex, preProcessorFunction, language){
2021
let catalogManager = new MessageCatalogManager(catalogIndex);
2122

2223
return function (req, res, next) {
@@ -35,7 +36,7 @@ function formattingMiddleware (catalogIndex, preProcessorFunction){
3536
// transformed data is then'able, treat as promise-to-data
3637
return transformedData
3738
.then(function (transformedData) {
38-
let formattedData = catalogManager.getCatalogedErrorMessage(transformedData);
39+
let formattedData = catalogManager.getCatalogedErrorMessage(transformedData, language);
3940
oldSend.call(_this, formattedData);
4041
})
4142
.catch(function() {
@@ -51,8 +52,8 @@ function formattingMiddleware (catalogIndex, preProcessorFunction){
5152
}
5253
}
5354

54-
//Format
55-
data = catalogManager.getCatalogedErrorMessage(data);
55+
//Format with language support
56+
data = catalogManager.getCatalogedErrorMessage(data, language);
5657
}
5758
}
5859
catch (err) {

test/catalogs/example/messages-fr.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"url": "https://github.com/IBM/message-catalog-manager/README.md"
66
},
77
"0002": {
8-
"message": "This is an example message with a special insert {id}, in french locale",
8+
"message": "This is an example message with special inserts {id} - {number} - {boolean}, in french locale",
99
"action": "Write a real message",
1010
"url": "https://github.com/IBM/message-catalog-manager/README.md"
1111
},

test/errorMiddleware-test.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,4 +285,112 @@ describe('formattingMiddleware', function () {
285285

286286

287287
});
288+
289+
describe('function with language parameter', function () {
290+
beforeEach(function () {
291+
res.statusCode = 400;
292+
});
293+
294+
it('formats message in English when language is "en"', function () {
295+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'en');
296+
var nextCalled = false;
297+
testMiddleware(req, res, function () {
298+
nextCalled = true;
299+
});
300+
assert.isTrue(nextCalled);
301+
var testError = new CatalogedError('0001', 'exampleLocal', 'Example error', {}, []);
302+
res.send(testError);
303+
assert(originalSendSpy.calledOnce, "Send should have been called once");
304+
var spyArg = originalSendSpy.getCall(0).args[0];
305+
expect(spyArg.message).to.equal('This is an example message');
306+
});
307+
308+
it('formats message in French when language is "fr"', function () {
309+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'fr');
310+
var nextCalled = false;
311+
testMiddleware(req, res, function () {
312+
nextCalled = true;
313+
});
314+
assert.isTrue(nextCalled);
315+
var testError = new CatalogedError('0001', 'exampleLocal', 'Example error', {}, []);
316+
res.send(testError);
317+
assert(originalSendSpy.calledOnce, "Send should have been called once");
318+
var spyArg = originalSendSpy.getCall(0).args[0];
319+
expect(spyArg.message).to.equal('This is an example message for french catalog');
320+
});
321+
322+
it('formats message in German when language is "de"', function () {
323+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'de');
324+
var nextCalled = false;
325+
testMiddleware(req, res, function () {
326+
nextCalled = true;
327+
});
328+
assert.isTrue(nextCalled);
329+
var testError = new CatalogedError('0002', 'exampleLocal', 'Example error', {id: 'test-id'}, []);
330+
res.send(testError);
331+
assert(originalSendSpy.calledOnce, "Send should have been called once");
332+
var spyArg = originalSendSpy.getCall(0).args[0];
333+
expect(spyArg.message).to.equal('This is an example message with a special insert test-id, in german locale');
334+
});
335+
336+
it('formats message in Japanese when language is "jp"', function () {
337+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'jp');
338+
var nextCalled = false;
339+
testMiddleware(req, res, function () {
340+
nextCalled = true;
341+
});
342+
assert.isTrue(nextCalled);
343+
var testError = new CatalogedError('0001', 'exampleLocal', 'Example error', {}, []);
344+
res.send(testError);
345+
assert(originalSendSpy.calledOnce, "Send should have been called once");
346+
var spyArg = originalSendSpy.getCall(0).args[0];
347+
expect(spyArg.message).to.equal('This is an example message for japanese catalog');
348+
});
349+
350+
it('falls back to English when language is not available', function () {
351+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'es');
352+
var nextCalled = false;
353+
testMiddleware(req, res, function () {
354+
nextCalled = true;
355+
});
356+
assert.isTrue(nextCalled);
357+
var testError = new CatalogedError('0001', 'exampleLocal', 'Example error', {}, []);
358+
res.send(testError);
359+
assert(originalSendSpy.calledOnce, "Send should have been called once");
360+
var spyArg = originalSendSpy.getCall(0).args[0];
361+
expect(spyArg.message).to.equal('This is an example message');
362+
});
363+
364+
it('falls back to English for message not in specified language', function () {
365+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', null, 'de');
366+
var nextCalled = false;
367+
testMiddleware(req, res, function () {
368+
nextCalled = true;
369+
});
370+
assert.isTrue(nextCalled);
371+
var testError = new CatalogedError('0004', 'exampleLocal', 'Example error', {}, []);
372+
res.send(testError);
373+
assert(originalSendSpy.calledOnce, "Send should have been called once");
374+
var spyArg = originalSendSpy.getCall(0).args[0];
375+
expect(spyArg.message).to.equal('This is a message only in the default catalog');
376+
});
377+
378+
it('works with pre-processor and language parameter', function () {
379+
var preProcessorStub = sinon.stub().callsFake(function (msg) {
380+
var newMsg = JSON.parse(JSON.stringify(msg));
381+
newMsg.namedInserts.id = 'transformed-with-lang';
382+
return newMsg;
383+
});
384+
testMiddleware = formattingMiddleware(__dirname + '/catalog-index.json', preProcessorStub, 'de');
385+
var nextStub = sinon.stub();
386+
testMiddleware(req, res, nextStub);
387+
expect(nextStub).to.have.callCount(1);
388+
var testError = new CatalogedError('0002', 'exampleLocal', 'Example error', {id: 'original-id'}, []);
389+
res.send(testError);
390+
expect(preProcessorStub).to.have.callCount(1);
391+
expect(originalSendSpy).to.have.callCount(1);
392+
var sentFormattedMessage = originalSendSpy.getCall(0).args[0];
393+
expect(sentFormattedMessage.message).to.equal('This is an example message with a special insert transformed-with-lang, in german locale');
394+
});
395+
});
288396
});

test/message-catalog-manager-test.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,56 @@ describe('MessageCatalogManager', function () {
202202
var message = MC.getCatalogedErrorMessage(catalogedError);
203203
expect(message.message).to.equal("This is an example message with positional inserts 1 2 3 4");
204204
});
205+
it('returns a message in English when language is "en"', function() {
206+
var messageText = "Test Error";
207+
var catalogedError = new CatalogedError('0001','exampleLocal', messageText);
208+
var message = MC.getCatalogedErrorMessage(catalogedError, 'en');
209+
expect(message.message).to.equal('This is an example message');
210+
expect(message.action).to.equal('Write a real message');
211+
});
212+
it('returns a message in French when language is "fr"', function() {
213+
var messageText = "Test Error";
214+
var catalogedError = new CatalogedError('0001','exampleLocal', messageText);
215+
var message = MC.getCatalogedErrorMessage(catalogedError, 'fr');
216+
expect(message.message).to.equal('This is an example message for french catalog');
217+
});
218+
it('returns a message in German when language is "de"', function() {
219+
var messageText = "Test Error";
220+
var catalogedError = new CatalogedError('0002','exampleLocal', messageText, {id: 'test-id'});
221+
var message = MC.getCatalogedErrorMessage(catalogedError, 'de');
222+
expect(message.message).to.equal('This is an example message with a special insert test-id, in german locale');
223+
});
224+
it('returns a message in Japanese when language is "jp"', function() {
225+
var messageText = "Test Error";
226+
var catalogedError = new CatalogedError('0001','exampleLocal', messageText);
227+
var message = MC.getCatalogedErrorMessage(catalogedError, 'jp');
228+
expect(message.message).to.equal('This is an example message for japanese catalog');
229+
});
230+
it('falls back to English when language is not available', function() {
231+
var messageText = "Test Error";
232+
var catalogedError = new CatalogedError('0001','exampleLocal', messageText);
233+
var message = MC.getCatalogedErrorMessage(catalogedError, 'es');
234+
expect(message.message).to.equal('This is an example message');
235+
});
236+
it('falls back to English for message not in specified language', function() {
237+
var messageText = "Test Error";
238+
var catalogedError = new CatalogedError('0004','exampleLocal', messageText);
239+
var message = MC.getCatalogedErrorMessage(catalogedError, 'de');
240+
expect(message.message).to.equal('This is a message only in the default catalog');
241+
});
242+
it('returns a message with inserts in specified language', function() {
243+
var messageText = "Test Error with inserts";
244+
var messageInserts = ['eins', '2', 'drei'];
245+
var catalogedError = new CatalogedError('0003','exampleLocal', messageText, {}, messageInserts);
246+
var message = MC.getCatalogedErrorMessage(catalogedError, 'de');
247+
expect(message.message).to.equal("This is an example message with positional inserts eins 2 drei, in german locale");
248+
});
249+
it('returns a message with named inserts in specified language', function() {
250+
var messageText = "Test Error with named inserts";
251+
var catalogedError = new CatalogedError('0002','exampleLocal', messageText, {id: 'test-id-fr', number: 42, boolean: true});
252+
var message = MC.getCatalogedErrorMessage(catalogedError, 'fr');
253+
expect(message.message).to.equal('This is an example message with special inserts test-id-fr - 42 - true, in french locale');
254+
});
205255
});
206256

207257
describe('applyInserts', function () {

0 commit comments

Comments
 (0)