Patrick Schurig b2b92e7ce1 feat(i18n): mkdocs-static-i18n, trois langues construites en une passe
mkdocs.yml : plugin i18n en mode `suffix` (page.md = fr, page.de.md,
page.en.md), fr par défaut, fallback_to_default, un index de recherche par
langue, et nav_translations — 29 éléments traduits par langue, vérifié au
build. i18n est placé AVANT literate-nav et search : il réécrit l'arbre des
fichiers par langue, les autres doivent voir l'arbre déjà localisé.

navigation.instant est RETIRÉ de theme.features. Ce n'est pas un arbitrage de
confort : il est incompatible avec le lien contextuel du sélecteur de langue de
mkdocs-static-i18n, et l'avertissement fait ÉCHOUER `mkdocs build --strict`.
Le sélecteur l'emporte — atterrir sur la même page dans l'autre langue vaut
plus qu'un chargement instantané qui renvoie à l'accueil. Le commentaire est à
l'endroit du retrait, pas ailleurs.

Vérifié que literate-nav et static-i18n cohabitent, plutôt que supposé : build
construit, nav de /de/ relue dans le HTML produit (« Geräte », « Kompatibilität »,
liste des appareils bien dépliée).

CI : --locales fr,de,en sur la génération ET sur le contrôle d'idempotence. Et
une étape qui manquait — gen_api_reference.py n'était pas dans le pipeline, sa
sortie ne se propageait donc qu'au prochain passage manuel.

requirements.txt : mkdocs-static-i18n >= 1.3.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-13 06:39:19 +02:00

118 lines
4.9 KiB
YAML

name: Build & Deploy docs
on:
push:
branches: [main]
schedule:
- cron: '0 3 * * *' # mise à jour nocturne (meta.json des repos plugins)
workflow_dispatch:
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
run: |
mkdir -p /root/_work/powersync-docs
cd /root/_work/powersync-docs
git init
git remote remove origin 2>/dev/null || true
git remote add origin \
"https://pakutz79:${{ secrets.MKDOCS_TOKEN }}@git.etm-powersync.fr/pakutz79/powersync-docs.git"
git fetch --depth 1 origin HEAD
git checkout FETCH_HEAD
- name: Install dependencies
run: |
cd /root/_work/powersync-docs
apt-get update -qq && apt-get install -y -qq python3-pip
python3 -m pip install --break-system-packages -q -r requirements.txt
# ── Récupération des JSON depuis les 5 repos drivers ─────────────────
- name: Fetch plugin JSON files
env:
GITEA_TOKEN: ${{ secrets.MKDOCS_TOKEN }}
run: |
cd /root/_work/powersync-docs
GITEA_BASE="https://git.etm-powersync.fr"
AUTH_BASE="https://pakutz79:${GITEA_TOKEN}@git.etm-powersync.fr"
mkdir -p .plugins-src
for repo in etm-powersync-plugins etm-powersync-plugins-modbus \
nymea-plugins nymea-plugins-modbus nymea-plugins-genericthings; do
# Branche par défaut via API Gitea (pas de hardcoding main/master)
BRANCH=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
"${GITEA_BASE}/api/v1/repos/ETM-Schurig/${repo}" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('default_branch','main'))" \
2>/dev/null) || BRANCH="main"
echo "→ ${repo} (branche: ${BRANCH})"
git clone --depth 1 --branch "${BRANCH}" \
"${AUTH_BASE}/ETM-Schurig/${repo}.git" \
".plugins-src/${repo}" \
|| echo "WARNING: ${repo} introuvable ou inaccessible — ignoré"
done
# ── Génération de la doc ──────────────────────────────────────────────
- name: Generate device reference + SUMMARY.md
run: |
cd /root/_work/powersync-docs
python3 scripts/gen_device_reference.py \
--src .plugins-src \
--docs docs \
--lang fr \
--locales fr,de,en
- name: Generate JSON-RPC API reference
run: |
cd /root/_work/powersync-docs
python3 scripts/gen_api_reference.py \
--src introspect.json \
--docs docs
# ── Build MkDocs ──────────────────────────────────────────────────────
# i18n construit les trois langues en une passe : site/ (fr), site/de/, site/en/.
- name: MkDocs build --strict
run: |
cd /root/_work/powersync-docs
mkdocs build --strict
# ── Vérification idempotence ──────────────────────────────────────────
- name: Check generated content is up-to-date
run: |
cd /root/_work/powersync-docs
python3 scripts/gen_device_reference.py \
--src .plugins-src \
--docs docs \
--lang fr \
--locales fr,de,en \
--check
# ── SSH ───────────────────────────────────────────────────────────────
- name: Setup SSH deploy key
env:
SSH_KEY: ${{ secrets.DOCS_DEPLOY_SSH_KEY }}
DEPLOY_HOST: ${{ secrets.DOCS_DEPLOY_HOST }}
run: |
mkdir -p ~/.ssh
printf '%s\n' "${SSH_KEY}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H "${DEPLOY_HOST}" >> ~/.ssh/known_hosts
# ── Déploiement ───────────────────────────────────────────────────────
- name: Deploy via rsync
env:
DEPLOY_USER: ${{ secrets.DOCS_DEPLOY_USER }}
DEPLOY_HOST: ${{ secrets.DOCS_DEPLOY_HOST }}
DEPLOY_PATH: ${{ secrets.DOCS_DEPLOY_PATH }}
run: |
apt-get update -qq && apt-get install -y -qq rsync
cd /root/_work/powersync-docs
rsync -az --delete \
-e "ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=yes" \
site/ \
"${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}"