mirror of
https://github.com/kevinveenbirkenbach/homepage.veen.world.git
synced 2026-08-24 05:04:33 +00:00
feat(i18n): serve every page in 30 languages
The interface ships translated; page content stays English until a LibreTranslate instance fills app/i18n/content/ through make i18n. A string without a catalogue entry falls back to its English source, so a half-filled catalogue degrades instead of breaking. Translation runs after ConfigurationResolver.resolve_links(), on a copy. resolve_links matches by the `name` field, so translating it beforehand would break every `link:` reference in the configuration. negotiate() normalises to the primary subtag itself. Werkzeug's best_match returns an exact match before it considers a primary-tag fallback, so the Chrome default `de-DE,en;q=0.8` resolves to English there. "/" carries Vary: Accept-Language, without which a shared cache pins the first visitor's language for everyone. The route rule lists the known codes as a converter argument. A bare "/<lang>/" answers /robots.txt and /favicon.ico with a permanently cacheable 308 to their trailing-slash form. Templates gain lang, dir, the RTL stylesheet, a canonical URL and 30 hreflang alternates. Those are the first external URLs in this app: ProxyFix takes the scheme from X-Forwarded-Proto so they do not claim http:// behind a TLS-terminating proxy, X-Forwarded-Host stays untrusted because nginx passes a client-supplied one through, and TRUSTED_HOSTS lets Flask reject a forged Host outright. Flask only autoescapes .html/.htm/.xml/.xhtml/.svg, so every *.html.j2 template interpolated configuration raw. Enabling it changes two lines of the shipped page, both an apostrophe. read_catalog degrades an unreadable catalogue to English rather than serving a 500, and drops non-string entries that would otherwise render as "42". i18n_sync writes atomically, never overwrites an existing entry, refuses to touch a catalogue it could not parse, and leaves the file alone when a run translated nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
11
app/i18n/ui/ar.yaml
Normal file
11
app/i18n/ui/ar.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: بدائل
|
||||
Close: إغلاق
|
||||
Copy: نسخ
|
||||
Identifier copied to clipboard!: تم نسخ المعرّف إلى الحافظة!
|
||||
Imprint: معلومات قانونية
|
||||
Information: معلومات
|
||||
Language: اللغة
|
||||
Open: فتح
|
||||
Open Link: فتح الرابط
|
||||
Options: خيارات
|
||||
Warning: تحذير
|
||||
11
app/i18n/ui/bn.yaml
Normal file
11
app/i18n/ui/bn.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: অন্যান্য বিকল্প
|
||||
Close: বন্ধ করুন
|
||||
Copy: অনুলিপি
|
||||
Identifier copied to clipboard!: শনাক্তকারী ক্লিপবোর্ডে অনুলিপি করা হয়েছে!
|
||||
Imprint: আইনি তথ্য
|
||||
Information: তথ্য
|
||||
Language: ভাষা
|
||||
Open: খুলুন
|
||||
Open Link: লিঙ্ক খুলুন
|
||||
Options: বিকল্প
|
||||
Warning: সতর্কতা
|
||||
11
app/i18n/ui/cs.yaml
Normal file
11
app/i18n/ui/cs.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativy
|
||||
Close: Zavřít
|
||||
Copy: Kopírovat
|
||||
Identifier copied to clipboard!: Identifikátor zkopírován do schránky!
|
||||
Imprint: Tiráž
|
||||
Information: Informace
|
||||
Language: Jazyk
|
||||
Open: Otevřít
|
||||
Open Link: Otevřít odkaz
|
||||
Options: Možnosti
|
||||
Warning: Upozornění
|
||||
11
app/i18n/ui/da.yaml
Normal file
11
app/i18n/ui/da.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativer
|
||||
Close: Luk
|
||||
Copy: Kopiér
|
||||
Identifier copied to clipboard!: Identifikator kopieret til udklipsholder!
|
||||
Imprint: Juridisk information
|
||||
Information: Information
|
||||
Language: Sprog
|
||||
Open: Åbn
|
||||
Open Link: Åbn link
|
||||
Options: Valgmuligheder
|
||||
Warning: Advarsel
|
||||
11
app/i18n/ui/de.yaml
Normal file
11
app/i18n/ui/de.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativen
|
||||
Close: Schließen
|
||||
Copy: Kopieren
|
||||
Identifier copied to clipboard!: Kennung in die Zwischenablage kopiert!
|
||||
Imprint: Impressum
|
||||
Information: Information
|
||||
Language: Sprache
|
||||
Open: Öffnen
|
||||
Open Link: Link öffnen
|
||||
Options: Optionen
|
||||
Warning: Warnung
|
||||
11
app/i18n/ui/el.yaml
Normal file
11
app/i18n/ui/el.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Εναλλακτικές
|
||||
Close: Κλείσιμο
|
||||
Copy: Αντιγραφή
|
||||
Identifier copied to clipboard!: Το αναγνωριστικό αντιγράφηκε στο πρόχειρο!
|
||||
Imprint: Νομικές πληροφορίες
|
||||
Information: Πληροφορίες
|
||||
Language: Γλώσσα
|
||||
Open: Άνοιγμα
|
||||
Open Link: Άνοιγμα συνδέσμου
|
||||
Options: Επιλογές
|
||||
Warning: Προειδοποίηση
|
||||
11
app/i18n/ui/es.yaml
Normal file
11
app/i18n/ui/es.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativas
|
||||
Close: Cerrar
|
||||
Copy: Copiar
|
||||
Identifier copied to clipboard!: ¡Identificador copiado al portapapeles!
|
||||
Imprint: Aviso legal
|
||||
Information: Información
|
||||
Language: Idioma
|
||||
Open: Abrir
|
||||
Open Link: Abrir enlace
|
||||
Options: Opciones
|
||||
Warning: Advertencia
|
||||
11
app/i18n/ui/fa.yaml
Normal file
11
app/i18n/ui/fa.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: جایگزینها
|
||||
Close: بستن
|
||||
Copy: کپی
|
||||
Identifier copied to clipboard!: شناسه در کلیپبورد کپی شد!
|
||||
Imprint: اطلاعات حقوقی
|
||||
Information: اطلاعات
|
||||
Language: زبان
|
||||
Open: باز کردن
|
||||
Open Link: باز کردن پیوند
|
||||
Options: گزینهها
|
||||
Warning: هشدار
|
||||
11
app/i18n/ui/fi.yaml
Normal file
11
app/i18n/ui/fi.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Vaihtoehdot
|
||||
Close: Sulje
|
||||
Copy: Kopioi
|
||||
Identifier copied to clipboard!: Tunniste kopioitu leikepöydälle!
|
||||
Imprint: Oikeudelliset tiedot
|
||||
Information: Tiedot
|
||||
Language: Kieli
|
||||
Open: Avaa
|
||||
Open Link: Avaa linkki
|
||||
Options: Valinnat
|
||||
Warning: Varoitus
|
||||
11
app/i18n/ui/fr.yaml
Normal file
11
app/i18n/ui/fr.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatives
|
||||
Close: Fermer
|
||||
Copy: Copier
|
||||
Identifier copied to clipboard!: Identifiant copié dans le presse-papiers !
|
||||
Imprint: Mentions légales
|
||||
Information: Informations
|
||||
Language: Langue
|
||||
Open: Ouvrir
|
||||
Open Link: Ouvrir le lien
|
||||
Options: Options
|
||||
Warning: Avertissement
|
||||
11
app/i18n/ui/he.yaml
Normal file
11
app/i18n/ui/he.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: חלופות
|
||||
Close: סגור
|
||||
Copy: העתק
|
||||
Identifier copied to clipboard!: המזהה הועתק ללוח!
|
||||
Imprint: מידע משפטי
|
||||
Information: מידע
|
||||
Language: שפה
|
||||
Open: פתח
|
||||
Open Link: פתח קישור
|
||||
Options: אפשרויות
|
||||
Warning: אזהרה
|
||||
11
app/i18n/ui/hi.yaml
Normal file
11
app/i18n/ui/hi.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: अन्य विकल्प
|
||||
Close: बंद करें
|
||||
Copy: कॉपी करें
|
||||
Identifier copied to clipboard!: पहचानकर्ता क्लिपबोर्ड पर कॉपी हो गया!
|
||||
Imprint: कानूनी सूचना
|
||||
Information: जानकारी
|
||||
Language: भाषा
|
||||
Open: खोलें
|
||||
Open Link: लिंक खोलें
|
||||
Options: विकल्प
|
||||
Warning: चेतावनी
|
||||
11
app/i18n/ui/hu.yaml
Normal file
11
app/i18n/ui/hu.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatívák
|
||||
Close: Bezárás
|
||||
Copy: Másolás
|
||||
Identifier copied to clipboard!: Az azonosító a vágólapra másolva!
|
||||
Imprint: Impresszum
|
||||
Information: Információ
|
||||
Language: Nyelv
|
||||
Open: Megnyitás
|
||||
Open Link: Hivatkozás megnyitása
|
||||
Options: Lehetőségek
|
||||
Warning: Figyelmeztetés
|
||||
11
app/i18n/ui/id.yaml
Normal file
11
app/i18n/ui/id.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatif
|
||||
Close: Tutup
|
||||
Copy: Salin
|
||||
Identifier copied to clipboard!: Pengenal disalin ke papan klip!
|
||||
Imprint: Informasi hukum
|
||||
Information: Informasi
|
||||
Language: Bahasa
|
||||
Open: Buka
|
||||
Open Link: Buka tautan
|
||||
Options: Opsi
|
||||
Warning: Peringatan
|
||||
11
app/i18n/ui/it.yaml
Normal file
11
app/i18n/ui/it.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternative
|
||||
Close: Chiudi
|
||||
Copy: Copia
|
||||
Identifier copied to clipboard!: Identificatore copiato negli appunti!
|
||||
Imprint: Note legali
|
||||
Information: Informazioni
|
||||
Language: Lingua
|
||||
Open: Apri
|
||||
Open Link: Apri collegamento
|
||||
Options: Opzioni
|
||||
Warning: Avviso
|
||||
11
app/i18n/ui/ja.yaml
Normal file
11
app/i18n/ui/ja.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: 代替
|
||||
Close: 閉じる
|
||||
Copy: コピー
|
||||
Identifier copied to clipboard!: 識別子をクリップボードにコピーしました!
|
||||
Imprint: 法的情報
|
||||
Information: 情報
|
||||
Language: 言語
|
||||
Open: 開く
|
||||
Open Link: リンクを開く
|
||||
Options: オプション
|
||||
Warning: 警告
|
||||
11
app/i18n/ui/ko.yaml
Normal file
11
app/i18n/ui/ko.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: 대안
|
||||
Close: 닫기
|
||||
Copy: 복사
|
||||
Identifier copied to clipboard!: 식별자를 클립보드에 복사했습니다!
|
||||
Imprint: 법적 고지
|
||||
Information: 정보
|
||||
Language: 언어
|
||||
Open: 열기
|
||||
Open Link: 링크 열기
|
||||
Options: 옵션
|
||||
Warning: 경고
|
||||
11
app/i18n/ui/nl.yaml
Normal file
11
app/i18n/ui/nl.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatieven
|
||||
Close: Sluiten
|
||||
Copy: Kopiëren
|
||||
Identifier copied to clipboard!: Identificatie gekopieerd naar klembord!
|
||||
Imprint: Colofon
|
||||
Information: Informatie
|
||||
Language: Taal
|
||||
Open: Openen
|
||||
Open Link: Link openen
|
||||
Options: Opties
|
||||
Warning: Waarschuwing
|
||||
11
app/i18n/ui/pl.yaml
Normal file
11
app/i18n/ui/pl.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatywy
|
||||
Close: Zamknij
|
||||
Copy: Kopiuj
|
||||
Identifier copied to clipboard!: Identyfikator skopiowany do schowka!
|
||||
Imprint: Nota prawna
|
||||
Information: Informacja
|
||||
Language: Język
|
||||
Open: Otwórz
|
||||
Open Link: Otwórz link
|
||||
Options: Opcje
|
||||
Warning: Ostrzeżenie
|
||||
11
app/i18n/ui/pt.yaml
Normal file
11
app/i18n/ui/pt.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativas
|
||||
Close: Fechar
|
||||
Copy: Copiar
|
||||
Identifier copied to clipboard!: Identificador copiado para a área de transferência!
|
||||
Imprint: Aviso legal
|
||||
Information: Informação
|
||||
Language: Idioma
|
||||
Open: Abrir
|
||||
Open Link: Abrir link
|
||||
Options: Opções
|
||||
Warning: Aviso
|
||||
11
app/i18n/ui/ro.yaml
Normal file
11
app/i18n/ui/ro.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternative
|
||||
Close: Închide
|
||||
Copy: Copiază
|
||||
Identifier copied to clipboard!: Identificator copiat în clipboard!
|
||||
Imprint: Notă legală
|
||||
Information: Informații
|
||||
Language: Limbă
|
||||
Open: Deschide
|
||||
Open Link: Deschide linkul
|
||||
Options: Opțiuni
|
||||
Warning: Avertisment
|
||||
11
app/i18n/ui/ru.yaml
Normal file
11
app/i18n/ui/ru.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Альтернативы
|
||||
Close: Закрыть
|
||||
Copy: Копировать
|
||||
Identifier copied to clipboard!: Идентификатор скопирован в буфер обмена!
|
||||
Imprint: Выходные данные
|
||||
Information: Информация
|
||||
Language: Язык
|
||||
Open: Открыть
|
||||
Open Link: Открыть ссылку
|
||||
Options: Варианты
|
||||
Warning: Предупреждение
|
||||
11
app/i18n/ui/sv.yaml
Normal file
11
app/i18n/ui/sv.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternativ
|
||||
Close: Stäng
|
||||
Copy: Kopiera
|
||||
Identifier copied to clipboard!: Identifierare kopierad till urklipp!
|
||||
Imprint: Juridisk information
|
||||
Information: Information
|
||||
Language: Språk
|
||||
Open: Öppna
|
||||
Open Link: Öppna länk
|
||||
Options: Val
|
||||
Warning: Varning
|
||||
11
app/i18n/ui/th.yaml
Normal file
11
app/i18n/ui/th.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: ทางเลือกอื่น
|
||||
Close: ปิด
|
||||
Copy: คัดลอก
|
||||
Identifier copied to clipboard!: คัดลอกตัวระบุไปยังคลิปบอร์ดแล้ว!
|
||||
Imprint: ข้อมูลทางกฎหมาย
|
||||
Information: ข้อมูล
|
||||
Language: ภาษา
|
||||
Open: เปิด
|
||||
Open Link: เปิดลิงก์
|
||||
Options: ตัวเลือก
|
||||
Warning: คำเตือน
|
||||
11
app/i18n/ui/tr.yaml
Normal file
11
app/i18n/ui/tr.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Alternatifler
|
||||
Close: Kapat
|
||||
Copy: Kopyala
|
||||
Identifier copied to clipboard!: Tanımlayıcı panoya kopyalandı!
|
||||
Imprint: Künye
|
||||
Information: Bilgi
|
||||
Language: Dil
|
||||
Open: Aç
|
||||
Open Link: Bağlantıyı aç
|
||||
Options: Seçenekler
|
||||
Warning: Uyarı
|
||||
11
app/i18n/ui/uk.yaml
Normal file
11
app/i18n/ui/uk.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Альтернативи
|
||||
Close: Закрити
|
||||
Copy: Копіювати
|
||||
Identifier copied to clipboard!: Ідентифікатор скопійовано в буфер обміну!
|
||||
Imprint: Вихідні дані
|
||||
Information: Інформація
|
||||
Language: Мова
|
||||
Open: Відкрити
|
||||
Open Link: Відкрити посилання
|
||||
Options: Варіанти
|
||||
Warning: Попередження
|
||||
11
app/i18n/ui/ur.yaml
Normal file
11
app/i18n/ui/ur.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: متبادل
|
||||
Close: بند کریں
|
||||
Copy: نقل کریں
|
||||
Identifier copied to clipboard!: شناخت کنندہ کلپ بورڈ پر نقل ہو گیا!
|
||||
Imprint: قانونی معلومات
|
||||
Information: معلومات
|
||||
Language: زبان
|
||||
Open: کھولیں
|
||||
Open Link: لنک کھولیں
|
||||
Options: اختیارات
|
||||
Warning: انتباہ
|
||||
11
app/i18n/ui/vi.yaml
Normal file
11
app/i18n/ui/vi.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: Lựa chọn thay thế
|
||||
Close: Đóng
|
||||
Copy: Sao chép
|
||||
Identifier copied to clipboard!: Đã sao chép mã định danh vào bộ nhớ tạm!
|
||||
Imprint: Thông tin pháp lý
|
||||
Information: Thông tin
|
||||
Language: Ngôn ngữ
|
||||
Open: Mở
|
||||
Open Link: Mở liên kết
|
||||
Options: Tùy chọn
|
||||
Warning: Cảnh báo
|
||||
11
app/i18n/ui/zh.yaml
Normal file
11
app/i18n/ui/zh.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
Alternatives: 替代方案
|
||||
Close: 关闭
|
||||
Copy: 复制
|
||||
Identifier copied to clipboard!: 标识符已复制到剪贴板!
|
||||
Imprint: 法律声明
|
||||
Information: 信息
|
||||
Language: 语言
|
||||
Open: 打开
|
||||
Open Link: 打开链接
|
||||
Options: 选项
|
||||
Warning: 警告
|
||||
Reference in New Issue
Block a user