docs: переводы оставшихся английских комментариев на русский

- src/api/API.js — комменты, описание env
- vite.config.js — описание полей
- src/App.jsx — IndexRoute (текст «Плеер Рублокса»)
- src/KubikonPlayer/KubikonPlayer.jsx — exitPlayer
- src/engine/PlayerController.js — _storysApiUrl
- src/engine/GameRuntime.js — _resolveExternalUrl
- src/engine/devlog.js — убрал упоминания приватных путей разработчика
- src/fixtures/sample-game.json — title/description
This commit is contained in:
МИН 2026-05-27 23:18:38 +03:00
parent 8428cda555
commit 6d86aa7c36
8 changed files with 55 additions and 53 deletions

View File

@ -56,15 +56,15 @@ function PlayerRoute() {
}
function IndexRoute() {
// Direct hit on `/` without a gameId.
// On a real deployment users should arrive with a ticket, so redirect them
// back to the main Rublox site. On dev (localhost) just show a hint.
// Прямой заход на `/` без gameId.
// На реальном деплое юзер должен прийти с ticket'ом редиректим обратно
// на главный сайт. На dev (localhost) показываем подсказку.
if (typeof window !== 'undefined' && window.location.hostname !== 'localhost'
&& window.location.hostname !== '127.0.0.1') {
window.location.assign(RUBLOX_HOME);
return null;
}
return <LoadingScreen text="Rublox Player" subText="Open /<gameId> to launch a game." />;
return <LoadingScreen text="Плеер Рублокса" subText="Открой /<gameId> чтобы запустить игру." />;
}
export default function App() {

View File

@ -32,14 +32,14 @@ import KubikonMobileControls from './KubikonMobileControls';
// document.referrer пуст, если юзер открыл вкладку напрямую или прошло
// слишком много времени тогда дефолт rublox.pro.
function exitPlayer(gameId) {
// User clicked "Exit" suppress browser-confirm on close (the
// onBeforeUnload listener below reads this flag).
// Юзер явно нажал «Выход» отключаем browser-confirm о закрытии
// (флаг читает onBeforeUnload listener ниже).
try { window.__rubloxExplicitExit = true; } catch {}
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const RUBLOX_HOME = env.VITE_RUBLOX_HOME || 'https://rublox.pro/app';
if (gameId) {
// Pass gameId via ?game=<id> main site reads it and re-opens the
// game card (so users return to the page they came from).
// Передаём gameId через ?game=<id> главный сайт прочитает и снова
// откроет карточку игры (юзер возвращается на ту же страницу).
const sep = RUBLOX_HOME.includes('?') ? '&' : '?';
window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`);
} else {

View File

@ -1,33 +1,33 @@
// API endpoints for Rublox Player.
// API-эндпоинты плеера Рублокса.
//
// All backend URLs are configurable via Vite environment variables:
// VITE_API_BASE — base URL for HTTP API (default: '' for localhost+vite-proxy)
// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP endpoint
// VITE_REALTIME_WS — Colyseus WebSocket endpoint
// VITE_RUBLOX_HOME — main Rublox site (where users are redirected if no JWT)
// Все URL бэкенда настраиваются через Vite environment variables:
// VITE_API_BASE — базовый URL HTTP-API (дефолт: '' для localhost+vite-proxy)
// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP-эндпоинт
// VITE_REALTIME_WS — Colyseus WebSocket-эндпоинт
// VITE_RUBLOX_HOME — главный сайт Рублокса (редирект если нет JWT)
//
// See .env.example for a fully-working set of defaults that point at
// the public staging environment (https://dev-api.rublox.pro).
// См. .env.example с готовыми дефолтами на публичный staging
// (https://dev-api.rublox.pro).
//
// In dev (vite on localhost) BASE is empty so requests go to relative
// /api-* paths, which vite.config.js proxies to staging/prod.
// В dev (vite на localhost) BASE пустой и запросы идут на относительные
// /api-* пути, которые vite.config.js проксирует на staging/prod.
const ENV = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const IS_DEV = typeof window !== 'undefined'
&& (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');
// Empty BASE in dev → vite proxy handles routing.
// In prod → either env-configured backend or current origin.
// Пустой BASE в dev → vite-proxy роутит сам.
// В prod → либо env-настроенный бэкенд, либо текущий origin.
const BASE = ENV.VITE_API_BASE
?? (IS_DEV ? '' : (typeof window !== 'undefined' ? window.location.origin : ''));
export const USER_addres = BASE + '/api-user';
export const STORYS_addres = BASE + '/api-storys';
// Realtime (Colyseus) endpoints. Use HTTPS-protocol-relative variant when
// served from HTTPS page (vite proxy handles /api-game), otherwise use
// the env-configured direct URLs.
// Эндпоинты realtime (Colyseus). По умолчанию используем HTTPS-relative
// для HTTPS-страницы (vite-proxy обрабатывает /api-game), иначе берём
// env-настроенные прямые URL.
const IS_HTTPS = typeof window !== 'undefined' && window.location.protocol === 'https:';
export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP
@ -35,9 +35,9 @@ export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP
export const REALTIME_WS = ENV.VITE_REALTIME_WS
?? (IS_HTTPS ? `wss://${window.location.host}/api-game` : 'ws://localhost:8685');
// Rublox main site — where to redirect users with no ticket/JWT.
// Главный сайт Рублокса — куда редиректить юзеров без ticket/JWT.
export const RUBLOX_HOME = ENV.VITE_RUBLOX_HOME ?? 'https://rublox.pro/app';
// Asset folders for profile photos & skins (served by user/storys microservices).
// Папки ассетов для фото профиля и скинов (раздают user/storys-микросервисы).
export const FOLDER_PROFILE = USER_addres + '/assets/profile/';
export const FOLDER_STORYS = STORYS_addres + '/assets/skin/';

View File

@ -3126,7 +3126,7 @@ export class GameRuntime {
: '';
return `${playerBase}/${playMatch[1]}`;
}
// Legacy /kubikon/* routes — redirect to main site.
// Legacy /kubikon/* роуты — редирект на главный сайт.
if (url.startsWith('/kubikon/gd')) return rubloxBase + '/app/gd';
if (url.startsWith('/kubikon')) return rubloxBase + '/app';
if (url.startsWith('/app')) return rubloxBase + url;

View File

@ -41,11 +41,11 @@ const CAMERA_MODES = ['third', 'first', 'front'];
const SIDEVIEW_DIST = 14;
const SIDEVIEW_HEIGHT = 2.5;
// Build absolute /api-storys URL.
// Uses VITE_API_BASE env if set (preferred for deployments where player
// and API are on different domains), otherwise falls back to:
// - empty base in dev (vite proxy handles routing)
// - current origin in prod (assumes API is co-hosted)
// Строит абсолютный URL для /api-storys.
// Использует VITE_API_BASE если задан (предпочтительно когда плеер и API
// на разных доменах), иначе fallback:
// - пустой base в dev (vite-proxy роутит сам)
// - текущий origin в prod (предполагаем что API на том же домене)
function _storysApiUrl(path) {
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
if (env.VITE_API_BASE) {

View File

@ -1,12 +1,14 @@
/**
* Dev-log клиент шлёт логи на локальный Python-сервер
* (c:\Users\min\Desktop\server\dev-tools\devlog-server.py)
* Dev-log клиент шлёт логи на локальный HTTP-сервер на localhost:8765.
*
* Сервер пишет в файл `devlog.txt` который Claude читает через Read tool.
* Это убирает необходимость копировать логи из консоли вручную.
* Полезно когда нужно собирать console.* логи из браузера в файл для
* последующего просмотра (например при отладке вместе с AI-ассистентом).
*
* Активен только на localhost. На любом другом хосте запросы тихо
* игнорируются (devlog-сервер недоступен).
* игнорируются (если devlog-сервер не запущен).
*
* Простой devlog-сервер можно собрать за 30 строк на Python/Node.js
* принимать POST /log с JSON-body и писать в файл.
*
* Использование:
* import { devlog, attachConsoleHook } from './devlog';

View File

@ -1,9 +1,9 @@
{
"id": "sample",
"title": "Sample Game (standalone mode)",
"description": "A minimal demo project bundled with the player. Loaded when VITE_STANDALONE=true.",
"title": "Демо-игра (standalone-режим)",
"description": "Минимальный демо-проект встроенный в плеер. Загружается при VITE_STANDALONE=true.",
"author_id": 0,
"author_username": "Rublox",
"author_username": "Рублокс",
"likes_count": 0,
"dislikes_count": 0,
"play_count": 0,

View File

@ -1,23 +1,23 @@
import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
// Vite config for Rublox Player.
// Vite-конфиг плеера Рублокса.
//
// - port 5173 is fixed (player code and external links assume it)
// - outDir 'build' (deployed under nginx /var/www/rublox-player/build/)
// - manualChunks split babylon/colyseus into separate chunks
// (engine ~46k lines, single-bundle build is >5 MB; browsers parse longer)
// - define for process.env.NODE_ENV — shim for engine code that used the
// CRA-provided global
// - dev proxy targets staging by default; override via VITE_API_PROXY_TARGET
// in .env.development.local to point at your own backend.
// - порт 5173 фиксирован (код плеера и внешние ссылки на него рассчитывают)
// - outDir 'build' (деплоится в nginx /var/www/rublox-player/build/)
// - manualChunks выносят babylon/colyseus в отдельные чанки
// (движок ~46к строк, single-bundle >5 МБ; браузер парсит дольше)
// - define для process.env.NODE_ENV — шим для engine-кода, который
// использовал CRA-провайденный глобал
// - dev-proxy по умолчанию ходит на staging; переопределяй через
// VITE_API_PROXY_TARGET в .env.development.local чтобы указать свой бэкенд.
export default defineConfig(({ mode }) => {
// Load env so we can use VITE_API_PROXY_TARGET in proxy config.
// Грузим env чтобы взять VITE_API_PROXY_TARGET для proxy-конфига.
const env = loadEnv(mode, process.cwd(), '');
const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro';
// All backend prefixes the player talks to.
// Each entry creates a Vite proxy: /api-X/* → ${PROXY_TARGET}/api-X/*
// Все префиксы бэкенда с которыми общается плеер.
// Каждая запись создаёт Vite-proxy: /api-X/* → ${PROXY_TARGET}/api-X/*
const proxyPrefixes = ['/api-user', '/api-storys', '/api-game'];
const proxy = Object.fromEntries(
proxyPrefixes.map((p) => [
@ -29,8 +29,8 @@ export default defineConfig(({ mode }) => {
return {
plugins: [react()],
server: {
// Bind IPv4 explicitly — Vite defaults to [::1] on Windows, which
// breaks IPv4 localhost (ECONNREFUSED from curl / browser).
// Явно биндим IPv4 — Vite по умолчанию слушает [::1] на Windows,
// что ломает IPv4-localhost (ECONNREFUSED от curl/браузера).
host: '127.0.0.1',
port: 5173,
strictPort: true,