Integration
React Usage
installation
$ npm i @foo-i18n/react
$ pnpm i @foo-i18n/react
$ yarn add @foo-i18n/react
$ bun install @foo-i18n/react
Declaration
import type {
// ...
UseAppTranslation,
} from '@foo-i18n/react/types';
//...
export type UseAppTranslation = UseAppTranslation<AppMessages>;
Message Provider
The translation context should be as close as possible to the root of the application, preferably at the layout level, in order to have a wider accessibility with fewer update requirement.
"use client";
import {
TranslationProvider
} from "@foo-i18n/react/TranslationProvider";
import plurals from "@foo-i18n/plurals";
import type { AppLocale, AppMessages } from "@/i18n/types";
export type AppTranslationProviderProps = {
locale: AppLocale;
messages: AppMessages;
children: React.ReactNode;
};
const AppTranslationProvider = ({
locale,
messages,
children,
}: AppTranslationProviderProps) => {
const plural = plurals[locale];
return (
<TranslationProvider
locale={locale}
messages={messages}
plural={plural}
>
{children}
</TranslationProvider>
);
};
export default AppTranslationProvider;
Translation hook
To enable code auto-completion while using the translation hook, a typed hook should be returned.
import useTranslation from '@foo-i18n/react/useTranslation';
import type { UseAppTranslation } from './types';
/**
* Return a typed hook
*/
export const useAppTranslation = useTranslation as UseAppTranslation;
Putting it all together
The following example uses Next.js’s React server components, but it may very well be adapted in static sites, or even in client-only situations.
import { loadMessages } from '@/i18n/messages';
import AppTranslationProvider from '@/i18n/Provider';
import PageComponent from '@/components/PageComponent';
import type { AppLocale } from '@/i18n/types';
export default async function Page() {
// NOTE: obtain locale from route params or middleware
const locale: AppLocale = 'en';
const messages = await loadMessages(locale);
return (
<div className="py-10">
<AppTranslationProvider locale={locale} messages={messages}>
<PageComponent />
</AppTranslationProvider>
</div>
);
}
'use client';
import { useAppTranslation } from '@/i18n/hooks';
const TranslateText = () => {
const { t, plural } = useAppTranslation('people');
const count = 7;
const plurality = plural.ordinal(count);
return (
<div>
{t('There are {count} people', {
count,
plurality,
})}
</div>
);
};
export default TranslateText;