mod: localized English version of README and UI texts, enhanced accessibility and internationalization features
HYPN0 Build and Push Docker Image / build-and-push (push) Successful in 51s

This commit is contained in:
2026-09-27 19:19:59 +03:00
parent ebf78c2c48
commit 1c846f7912
38 changed files with 1360 additions and 1091 deletions
+59 -43
View File
@@ -10,39 +10,44 @@ import random
from typing import Optional
# Словари для локального генератора гипно-тайтлов
# Словари для локального генератора гипно-тайтлов на английском языке
HYPNO_ADJECTIVES = [
"мерцающий", "астральный", "гипнотический", "вульгарный", "сюрреалистический", "абсурдный", "психоделический",
"пульсирующий", "неоновый", "трансцендентный", "мозговой", "ментальный", "бессознательный", "космический",
"галлюциногенный", "фрактальный", " отрешённый", "синестетический", "параллельный", "иллюзорный", "эфемерный",
"гипножабий", "проводящий", "тошнотворный", "завораживающий", "магнетический", "беспечный", "сновидческий",
"психотропный", "мистический", "потусторонний", "беспечный", "сновидческий", "психотропный", "мистический",
"потусторонний", "спиральный", "зыбкий", "пахучий", "скользкий", "туманный", "онейрический", "эфирный",
"трансовый", "квантовый", "сочный", "гипно-абсурдный", "психоактивный", "сюрреалистичный", "магический",
"синтетический", "хроматический", "перцептивный", "психоделичный", "галлюцинаторный", "трансцендентальный",
"перфорированный", "перцепторный", "гипно-иллюзорный", "трансцендентальный", "вульгарный",
"Shimmering", "Astral", "Hypnotic", "Vulgar", "Surreal", "Absurd", "Psyche­delic",
"Pulsating", "Neon", "Trans­cendent", "Cerebral", "Mental", "Subcon­scious", "Cosmic",
"Halluci­nogenic", "Fractal", "Detached", "Synes­thetic", "Parallel", "Illusory", "Ephemeral",
"Hypnot­oadian", "Conductive", "Mesme­rizing", "Magnetic", "Carefree", "Oneiric",
"Psychot­ropic", "Mystical", "Other­worldly", "Spiral", "Quivering", "Slippery", "Misty",
"Ethereal", "Trance", "Quantum", "Juicy", "Hypno-Absurd", "Psychoactive", "Magical",
"Synthetic", "Chromatic", "Perceptive", "Perforated", "Vibra­tional", "Neural",
"Subliminal", "Glitched", "Radioactive", "Brain-Melting", "Galactic", "Phospho­rescent",
"Chaotic", "Hypnagogic", "Interdim­ensional", "Cybernetic", "Uncanny",
]
HYPNO_NOUNS = [
"транс", "пульсар", "взгляд", "слизень", "вихрь", "портал", "путь", "фрактал", "сигнал", "спектр",
"резонанс", "морок", "оазис", "омут", "лабиринт", "импульс", "монолит", "оракул", "вектор",
"сгусток", "каскад", "горизонт", "мухомор", "паттерн", "контур", "фантом", "всплеск", "мираж", "транквилизатор",
"взмах", "взгляд", "морок", "туман", "свет", "кристалл", "поток", "сингулятор", "снег", "пульс", "глюк",
"качан", "сигнал", "поток", "свет", "синтез", "рык", "трепет", "плюх", "Му", "бip-бip", "карачун", "фронтир",
"сторож", "привратник", "шёпот", "шлепок по жопе", "гриб", "плевок", "червяк", "пузырь", "психо-паук",
"перцептор",
"Trance", "Pulsar", "Gaze", "Brain Slug", "Vortex", "Portal", "Path", "Fractal", "Signal", "Spectrum",
"Resonance", "Mirage", "Oasis", "Abyss", "Labyrinth", "Impulse", "Monolith", "Oracle", "Vector",
"Clot", "Cascade", "Horizon", "Toadstool", "Pattern", "Contour", "Phantom", "Splash", "Tranqui­lizer",
"Mist", "Crystal", "Stream", "Singulator", "Pulse", "Glitch", "Synthesis", "Roar", "Tremor",
"Frontier", "Sentinel", "Gatekeeper", "Whisper", "Spore", "Worm", "Bubble", "Psycho-Spider",
"Receptor", "Mind-Warp", "Hypnotoad", "Neuron", "Oscil­lation", "Echo", "Hologram", "Matrix",
"Mind-drill", "Neurotoxin", "Dreamscape", "Substance",
]
HYPNO_GENITIVES = [
"сознания", "Гипножабы", "бессознательного", "пустоты", "матрицы", "психо-паутины", "слизня", "ноосферы",
"нео-модерна", "транса", "глубины", "эфира", "плесени", "измерения", "пуантилизма", "субстанции",
"неопределенности", "континуума", "кислоты", "сына подруги твоей мамы", "перцепции", "сновидений",
"галлюцинаций", "психоделики", "трансцендентности", "потустороннего мира",
"of Consciousness", "of the Hypnotoad", "of the Subcon­scious",
"of the Void", "of the Matrix", "of the Psycho-Web", "of the Brain Slug",
"of the Noosphere", "of the Neo-Modern", "of the Deep Trance",
"of the Ether", "of the 4th Dimension", "of Pointillism", "of the Substance",
"of Uncer­tainty", "of the Continuum", "of Acid", "of Pure Perception",
"of Lucid Dreams", "of Halluci­nations", "of Psyche­delia", "of Trans­cendence",
"of the Nether­world", "of DOOP Regul­ations", "of Galactic Frequencies",
"of Grade 24 Bureaucracy",
]
HYPNO_POSTFIXES = [
"#42", "v3.14", "(Ultra)", "(Фаза 7)", "(Альфа)", "(Омега)", "(Протокол 09)", "(Ревизия 14)", "(Экстракт)",
"(Слой 9)", "(Палата №6)", "(Ангар 18)", "(Неоконченное произведение)", "(Секретный проект)",
"#42", "v3.14", "(Ultra)", "(Phase 7)", "(Alpha)", "(Omega)", "(Protocol 09)", "(Revision 14)",
"(Extract)", "(Layer 9)", "(Ward 106)", "(Hangar 18)", "(Unfinished Opus)", "(Secret Project)",
"[Classified]", "(DOOP-66)", "(Sub-Level 4)", "(MK-Ultra)", "С90"
]
@@ -50,25 +55,36 @@ def generate_hypno_title(seed: Optional[int] = None) -> str:
"""
Генерирует сочное гипнотическое название для картины на основе словарей.
Примеры:
- «Мерцающий Транс сознания #42»
- «Гипножабий Пульсар психо-паутины»
- «Астральный Взгляд v3.14»
- «Hypnotic Pulsar of the Hypnotoad #42»
- «Astral Gaze»
- «Brain Slug of the Void»
- «Transcendent (Ultra)»
- «Hypnotic»
- «Vortex»
"""
rng = random.Random(seed)
adj = rng.choice(HYPNO_ADJECTIVES)
noun = rng.choice(HYPNO_NOUNS)
pattern_type = rng.randint(1, 3)
if pattern_type == 1:
genitive = rng.choice(HYPNO_GENITIVES)
postfix = rng.choice(HYPNO_POSTFIXES)
return f"{adj} {noun} {genitive} {postfix}"
elif pattern_type == 2:
genitive = rng.choice(HYPNO_GENITIVES)
return f"{adj} {noun} {genitive}"
else:
postfix = rng.choice(HYPNO_POSTFIXES)
return f"{adj} {noun} {postfix}"
genitive = rng.choice(HYPNO_GENITIVES)
postfix = rng.choice(HYPNO_POSTFIXES)
patterns = [
# Однословные варианты
lambda: noun,
lambda: adj,
# Двухсловные комбинации
lambda: f"{adj} {noun}",
lambda: f"{noun} {genitive}",
lambda: f"{noun} {postfix}",
lambda: f"{adj} {postfix}",
# Трех- и четырехсловные гипно-конструкции
lambda: f"{adj} {noun} {genitive}",
lambda: f"{adj} {noun} {postfix}",
lambda: f"{adj} {noun} {genitive} {postfix}",
]
chosen_pattern = rng.choice(patterns)
return chosen_pattern()
# =====================================================================
@@ -80,10 +96,10 @@ def generate_title_openrouter(
api_key: Optional[str] = None,
model: str = "google/gemini-2.5-flash",
system_prompt: str = (
"Ты — глашатай всемогущей Гипножабы. Придумай короткое (2-4 слова), "
"яркое, иронично-абсурдное и гипнотическое название на русском языке "
"для полутоновой SVG-картины, изображенной на миниатюре. "
"Отвечай ТОЛЬКО названием, без кавычек и вводных слов."
"You are the herald of the almighty Hypnotoad. Create a short (2-4 words), "
"punchy, ironically absurd, and hypnotic English title "
"for a halftone SVG artwork shown in the thumbnail. "
"Reply ONLY with the title, without quotes or introductory words."
),
timeout: int = 5,
) -> Optional[str]:
@@ -101,7 +117,7 @@ def generate_title_openrouter(
{
"role": "user",
"content": [
{"type": "text", "text": "Дай гипнотическое название для этой картины:"},
{"type": "text", "text": "Give a hypnotic title for this artwork:"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64_data}"}}
]
}