Skip to content

Latest commit

 

History

History
165 lines (128 loc) · 6.64 KB

README.md

File metadata and controls

165 lines (128 loc) · 6.64 KB

npm version

Zod Internationalization

This library is used to translate Zod's default error messages.

Installation 💿

npm install hono-zod-validator-i18n @intlify/hono

This library depends on @intlify/hono.

Getting Started 🚀

import { Hono } from 'hono';
import {
  defineI18nMiddleware,
  detectLocaleFromAcceptLanguageHeader,
  useTranslation,
} from '@intlify/hono';
import { zValidatorI18n } from 'hono-zod-validator-i18n';
import zodEn from 'hono-zod-validator-i18n/locales/en/zod.json';
import zodJa from 'hono-zod-validator-i18n/locales/ja/zod.json';

const i18nMiddleware = defineI18nMiddleware({
  locale: detectLocaleFromAcceptLanguageHeader,
  messages: {
    en: {
      hello: 'Hello {name}!',
      zod: zodEn,
    },
    ja: {
      hello: 'こんにちは、{name}!',
      zod: zodJa,
    },
  },
});

const app = new Hono();

app.use('*', i18nMiddleware);

const schema = z.object({
  name: z.string(),
  age: z.number(),
});

app.post('/author', zValidatorI18n('json', schema), (c) => {
  const data = c.req.valid('json');
  return c.json({
    success: true,
    message: `${data.name} is ${data.age}`,
  });
});

export default app;

zValidatorI18n

The zValidatorI18n function works exactly the same as the original zValidator function from @hono/zod-validator so you can still add a custom hook function.

zValidatorI18n('json', schema, (result, c) => {
  // "result" and "c" are fully typed!
  console.log('This will run after the error translation.');
});

Custom Translations

You can define custom Zod error message translations like this:

import zodEn from 'hono-zod-validator-i18n/locales/en/zod.json';
import zodJa from 'hono-zod-validator-i18n/locales/ja/zod.json';

const i18nMiddleware = defineI18nMiddleware({
  locale: 'ja',
  messages: {
    en: {
      hello: 'Hello {name}!',
      // All custom error message translations should be inside: zod.custom
      zod: { ...zodEn, custom: { some_message: 'Some message' } },
    },
    ja: {
      hello: 'こんにちは、{name}!',
      zod: { ...zodJa, custom: { some_message: '何かのメッセージ' } },
    },
  },
});

And use it like this:

zValidatorI18n(
  'json',
  z.object({
    name: z.string({ message: 'zod.custom.some_message' }), // Will result in: '何かのメッセージ'
  })
),

Custom Zod error translations only work when prefixed with zod.custom.. If you do not use this prefix, the translation of the standard Zod error message will be used

Translation Files 🌐

hono-zod-validator-i18n contains translation files for several locales.

It is also possible to create and edit translation files. You can use this English translation file as a basis for rewriting it in your language.

If you have created a translation file for a language not yet in the repository, please send us a pull request.

Contributing 🤝

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

License 🔖

This project is licensed under the MIT License.

Contributors ✨

Contributors icons

Special Thanks ❤️