import type { ParamDef, ToolEntry } from "$lib/registry"; import type { SearchDoc } from "./matching"; import { getMergedDict } from "./locale.svelte"; import { ru } from "./ru"; /** * Строки инструмента на активной локали. * Русский текст живёт в самом реестре (базовая локаль), * переводы — в секции tools словарей; отсутствие ключа даёт фолбэк на реестр. */ export function toolTitle(tool: ToolEntry): string { return getMergedDict().tools[tool.id]?.title ?? tool.title; } export function toolDescription(tool: ToolEntry): string { return getMergedDict().tools[tool.id]?.description ?? tool.description; } export function paramLabel(tool: ToolEntry, param: ParamDef): string { const viaDict = getMergedDict().tools[tool.id]?.params?.[param.id]; if (viaDict) return viaDict; const viaDef = param as { label?: string }; return viaDef.label ?? param.id; } export function optionLabel( tool: ToolEntry, param: ParamDef, value: string, ): string { const viaDict = getMergedDict().tools[tool.id]?.options?.[param.id]?.[value]; if (viaDict) return viaDict; if (param.type === "select") { return param.options.find((o) => o.value === value)?.label ?? value; } return value; } function dedupe(values: string[]): string[] { return [...new Set(values.filter((v) => v.length > 0))]; } /** * Поисковый документ инструмента: строки активной локали, русского и английского * (реестр) вместе — запрос находит инструмент по любому из языков независимо * от того, какой сейчас включён. */ export function toolSearchDoc(tool: ToolEntry): SearchDoc { const active = getMergedDict().tools[tool.id]; return { id: tool.id, titles: dedupe([ active?.title ?? "", ru.tools[tool.id]?.title ?? "", tool.title, ]), descriptions: dedupe([ active?.description ?? "", ru.tools[tool.id]?.description ?? "", tool.description, ]), }; }