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