@intlayer/core
Version:
Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.
120 lines (118 loc) • 3.92 kB
JavaScript
import { getPrefix } from "./getPrefix.mjs";
import { internationalization, routing } from "@intlayer/config/built";
import { DEFAULT_LOCALE } from "@intlayer/config/defaultValues";
//#region src/localization/localeMapper.ts
/**
* Map the locale data to an array of objects
*
* @example
* ```ts
* const routes = localeMap((localizedData) =>
* ({
* path: localizedData.urlPrefix,
* name: localizedData.locale,
* isDefault: localizedData.isDefault,
* locales: localizedData.locales,
* defaultLocale: localizedData.defaultLocale,
* }),
* );
*
* // Result
* [
* { path: '/', name: 'en', isDefault: true, locales: ['en'], defaultLocale: 'en', urlPrefix: '' },
* { path: '/fr', name: 'fr', isDefault: false, locales: ['fr'], defaultLocale: 'en', urlPrefix: '/fr' },
* { path: '/es', name: 'es', isDefault: false, locales: ['es'], defaultLocale: 'en', urlPrefix: '/es' },
* ]
* ```
*
* @param mapper - The mapper function that returns an object
* @returns An array of objects
*/
const localeMap = (mapper, locales = internationalization.locales ?? [], defaultLocale = internationalization.defaultLocale ?? DEFAULT_LOCALE, mode = routing?.mode ?? "prefix-no-default") => (locales ?? []).map((locale) => mapper({
locale,
defaultLocale,
locales,
isDefault: locale === defaultLocale,
urlPrefix: getPrefix(locale, {
defaultLocale,
mode,
locales
}).localePrefix ? `/${locale}` : ""
}));
/**
* Flatten the locale map into a single array of objects
*
* @example
* ```ts
* const routes = localeMap((localizedData) =>
* [{
* path: localizedData.urlPrefix,
* name: localizedData.locale,
* isDefault: localizedData.isDefault,
* locales: localizedData.locales,
* defaultLocale: localizedData.defaultLocale,
* }],
* );
*
* // Result
* [
* path: '/', name: 'en', isDefault: true, locales: ['en'], defaultLocale: 'en', urlPrefix: '' ,
* path: '/fr', name: 'fr', isDefault: false, locales: ['fr'], defaultLocale: 'en', urlPrefix: '/fr' ,
* path: '/es', name: 'es', isDefault: false, locales: ['es'], defaultLocale: 'en', urlPrefix: '/es' ,
* ]
* ```
*
* @param mapper - The mapper function that returns an array of objects
* @returns An array of objects
*/
const localeFlatMap = (mapper, locales = internationalization.locales ?? [], defaultLocale = internationalization.defaultLocale ?? DEFAULT_LOCALE, mode = routing?.mode ?? "prefix-no-default") => locales.flatMap((locale) => mapper({
locale,
defaultLocale,
locales,
isDefault: locale === defaultLocale,
urlPrefix: getPrefix(locale, {
defaultLocale,
mode,
locales
}).localePrefix ? `/${locale}` : ""
}));
/**
* Creates a record object mapping locales to values transformed by the mapper function
*
* @example
* ```ts
* const translations = localeRecord(({ locale }) =>
* require(`./translations/${locale}.json`)
* );
*
* // Result
*
* en: ... , // Content of translations/en.json
* fr: ... , // Content of translations/fr.json
* es: ...
*
* ```
*
* @param mapper - Function that takes locale data and returns a value for that locale
* @param locales - Array of locale codes to map over (defaults to configured locales)
* @param defaultLocale - The default locale (defaults to configured default)
* @param mode - URL routing mode for locale handling (defaults to configured value)
* @returns Record mapping locale codes to mapped values
*/
const localeRecord = (mapper, locales = internationalization.locales ?? [], defaultLocale = internationalization.defaultLocale ?? DEFAULT_LOCALE, mode = routing?.mode ?? "prefix-no-default") => (locales ?? []).reduce((acc, locale) => {
acc[locale] = mapper({
locale,
defaultLocale,
locales,
isDefault: locale === defaultLocale,
urlPrefix: getPrefix(locale, {
defaultLocale,
mode,
locales
}).localePrefix ? `/${locale}` : ""
});
return acc;
}, {});
//#endregion
export { localeFlatMap, localeMap, localeRecord };
//# sourceMappingURL=localeMapper.mjs.map