31 Commits

Author SHA1 Message Date
Burer 635346a4c3 feat/flask: split app into modules
feat/flask: !fix strange code to previous
2025-12-25 15:05:27 +02:00
Burer a4b23595db feat/flask: add html, css and js minification
feat/flask: !fix to previous
2025-12-25 15:04:02 +02:00
Burer ab1cd67e89 feat/flask: fix long lines, typos and trailing spaces in locales files
feat/flask: fix mistakes in ru locale
2025-12-25 15:01:59 +02:00
Burer 57b71be351 feat/flask: proper current locale in archive link 2025-12-25 14:59:16 +02:00
Burer 40fb662b5c feat/flask: restore single quotes and long lines split in app.py 2025-12-25 14:59:16 +02:00
Burer 00946b4579 feat/flask: compile sass only in debug mod 2025-12-25 14:59:16 +02:00
Sweetbread 1e5c3a4022 util: fix shell.nix 2025-12-25 14:59:16 +02:00
Sweetbread 08a277d180 l10n: wrap strings more than 80 char 2025-12-25 14:59:16 +02:00
Burer 93ecc59a74 feat/flask: cleaned unused imports 2025-12-25 14:59:15 +02:00
Burer 90e8440955 feat/flask: refactored style.scss 2025-12-25 14:59:15 +02:00
Burer 113cdf8f4d feat/flask: change article video depending on current locale 2025-12-25 14:59:15 +02:00
Burer 8dd117af6b feat/flask: reworked downloads page
- new table styles
- info about last version and build date
- "viruses" warning paragraph
2025-12-25 14:59:15 +02:00
Burer 712fd0ce4e feat/flask: autoupdate of last build date 2025-12-25 14:59:15 +02:00
Burer 605537f12a feat/flask: update requirements.txt 2025-12-25 14:59:15 +02:00
Burer 9284027988 feat/flask: fix highlight of active screenshot gallery element 2025-12-25 14:59:15 +02:00
Burer f218b76109 feat/flask: change scss compiler to Python lib 2025-12-25 14:59:14 +02:00
Burer 8a908f6ca9 feat/flask: update all locale files to new _-funtion style 2025-12-25 14:59:14 +02:00
Sweetbread 793f4f92aa feat: css to scss 2025-12-25 14:59:14 +02:00
Sweetbread 2d7977b067 l10n(ru): format strings 2025-12-25 14:59:14 +02:00
Sweetbread 40123bba11 feat: add _ function 2025-12-25 14:59:14 +02:00
Sweetbread 35cd583eed util: add shell.nix 2025-12-25 14:59:14 +02:00
Burer fc00c4ec75 feat/flask remove redundant favicon route, move config parser definition into locales function 2025-12-25 14:59:14 +02:00
Burer d4c8c88175 feat/flask: add sitemap.xml and robots.txt 2025-12-25 14:59:14 +02:00
Burer 3401a7b0bc feat/flask: small tweaks and fixes 2025-12-25 14:59:14 +02:00
Burer 73ce432368 feat/flask: simplified header structure/locales/routing 2025-12-25 14:59:14 +02:00
Burer 4a78c611c7 feat/flask: global locales and templates rework
Now list of locales is autogenerated from locales .ini files, and each locale use shared template files
2025-12-25 14:59:14 +02:00
Burer de9fdd7d0d feat/flask: images cleanup
- delete obsolete images
- resort images by folders
- add proper alt= parameters and standartized closing to <img> tags
2025-12-25 14:59:13 +02:00
Burer 4b994386a7 feat/flask: autogenerate languages for dropdown from locale files 2025-12-25 14:59:13 +02:00
Burer 72be677345 feat/flask: total rework and finalization
- Finished all locale pages
- Updated styles, fixed some mobile problems
- Updated texts on index page
- Fixed flask locales search error, now it throws 404
- Something else, that I already forgot
2025-12-25 14:59:13 +02:00
Burer 54f9af0505 [feat/flask] Reworked locales system to use separate .ini file for each language 2025-12-25 14:59:13 +02:00
Burer 124cbc699a [feat/flask] Small fixes and maintenance
- Fixed encoding error when reading locale.ini
- Added redirect from "/" route to "/en" route
- Added ifmain to app.py to fix Flask console error
- Added .gitignore for Flask
- Added requirements.txt

[feat/flask] Small infrastructure fixes

- Added Dockerfile and .env in .gitignore (just in case)
- Sorted .gitignore
- Removed Flask dependencies from requirements.txt
2025-12-25 14:59:04 +02:00
39 changed files with 143 additions and 584 deletions
-31
View File
@@ -1,31 +0,0 @@
name: Docker Build and Push
on:
push:
branches: [main]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Login to Docker Registry
uses: docker/login-action@v2
with:
registry: git.kolibrios.org
username: kolibrios
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name == 'push' }}
tags: git.kolibrios.org/kolibrios/kolibrios.org:latest
cache-from: type=gha
cache-to: type=gha,mode=max
+1
View File
@@ -17,6 +17,7 @@ htmlcov/
docs/_build/
# Our's
Dockerfile
.env
static/*.css
static/*.css.map
-23
View File
@@ -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"]
+16 -28
View File
@@ -14,20 +14,20 @@ app = Flask(__name__)
locales.ensure_loaded()
# CSS Compilation and minification
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)
# 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
@@ -45,23 +45,12 @@ def before_request():
@app.context_processor
def _inject_autobuild_vers():
return {
"autobuild_vers": autobuild.autobuild_vers,
"autobuild_sizes": autobuild.autobuild_sizes,
}
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
@@ -69,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 -------------------------------------------------------
@@ -90,12 +78,12 @@ def home():
return redirect(url_for("index", 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")
-3
View File
@@ -1,3 +0,0 @@
[banner]
url = https://summerofcode.withgoogle.com/programs/2026/organizations/kolibrios-project-team
img = gsoc.png
+5 -7
View File
@@ -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
@@ -67,10 +65,10 @@ 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 \
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 \
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
+5 -7
View File
@@ -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
@@ -63,10 +61,10 @@ 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 \
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 \
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
+5 -7
View File
@@ -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
@@ -65,10 +63,10 @@ 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 \
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 \
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
+5 -7
View File
@@ -14,10 +14,9 @@ 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
@@ -52,7 +51,6 @@ 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
@@ -65,10 +63,10 @@ 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 \
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 \
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
+6 -7
View File
@@ -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
@@ -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
@@ -63,10 +62,10 @@ 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 è \
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 \
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
+5 -7
View File
@@ -14,10 +14,9 @@ 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
@@ -52,7 +51,6 @@ header = Downloads
version = Versie:
date = Builddatum:
date-format = {DD}.{MM}.{YYYY}
img-descr = Afbeelding op diskette
iso-descr = LiveCD-afbeelding
@@ -65,10 +63,10 @@ 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 \
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 \
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
+5 -7
View File
@@ -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
@@ -65,10 +63,10 @@ all_rev = Все ночные сборки
download_choice = Какой выбрать?
download_help = Для новичка лучше всего подойдет LiveCD.\n \
\n\
По сравнению с LiveCD преимущество универсального образа в том, что вы \
По сравнению с LiveCD преимущество универсального образа в том, что вы\
можете сохранить изменения, сделанные в КолибриОС.\n\
\n\
Гибридный образ включает поддержку технологии UEFI, которая используется \
Гибридный образ включает поддержку технологии UEFI, которая используется\
для загрузки системы на новых компьютерах и ноутбуках.
download_description = На этой странице вы можете скачать ночные сборки
-96
View File
@@ -1,96 +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 \
\n\
У порівнянні з LiveCD перевага універсального образу полягає в тому, що ви
можете зберегти зміни, зроблені в KolibriOS.\n
\n\
Гібридний образ містить підтримку технології UEFI, яка використовується
для завантаження системи на нових комп'ютерах та ноутбуках.
download_description = На цій сторінці ви можете завантажити нічні збірки
дистрибутива. Це означає, що вони завжди містять останні зміни в
системі, а отже можуть бути нестабільними. Усі файли стиснуті за
допомогою {zip}. {kolibrios} розповсюджується під ліцензією {gpl}, а
вихідний код доступний на нашому {git}.
git-server = Git-сервері
download_warn = Іноді антивіруси можуть помилково помічати образ {kolibrios}
як загрозу. Це помилкове спрацьовування. {kolibrios} має повністю відкритий
вихідний код, і ви завжди можете зібрати її самостійно, щоб
переконатися, що вона абсолютно безпечна.
[screenshots]
header = Скриншоти
1 = Робочий стіл KolibriOS
2 = Демки
3 = Файлові менеджери
4 = Мережеві додатки
5 = Ігри
6 = Інструменти розробника
[footer]
team = Команда KolibriOS
-86
View File
@@ -1,86 +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\
\n\
而与之不同的是,通用包允许用户把在系统运行过程中对 KolibriOS 的更改保存下来,例如系统设置之类就可以保存。\n\
\n\
混合启动镜像包含了对 UEFI 技术的支持,可以让你在现代的电脑上更好地启动之。
download_description = 在此页面中,你可以下载我们的即时构建版本,也就是包含了最新的更新。
需要知道的是:这些特性往往会致使系统不稳定,使用时请牢记此项。
这些文件都经过 {zip} 压缩打包。{kolibrios} 以 {gpl} 协议发布,其源码可见于{git}。
git-server = 此仓库站
download_warn = 有些时候,一些防病毒软件会错误地将 {kolibrios} 的镜像标记为威胁项目,这应当是误判。{kolibrios} 完全开源,如果担心存在问题,无论何时何地,你都可以自行构建一份来确保安全。
[screenshots]
header = 内容截屏
1 = KolibriOS 桌面
2 = 演示程序
3 = 不同的文件管理器
4 = 网络相关的程序
5 = 游戏
6 = 开发调试工具
[footer]
team = KolibriOS 开发团队
-86
View File
@@ -1,86 +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\
\n\
而與之不同的是,通用包允許使用者把在系統運行過程中對 KolibriOS 作出的更改保存下來,例如系統設置之類就可以保留。\n\
\n\
混合啟動鏡像包含了對 UEFI 技術的支援,可以讓你在現代的電腦上更好地啟動之。
download_description = 在此頁面裏,你可以下載我們的 Nightly 構建包,也即包含了當下最新的更新。
需要知道的是:因爲是即時更新並構建的,這些包往往包含一些導致系統不穩定的特性,請在使用時牢記此項。
這些檔案都是經過 {zip} 壓縮打包的,使用前需解壓。{kolibrios} 以 {gpl} 許可證發佈,其源碼可見於{git}。
git-server = 此倉庫站
download_warn = 有些時候,一些防毒軟體會錯誤地將 {kolibrios} 的鏡像標記為威脅項,這應當是一種誤判。我們的 {kolibrios} 完全開源,如果擔心存在安全問題,無論何時何地,你都可以自行構建一份來確保運行的内容是安全的。
[screenshots]
header = 內容截屏
1 = KolibriOS 桌面
2 = 演示程式
3 = 不同的檔案管理員
4 = 網路相關的程式
5 = 遊戲
6 = 開發調試工具
[footer]
team = KolibriOS 開發團隊
+39 -50
View File
@@ -1,50 +1,23 @@
from datetime import date
import re
import threading
import time
from urllib.request import Request, urlopen
STATUS_URL = "http://builds.kolibrios.org/status.html"
STATUS_URL = "https://builds.kolibrios.org/status.html"
STATUS_SEC = 300 # refetch each 5 minutes
DOWNLOAD_LANGS = ("en_US", "ru_RU", "es_ES")
DOWNLOAD_EXTS = ("img", "iso", "distr", "raw")
VER_RE = re.compile(r"\b(\d+\.\d+\.\d+\.\d+\+\d{3,8}-[0-9a-fA-F]{7,40})\b")
DATE_RE = re.compile(r"\b(\d{4})\.(\d{2})\.(\d{2})\s+\d{2}:\d{2}:\d{2}\b")
ROW_RE = re.compile(r"(<tr\b[^>]*>.*?</tr>)", flags=re.I | re.S)
autobuild_date = date.today()
autobuild_date = "DD.MM.YYYY"
autobuild_vers = "0.0.0.0+0000-0000000"
autobuild_sizes = {
lang: {ext: "?" for ext in DOWNLOAD_EXTS}
for lang in DOWNLOAD_LANGS
}
_started = False
_updater_lock = threading.Lock()
def _refresh_build_sizes():
for lang in DOWNLOAD_LANGS:
for ext in DOWNLOAD_EXTS:
url = f"http://builds.kolibrios.org/{lang}/latest-{ext}.7z"
req = Request(
url,
method="HEAD",
headers={"User-Agent": "Mozilla/5.0"},
)
with urlopen(req, timeout=10) as r:
content_length = r.headers.get("Content-Length")
if not content_length:
continue
autobuild_sizes[lang][ext] = f"{int(content_length) / 1048576:.1f} MB"
def _refresh_autobuild_once():
def _refresh_build_date_once():
global autobuild_date, autobuild_vers
try:
from urllib.request import Request, urlopen
req = Request(
STATUS_URL,
headers={
@@ -57,26 +30,42 @@ def _refresh_autobuild_once():
r.headers.get_content_charset() or "utf-8", "replace"
)
last_ver = None
rows = re.findall(r"(<tr\b[^>]*>.*?</tr>)", html, flags=re.I | re.S)
if not rows:
return
for row in ROW_RE.findall(html):
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 ""
if "commit" in classes:
mver = VER_RE.search(row)
if mver:
last_ver = mver.group(1)
continue
if "success" not in classes:
continue
text = re.sub(r"<[^>]+>", " ", row)
mts = DATE_RE.search(text)
if mts:
autobuild_date = date(*map(int, mts.groups()))
if last_ver:
autobuild_vers = last_ver
_refresh_build_sizes()
return
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:
pass
@@ -84,7 +73,7 @@ def _refresh_autobuild_once():
def _updater_loop():
while True:
_refresh_autobuild_once()
_refresh_build_date_once()
time.sleep(STATUS_SEC)
@@ -97,4 +86,4 @@ def ensure_started():
_started = True
_refresh_autobuild_once()
_refresh_build_date_once()
-50
View File
@@ -1,50 +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 = {}
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 -1
View File
@@ -19,5 +19,5 @@ def render_localized_template(lang, template_name):
template_name,
year=date.today().year,
),
remove_empty_space=False,
remove_empty_space=True,
)
-9
View File
@@ -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"]
-1
View File
@@ -8,4 +8,3 @@ Jinja2==3.1.6
libsass==0.23.0
MarkupSafe==3.0.2
Werkzeug==3.1.3
gunicorn
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 B

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

+10 -21
View File
@@ -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;
@@ -182,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 {
@@ -204,7 +193,7 @@ body {
}
h1 {
color: $c-banner;
color: $c-primary;
font-size: 2.5em;
margin: 0 0 16px;
}
@@ -213,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;
}
}
@@ -486,7 +475,7 @@ iframe {
margin-bottom: 0;
}
p {
p, .p-link {
margin-top: 0.5em;
}
}
+4 -4
View File
@@ -56,7 +56,7 @@
('es_ES', 'Español')
) %}
<a href="//builds.kolibrios.org/{{ l }}/latest-{{ ext }}.7z"
title="{{ autobuild_vers }}, {{ autobuild_sizes[l][ext] }}"
title="ver. $autobuild_cmtid_{{ l }}, $autobuild_size_{{ l }}_{{ ext }}"
class="button">
{{ lang }}
{% if l == 'en_US' %}
@@ -100,9 +100,9 @@
{{ _(
'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>
+1 -1
View File
@@ -10,7 +10,7 @@
{% include 'tmpl/_menu.htm' %}
<div id="article">
{% include 'tmpl/_banner.htm' %}
{% include 'tmpl/_git.htm' %}
{% include 'tmpl/_article.htm' %}
+4 -4
View File
@@ -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>
-17
View File
@@ -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 -1
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>
+19
View File
@@ -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>
+1 -1
View File
@@ -4,7 +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, 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">
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<script src="{{ url_for('static', filename='script.min.js') }}"></script>
+7 -9
View File
@@ -1,13 +1,13 @@
<nav id="menu">
<a href="{{ url_for('index', lang=g.locale) }}"{% if request.endpoint == 'index' %} class="a-sel"{% endif %}>
<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 %}>
<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 %}
@@ -15,12 +15,10 @@
{% 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>
<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 }}">
</button>
+3 -13
View File
@@ -7,21 +7,11 @@
<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">
<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">
<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>