![]()
🗣️ Consistent Multilingual Political Intelligence Across 14 Languages
🇸🇪🇬🇧🇩🇰🇳🇴🇫🇮🇩🇪🇫🇷🇪🇸🇳🇱🇸🇦🇮🇱🇯🇵🇰🇷🇨🇳 · RTL Support · BCP-47 Compliance
📋 Document Owner: CEO | 📄 Version: 1.0 | 📅 Last Updated: 2026-02-10 (UTC)
🏢 Owner: Hack23 AB (Org.nr 559534-7807) | 🏷️ Classification: 🟢 Public
📂 Repository: Hack23/riksdagsmonitor
This guide provides comprehensive translation standards and terminology for the Riksdagsmonitor platform across all 14 supported languages. It ensures consistency, accuracy, and cultural appropriateness in all language variants.
News articles are not localised by the workflow that generates them. The per-type news workflows (news-propositions, news-motions, news-committee-reports, news-interpellations, news-evening-analysis, news-realtime-monitor, news-week-ahead, news-month-ahead, news-weekly-review, news-monthly-review) each run the two-step aggregate-then-render pipeline (scripts/aggregate-analysis.ts → analysis/daily/$DATE/$SUB/article.md → scripts/render-articles.ts + scripts/render-lib/) to emit rendered HTML files for all 14 languages per article:
news/$DATE-$SUB-en.html (English master)news/$DATE-$SUB-sv.html (Swedish)news/$DATE-$SUB-da.html, news/$DATE-$SUB-no.html, …, news/$DATE-$SUB-zh.html (remaining 12 languages)All 14 language renderings are produced by the per-type workflows themselves via the localized executive-brief cascade inside the renderer. Per-type workflows write only the canonical English article.md (aggregated from all 23 analysis artifacts). The renderer then composes the English article.md body with executive-brief_<lang>.md (when present) via the cascade chain in scripts/render-lib/article-merge.ts (mergeLocalizedWithEnglish) + scripts/render-lib/aggregator/seo/localized-brief.ts to produce each non-English HTML file. The English body remains in English prose — only the executive-brief hero section + SEO metadata is localized.
Per-type workflows do NOT write article.<lang>.md — these files are now forbidden by scripts/validate-file-ownership.ts (category-independent reject). The ownership validator is invoked with --files-from and inspects only the paths it receives; an untouched historical article.<lang>.md already on disk is not flagged simply because a PR modifies another file in the same folder. The validator rejects an article.<lang>.md path only when that specific file is part of the changed-file input (i.e. a PR creates, modifies, deletes, or otherwise lists it).
The standalone news-translate workflow does not touch news/*.html at all; its sole mission is executive-brief Markdown translation — see §"Executive Brief Markdown Translations" below.
In parallel with the rendered HTML, each per-type workflow also writes a Markdown executive brief (the 60-second BLUF artifact, ≈ 400–600 words) at analysis/daily/$DATE/$SUB/executive-brief.md (English only). Localised siblings executive-brief_<lang>.md for all 13 non-English target languages are produced exclusively by news-translate, which runs three times daily (09:00 / 14:00 / 19:00 UTC) and:
analysis/daily/**/executive-brief.md for sources that are missing translations or whose <!-- source-sha: ... --> trailer no longer matches the current git log -1 --format=%H of the source.max_briefs source files per run (default 3, range 1–7), prioritising the oldest article date first.scripts/validate-executive-brief-translations.ts (structural parity, dok_id preservation, RTL markers, no English BLUF leakage, source-SHA trailer).No other workflow — and no other contributor process — writes localised executive briefs or localised article HTML. This decoupling means:
news-translate run.news-translate regression only affects non-EN files.index_*.html pages and political-intelligence_*.html pages remain hand-translated (that workflow is not in scope here).When translating HTML that has already been rendered, do not modify <pre class="mermaid"> blocks — the Mermaid diagram source is a syntactic DSL that must survive untouched. Translate the adjacent <figcaption> and <details> fallback blocks instead. The same rule applies to fenced ```mermaid blocks in executive-brief Markdown.
| Language | Code | File | Direction | Status |
|---|---|---|---|---|
| 🇬🇧 English | en | index.html | LTR | ✅ Master |
| 🇸🇪 Swedish | sv | index_sv.html | LTR | ✅ Complete |
| 🇩🇰 Danish | da | index_da.html | LTR | ✅ Complete |
| 🇳🇴 Norwegian | no | index_no.html | LTR | ✅ Complete |
| 🇫🇮 Finnish | fi | index_fi.html | LTR | ✅ Complete |
| 🇩🇪 German | de | index_de.html | LTR | ✅ Complete |
| 🇫🇷 French | fr | index_fr.html | LTR | ✅ Complete |
| 🇪🇸 Spanish | es | index_es.html | LTR | ✅ Complete |
| 🇳🇱 Dutch | nl | index_nl.html | LTR | ✅ Complete |
| 🇸🇦 Arabic | ar | index_ar.html | RTL | ✅ Complete |
| 🇮🇱 Hebrew | he | index_he.html | RTL | ✅ Complete |
| 🇯🇵 Japanese | ja | index_ja.html | LTR | ✅ Complete |
| 🇰🇷 Korean | ko | index_ko.html | LTR | ✅ Complete |
| 🇨🇳 Chinese | zh | index_zh.html | LTR | ✅ Complete |
Scope. Authoritative rules for translating
analysis/daily/$ARTICLE_DATE/$SUBFOLDER/executive-brief.md(the 60-second BLUF artifact produced by every per-type news workflow) into the 13 non-English target languages. Thenews-translateworkflow is the sole writer of these translations; no other workflow or contributor process may emitexecutive-brief_<lang>.md.
| Role | Path | Owner | Language |
|---|---|---|---|
| Canonical source | analysis/daily/$DATE/$SUB/executive-brief.md | Per-type news workflow (news-propositions, news-motions, …) | English (en) — no suffix |
| Translation sibling | analysis/daily/$DATE/$SUB/executive-brief_sv.md | news-translate | Swedish |
| Translation sibling | analysis/daily/$DATE/$SUB/executive-brief_<lang>.md | news-translate | One per language in {sv, da, no, fi, de, fr, es, nl, ar, he, ja, ko, zh} |
Together with the English source these 14 files cover the full 14-language set. No executive-brief_en.md file is ever created — executive-brief.md IS the English version. This is the only deviation from the index_<lang>.html naming pattern in the rest of the platform.
Every translation MUST end with a single-line HTML comment that records the source commit at translation time:
<!-- source-sha: <40-hex-sha> -->
The trailer is computed at translation time via git log -1 --format=%H -- analysis/daily/$DATE/$SUB/executive-brief.md. The news-translate workflow compares this trailer against the current source SHA on every run: matching ⇒ skip that language; mismatching ⇒ re-translate. Filesystem mtimes are never used as a freshness signal — actions/checkout resets them on every CI runner.
| Block | Why |
|---|---|
| YAML / HTML front-matter blocks | Renderer reads them as structured data — translation breaks parsing. |
dok_id codes (e.g. H901FiU1, HA02UU3, H8011AU10) | Identifiers in the Riksdag API; translating breaks evidence links. |
MP intressent_id numeric codes | Stable Riksdag identifiers. |
Vote IDs and Schema.org JSON-LD @id URIs | Machine-readable references. |
Image / badge / icon URLs (https://img.shields.io/..., https://hack23.com/icon-192.png) | Asset references. |
Mermaid diagram DSL bodies (everything between ```mermaid and ```) | Domain-specific syntax — translation will break rendering. Including %%{init: ...}%% prologues and style … / classDef … directives. |
Code-fence content for any language (```ts, ```bash, ```json, …) | Code is not prose. |
Inline `code` spans | Identifiers / commands. |
Markdown link targets (](url) and [ref]: url) | URLs only — link text IS translated. |
File paths (analysis/daily/..., scripts/..., .github/workflows/...) | Repository structure. |
Citation column values in evidence-anchor tables: dok_id, retrieved_at timestamps, confidence levels (HIGH / MEDIUM / LOW) | Tradecraft canonical labels — these stay English even in non-English files. |
Numeric values, percentages, dates in ISO 8601 (2026-05-16), commit SHAs | Data, not prose. |
HTML comments starting <!-- source-sha:, <!-- TEMPLATE_CONTRACT_, <!-- dir: rtl --> | Tooling markers. |
| Block | Notes |
|---|---|
| All running prose paragraphs | Editor-grade tone, see §"Tone register" below. |
Headings (#, ##, ###, …) | Including the BLUF heading and section headings. |
| Markdown list items (bulleted and numbered) | The 8-bullet 60-second read MUST stay as 8 bullets. |
| Table cell text (not codes, IDs, URLs, or canonical confidence labels) | Column headers ARE translated. |
Markdown link text (the [text] half) | Target URL stays. |
Image alt attributes | Accessibility-critical. |
Badge label segments where they encode text — e.g. Owner-CEO → translate "Owner" only if the badge URL is regenerated; otherwise leave the whole badge intact (cosmetic). | Default: leave badges intact. |
Mermaid figcaption and <details> fallback prose outside the fenced block | Translate; the DSL inside the fence stays English. |
<!-- Template instructions --> / <!-- AI-FIRST --> HTML comment prose only if the comment is content-bearing rather than a tooling marker. Default: keep tooling comments verbatim. |
The validator (scripts/validate-executive-brief-translations.ts) requires translated files to match the source on:
| Check | Tolerance |
|---|---|
| Total heading count | exact (±0) |
| Mermaid fence count | exact (±0) |
| Code-fence count (all languages) | exact (±0) |
| Table count and row counts | exact (±0) |
| Evidence-anchor table column headers present in expected order | exact |
dok_id references preserved (set equality) | exact |
| Image / external-URL set preserved | exact |
| Top-level word count | source ±25 % (translations expand or contract by language; outside ±25 % flags drift) |
Trailing <!-- source-sha: ... --> marker present and well-formed | required |
The executive brief is decision-grade BLUF for editors and duty officers — confident, factual, no hedging beyond the explicit confidence labels. Apply the dictionary translations from §"Political & Parliamentary Terms", §"OSINT & Intelligence Terms", §"Swedish Parliamentary Document Types" and §"Riksdag Committee Abbreviations" verbatim. Where a Swedish parliamentary term has no single-word target-language equivalent, prefer the dictionary entry over a literal translation.
| Language | Register | Notes |
|---|---|---|
sv | Editorial Swedish (Standard Standardsvenska) | Match Riksdag press-release voice. Always render party abbreviations in Swedish (S, M, SD, V, MP, C, L, KD). |
da | Editorial Danish (Rigsmål) | Translate Swedish-specific institutions; keep Riksdagen capitalised. |
no | Editorial bokmål | Use existing no code (legacy convention — see scripts/validate-file-ownership.ts). |
fi | Standard Finnish (yleiskieli) | Compound nouns favoured; Swedish loanwords for political institutions are acceptable when no Finnish equivalent exists. |
de | Editorial German (Standarddeutsch) | Use der Riksdag, not "schwedisches Parlament". |
fr | Editorial French (français standard) | "Le Riksdag" with definite article. |
es | Editorial Spanish (Castilian register) | "El Riksdag", masculine. |
nl | Editorial Dutch (Standaardnederlands) | "De Riksdag", common gender. |
ar | Modern Standard Arabic (MSA, الفصحى) | RTL — see §"RTL Languages". Numbers stay Western Arabic numerals to match the source. |
he | Modern Hebrew (עברית תקנית) | RTL — see §"RTL Languages". Use definite article ה consistently. |
ja | Editorial Japanese (常体 / です・ます choice: prefer です・ます for editor copy) | Foreign names in katakana on first use, then English in parentheses where helpful. |
ko | Editorial Korean (표준어, formal 합니다체) | Hangul; transliterate Swedish names on first use. |
zh | Simplified Chinese (简体中文) | Mainland editorial register; foreign names in Chinese transliteration on first use. |
<!-- dir: rtl --> as the first non-frontmatter line of every executive-brief_ar.md and executive-brief_he.md so downstream renderers and aggregators can detect direction without parsing the language code.، ARABIC COMMA U+060C, ؟ ARABIC QUESTION MARK U+061F, Hebrew ׃ SOF PASUQ U+05C3 sparingly).<div dir="ltr"> block in the surrounding HTML; the Markdown source itself does not need a wrapper.| Workflow | Reads | Writes | Frequency |
|---|---|---|---|
Per-type news (news-propositions, news-motions, …) | — | executive-brief.md (EN) only | Per type, daily |
news-translate | executive-brief.md | executive-brief_<lang>.md for the 13 target languages | 3× daily (09:00, 14:00, 19:00 UTC, 7 days/week) |
The translation workflow picks up at most max_briefs (default 3, range 1–7) untranslated or drifted source files per run, translates them into every requested target language (default = all 13 non-EN languages), and validates each translation with scripts/validate-executive-brief-translations.ts before committing. See .github/workflows/news-translate.md for the operational contract and time budget.
analysis/daily/$DATE/$SUB/executive-brief_<lang>.md.dok_id, intressent ID, vote ID, and external URL from the source appears in the translation.ar / he files start with <!-- dir: rtl -->.<!-- source-sha: <40-hex> --> matching the source's git log -1 --format=%H.scripts/validate-executive-brief-translations.ts exits 0 for this file.| Term | Reason |
|---|---|
| Hack23 | Company name |
| Hack23 AB | Swedish legal entity (Org.nr 5595347807) |
| Citizen Intelligence Agency (CIA) | Platform/project name |
| Riksdag | Swedish Parliament (proper noun) |
| Riksdagsmonitor | Product name |
| James Pether Sörling | Founder name |
| CISSP, CISM | Professional certifications |
| GitHub, LinkedIn | Platform names |
| OpenSSF | Open Source Security Foundation |
The CIA Triad is fundamental to information security. Use consistent translations:
| English | Swedish | Arabic | Hebrew | German | French | Spanish |
|---|---|---|---|---|---|---|
| CIA Triad | CIA-triaden | ثلاثية CIA | שלישיית CIA | CIA-Triade | Triade CIA | Tríada CIA |
| Confidentiality | Konfidentialitet | السرية | סודיות | Vertraulichkeit | Confidentialité | Confidencialidad |
| Integrity | Integritet | السلامة | שלמות | Integrität | Intégrité | Integridad |
| Availability | Tillgänglighet | التوافر | זמינות | Verfügbarkeit | Disponibilité | Disponibilidad |
| English | Danish | Norwegian | Finnish | Dutch | Japanese | Korean | Chinese |
|---|---|---|---|---|---|---|---|
| CIA Triad | CIA-triaden | CIA-triaden | CIA-triadi | CIA-triade | CIA トライアド | CIA 3요소 | CIA 三要素 |
| Confidentiality | Fortrolighed | Konfidensialitet | Luottamuksellisuus | Vertrouwelijkheid | 機密性 | 기밀성 | 机密性 |
| Integrity | Integritet | Integritet | Eheys | Integriteit | 完全性 | 무결성 | 完整性 |
| Availability | Tilgængelighed | Tilgjengelighet | Saatavuus | Beschikbaarheid | 可用性 | 가용성 | 可用性 |
| English | Swedish | Danish | Norwegian | Finnish | German |
|---|---|---|---|---|---|
| Parliament | Riksdag | Folketing | Storting | Eduskunta | Parlament |
| Member of Parliament (MP) | Riksdagsledamot | Folketingsmedlem | Stortingsrepresentant | Kansanedustaja | Parlamentsmitglied |
| Committee | Utskott | Udvalg | Komité | Valiokunta | Ausschuss |
| Coalition | Koalition | Koalition | Koalisjon | Koalitio | Koalition |
| Opposition | Opposition | Opposition | Opposisjon | Oppositio | Opposition |
| Election | Val | Valg | Valg | Vaalit | Wahl |
| Voting | Röstning | Afstemning | Avstemning | Äänestys | Abstimmung |
| English | French | Spanish | Dutch | Arabic | Hebrew |
|---|---|---|---|---|---|
| Parliament | Parlement | Parlamento | Parlement | البرلمان | פרלמנט |
| Member of Parliament (MP) | Député | Diputado | Parlementslid | عضو البرلمان | חבר פרלמנט |
| Committee | Commission | Comité | Commissie | لجنة | ועדה |
| Coalition | Coalition | Coalición | Coalitie | تحالف | קואליציה |
| Opposition | Opposition | Oposición | Oppositie | المعارضة | אופוזיציה |
| Election | Élection | Elección | Verkiezing | انتخابات | בחירות |
| Voting | Vote | Votación | Stemming | تصويت | הצבעה |
| English | Japanese | Korean | Chinese |
|---|---|---|---|
| Parliament | 議会 | 의회 | 议会 |
| Member of Parliament (MP) | 国会議員 | 국회의원 | 议员 |
| Committee | 委員会 | 위원회 | 委员会 |
| Coalition | 連立 | 연립 | 联盟 |
| Opposition | 野党 | 야당 | 反对党 |
| Election | 選挙 | 선거 | 选举 |
| Voting | 投票 | 투표 | 投票 |
| English | Swedish | German | French | Spanish | Arabic |
|---|---|---|---|---|---|
| OSINT | OSINT | OSINT | OSINT | OSINT | استخبارات مفتوحة المصدر |
| Intelligence | Underrättelser | Intelligenz | Renseignement | Inteligencia | استخبارات |
| Monitoring | Övervakning | Überwachung | Surveillance | Monitoreo | مراقبة |
| Analysis | Analys | Analyse | Analyse | Análisis | تحليل |
| Risk Assessment | Riskbedömning | Risikobewertung | Évaluation des risques | Evaluación de riesgos | تقييم المخاطر |
| Transparency | Transparens | Transparenz | Transparence | Transparencia | شفافية |
| English | Swedish | German | French | Spanish |
|---|---|---|---|---|
| Security | Säkerhet | Sicherheit | Sécurité | Seguridad |
| Compliance | Efterlevnad | Compliance | Conformité | Cumplimiento |
| ISO 27001 | ISO 27001 | ISO 27001 | ISO 27001 | ISO 27001 |
| NIST CSF | NIST CSF | NIST CSF | NIST CSF | NIST CSF |
| CIS Controls | CIS Controls | CIS Controls | CIS Controls | CIS Controls |
| DevSecOps | DevSecOps | DevSecOps | DevSecOps | DevSecOps |
| ISMS | ISMS | ISMS | SMSI | SGSI |
These terms appear in Riksdag API responses and MUST be translated accurately in news articles. The Swedish term is the doktyp field value. Never leave these untranslated.
| Swedish | English | German | French | Spanish |
|---|---|---|---|---|
| Betänkande (bet) | Committee report | Ausschussbericht | Rapport de commission | Informe de comité |
| Proposition (prop) | Government bill | Regierungsvorlage | Projet de loi du gouvernement | Proyecto de ley gubernamental |
| Motion (mot) | Parliamentary motion | Parlamentarischer Antrag | Motion parlementaire | Moción parlamentaria |
| Interpellation (ip) | Interpellation | Interpellation | Interpellation | Interpelación |
| Skriftlig fråga (fr) | Written question | Schriftliche Anfrage | Question écrite | Pregunta escrita |
| Votering | Division/Vote | Abstimmung | Vote/Scrutin | Votación |
| Anförande | Parliamentary speech | Parlamentsrede | Discours parlementaire | Discurso parlamentario |
| Riksdagsskrivelse (rskr) | Parliamentary communication | Reichstagsschreiben | Communication parlementaire | Comunicación parlamentaria |
| Swedish | Danish | Norwegian | Finnish | Dutch |
|---|---|---|---|---|
| Betänkande | Udvalgsbetænkning | Komitéinnstilling | Valiokunnan mietintö | Commissieverslag |
| Proposition | Regeringsforslag | Regjeringsforslag | Hallituksen esitys | Wetsvoorstel |
| Motion | Beslutningsforslag | Representantforslag | Lakialoite | Parlementaire motie |
| Interpellation | Forespørgsel | Interpellasjon | Välikysymys | Interpellatie |
| Skriftlig fråga | Skriftligt spørgsmål | Skriftlig spørsmål | Kirjallinen kysymys | Schriftelijke vraag |
| Votering | Afstemning | Votering | Äänestys | Stemming |
| Anförande | Tale | Innlegg | Puheenvuoro | Toespraak |
| Swedish | Arabic | Hebrew | Japanese | Korean | Chinese |
|---|---|---|---|---|---|
| Betänkande | تقرير اللجنة | דוח ועדה | 委員会報告 | 위원회 보고서 | 委员会报告 |
| Proposition | مشروع قانون حكومي | הצעת חוק ממשלתית | 政府法案 | 정부 법안 | 政府法案 |
| Motion | اقتراح برلماني | הצעה פרלמנטרית | 議会動議 | 의회 동의 | 议会动议 |
| Interpellation | استجواب | אינטרפלציה | 質問主意書 | 대정부질문 | 质询 |
| Skriftlig fråga | سؤال مكتوب | שאילתה | 書面質問 | 서면질의 | 书面质询 |
| Votering | تصويت | הצבעה | 採決 | 표결 | 表决 |
| Anförande | خطاب برلماني | נאום פרלמנטרי | 国会演説 | 의회 연설 | 议会发言 |
Committee abbreviations (e.g., FiU, SoU) appear in document references like "Bet. 2025/26:FiU10". Keep abbreviations as-is in document references, but translate committee names in running text.
| Abbreviation | Swedish Name | English |
|---|---|---|
| FiU | Finansutskottet | Finance Committee |
| SoU | Socialutskottet | Social Affairs Committee |
| JuU | Justitieutskottet | Justice Committee |
| CU | Civilutskottet | Civil Affairs Committee |
| UU | Utrikesutskottet | Foreign Affairs Committee |
| FöU | Försvarsutskottet | Defence Committee |
| KU | Konstitutionsutskottet | Constitutional Committee |
| KrU | Kulturutskottet | Cultural Affairs Committee |
| MJU | Miljö- och jordbruksutskottet | Environment and Agriculture Committee |
| NU | Näringsutskottet | Industry Committee |
| SkU | Skatteutskottet | Tax Committee |
| SfU | Socialförsäkringsutskottet | Social Insurance Committee |
| TU | Trafikutskottet | Transport Committee |
| UbU | Utbildningsutskottet | Education Committee |
| AU | Arbetsmarknadsutskottet | Labour Market Committee |
| Swedish | English | Notes |
|---|---|---|
| Statlig personal | Government personnel | Civil servants |
| Bostadsrätt | Tenant-ownership / Housing cooperative | Swedish housing form |
| Föräldrapenning | Parental allowance | Social insurance benefit |
| Djurskydd | Animal welfare/protection | Regulatory area |
| Fribeloppet | Earning threshold | Tax-free amount for students/pensioners |
| Tidöavtalet | The Tidö Agreement | 2022 governing agreement (M, KD, L, SD) |
| Riksrevisionen | Swedish National Audit Office | Keep "Riksrevisionen" in parentheses |
| Riksbanken | Sveriges Riksbank | Sweden's central bank |
| Statsråd | Cabinet minister | Member of the government |
| Regeringskansliet | Government Offices of Sweden | Administrative apparatus |
| Region | Format | Example |
|---|---|---|
| US (English) | MM/DD/YYYY | 02/05/2026 |
| EU (Most) | DD/MM/YYYY | 05/02/2026 |
| Sweden | YYYY-MM-DD | 2026-02-05 |
| ISO 8601 | YYYY-MM-DD | 2026-02-05 (preferred) |
| Arabic | DD/MM/YYYY or ٥ فبراير ٢٠٢٦ | Both Western & Arabic-Indic |
| Japanese | YYYY年MM月DD日 | 2026年2月5日 |
| Chinese | YYYY年MM月DD日 | 2026年2月5日 |
| Korean | YYYY년 MM월 DD일 | 2026년 2월 5일 |
| Region | Thousands | Decimal | Example |
|---|---|---|---|
| US/UK | , (comma) | . (period) | 1,000.50 |
| EU (Most) | . (period) or space | , (comma) | 1.000,50 or 1 000,50 |
| Sweden | (space) | , (comma) | 1 000,50 |
| Arabic | Western or ١٬٠٠٠٫٥٠ | Both formats |
| Language | Currency Symbol | Position | Example |
|---|---|---|---|
| Swedish | kr (SEK) | After amount | 5 000 kr |
| European | € (EUR) | After amount | 5 000 € |
| US | $ (USD) | Before amount | $5,000 |
| Arabic | ر.س (SAR) | After amount | ٥٬٠٠٠ ر.س |
HTML Declaration:
<html lang="ar" dir="rtl">
<!-- or -->
<html lang="he" dir="rtl">
CSS Handling: The styles.css file includes comprehensive RTL support:
Font Families:
Special Considerations:
lang attribute correct on <html> tagdir="rtl" present for Arabic/HebrewinLanguage property setEach language file must include hreflang tags for all 14 languages plus x-default:
<link rel="alternate" hreflang="en" href="https://riksdagsmonitor.com/index.html">
<link rel="alternate" hreflang="sv" href="https://riksdagsmonitor.com/index_sv.html">
<link rel="alternate" hreflang="da" href="https://riksdagsmonitor.com/index_da.html">
<link rel="alternate" hreflang="no" href="https://riksdagsmonitor.com/index_no.html">
<link rel="alternate" hreflang="fi" href="https://riksdagsmonitor.com/index_fi.html">
<link rel="alternate" hreflang="de" href="https://riksdagsmonitor.com/index_de.html">
<link rel="alternate" hreflang="fr" href="https://riksdagsmonitor.com/index_fr.html">
<link rel="alternate" hreflang="es" href="https://riksdagsmonitor.com/index_es.html">
<link rel="alternate" hreflang="nl" href="https://riksdagsmonitor.com/index_nl.html">
<link rel="alternate" hreflang="ar" href="https://riksdagsmonitor.com/index_ar.html">
<link rel="alternate" hreflang="he" href="https://riksdagsmonitor.com/index_he.html">
<link rel="alternate" hreflang="ja" href="https://riksdagsmonitor.com/index_ja.html">
<link rel="alternate" hreflang="ko" href="https://riksdagsmonitor.com/index_ko.html">
<link rel="alternate" hreflang="zh" href="https://riksdagsmonitor.com/index_zh.html">
<link rel="alternate" hreflang="x-default" href="https://riksdagsmonitor.com/index.html">
Run these commands before committing translations:
# HTML validation
htmlhint *.html
# Main site translations (index files)
npm run validate-translations
# News article translations
npm run validate-news
# Run all validation checks together
npm run validate-all
# Check language attributes
for file in index*.html; do
echo "=== $file ==="
grep 'lang=' "$file" | head -1
done
# Check RTL attributes
grep 'dir="rtl"' index_ar.html index_he.html
# Link checking
python3 -m http.server 8080 &
linkinator http://localhost:8080/ --recurse
News articles are generated by agentic workflows with Swedish content from the Riksdag API. These workflows must translate all Swedish content to the target language.
Check for untranslated markers:
# Validate all news articles
npm run validate-news
# Check specific articles
node scripts/validate-news-translations.js news/
# Look for untranslated markers manually
grep -r 'data-translate="true"' news/*.html
Expected output if validation passes:
✓ Fully translated: N (number of articles)
✅ ALL ARTICLES FULLY TRANSLATED
If validation fails, you'll see:
✗ 2026-02-15-committee-reports-de.html (DE)
Found 10 untranslated marker(s)
Samples:
1. "Bättre förutsättningar att sända ut statlig personal"
2. "Ett register för alla bostadsrätter"
To fix untranslated markers:
<span data-translate="true" lang="sv">Swedish text</span><span data-translate="true" lang="sv">Swedish text</span> → Translated textnpm run validate-news again to verifyThis section contains real-world political terminology extracted from translated news articles, providing proven translations for political intelligence and parliamentary reporting.
Standard labels used across all news article types:
| English | Swedish | German | French | Spanish | Dutch | Danish | Norwegian | Finnish |
|---|---|---|---|---|---|---|---|---|
| Committee | Kommitté | Ausschuss | Commission | Comisión | Commissie | Udvalg | Komité | Valiokunta |
| Document | Dokument | Dokument | Document | Documento | Document | Dokument | Dokument | Asiakirja |
| What to Watch | Vad man ska följa | Was zu beobachten | À surveiller | Qué observar | Te volgen | Hvad man skal følge | Hva man skal følge | Mitä seurata |
| This Week | Denna vecka | Diese Woche | Cette semaine | Esta semana | Deze week | Denne uge | Denne uken | Tällä viikolla |
| Next Week | Nästa vecka | Nächste Woche | La semaine prochaine | La próxima semana | Volgende week | Næste uge | Neste uke | Ensi viikolla |
| Analysis | Analys | Analyse | Analyse | Análisis | Analyse | Analyse | Analyse | Analyysi |
| Evening Analysis | Kvällsanalys | Abendanalyse | Analyse du soir | Análisis vespertino | Avondanalyse | Aftenanalyse | Kveldsanalyse | Ilta-analyysi |
Common phrases from committee reports:
| English | Swedish | German | French |
|---|---|---|---|
| Better conditions for deploying government personnel | Bättre förutsättningar att sända ut statlig personal | Bessere Voraussetzungen für die Entsendung staatlichen Personals | Meilleures conditions pour le déploiement du personnel gouvernemental |
| A register for all condominiums | Ett register för alla bostadsrätter | Ein Register für alle Eigentumswohnungen | Un registre pour toutes les copropriétés |
| Animal welfare | Djurskydd | Tierschutz | Protection des animaux |
| Trade policy | Handelspolitik | Handelspolitik | Politique commerciale |
| Planning and construction | Planering och byggande | Planung und Bauwesen | Planification et construction |
Key political process vocabulary from analysis articles:
| Concept | English | Swedish | German | French | Spanish |
|---|---|---|---|---|---|
| Coalition | Coalition | Koalition | Koalition | Coalition | Coalición |
| Legislative analysis | Legislative analysis | Lagstiftningsanalys | Gesetzgebungsanalyse | Analyse législative | Análisis legislativo |
| Political risk | Political risk | Politisk risk | Politisches Risiko | Risque politique | Riesgo político |
| Government record | Government record | Regeringsprotokoll | Regierungsbilanz | Bilan gouvernemental | Registro del gobierno |
| Parliamentary priorities | Parliamentary priorities | Parlamentariska prioriteringar | Parlamentarische Prioritäten | Priorités parlementaires | Prioridades parlamentarias |
| Mid-session assessment | Mid-session assessment | Halvtidsbedömning | Halbzeitbewertung | Évaluation à mi-session | Evaluación a mitad de período |
For Chinese, Japanese, Korean, Arabic, and Hebrew:
Standard article type names across languages:
| Type | English | Swedish | German | French | Spanish |
|---|---|---|---|---|---|
| Committee Reports | Committee Reports | Utskottsbetänkanden | Ausschussberichte | Rapports de commission | Informes de comisión |
| Propositions | Government Propositions | Propositioner | Regierungsvorlagen | Propositions gouvernementales | Proposiciones gubernamentales |
| Motions | Opposition Motions | Motioner | Anträge | Motions | Mociones |
| Evening Analysis | Evening Analysis | Kvällsanalys | Abendanalyse | Analyse du soir | Análisis vespertino |
| Week Ahead | Week Ahead | Veckan som kommer | Kommende Woche | La semaine à venir | La semana próxima |
Time-related vocabulary from news articles:
| English | Swedish | German | French | Spanish | Dutch |
|---|---|---|---|---|---|
| Today | Idag | Heute | Aujourd'hui | Hoy | Vandaag |
| Tomorrow | Imorgon | Morgen | Demain | Mañana | Morgen |
| This week | Denna vecka | Diese Woche | Cette semaine | Esta semana | Deze week |
| Next week | Nästa vecka | Nächste Woche | La semaine prochaine | La próxima semana | Volgende week |
| Last week | Förra veckan | Letzte Woche | La semaine dernière | La semana pasada | Vorige week |
| Spring recess | Våruppehåll | Frühjahrspause | Pause de printemps | Receso de primavera | Voorjaarsreces |
| Mid-session | Halvtid | Halbzeit | Mi-session | Mitad de período | Halverweg |
| Parliamentary week | Parlamentsvecka | Parlamentswoche | Semaine parlementaire | Semana parlamentaria | Parlementaire week |
Formal vs. Informal Register:
Cultural Sensitivities:
Number Formatting:
Date Formatting:
Riksdagsmonitor follows Hack23's comprehensive translation standards:
Setup
git clone git@github.com:Hack23/riksdagsmonitor.git
cd riksdagsmonitor
git checkout -b translation/[language-code]
Edit Language File
index.html (English master)<html lang="xx"> attributedir="rtl" for Arabic/HebrewValidate
htmlhint index_[language-code].html
Test Locally
python3 -m http.server 8080
# Open http://localhost:8080/index_[language-code].html
Submit Pull Request
| Language | Translation | Hreflang | RTL Support | Font Loading | Status |
|---|---|---|---|---|---|
| English (en) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Swedish (sv) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Danish (da) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Norwegian (no) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Finnish (fi) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| German (de) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| French (fr) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Spanish (es) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Dutch (nl) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Arabic (ar) | 100% | ✅ | ✅ | ✅ | ✅ Complete |
| Hebrew (he) | 100% | ✅ | ✅ | ✅ | ✅ Complete |
| Japanese (ja) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Korean (ko) | 100% | ✅ | N/A | ✅ | ✅ Complete |
| Chinese (zh) | 100% | ✅ | N/A | ✅ | ✅ Complete |
Overall Status: ✅ 100% Complete (14/14 languages)
This translation guide aligns with Hack23's Information Security Management System:
Questions about translations?
Document Control
Version: 1.0
Last Updated: 2026-02-05
Next Review: 2026-05-05 (Quarterly)
Owner: Hack23 AB
Classification: Public
Riksdagsmonitor - Swedish Parliament Intelligence Platform
Copyright © 2008-2026 Hack23 AB (Org.nr 5595347807)
Licensed under Apache License 2.0
| 🌐 Platforms | 📦 Open-Source Projects | 🛡️ Governance & Standards |
|---|---|---|
| 🗳️ Riksdagsmonitor — Swedish Parliament intelligence 🇪🇺 EU Parliament Monitor — European coverage 🕵️ Citizen Intelligence Agency — political-data engine 🌐 Hack23 AB — corporate site 📰 Hack23 Blog — engineering & policy 💼 Hack23 on LinkedIn | 🗳️ Hack23/riksdagsmonitor 🕵️ Hack23/cia 🇪🇺 Hack23/euparliamentmonitor 🔌 Hack23/european-parliament-mcp ✅ Hack23/cia-compliance-manager 🥋 Hack23/black-trigram 🏠 Hack23/homepage | 🛡️ Hack23 ISMS-PUBLIC — public ISMS 🔒 Information Security Policy 🤖 AI Policy 🧪 Secure Development Policy 🎯 Threat Modeling Policy ⚠️ Vulnerability Management 🏷️ Classification Framework |
🗳️ Empower citizens · 🔍 Strengthen democratic accountability · 🕵️ Illuminate the political process
© 2008–2026 Hack23 AB (Org.nr 559534-7807) · Maintainer: James Pether Sörling, CISSP CISM