Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1730eaeaf9 |
@@ -17,6 +17,7 @@ htmlcov/
|
||||
docs/_build/
|
||||
|
||||
# Our's
|
||||
Dockerfile
|
||||
.env
|
||||
static/*.css
|
||||
static/*.css.map
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
FROM node:18-alpine as sass
|
||||
|
||||
RUN npm install -g sass
|
||||
WORKDIR /build
|
||||
COPY ./static ./static
|
||||
RUN sass ./static:./static \
|
||||
--no-source-map \
|
||||
--style=compressed
|
||||
|
||||
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
COPY --from=sass /build/static/ ./static/
|
||||
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
ENV FLASK_ENV=production
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--workers", "4"]
|
||||
@@ -1,10 +1,8 @@
|
||||
import os
|
||||
import re
|
||||
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
|
||||
|
||||
@@ -16,12 +14,21 @@ app = Flask(__name__)
|
||||
|
||||
locales.ensure_loaded()
|
||||
|
||||
# CSS compilation
|
||||
if app.debug:
|
||||
# CSS Compilation and minification
|
||||
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():
|
||||
@@ -38,24 +45,12 @@ def before_request():
|
||||
|
||||
@app.context_processor
|
||||
def _inject_autobuild_vers():
|
||||
return {
|
||||
"autobuild_vers": autobuild.autobuild_vers,
|
||||
"autobuild_sizes": autobuild.autobuild_sizes,
|
||||
"autobuild_files": autobuild.autobuild_files,
|
||||
}
|
||||
return {'autobuild_vers': autobuild.autobuild_vers}
|
||||
|
||||
|
||||
@app.context_processor
|
||||
def _inject_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")
|
||||
)
|
||||
}
|
||||
return {'autobuild_date': autobuild.autobuild_date}
|
||||
|
||||
|
||||
@app.context_processor
|
||||
@@ -63,17 +58,16 @@ 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 -------------------------------------------------------
|
||||
@@ -84,17 +78,12 @@ 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)
|
||||
@app.route("/<lang>")
|
||||
def index(lang):
|
||||
return helpers.render_localized_template(lang, "index.html")
|
||||
|
||||
|
||||
@app.route("/<lang>/download", strict_slashes=False)
|
||||
@app.route("/<lang>/download")
|
||||
def download(lang):
|
||||
return helpers.render_localized_template(lang, "download.html")
|
||||
|
||||
@@ -140,22 +129,6 @@ 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 -------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[banner]
|
||||
url = https://summerofcode.withgoogle.com/programs/2026/organizations/kolibrios-project-team
|
||||
img = gsoc.png
|
||||
@@ -14,10 +14,9 @@ forum = Forum
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS wurde zu GSoC 2026 angenommen!
|
||||
text = Informieren Sie sich über Programmdetails und unsere Projektideen
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = KolibriOS ist zu Git gewechselt!
|
||||
text = Schau dir unsere neue entwicklerfreundliche Infrastruktur an
|
||||
|
||||
[article]
|
||||
p1 = {kolibrios} ist ein winziges, aber unglaublich leistungsfähiges und
|
||||
@@ -52,7 +51,6 @@ header = Herunterladen
|
||||
|
||||
version = Version:
|
||||
date = Build-Datum:
|
||||
date-format = {DD}.{MM}.{YYYY}
|
||||
|
||||
img-descr = Disketten-Image
|
||||
iso-descr = LiveCD-Abbild
|
||||
@@ -65,12 +63,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
|
||||
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
|
||||
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\
|
||||
Booten des Systems auf neuen Computern und Laptops verwendet wird.
|
||||
|
||||
download_description = Auf dieser Seite können Sie die nächtlichen
|
||||
@@ -80,8 +78,6 @@ 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
|
||||
|
||||
@@ -14,10 +14,9 @@ forum = Forum
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS accepted to GSoC 2026!
|
||||
text = Check program details and our project ideas
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = KolibriOS moved to Git!
|
||||
text = Check our new developers-friendly infrastructure
|
||||
|
||||
[article]
|
||||
p1 = {kolibrios} is a tiny yet incredibly powerful and fast operating system for
|
||||
@@ -50,7 +49,6 @@ header = Downloads
|
||||
|
||||
version = Version:
|
||||
date = Build date:
|
||||
date-format = {DD}/{MM}/{YYYY}
|
||||
|
||||
img-descr = Floppy disk image
|
||||
iso-descr = LiveCD image
|
||||
@@ -61,12 +59,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
|
||||
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
|
||||
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\
|
||||
the system on new computers and laptops.
|
||||
|
||||
download_description = On this page you can download the nightly builds
|
||||
@@ -76,8 +74,6 @@ 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
|
||||
|
||||
@@ -14,10 +14,9 @@ forum = Foro
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = ¡KolibriOS fue aceptado en GSoC 2026!
|
||||
text = Consulta los detalles del programa y nuestras ideas de proyecto
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = ¡KolibriOS se ha trasladado a Git!
|
||||
text = Mira nuestra nueva infraestructura amigable para desarrolladores
|
||||
|
||||
[article]
|
||||
p1 = {kolibrios} es un sistema operativo diminuto, pero increíblemente potente y
|
||||
@@ -52,7 +51,6 @@ header = Descargas
|
||||
|
||||
version = Versión:
|
||||
date = Fecha de compilación:
|
||||
date-format = {DD}.{MM}.{YYYY}
|
||||
|
||||
img-descr = Imagen de disquete
|
||||
iso-descr = Imagen LiveCD
|
||||
@@ -63,12 +61,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
|
||||
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
|
||||
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\
|
||||
arrancar el sistema en los nuevos ordenadores y portátiles.
|
||||
|
||||
download_description = En esta página puedes descargar la distribución de
|
||||
@@ -78,8 +76,6 @@ 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
|
||||
|
||||
@@ -14,45 +14,43 @@ forum = Forum
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS a été accepté au GSoC 2026 !
|
||||
text = Consultez les détails du programme et nos idées de projets
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = KolibriOS a déménagé sur Git !
|
||||
text = Découvrez notre nouvelle infrastructure conviviale pour les développeurs
|
||||
|
||||
[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
|
||||
@@ -63,30 +61,28 @@ 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
|
||||
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
|
||||
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\
|
||||
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
|
||||
|
||||
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
|
||||
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 qu'il 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
|
||||
@@ -96,4 +92,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
|
||||
|
||||
@@ -14,10 +14,10 @@ forum = Forum
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS è stato accettato al GSoC 2026!
|
||||
text = Consulta i dettagli del programma e le nostre idee di progetto
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = KolibriOS si è spostato su Git!
|
||||
text = Dai un`occhiata alla nostra nuova infrastruttura pensata per gli
|
||||
sviluppatori
|
||||
|
||||
[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,7 +50,6 @@ header = Scaricamento
|
||||
|
||||
version = Versione:
|
||||
date = Data di compilazione:
|
||||
date-format = {DD}/{MM}/{YYYY}
|
||||
|
||||
img-descr = Immagine su dischetto
|
||||
iso-descr = Immagine LiveCD
|
||||
@@ -61,12 +60,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
|
||||
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
|
||||
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\
|
||||
per avviare il sistema su nuovi computer e portatili.
|
||||
|
||||
download_description = In questa pagina puoi scaricare la distribuzione delle
|
||||
@@ -76,15 +75,13 @@ 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 l'immagine 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 = Schermate
|
||||
header = Captures d`écran
|
||||
|
||||
1 = Il desktop di KolibriOS
|
||||
2 = Demo
|
||||
|
||||
@@ -14,14 +14,13 @@ forum = Forum
|
||||
wiki = Wiki
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS is geaccepteerd voor GSoC 2026!
|
||||
text = Bekijk de programmadetails en onze projectideeën
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = KolibriOS is verhuisd naar Git!
|
||||
text = Bekijk onze nieuwe, ontwikkelaarsvriendelijke infrastructuur
|
||||
|
||||
[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
|
||||
@@ -52,7 +51,6 @@ header = Downloads
|
||||
|
||||
version = Versie:
|
||||
date = Builddatum:
|
||||
date-format = {DD}.{MM}.{YYYY}
|
||||
|
||||
img-descr = Afbeelding op diskette
|
||||
iso-descr = LiveCD-afbeelding
|
||||
@@ -63,12 +61,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
|
||||
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
|
||||
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\
|
||||
om het systeem op te starten op nieuwe computers en laptops.
|
||||
|
||||
download_description = Op deze pagina kunt u de nightly builds-distributie
|
||||
@@ -78,9 +76,7 @@ download_description = Op deze pagina kunt u de nightly builds-distributie
|
||||
broncode is beschikbaar op onze {git}.
|
||||
git-server = Git-server
|
||||
|
||||
warn_title = Gemarkeerd door antivirus?
|
||||
|
||||
download_warn = Af en toe kunnen sommige antivirusprogramma's het
|
||||
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.
|
||||
@@ -91,7 +87,7 @@ header = Schermafbeeldingen
|
||||
1 = KolibriOS bureaublad
|
||||
2 = Demos
|
||||
3 = Bestandsbeheerders
|
||||
4 = Netwerk programma's
|
||||
4 = Netwerk programma`s
|
||||
5 = Spelletjes
|
||||
6 = Ontwikkel- en debugtools
|
||||
|
||||
|
||||
@@ -14,10 +14,9 @@ forum = Форум
|
||||
wiki = Вики
|
||||
git = Git
|
||||
|
||||
[banner]
|
||||
header = KolibriOS принята в GSoC 2026!
|
||||
text = Ознакомьтесь с деталями программы и нашими идеями проектов
|
||||
alt = GSoC
|
||||
[git]
|
||||
header = КолибриОС перешла на Git!
|
||||
text = Ознакомьтесь с нашей новой, удобной для разработчиков инфраструктурой
|
||||
|
||||
[article]
|
||||
p1 = {kolibrios} — это крошечная, но невероятно мощная и быстрая операционная
|
||||
@@ -52,7 +51,6 @@ header = Скачать
|
||||
|
||||
version = Версия:
|
||||
date = Дата сборки:
|
||||
date-format = {DD}.{MM}.{YYYY}
|
||||
|
||||
img-descr = Образ дискеты
|
||||
iso-descr = Образ LiveCD
|
||||
@@ -63,12 +61,12 @@ prev_rev = Предыдущие выпуски
|
||||
all_rev = Все ночные сборки
|
||||
|
||||
download_choice = Какой выбрать?
|
||||
download_help = Для новичка лучше всего подойдет LiveCD.
|
||||
\n
|
||||
По сравнению с LiveCD преимущество универсального образа в том, что вы
|
||||
можете сохранить изменения, сделанные в КолибриОС.
|
||||
\n
|
||||
Гибридный образ включает поддержку технологии UEFI, которая используется
|
||||
download_help = Для новичка лучше всего подойдет LiveCD.\n \
|
||||
\n\
|
||||
По сравнению с LiveCD преимущество универсального образа в том, что вы\
|
||||
можете сохранить изменения, сделанные в КолибриОС.\n\
|
||||
\n\
|
||||
Гибридный образ включает поддержку технологии UEFI, которая используется\
|
||||
для загрузки системы на новых компьютерах и ноутбуках.
|
||||
|
||||
download_description = На этой странице вы можете скачать ночные сборки
|
||||
@@ -78,8 +76,6 @@ download_description = На этой странице вы можете скач
|
||||
исходный код доступен на нашем {git}.
|
||||
git-server = Git-сервере
|
||||
|
||||
warn_title = Помечено антивирусом?
|
||||
|
||||
download_warn = Иногда антивирусы могут по ошибке помечать образ {kolibrios}
|
||||
как угрозу. Это ложное срабатывание. {kolibrios} имеет полностью открытый
|
||||
исходный код, и вы всегда можете собрать её самостоятельно, чтобы
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
[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
|
||||
@@ -1,88 +0,0 @@
|
||||
[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 开发团队
|
||||
@@ -1,88 +0,0 @@
|
||||
[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 開發團隊
|
||||
@@ -1,81 +1,80 @@
|
||||
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
|
||||
|
||||
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}
|
||||
autobuild_date = "DD.MM.YYYY"
|
||||
autobuild_vers = "0.0.0.0+0000-0000000"
|
||||
|
||||
_started = False
|
||||
_updater_lock = threading.Lock()
|
||||
|
||||
|
||||
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():
|
||||
def _refresh_build_date_once():
|
||||
global autobuild_date, autobuild_vers
|
||||
try:
|
||||
ci_html = _fetch(CI_URL)
|
||||
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
|
||||
|
||||
except Exception:
|
||||
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))
|
||||
pass
|
||||
|
||||
|
||||
def _updater_loop():
|
||||
while True:
|
||||
_refresh_autobuild_once()
|
||||
time.sleep(REFRESH_SEC)
|
||||
_refresh_build_date_once()
|
||||
time.sleep(STATUS_SEC)
|
||||
|
||||
|
||||
def ensure_started():
|
||||
@@ -87,4 +86,4 @@ def ensure_started():
|
||||
_started = True
|
||||
|
||||
|
||||
_refresh_autobuild_once()
|
||||
_refresh_build_date_once()
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
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()}
|
||||
@@ -1,14 +1,10 @@
|
||||
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"
|
||||
@@ -18,8 +14,10 @@ def render_localized_template(lang, template_name):
|
||||
if lang not in locales.locales_code:
|
||||
return redirect(url_for("index", lang=get_best_lang()))
|
||||
|
||||
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)
|
||||
return minify_html(
|
||||
render_template(
|
||||
template_name,
|
||||
year=date.today().year,
|
||||
),
|
||||
remove_empty_space=True,
|
||||
)
|
||||
|
||||
@@ -2,8 +2,6 @@ from os import path, listdir
|
||||
from configparser import ConfigParser
|
||||
import threading
|
||||
|
||||
from modules import configs
|
||||
|
||||
|
||||
translations = {}
|
||||
locales_name = {}
|
||||
@@ -35,13 +33,6 @@ 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"]
|
||||
|
||||
@@ -2,10 +2,9 @@ blinker==1.9.0
|
||||
click==8.1.8
|
||||
colorama==0.4.6
|
||||
Flask==3.1.0
|
||||
htmlmin2
|
||||
htmlmin==0.1.12
|
||||
itsdangerous==2.2.0
|
||||
Jinja2==3.1.6
|
||||
libsass==0.23.0
|
||||
MarkupSafe==3.0.2
|
||||
Werkzeug==3.1.3
|
||||
gunicorn
|
||||
|
||||
@@ -6,6 +6,7 @@ in pkgs.mkShell {
|
||||
buildInputs = with pypkgs; [
|
||||
python
|
||||
virtualenv
|
||||
pkgs.nodePackages.sass
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
|
||||
|
After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 446 B |
|
Before Width: | Height: | Size: 645 B |
|
Before Width: | Height: | Size: 645 B |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 510 B |
|
Before Width: | Height: | Size: 239 B |
@@ -0,0 +1,119 @@
|
||||
/* 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(); }
|
||||
}
|
||||
@@ -16,9 +16,7 @@ $c-shadow-soft: #1C1A281F;
|
||||
$c-article-bd: #C0B9C491;
|
||||
|
||||
$c-primary: #609A21;
|
||||
|
||||
$c-banner: #F9AB00;
|
||||
$c-banner-ink: #F9AB00AA;
|
||||
$c-primary-ink: #609A21AA;
|
||||
|
||||
$c-link: #0472D8;
|
||||
$c-link-hover: #0053B9;
|
||||
@@ -74,31 +72,18 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
/* LANG-DROPDOWN */
|
||||
|
||||
#lang-switch {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
#lang-butt {
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Focus opens it (span is tabindex-focusable, so a click focuses in every
|
||||
browser); clicking away blurs and closes it. */
|
||||
#lang-dropdown {
|
||||
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;
|
||||
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-DROPDOWN */
|
||||
|
||||
#lang-switch:focus-within & {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
#lang-dropdown {
|
||||
position: fixed;
|
||||
z-index: 9100;
|
||||
display: none;
|
||||
opacity: 0;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
@@ -110,11 +95,12 @@ body {
|
||||
border-top: 0;
|
||||
top: -10px;
|
||||
left: 50%;
|
||||
margin-left: -10px;
|
||||
margin-left: -6px;
|
||||
}
|
||||
|
||||
& > div {
|
||||
display: block;
|
||||
margin-left: 4px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid $c-text;
|
||||
box-shadow: 0 0 10px $c-menu-shadow;
|
||||
@@ -194,21 +180,12 @@ body {
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
box-shadow: inset 0 0 0 4px $c-banner-ink;
|
||||
}
|
||||
|
||||
table {
|
||||
table-layout: fixed;
|
||||
box-shadow: inset 0 0 0 4px $c-primary-ink;
|
||||
}
|
||||
|
||||
td {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
|
||||
&:first-child,
|
||||
&:last-child {
|
||||
width: 128px;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
@@ -216,7 +193,7 @@ body {
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: $c-banner;
|
||||
color: $c-primary;
|
||||
font-size: 2.5em;
|
||||
margin: 0 0 16px;
|
||||
}
|
||||
@@ -225,14 +202,14 @@ body {
|
||||
margin: 0em;
|
||||
}
|
||||
|
||||
a {
|
||||
display: block;
|
||||
.p-link {
|
||||
margin-top: 16px;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
color: $c-primary;
|
||||
font-weight: bold;
|
||||
color: $c-banner;
|
||||
border: none;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $c-primary;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -271,6 +248,7 @@ p {
|
||||
|
||||
img {
|
||||
height: 1em;
|
||||
margin-right: 0.5em;
|
||||
margin-bottom: -0.15em;
|
||||
}
|
||||
}
|
||||
@@ -278,6 +256,13 @@ p {
|
||||
&-subscription {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-warn {
|
||||
img {
|
||||
margin-bottom: -2px;
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* DOWNLOADS */
|
||||
@@ -360,69 +345,28 @@ td {
|
||||
margin-left: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
&-info {
|
||||
img {
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* 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 {
|
||||
.help-button {
|
||||
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;
|
||||
@@ -431,53 +375,24 @@ acronym {
|
||||
|
||||
/* SCREENS.CSS */
|
||||
|
||||
#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;
|
||||
}
|
||||
#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;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
display: none;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
border: 1px solid $c-screen-border;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
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;
|
||||
&.visible {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -489,6 +404,30 @@ 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 {
|
||||
@@ -536,7 +475,7 @@ iframe {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
p, .p-link {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<!doctype html>
|
||||
<html lang="{{ lang }}">
|
||||
<html lang="{{ lang }}" onmouseup="dropdown_hide()">
|
||||
|
||||
{% include 'tmpl/_header.htm' %}
|
||||
|
||||
<body>
|
||||
<body onkeydown="checkkey(event)">
|
||||
|
||||
{% include 'tmpl/_lang-dropdown.htm' %}
|
||||
|
||||
{% include 'tmpl/_menu.htm' %}
|
||||
|
||||
@@ -34,6 +36,7 @@
|
||||
{% for ext, alt in (
|
||||
('img', 'floppy'),
|
||||
('iso', 'cd'),
|
||||
('distr', 'universal'),
|
||||
('raw', 'uefi')
|
||||
) %}
|
||||
<tr class="tr-margin-bot">
|
||||
@@ -52,8 +55,8 @@
|
||||
('ru_RU', 'Русский'),
|
||||
('es_ES', 'Español')
|
||||
) %}
|
||||
<a href="//builds.kolibrios.org/{{ autobuild_files[l][ext] }}"
|
||||
title="{{ autobuild_vers }}, {{ autobuild_sizes[l][ext] }}"
|
||||
<a href="//builds.kolibrios.org/{{ l }}/latest-{{ ext }}.7z"
|
||||
title="ver. $autobuild_cmtid_{{ l }}, $autobuild_size_{{ l }}_{{ ext }}"
|
||||
class="button">
|
||||
{{ lang }}
|
||||
{% if l == 'en_US' %}
|
||||
@@ -62,8 +65,7 @@
|
||||
<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>
|
||||
@@ -74,14 +76,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">
|
||||
<label for="help-toggle" class="help-button">
|
||||
<img src="{{ url_for('static', filename='img/icons/i_info.png') }}" alt="Info"> <u>{{ _('downloads:download_choice') }}</u>
|
||||
</label>
|
||||
<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>
|
||||
</td>
|
||||
<td class="td-languages">
|
||||
<a href="//archive.kolibrios.org/{{ g.locale | e }}/">
|
||||
@@ -94,53 +96,39 @@
|
||||
</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='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'))
|
||||
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'))
|
||||
) | 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"> <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>
|
||||
<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>
|
||||
|
||||
<h1>{{ _('screenshots:header') }}</h1>
|
||||
|
||||
<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>
|
||||
<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) }}"
|
||||
>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div id="carousel"></div>
|
||||
<div id="dots"></div>
|
||||
</div>
|
||||
|
||||
{% include 'tmpl/_footer.htm' %}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<!doctype html>
|
||||
<html lang="{{ lang }}">
|
||||
<html lang="{{ lang }}" onmouseup="dropdown_hide()">
|
||||
|
||||
{% include 'tmpl/_header.htm' %}
|
||||
|
||||
<body>
|
||||
<body onkeydown="checkkey(event)">
|
||||
|
||||
{% include 'tmpl/_lang-dropdown.htm' %}
|
||||
|
||||
{% include 'tmpl/_menu.htm' %}
|
||||
|
||||
<div id="article">
|
||||
{% include 'tmpl/_banner.htm' %}
|
||||
{% include 'tmpl/_git.htm' %}
|
||||
|
||||
{% include 'tmpl/_article.htm' %}
|
||||
|
||||
@@ -18,4 +20,4 @@
|
||||
{% include 'tmpl/_footer.htm' %}
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
@@ -3,7 +3,7 @@
|
||||
'article:p1',
|
||||
kolibrios="<b>{0}</b>"
|
||||
.format(_('menu:kolibrios')),
|
||||
drivers="<a href='//wiki.kolibrios.org/wiki/Hardware_Support'>{0}</a>"
|
||||
drivers="<a href='http://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='//flatassembler.net' target='_blank'>FASM</a>"
|
||||
fasm="<a href='http://www.flatassembler.net' target='_blank'>FASM</a>"
|
||||
) | safe }}
|
||||
</p>
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
'article:p3',
|
||||
kolibrios="<b>{0}</b>"
|
||||
.format(_('menu:kolibrios')),
|
||||
feedback="<a href='//board.kolibrios.org'>{0}</a>"
|
||||
feedback="<a href='http://board.kolibrios.org'>{0}</a>"
|
||||
.format(_('article:feedback')),
|
||||
help="<a href='//git.kolibrios.org/KolibriOS/kolibrios'>{0}</a>"
|
||||
help="<a href='https://git.kolibrios.org/KolibriOS/kolibrios'>{0}</a>"
|
||||
.format(_('article:help'))
|
||||
) | safe }}
|
||||
</p>
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
<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>
|
||||
@@ -1,7 +1,7 @@
|
||||
<div id="footer">
|
||||
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="KolibriOS">
|
||||
<p>
|
||||
© 2004 - {{ year }} <br />
|
||||
© 2004 – {{ year }} <br />
|
||||
{{ _('footer:team') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,19 @@
|
||||
<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>
|
||||
@@ -4,7 +4,8 @@
|
||||
<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, colibrios, колибри, колибриос, калибри, калибриос, operating system, assembler, fasm, alternate, open source">
|
||||
content="kolibri, kolibrios, колибри, колибриос, colibri, operating system, assembler, калибри, fasm, alternate, open source">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
{% if not config.NOCSS %}<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">{% endif %}
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
|
||||
<script src="{{ url_for('static', filename='script.min.js') }}"></script>
|
||||
</head>
|
||||
|
||||
@@ -1,14 +1,26 @@
|
||||
<div id="lang-dropdown">
|
||||
<div>
|
||||
{% 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 %}
|
||||
{%- 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 %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,28 +1,25 @@
|
||||
<nav id="menu">
|
||||
<a href="{{ url_for('index', lang=g.locale) }}"{% if request.endpoint == 'index' %} class="a-sel"{% endif %}>
|
||||
{% if request.endpoint == 'index' %}
|
||||
<a href="{{ url_for('index', lang=g.locale) }}" class="{% if request.endpoint == 'index' %}a-sel{% endif %}">
|
||||
{% if current == 'index' %}
|
||||
<font bg="lightblue">{{ _('menu:kolibrios') }}</font>
|
||||
{% else %}
|
||||
{{ _('menu:kolibrios') }}
|
||||
{% endif %}
|
||||
</a>
|
||||
|
||||
<a href="{{ url_for('download', lang=g.locale) }}"{% if request.endpoint == 'download' %} class="a-sel"{% endif %}>
|
||||
{% if request.endpoint == 'download' %}
|
||||
|
||||
<a href="{{ url_for('download', lang=g.locale) }}" class="{% if request.endpoint == 'download' %}a-sel{% endif %}">
|
||||
{% if current == 'download' %}
|
||||
<font bg="lightblue">{{ _('menu:download') }}</font>
|
||||
{% else %}
|
||||
{{ _('menu:download') }}
|
||||
{% endif %}
|
||||
</a>
|
||||
|
||||
<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">
|
||||
<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">
|
||||
<img src="{{ url_for('static', filename='img/flags/%s.png' % g.locale) }}" alt="{{ g.locale }}">
|
||||
{% include 'tmpl/_lang-dropdown.htm' %}
|
||||
</span>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
@@ -1,33 +1,17 @@
|
||||
<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://facebook.com/groups/kolibrios/" target="_blank">
|
||||
<img src="{{ url_for('static', filename='img/icons/i_facebook.png') }}" alt="Facebook">
|
||||
Facebook
|
||||
<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>
|
||||
<br />
|
||||
<a href="https://reddit.com/r/KolibriOS/" target="_blank">
|
||||
<img src="{{ url_for('static', filename='img/icons/i_reddit.png') }}" alt="Reddit">
|
||||
Reddit
|
||||
<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>
|
||||
</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>
|
||||
</p>
|
||||