Skip to content

Commit 907aed7

Browse files
authored
Feature/localization (#38)
* Added localization
1 parent fef4054 commit 907aed7

File tree

11 files changed

+111
-10
lines changed

11 files changed

+111
-10
lines changed

__tests__/suits/Validator.test.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,23 @@ describe('test validator', () => {
149149
await validator.validate();
150150

151151
expect(validator.getErrors()[0]).toBe('Value is false negative required');
152-
})
152+
});
153+
154+
it('should change locale if it exists', () => {
155+
const messages = {
156+
test: {
157+
foo: 'bar'
158+
}
159+
};
160+
161+
Validator.setLocale('test', messages);
162+
163+
expect(Validator.getLocale()).toBe('test');
164+
});
165+
166+
it('should default to en if changing to an non-existing locale', () => {
167+
Validator.setLocale('not_existing');
168+
169+
expect(Validator.getLocale()).toBe('en');
170+
});
153171
});

src/LocaleMessages.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type LocaleMessages = Record<string, string>;
2+
3+
export type LocaleMessagesMap = Record<string, LocaleMessages>;

src/Validator.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import {
33
createIntlCache,
44
IntlCache,
55
IntlShape
6-
} from '@formatjs/intl'
6+
} from '@formatjs/intl';
77
import { Rule, RuleFunction, RuleObject } from './Rule';
88
import { RuleOptions } from './RuleOptions';
9-
import { capitalize } from './common/utils';
109
import { ValidatorArea } from './components/ValidatorArea';
1110
import required from './rules/required';
1211
import { getValue, isCanvasElement } from './common/dom';
12+
import { LocaleMessagesMap } from './LocaleMessages';
13+
import { capitalize } from './common/utils';
14+
import en from './locale/en';
1315

1416
export class Validator {
1517
public static VALIDATABLE_ELEMENTS: string[] = [
@@ -63,6 +65,16 @@ export class Validator {
6365
*/
6466
private validationName?: string;
6567

68+
/**
69+
* The active locale
70+
*/
71+
private static locale = 'en';
72+
73+
/**
74+
* Map with messages keyed with locales, containing EN as default
75+
*/
76+
private static messages: LocaleMessagesMap = en;
77+
6678
public constructor(
6779
elements: HTMLElement[],
6880
rules: RuleOptions,
@@ -83,7 +95,8 @@ export class Validator {
8395
*/
8496
private createIntl(): IntlShape<string> {
8597
return createIntl({
86-
locale: 'en'
98+
locale: Validator.locale,
99+
messages: Validator.messages[Validator.locale]
87100
}, this.intlCache);
88101
}
89102

@@ -252,4 +265,42 @@ export class Validator {
252265
public static ruleExists(name: string): boolean {
253266
return Object.prototype.hasOwnProperty.call(Validator.rules, name);
254267
}
268+
269+
public static hasLocale(locale: string): boolean {
270+
return !!Object.prototype.hasOwnProperty.call(Validator.messages, locale);
271+
}
272+
273+
/**
274+
* Adds a locale map to the messages map, keyed by locale
275+
*/
276+
public static addLocale(messages: LocaleMessagesMap): void {
277+
Validator.messages = {
278+
...Validator.messages,
279+
...messages
280+
};
281+
}
282+
283+
/**
284+
* Sets the given locale for all the new created validator instance or defaults to English if the locale does not
285+
* exist
286+
*/
287+
public static setLocale(locale: string, messages?: LocaleMessagesMap): void {
288+
if (!messages) {
289+
if (Validator.hasLocale(locale)) {
290+
Validator.locale = locale;
291+
} else {
292+
Validator.locale = 'en';
293+
}
294+
} else {
295+
Validator.addLocale(messages);
296+
Validator.setLocale(locale);
297+
}
298+
}
299+
300+
/**
301+
* Gets the current locale of the validator
302+
*/
303+
public static getLocale(): string {
304+
return Validator.locale;
305+
}
255306
}

src/locale/en.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { LocaleMessagesMap } from '../LocaleMessages';
2+
3+
const en: LocaleMessagesMap = {
4+
en: {
5+
activeUrl: '{name} is not an active url',
6+
checked: '{name} is not checked',
7+
max: '{name} should be not greater than {0}',
8+
min: '{name} should be at least {0}',
9+
regex: '{name} doesn\'t have a valid format',
10+
required: '{name} is required'
11+
}
12+
}
13+
14+
export default en;

src/locale/nl.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { LocaleMessagesMap } from '../LocaleMessages';
2+
3+
const nl: LocaleMessagesMap = {
4+
nl: {
5+
activeUrl: '{} is geen actieve URL',
6+
checked: '{name} is niet aangevinkt.',
7+
max: '{name} max niet meer zijn dan {0}',
8+
min: '{name} moet minstens {0} zijn',
9+
regex: '{name} heeft geen geldig formaat',
10+
required: '{name} is verplicht'
11+
}
12+
}
13+
14+
export default nl;
15+

src/rules/activeUrl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ export default {
2929
.length;
3030
},
3131
message(): string {
32-
return 'Not an active url'
32+
return 'activeUrl';
3333
}
3434
}

src/rules/checked.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ export default {
2828
})
2929
},
3030
message(): string {
31-
return '{name} is not checked.';
31+
return 'checked';
3232
}
3333
};

src/rules/max.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ export default {
3434
})
3535
},
3636
message(): string {
37-
return `{name} should be not greater than {0}`
37+
return 'max';
3838
}
3939
};

src/rules/min.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ export default {
3434
})
3535
},
3636
message(): string {
37-
return `{name} should be at least {0}`
37+
return 'min';
3838
}
3939
};

src/rules/regex.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ export default {
1616
})
1717
},
1818
message(): string {
19-
return '{name} heeft een ongeldig formaat';
19+
return 'regex';
2020
}
2121
}

0 commit comments

Comments
 (0)