Files
silo-server/web/src/lib/metadataLanguagePreferences.ts
T
QuickandGitHub 73488d1bfa feat(metadata): add original-language preferences (#526)
* feat(metadata): add original-language preferences

* fix(settings): show metadata exceptions immediately

* docs(settings): add metadata language screenshot

* fix(settings): make language exceptions responsive

* fix(settings): standardize language display names
2026-07-31 15:23:30 -04:00

45 lines
1.5 KiB
TypeScript

import { normalizeLanguageCode } from "@/lib/languageNames";
/** Valid private-use BCP 47 tag understood by the server as item-original. */
export const ORIGINAL_METADATA_LANGUAGE = "x-silo-original";
export type MetadataLanguageOverrides = Record<string, string>;
/**
* Treat the settings response as untrusted JSON at the component boundary.
* The server validates writes, but this also keeps a stale/broken cached value
* from making the editor unusable.
*/
export function normalizeMetadataLanguageOverrides(value: unknown): MetadataLanguageOverrides {
if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
const normalized: MetadataLanguageOverrides = {};
for (const [source, target] of Object.entries(value)) {
const sourceCode = normalizeLanguageCode(source);
if (!/^[a-z]{2,3}$/.test(sourceCode) || typeof target !== "string" || !target.trim()) {
continue;
}
normalized[sourceCode] = target.trim();
}
return normalized;
}
export function withMetadataLanguageOverride(
overrides: MetadataLanguageOverrides,
source: string,
target: string,
): MetadataLanguageOverrides {
const sourceCode = normalizeLanguageCode(source);
if (!/^[a-z]{2,3}$/.test(sourceCode) || !target.trim()) return overrides;
return { ...overrides, [sourceCode]: target.trim() };
}
export function withoutMetadataLanguageOverride(
overrides: MetadataLanguageOverrides,
source: string,
): MetadataLanguageOverrides {
const next = { ...overrides };
delete next[normalizeLanguageCode(source)];
return next;
}