@translata/node

Node functionality for translata: The Composable Translation Utility

Usage no npm install needed!

<script type="module">
  import translataNode from 'https://cdn.skypack.dev/@translata/node';
</script>

README

@translata/node

Provides middlewares focused on node usage.

Installation

yarn add @translata/core @translata/node

Documentation

withTranslationFile

Reads translations from the given file and stores them for the given locale. Currently json and yaml files are supported.

// en.json
{
  "global.hello": "Hello User!",
  "global.bye": "Bye User!"
}
// de.yaml
global.hello: Hallo Benutzer!
global.bye: Tschüss Benutzer!
import { createTranslator } from '@translata/core';
import { withTranslationFile } from '@translata/node';

const _ = createTranslator(
  withTranslationFile('en', resolve(__dirname, 'en.json')),
  withTranslationFile('de', resolve(__dirname, 'de.yaml')),
);

_('global.hello', { locale: 'en' }); // Hello User!
_('global.bye', { locale: 'de' }); // Tschüss Benutzer!

withTranslationDirectory

Loads translation files from a directory, detecting namespacing and locales. By default, the middleware will check for files in the given directory that matches the pattern {{namespace}}.{{locale}}.(json|yaml|yml). So, a valid file name would be like global.en.json.

Lets imagine we have a structure like:

i18n/
  global.en.json
  global.de.json
  labels.de.json
  labels.en.json

Then we could setup the middleware like:

import { createTranslator } from '@translata/core';
import { withTranslationDirectory } from '@translata/node';

const _ = createTranslator(
  withTranslationDirectory(resolve(__dirname, 'i18n')),
);

_('global.hello', { locale: 'en' }); // Hello User!
_('global.bye', { locale: 'de' }); // Tschüss Benutzer!
_('labels.cancel', { locale: 'de' }); // Abbrechen

Notice that the namespace, which is part of the filename, is automatically applied as prefix to our translation ids. If you don't want that, you can pass a custom pattern without a namespace. In this case, translation ids are taken as they are, without modification:

import { createTranslator } from '@translata/core';
import { withTranslationDirectory } from '@translata/node';

const _ = createTranslator(
  withTranslationDirectory(resolve(__dirname, 'i18n'), {
    pattern: '{{locale}}.json',
  }), // finds files like i18n/de.json
);

You could also pass a pattern which will allow you to place each namespace in its own folder, like so:

import { createTranslator } from '@translata/core';
import { withTranslationDirectory } from '@translata/node';

const _ = createTranslator(
  withTranslationDirectory(resolve(__dirname, 'i18n'), {
    pattern: '{{namespace}}/{{locale}}.json',
  }), // finds files like i18n/global/de.json
);

withSystemLocale

Detects the system locale and sets it as value option for the following middlewares.

import { createTranslator } from '@translata/core';
import { withSystemLocale } from '@translata/node';

const _ = createTranslator(
  withTranslationDirectory(resolve(__dirname, 'i18n')),
  withSystemLocale(),
);

_('global.hello'); // Locale of the current system is passed, like { locale: 'en' }

Combine it with withFallbackLocale to have a fallback ready:

import { createTranslator, withFallbackLocale } from '@translata/core';
import { withSystemLocale } from '@translata/node';

const _ = createTranslator(
  withTranslationDirectory(resolve(__dirname, 'i18n')),
  withFallbackLocale('en')
  withSystemLocale()
);

_('global.hello'); // Locale of the current system is passed, like { locale: 'fr' } with fallback to { locale: 'en' }