Skip to content

Commit

Permalink
fix(configure): use translations for failure summaries (#1808)
Browse files Browse the repository at this point in the history
* fix(configure): use translations for failure summaries

* make nl.json work for now
  • Loading branch information
straker committed Sep 25, 2019
1 parent 72f0187 commit 5e53d7b
Show file tree
Hide file tree
Showing 3 changed files with 177 additions and 1 deletion.
69 changes: 69 additions & 0 deletions lib/core/base/audit.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ Audit.prototype._setDefaultLocale = function() {
const locale = {
checks: {},
rules: {},
failureSummaries: {},
incompleteFallbackMessage: '',
lang: this.lang
};

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

const failureSummaries = Object.keys(this.data.failureSummaries);
for (let i = 0; i < failureSummaries.length; i++) {
const type = failureSummaries[i];
const failureSummary = this.data.failureSummaries[type];
const { failureMessage } = failureSummary;
locale.failureSummaries[type] = { failureMessage };
}

locale.incompleteFallbackMessage = this.data.incompleteFallbackMessage;

this._defaultLocale = locale;
};

Expand Down Expand Up @@ -178,6 +190,34 @@ const mergeRuleLocale = (a, b) => {
};
};

/**
* Merge two failure messages (a, b), favoring `b`.
*/

const mergeFailureMessage = (a, b) => {
let { failureMessage } = b;
// If the message(s) are Strings, they have not yet been run
// thru doT (which will return a Function).
if (typeof failureMessage === 'string') {
failureMessage = axe.imports.doT.compile(failureMessage);
}
return {
...a,
failureMessage: failureMessage || a.failureMessage
};
};

/**
* Merge two incomplete fallback messages (a, b), favoring `b`.
*/

const mergeFallbackMessage = (a, b) => {
if (typeof b === 'string') {
b = axe.imports.doT.compile(b);
}
return b || a;
};

/**
* Apply locale for the given `checks`.
*/
Expand Down Expand Up @@ -209,6 +249,24 @@ Audit.prototype._applyRuleLocale = function(rules) {
}
};

/**
* Apply locale for the given failureMessage
*/

Audit.prototype._applyFailureSummaries = function(messages) {
const keys = Object.keys(messages);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (!this.data.failureSummaries[key]) {
throw new Error(`Locale provided for unknown failureMessage: "${key}"`);
}
this.data.failureSummaries[key] = mergeFailureMessage(
this.data.failureSummaries[key],
messages[key]
);
}
};

/**
* Apply the given `locale`.
*
Expand All @@ -226,6 +284,17 @@ Audit.prototype.applyLocale = function(locale) {
this._applyRuleLocale(locale.rules);
}

if (locale.failureSummaries) {
this._applyFailureSummaries(locale.failureSummaries, 'failureSummaries');
}

if (locale.incompleteFallbackMessage) {
this.data.incompleteFallbackMessage = mergeFallbackMessage(
this.data.incompleteFallbackMessage,
locale.incompleteFallbackMessage.undefined.failureMessage
);
}

if (locale.lang) {
this.lang = locale.lang;
}
Expand Down
6 changes: 5 additions & 1 deletion locales/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,9 @@
"failureMessage": "Gebruik een van de volgende oplossingen:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
}
},
"incompleteFallbackMessage": "axe kon de reden niet vertellen. Tijd om de element inspecteur uit te breken!"
"incompleteFallbackMessage": {
"undefined": {
"failureMessage": "axe kon de reden niet vertellen. Tijd om de element inspecteur uit te breken!"
}
}
}
103 changes: 103 additions & 0 deletions test/core/public/configure.js
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,97 @@ describe('axe.configure', function() {
assert.equal(axe._audit.lang, 'lol');
});

it('should update failure messages', function() {
axe._load({
data: {
failureSummaries: {
any: {
failureMessage: function() {
return 'failed any';
}
},
none: {
failureMessage: function() {
return 'failed none';
}
}
},
incompleteFallbackMessage: function() {
return 'failed incomplete';
}
}
});

axe.configure({
locale: {
lang: 'lol',
failureSummaries: {
any: {
failureMessage: 'foo'
},
none: {
failureMessage: 'bar'
}
},
incompleteFallbackMessage: {
undefined: {
failureMessage: 'baz'
}
}
}
});

var audit = axe._audit;
var localeData = audit.data;

assert.equal(localeData.failureSummaries.any.failureMessage(), 'foo');
assert.equal(localeData.failureSummaries.none.failureMessage(), 'bar');
assert.equal(localeData.incompleteFallbackMessage(), 'baz');
});

it('should merge failure messages', function() {
axe._load({
data: {
failureSummaries: {
any: {
failureMessage: function() {
return 'failed any';
}
},
none: {
failureMessage: function() {
return 'failed none';
}
}
},
incompleteFallbackMessage: function() {
return 'failed incomplete';
}
}
});

axe.configure({
locale: {
lang: 'lol',
failureSummaries: {
any: {
failureMessage: 'foo'
}
}
}
});

var audit = axe._audit;
var localeData = audit.data;

assert.equal(localeData.failureSummaries.any.failureMessage(), 'foo');
assert.equal(
localeData.failureSummaries.none.failureMessage(),
'failed none'
);
assert.equal(localeData.incompleteFallbackMessage(), 'failed incomplete');
});

describe('only given checks', function() {
it('should not error', function() {
assert.doesNotThrow(function() {
Expand Down Expand Up @@ -507,6 +598,18 @@ describe('axe.configure', function() {
}, /unknown check: "nope"/);
});

it('should error when provided an unknown failure summary', function() {
assert.throws(function() {
axe.configure({
locale: {
failureSummaries: {
nope: { failureMessage: 'helpme' }
}
}
});
});
});

it('should set default locale', function() {
assert.isNull(axe._audit._defaultLocale);
axe.configure({
Expand Down

0 comments on commit 5e53d7b

Please sign in to comment.