From 99bb85e98a10eae1e13983954fa6bfe6e6b03fbb Mon Sep 17 00:00:00 2001 From: biosias Date: Fri, 11 Sep 2026 12:35:03 +0200 Subject: [PATCH] Add Czech and Slovak translation files (AI) cmjs/strings/cs.json restores the site's original Czech UI text (now sourced as a translation file rather than hardcoded); sk.json is a new Slovak translation. Both cover every key in en.json. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01AXSVPS3UmmASiiprPfcnUd --- README.md | 8 ++++++-- cmjs/strings/cs.json | 40 ++++++++++++++++++++++++++++++++++++++++ cmjs/strings/sk.json | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 cmjs/strings/cs.json create mode 100644 cmjs/strings/sk.json diff --git a/README.md b/README.md index 787c9eb..7474a09 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,9 @@ cmjs/ │ ├── views.js # loadArticleList, loadArticle, loadAuthorView, loadCategoryView, loadSearch │ └── router.js # Hash router and app entry point ├── strings/ - │ └── en.json # UI strings (default/fallback locale) — see "Translations" below + │ ├── en.json # UI strings (default/fallback locale) — see "Translations" below + │ ├── cs.json # Czech translation + │ └── sk.json # Slovak translation ├── templates/ │ ├── card.html # Article list card layout │ └── article.html # Full article view layout @@ -174,7 +176,9 @@ Every UI string the JS renders (loading/error states, pagination, filter labels, contents heading, etc.) is looked up through `t(key, params)` in `cmjs/js/i18n.js` rather than hardcoded — `cmjs/strings/en.json` is the default/fallback string table. -To add a translation: +Available locales: `en` (default), `cs` (Czech), `sk` (Slovak). + +To add another translation: 1. Set `` in your `index.html` to the target language code (e.g. `cs`). 2. Add `cmjs/strings/xx.json` with the same keys as `en.json` (copy it as a starting point) — diff --git a/cmjs/strings/cs.json b/cmjs/strings/cs.json new file mode 100644 index 0000000..b3d6fc5 --- /dev/null +++ b/cmjs/strings/cs.json @@ -0,0 +1,40 @@ +{ + "siteName": "Expediční blogy", + "appStartError": "Blog se nepodařilo spustit: {message}", + "articleNotFound": "Článek nebyl nalezen", + + "filterAuthor": "Autor: {value}", + "filterTag": "Štítek: {value}", + "filterYear": "Ročník: {value}", + "filterAllArticles": "Všechny články", + "yearLabel": "Expa {year}", + + "paginationLabel": "Stránkování", + "paginationPrevious": "Předchozí", + "paginationNext": "Další", + "paginationPageInfo": "{page} z {totalPages}", + + "templateEmptyError": "Šablona článku je prázdná.", + "readingTime": "{minutes} min čtení", + + "crawlHealthAuthorsFailed": "Pozor: nepodařilo se načíst žádného autora — zkontrolujte nastavení serveru.", + "crawlHealthArticlesFailed": "Pozor: načtena jen {loaded} z {total} položek — zkontrolujte nastavení serveru.", + + "loadingArticles": "Načítám články…", + "loadingGeneric": "Načítám…", + "emptyArticleList": "Nebyly nalezeny žádné články.", + "articlesLoadError": "Články se nepodařilo načíst: {message}", + + "searching": "Hledám…", + "searchHeading": "Hledání: „{query}“", + "searchNoResults": "Hledání neodpovídá žádný článek.", + "searchError": "Hledání se nepodařilo: {message}", + + "tocTitle": "Obsah", + "tocFallbackHeading": "sekce", + + "backToArticles": "Zpět na články", + "articleLoadError": "Článek se nepodařilo načíst: {message}", + + "socialWebsite": "Web" +} diff --git a/cmjs/strings/sk.json b/cmjs/strings/sk.json new file mode 100644 index 0000000..ae310a6 --- /dev/null +++ b/cmjs/strings/sk.json @@ -0,0 +1,40 @@ +{ + "siteName": "Expedičné blogy", + "appStartError": "Blog sa nepodarilo spustiť: {message}", + "articleNotFound": "Článok nebol nájdený", + + "filterAuthor": "Autor: {value}", + "filterTag": "Štítok: {value}", + "filterYear": "Ročník: {value}", + "filterAllArticles": "Všetky články", + "yearLabel": "Expa {year}", + + "paginationLabel": "Stránkovanie", + "paginationPrevious": "Predchádzajúca", + "paginationNext": "Ďalšia", + "paginationPageInfo": "{page} z {totalPages}", + + "templateEmptyError": "Šablóna článku je prázdna.", + "readingTime": "{minutes} min čítania", + + "crawlHealthAuthorsFailed": "Pozor: nepodarilo sa načítať žiadneho autora — skontrolujte nastavenie servera.", + "crawlHealthArticlesFailed": "Pozor: načítaných len {loaded} z {total} položiek — skontrolujte nastavenie servera.", + + "loadingArticles": "Načítavam články…", + "loadingGeneric": "Načítavam…", + "emptyArticleList": "Neboli nájdené žiadne články.", + "articlesLoadError": "Články sa nepodarilo načítať: {message}", + + "searching": "Hľadám…", + "searchHeading": "Hľadanie: „{query}“", + "searchNoResults": "Hľadaniu nezodpovedá žiadny článok.", + "searchError": "Hľadanie sa nepodarilo: {message}", + + "tocTitle": "Obsah", + "tocFallbackHeading": "sekcia", + + "backToArticles": "Späť na články", + "articleLoadError": "Článok sa nepodarilo načítať: {message}", + + "socialWebsite": "Web" +}