1.1.0 • Published 10 months ago

@ts-intl/dictionary v1.1.0

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

I18n dictionary/messages generator

Generate dictionary/messages by locale object or file, features:

  1. replace subtrees/leaves with fallback locale
  2. file system support
  3. include/exclude support to reduce size of dictionary
// treat top level key as namespace
export type Dictionary = {
  [key: string]: string | Dictionary;
};

Installation

npm install @ts-intl/dictionary

extractDictionary

Interface

const extractDictionary = (targetDict: Dictionary, fallbackDict: Dictionary, include: Trie | NSPath, exclude?: Trie | NSPath, logger?: (path: string) => void) => Dictionary;

Usage

const fallbackDict: Dictionary = {
  a: {
    b: 'i am b',
    c: {
      d: 'i am d',
    },
  },
  e: {
    f: 'i am f',
    g: 'i am g',
  },
};
const targetDict: Dictionary = {
  a: {
    b: 'you are b',
  },
  h: 'you are h',
};
const include: NSPath = ['a', ['b'], 'e'];
const exclude: NSPath = ['e', ['f']];

const extractedDictionary = extractDictionary(targetDict, fallbackDict, include, exclude);
// {
//   'a': {
//     'b': 'you are b'
//   },
//   'e': {
//     'g': 'i am g' // fallback
//   }
// }

Configuration

PropertyTypeDefaultDescription
targetDictDictionarynulloriginal target(current) locale dictionary
fallbackDictDictionarynullthe extractedDictionary is based on fallbackDict, fill subtrees/leaves with keys/values if exist in targetDict, normally we provide an en dictionary
includeNSPath | TrienullextractedDictionary only include given paths
excludeNSPath | Trienullignore paths which within in include
logger(path: string) => voidundefinedlog missing keys/values in targetDict

extractDictionaryFs

Interface

type Configs = {
  localePath: string;
  locale: string;
  basicLocale?: string;
  ns: {
    include: NSPath;
    exclude?: NSPath;
  };
  reader?: Reader<Dictionary>;
};
const extractDictionaryFs = (configs: Configs) => Dictionary;

Usage

// auto detect locale files:
// 1. if [localePath]/[locale] exist, merge [localePath]/[locale]/*.json, each json name is namespace.
// 2. if [localePath]/[locale].json exist, just using it.
// 3. otherwise return {}(empty Dictionary).
const extractedDictionary = extractDictionaryFs({
  localePath: '/',
  locale: 'fr',
  basicLocale: 'en',
  ns: {
    include: ['a', ['b'], 'e'],
    exclude: ['e', ['f']],
  },
});

Configuration

PropertyTypeDefaultDescription
localePathstringnullabsolute path of locale directory
localestringnulllocale, should same as locale file name
basicLocalestringundefinedfallback locale, should same as fallback locale file name
ns{ include: NSPath, exclude?: NSPath }nullinclude and exclude

Extend custom generator

const getDictFromRemote = (locale: string) => Promise<Dictionary>;
const customExtractDictionary = async () => {
  return extractDictionary(await getDictFromRemote('fr'), await getDictFromRemote('en'), ['a'], ['a', ['b', 'c']]);
};

License

License: MIT

1.1.0

10 months ago

1.0.0

10 months ago

0.2.6

10 months ago

0.2.5

10 months ago

0.2.4

12 months ago

0.2.3

1 year ago

0.2.1

1 year ago

0.2.0

1 year ago

0.1.0

1 year ago

0.0.0

1 year ago