Skip to content

Commit 309f647

Browse files
committed
refactor: translate comments and documentation to improve clarity for Russian-speaking developers
1 parent a50a054 commit 309f647

155 files changed

Lines changed: 1810 additions & 2822 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,14 @@ TJudge/
294294
| Документ | Описание |
295295
|----------|----------|
296296
| [docs/USER_GUIDE.md](docs/USER_GUIDE.md) | Руководство пользователя и администратора |
297-
| [docs/SETUP.md](docs/SETUP.md) | Настройка окружения, разработка, деплой |
297+
| [docs/SETUP.md](docs/SETUP.md) | Настройка окружения и локальная разработка |
298298
| [docs/SELF_HOSTED.md](docs/SELF_HOSTED.md) | Развёртывание на собственном сервере |
299+
| [docs/OPERATIONS.md](docs/OPERATIONS.md) | Production деплой, runbook, бэкапы, мониторинг |
300+
| [docs/SLO.md](docs/SLO.md) | Service Level Objectives и алерты |
299301
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Детальная архитектура системы |
300302
| [docs/API_GUIDE.md](docs/API_GUIDE.md) | REST API и WebSocket эндпоинты |
301303
| [docs/DATABASE_SCHEMA.md](docs/DATABASE_SCHEMA.md) | Схема базы данных |
304+
| [docs/ADDING_GAMES.md](docs/ADDING_GAMES.md) | Добавление новых игр |
302305
| [docs/PERFORMANCE_TESTING.md](docs/PERFORMANCE_TESTING.md) | Тестирование производительности |
303306

304307
---

cmd/api/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func main() {
8080
zap.String("env", "production"),
8181
)
8282

83-
// P2.6: OpenTelemetry tracing (опционально, если задан OTEL_EXPORTER_OTLP_ENDPOINT).
83+
// OpenTelemetry tracing (опционально, если задан OTEL_EXPORTER_OTLP_ENDPOINT).
8484
otelShutdown, err := observability.InitTracerProvider(context.Background(), "tjudge-api", "dev", log)
8585
if err != nil {
8686
log.Warn("Failed to init OTel tracing (continuing without)", zap.Error(err))
@@ -179,9 +179,9 @@ func main() {
179179
events.MatchesCreated{}, events.MatchResultProcessed{},
180180
)
181181

182-
// Redis Pub/Sub bridge: receive events from worker process for WebSocket broadcast.
183-
// Uses a dedicated bus so that worker-originated events only trigger broadcast,
184-
// avoiding double cache updates (worker already updated its own cache).
182+
// Мост Redis Pub/Sub: принимает события из процесса воркера для рассылки по WebSocket.
183+
// Используется отдельная шина, чтобы события от воркера триггерили только рассылку
184+
// и не приводили к повторному обновлению кэша (воркер уже обновил свой кэш).
185185
wsBus := events.NewSyncBus(log)
186186
wsBus.Subscribe(
187187
eventhandlers.NewBroadcastHandler(wsHub, log),
@@ -261,7 +261,7 @@ func main() {
261261
// Создаём API сервер
262262
adminChecker := middleware.NewVerifiedAdminChecker(userRepo, 5*time.Minute)
263263

264-
// P1.12: audit log (async). Буфер 2048 при нагрузке 10 admin-запросов/сек
264+
// Audit log (async). Буфер 2048: при нагрузке 10 admin-запросов/сек
265265
// даёт ~200 сек запаса перед drop'ом.
266266
auditRepo := db.NewAuditLogRepository(database)
267267
auditLogger := middleware.NewAuditLogger(auditRepo, 2048, log)
@@ -346,7 +346,7 @@ func main() {
346346
if err := srv.Shutdown(shutdownCtx); err != nil {
347347
log.Error("API server forced to shutdown", zap.Error(err))
348348
}
349-
// UR bug_015: останавливаем background-горутины (rate-limiter cleanup).
349+
// Останавливаем background-горутины (rate-limiter cleanup).
350350
apiServer.Close()
351351

352352
// Останавливаем metrics сервер

cmd/benchmark/main.go

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"time"
1414
)
1515

16-
// BenchmarkResult holds parsed benchmark result
16+
// BenchmarkResult хранит распарсенный результат бенчмарка.
1717
type BenchmarkResult struct {
1818
Name string
1919
NsOp int64
@@ -22,15 +22,15 @@ type BenchmarkResult struct {
2222
Iterations int64
2323
}
2424

25-
// BenchmarkStandard defines expected performance standards
25+
// BenchmarkStandard описывает ожидаемые стандарты производительности.
2626
type BenchmarkStandard struct {
2727
Name string
2828
Description string
2929
ExpectedNsOp int64
3030
Category string
3131
}
3232

33-
// Rating represents performance rating
33+
// Rating представляет оценку производительности.
3434
type Rating string
3535

3636
const (
@@ -41,7 +41,7 @@ const (
4141
RatingCritical Rating = "CRITICAL"
4242
)
4343

44-
// Color codes for terminal output
44+
// Цветовые коды для вывода в терминал.
4545
const (
4646
colorReset = "\033[0m"
4747
colorRed = "\033[31m"
@@ -53,9 +53,9 @@ const (
5353
colorBold = "\033[1m"
5454
)
5555

56-
// Standards defines expected performance for each benchmark
56+
// Standards описывает ожидаемую производительность для каждого бенчмарка.
5757
var Standards = map[string]BenchmarkStandard{
58-
// API Benchmarks
58+
// Бенчмарки API
5959
"BenchmarkHealthEndpoint": {
6060
Name: "Health Endpoint",
6161
Description: "Basic health check endpoint",
@@ -117,7 +117,7 @@ var Standards = map[string]BenchmarkStandard{
117117
Category: "API",
118118
},
119119

120-
// Worker Benchmarks
120+
// Бенчмарки Worker
121121
"BenchmarkWorkerPool_ThroughputSmall": {
122122
Name: "Worker Pool Small",
123123
Description: "2-4 workers, 100 matches",
@@ -161,7 +161,7 @@ var Standards = map[string]BenchmarkStandard{
161161
Category: "Worker",
162162
},
163163

164-
// Queue Benchmarks
164+
// Бенчмарки Queue
165165
"BenchmarkQueueEnqueue": {
166166
Name: "Queue Enqueue",
167167
Description: "Add match to Redis queue",
@@ -199,7 +199,7 @@ var Standards = map[string]BenchmarkStandard{
199199
Category: "Queue",
200200
},
201201

202-
// Database Benchmarks
202+
// Бенчмарки БД
203203
"BenchmarkDBHealth": {
204204
Name: "DB Health",
205205
Description: "Database health check",
@@ -305,25 +305,25 @@ func main() {
305305
fmt.Println("Note: Only standalone benchmarks (no DB/Redis required)")
306306
fmt.Println()
307307

308-
// Run only benchmarks that don't require external services
309-
// Exclude: API (needs full server), Queue (needs Redis), DB (needs Postgres)
310-
// Include: Worker pool mocks, JSON parsing, UUID generation, Match creation
308+
// Запускаем только бенчмарки, которым не нужны внешние сервисы.
309+
// Исключаем: API (нужен полноценный сервер), Queue (нужен Redis), DB (нужен Postgres).
310+
// Включаем: моки Worker pool, JSON parsing, UUID generation, Match creation.
311311
args := []string{
312312
"test",
313313
"-tags=benchmark",
314314
"-bench=" + *pattern,
315315
"-benchmem",
316316
"-benchtime=500ms",
317317
"-timeout=30s",
318-
"-run=^$", // Don't run regular tests
318+
"-run=^$", // Не запускать обычные тесты.
319319
"./tests/benchmark/...",
320320
}
321321
if *verbose {
322322
args = append(args, "-v")
323323
}
324324

325-
// #nosec G204 -- "go" hardcoded; args hardcoded benchmark flags
326-
// (bench regex, timeout, test path). CLI-utility, не server-endpoint.
325+
// #nosec G204 -- "go" hardcoded; args - hardcoded benchmark flags
326+
// (bench regex, timeout, test path). CLI-утилита, а не серверный эндпоинт.
327327
cmd := exec.Command("go", args...)
328328
cmd.Dir = findProjectRoot()
329329

@@ -334,7 +334,7 @@ func main() {
334334
err = cmd.Run()
335335
output = stdout.Bytes()
336336

337-
// Print output in real-time for debugging
337+
// Печатаем вывод для отладки.
338338
if *verbose {
339339
fmt.Println(string(output))
340340
}
@@ -346,7 +346,7 @@ func main() {
346346
}
347347
}
348348
} else {
349-
// Read from stdin
349+
// Читаем из stdin.
350350
fmt.Println(colorCyan + "Reading benchmark results from stdin..." + colorReset)
351351
fmt.Println("(Run with -run flag to execute benchmarks automatically)")
352352
fmt.Println()
@@ -375,20 +375,20 @@ func main() {
375375
}
376376

377377
func disableColors() {
378-
// Can't reassign constants, so we'd need to use variables
379-
// For simplicity, we'll skip this feature
378+
// Константы нельзя переопределить, потребовались бы переменные.
379+
// Для простоты эту фичу пропускаем.
380380
}
381381

382382
func findProjectRoot() string {
383-
// Try to find go.mod
383+
// Пытаемся найти go.mod.
384384
dir, _ := os.Getwd()
385385
return dir
386386
}
387387

388388
func parseBenchmarkOutput(output string) []BenchmarkResult {
389389
var results []BenchmarkResult
390390

391-
// Pattern: BenchmarkName-N iterations ns/op B/op allocs/op
391+
// Шаблон: BenchmarkName-N iterations ns/op B/op allocs/op.
392392
re := regexp.MustCompile(`(Benchmark\w+)(?:-\d+)?\s+(\d+)\s+([\d.]+)\s+ns/op(?:\s+([\d.]+)\s+B/op)?(?:\s+(\d+)\s+allocs/op)?`)
393393

394394
for _, line := range strings.Split(output, "\n") {
@@ -476,7 +476,7 @@ func printResults(results []BenchmarkResult) {
476476
fmt.Println(colorBold + "================================================================================" + colorReset)
477477
fmt.Println()
478478

479-
// Group by category
479+
// Группируем по категориям.
480480
categories := map[string][]BenchmarkResult{
481481
"API": {},
482482
"Worker": {},
@@ -537,7 +537,7 @@ func printResults(results []BenchmarkResult) {
537537
}
538538
}
539539

540-
// Summary
540+
// Итоги.
541541
fmt.Println(colorBold + "================================================================================" + colorReset)
542542
fmt.Println(colorBold + " SUMMARY" + colorReset)
543543
fmt.Println(colorBold + "================================================================================" + colorReset)
@@ -553,7 +553,7 @@ func printResults(results []BenchmarkResult) {
553553
fmt.Printf(" %s---%s Critical (> 5.0x): %d\n", colorRed, colorReset, ratings[RatingCritical])
554554
fmt.Println()
555555

556-
// Recommendations
556+
// Рекомендации.
557557
if ratings[RatingCritical] > 0 {
558558
fmt.Printf(" %s!!! CRITICAL:%s Some benchmarks are >5x slower than expected.\n", colorRed, colorReset)
559559
fmt.Println(" Immediate investigation required!")

cmd/worker/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func main() {
113113
events.MatchResultProcessed{},
114114
)
115115

116-
// Redis Pub/Sub bridge: forward events to API process for WebSocket broadcast
116+
// Мост Redis Pub/Sub: пересылает события в процесс API для рассылки по WebSocket.
117117
redisEventPub := events.NewRedisEventPublisher(redisCache, log)
118118
eventBus.Subscribe(
119119
redisEventPub,
@@ -328,7 +328,7 @@ func tryBuildWithCompose(log *logger.Logger) bool {
328328

329329
for _, path := range composePaths {
330330
if _, err := os.Stat(path); err == nil {
331-
// #nosec G204 -- "docker compose" hardcoded; path hardcoded список
331+
// #nosec G204 -- "docker compose" hardcoded; path - hardcoded список
332332
// composePaths, не из внешнего input.
333333
cmd := exec.Command("docker", "compose", "-f", path, "build", "tjudge-cli")
334334
cmd.Stdout = os.Stdout
@@ -370,7 +370,7 @@ func tryBuildDirectly(log *logger.Logger) bool {
370370
for _, paths := range dockerfilePaths {
371371
if _, err := os.Stat(paths.dockerfile); err == nil {
372372
// #nosec G204 -- все args hardcoded (docker, build, -t, tag);
373-
// paths.dockerfile/context hardcoded struct-literal.
373+
// paths.dockerfile/context - hardcoded struct-literal.
374374
cmd := exec.Command("docker", "build",
375375
"-t", "tjudge-cli:latest",
376376
"-f", paths.dockerfile,

docs/ADDING_GAMES.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
## Обзор
66

77
Каждая игра состоит из двух частей:
8-
1. **Исполнитель** логика игры в tjudge-cli (Rust)
9-
2. **Плагин** метаданные игры в Go-сервере
8+
1. **Исполнитель** - логика игры в tjudge-cli (Rust)
9+
2. **Плагин** - метаданные игры в Go-сервере
1010

1111
## Шаг 1: Реализация логики игры в tjudge-cli
1212

1313
Добавьте новый тип игры в проект [tjudge-cli](https://github.com/bmstu-itstech/tjudge-cli):
1414

1515
1. Создайте модуль игры в `src/games/your_game.rs`
16-
2. Реализуйте trait `Game` определите протокол взаимодействия (инициализация, итерации, подсчёт очков)
16+
2. Реализуйте trait `Game`: определите протокол взаимодействия (инициализация, итерации, подсчёт очков)
1717
3. Зарегистрируйте новый тип игры в CLI-аргументах
1818
4. Соберите обновлённый Docker-образ `tjudge-cli`
1919

@@ -79,4 +79,4 @@ curl -X POST http://localhost:8080/api/v1/tournaments/<tournament_id>/games/<gam
7979

8080
- **Множитель очков** (`ScoreMultiplier`) нужен для балансировки. Если очки за раунд в вашей игре значительно выше или ниже, чем в Дилемме заключённого, подберите множитель так, чтобы вклад игры в общий рейтинг был сопоставим.
8181
- **Имя игры** должно быть одинаковым в tjudge-cli и в Go-плагине. Именно по нему система сопоставляет записи в БД с исполнителем.
82-
- **Правила** в формате Markdown отображаются участникам на странице игры. Включайте протокол взаимодействия, формат ввода/вывода и ограничения.
82+
- **Правила** в формате Markdown отображаются участникам на странице игры. Включайте протокол взаимодействия, формат ввода и вывода и ограничения.

0 commit comments

Comments
 (0)