/** Отображаемое имя продукта (с пробелом), не путать с `productName` сборки (`TTRPGPlayer`). */ export const APP_DISPLAY_NAME_EN = 'TTRPG Player'; export const APP_DISPLAY_NAME_RU = 'НРИ Плеер'; /** Системный идентификатор приложения (exe, AppImage, appId). */ export const APP_PRODUCT_NAME = 'TTRPGPlayer'; export const APP_BUNDLE_ID = 'com.ttrpgplayer.app'; export function appDisplayNameForLocale(localeTag: string): string { const tag = localeTag.trim().toLowerCase(); if (tag.startsWith('ru')) return APP_DISPLAY_NAME_RU; return APP_DISPLAY_NAME_EN; } /** Префикс заголовка окон (EN): `TTRPG - Editor`. RU — полное имя «НРИ Плеер». */ export const APP_WINDOW_BRAND = 'TTRPG'; export type AppWindowKind = | 'editor' | 'presentation' | 'control' | 'boot' | 'sceneDescription' | 'materials' | 'npcsEditor' | 'sceneEditor' | 'npcs'; const WINDOW_SUFFIX: Record = { editor: { ru: 'Редактор компании', en: 'Campaign editor' }, presentation: { ru: 'Презентация', en: 'Presentation' }, control: { ru: 'Пульт управления', en: 'Control deck' }, boot: { ru: 'Загрузка', en: 'Loading' }, sceneDescription: { ru: 'Описание сцены', en: 'Scene description' }, materials: { ru: 'Материалы', en: 'Materials' }, npcsEditor: { ru: 'НПС', en: 'NPCs' }, sceneEditor: { ru: 'Редактор сцены', en: 'Scene editor' }, npcs: { ru: 'НПС', en: 'NPCs' }, }; export function windowChromeTitle(kind: AppWindowKind, localeTag: string): string { const tag = localeTag.trim().toLowerCase(); const ru = tag.startsWith('ru'); const prefix = ru ? APP_DISPLAY_NAME_RU : APP_WINDOW_BRAND; const suffix = ru ? WINDOW_SUFFIX[kind].ru : WINDOW_SUFFIX[kind].en; return `${prefix} - ${suffix}`; } /** Подписи фильтров в системных диалогах выбора файла (main process). */ export function openDialogFilterLabel( kind: 'images' | 'imagesAndVideo' | 'audio' | 'videoAndAudio', localeTag: string, ): string { const ru = localeTag.trim().toLowerCase().startsWith('ru'); switch (kind) { case 'imagesAndVideo': return ru ? 'Изображения и видео' : 'Images and video'; case 'audio': return ru ? 'Аудио' : 'Audio'; case 'videoAndAudio': return ru ? 'Видео и аудио' : 'Video and audio'; default: return ru ? 'Изображения' : 'Images'; } }