Skip to content

Commit debdee0

Browse files
martijn788Martijn Gaasbeek
andauthored
feat: added language specific default (#3501)
Co-authored-by: Martijn Gaasbeek <[email protected]>
1 parent 87df597 commit debdee0

File tree

6 files changed

+43
-4
lines changed

6 files changed

+43
-4
lines changed

packages/i18n/src/index.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,26 @@ class Dictionary {
2727
return this.format(this.locale, ctx);
2828
}
2929

30+
public getLocaleDefault(locale: string, field: string): string | ValidationMessageGenerator | undefined {
31+
return this.container[locale]?.fields?.[field]?._default || this.container[locale]?.messages?._default;
32+
}
33+
3034
public format(locale: string, ctx: FieldValidationMetaInfo) {
3135
let message!: ValidationMessageTemplate | undefined;
3236
const { field, rule, form } = ctx;
37+
const fieldName = this.container[locale]?.names?.[field] ?? field;
38+
3339
if (!rule) {
34-
return `${field} is not valid`;
40+
message = this.getLocaleDefault(locale, field) || `${field} is not valid`;
41+
return isCallable(message) ? message(ctx) : interpolate(message, { ...form, field: fieldName });
3542
}
3643

3744
// find if specific message for that field was specified.
3845
message = this.container[locale]?.fields?.[field]?.[rule.name] || this.container[locale]?.messages?.[rule.name];
3946
if (!message) {
40-
message = `${field} is not valid`;
47+
message = this.getLocaleDefault(locale, field) || 'field is not valid';
4148
}
4249

43-
const fieldName = this.container[locale]?.names?.[field] ?? field;
44-
4550
return isCallable(message)
4651
? message(ctx)
4752
: interpolate(message, { ...form, field: fieldName, params: rule.params });

packages/i18n/src/locale/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"code": "de",
33
"messages": {
4+
"_default": "{field} ist ungültig",
45
"alpha": "{field} darf nur alphabetische Zeichen enthalten",
56
"alpha_dash": "{field} darf alphanumerische Zeichen sowie Striche und Unterstriche enthalten",
67
"alpha_num": "{field} darf nur alphanumerische Zeichen enthalten",

packages/i18n/src/locale/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"code": "en",
33
"messages": {
4+
"_default": "The {field} is not valid",
45
"alpha": "The {field} field may only contain alphabetic characters",
56
"alpha_num": "The {field} field may only contain alpha-numeric characters",
67
"alpha_dash": "The {field} field may contain alpha-numeric characters as well as dashes and underscores",

packages/i18n/src/locale/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"code": "fr",
33
"messages": {
4+
"_default": "Le champ {field} est invalide",
45
"alpha": "Le champ {field} ne peut contenir que des lettres",
56
"alpha_num": "Le champ {field} ne peut contenir que des caractères alpha-numériques",
67
"alpha_dash": "Le champ {field} ne peut contenir que des caractères alpha-numériques, tirets ou soulignés",

packages/i18n/src/locale/nl.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"code": "nl",
33
"messages": {
4+
"_default": "{field} is ongeldig",
45
"alpha": "{field} mag alleen letters bevatten",
56
"alpha_dash": "{field} mag alleen letters, nummers, en streepjes bevatten",
67
"alpha_num": "{field} mag alleen letters en nummers bevatten",

packages/i18n/tests/index.spec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,36 @@ test('falls back to the default message if rule without message exists', async (
128128
expect(error.textContent).toContain('field is not valid');
129129
});
130130

131+
test('falls back to a language specific default message if rule without message exists', async () => {
132+
defineRule('i18n', () => false);
133+
configure({
134+
generateMessage: localize('nl', {
135+
messages: {
136+
_default: '{field} is ongeldig',
137+
},
138+
}),
139+
});
140+
setLocale('nl');
141+
142+
const wrapper = mountWithHoc({
143+
template: `
144+
<div>
145+
<Field name="field" rules="required|i18n" v-slot="{ field, errors }">
146+
<input v-bind="field" type="text">
147+
<span id="error">{{ errors[0] }}</span>
148+
</Field>
149+
</div>
150+
`,
151+
});
152+
153+
const error = wrapper.$el.querySelector('#error');
154+
const input = wrapper.$el.querySelector('input');
155+
setValue(input, '12');
156+
await flushPromises();
157+
158+
expect(error.textContent).toContain('field is ongeldig');
159+
});
160+
131161
test('can switch between locales with setLocale', async () => {
132162
configure({
133163
generateMessage: localize({

0 commit comments

Comments
 (0)