i18next-locales-sync

Syncs i18next locale resource files against a primary language.

Usage no npm install needed!

<script type="module">
  import i18nextLocalesSync from 'https://cdn.skypack.dev/i18next-locales-sync';
</script>

README

i18next-locales-sync

CI npm

Syncs i18next locale resource files against a primary language.

Installation

$ npm install --save-dev i18next-locales-sync

Features

  1. Supports namespaces.
  2. Full plural support, based on the real i18next pluralResolver.
  3. Sorting secondary locale keys by primary language order.
  4. Supports multiple locale folder structure, {lng}/{namespace}, {namespace}/{lng}.
  5. Creates missing locale files.
  6. Allows overriding plural rules.

Usage

1. CLI

$ npx i18next-locales-sync -p he -s en de ja -l path/to/locales/folder

or using config file

// localesSync.config.js
module.exports = {
  primaryLanguage: 'he',
  secondaryLanguages: ['en', 'de', 'ja'],
  localesFolder: './path/to/locales/folder',
  overridePluralRules: (pluralResolver) =>
    pluralResolver.addRule('he', pluralResolver.getRule('en')), // This is available only when using config file
};
$ npx i18next-locales-sync -c ./localesSync.config.js

2. Node

import { syncLocales } from 'i18next-locales-sync';
import path from 'path';

syncLocales({
  primaryLanguage: 'en',
  secondaryLanguages: ['en', 'de', 'ja'],
  localesFolder: path.resolve('./path/to/locales/folder'),
  overridePluralRules: (pluralResolver) =>
    pluralResolver.addRule('he', pluralResolver.getRule('en')),
})

Options

Key Type Default value
primaryLanguage string
secondaryLanguages string[]
localesFolder string
outputFolder string? localesFolder
overridePluralRules (pluralResolver: PluralResolver)? => PluralResolver
useEmptyString boolean false

Currently, the lib supports only .json locale files, PRs are welcome :].

Example

Given these files:

examples
├── en
│   └── namespace.json
├── he
│   └── namespace.json
└── ja
    └── namespace.json
// en/namespace.json
{
  "foo_male": "bar-male-en",
  "room": "room",
  "room_plural": "rooms"
}
// he/namespace.json
{
  "room": "חדר",
  "foo_male": "bar-male-he",
  "room_3": "חדרים"
}
// ja/namespace.json
{
  "foo_male": "bar-male-ja",
  "room": "部屋",
  "room_plural": "部屋"
}

Syncying he & ja against en

$ npx i18next-locales-sync -p en -s he ja -l ./examples/

Will result with

// en/namespace.json

// `en` remains untouched
{
  "foo_male": "bar-male-en",
  "room": "room",
  "room_plural": "rooms"
}
// he/namespace.json

// sorted based on the primary lang file
// keeps existing plural form (room_3)
// added missing plural forms
{
  "foo_male": "bar-male-he",
  "room": "חדר",
  "room_3": "חדרים",
  "room_0": "rooms",
  "room_1": "rooms",
  "room_2": "rooms"
}
// ja/namespace.json

// keeps exising fields
// removed plural form since there is no plural form in Japanese
{
  "foo_male": "bar-male-ja",
  "room": "部屋"
}

Prior art

  1. i18next-json-sync