parent
000178fdc4
commit
96b4a631a5
@ -0,0 +1,61 @@
|
|||||||
|
import type { EngineLang, LangParams, SupportedLocale } from '$lang';
|
||||||
|
import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang';
|
||||||
|
import { SIUM_DIAGNOSTIC_EVENTS } from './consts';
|
||||||
|
import { emitSiumDiagnostic, type SiumDiagnostics } from './diagnostics';
|
||||||
|
import { resolve as resolveFallbackTemplate } from './langs';
|
||||||
|
import type { Issue } from './core';
|
||||||
|
|
||||||
|
export interface SiumResolver {
|
||||||
|
readonly resolve: (message: string, params?: LangParams, locale?: SupportedLocale) => string;
|
||||||
|
readonly resolveIssue: (issue: Issue, locale?: SupportedLocale) => string;
|
||||||
|
readonly resolveIssues: (issues: ReadonlyArray<Issue>, locale?: SupportedLocale) => string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SiumResolverOptions {
|
||||||
|
readonly lang?: EngineLang;
|
||||||
|
readonly defaultLocale: SupportedLocale;
|
||||||
|
readonly diagnostics: SiumDiagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
|
function composeLangPath(message: string): string | undefined {
|
||||||
|
const parsed = parseLangRef(message);
|
||||||
|
if (parsed === null) return undefined;
|
||||||
|
if (parsed.fallback === undefined) return parsed.path;
|
||||||
|
return `${parsed.path}${ID_FALLBACK_SEPARATOR}${parsed.fallback}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fallbackMessage(message: string, params?: LangParams): string {
|
||||||
|
const parsed = parseLangRef(message);
|
||||||
|
return resolveFallbackTemplate(parsed?.fallback ?? parsed?.path ?? message, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createSiumResolver(options: SiumResolverOptions): SiumResolver {
|
||||||
|
const { lang, defaultLocale, diagnostics } = options;
|
||||||
|
|
||||||
|
const resolve: SiumResolver['resolve'] = (message, params, locale = defaultLocale) => {
|
||||||
|
const langPath = composeLangPath(message);
|
||||||
|
if (lang === undefined || langPath === undefined) {
|
||||||
|
return fallbackMessage(message, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return lang.t(langPath, params, locale);
|
||||||
|
} catch (error) {
|
||||||
|
emitSiumDiagnostic(diagnostics, SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK, {
|
||||||
|
message,
|
||||||
|
error
|
||||||
|
});
|
||||||
|
return fallbackMessage(message, params);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const resolveIssue: SiumResolver['resolveIssue'] = (entry, locale) => {
|
||||||
|
return resolve(entry.message, entry.params, locale);
|
||||||
|
};
|
||||||
|
|
||||||
|
const resolveIssues: SiumResolver['resolveIssues'] = (issues, locale) => {
|
||||||
|
return issues.map((entry) => resolveIssue(entry, locale));
|
||||||
|
};
|
||||||
|
|
||||||
|
return { resolve, resolveIssue, resolveIssues };
|
||||||
|
}
|
||||||
Loading…
Reference in new issue