Fix #5112, translator now accepts keys with `/` (#5114)

v1.18.x
Peter Jaszkowiak 8 years ago committed by Julian Lam
parent ea1696eaec
commit f519a36560

@ -62,6 +62,11 @@
* @returns {Promise<string>}
*/
Translator.prototype.translate = function translate(str) {
// regex for valid text in namespace / key
var validText = 'a-zA-Z0-9\\-_.\\/';
var validTextRegex = new RegExp('[' + validText + ']');
var invalidTextRegex = new RegExp('[^' + validText + '\\]]');
// current cursor position
var cursor = 0;
// last break of the input string
@ -120,6 +125,7 @@
// the current level of nesting of the translation strings
var level = 0;
var sliced;
// validating the current string is actually a translation
var textBeforeColonFound = false;
var colonFound = false;
var textAfterColonFound = false;
@ -129,7 +135,7 @@
sliced = str.slice(cursor, cursor + 2);
// found some text after the double bracket,
// so this is probably a translation string
if (!textBeforeColonFound && sliced[0].match(/[a-zA-Z0-9\-_]/)) {
if (!textBeforeColonFound && validTextRegex.test(sliced[0])) {
textBeforeColonFound = true;
cursor += 1;
// found a colon, so this is probably a translation string
@ -138,7 +144,7 @@
cursor += 1;
// found some text after the colon,
// so this is probably a translation string
} else if (colonFound && !textAfterColonFound && sliced[0].match(/[a-zA-Z0-9\-_]/)) {
} else if (colonFound && !textAfterColonFound && validTextRegex.test(sliced[0])) {
textAfterColonFound = true;
cursor += 1;
} else if (textAfterColonFound && !commaAfterNameFound && sliced[0] === ',') {
@ -147,7 +153,7 @@
// a space or comma was found before the name
// this isn't a translation string, so back out
} else if (!(textBeforeColonFound && colonFound && textAfterColonFound && commaAfterNameFound) &&
sliced[0].match(/[^a-zA-Z0-9\-_.\]]/)) {
invalidTextRegex.test(sliced[0])) {
cursor += 1;
lastBreak -= 2;
if (level > 0) {
@ -255,11 +261,8 @@
if (!namespace) {
console.warn('[translator] Parameter `namespace` is ' + namespace + (namespace === '' ? '(empty string)' : ''));
translation = Promise.resolve({});
} else if (this.translations[namespace]) {
translation = this.translations[namespace];
} else {
translation = this.load(this.lang, namespace);
this.translations[namespace] = translation;
translation = this.translations[namespace] = this.translations[namespace] || this.load(this.lang, namespace);
}
if (key) {

@ -158,7 +158,7 @@ describe('new Translator(language)', function (){
it('should translate [[pages:users/latest]] properly', function (done) {
var translator = new Translator('en_GB');
translator.translate('[[pages:users/latest]]').then(function (translated) {
assert.strictEqual('[[pages:users/latest]]', 'Latest Users');
assert.strictEqual(translated, 'Latest Users');
done();
});
});

Loading…
Cancel
Save