Files

65 lines
1.9 KiB
TypeScript

import type { Language } from '@/domain/language/entities';
import type { MenuItem } from '@/domain/menu/entities';
import type { OrderLine } from '@/domain/shared/order-line';
import { getMenuItemById } from '@/infrastructure/menu/static-menu-data';
import {
getCategoryName as resolveCategoryName,
getMenuItemInclusionNote as resolveMenuItemInclusionNote,
} from '@/presentation/i18n/menu/category-names';
import { getMenuItemName as resolveItemName } from '@/presentation/i18n/menu/item-names';
import type { TranslationBundle } from '@/presentation/i18n/translations';
type MenuTextBundle = TranslationBundle & {
menuDescriptions?: Record<string, string>;
};
export function getMenuItemName(
lang: Language,
item: Pick<MenuItem, 'id' | 'name'>,
): string {
return resolveItemName(lang, item.id, item.name);
}
export function getMenuItemDescription(
lang: Language,
t: TranslationBundle,
item: Pick<MenuItem, 'id' | 'description'>,
): string {
const bundle = t as MenuTextBundle;
return (
bundle.menuDescriptions?.[item.id] ??
(lang === 'en' ? item.description : undefined) ??
item.description ??
''
);
}
export function getCategoryName(
lang: Language,
categoryId: string,
fallback: string,
): string {
return resolveCategoryName(lang, categoryId, fallback);
}
export function getMenuItemInclusionNote(lang: Language, categoryId: string): string | undefined {
return resolveMenuItemInclusionNote(lang, categoryId);
}
export function localizeMenuItem(
lang: Language,
t: TranslationBundle,
item: MenuItem,
): MenuItem {
return {
...item,
name: getMenuItemName(lang, item),
description: getMenuItemDescription(lang, t, item),
};
}
export function localizeOrderLineName(lang: Language, line: OrderLine): string {
const menuItem = getMenuItemById(line.id);
if (!menuItem) return line.name;
return getMenuItemName(lang, menuItem);
}