Skip to content

Commit

Permalink
feat: support for Icelandic language
Browse files Browse the repository at this point in the history
* feat: add is (icelandic) locale

* feat: update is (icelandic) locale and add tests

* feat: add example for Icelandic locale in with-next-i18next

* feat: add translations for not_finite and datetime

* feat: add tests for datetime and finite and update translations for Icelandic locale

Co-authored-by: Hrafnkell Baldursson <[email protected]>
  • Loading branch information
hrafnkellbaldurs and hrafnkellb-advania authored Dec 13, 2022
1 parent 3c82e8a commit 074554d
Show file tree
Hide file tree
Showing 6 changed files with 378 additions and 1 deletion.
2 changes: 1 addition & 1 deletion examples/with-next-i18next/next-i18next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const path = require("path");
module.exports = {
i18n: {
defaultLocale: "en",
locales: ["en", "ja", "fr", "ar", "pt", "zh-CN"],
locales: ["en", "ja", "fr", "ar", "pt", "zh-CN", "is"],
},
localePath: path.resolve("./public/locales"),
interpolation: {
Expand Down
8 changes: 8 additions & 0 deletions examples/with-next-i18next/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@ export default function HookForm() {
>
简体中文
</Button>
<Button
variant={router.locale === "is" ? "outline" : "ghost"}
colorScheme="teal"
value="is"
onClick={changeLocale}
>
Icelandic
</Button>
</ButtonGroup>
<form onSubmit={handleSubmit(console.log)}>
<FormControl isInvalid={!!errors.username} mb={4}>
Expand Down
7 changes: 7 additions & 0 deletions examples/with-next-i18next/public/locales/is/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"User name": "Notendanafn",
"John Doe": "Jón Jónsson",
"Email": "Netfang",
"Favorite number": "Uppáhalds tala",
"Submit": "Senda"
}
102 changes: 102 additions & 0 deletions examples/with-next-i18next/public/locales/is/zod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
{
"errors": {
"invalid_type": "Bjóst við {{expected}}, fékk {{received}}",
"invalid_type_received_undefined": "Nauðsynlegt",
"invalid_literal": "Ógilt bókstaflegt gildi, bjóst við {{expected}}",
"unrecognized_keys": "Óþekktir lyklar í hlut: {{- keys}}",
"invalid_union": "Ógilt inntak",
"invalid_union_discriminator": "Ógilt mismununargildi. Bjóst við {{- options}}",
"invalid_enum_value": "Ógilt upptalningargildi. Bjóst við {{- options}}, fékk {{received}}",
"invalid_arguments": "Ógildar aðgerðarbreytur",
"invalid_return_type": "Ógild skilategund á falli",
"invalid_date": "Ógild dagsetning",
"custom": "Ógilt inntak",
"invalid_intersection_types": "Ekki var hægt að sameina niðurstöður",
"not_multiple_of": "Tala þarf að vera margfeldi af {{multipleOf}}",
"not_finite": "Tala þarf að vera endanleg",
"invalid_string": {
"email": "Ógilt {{validation}}",
"url": "Ógild {{validation}}",
"uuid": "Ógilt {{validation}}",
"cuid": "Ógilt {{validation}}",
"regex": "Ógilt",
"datetime": "Ógild {{validation}}",
"startsWith": "Ógilt inntak: þarf að byrja á {{startsWith}}",
"endsWith": "Ógilt inntak: þarf að enda á {{endsWith}}"
},
"too_small": {
"array": {
"inclusive": "Fylki verður að innihalda að minnsta kosti {{minimum}} stök",
"not_inclusive": "Fylki verður að innihalda fleiri en {{minimum}} stök"
},
"string": {
"inclusive": "Strengur verður að innihalda að minnsta kosti {{minimum}} stafi",
"not_inclusive": "Strengur verður að innihalda meira en {{minimum}} stafi"
},
"number": {
"inclusive": "Tala verður að vera stærri en eða jöfn {{minimum}}",
"not_inclusive": "Tala verður að vera stærri en {{minimum}}"
},
"set": {
"inclusive": "Ógilt inntak",
"not_inclusive": "Ógilt inntak"
},
"date": {
"inclusive": "Dagsetning verður að vera á eftir eða sama og {{- minimum, datetime}}",
"not_inclusive": "Dagsetning verður að vera á eftir {{- minimum, datetime}}"
}
},
"too_big": {
"array": {
"inclusive": "Fylki verður að innihalda að hámarki {{maximum}} stök",
"not_inclusive": "Fylki verður að innihalda færri en {{maximum}} stök"
},
"string": {
"inclusive": "Strengur getur ekki verið lengri en {{maximum}} stafir",
"not_inclusive": "Strengur verður að innihalda færri en {{maximum}} stafi"
},
"number": {
"inclusive": "Tala verður að vera minni en eða jöfn {{maximum}}",
"not_inclusive": "Tala verður að vera minni en {{maximum}}"
},
"set": {
"inclusive": "Ógilt inntak",
"not_inclusive": "Ógilt inntak"
},
"date": {
"inclusive": "Dagsetning verður að vera fyrr en eða sama og {{- maximum, datetime}}",
"not_inclusive": "Dagsetning verður að vera fyrr en {{- maximum, datetime}}"
}
}
},
"validations": {
"email": "netfang",
"url": "slóð",
"uuid": "uuid",
"cuid": "cuid",
"regex": "regluleg segð",
"datetime": "dagsetning og tími"
},
"types": {
"function": "fall",
"number": "tölu",
"string": "streng",
"nan": "nan",
"integer": "heiltölu",
"float": "kommutölu",
"boolean": "boolean",
"date": "dagsetningu",
"bigint": "stórri heiltölu",
"undefined": "undefined",
"symbol": "symbol",
"null": "null",
"array": "fylki",
"object": "hlut",
"unknown": "unknown",
"promise": "promise",
"void": "void",
"never": "never",
"map": "map",
"set": "set"
}
}
102 changes: 102 additions & 0 deletions packages/core/locales/is/zod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
{
"errors": {
"invalid_type": "Bjóst við {{expected}}, fékk {{received}}",
"invalid_type_received_undefined": "Nauðsynlegt",
"invalid_literal": "Ógilt bókstaflegt gildi, bjóst við {{expected}}",
"unrecognized_keys": "Óþekktir lyklar í hlut: {{- keys}}",
"invalid_union": "Ógilt inntak",
"invalid_union_discriminator": "Ógilt mismununargildi. Bjóst við {{- options}}",
"invalid_enum_value": "Ógilt upptalningargildi. Bjóst við {{- options}}, fékk {{received}}",
"invalid_arguments": "Ógildar aðgerðarbreytur",
"invalid_return_type": "Ógild skilategund á falli",
"invalid_date": "Ógild dagsetning",
"custom": "Ógilt inntak",
"invalid_intersection_types": "Ekki var hægt að sameina niðurstöður",
"not_multiple_of": "Tala þarf að vera margfeldi af {{multipleOf}}",
"not_finite": "Tala þarf að vera endanleg",
"invalid_string": {
"email": "Ógilt {{validation}}",
"url": "Ógild {{validation}}",
"uuid": "Ógilt {{validation}}",
"cuid": "Ógilt {{validation}}",
"regex": "Ógilt",
"datetime": "Ógild {{validation}}",
"startsWith": "Ógilt inntak: þarf að byrja á {{startsWith}}",
"endsWith": "Ógilt inntak: þarf að enda á {{endsWith}}"
},
"too_small": {
"array": {
"inclusive": "Fylki verður að innihalda að minnsta kosti {{minimum}} stök",
"not_inclusive": "Fylki verður að innihalda fleiri en {{minimum}} stök"
},
"string": {
"inclusive": "Strengur verður að innihalda að minnsta kosti {{minimum}} stafi",
"not_inclusive": "Strengur verður að innihalda meira en {{minimum}} stafi"
},
"number": {
"inclusive": "Tala verður að vera stærri en eða jöfn {{minimum}}",
"not_inclusive": "Tala verður að vera stærri en {{minimum}}"
},
"set": {
"inclusive": "Ógilt inntak",
"not_inclusive": "Ógilt inntak"
},
"date": {
"inclusive": "Dagsetning verður að vera á eftir eða sama og {{- minimum, datetime}}",
"not_inclusive": "Dagsetning verður að vera á eftir {{- minimum, datetime}}"
}
},
"too_big": {
"array": {
"inclusive": "Fylki verður að innihalda að hámarki {{maximum}} stök",
"not_inclusive": "Fylki verður að innihalda færri en {{maximum}} stök"
},
"string": {
"inclusive": "Strengur getur ekki verið lengri en {{maximum}} stafir",
"not_inclusive": "Strengur verður að innihalda færri en {{maximum}} stafi"
},
"number": {
"inclusive": "Tala verður að vera minni en eða jöfn {{maximum}}",
"not_inclusive": "Tala verður að vera minni en {{maximum}}"
},
"set": {
"inclusive": "Ógilt inntak",
"not_inclusive": "Ógilt inntak"
},
"date": {
"inclusive": "Dagsetning verður að vera fyrr en eða sama og {{- maximum, datetime}}",
"not_inclusive": "Dagsetning verður að vera fyrr en {{- maximum, datetime}}"
}
}
},
"validations": {
"email": "netfang",
"url": "slóð",
"uuid": "uuid",
"cuid": "cuid",
"regex": "regluleg segð",
"datetime": "dagsetning og tími"
},
"types": {
"function": "fall",
"number": "tölu",
"string": "streng",
"nan": "nan",
"integer": "heiltölu",
"float": "kommutölu",
"boolean": "boolean",
"date": "dagsetningu",
"bigint": "stórri heiltölu",
"undefined": "undefined",
"symbol": "symbol",
"null": "null",
"array": "fylki",
"object": "hlut",
"unknown": "unknown",
"promise": "promise",
"void": "void",
"never": "never",
"map": "map",
"set": "set"
}
}
158 changes: 158 additions & 0 deletions packages/core/tests/integrations/is.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import { test, expect, beforeAll } from "vitest";
import { z } from "zod";
import { init, getErrorMessage } from "./helpers";

beforeAll(async () => {
await init("is");
});

test("string parser error messages", () => {
const schema = z.string();

expect(getErrorMessage(schema.safeParse(undefined))).toEqual("Nauðsynlegt");
expect(getErrorMessage(schema.safeParse(1))).toEqual(
"Bjóst við streng, fékk tölu"
);
expect(getErrorMessage(schema.safeParse(true))).toEqual(
"Bjóst við streng, fékk boolean"
);
expect(getErrorMessage(schema.safeParse(Date))).toEqual(
"Bjóst við streng, fékk fall"
);
expect(getErrorMessage(schema.safeParse(new Date()))).toEqual(
"Bjóst við streng, fékk dagsetningu"
);
expect(getErrorMessage(schema.email().safeParse(""))).toEqual(
"Ógilt netfang"
);
expect(getErrorMessage(schema.url().safeParse(""))).toEqual("Ógild slóð");
expect(getErrorMessage(schema.regex(/aaa/).safeParse(""))).toEqual("Ógilt");
expect(getErrorMessage(schema.startsWith("foo").safeParse(""))).toEqual(
"Ógilt inntak: þarf að byrja á foo"
);
expect(getErrorMessage(schema.endsWith("bar").safeParse(""))).toEqual(
"Ógilt inntak: þarf að enda á bar"
);
expect(getErrorMessage(schema.min(5).safeParse("a"))).toEqual(
"Strengur verður að innihalda að minnsta kosti 5 stafi"
);
expect(getErrorMessage(schema.max(5).safeParse("abcdef"))).toEqual(
"Strengur getur ekki verið lengri en 5 stafir"
);
expect(
getErrorMessage(schema.datetime().safeParse("2020-01-01T00:00:00+02:00"))
).toEqual("Ógild dagsetning og tími");
});

test("number parser error messages", () => {
const schema = z.number();

expect(getErrorMessage(schema.safeParse(undefined))).toEqual("Nauðsynlegt");
expect(getErrorMessage(schema.safeParse(""))).toEqual(
"Bjóst við tölu, fékk streng"
);
expect(getErrorMessage(schema.safeParse(null))).toEqual(
"Bjóst við tölu, fékk null"
);
expect(getErrorMessage(schema.safeParse(NaN))).toEqual(
"Bjóst við tölu, fékk nan"
);
expect(getErrorMessage(schema.int().safeParse(0.1))).toEqual(
"Bjóst við heiltölu, fékk kommutölu"
);
expect(getErrorMessage(schema.multipleOf(5).safeParse(2))).toEqual(
"Tala þarf að vera margfeldi af 5"
);
expect(getErrorMessage(schema.lt(5).safeParse(10))).toEqual(
"Tala verður að vera minni en 5"
);
expect(getErrorMessage(schema.lte(5).safeParse(10))).toEqual(
"Tala verður að vera minni en eða jöfn 5"
);
expect(getErrorMessage(schema.gt(5).safeParse(1))).toEqual(
"Tala verður að vera stærri en 5"
);
expect(getErrorMessage(schema.gte(5).safeParse(1))).toEqual(
"Tala verður að vera stærri en eða jöfn 5"
);
expect(getErrorMessage(schema.positive().safeParse(0))).toEqual(
"Tala verður að vera stærri en 0"
);
expect(getErrorMessage(schema.finite().safeParse(Infinity))).toEqual(
"Tala þarf að vera endanleg"
);
});

test("date parser error messages", () => {
const schema = z.date();

expect(getErrorMessage(schema.safeParse("2022-12-01"))).toEqual(
"Bjóst við dagsetningu, fékk streng"
);

const testDate = new Date("2022-08-01");

expect(
getErrorMessage(schema.min(testDate).safeParse(new Date("2022-07-29")))
).toEqual(
`Dagsetning verður að vera á eftir eða sama og ${testDate.toLocaleDateString(
"is"
)}`
);
expect(
getErrorMessage(schema.max(testDate).safeParse(new Date("2022-08-02")))
).toEqual(
`Dagsetning verður að vera fyrr en eða sama og ${testDate.toLocaleDateString(
"is"
)}`
);
});

test("array parser error messages", () => {
const schema = z.string().array();

expect(getErrorMessage(schema.safeParse(""))).toEqual(
"Bjóst við fylki, fékk streng"
);

expect(getErrorMessage(schema.min(5).safeParse([""]))).toEqual(
"Fylki verður að innihalda að minnsta kosti 5 stök"
);
expect(getErrorMessage(schema.max(2).safeParse(["", "", ""]))).toEqual(
"Fylki verður að innihalda að hámarki 2 stök"
);
expect(getErrorMessage(schema.nonempty().safeParse([]))).toEqual(
"Fylki verður að innihalda að minnsta kosti 1 stök"
);
});

test("other parser error messages", () => {
expect(getErrorMessage(z.literal(12).safeParse(""))).toEqual(
"Ógilt bókstaflegt gildi, bjóst við 12"
);
expect(getErrorMessage(z.enum(["A", "B", "C"]).safeParse("D"))).toEqual(
"Ógilt upptalningargildi. Bjóst við 'A' | 'B' | 'C', fékk D"
);
expect(
getErrorMessage(
z
.object({ dog: z.string() })
.strict()
.safeParse({ dog: "", cat: "", rat: "" })
)
).toEqual("Óþekktir lyklar í hlut: 'cat', 'rat'");

expect(
getErrorMessage(
z
.discriminatedUnion("type", [
z.object({ type: z.literal("a"), a: z.string() }),
z.object({ type: z.literal("b"), b: z.string() }),
])
.safeParse({ type: "c", c: "abc" })
)
).toEqual("Ógilt mismununargildi. Bjóst við 'a' | 'b'");
expect(
getErrorMessage(z.union([z.string(), z.number()]).safeParse([true]))
).toEqual("Ógilt inntak");
});

1 comment on commit 074554d

@vercel
Copy link

@vercel vercel bot commented on 074554d Dec 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

zod-i18n – ./

zod-i18n.vercel.app
zod-i18n-git-main-aiji42.vercel.app
zod-i18n-aiji42.vercel.app

Please sign in to comment.