11 Commits
Author SHA1 Message Date
Burer 22ef593726 feat/optimization: fully replace JS with CSS (#19)
Docker Build and Push / build-and-push (push) Successful in 2m27s
Reviewed-on: #19
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
2026-08-14 13:52:09 +00:00
Burer 390104e064 chore: update fetching builds images (#18)
Docker Build and Push / build-and-push (push) Successful in 1m3s
Reviewed-on: #18
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
2026-06-25 13:46:30 +00:00
BurerandSweetbread 088ace4695 feat: no-css/js preview mode, fix: locales, choose alert, no-css/js formatting, /download->/ redirect, chrore: update/cleanup packages (#17)
Docker Build and Push / build-and-push (push) Successful in 2m51s
- add flask preview command to check site without CSS/JS
- fix help alert breaking on apostrophes
- add missing JS line-continuations for UK locale
- straighten backtick/typographic apostrophes (FR/IT/NL)
- fix mistakes in IT locale
- redirect bare /download to localized download page
- strip underlined whitespace inside WebView links
- replace icon CSS margins with literal spaces
- trim link whitespace at render time, keep templates clean
- upgrade htmlmin, drop unused sass nix package

---------

Co-authored-by: Sweetbread <risdeveau@lair.moe>
Reviewed-on: #17
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
2026-06-13 11:17:22 +00:00
Burer e161237894 fix/ascii-and-http (#14)
Docker Build and Push / build-and-push (push) Successful in 47s
- Restored broken download tooltips that showed raw template placeholders instead of rendered values
- Simplified `autobuild.py` by removing unnecessary fallback/parsing complexity and reducing helper overhead
- Audited non-ASCII characters and get rid of Unicode “gremlins” that are not supported by WebView
- Converted hardcoded external template links to protocol-relative `//...` URLs so they follow the current site scheme

Reviewed-on: #14
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
Co-authored-by: Burer <burer@kolibrios.org>
Co-committed-by: Burer <burer@kolibrios.org>
2026-04-04 17:01:36 +00:00
91b6443f64 Added Ukrainian localisation (#15)
Docker Build and Push / build-and-push (push) Successful in 1m41s
Co-authored-by: Vladosik227 <vlados864@gavladorias.win>
Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #15
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: vladosik227 <vladpc064@gmail.com>
Co-committed-by: vladosik227 <vladpc064@gmail.com>
2026-04-03 07:01:11 +00:00
Burer 961692241a Add Matrix and IRC to socials block (#13)
Docker Build and Push / build-and-push (push) Successful in 48s
Reviewed-on: #13
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
Co-authored-by: Burer <burer@kolibrios.org>
Co-committed-by: Burer <burer@kolibrios.org>
2026-03-08 17:16:53 +00:00
Burer f9a07bcadd rework and update banner on main page (#11)
Docker Build and Push / build-and-push (push) Successful in 1m43s
Refactor banner code to be more universal, and updated it's content to GSoC 2026.

<img width="auto" alt="image.png" src="attachments/a9eee86a-eaf5-4a9b-b21c-8bd2bb6a7d07">

Reviewed-on: #11
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
Co-authored-by: Burer <burer@kolibrios.org>
Co-committed-by: Burer <burer@kolibrios.org>
2026-03-02 11:09:15 +00:00
Burer d0b267f0ea fix autobuild version and date parsing
Docker Build and Push / build-and-push (push) Successful in 3m24s
2026-02-19 20:13:10 +02:00
NeoUmbreon 5d4d587d1d Fix missing spaces in text
Docker Build and Push / build-and-push (push) Successful in 2m17s
2026-01-23 12:53:19 -05:00
Eilles ea969132f8 l10n: add the function of specifing date format, formatted the code
Docker Build and Push / build-and-push (push) Successful in 2m49s
2026-01-18 15:03:34 +03:00
Eilles 9a99aa4f3b l10n: add the Chinese translation 2026-01-18 15:03:34 +03:00
37 changed files with 826 additions and 472 deletions
+43 -16
View File
@@ -1,8 +1,10 @@
import re
import os
import datetime
import click
from sass import compile as compile_sass
from flask import Flask, redirect, request, url_for, g, Response
from flask.cli import run_command
from modules import autobuild, locales, helpers
@@ -14,21 +16,12 @@ app = Flask(__name__)
locales.ensure_loaded()
# CSS Compilation and minification
# CSS compilation
if app.debug:
css = compile_sass(filename="static/style.scss", output_style="compressed")
with open("static/style.css", "w", encoding="utf-8") as f:
f.write(css)
# JS minification
with open("static/script.js", encoding="utf-8") as f:
js = f.read()
js = re.sub(r"/\*.*?\*/", "", js, flags=re.S)
js = re.sub(r"//.*", "", js)
js = re.sub(r"\s+", " ", js).strip()
with open("static/script.min.js", "w", encoding="utf-8") as f:
f.write(js)
@app.before_request
def _ensure_updater_started():
@@ -45,12 +38,24 @@ def before_request():
@app.context_processor
def _inject_autobuild_vers():
return {'autobuild_vers': autobuild.autobuild_vers}
return {
"autobuild_vers": autobuild.autobuild_vers,
"autobuild_sizes": autobuild.autobuild_sizes,
"autobuild_files": autobuild.autobuild_files,
}
@app.context_processor
def _inject_autobuild_date():
return {'autobuild_date': autobuild.autobuild_date}
return {
"autobuild_date": autobuild.autobuild_date.strftime(
g.translations.get("downloads", {})
.get("date-format", "{DD}.{MM}.{YYYY}")
.replace("{YYYY}", "%Y")
.replace("{MM}", "%m")
.replace("{DD}", "%d")
)
}
@app.context_processor
@@ -58,16 +63,17 @@ def inject_translations():
def translate(text, **kwargs):
section, key = text.split(":", 1)
template = g.translations \
.get(section, {}) \
template = (
g.translations.get(section, {})
.get(key, f"${section}: {key}$")
)
try:
return template.format(**kwargs)
except Exception:
return template
return {'_': translate}
return {"_": translate}
# ---------- ROUTES -------------------------------------------------------
@@ -78,6 +84,11 @@ def home():
return redirect(url_for("index", lang=helpers.get_best_lang()))
@app.route("/download", strict_slashes=False)
def download_home():
return redirect(url_for("download", lang=helpers.get_best_lang()))
@app.route("/<lang>", strict_slashes=False)
def index(lang):
return helpers.render_localized_template(lang, "index.html")
@@ -129,6 +140,22 @@ def sitemap_xml():
return Response("\n".join(xml_lines), mimetype="application/xml")
# ---------- CLI -------------------------------------------------------------
@app.cli.command("preview")
@click.option("--nocss", is_flag=True, help="Render pages without CSS")
@click.pass_context
def preview(ctx, nocss):
"""Run the dev server without CSS to preview the KolibriOS WebView look."""
app.config["NOCSS"] = nocss
# Delegate to the built-in `flask run` instead of app.run() (which the
# Flask CLI ignores). FLASK_DEBUG enables the reloader/debugger so the
# command behaves like `flask run --debug`.
os.environ["FLASK_DEBUG"] = "1"
ctx.invoke(run_command, host="0.0.0.0")
# ---------- APP ENTRY -------------------------------------------------------
+3
View File
@@ -0,0 +1,3 @@
[banner]
url = https://summerofcode.withgoogle.com/programs/2026/organizations/kolibrios-project-team
img = gsoc.png
+13 -9
View File
@@ -14,9 +14,10 @@ forum = Forum
wiki = Wiki
git = Git
[git]
header = KolibriOS ist zu Git gewechselt!
text = Schau dir unsere neue entwicklerfreundliche Infrastruktur an
[banner]
header = KolibriOS wurde zu GSoC 2026 angenommen!
text = Informieren Sie sich über Programmdetails und unsere Projektideen
alt = GSoC
[article]
p1 = {kolibrios} ist ein winziges, aber unglaublich leistungsfähiges und
@@ -51,6 +52,7 @@ header = Herunterladen
version = Version:
date = Build-Datum:
date-format = {DD}.{MM}.{YYYY}
img-descr = Disketten-Image
iso-descr = LiveCD-Abbild
@@ -63,12 +65,12 @@ all_rev = Alle nächtlichen Builds
screenshots = Bildschirmfotos
download_choice = Was soll ich wählen?
download_help = Für einen Einsteiger ist die LiveCD am besten geeignet.\n\
\n\
Im Vergleich zu einer LiveCD hat ein universelles Image den Vorteil, dass\
Sie die in KolibriOS vorgenommenen Änderungen speichern können.\n\
\n\
Das Hybrid-Image enthält Unterstützung für die UEFI-Technologie, die zum\
download_help = Für einen Einsteiger ist die LiveCD am besten geeignet.
\n
Im Vergleich zu einer LiveCD hat ein universelles Image den Vorteil, dass
Sie die in KolibriOS vorgenommenen Änderungen speichern können.
\n
Das Hybrid-Image enthält Unterstützung für die UEFI-Technologie, die zum
Booten des Systems auf neuen Computern und Laptops verwendet wird.
download_description = Auf dieser Seite können Sie die nächtlichen
@@ -78,6 +80,8 @@ download_description = Auf dieser Seite können Sie die nächtlichen
vertrieben, und der Quellcode ist auf unserem {git} verfügbar.
git-server = Git-Server
warn_title = Vom Virenscanner markiert?
download_warn = Gelegentlich stufen einige Antivirenprogramme das
{kolibrios}-Image fälschlicherweise als Bedrohung ein.
Das ist ein Fehlalarm. {kolibrios} ist vollständig quelloffen, und Sie
+13 -9
View File
@@ -14,9 +14,10 @@ forum = Forum
wiki = Wiki
git = Git
[git]
header = KolibriOS moved to Git!
text = Check our new developers-friendly infrastructure
[banner]
header = KolibriOS accepted to GSoC 2026!
text = Check program details and our project ideas
alt = GSoC
[article]
p1 = {kolibrios} is a tiny yet incredibly powerful and fast operating system for
@@ -49,6 +50,7 @@ header = Downloads
version = Version:
date = Build date:
date-format = {DD}/{MM}/{YYYY}
img-descr = Floppy disk image
iso-descr = LiveCD image
@@ -59,12 +61,12 @@ prev_rev = Previous releases
all_rev = All nightly builds
download_choice = Which to choose?
download_help = For a beginner, the LiveCD is best.\n\
\n\
Compared to a LiveCD, the advantage of a universal image is that you can\
save changes made in KolibriOS.\n\
\n\
Hybrid image includes support for UEFI technology, which is used to boot\
download_help = For a beginner, the LiveCD is best.
\n
Compared to a LiveCD, the advantage of a universal image is that you can
save changes made in KolibriOS.
\n
Hybrid image includes support for UEFI technology, which is used to boot
the system on new computers and laptops.
download_description = On this page you can download the nightly builds
@@ -74,6 +76,8 @@ download_description = On this page you can download the nightly builds
available on our {git}.
git-server = Git server
warn_title = Flagged by antivirus?
download_warn = Occasionally, some antivirus software may incorrectly flag the
{kolibrios} image as a threat. This is a false positive. {kolibrios} is
fully open source, and you can always build it yourself to be sure that
+13 -9
View File
@@ -14,9 +14,10 @@ forum = Foro
wiki = Wiki
git = Git
[git]
header = ¡KolibriOS se ha trasladado a Git!
text = Mira nuestra nueva infraestructura amigable para desarrolladores
[banner]
header = ¡KolibriOS fue aceptado en GSoC 2026!
text = Consulta los detalles del programa y nuestras ideas de proyecto
alt = GSoC
[article]
p1 = {kolibrios} es un sistema operativo diminuto, pero increíblemente potente y
@@ -51,6 +52,7 @@ header = Descargas
version = Versión:
date = Fecha de compilación:
date-format = {DD}.{MM}.{YYYY}
img-descr = Imagen de disquete
iso-descr = Imagen LiveCD
@@ -61,12 +63,12 @@ prev_rev = Ediciones anteriores
all_rev = Todos los montajes nocturnos
download_choice = ¿Cuál elegir?
download_help = Para un principiante, el LiveCD es lo mejor.\n\
\n\
En comparación con un LiveCD, la ventaja de una imagen universal es que\
puedes guardar los cambios realizados en KolibriOS.\n\
\n\
Imagen híbrida incluye soporte para la tecnología UEFI, que se utiliza para\
download_help = Para un principiante, el LiveCD es lo mejor.
\n
En comparación con un LiveCD, la ventaja de una imagen universal es que
puedes guardar los cambios realizados en KolibriOS.
\n
Imagen híbrida incluye soporte para la tecnología UEFI, que se utiliza para
arrancar el sistema en los nuevos ordenadores y portátiles.
download_description = En esta página puedes descargar la distribución de
@@ -76,6 +78,8 @@ download_description = En esta página puedes descargar la distribución de
licencia {gpl} y su código fuente está disponible en nuestro {git}.
git-server = servidor Git
warn_title = ¿Marcado por el antivirus?
download_warn = Ocasionalmente, algunos programas antivirus pueden marcar
incorrectamente la imagen de {kolibrios} como una amenaza. Esto es un
falso positivo. {kolibrios} es completamente de código abierto y siempre
+27 -23
View File
@@ -14,43 +14,45 @@ forum = Forum
wiki = Wiki
git = Git
[git]
header = KolibriOS a déménagé sur Git !
text = Découvrez notre nouvelle infrastructure conviviale pour les développeurs
[banner]
header = KolibriOS a été accepté au GSoC 2026 !
text = Consultez les détails du programme et nos idées de projets
alt = GSoC
[article]
p1 = {kolibrios} est un système d`exploitation minuscule, mais incroyablement
p1 = {kolibrios} est un système d'exploitation minuscule, mais incroyablement
puissant et rapide, pour les PC compatibles x86. Il nécessite seulement
quelques mégaoctets d`espace disque, un processeur i586 et 12 Mo de RAM.
Malgré sa petite taille, il comprend une large gamme d`applications telles
qu`un éditeur de texte, un visionneur d`images, un éditeur graphique, un
quelques mégaoctets d'espace disque, un processeur i586 et 12 Mo de RAM.
Malgré sa petite taille, il comprend une large gamme d'applications telles
qu'un éditeur de texte, un visionneur d'images, un éditeur graphique, un
navigateur web, et plus de 30 jeux captivants. Il prend en charge pleinement
les systèmes de fichiers FAT12/16/32, permet la lecture seule de NTFS,
exFAT, ISO9660 et Ext2/3/4, et offre un vaste ensemble de {drivers} pour les
cartes son, réseau et graphiques populaires.
drivers = pilotes
p2 = Avez-vous déjà rêvé d`un système qui démarre en quelques secondes, de la
mise sous tension jusqu`à une interface graphique opérationnelle ? Des
p2 = Avez-vous déjà rêvé d'un système qui démarre en quelques secondes, de la
mise sous tension jusqu'à une interface graphique opérationnelle ? Des
applications qui se lancent instantanément, immédiatement après avoir cliqué
sur une icône, sans ces pointeurs sabliers agaçants ? Cette rapidité est
obtenue car les parties essentielles de {kolibrios} (noyau et pilotes) sont
entièrement écrites en langage assembleur {fasm}. Essayez {kolibrios} et
comparez-le à des poids lourds tels que Windows et Linux.
p3 = {kolibrios} s`est séparé de MenuetOS en 2004 et est développé de manière
p3 = {kolibrios} s'est séparé de MenuetOS en 2004 et est développé de manière
indépendante depuis lors. Vos {feedback} sont grandement appréciés, et votre
{help} est encore plus bienvenue.
feedback = retours
help = aide
p_subscription = Nous espérons que vous l`apprécierez !
p_subscription = Nous espérons que vous l'apprécierez !
[downloads]
header = Téléchargements
version = Version :
date = Date de compilation :
date-format = {DD}/{MM}/{YYYY}
img-descr = Image de la disquette
iso-descr = Image du LiveCD
@@ -61,28 +63,30 @@ prev_rev = Communiqués précédents
all_rev = Toutes les constructions nocturnes
download_choice = Que choisir ?
download_help = Pour un débutant, le LiveCD est le meilleur.\n\
\n\
Par rapport à un LiveCD, l`avantage d`une image universelle est que vous\
pouvez sauvegarder les changements effectués dans KolibriOS.\n\
\n\
L`image hybride inclut le support de la technologie UEFI, qui est utilisée\
download_help = Pour un débutant, le LiveCD est le meilleur.
\n
Par rapport à un LiveCD, l'avantage d'une image universelle est que vous
pouvez sauvegarder les changements effectués dans KolibriOS.
\n
L'image hybride inclut le support de la technologie UEFI, qui est utilisée
pour démarrer le système sur les nouveaux ordinateurs et portables.
download_description = Sur cette page, vous pouvez télécharger la distribution
des builds nocturnes, ce qui signifie qu`ils contiennent toujours les
des builds nocturnes, ce qui signifie qu'ils contiennent toujours les
modifications les plus récentes du système et peuvent donc être instables.
Tous les fichiers sont compressés avec {zip}. {kolibrios} est distribué sous
licence {gpl} et son code source est disponible sur notre {git}.
git-server = serveur Git
download_warn = Il arrive que certains antivirus signalent à tort limage
{kolibrios} comme une menace. Il sagit dun faux positif. {kolibrios} est
warn_title = Signalé par l'antivirus ?
download_warn = Il arrive que certains antivirus signalent à tort l'image
{kolibrios} comme une menace. Il s'agit d'un faux positif. {kolibrios} est
entièrement open source et vous pouvez toujours le compiler vous-même pour
vous assurer quil est totalement sûr.
vous assurer qu'il est totalement sûr.
[screenshots]
header = Captures d`écran
header = Captures d'écran
1 = Bureau KolibriOS
2 = Démos
@@ -92,4 +96,4 @@ header = Captures d`écran
6 = Outils de développement et de débogage
[footer]
team = L`équipe de KolibriOS
team = L'équipe de KolibriOS
+17 -14
View File
@@ -14,10 +14,10 @@ forum = Forum
wiki = Wiki
git = Git
[git]
header = KolibriOS si è spostato su Git!
text = Dai un`occhiata alla nostra nuova infrastruttura pensata per gli
sviluppatori
[banner]
header = KolibriOS è stato accettato al GSoC 2026!
text = Consulta i dettagli del programma e le nostre idee di progetto
alt = GSoC
[article]
p1 = {kolibrios} è un sistema operativo minuscolo, ma incredibilmente potente e
@@ -30,9 +30,9 @@ p1 = {kolibrios} è un sistema operativo minuscolo, ma incredibilmente potente e
ampio set di {drivers} per schede audio, di rete e grafiche più diffuse.
drivers = driver
p2 = Hai mai sognato un sistema che si avvia in pochi secondi, dall`accensione
p2 = Hai mai sognato un sistema che si avvia in pochi secondi, dall'accensione
fino a una GUI funzionante? Applicazioni che partono immediatamente, subito
dopo aver cliccato su un`icona, senza quei fastidiosi cursori a clessidra?
dopo aver cliccato su un'icona, senza quei fastidiosi cursori a clessidra?
Questa velocità si ottiene poiché le parti fondamentali di {kolibrios}
(kernel e driver) sono scritte interamente in linguaggio assembly {fasm}.
Prova {kolibrios} e confrontalo con colossi come Windows e Linux.
@@ -50,6 +50,7 @@ header = Scaricamento
version = Versione:
date = Data di compilazione:
date-format = {DD}/{MM}/{YYYY}
img-descr = Immagine su dischetto
iso-descr = Immagine LiveCD
@@ -60,12 +61,12 @@ prev_rev = Uscite precedenti
all_rev = Tutte le build notturne
download_choice = Quale scegliere?
download_help = Per un principiante, il LiveCD è la soluzione migliore.\n\
\n\
Rispetto a un LiveCD, il vantaggio di un`immagine universale è che è\
possibile salvare le modifiche apportate in KolibriOS.\n\
\n\
L`immagine ibrida include il supporto per la tecnologia UEFI, utilizzata\
download_help = Per un principiante, il LiveCD è la soluzione migliore.
\n
Rispetto a un LiveCD, il vantaggio di un'immagine universale è che è
possibile salvare le modifiche apportate in KolibriOS.
\n
L'immagine ibrida include il supporto per la tecnologia UEFI, utilizzata
per avviare il sistema su nuovi computer e portatili.
download_description = In questa pagina puoi scaricare la distribuzione delle
@@ -75,13 +76,15 @@ download_description = In questa pagina puoi scaricare la distribuzione delle
suo codice sorgente è disponibile sul nostro {git}.
git-server = server Git
warn_title = Segnalato dall'antivirus?
download_warn = Occasionalmente, alcuni software antivirus potrebbero segnalare
erroneamente limmagine di {kolibrios} come una minaccia. Si tratta di un
erroneamente l'immagine di {kolibrios} come una minaccia. Si tratta di un
falso positivo. {kolibrios} è completamente open source e puoi sempre
compilarlo tu stesso per essere certo che è del tutto sicuro.
[screenshots]
header = Captures d`écran
header = Schermate
1 = Il desktop di KolibriOS
2 = Demo
+16 -12
View File
@@ -14,13 +14,14 @@ forum = Forum
wiki = Wiki
git = Git
[git]
header = KolibriOS is verhuisd naar Git!
text = Bekijk onze nieuwe, ontwikkelaarsvriendelijke infrastructuur
[banner]
header = KolibriOS is geaccepteerd voor GSoC 2026!
text = Bekijk de programmadetails en onze projectideeën
alt = GSoC
[article]
p1 = {kolibrios} is een klein maar ongelooflijk krachtig en snel
besturingssysteem voor x86-compatibele PC`s. Het heeft slechts enkele
besturingssysteem voor x86-compatibele PC's. Het heeft slechts enkele
megabytes aan schijfruimte, een i586-processor en 12 MB RAM. Maar beschikt
over een rijk scala aan toepassingen, waaronder een tekstverwerker,
afbeeldingsviewer, grafische editor, webbrowser en meer dan 30 spannende
@@ -51,6 +52,7 @@ header = Downloads
version = Versie:
date = Builddatum:
date-format = {DD}.{MM}.{YYYY}
img-descr = Afbeelding op diskette
iso-descr = LiveCD-afbeelding
@@ -61,12 +63,12 @@ prev_rev = Vorige uitgaven
all_rev = Alle nachtelijke builds
download_choice = Welke moet ik kiezen?
download_help = Voor een beginner is de LiveCD het beste.\n\
\n\
Vergeleken met een LiveCD heeft een universeel image het voordeel dat je\
wijzigingen die je in KolibriOS hebt aangebracht, kunt opslaan.\n\
\n\
Hybride image bevat ondersteuning voor UEFI-technologie, die wordt gebruikt\
download_help = Voor een beginner is de LiveCD het beste.
\n
Vergeleken met een LiveCD heeft een universeel image het voordeel dat je
wijzigingen die je in KolibriOS hebt aangebracht, kunt opslaan.
\n
Hybride image bevat ondersteuning voor UEFI-technologie, die wordt gebruikt
om het systeem op te starten op nieuwe computers en laptops.
download_description = Op deze pagina kunt u de nightly builds-distributie
@@ -76,7 +78,9 @@ download_description = Op deze pagina kunt u de nightly builds-distributie
broncode is beschikbaar op onze {git}.
git-server = Git-server
download_warn = Af en toe kunnen sommige antivirusprogrammas het
warn_title = Gemarkeerd door antivirus?
download_warn = Af en toe kunnen sommige antivirusprogramma's het
{kolibrios}-image ten onrechte als een bedreiging aanmerken.
Dit is een vals-positief. {kolibrios} is volledig open-source en je kunt
het altijd zelf bouwen om er zeker van te zijn dat het volledig veilig is.
@@ -87,7 +91,7 @@ header = Schermafbeeldingen
1 = KolibriOS bureaublad
2 = Demos
3 = Bestandsbeheerders
4 = Netwerk programma`s
4 = Netwerk programma's
5 = Spelletjes
6 = Ontwikkel- en debugtools
+13 -9
View File
@@ -14,9 +14,10 @@ forum = Форум
wiki = Вики
git = Git
[git]
header = КолибриОС перешла на Git!
text = Ознакомьтесь с нашей новой, удобной для разработчиков инфраструктурой
[banner]
header = KolibriOS принята в GSoC 2026!
text = Ознакомьтесь с деталями программы и нашими идеями проектов
alt = GSoC
[article]
p1 = {kolibrios} — это крошечная, но невероятно мощная и быстрая операционная
@@ -51,6 +52,7 @@ header = Скачать
version = Версия:
date = Дата сборки:
date-format = {DD}.{MM}.{YYYY}
img-descr = Образ дискеты
iso-descr = Образ LiveCD
@@ -61,12 +63,12 @@ prev_rev = Предыдущие выпуски
all_rev = Все ночные сборки
download_choice = Какой выбрать?
download_help = Для новичка лучше всего подойдет LiveCD.\n \
\n\
По сравнению с LiveCD преимущество универсального образа в том, что вы\
можете сохранить изменения, сделанные в КолибриОС.\n\
\n\
Гибридный образ включает поддержку технологии UEFI, которая используется\
download_help = Для новичка лучше всего подойдет LiveCD.
\n
По сравнению с LiveCD преимущество универсального образа в том, что вы
можете сохранить изменения, сделанные в КолибриОС.
\n
Гибридный образ включает поддержку технологии UEFI, которая используется
для загрузки системы на новых компьютерах и ноутбуках.
download_description = На этой странице вы можете скачать ночные сборки
@@ -76,6 +78,8 @@ download_description = На этой странице вы можете скач
исходный код доступен на нашем {git}.
git-server = Git-сервере
warn_title = Помечено антивирусом?
download_warn = Иногда антивирусы могут по ошибке помечать образ {kolibrios}
как угрозу. Это ложное срабатывание. {kolibrios} имеет полностью открытый
исходный код, и вы всегда можете собрать её самостоятельно, чтобы
+98
View File
@@ -0,0 +1,98 @@
[title]
language = Українська
index = KolibriOS
download = KolibriOS - Завантажити
[header]
index = Офіційний сайт KolibriOS
download = Завантажити KolibriOS
[menu]
kolibrios = KolibriOS
download = Завантажити
forum = Форум
wiki = Вікі
git = Git
[banner]
header = KolibriOS прийнято до GSoC 2026!
text = Ознайомтеся з деталями програми та нашими ідеями проєктів
alt = GSoC
[article]
p1 = {kolibrios} - це крихітна, але неймовірно потужна та швидка
операційна система для x86-сумісних ПК. Для її роботи достатньо
лише кількох мегабайтів місця на диску, процесора i586 та 12 МБ
оперативної пам'яті. При цьому вона містить багатий набір додатків,
таких як текстовий редактор, переглядач зображень, графічний редактор,
веб-браузер та понад 30 захопливих ігор. Є повна підтримка файлових систем
FAT12/16/32, тільки на читання доступні NTFS, exFAT, ISO9660 та Ext2/3/4,
а також присутній великий набір {drivers} для популярних звукових, мережевих
та графічних карт.
drivers = драйверів
p2 = Ви коли-небудь мріяли про систему, яка завантажується менш ніж за кілька
секунд з моменту ввімкнення до появи робочого графічного інтерфейсу? Про додатки,
які запускаються миттєво, одразу після натискання на ярлик, без набридливих
індикаторів завантаження? Така швидкість досягається завдяки тому, що основні
частини {kolibrios} (ядро та драйвери) повністю написані на асемблері {fasm}.
Спробуйте {kolibrios} і порівняйте її з такими важковаговиками, як Windows та Linux.
p3 = {kolibrios} відокремилася від MenuetOS у 2004 році й
відтоді розвивається незалежною міжнародною спільнотою.
Ваші {feedback} дуже цінуються, а ваша {help} цінується ще більше.
feedback = відгуки
help = допомога
p_subscription = Сподіваємося, вам сподобається!
[downloads]
header = Завантажити
version = Версія:
date = Дата збірки:
date-format = {DD}.{MM}.{YYYY}
img-descr = Образ дискети
iso-descr = Образ LiveCD
distr-descr = Універсальний образ Flash/Multi-boot
raw-descr = Гібридний UEFI/BIOS образ
prev_rev = Попередні випуски
all_rev = Усі нічні збірки
download_choice = Який обрати?
download_help = Для новачка найкраще підійде LiveCD.
\n
У порівнянні з LiveCD перевага універсального образу полягає в тому, що ви
можете зберегти зміни, зроблені в KolibriOS.
\n
Гібридний образ містить підтримку технології UEFI, яка використовується
для завантаження системи на нових комп'ютерах та ноутбуках.
download_description = На цій сторінці ви можете завантажити нічні збірки
дистрибутива. Це означає, що вони завжди містять останні зміни в
системі, а отже можуть бути нестабільними. Усі файли стиснуті за
допомогою {zip}. {kolibrios} розповсюджується під ліцензією {gpl}, а
вихідний код доступний на нашому {git}.
git-server = Git-сервері
warn_title = Позначено антивірусом?
download_warn = Іноді антивіруси можуть помилково помічати образ {kolibrios}
як загрозу. Це помилкове спрацьовування. {kolibrios} має повністю відкритий
вихідний код, і ви завжди можете зібрати її самостійно, щоб
переконатися, що вона абсолютно безпечна.
[screenshots]
header = Скриншоти
1 = Робочий стіл KolibriOS
2 = Демки
3 = Файлові менеджери
4 = Мережеві додатки
5 = Ігри
6 = Інструменти розробника
[footer]
team = Команда KolibriOS
+88
View File
@@ -0,0 +1,88 @@
[title]
language = 简体中文
index = KolibriOS
download = KolibriOS - 下载
[header]
index = KolibriOS 官方网站
download = KolibriOS 下载页
[menu]
kolibrios = KolibriOS
download = 下载
forum = 论坛
wiki = 百科
git = Git
[banner]
header = KolibriOS 已被 GSoC 2026 录取!
text = 查看项目详情和我们的项目创意
alt = GSoC
[article]
p1 = {kolibrios} 是一个体积微小、功能强大、响应迅速的,面向 x86 兼容机的操作系统。
只需要寥寥数兆字节的磁盘空间、一个 i586 处理器和 12 兆字节内存,
你就能体验到一个丰富的应用生态:
文字处理、图像查看、图形编辑、网页浏览等基本应用一应俱全,甚至还有三十多个有意思的游戏。
在文件系统方面,{kolibrios} 完全支持 FAT12/16/32
同时也支持读取 NTFS、exFAT、ISO9660 和 Ext2/3/4 文件系统。
它还提供了一套丰富的{drivers},囊括众多主流声卡、网卡、显卡。
drivers = 驱动程序
p2 = 试想一款能在短短几秒内启动到图形化界面的操作系统!
不再囿于转着小圈圈的鼠标指针,所有的应用软件都在鼠标点击后极速开启!
得益于 {kolibrios} 的核心部分(内核、驱动)完全采用 {fasm} 汇编语言来编写,这样的高速已经不再是幻想!
快来试试我们的 {kolibrios},将其与现代臃肿的 Windows 和 Linux 系统比比看,你就会发现它们之间的速度差距。
p3 = {kolibrios} 是一个 MenuetOS 的派生分支,从 2004 开始脱离其独立开发。
如果你有需要{feedback}的问题,我们会非常欢迎~!
当然,如果能为我们提供{help},我们也感激不尽!
feedback = 反馈
help = 帮助
p_subscription = 希望你能尽情享用我们的作品!
[downloads]
header = 下载链接
version = 当前版本:
date = 构建日期:
date-format = {YYYY}年{MM}月{DD}日
img-descr = 软盘镜像
iso-descr = Live 光盘镜像
distr-descr = 优盘或多系统启动通用包
raw-descr = UEFI/BIOS 混合包
prev_rev = 先前版本
all_rev = 所有即时构建包
download_choice = 该怎么选?
download_help = 对新手而言,Live 光盘就是最优解。
\n
而与之不同的是,通用包允许用户把在系统运行过程中对 KolibriOS 的更改保存下来,例如系统设置之类就可以保存。
\n
混合启动镜像包含了对 UEFI 技术的支持,可以让你在现代的电脑上更好地启动之。
download_description = 在此页面中,你可以下载我们的即时构建版本,也就是包含了最新的更新。
需要知道的是:这些特性往往会致使系统不稳定,使用时请牢记此项。
这些文件都经过 {zip} 压缩打包。{kolibrios} 以 {gpl} 协议发布,其源码可见于{git}。
git-server = 此仓库站
warn_title = 被杀毒软件误报?
download_warn = 有些时候,一些防病毒软件会错误地将 {kolibrios} 的镜像标记为威胁项目,这应当是误判。{kolibrios} 完全开源,如果担心存在问题,无论何时何地,你都可以自行构建一份来确保安全。
[screenshots]
header = 内容截屏
1 = KolibriOS 桌面
2 = 演示程序
3 = 不同的文件管理器
4 = 网络相关的程序
5 = 游戏
6 = 开发调试工具
[footer]
team = KolibriOS 开发团队
+88
View File
@@ -0,0 +1,88 @@
[title]
language = 繁體中文
index = KolibriOS
download = KolibriOS - 下載
[header]
index = KolibriOS 官方站
download = KolibriOS 下載頁
[menu]
kolibrios = KolibriOS
download = 下載
forum = 論壇
wiki = 百科
git = Git
[banner]
header = KolibriOS 已入選 GSoC 2026
text = 查看計畫詳情和我們的專案構想
alt = GSoC
[article]
p1 = {kolibrios} 是一個空間小、功能強、回應快的,面向 x86 兼容機的作業系統。
只需要寥寥數 MB 磁碟空間、一個 i586 處理器和 12 MB RAM
即可體驗到一個豐富的應用生態:
文字處理、圖像查看、圖形編輯、網頁流覽等基本應用一應俱全,甚至還有三十多個有意思的小遊戲。
在檔案系統方面,{kolibrios} 完全支援 FAT12/16/32
同時也能夠讀取 NTFS、exFAT、ISO9660 和 Ext2/3/4 檔案系統。
它還提供了一套豐富的{drivers},囊括眾多主流音效卡、網卡、顯卡。
drivers = 驅動程式
p2 = 試想一款能在短短幾秒內啟動到圖形化介面的作業系統!
不再囿於轉著小圈圈的滑鼠指標,所有的應用軟體都在點擊後極速開啟!
得益於 {kolibrios} 的核心部分(內核、驅動)完全採用 {fasm} 組合語言來編寫,這樣的高速已不再是幻想!
快來試試我們的 {kolibrios},將其與現代臃腫的 Windows 和 Linux 系統比比看,你就會發現它們之間的速度差距。
p3 = {kolibrios} 是 2004 年自 MenuetOS Fork 而來,也從那一刻起開始脫離它進行自主開發。
歡飲您{feedback}您遇到的任何問題。
如果能為我們提供{help},我們也會感激不盡!
feedback = 回饋
help = 幫助
p_subscription = 希望你能盡情享用我們的作品!
[downloads]
header = 下載連結
version = 當前版本:
date = 構建日期:
date-format = {YYYY}年{MM}月{DD}日
img-descr = 軟碟鏡像
iso-descr = LiveCD 鏡像
distr-descr = 閃存盤或多系統啟用的動通用包
raw-descr = UEFI/BIOS 混合包
prev_rev = 早期版本
all_rev = 所有 Nightly 構建包
download_choice = 如何選擇我要的包?
download_help = 對新手而言,LiveCD 就是最優解。
\n
而與之不同的是,通用包允許使用者把在系統運行過程中對 KolibriOS 作出的更改保存下來,例如系統設置之類就可以保留。
\n
混合啟動鏡像包含了對 UEFI 技術的支援,可以讓你在現代的電腦上更好地啟動之。
download_description = 在此頁面裏,你可以下載我們的 Nightly 構建包,也即包含了當下最新的更新。
需要知道的是:因爲是即時更新並構建的,這些包往往包含一些導致系統不穩定的特性,請在使用時牢記此項。
這些檔案都是經過 {zip} 壓縮打包的,使用前需解壓。{kolibrios} 以 {gpl} 許可證發佈,其源碼可見於{git}。
git-server = 此倉庫站
warn_title = 被防毒軟體標記?
download_warn = 有些時候,一些防毒軟體會錯誤地將 {kolibrios} 的鏡像標記為威脅項,這應當是一種誤判。我們的 {kolibrios} 完全開源,如果擔心存在安全問題,無論何時何地,你都可以自行構建一份來確保運行的内容是安全的。
[screenshots]
header = 內容截屏
1 = KolibriOS 桌面
2 = 演示程式
3 = 不同的檔案管理員
4 = 網路相關的程式
5 = 遊戲
6 = 開發調試工具
[footer]
team = KolibriOS 開發團隊
+61 -60
View File
@@ -1,80 +1,81 @@
from datetime import date
import re
import threading
import time
from urllib.request import Request, urlopen
STATUS_URL = "https://builds.kolibrios.org/status.html"
STATUS_SEC = 300 # refetch each 5 minutes
autobuild_date = "DD.MM.YYYY"
autobuild_vers = "0.0.0.0+0000-0000000"
CI_URL = "http://builds.kolibrios.org/ci/"
REFRESH_SEC = 300 # refetch each 5 minutes
DOWNLOAD_LANGS = ("en_US", "ru_RU", "es_ES")
DOWNLOAD_EXTS = ("img", "iso", "raw")
# A build dir under /ci/: 0.7.7.0-9083-g3dd8e618a
BUILD_RE = re.compile(
r'href="\./?(?P<dir>\d+(?:\.\d+){3}-(?P<build>\d+)-g[0-9a-fA-F]+)/"'
)
# A file row in a build's lang dir: kolibrios-<ver>-<lang>.<ext> + its cells.
# The (?!</tr>) guards confine size/time to this row, so a missing cell fails
# the match instead of stealing the next entry's values.
FILE_RE = re.compile(
r'(?P<name>kolibrios-[^"]+\.(?P<ext>\w+))"'
r'(?:(?!</tr>).)*?data-size="(?P<size>\d+)"'
r'(?:(?!</tr>).)*?datetime="(?P<ts>[^"]+)"',
re.S | re.I,
)
autobuild_date = date.today()
autobuild_vers = "0.0.0.0-0-g0000000"
autobuild_sizes = {l: {e: "?" for e in DOWNLOAD_EXTS} for l in DOWNLOAD_LANGS}
# Falls back to the /ci/ index until a versioned path is parsed.
autobuild_files = {l: {e: "ci/" for e in DOWNLOAD_EXTS} for l in DOWNLOAD_LANGS}
_started = False
_updater_lock = threading.Lock()
def _refresh_build_date_once():
def _fetch(url):
req = Request(url, headers={"User-Agent": "Mozilla/5.0"})
with urlopen(req, timeout=10) as r:
return r.read().decode(r.headers.get_content_charset() or "utf-8", "replace")
def _refresh_autobuild_once():
global autobuild_date, autobuild_vers
try:
from urllib.request import Request, urlopen
req = Request(
STATUS_URL,
headers={
"User-Agent": "Mozilla/5.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
},
)
with urlopen(req, timeout=10) as r:
html = r.read().decode(
r.headers.get_content_charset() or "utf-8", "replace"
)
rows = re.findall(r"(<tr\b[^>]*>.*?</tr>)", html, flags=re.I | re.S)
if not rows:
return
last_commit_ver = None
for row in rows:
cls = re.search(r'class\s*=\s*"([^"]*)"', row, flags=re.I)
classes = cls.group(1).lower() if cls else ""
text = re.sub(r"<[^>]+>", " ", row)
if "commit" in classes:
mver = re.search(
r"\b(\d+\.\d+\.\d+\.\d+\+\d{3,8}-[0-9a-fA-F]{7,40})\b", row
)
if mver:
last_commit_ver = mver.group(1)
elif "success" in classes:
mts = re.search(
r"\b(\d{4})\.(\d{2})\.(\d{2})\s+\d{2}:\d{2}:\d{2}\b", text
)
if not mts:
mds = re.search(r"\b(\d{2})\.(\d{2})\.(\d{4})\b", text)
if mds:
autobuild_date = f"{mds.group(1)}.{mds.group(2)}.{mds.group(3)}"
else:
return
else:
y, mo, d = mts.groups()
autobuild_date = f"{d}.{mo}.{y}"
if last_commit_ver:
autobuild_vers = last_commit_ver
return
ci_html = _fetch(CI_URL)
except Exception:
pass
return
builds = [(int(m["build"]), m["dir"]) for m in BUILD_RE.finditer(ci_html)]
if not builds:
return
_, dirname = max(builds)
dates = []
for lang in DOWNLOAD_LANGS:
try:
html = _fetch(f"{CI_URL}{dirname}/{lang}/")
except Exception:
continue
for m in FILE_RE.finditer(html):
ext = m["ext"]
if ext not in DOWNLOAD_EXTS:
continue
autobuild_sizes[lang][ext] = f"{int(m['size']) / 1048576:.1f} MB"
autobuild_files[lang][ext] = f"ci/{dirname}/{lang}/{m['name']}"
dates.append(m["ts"][:10]) # ISO "YYYY-MM-DD" prefix, sorts chronologically
autobuild_vers = dirname
if dates:
autobuild_date = date.fromisoformat(max(dates))
def _updater_loop():
while True:
_refresh_build_date_once()
time.sleep(STATUS_SEC)
_refresh_autobuild_once()
time.sleep(REFRESH_SEC)
def ensure_started():
@@ -86,4 +87,4 @@ def ensure_started():
_started = True
_refresh_build_date_once()
_refresh_autobuild_once()
+56
View File
@@ -0,0 +1,56 @@
from os import path, listdir
from configparser import ConfigParser
import threading
_configs = {}
_loaded = False
_load_lock = threading.Lock()
def load_all_configs():
new_configs = {
"screenshots": {
"slides": str(
sum(1 for f in listdir("static/img/screenshots") if f.endswith(".png"))
)
}
}
configs_dir = "configs"
if not path.isdir(configs_dir):
return new_configs
for filename in sorted(listdir(configs_dir)):
if not filename.endswith(".ini"):
continue
file_path = path.join(configs_dir, filename)
cp = ConfigParser()
with open(file_path, encoding="utf-8") as f:
cp.read_file(f)
for section in cp.sections():
section_data = new_configs.setdefault(section, {})
section_data.update(dict(cp[section]))
return new_configs
def ensure_loaded():
global _configs, _loaded
with _load_lock:
if _loaded:
return
_configs = load_all_configs()
_loaded = True
def get_section(name):
ensure_loaded()
return dict(_configs.get(name, {}))
def get_all_sections():
ensure_loaded()
return {section: dict(values) for section, values in _configs.items()}
+9 -7
View File
@@ -1,10 +1,14 @@
from datetime import date
from re import compile as re_compile
from flask import redirect, render_template, request, url_for
from htmlmin import minify as minify_html
from modules import locales
_A_OPEN_WS = re_compile(r"(<a\b[^>]*>)\s+")
_A_CLOSE_WS = re_compile(r"\s+(</a>)")
def get_best_lang():
return request.accept_languages.best_match(locales.locales_code) or "en"
@@ -14,10 +18,8 @@ def render_localized_template(lang, template_name):
if lang not in locales.locales_code:
return redirect(url_for("index", lang=get_best_lang()))
return minify_html(
render_template(
template_name,
year=date.today().year,
),
remove_empty_space=True,
)
html = render_template(template_name, year=date.today().year)
html = _A_OPEN_WS.sub(r"\1", html)
html = _A_CLOSE_WS.sub(r"\1", html)
return minify_html(html, remove_empty_space=False)
+9
View File
@@ -2,6 +2,8 @@ from os import path, listdir
from configparser import ConfigParser
import threading
from modules import configs
translations = {}
locales_name = {}
@@ -33,6 +35,13 @@ def load_all_locales():
section: dict(cp[section]) for section in cp.sections()
}
shared_sections = configs.get_all_sections()
if shared_sections:
for locale_translation in new_translations.values():
for section_name, section_values in shared_sections.items():
locale_section = locale_translation.setdefault(section_name, {})
locale_section.update(section_values)
new_locales_code = locales_code_default + tuple(sorted(locales_code_extra))
new_locales_name = {
locale_code: new_translations[locale_code]["title"]["language"]
+1 -1
View File
@@ -2,7 +2,7 @@ blinker==1.9.0
click==8.1.8
colorama==0.4.6
Flask==3.1.0
htmlmin==0.1.12
htmlmin2
itsdangerous==2.2.0
Jinja2==3.1.6
libsass==0.23.0
-1
View File
@@ -6,7 +6,6 @@ in pkgs.mkShell {
buildInputs = with pypkgs; [
python
virtualenv
pkgs.nodePackages.sass
];
shellHook = ''

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

-119
View File
@@ -1,119 +0,0 @@
/* LANGUAGE DROPDOWN */
function dropdown_show(obj)
{
var x = y = 0;
while(obj)
{
x += obj.offsetLeft;
y += obj.offsetTop;
obj = obj.offsetParent;
}
ddown = document.getElementById("lang-dropdown");
ddown.style.display = "block";
ddown.style.left = (x - 72) + "px";
if (ddown.offsetLeft + ddown.offsetWidth +10 > document.body.offsetWidth)
{
ddown.style.left = document.body.offsetWidth - ddown.offsetWidth - 82 + "px";
}
ddown.style.top = (y + 48) + "px";
op = 0;
appear(1);
}
function dropdown_hide()
{
ddown = document.getElementById("lang-dropdown");
ddown.style.display="none";
}
function appear(x)
{
if(op < x)
{
op += 0.2;
ddown.style.opacity = op;
ddown.style.filter = 'alpha(opacity=' + op * 100 + ')';
t = setTimeout('appear(' + x + ')', 20);
}
}
/* SCREENSHOTS GALLERY */
var FIRST_IMG_ID = 1;
var LAST_IMG_ID = 6;
var current = LAST_IMG_ID; // start with last slide so that next() shows the first
window.onload = function() {
// Dynamically create dots based on number of slides
var dots = document.getElementById("dots");
for (var i = FIRST_IMG_ID; i <= LAST_IMG_ID; i++) {
var dot = document.createElement("span");
dot.className = "dot" + (i === current ? " active" : "");
dot.setAttribute("data-slide", i);
dot.onclick = function() {
goToSlide(parseInt(this.getAttribute("data-slide")));
};
dots.appendChild(dot);
}
// If a carousel element exists, advance to the first slide on load
if (document.getElementById("carousel")) next();
};
function updateDots() {
var dots = document.querySelectorAll("#dots .dot");
dots.forEach(function(dot, index) {
// index starts at 0 so add FIRST_IMG_ID to match your slide IDs
dot.classList.toggle("active", (index + FIRST_IMG_ID) === current);
});
}
function goToSlide(n) {
if (n === current) return;
document.getElementById("slide" + current).className = "minislide";
current = n;
document.getElementById("slide" + current).className = "visible";
if (document.getElementById("carousel")) {
document.getElementById("carousel").innerHTML = document.getElementById("slide" + current).alt;
}
updateDots();
}
function next() {
document.getElementById("slide" + current).className = "minislide";
if (current >= LAST_IMG_ID) {
current = FIRST_IMG_ID;
} else {
current++;
}
document.getElementById("slide" + current).className = "visible";
if (document.getElementById("carousel")) {
document.getElementById("carousel").innerHTML = document.getElementById("slide" + current).alt;
}
updateDots();
}
function previous() {
document.getElementById("slide" + current).className = "minislide";
if (current <= FIRST_IMG_ID) {
current = LAST_IMG_ID;
} else {
current--;
}
document.getElementById("slide" + current).className = "visible";
if (document.getElementById("carousel")) {
document.getElementById("carousel").innerHTML = document.getElementById("slide" + current).alt;
}
updateDots();
}
function checkkey(e) {
var keycode = window.event ? e.keyCode : e.which;
if (keycode == 37) { previous(); }
else if (keycode == 39) { next(); }
else if (keycode == 27) { dropdown_hide(); }
}
+135 -74
View File
@@ -16,7 +16,9 @@ $c-shadow-soft: #1C1A281F;
$c-article-bd: #C0B9C491;
$c-primary: #609A21;
$c-primary-ink: #609A21AA;
$c-banner: #F9AB00;
$c-banner-ink: #F9AB00AA;
$c-link: #0472D8;
$c-link-hover: #0053B9;
@@ -72,18 +74,31 @@ body {
}
}
#lang-butt {
background: transparent;
border: none;
}
/* LANG-DROPDOWN */
#lang-switch {
position: relative;
cursor: pointer;
}
/* Focus opens it (span is tabindex-focusable, so a click focuses in every
browser); clicking away blurs and closes it. */
#lang-dropdown {
position: fixed;
position: absolute;
top: 48px; // matches the old JS: button top + 48px
left: 50%;
transform: translateX(-50%); // centre the panel under the flag
z-index: 9100;
display: none;
width: max-content; // anchor is a tiny inline span, else it collapses and wraps
text-align: left; // reset the centering inherited from #menu
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease;
#lang-switch:focus-within & {
opacity: 1;
visibility: visible;
}
&::before {
content: '';
@@ -95,12 +110,11 @@ body {
border-top: 0;
top: -10px;
left: 50%;
margin-left: -6px;
margin-left: -10px;
}
& > div {
display: block;
margin-left: 4px;
border-radius: 4px;
border: 1px solid $c-text;
box-shadow: 0 0 10px $c-menu-shadow;
@@ -180,12 +194,21 @@ body {
text-decoration: none;
&:hover {
box-shadow: inset 0 0 0 4px $c-primary-ink;
box-shadow: inset 0 0 0 4px $c-banner-ink;
}
table {
table-layout: fixed;
}
td {
text-align: center;
vertical-align: middle;
&:first-child,
&:last-child {
width: 128px;
}
}
img {
@@ -193,7 +216,7 @@ body {
}
h1 {
color: $c-primary;
color: $c-banner;
font-size: 2.5em;
margin: 0 0 16px;
}
@@ -202,14 +225,14 @@ body {
margin: 0em;
}
.p-link {
margin-top: 16px;
color: $c-primary;
font-weight: bold;
}
a {
color: $c-primary;
display: block;
margin-top: 16px;
overflow-wrap: anywhere;
word-break: break-word;
font-weight: bold;
color: $c-banner;
border: none;
}
}
@@ -248,7 +271,6 @@ p {
img {
height: 1em;
margin-right: 0.5em;
margin-bottom: -0.15em;
}
}
@@ -256,13 +278,6 @@ p {
&-subscription {
text-align: center;
}
&-warn {
img {
margin-bottom: -2px;
margin-right: 0.25em;
}
}
}
/* DOWNLOADS */
@@ -345,28 +360,69 @@ td {
margin-left: 1em;
}
}
&-info {
img {
margin-right: 0.25em;
}
}
}
hr {
margin: 0;
}
.help-button {
/* Info and warning: a clickable icon-heading toggles a hidden checkbox; the
0fr -> 1fr grid row animates the panel open. Same mechanism, two colours. */
.help-button,
.warn-title {
cursor: pointer;
display: inline-block;
color: $c-primary;
img {
vertical-align: middle;
padding-bottom: 1px;
}
}
.help-button { color: $c-primary; }
.warn-title { color: $c-banner; }
#help-toggle,
#warn-toggle {
display: none;
}
#help-toggle:checked ~ #download-help,
#warn-toggle:checked ~ #download-warn {
grid-template-rows: 1fr;
margin-top: 1em; // breathing room only while open; closed panel adds no gap
}
#download-help,
#download-warn {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 0.35s ease, margin-top 0.35s ease;
& > div {
overflow: hidden;
padding-left: calc(1.25em - 1px);
}
p {
margin: 0;
}
}
#download-help {
border-left: 1px solid $c-primary;
& > div { // help has several paragraphs; space them
display: grid;
gap: 1em;
}
}
#download-warn {
border-left: 1px solid $c-banner;
margin-bottom: 1em; // the next heading has no top margin of its own
}
acronym {
border-bottom: 1px dashed $c-dot;
text-decoration: none;
@@ -375,24 +431,53 @@ acronym {
/* SCREENS.CSS */
#show {
max-width: 1280px;
max-height: 800px;
width: 100%;
height: 100%;
cursor: pointer;
border: 1px solid $c-screen-border;
display: block;
position: relative;
border-radius: 4px;
overflow: hidden;
#screen {
display: flex;
flex-wrap: wrap;
justify-content: center;
figure {
order: 1;
flex: 0 0 100%;
display: none;
margin: 0;
text-align: center;
}
input:checked + figure {
display: block;
}
label {
display: block;
cursor: pointer;
}
img {
display: none;
display: block;
max-width: 100%;
margin: 0 auto;
border: 1px solid $c-screen-border;
border-radius: 4px;
}
&.visible {
display: block;
figcaption {
margin: 1.25em 0;
}
input {
order: 2;
appearance: none;
-webkit-appearance: none;
width: 8px;
height: 8px;
margin: 0 8px;
border-radius: 50%;
background: $c-dot;
cursor: pointer;
&:checked {
background: $c-text;
}
}
}
@@ -404,30 +489,6 @@ iframe {
aspect-ratio: 16 / 9;
}
#carousel {
text-align: center;
margin: 1.25em auto 1em;
}
#dots {
text-align: center;
line-height: 1;
}
.dot {
display: inline-block;
width: 0.625em;
height: 0.625em;
background: $c-dot;
border-radius: 50%;
margin: 0 0.25em;
cursor: pointer;
&.active {
background: $c-text;
}
}
/* FOOTER */
#footer {
@@ -475,7 +536,7 @@ iframe {
margin-bottom: 0;
}
p, .p-link {
p {
margin-top: 0.5em;
}
}
+46 -34
View File
@@ -1,11 +1,9 @@
<!doctype html>
<html lang="{{ lang }}" onmouseup="dropdown_hide()">
<html lang="{{ lang }}">
{% include 'tmpl/_header.htm' %}
<body onkeydown="checkkey(event)">
{% include 'tmpl/_lang-dropdown.htm' %}
<body>
{% include 'tmpl/_menu.htm' %}
@@ -36,7 +34,6 @@
{% for ext, alt in (
('img', 'floppy'),
('iso', 'cd'),
('distr', 'universal'),
('raw', 'uefi')
) %}
<tr class="tr-margin-bot">
@@ -55,8 +52,8 @@
('ru_RU', 'Русский'),
('es_ES', 'Español')
) %}
<a href="//builds.kolibrios.org/{{ l }}/latest-{{ ext }}.7z"
title="ver. $autobuild_cmtid_{{ l }}, $autobuild_size_{{ l }}_{{ ext }}"
<a href="//builds.kolibrios.org/{{ autobuild_files[l][ext] }}"
title="{{ autobuild_vers }}, {{ autobuild_sizes[l][ext] }}"
class="button">
{{ lang }}
{% if l == 'en_US' %}
@@ -65,7 +62,8 @@
<img src="{{ url_for('static', filename='img/flags/ru.png') }}" alt="{{ lang }}">
{% elif l == 'es_ES' %}
<img src="{{ url_for('static', filename='img/flags/es.png') }}" alt="{{ lang }}">
{% endif %}</a>
{% endif %}
</a>
{% endfor %}
</td>
</tr>
@@ -76,14 +74,14 @@
</tr>
</table>
{% if not config.NOCSS %}<input type="checkbox" id="help-toggle">{% endif %}
<table>
<tr class="tr-margin-top">
<td class="td-description td-info" colspan="2">
<div role="button" class="help-button"
onclick="alert('{{ _('downloads:download_help') }}');">
<img src="{{ url_for('static', filename='img/icons/i_info.png') }}" alt="Info">
<u>{{ _('downloads:download_choice') }}</u>
</div>
<label for="help-toggle" class="help-button">
<img src="{{ url_for('static', filename='img/icons/i_info.png') }}" alt="Info">&nbsp;<u>{{ _('downloads:download_choice') }}</u>
</label>
</td>
<td class="td-languages">
<a href="//archive.kolibrios.org/{{ g.locale | e }}/">
@@ -96,39 +94,53 @@
</tr>
</table>
<div id="download-help">
<div>
{% for p in _('downloads:download_help').split('\\n') if p.strip() %}
<p>{{ p }}</p>
{% endfor %}
</div>
</div>
<p>
{{ _(
'downloads:download_description',
kolibrios="<b>{0}</b>".format(_('title:index')),
zip="<a href='http://www.7-zip.org' target='_blank'>7zip</a>",
gpl="<a href='http://www.gnu.org/licenses/gpl-2.0.html' target='_blank'>GPLv2</a>",
git="<a href='https://git.kolibrios.org'>{0}</a>".format(_('downloads:git-server'))
zip="<a href='https://7-zip.org' target='_blank'>7zip</a>",
gpl="<a href='//www.gnu.org/licenses/gpl-2.0.html' target='_blank'>GPLv2</a>",
git="<a href='//git.kolibrios.org'>{0}</a>".format(_('downloads:git-server'))
) | safe }}
</p>
<p class="p-warn">
<img src="{{ url_for('static', filename='img/icons/i_warn.png') }}" alt="Warn">{{ _(
'downloads:download_warn',
kolibrios="<b>{0}</b>".format(_('title:index'))
) | safe }}
</p>
{% if not config.NOCSS %}<input type="checkbox" id="warn-toggle">{% endif %}
<label for="warn-toggle" class="warn-title">
<img src="{{ url_for('static', filename='img/icons/i_warn.png') }}" alt="Warn">&nbsp;<u>{{ _('downloads:warn_title') }}</u>
</label>
<div id="download-warn">
<div>
<p>{{ _(
'downloads:download_warn',
kolibrios="<b>{0}</b>".format(_('title:index'))
) | safe }}</p>
</div>
</div>
<h1>{{ _('screenshots:header') }}</h1>
<div id="screen" onclick="next()">
<div id="show">
{% for i in range(1, 7) %}
<img
id="slide{{ i }}"
src="{{ url_for('static', filename='img/screenshots/%d.png' % i ) }}"
{% if i == 1 %}class="visible"{% endif %}
alt="{{ _('screenshots:%d' % i) }}"
>
<div id="screen">
{% set slides = _('screenshots:slides') | int %}
{% for i in range(1, slides + 1) %}
{% if not config.NOCSS %}<input type="radio" name="shot" id="slide{{ i }}" aria-label="{{ i }}"{% if i == 1 %} checked{% endif %}>{% endif %}
<figure>
<label for="slide{{ i % slides + 1 }}">
<img src="{{ url_for('static', filename='img/screenshots/%d.png' % i ) }}"
alt="{{ _('screenshots:%d' % i) }}">
</label>
<figcaption>{{ _('screenshots:%d' % i) }}</figcaption>
</figure>
{% endfor %}
</div>
</div>
<div id="carousel"></div>
<div id="dots"></div>
</div>
{% include 'tmpl/_footer.htm' %}
+4 -6
View File
@@ -1,16 +1,14 @@
<!doctype html>
<html lang="{{ lang }}" onmouseup="dropdown_hide()">
<html lang="{{ lang }}">
{% include 'tmpl/_header.htm' %}
<body onkeydown="checkkey(event)">
{% include 'tmpl/_lang-dropdown.htm' %}
<body>
{% include 'tmpl/_menu.htm' %}
<div id="article">
{% include 'tmpl/_git.htm' %}
{% include 'tmpl/_banner.htm' %}
{% include 'tmpl/_article.htm' %}
@@ -20,4 +18,4 @@
{% include 'tmpl/_footer.htm' %}
</body>
</html>
</html>
+4 -4
View File
@@ -3,7 +3,7 @@
'article:p1',
kolibrios="<b>{0}</b>"
.format(_('menu:kolibrios')),
drivers="<a href='http://wiki.kolibrios.org/wiki/Hardware_Support'>{0}</a>"
drivers="<a href='//wiki.kolibrios.org/wiki/Hardware_Support'>{0}</a>"
.format(_('article:drivers'))
) | safe }}
</p>
@@ -19,7 +19,7 @@
'article:p2',
kolibrios="<b>{0}</b>"
.format(_('menu:kolibrios')),
fasm="<a href='http://www.flatassembler.net' target='_blank'>FASM</a>"
fasm="<a href='//flatassembler.net' target='_blank'>FASM</a>"
) | safe }}
</p>
@@ -28,9 +28,9 @@
'article:p3',
kolibrios="<b>{0}</b>"
.format(_('menu:kolibrios')),
feedback="<a href='http://board.kolibrios.org'>{0}</a>"
feedback="<a href='//board.kolibrios.org'>{0}</a>"
.format(_('article:feedback')),
help="<a href='https://git.kolibrios.org/KolibriOS/kolibrios'>{0}</a>"
help="<a href='//git.kolibrios.org/KolibriOS/kolibrios'>{0}</a>"
.format(_('article:help'))
) | safe }}
</p>
+17
View File
@@ -0,0 +1,17 @@
<a id="banner" href="{{ _('banner:url') }}" target="_blank">
<table>
<tr>
<td valign="top" width="128">
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="{{ _('title:index')}}">
</td>
<td valign="top">
<h1>{{ _('banner:header') }}</h1>
<p>{{ _('banner:text') }}</p>
<a href="{{ _('banner:url') }}">{{ _('banner:url') }}</a>
</td>
<td valign="top" width="128">
<img src="{{ url_for('static', filename='img/banners/' + _('banner:img')) }}" alt="{{ _('banner:alt') }}">
</td>
</tr>
</table>
</a>
+2 -2
View File
@@ -1,7 +1,7 @@
<div id="footer">
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="KolibriOS">
<p>
&copy; 2004{{ year }} <br />
&copy; 2004 - {{ year }} <br />
{{ _('footer:team') }}
</p>
</div>
</div>
-19
View File
@@ -1,19 +0,0 @@
<a id="banner" href="https://git.kolibrios.org" target="_blank">
<table>
<tr>
<td valign="top" width="128">
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="KolibriOS">
</td>
<td valign="top">
<h1>{{ _('git:header') }}</h1>
<p>{{ _('git:text') }}</p>
<p class="p-link">
<a href="https://git.kolibrios.org">https://git.kolibrios.org</a>
</p>
</td>
<td valign="top" width="128">
<img src="{{ url_for('static', filename='img/gitea.png') }}" alt="Gitea">
</td>
</tr>
</table>
</a>
+2 -3
View File
@@ -4,8 +4,7 @@
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
<meta name="description" content="{{ _('header:%s' % request.url_rule.endpoint) }}">
<meta name="keywords"
content="kolibri, kolibrios, колибри, колибриос, colibri, operating system, assembler, калибри, fasm, alternate, open source">
content="kolibri, kolibrios, colibri, colibrios, колибри, колибриос, калибри, калибриос, operating system, assembler, fasm, alternate, open source">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<script src="{{ url_for('static', filename='script.min.js') }}"></script>
{% if not config.NOCSS %}<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">{% endif %}
</head>
+11 -23
View File
@@ -1,26 +1,14 @@
<div id="lang-dropdown">
<div>
{%- for lang_code in g.locales_name.keys() %}
{% set lang_name = g.locales_name[lang_code] %}
{%- if request.view_args["lang"] == lang_code %}
<font bg=#FF9800>
<a class="a-sel" href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
<img
src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}"
alt="{{ lang_code }}"
>
{{ lang_name }}
</a>
</font>
{%- else %}
<a href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
<img
src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}"
alt="{{ lang_code }}"
>
{{ lang_name }}
</a>
{%- endif %}
{%- endfor %}
{% for lang_code in g.locales_name.keys() %}
{% set selected = request.view_args["lang"] == lang_code %}
{# <font bg> highlights the current language in the CSS-less KolibriOS WebView. #}
{% if selected %}<font bg=#FF9800>{% endif %}
<a{% if selected %} class="a-sel"{% endif %} href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
<img src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}" alt="{{ lang_code }}">
{{ g.locales_name[lang_code] }}
</a>
{% if selected %}</font>{% endif %}
{% endfor %}
</div>
</div>
</div>
+14 -11
View File
@@ -1,25 +1,28 @@
<nav id="menu">
<a href="{{ url_for('index', lang=g.locale) }}" class="{% if request.endpoint == 'index' %}a-sel{% endif %}">
{% if current == 'index' %}
<a href="{{ url_for('index', lang=g.locale) }}"{% if request.endpoint == 'index' %} class="a-sel"{% endif %}>
{% if request.endpoint == 'index' %}
<font bg="lightblue">{{ _('menu:kolibrios') }}</font>
{% else %}
{{ _('menu:kolibrios') }}
{% endif %}
</a>
<a href="{{ url_for('download', lang=g.locale) }}" class="{% if request.endpoint == 'download' %}a-sel{% endif %}">
{% if current == 'download' %}
<a href="{{ url_for('download', lang=g.locale) }}"{% if request.endpoint == 'download' %} class="a-sel"{% endif %}>
{% if request.endpoint == 'download' %}
<font bg="lightblue">{{ _('menu:download') }}</font>
{% else %}
{{ _('menu:download') }}
{% endif %}
</a>
<a href="https://board.kolibrios.org">{{ _('menu:forum') }}</a>
<a href="https://wiki.kolibrios.org/wiki/Main_Page/{{ g.locale }}">{{ _('menu:wiki') }}</a>
<a href="https://git.kolibrios.org">Git</a>
<button onclick="dropdown_show(this)" id="lang-butt">
<a href="//board.kolibrios.org">{{ _('menu:forum') }}</a>
<a href="//wiki.kolibrios.org/wiki/Main_Page/{{ g.locale }}">{{ _('menu:wiki') }}</a>
<a href="//git.kolibrios.org">Git</a>
<span id="lang-switch" tabindex="0">
<img src="{{ url_for('static', filename='img/flags/%s.png' % g.locale) }}" alt="{{ g.locale }}">
</button>
{% include 'tmpl/_lang-dropdown.htm' %}
</span>
</nav>
+23 -7
View File
@@ -1,17 +1,33 @@
<p class="p-socials">
<a href="https://t.me/kolibrios_news" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_telegram.png') }}" alt="Telegram">Telegram
<img src="{{ url_for('static', filename='img/icons/i_telegram.png') }}" alt="Telegram">
Telegram
</a>
<br />
<a href="https://discord.com/invite/FeB2NvE6bF" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_discord.png') }}" alt="Discord">Discord
<img src="{{ url_for('static', filename='img/icons/i_discord.png') }}" alt="Discord">
Discord
</a>
<br />
<a href="https://www.facebook.com/groups/kolibrios/" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_facebook.png') }}" alt="Facebook">Facebook
<a href="https://facebook.com/groups/kolibrios/" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_facebook.png') }}" alt="Facebook">
Facebook
</a>
<br />
<a href="https://www.reddit.com/r/KolibriOS/" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_reddit.png') }}" alt="Reddit">Reddit
<a href="https://reddit.com/r/KolibriOS/" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_reddit.png') }}" alt="Reddit">
Reddit
</a>
</p>
</p>
<p class="p-socials">
<a href="https://matrix.to/#/#kolibrios:lair.moe" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_matrix.png') }}" alt="Matrix">
Matrix
</a>
<br />
<a href="irc://kolibrios.org" target="_blank">
<img src="{{ url_for('static', filename='img/icons/i_irc.png') }}" alt="IRC">
IRC
</a>
</p>