Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
5a7c373
feat(lang): Add Arabic locale support
Abdalrhman-Almarakeby Apr 16, 2025
42bb7f0
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
9c90710
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
b09cda6
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
9a437fb
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
b6d7c77
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
9cab990
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
f0559d6
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
1f54f0c
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
5737fbc
remove period
Abdalrhman-Almarakeby Apr 16, 2025
69aa8cd
fix: add space after comparison operator
Abdalrhman-Almarakeby Apr 16, 2025
9cf2c88
feat(lang): Add Arabic locale support
Abdalrhman-Almarakeby Apr 16, 2025
5028645
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
871edb0
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
62912ab
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
ff3b4b8
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
71840d0
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
475472e
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
4a33f79
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
585cb56
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 16, 2025
98f8d28
remove period
Abdalrhman-Almarakeby Apr 16, 2025
33bb8a0
fix: add space after comparison operator
Abdalrhman-Almarakeby Apr 16, 2025
97fc2c7
Tweak
colinhacks Apr 16, 2025
270dd56
Merge branch 'feat/arabic-language' of https://github.com/Abdalrhman-…
Abdalrhman-Almarakeby Apr 17, 2025
98aec74
Updated ar.ts with new edits discussed in #4176
hAbuMustafa Apr 18, 2025
0d2855e
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 21, 2025
56228a1
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 21, 2025
9fac08e
Update packages/core/src/locales/ar.ts
Abdalrhman-Almarakeby Apr 21, 2025
3538f12
Merge pull request #1 from hAbuMustafa/patch-1
Abdalrhman-Almarakeby Apr 21, 2025
2df796d
chore: format
Abdalrhman-Almarakeby Apr 21, 2025
15b3de5
fix: update translation for template_literal
Abdalrhman-Almarakeby Apr 21, 2025
34fafd5
fix: correct translation for invalid input error message
Abdalrhman-Almarakeby Apr 21, 2025
e5a6989
fix: spacing in error messages
Abdalrhman-Almarakeby Apr 21, 2025
0570b8b
fix: show correct prefix
Abdalrhman-Almarakeby Apr 21, 2025
b8c6142
fix: remove unused template literal
Abdalrhman-Almarakeby Apr 21, 2025
cdf52ee
Update error-customization.mdx
Abdalrhman-Almarakeby Apr 21, 2025
0f10b94
Merge branch 'v4' into feat/arabic-language
colinhacks May 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/core/src/locales.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import ar from "./locales/ar.js";
import az from "./locales/az.js";
import en from "./locales/en.js";
import es from "./locales/es.js";

export { az, es, en };
export { ar, az, es, en };
125 changes: 125 additions & 0 deletions packages/core/src/locales/ar.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import type { $ZodStringFormats } from "../checks.js";
import type * as errors from "../errors.js";
import * as util from "../util.js";

const Sizable: Record<string, { unit: string; verb: string }> = {
string: { unit: "حرف", verb: "أن يحتوي على" },
file: { unit: "بايت", verb: "أن يحتوي على" },
array: { unit: "عنصر", verb: "أن يحتوي على" },
set: { unit: "عنصر", verb: "أن يحتوي على" },
};

function getSizing(origin: string): { unit: string; verb: string } | null {
return Sizable[origin] ?? null;
}

export const parsedType = (data: any): string => {
const t = typeof data;

switch (t) {
case "number": {
return Number.isNaN(data) ? "NaN" : "number";
}
case "object": {
if (Array.isArray(data)) {
return "array";
}
if (data === null) {
return "null";
}

if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) {
return data.constructor.name;
}
}
}
return t;
};

const Nouns: {
[k in $ZodStringFormats | (string & {})]?: string;
} = {
regex: "input",
email: "email address",
url: "URL",
emoji: "emoji",
uuid: "UUID",
uuidv4: "UUIDv4",
uuidv6: "UUIDv6",
nanoid: "nanoid",
guid: "GUID",
cuid: "cuid",
cuid2: "cuid2",
ulid: "ULID",
xid: "XID",
ksuid: "KSUID",
datetime: "ISO datetime",
date: "ISO date",
time: "ISO time",
duration: "ISO duration",
ipv4: "IPv4 address",
ipv6: "IPv6 address",
cidrv4: "IPv4 range",
cidrv6: "IPv6 range",
base64: "base64-encoded string",
base64url: "base64url-encoded string",
json_string: "JSON string",
e164: "E.164 number",
jwt: "JWT",
template_literal: "input",
};

const error: errors.$ZodErrorMap = (issue) => {
switch (issue.code) {
case "invalid_type":
return `نوع غير صالح: كان من المتوقع ${issue.expected}، تم استلام ${parsedType(issue.input)}`;
case "invalid_value":
if (issue.values.length === 1)
return `القيمة غير صالحة. القيمة المتوقعة ${util.stringifyPrimitive(issue.values[0])}`;
return `القيمة غير صالحة: كان من المتوقع أن تكون إحدى القيم التالية: ${util.joinValues(issue.values, "|")}`;
case "too_big": {
const adj = issue.inclusive ? "<=" : "<";
const sizing = getSizing(issue.origin);
if (sizing)
return `كبير جدًا: من المتوقع أن يحتوي ${issue.origin ?? "value"} على ${adj}${issue.maximum.toString()} ${sizing.unit ?? "elements"}`;
return `كبير جدًا: من المتوقع أن يكون ${issue.origin ?? "value"} ${adj}${issue.maximum.toString()}`;
}
case "too_small": {
const adj = issue.inclusive ? ">=" : ">";
const sizing = getSizing(issue.origin);
if (sizing) {
return `صغير جدًا: من المتوقع أن يحتوي ${issue.origin} على ${adj}${issue.minimum.toString()} ${sizing.unit}`;
}

return `صغير جدًا: من المتوقع أن يكون ${issue.origin} ${adj}${issue.minimum.toString()}`;
}
case "invalid_format": {
const _issue = issue as errors.$ZodStringFormatIssues;
if (_issue.format === "starts_with") return `تنسيق غير صالح: يجب أن يبدأ بـ "${issue}"`;
if (_issue.format === "ends_with") return `تنسيق غير صالح: يجب أن ينتهي بـ "${_issue.suffix}"`;
if (_issue.format === "includes") return `تنسيق غير صالح: يجب أن يتضمن "${_issue.includes}"`;
if (_issue.format === "regex") return `تنسيق غير صالح: يجب أن يطابق النمط ${_issue.pattern}`;
return `${Nouns[_issue.format] ?? issue.format} غير صالح`;
}
case "not_multiple_of":
return `القيمة غير صالحة: يجب أن تكون من مضاعفات العدد ${issue.divisor}.`;
case "unrecognized_keys":
return `${issue.keys.length > 1 ? "مفاتيح غير مُعرَّفة" : "مفتاح غير مُعرَّف"}: ${util.joinValues(issue.keys, "، ")}`;
case "invalid_key":
return `مفتاح غير صالح في ${issue.origin}`;
case "invalid_union":
return "القيمة المُدخلة لا تطابق أيًا من الأنواع المتوقعة";
case "invalid_element":
return `عنصر غير صالح ضمن: ${issue.origin}`;
default:
return "إدخال غير صالح";
}
};

export { error };

export default function (): { localeError: errors.$ZodErrorMap } {
return {
localeError: error,
};
}
2 changes: 1 addition & 1 deletion packages/docs/content/error-customization.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,6 @@ z.config(z.locales.en());
### Locales

The following locales are available:

- `ar` — Arabic
- `az` — Azerbaijani
- `en` — English