#!/usr/bin/env bash # # Weblate Setup Script for BookLore # # Creates the Weblate project and all 25 translation components via the API. # Run once after creating your Hosted Weblate account. # # Prerequisites: # 1. Get your API token from https://hosted.weblate.org/accounts/profile/#api # 2. Ensure your GitHub repo (booklore-app/booklore) is public (required for Libre plan) # # Usage: # WEBLATE_TOKEN=your-api-token ./scripts/weblate-setup.sh # set -euo pipefail # ─── Configuration ──────────────────────────────────────────────────────────── WEBLATE_URL="${WEBLATE_URL:-https://hosted.weblate.org}" API="${WEBLATE_URL}/api" TOKEN="${WEBLATE_TOKEN:?Set WEBLATE_TOKEN to your Weblate API token}" PROJECT_NAME="BookLore" PROJECT_SLUG="booklore" PROJECT_WEB="https://github.com/booklore-app/booklore" REPO_URL="https://github.com/booklore-app/booklore.git" REPO_BRANCH="develop" FILE_BASE="booklore-ui/src/i18n" SOURCE_LANG="en" # All languages the project supports LANGUAGES="en es de fr it nl pl pt ru" # All 25 translation domain files (without .json extension) COMPONENTS=( common auth nav dashboard settings settings-email settings-reader settings-view settings-metadata settings-library-metadata settings-application settings-users settings-naming settings-opds settings-tasks settings-auth settings-device settings-profile app shared layout library-creator bookdrop metadata ) # ─── Helpers ────────────────────────────────────────────────────────────────── auth_header="Authorization: Token ${TOKEN}" content_type="Content-Type: application/json" api_post() { local endpoint="$1" local data="$2" local response response=$(curl -s -w "\n%{http_code}" -X POST "${API}${endpoint}" \ -H "${auth_header}" \ -H "${content_type}" \ -d "${data}") local http_code http_code=$(echo "$response" | tail -1) local body body=$(echo "$response" | sed '$d') if [[ "$http_code" -ge 200 && "$http_code" -lt 300 ]]; then echo " OK (${http_code})" return 0 elif [[ "$http_code" == "400" ]] && echo "$body" | grep -q "already exists"; then echo " Already exists, skipping" return 0 else echo " FAILED (${http_code}): ${body}" return 1 fi } # Pretty name from slug: settings-email -> Settings Email pretty_name() { echo "$1" | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2))}1' } # ─── Step 1: Create Project ────────────────────────────────────────────────── echo "=== Creating project: ${PROJECT_NAME} ===" api_post "/projects/" "$(cat <