1.0.0-rc.5 • Published 4 months ago

@intl-schematic/plugin-nested v1.0.0-rc.5

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

@intl-schematic/plugin-nested

Adds the ability to use nested keys in translation documents.

npm i -s @intl-schematic/plugin-nested

Basic usage

Define a translation document factory

const getDocument = () => ({
  'hello': {
    'world': 'Hello, world!',
    'stranger': 'Hello, stranger!'
  },
  'foo': {
    'bar': {
      'baz': "Foo Bar Baz!"
    }
  }
});

Create a translator function (t())

import { createTranslator } from 'intl-schematic';
import { NestedKeysPlugin } from '@intl-schematic/plugin-nested';

// Notice the plugins array parameter
const t = createTranslator(getDocument, [NestedKeysPlugin]);

Use the translator function

console.log(t('hello', 'world')); // `Hello, world!`
console.log(t('hello', 'stranger')); // `Hello, stranger!`
console.log(t('foo', 'bar', 'baz')); // `Foo Bar Baz!`

// Parameter auto-complete and type-checking!

// TS Error: Argument of type 'bar' is not assignable to parameter of type 'hello' | 'stranger'.
t('hello', 'bar');

// TS Error: Expected 2 arguments, but got 1.
t('hello');

// TS Error: Expected 3 arguments, but got 2.
t('foo', 'bar');

Dot-notation

This plugin also allows to use dot-notation (key.subkey) with nested keys, but only through a workaround called createDotNester.

This is a wrapper for the main translator function, which adapts typing to nested keys separated by a dot:

import { createTranslator } from 'intl-schematic';
import { NestedKeysPlugin } from '@intl-schematic/plugin-nested';
import { createDotNester } from '@intl-schematic/plugin-nested/dot';

const getDocument = () => ({
  'hello': {
    'world': 'Hello, world!',
    'stranger': 'Hello, stranger!'
  },
  'foo': {
    'bar': {
      'baz': "Foo Bar Baz!"
    }
  },
  'regular': 'string key'
});

// Notice the plugins array parameter
const t = createTranslator(getDocument, [NestedKeysPlugin]);

const tn = createDotNester(t);

// `tn()` accepts dot-notated keys with type-hints:
tn('hello.world'); // 'Hello, world!'

// Still accepts regular string keys
tn('regular');