59 lines
2.2 KiB
JavaScript
59 lines
2.2 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Internationalization (i18n) utilities for StartOS packages.
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* // In package's i18n/index.ts:
|
|
* import { setupI18n } from '@start9labs/start-sdk'
|
|
* import defaultDict, { DEFAULT_LANG } from './dictionaries/default'
|
|
* import translations from './dictionaries/translations'
|
|
*
|
|
* export const i18n = setupI18n(defaultDict, translations, DEFAULT_LANG)
|
|
* ```
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.setupI18n = setupI18n;
|
|
/**
|
|
* Creates a typed i18n function for a package.
|
|
*
|
|
* @param defaultDict - The default language dictionary mapping strings to numeric indices
|
|
* @param translations - Translation dictionaries for each supported locale
|
|
* @param defaultLang - The default language code (e.g., 'en_US')
|
|
* @returns A typed i18n function that accepts dictionary keys and optional parameters
|
|
*/
|
|
function setupI18n(defaultDict, translations, defaultLang) {
|
|
const lang = process.env.LANG?.replace(/\.UTF-8$/, '') || defaultLang;
|
|
// Convert locale format from en_US to en-US for Intl APIs
|
|
const intlLocale = lang.replace('_', '-');
|
|
function getTranslation() {
|
|
if (lang === defaultLang)
|
|
return null;
|
|
const availableLangs = Object.keys(translations);
|
|
const match = availableLangs.find((l) => l === lang) ??
|
|
availableLangs.find((l) => String(l).startsWith(lang.split('_')[0] + '_'));
|
|
return match ? translations[match] : null;
|
|
}
|
|
const translation = getTranslation();
|
|
function formatValue(value) {
|
|
if (typeof value === 'number') {
|
|
return new Intl.NumberFormat(intlLocale).format(value);
|
|
}
|
|
if (value instanceof Date) {
|
|
return new Intl.DateTimeFormat(intlLocale).format(value);
|
|
}
|
|
return value;
|
|
}
|
|
return function i18n(key, params) {
|
|
let result = translation
|
|
? translation[defaultDict[key]]
|
|
: key;
|
|
if (params) {
|
|
for (const [paramName, value] of Object.entries(params)) {
|
|
result = result.replace(`\${${paramName}}`, formatValue(value));
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
//# sourceMappingURL=index.js.map
|