i18nextnext
TypeScript icon, indicating that this package has built-in type declarations

1.1.0-rc1 • Public • Published

i18nextnext

1i8nextnext will help you to achieve react-i18next translations on nextjs, it does support SSR and SSG.

Installation

  1. Install packages with your prefered package manager:
# npm 
npm i i18next react-i18next i18nextnext
# or yarn users 
yarn add i18next react-i18next i18nextnext
  1. After constructing your i18n instance, call setI18n for allowing us accessing the translation instances, this is typically done under pages/_app.
import i18n from 'i18next'
import { LocaleBackend } from './backend'
import { setI18n } from 'react-i18next'
import detector from 'i18next-browser-languagedetector'
export { LoadLocales, LocaleScript, NextNextProvider } from 'i18nextnext'
 
i18n
  .use(detector)
  .use(LocaleBackend)
  .init({ fallbackLng: 'es', react: { useSuspense: false } })
 
+ setI18n(i18n)
  1. Replace I18nextProvider with NextNextProvider where you initialize react-i18next, this will allow us pre-fill your translations store, this is typically done on the same place as the previous step was done (pages/_app):
import i18n from 'i18next'
import { LocaleBackend } from './backend'
import { setI18n } from 'react-i18next'
import detector from 'i18next-browser-languagedetector'
export { LoadLocales, LocaleScript, NextNextProvider } from 'i18nextnext'
 
i18n
  .use(detector)
  .use(LocaleBackend)
  .init({ fallbackLng: 'es', react: { useSuspense: false } })
 
setI18n(i18n)
 
function App({ Component, pageProps }) {
  return (
-    <I18nextProvider i18n={i18n}>
+    <NextNextProvider i18n={i18n}>
      <UIProvider locale="es">
        <Component {...pageProps} />
      </UIProvider>
-     </I18nextProvider>
+     </NextNextProvider>
  )
}
 
export default App
  1. Create a custom pages/_document, this will allow us to ship the translations namespaces with the payload received on the UI:
import React from 'react'
+ import { LocaleScript } from 'i18nextnext'
import Document, { Html, Head, Main, NextScript } from 'next/document'
 
export default class AppDocument extends Document {
 
  render() {
    return (
      <Html>
        <Head>
+          <LocaleScript />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    )
  }
}
  1. For preloading translastions, on your page file you should add: SSG:
import { LoadLocales } from 'i18nextnext'
 
/** Your exported page here **/
 
export async function getStaticProps() {
  // This will preload various namespaces for a given language.
  await LoadLocales('en', ['dashboard'])
  return {
    props: {},
  }
}

SSR:

import { LoadLocales } from 'i18nextnext'
 
/** Your exported page here **/
 
export async function getServerSideProps() {
  // This will preload various namespaces for a given language.
  await LoadLocales('en', ['dashboard'])
  return {
    props: {},
  }
}

API

<LocaleScript />:

This will inject a payload on the initial response to the client, allowing i18n to not request the already-loaded namespaces. This is meant to be used on a NextJS Document (pages/_document) only.

Returns: If LoadLocales was set, will return a <script /> if not, null.

<NextNextProvider i18n={i18n} />:

Wrapper on top of I18nextProvider, it will initialize React-i18next with the pre-filled store from <LocaleScript /> (if present).

Returns: Received Children Props:

  • i18n: Required, i18n: i18n instance.

await LoadLocales(lng: string, namespaces: string[]):

Will pre-load namespaces onto the store, can be used multiple times to load multiple languages, should be used only on getServerSideProps or getStaticProps.

Returns: Promise: An empty promise, fulfilled when resources were loaded.

Parameters:

  • lng: Language to be used, should match i18n language.
  • namespaces: Array of namespaces to be loaded.

Troubleshooting:

Translations flashes:

If you don't see any SSR error on the console, most likely you forgot to include LoadLocales on your page, that means that fallbacks are being used both on SSR/G and initial page until i18next picks the resources.

Warning: Text content did not match. Server: Client:

This is most likely forgot to use <LocaleScript /> or <NextNextProvider />, this means that there are mismatch between HTML content and their DOM representation.

Error: i18n has not been set

You forgot to call setI18n as expected by our plugin on LoadLocales.

Readme

Keywords

none

Package Sidebar

Install

npm i i18nextnext

Weekly Downloads

2

Version

1.1.0-rc1

License

MIT

Unpacked Size

20.7 kB

Total Files

16

Last publish

Collaborators

  • negan1911