Skip to content

I18Next HMR🔥 webpack plugin that allows reloading translation resources on the client & the server

License

Notifications You must be signed in to change notification settings

desinox/i18next-hmr

 
 

Repository files navigation

i18next-hmr

npm CI

I18Next HMR🔥 webpack plugin that allows reloading translation resources on the client & the server

Requirements

  • Node.js v10 or above
  • Webpack 4.x - 5.x

Installation

$ npm install --save-dev i18next-hmr

Usage

Add the plugin to your webpack config (or next.config.js).

// webpack.config.js
const { I18NextHMRPlugin } = require('i18next-hmr/webpack');

module.exports = {
  ...
  plugins: [
    new I18NextHMRPlugin({
      localesDir: path.resolve(__dirname, 'static/locales'), 
      localesDirs: [
         // use this property for multiple locales directories   
      ]
    })
  ]
};
// i18next.config.js
const Backend = require('i18next-http-backend');
const i18next = require('i18next');
const { HMRPlugin } = require('i18next-hmr/plugin');

const instance = i18next.use(Backend); // http-backend is required for client side reloading

if (process.env.NODE_ENV !== 'production') {
   instance.use(new HMRPlugin({ 
      client: typeof window !== 'undefined', // enables client side HMR
      server: typeof window === 'undefined'  // enables server side HMR
   }));
}

instance.init(options, callback);

module.exports = instance;

Start the app with NODE_ENV=development

Server side

The lib will trigger i18n.reloadResources([lang], [ns]) on the server side with lang & namespace extracted from the translation filename that was changed.

⚠️ If your server side is bundled using Webpack, the lib will use the native HMR (if enabled), for it to work properly the lib must be bundled, therefore, you should specify the lib as not external. There are 2 ways to do that:

  1. If you are using webpack-node-externals specify i18next-hmr in the whitelist.
  2. (deprecated method) use a relative path to node_modules, something like:
    // server.entry.js
    if (process.env.NODE_ENV !== 'production') {
      const { applyServerHMR } = require('../node_modules/i18next-hmr/server');
      applyServerHMR(i18n);
    }

Client side

The lib will invoke Webpack's HMR to update client side, that will re-fetch (with cache killer) the updated translation files and trigger i18n.changelanguage(lang) to trigger listeners (which in React apps it will update the UI).

Example

Working examples can be found in the examples folder.

screenshot

About

I18Next HMR🔥 webpack plugin that allows reloading translation resources on the client & the server

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%