Skip to content

Latest commit

 

History

History
907 lines (710 loc) · 48.4 KB

File metadata and controls

907 lines (710 loc) · 48.4 KB

Hack23 Logo

🌐 Riksdagsmonitor — Translation Guide

🗣️ Consistent Multilingual Political Intelligence Across 14 Languages
🇸🇪🇬🇧🇩🇰🇳🇴🇫🇮🇩🇪🇫🇷🇪🇸🇳🇱🇸🇦🇮🇱🇯🇵🇰🇷🇨🇳 · RTL Support · BCP-47 Compliance

Owner Version 14 Languages Effective Date

📋 Document Owner: CEO | 📄 Version: 1.0 | 📅 Last Updated: 2026-02-10 (UTC)
🏢 Owner: Hack23 AB (Org.nr 559534-7807) | 🏷️ Classification: 🟢 Public
📂 Repository: Hack23/riksdagsmonitor


📋 Overview

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 translated out-of-band

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.tsanalysis/daily/$DATE/$SUB/article.mdscripts/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:

  1. Scans 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.
  2. Picks up at most max_briefs source files per run (default 3, range 1–7), prioritising the oldest article date first.
  3. Translates each source into every requested target language using the terminology tables in this guide.
  4. Validates every translation with scripts/validate-executive-brief-translations.ts (structural parity, dok_id preservation, RTL markers, no English BLUF leakage, source-SHA trailer).
  5. Commits the batch and opens one PR per run.

No other workflow — and no other contributor process — writes localised executive briefs or localised article HTML. This decoupling means:

  • Editorial changes to a source executive brief ripple through all 14 languages in the next news-translate run.
  • Terminology drift is detectable: a single news-translate regression only affects non-EN files.
  • The 14 top-level 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.

Supported Languages (14)

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

📝 Executive Brief Markdown Translations

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. The news-translate workflow is the sole writer of these translations; no other workflow or contributor process may emit executive-brief_<lang>.md.

File naming contract

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.

Source-revision signal (drift detection)

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.

Verbatim preservation (NEVER translate, NEVER reword)

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.

Always translate

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.

Structural parity (validator-enforced)

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

Tone register per language

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.

RTL-specific rules (Arabic & Hebrew)

  • Insert <!-- 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.
  • Punctuation marks must use RTL Unicode forms where appropriate (، ARABIC COMMA U+060C, ؟ ARABIC QUESTION MARK U+061F, Hebrew ׃ SOF PASUQ U+05C3 sparingly).
  • Mermaid diagrams stay LTR — wrap the rendered figure in an <div dir="ltr"> block in the surrounding HTML; the Markdown source itself does not need a wrapper.

Workflow integration

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.

Acceptance checklist (per translated file)

  • Filename matches analysis/daily/$DATE/$SUB/executive-brief_<lang>.md.
  • Heading, fence, table, and Mermaid counts match the source exactly.
  • Every dok_id, intressent ID, vote ID, and external URL from the source appears in the translation.
  • No verbatim English BLUF / section labels ("Executive Brief", "BLUF", "Decisions", "Confidence", "Key Takeaways", "What Happened", "What It Means") remain in non-English files (validator scans a banned-phrase list).
  • ar / he files start with <!-- dir: rtl -->.
  • File ends with <!-- source-sha: <40-hex> --> matching the source's git log -1 --format=%H.
  • scripts/validate-executive-brief-translations.ts exits 0 for this file.

🎯 Translation Principles

1. Never Translate (Brand Names & Proper Nouns)

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

2. Terminology Categories

A. CIA Triad (Core Security Concepts)

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 可用性 가용성 可用性

B. Political & Parliamentary Terms

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 投票 투표 投票

C. OSINT & Intelligence Terms

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 شفافية

D. Technical & Security Terms

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

E. Swedish Parliamentary Document Types (Riksdag API)

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 خطاب برلماني נאום פרלמנטרי 国会演説 의회 연설 议会发言

F. Riksdag Committee Abbreviations

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

G. Common Policy Terms from Riksdag API

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

🔄 Cultural Adaptations

Date Formats

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일

Number Formats

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

Currency

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 ٥٬٠٠٠ ر.س

🎨 RTL (Right-to-Left) Languages

Arabic (ar) & Hebrew (he)

HTML Declaration:

<html lang="ar" dir="rtl">
<!-- or -->
<html lang="he" dir="rtl">

CSS Handling: The styles.css file includes comprehensive RTL support:

  • Text alignment: right
  • Flex direction: row-reverse for navigation
  • List padding: right instead of left
  • Form field alignment: right
  • Breadcrumb arrows: reversed (←)

Font Families:

  • Arabic: Noto Sans Arabic, Tahoma, Arial
  • Hebrew: Noto Sans Hebrew, Arial Hebrew, David

Special Considerations:

  • URLs remain LTR (left-to-right)
  • Code blocks remain LTR
  • Email addresses remain LTR
  • Technical terms (e.g., "CIA", "OSINT") remain in Latin script

📏 Quality Standards

Translation Completeness Checklist

  • All HTML meta tags translated (title, description, keywords)
  • All Open Graph tags translated
  • All Twitter Card metadata translated
  • All Schema.org structured data translated
  • All visible page content translated
  • All button/CTA text translated
  • All navigation links translated
  • All footer text translated
  • All breadcrumb labels translated

Technical Requirements

  • lang attribute correct on <html> tag
  • dir="rtl" present for Arabic/Hebrew
  • Proper font families loaded (Google Fonts)
  • Hreflang tags present for all languages
  • Canonical URL correct
  • Schema.org inLanguage property set

Accessibility (WCAG 2.1 AA)

  • Proper heading hierarchy (h1 → h2 → h3)
  • Alt text translated for images
  • ARIA labels translated
  • Form labels translated
  • Keyboard navigation working
  • Screen reader compatible

🔗 SEO & Hreflang Tags

Standard Hreflang Implementation

Each 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">

🔍 Translation Validation

Automated Checks

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

Translation Validation for News Articles

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:

  1. Open the file listed
  2. Find <span data-translate="true" lang="sv">Swedish text</span>
  3. Translate the Swedish text to the article's language
  4. Replace: <span data-translate="true" lang="sv">Swedish text</span>Translated text
  5. Consult Section E below for document type translations
  6. Run npm run validate-news again to verify

Manual Review

  • Native speaker review (preferred)
  • Cultural appropriateness check
  • Technical term consistency
  • Political term accuracy
  • Security terminology correctness

📰 Political Intelligence Vocabulary (From News Articles)

This section contains real-world political terminology extracted from translated news articles, providing proven translations for political intelligence and parliamentary reporting.

F. News Article UI Labels

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

G. Committee Report Terminology

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

H. Political Process Terms

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

I. CJK and RTL Language Vocabulary

For Chinese, Japanese, Korean, Arabic, and Hebrew:

Chinese (简体中文)

  • 委员会 (Committee)
  • 文件 (Document)
  • 本周关注 (What to Watch This Week)
  • 改善国家工作人员外派条件 (Better conditions for deploying government personnel)
  • 所有产权公寓登记制度 (A register for all condominiums)
  • 动物保护 (Animal welfare)

Japanese (日本語)

  • 委員会 (Committee)
  • 文書 (Document)
  • 今週の注目 (What to Watch This Week)
  • 国家公務員の海外派遣条件の改善 (Better conditions for deploying government personnel)
  • 全分譲住宅の登録制度 (A registry for all condominiums)
  • 動物福祉 (Animal welfare)

Korean (한국어)

  • 위원회 (Committee)
  • 문서 (Document)
  • 이번 주 주목사항 (What to Watch This Week)
  • 국가 공무원 파견 조건 개선 (Better conditions for deploying government personnel)
  • 모든 분양주택 등록 제도 (A registry for all condominiums)
  • 동물 복지 (Animal welfare)

Arabic (العربية)

  • لجنة (Committee)
  • وثيقة (Document)
  • ما يجب متابعته هذا الأسبوع (What to Watch This Week)
  • ظروف أفضل لإرسال الموظفين الحكوميين (Better conditions for deploying government personnel)
  • سجل لجميع حقوق الملكية السكنية (A registry for all condominiums)
  • رعاية الحيوان (Animal welfare)

Hebrew (עברית)

  • ועדה (Committee)
  • מסמך (Document)
  • על מה לעקוב השבוע (What to Watch This Week)
  • תנאים טובים יותר לשליחת עובדי מדינה (Better conditions for deploying government personnel)
  • מרשם לכל דירות הבעלות (A registry for all condominiums)
  • רווחת בעלי חיים (Animal welfare)

J. Article Type Classifications

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

K. Temporal Expressions

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

L. Context-Specific Translation Notes

Formal vs. Informal Register:

  • All political news uses formal register across all languages
  • "You" → Swedish "ni" (not "du"), German "Sie" (not "du"), French "vous" (not "tu")
  • Journalistic third-person perspective maintained

Cultural Sensitivities:

  • Political party names: Always use Swedish abbreviations (S, M, SD, V, MP, C, L, KD)
  • Riksdag: Keep in Swedish (don't translate to "Parliament" in running text)
  • Tidö Agreement: Proper noun, always "Tidö-avtalet" or "Tidö Agreement"
  • Committee codes: Keep Swedish (SoU, FiU, CU, etc.) in document references

Number Formatting:

  • English: 1,000.50 (comma thousands, period decimal)
  • Swedish/German/Nordic: 1 000,50 (space thousands, comma decimal)
  • French: 1 000,50 (space thousands, comma decimal)
  • Arabic: ١٬٠٠٠٫٥٠ (Arabic-Indic numerals optional, comma thousands, period decimal)

Date Formatting:

  • English: February 15, 2026
  • Swedish: 15 februari 2026
  • German: 15. Februar 2026
  • French: 15 février 2026
  • Spanish: 15 de febrero de 2026
  • Japanese: 2026年2月15日
  • Chinese: 2026年2月15日
  • Korean: 2026년 2월 15일
  • Arabic: ١٥ فبراير ٢٠٢٦
  • Hebrew: 15 בפברואר 2026

📚 Reference Documents

External Translation Guides

Riksdagsmonitor follows Hack23's comprehensive translation standards:

W3C Standards

Related Documentation


🤝 Contributing Translations

Translation Workflow

  1. Setup

    git clone git@github.com:Hack23/riksdagsmonitor.git
    cd riksdagsmonitor
    git checkout -b translation/[language-code]
  2. Edit Language File

    • Copy structure from index.html (English master)
    • Update <html lang="xx"> attribute
    • Add dir="rtl" for Arabic/Hebrew
    • Translate all content using glossary
    • Maintain HTML structure and classes
  3. Validate

    htmlhint index_[language-code].html
  4. Test Locally

    python3 -m http.server 8080
    # Open http://localhost:8080/index_[language-code].html
  5. Submit Pull Request

    • Descriptive commit message
    • Reference translation guide
    • Include native speaker review (if possible)

Translation Maintenance

  • Review translations quarterly
  • Update when source content changes
  • Monitor user feedback
  • Track translation quality metrics

📊 Translation Status Dashboard

Completeness Metrics

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)


🔐 Security & Compliance

ISMS Alignment

This translation guide aligns with Hack23's Information Security Management System:

  • ISO 27001:2022 - Asset management (language files)
  • NIST CSF 2.0 - Governance (translation standards)
  • CIS Controls v8.1 - Data protection (multi-language support)

Content Security

  • No secrets in translation files
  • Sanitized user input (if forms added)
  • XSS protection in all languages
  • CSP headers consistent across languages

📞 Support

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


🔗 Hack23 Ecosystem

🌐 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

OpenSSF Best Practices OpenSSF Scorecard ISO 27001:2022 NIST CSF 2.0 CIS Controls v8.1 Apache 2.0

🗳️ Empower citizens · 🔍 Strengthen democratic accountability · 🕵️ Illuminate the political process

© 2008–2026 Hack23 AB (Org.nr 559534-7807) · Maintainer: James Pether Sörling, CISSP CISM