Files
DndGamePlayer/app/shared/appBranding.ts
T
Ivan Fontosh 1ab6ffd593 feat(tokens): animated paths for scene and NPC tokens
Add path editor window, session playback on control/presentation, and RMB controls. Fix live pose clock so motion no longer freezes after ~250ms.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-14 08:48:41 +08:00

68 lines
2.7 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;
}
/** Префикс заголовка окон (EN): `TTRPG - Editor`. RU — полное имя «НРИ Плеер». */
export const APP_WINDOW_BRAND = 'TTRPG';
export type AppWindowKind =
| 'editor'
| 'presentation'
| 'control'
| 'boot'
| 'sceneDescription'
| 'materials'
| 'npcsEditor'
| 'sceneEditor'
| 'tokenPathEditor'
| 'npcs';
const WINDOW_SUFFIX: Record<AppWindowKind, { ru: string; en: string }> = {
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' },
tokenPathEditor: { ru: 'Движение токена', en: 'Token path' },
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';
}
}