Files
DndGamePlayer/app/shared/appBranding.ts
T
Ivan Fontosh 02d73ddf81 feat: scene traps, material legends, and scene editor window
Add trap overlays with session state, material legend editor/panel, and a dedicated scene editor window wired through IPC and project persistence.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 16:29:43 +08:00

64 lines
2.4 KiB
TypeScript

/** Отображаемое имя продукта (с пробелом), не путать с `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;
}
/** Префикс заголовка окон: `TTRPG - Редактор`. */
export const APP_WINDOW_BRAND = 'TTRPG';
export type AppWindowKind =
| 'editor'
| 'presentation'
| 'control'
| 'boot'
| 'sceneDescription'
| 'materials'
| 'npcsEditor'
| 'sceneEditor'
| 'npcs';
const WINDOW_SUFFIX: Record<AppWindowKind, { ru: string; en: string }> = {
editor: { ru: 'Редактор', en: 'Editor' },
presentation: { ru: 'Презентация', en: 'Presentation' },
control: { ru: 'Пульт', en: 'Control' },
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 suffix = tag.startsWith('ru') ? WINDOW_SUFFIX[kind].ru : WINDOW_SUFFIX[kind].en;
return `${APP_WINDOW_BRAND} - ${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';
}
}