🗣️ 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:
- Scans
analysis/daily/**/executive-brief.mdfor sources that are missing translations or whose<!-- source-sha: ... -->trailer no longer matches the currentgit log -1 --format=%Hof the source. - Picks up at most
max_briefssource files per run (default 3, range 1–7), prioritising the oldest article date first. - Translates each source into every requested target language using the terminology tables in this guide.
- Validates every translation with
scripts/validate-executive-brief-translations.ts(structural parity, dok_id preservation, RTL markers, no English BLUF leakage, source-SHA trailer). - 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-translaterun. - Terminology drift is detectable: a single
news-translateregression only affects non-EN files. - The 14 top-level
index_*.htmlpages andpolitical-intelligence_*.htmlpages 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. |
- Insert
<!-- dir: rtl -->as the first non-frontmatter line of everyexecutive-brief_ar.mdandexecutive-brief_he.mdso 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 | 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.
- 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/hefiles start with<!-- dir: rtl -->. - File ends with
<!-- source-sha: <40-hex> -->matching the source'sgit log -1 --format=%H. -
scripts/validate-executive-brief-translations.tsexits 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:
- 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
- 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
-
langattribute 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
inLanguageproperty set
- Proper heading hierarchy (h1 → h2 → h3)
- Alt text translated for images
- ARIA labels translated
- Form labels translated
- Keyboard navigation working
- Screen reader compatible
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">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/ --recurseNews 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/*.htmlExpected 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:
- Open the file listed
- Find
<span data-translate="true" lang="sv">Swedish text</span> - Translate the Swedish text to the article's language
- Replace:
<span data-translate="true" lang="sv">Swedish text</span>→Translated text - Consult Section E below for document type translations
- Run
npm run validate-newsagain to verify
- Native speaker review (preferred)
- Cultural appropriateness check
- Technical term consistency
- Political term accuracy
- Security terminology correctness
This 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:
- 委员会 (Committee)
- 文件 (Document)
- 本周关注 (What to Watch This Week)
- 改善国家工作人员外派条件 (Better conditions for deploying government personnel)
- 所有产权公寓登记制度 (A register for all condominiums)
- 动物保护 (Animal welfare)
- 委員会 (Committee)
- 文書 (Document)
- 今週の注目 (What to Watch This Week)
- 国家公務員の海外派遣条件の改善 (Better conditions for deploying government personnel)
- 全分譲住宅の登録制度 (A registry for all condominiums)
- 動物福祉 (Animal welfare)
- 위원회 (Committee)
- 문서 (Document)
- 이번 주 주목사항 (What to Watch This Week)
- 국가 공무원 파견 조건 개선 (Better conditions for deploying government personnel)
- 모든 분양주택 등록 제도 (A registry for all condominiums)
- 동물 복지 (Animal welfare)
- لجنة (Committee)
- وثيقة (Document)
- ما يجب متابعته هذا الأسبوع (What to Watch This Week)
- ظروف أفضل لإرسال الموظفين الحكوميين (Better conditions for deploying government personnel)
- سجل لجميع حقوق الملكية السكنية (A registry for all condominiums)
- رعاية الحيوان (Animal welfare)
- ועדה (Committee)
- מסמך (Document)
- על מה לעקוב השבוע (What to Watch This Week)
- תנאים טובים יותר לשליחת עובדי מדינה (Better conditions for deploying government personnel)
- מרשם לכל דירות הבעלות (A registry for all condominiums)
- רווחת בעלי חיים (Animal welfare)
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:
- 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
Riksdagsmonitor follows Hack23's comprehensive translation standards:
- Homepage Repository: Hack23/homepage
- Arabic Translation Guide: Arabic-Translation-Guide.md
- Chinese Translation Guide: Chinese-Translation-Guide.md
- Korean Translation Guide: Korean-Translation-Guide.md
- Spanish Translation Guide: Spanish-Translation-Guide.md
- Swedish Translation Guide: Swedish terminology embedded in this guide
- ARCHITECTURE.md - System architecture
- SECURITY_ARCHITECTURE.md - Security controls
- README.md - Project overview
- SKILLS.md - Multi-language localization skill
-
Setup
git clone git@github.com:Hack23/riksdagsmonitor.git cd riksdagsmonitor git checkout -b translation/[language-code] -
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
- Copy structure from
-
Validate
htmlhint index_[language-code].html
-
Test Locally
python3 -m http.server 8080 # Open http://localhost:8080/index_[language-code].html -
Submit Pull Request
- Descriptive commit message
- Reference translation guide
- Include native speaker review (if possible)
- Review translations quarterly
- Update when source content changes
- Monitor user feedback
- Track translation quality 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)
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)
- No secrets in translation files
- Sanitized user input (if forms added)
- XSS protection in all languages
- CSP headers consistent across languages
Questions about translations?
- GitHub Issues: Hack23/riksdagsmonitor/issues
- Email: pether@hack23.com
- LinkedIn: James Pether Sörling
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 🏷️ 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