TRANSLATION_GUIDE.md

May 16, 2026 · View on GitHub

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)

LanguageCodeFileDirectionStatus
🇬🇧 Englishenindex.htmlLTR✅ Master
🇸🇪 Swedishsvindex_sv.htmlLTR✅ Complete
🇩🇰 Danishdaindex_da.htmlLTR✅ Complete
🇳🇴 Norwegiannoindex_no.htmlLTR✅ Complete
🇫🇮 Finnishfiindex_fi.htmlLTR✅ Complete
🇩🇪 Germandeindex_de.htmlLTR✅ Complete
🇫🇷 Frenchfrindex_fr.htmlLTR✅ Complete
🇪🇸 Spanishesindex_es.htmlLTR✅ Complete
🇳🇱 Dutchnlindex_nl.htmlLTR✅ Complete
🇸🇦 Arabicarindex_ar.htmlRTL✅ Complete
🇮🇱 Hebrewheindex_he.htmlRTL✅ Complete
🇯🇵 Japanesejaindex_ja.htmlLTR✅ Complete
🇰🇷 Koreankoindex_ko.htmlLTR✅ Complete
🇨🇳 Chinesezhindex_zh.htmlLTR✅ 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

RolePathOwnerLanguage
Canonical sourceanalysis/daily/$DATE/$SUB/executive-brief.mdPer-type news workflow (news-propositions, news-motions, …)English (en) — no suffix
Translation siblinganalysis/daily/$DATE/$SUB/executive-brief_sv.mdnews-translateSwedish
Translation siblinganalysis/daily/$DATE/$SUB/executive-brief_<lang>.mdnews-translateOne 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)

BlockWhy
YAML / HTML front-matter blocksRenderer 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 codesStable Riksdag identifiers.
Vote IDs and Schema.org JSON-LD @id URIsMachine-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` spansIdentifiers / 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 SHAsData, not prose.
HTML comments starting <!-- source-sha:, <!-- TEMPLATE_CONTRACT_, <!-- dir: rtl -->Tooling markers.

Always translate

BlockNotes
All running prose paragraphsEditor-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 attributesAccessibility-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 blockTranslate; 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:

CheckTolerance
Total heading countexact (±0)
Mermaid fence countexact (±0)
Code-fence count (all languages)exact (±0)
Table count and row countsexact (±0)
Evidence-anchor table column headers present in expected orderexact
dok_id references preserved (set equality)exact
Image / external-URL set preservedexact
Top-level word countsource ±25 % (translations expand or contract by language; outside ±25 % flags drift)
Trailing <!-- source-sha: ... --> marker present and well-formedrequired

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.

LanguageRegisterNotes
svEditorial Swedish (Standard Standardsvenska)Match Riksdag press-release voice. Always render party abbreviations in Swedish (S, M, SD, V, MP, C, L, KD).
daEditorial Danish (Rigsmål)Translate Swedish-specific institutions; keep Riksdagen capitalised.
noEditorial bokmålUse existing no code (legacy convention — see scripts/validate-file-ownership.ts).
fiStandard Finnish (yleiskieli)Compound nouns favoured; Swedish loanwords for political institutions are acceptable when no Finnish equivalent exists.
deEditorial German (Standarddeutsch)Use der Riksdag, not "schwedisches Parlament".
frEditorial French (français standard)"Le Riksdag" with definite article.
esEditorial Spanish (Castilian register)"El Riksdag", masculine.
nlEditorial Dutch (Standaardnederlands)"De Riksdag", common gender.
arModern Standard Arabic (MSA, الفصحى)RTL — see §"RTL Languages". Numbers stay Western Arabic numerals to match the source.
heModern Hebrew (עברית תקנית)RTL — see §"RTL Languages". Use definite article ה consistently.
jaEditorial Japanese (常体 / です・ます choice: prefer です・ます for editor copy)Foreign names in katakana on first use, then English in parentheses where helpful.
koEditorial Korean (표준어, formal 합니다체)Hangul; transliterate Swedish names on first use.
zhSimplified 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

WorkflowReadsWritesFrequency
Per-type news (news-propositions, news-motions, …)executive-brief.md (EN) onlyPer type, daily
news-translateexecutive-brief.md`executive-brief_.md$ \text{for} \text{the} 13 \text{target} \text{languages}3 \times \text{daily} (09:00, 14:00, 19:00 \text{UTC}, 7 \text{days}/\text{week})

\text{The} \text{translation} \text{workflow} \text{picks} \text{up} \text{at} \text{most} $max_briefs(default3, 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.tsbefore 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)

TermReason
Hack23Company name
Hack23 ABSwedish legal entity (Org.nr 5595347807)
Citizen Intelligence Agency (CIA)Platform/project name
RiksdagSwedish Parliament (proper noun)
RiksdagsmonitorProduct name
James Pether SörlingFounder name
CISSP, CISMProfessional certifications
GitHub, LinkedInPlatform names
OpenSSFOpen Source Security Foundation

2. Terminology Categories

A. CIA Triad (Core Security Concepts)

The CIA Triad is fundamental to information security. Use consistent translations:

EnglishSwedishArabicHebrewGermanFrenchSpanish
CIA TriadCIA-triadenثلاثية CIAשלישיית CIACIA-TriadeTriade CIATríada CIA
ConfidentialityKonfidentialitetالسريةסודיותVertraulichkeitConfidentialitéConfidencialidad
IntegrityIntegritetالسلامةשלמותIntegritätIntégritéIntegridad
AvailabilityTillgänglighetالتوافرזמינותVerfügbarkeitDisponibilitéDisponibilidad
EnglishDanishNorwegianFinnishDutchJapaneseKoreanChinese
CIA TriadCIA-triadenCIA-triadenCIA-triadiCIA-triadeCIA トライアドCIA 3요소CIA 三要素
ConfidentialityFortrolighedKonfidensialitetLuottamuksellisuusVertrouwelijkheid機密性기밀성机密性
IntegrityIntegritetIntegritetEheysIntegriteit完全性무결성完整性
AvailabilityTilgængelighedTilgjengelighetSaatavuusBeschikbaarheid可用性가용성可用性

B. Political & Parliamentary Terms

EnglishSwedishDanishNorwegianFinnishGerman
ParliamentRiksdagFolketingStortingEduskuntaParlament
Member of Parliament (MP)RiksdagsledamotFolketingsmedlemStortingsrepresentantKansanedustajaParlamentsmitglied
CommitteeUtskottUdvalgKomitéValiokuntaAusschuss
CoalitionKoalitionKoalitionKoalisjonKoalitioKoalition
OppositionOppositionOppositionOpposisjonOppositioOpposition
ElectionValValgValgVaalitWahl
VotingRöstningAfstemningAvstemningÄänestysAbstimmung
EnglishFrenchSpanishDutchArabicHebrew
ParliamentParlementParlamentoParlementالبرلمانפרלמנט
Member of Parliament (MP)DéputéDiputadoParlementslidعضو البرلمانחבר פרלמנט
CommitteeCommissionComitéCommissieلجنةועדה
CoalitionCoalitionCoaliciónCoalitieتحالفקואליציה
OppositionOppositionOposiciónOppositieالمعارضةאופוזיציה
ElectionÉlectionElecciónVerkiezingانتخاباتבחירות
VotingVoteVotaciónStemmingتصويتהצבעה
EnglishJapaneseKoreanChinese
Parliament議会의회议会
Member of Parliament (MP)国会議員국회의원议员
Committee委員会위원회委员会
Coalition連立연립联盟
Opposition野党야당反对党
Election選挙선거选举
Voting投票투표投票

C. OSINT & Intelligence Terms

EnglishSwedishGermanFrenchSpanishArabic
OSINTOSINTOSINTOSINTOSINTاستخبارات مفتوحة المصدر
IntelligenceUnderrättelserIntelligenzRenseignementInteligenciaاستخبارات
MonitoringÖvervakningÜberwachungSurveillanceMonitoreoمراقبة
AnalysisAnalysAnalyseAnalyseAnálisisتحليل
Risk AssessmentRiskbedömningRisikobewertungÉvaluation des risquesEvaluación de riesgosتقييم المخاطر
TransparencyTransparensTransparenzTransparenceTransparenciaشفافية

D. Technical & Security Terms

EnglishSwedishGermanFrenchSpanish
SecuritySäkerhetSicherheitSécuritéSeguridad
ComplianceEfterlevnadComplianceConformitéCumplimiento
ISO 27001ISO 27001ISO 27001ISO 27001ISO 27001
NIST CSFNIST CSFNIST CSFNIST CSFNIST CSF
CIS ControlsCIS ControlsCIS ControlsCIS ControlsCIS Controls
DevSecOpsDevSecOpsDevSecOpsDevSecOpsDevSecOps
ISMSISMSISMSSMSISGSI

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.

SwedishEnglishGermanFrenchSpanish
Betänkande (bet)Committee reportAusschussberichtRapport de commissionInforme de comité
Proposition (prop)Government billRegierungsvorlageProjet de loi du gouvernementProyecto de ley gubernamental
Motion (mot)Parliamentary motionParlamentarischer AntragMotion parlementaireMoción parlamentaria
Interpellation (ip)InterpellationInterpellationInterpellationInterpelación
Skriftlig fråga (fr)Written questionSchriftliche AnfrageQuestion écritePregunta escrita
VoteringDivision/VoteAbstimmungVote/ScrutinVotación
AnförandeParliamentary speechParlamentsredeDiscours parlementaireDiscurso parlamentario
Riksdagsskrivelse (rskr)Parliamentary communicationReichstagsschreibenCommunication parlementaireComunicación parlamentaria
SwedishDanishNorwegianFinnishDutch
BetänkandeUdvalgsbetænkningKomitéinnstillingValiokunnan mietintöCommissieverslag
PropositionRegeringsforslagRegjeringsforslagHallituksen esitysWetsvoorstel
MotionBeslutningsforslagRepresentantforslagLakialoiteParlementaire motie
InterpellationForespørgselInterpellasjonVälikysymysInterpellatie
Skriftlig frågaSkriftligt spørgsmålSkriftlig spørsmålKirjallinen kysymysSchriftelijke vraag
VoteringAfstemningVoteringÄänestysStemming
AnförandeTaleInnleggPuheenvuoroToespraak
SwedishArabicHebrewJapaneseKoreanChinese
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.

AbbreviationSwedish NameEnglish
FiUFinansutskottetFinance Committee
SoUSocialutskottetSocial Affairs Committee
JuUJustitieutskottetJustice Committee
CUCivilutskottetCivil Affairs Committee
UUUtrikesutskottetForeign Affairs Committee
FöUFörsvarsutskottetDefence Committee
KUKonstitutionsutskottetConstitutional Committee
KrUKulturutskottetCultural Affairs Committee
MJUMiljö- och jordbruksutskottetEnvironment and Agriculture Committee
NUNäringsutskottetIndustry Committee
SkUSkatteutskottetTax Committee
SfUSocialförsäkringsutskottetSocial Insurance Committee
TUTrafikutskottetTransport Committee
UbUUtbildningsutskottetEducation Committee
AUArbetsmarknadsutskottetLabour Market Committee

G. Common Policy Terms from Riksdag API

SwedishEnglishNotes
Statlig personalGovernment personnelCivil servants
BostadsrättTenant-ownership / Housing cooperativeSwedish housing form
FöräldrapenningParental allowanceSocial insurance benefit
DjurskyddAnimal welfare/protectionRegulatory area
FribeloppetEarning thresholdTax-free amount for students/pensioners
TidöavtaletThe Tidö Agreement2022 governing agreement (M, KD, L, SD)
RiksrevisionenSwedish National Audit OfficeKeep "Riksrevisionen" in parentheses
RiksbankenSveriges RiksbankSweden's central bank
StatsrådCabinet ministerMember of the government
RegeringskanslietGovernment Offices of SwedenAdministrative apparatus

🔄 Cultural Adaptations

Date Formats

RegionFormatExample
US (English)MM/DD/YYYY02/05/2026
EU (Most)DD/MM/YYYY05/02/2026
SwedenYYYY-MM-DD2026-02-05
ISO 8601YYYY-MM-DD2026-02-05 (preferred)
ArabicDD/MM/YYYY or ٥ فبراير ٢٠٢٦Both Western & Arabic-Indic
JapaneseYYYY年MM月DD日2026年2月5日
ChineseYYYY年MM月DD日2026年2月5日
KoreanYYYY년 MM월 DD일2026년 2월 5일

Number Formats

RegionThousandsDecimalExample
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
ArabicWestern or ١٬٠٠٠٫٥٠Both formats

Currency

LanguageCurrency SymbolPositionExample
Swedishkr (SEK)After amount5 000 kr
European€ (EUR)After amount5 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:

EnglishSwedishGermanFrenchSpanishDutchDanishNorwegianFinnish
CommitteeKommittéAusschussCommissionComisiónCommissieUdvalgKomitéValiokunta
DocumentDokumentDokumentDocumentDocumentoDocumentDokumentDokumentAsiakirja
What to WatchVad man ska följaWas zu beobachtenÀ surveillerQué observarTe volgenHvad man skal følgeHva man skal følgeMitä seurata
This WeekDenna veckaDiese WocheCette semaineEsta semanaDeze weekDenne ugeDenne ukenTällä viikolla
Next WeekNästa veckaNächste WocheLa semaine prochaineLa próxima semanaVolgende weekNæste ugeNeste ukeEnsi viikolla
AnalysisAnalysAnalyseAnalyseAnálisisAnalyseAnalyseAnalyseAnalyysi
Evening AnalysisKvällsanalysAbendanalyseAnalyse du soirAnálisis vespertinoAvondanalyseAftenanalyseKveldsanalyseIlta-analyysi

G. Committee Report Terminology

Common phrases from committee reports:

EnglishSwedishGermanFrench
Better conditions for deploying government personnelBättre förutsättningar att sända ut statlig personalBessere Voraussetzungen für die Entsendung staatlichen PersonalsMeilleures conditions pour le déploiement du personnel gouvernemental
A register for all condominiumsEtt register för alla bostadsrätterEin Register für alle EigentumswohnungenUn registre pour toutes les copropriétés
Animal welfareDjurskyddTierschutzProtection des animaux
Trade policyHandelspolitikHandelspolitikPolitique commerciale
Planning and constructionPlanering och byggandePlanung und BauwesenPlanification et construction

H. Political Process Terms

Key political process vocabulary from analysis articles:

ConceptEnglishSwedishGermanFrenchSpanish
CoalitionCoalitionKoalitionKoalitionCoalitionCoalición
Legislative analysisLegislative analysisLagstiftningsanalysGesetzgebungsanalyseAnalyse législativeAnálisis legislativo
Political riskPolitical riskPolitisk riskPolitisches RisikoRisque politiqueRiesgo político
Government recordGovernment recordRegeringsprotokollRegierungsbilanzBilan gouvernementalRegistro del gobierno
Parliamentary prioritiesParliamentary prioritiesParlamentariska prioriteringarParlamentarische PrioritätenPriorités parlementairesPrioridades parlamentarias
Mid-session assessmentMid-session assessmentHalvtidsbedömningHalbzeitbewertungÉvaluation à mi-sessionEvaluació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:

TypeEnglishSwedishGermanFrenchSpanish
Committee ReportsCommittee ReportsUtskottsbetänkandenAusschussberichteRapports de commissionInformes de comisión
PropositionsGovernment PropositionsPropositionerRegierungsvorlagenPropositions gouvernementalesProposiciones gubernamentales
MotionsOpposition MotionsMotionerAnträgeMotionsMociones
Evening AnalysisEvening AnalysisKvällsanalysAbendanalyseAnalyse du soirAnálisis vespertino
Week AheadWeek AheadVeckan som kommerKommende WocheLa semaine à venirLa semana próxima

K. Temporal Expressions

Time-related vocabulary from news articles:

EnglishSwedishGermanFrenchSpanishDutch
TodayIdagHeuteAujourd'huiHoyVandaag
TomorrowImorgonMorgenDemainMañanaMorgen
This weekDenna veckaDiese WocheCette semaineEsta semanaDeze week
Next weekNästa veckaNächste WocheLa semaine prochaineLa próxima semanaVolgende week
Last weekFörra veckanLetzte WocheLa semaine dernièreLa semana pasadaVorige week
Spring recessVåruppehållFrühjahrspausePause de printempsReceso de primaveraVoorjaarsreces
Mid-sessionHalvtidHalbzeitMi-sessionMitad de períodoHalverweg
Parliamentary weekParlamentsveckaParlamentswocheSemaine parlementaireSemana parlamentariaParlementaire 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


🤝 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

LanguageTranslationHreflangRTL SupportFont LoadingStatus
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