For the complete documentation index, see llms.txt. This page is also available as Markdown.

useTranslation (hook)

What it does

It gets the t function and i18n instance inside your functional component.

import React from 'react';
import { useTranslation } from 'react-i18next';

export function MyComponent() {
  const { t, i18n } = useTranslation(); // not passing any namespace will use the defaultNS (by default set to 'translation')
  // or const [t, i18n] = useTranslation();

  return <p>{t('my translated text')}</p>
}
import React from 'react';
import { useTranslation } from 'react-i18next';

export function MyComponent() {
  const { t, i18n } = useTranslation(); // not passing any namespace will use the defaultNS (by default set to 'translation')
  // or const [t, i18n] = useTranslation();

  return <p>{t($ => $['my translated text'])}</p>
}

While most of the time you only need the t function to translate your content, you can also get the i18n instance (in order to change the language).

i18n.changeLanguage('en-US');

The useTranslation hook will trigger a Suspense if not ready (eg. pending load of translation files). You can set useSuspense to false if prefer not using Suspense.

When to use?

Use the useTranslation hook inside your functional components to access the translation function or i18n instance.

useTranslation params

Loading namespaces

Selector ns prefix vs. resolution scope. Plain t('key') calls remain isolated to the primary namespace under default nsMode โ€” they don't fall through to the secondary namespaces. Only the selector's first segment is matched against the hook's full namespace list, via the new scopeNs argument that useTranslation now passes to getFixedT. If you want t('key') to fall through to all namespaces in order, use nsMode: 'fallback' (unchanged from before).

Overriding the i18next instance

Optional keyPrefix option

available in react-i18next version >= 11.12.0

depends on i18next version >= 20.6.0

Optional lng option

available in react-i18next version >= 12.3.1

Not using Suspense

Not using Suspense you will need to handle the not ready state yourself by eg. render a loading component as long !ready . Not doing so will result in rendering your translations before they loaded which will cause save missing be called although translations exists (just yet not loaded).

Troubleshooting

Blank screen or "suspended while rendering, but no fallback UI was specified"? useSuspense is true by default: while translations load asynchronously (http backend, locize backend, ...), the component suspends. Either wrap it in a <Suspense fallback={...}> boundary, or set useSuspense: false and handle the ready flag as shown above. Since v17.0.10 a development-only console warning points this out when it happens.

"Rendered more hooks than during the previous render" pointing at useTranslation? This was a bug in react-i18next < 16.3 (an early return before all hooks ran when the i18next instance wasn't ready yet, typically under init/render races or React StrictMode). It is fixed in >= 16.3; upgrade instead of working around it.

Last updated