Skip to content

Commit 5e53d7b

Browse files
authored
fix(configure): use translations for failure summaries (#1808)
* fix(configure): use translations for failure summaries * make nl.json work for now
1 parent 72f0187 commit 5e53d7b

File tree

3 files changed

+177
-1
lines changed

3 files changed

+177
-1
lines changed

lib/core/base/audit.js

+69
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ Audit.prototype._setDefaultLocale = function() {
6262
const locale = {
6363
checks: {},
6464
rules: {},
65+
failureSummaries: {},
66+
incompleteFallbackMessage: '',
6567
lang: this.lang
6668
};
6769

@@ -87,6 +89,16 @@ Audit.prototype._setDefaultLocale = function() {
8789
locale.rules[id] = { description, help };
8890
}
8991

92+
const failureSummaries = Object.keys(this.data.failureSummaries);
93+
for (let i = 0; i < failureSummaries.length; i++) {
94+
const type = failureSummaries[i];
95+
const failureSummary = this.data.failureSummaries[type];
96+
const { failureMessage } = failureSummary;
97+
locale.failureSummaries[type] = { failureMessage };
98+
}
99+
100+
locale.incompleteFallbackMessage = this.data.incompleteFallbackMessage;
101+
90102
this._defaultLocale = locale;
91103
};
92104

@@ -178,6 +190,34 @@ const mergeRuleLocale = (a, b) => {
178190
};
179191
};
180192

193+
/**
194+
* Merge two failure messages (a, b), favoring `b`.
195+
*/
196+
197+
const mergeFailureMessage = (a, b) => {
198+
let { failureMessage } = b;
199+
// If the message(s) are Strings, they have not yet been run
200+
// thru doT (which will return a Function).
201+
if (typeof failureMessage === 'string') {
202+
failureMessage = axe.imports.doT.compile(failureMessage);
203+
}
204+
return {
205+
...a,
206+
failureMessage: failureMessage || a.failureMessage
207+
};
208+
};
209+
210+
/**
211+
* Merge two incomplete fallback messages (a, b), favoring `b`.
212+
*/
213+
214+
const mergeFallbackMessage = (a, b) => {
215+
if (typeof b === 'string') {
216+
b = axe.imports.doT.compile(b);
217+
}
218+
return b || a;
219+
};
220+
181221
/**
182222
* Apply locale for the given `checks`.
183223
*/
@@ -209,6 +249,24 @@ Audit.prototype._applyRuleLocale = function(rules) {
209249
}
210250
};
211251

252+
/**
253+
* Apply locale for the given failureMessage
254+
*/
255+
256+
Audit.prototype._applyFailureSummaries = function(messages) {
257+
const keys = Object.keys(messages);
258+
for (let i = 0; i < keys.length; i++) {
259+
const key = keys[i];
260+
if (!this.data.failureSummaries[key]) {
261+
throw new Error(`Locale provided for unknown failureMessage: "${key}"`);
262+
}
263+
this.data.failureSummaries[key] = mergeFailureMessage(
264+
this.data.failureSummaries[key],
265+
messages[key]
266+
);
267+
}
268+
};
269+
212270
/**
213271
* Apply the given `locale`.
214272
*
@@ -226,6 +284,17 @@ Audit.prototype.applyLocale = function(locale) {
226284
this._applyRuleLocale(locale.rules);
227285
}
228286

287+
if (locale.failureSummaries) {
288+
this._applyFailureSummaries(locale.failureSummaries, 'failureSummaries');
289+
}
290+
291+
if (locale.incompleteFallbackMessage) {
292+
this.data.incompleteFallbackMessage = mergeFallbackMessage(
293+
this.data.incompleteFallbackMessage,
294+
locale.incompleteFallbackMessage.undefined.failureMessage
295+
);
296+
}
297+
229298
if (locale.lang) {
230299
this.lang = locale.lang;
231300
}

locales/nl.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,9 @@
3232
"failureMessage": "Gebruik een van de volgende oplossingen:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
3333
}
3434
},
35-
"incompleteFallbackMessage": "axe kon de reden niet vertellen. Tijd om de element inspecteur uit te breken!"
35+
"incompleteFallbackMessage": {
36+
"undefined": {
37+
"failureMessage": "axe kon de reden niet vertellen. Tijd om de element inspecteur uit te breken!"
38+
}
39+
}
3640
}

test/core/public/configure.js

+103
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,97 @@ describe('axe.configure', function() {
361361
assert.equal(axe._audit.lang, 'lol');
362362
});
363363

364+
it('should update failure messages', function() {
365+
axe._load({
366+
data: {
367+
failureSummaries: {
368+
any: {
369+
failureMessage: function() {
370+
return 'failed any';
371+
}
372+
},
373+
none: {
374+
failureMessage: function() {
375+
return 'failed none';
376+
}
377+
}
378+
},
379+
incompleteFallbackMessage: function() {
380+
return 'failed incomplete';
381+
}
382+
}
383+
});
384+
385+
axe.configure({
386+
locale: {
387+
lang: 'lol',
388+
failureSummaries: {
389+
any: {
390+
failureMessage: 'foo'
391+
},
392+
none: {
393+
failureMessage: 'bar'
394+
}
395+
},
396+
incompleteFallbackMessage: {
397+
undefined: {
398+
failureMessage: 'baz'
399+
}
400+
}
401+
}
402+
});
403+
404+
var audit = axe._audit;
405+
var localeData = audit.data;
406+
407+
assert.equal(localeData.failureSummaries.any.failureMessage(), 'foo');
408+
assert.equal(localeData.failureSummaries.none.failureMessage(), 'bar');
409+
assert.equal(localeData.incompleteFallbackMessage(), 'baz');
410+
});
411+
412+
it('should merge failure messages', function() {
413+
axe._load({
414+
data: {
415+
failureSummaries: {
416+
any: {
417+
failureMessage: function() {
418+
return 'failed any';
419+
}
420+
},
421+
none: {
422+
failureMessage: function() {
423+
return 'failed none';
424+
}
425+
}
426+
},
427+
incompleteFallbackMessage: function() {
428+
return 'failed incomplete';
429+
}
430+
}
431+
});
432+
433+
axe.configure({
434+
locale: {
435+
lang: 'lol',
436+
failureSummaries: {
437+
any: {
438+
failureMessage: 'foo'
439+
}
440+
}
441+
}
442+
});
443+
444+
var audit = axe._audit;
445+
var localeData = audit.data;
446+
447+
assert.equal(localeData.failureSummaries.any.failureMessage(), 'foo');
448+
assert.equal(
449+
localeData.failureSummaries.none.failureMessage(),
450+
'failed none'
451+
);
452+
assert.equal(localeData.incompleteFallbackMessage(), 'failed incomplete');
453+
});
454+
364455
describe('only given checks', function() {
365456
it('should not error', function() {
366457
assert.doesNotThrow(function() {
@@ -507,6 +598,18 @@ describe('axe.configure', function() {
507598
}, /unknown check: "nope"/);
508599
});
509600

601+
it('should error when provided an unknown failure summary', function() {
602+
assert.throws(function() {
603+
axe.configure({
604+
locale: {
605+
failureSummaries: {
606+
nope: { failureMessage: 'helpme' }
607+
}
608+
}
609+
});
610+
});
611+
});
612+
510613
it('should set default locale', function() {
511614
assert.isNull(axe._audit._defaultLocale);
512615
axe.configure({

0 commit comments

Comments
 (0)