Skip to content

Commit 4a25a97

Browse files
committed
feat(feeds): add Ukrainian (uk) locale with mainstream + investigative sources
Adds Ukrainian as a supported locale following the pattern established in #3857 (Hungarian). Sources added: - Mainstream: Ukrinform, Ukrainska Pravda, Hromadske, Suspilne Media, ZN.UA, RBC-Ukraine - Investigative: Bihus.Info, Slidstvo.Info, Skhemy (Schemes), VoxUkraine Direct RSS (verified working): ukrinform.ua, bihus.info, slidstvo.info (redirects to www.slidstvo.info) Google News fallback (blocked from probe IP — UA:uk locale params): pravda.com.ua, hromadske.ua, suspilne.media, schemes.media, zn.ua, rbc.ua, voxukraine.org All 4 allowlist mirrors updated (shared/, scripts/shared/, api/, vite.config.ts). Redirect trap: slidstvo.info/feed/ → www.slidstvo.info/feed/ — both hostnames added to allowlist. Server _feeds.ts mirrors client feeds.ts routing decisions (direct vs Google News) — feeds-client-server-parity test coverage maintained.
1 parent 3735d77 commit 4a25a97

14 files changed

Lines changed: 3363 additions & 7 deletions

File tree

api/_rss-allowed-domains.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,5 +311,16 @@ export default [
311311
"hirado.hu",
312312
"portfolio.hu",
313313
"www.portfolio.hu",
314-
"www.atv.hu"
314+
"www.atv.hu",
315+
"www.ukrinform.ua",
316+
"pravda.com.ua",
317+
"hromadske.ua",
318+
"suspilne.media",
319+
"zn.ua",
320+
"rbc.ua",
321+
"bihus.info",
322+
"slidstvo.info",
323+
"www.slidstvo.info",
324+
"schemes.media",
325+
"voxukraine.org"
315326
];

public/offline.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ <h1 id="t-title">You're Offline</h1>
5151
pt: { title: "Você está offline", msg: "World Monitor requer uma conexão com a internet para dados de inteligência em tempo real.", retry: "Tentar novamente" },
5252
ro: { title: "Sunteți Offline", msg: "World Monitor necesită o conexiune la internet pentru date de informații în timp real.", retry: "Încercați din nou" },
5353
ru: { title: "Вы не подключены к интернету", msg: "World Monitor требует подключение к интернету для получения данных разведки в реальном времени.", retry: "Повторить" },
54+
uk: { title: "Ви офлайн", msg: "World Monitor потребує підключення до інтернету для даних розвідки в реальному часі.", retry: "Повторити" },
5455
sv: { title: "Du är offline", msg: "World Monitor kräver en internetanslutning för realtidsunderrättelsedata.", retry: "Försök igen" },
5556
th: { title: "คุณออนไลน์ไม่ได้", msg: "World Monitor ต้องการการเชื่อมต่ออินเทอร์เน็ตเพื่อรับข้อมูลข่าวกรรมการแบบเรียลไทม์", retry: "ลองใหม่" },
5657
tr: { title: "Çevrimdışısınız", msg: "World Monitor, gerçek zamanlı istihbarat verileri için internet bağlantısı gerektirir.", retry: "Yeniden Dene" },

scripts/shared/rss-allowed-domains.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,5 +308,16 @@
308308
"hirado.hu",
309309
"portfolio.hu",
310310
"www.portfolio.hu",
311-
"www.atv.hu"
311+
"www.atv.hu",
312+
"www.ukrinform.ua",
313+
"pravda.com.ua",
314+
"hromadske.ua",
315+
"suspilne.media",
316+
"zn.ua",
317+
"rbc.ua",
318+
"bihus.info",
319+
"slidstvo.info",
320+
"www.slidstvo.info",
321+
"schemes.media",
322+
"voxukraine.org"
312323
]

scripts/shared/source-tiers.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@
7474
"Híradó": 2,
7575
"Portfolio.hu": 2,
7676
"ATV": 2,
77+
"Ukrinform": 2,
78+
"Ukrainska Pravda": 2,
79+
"Hromadske": 2,
80+
"Suspilne": 2,
81+
"ZN.UA": 2,
82+
"RBC-Ukraine": 2,
83+
"Bihus.Info": 2,
84+
"Slidstvo.Info": 2,
85+
"Skhemy": 2,
86+
"VoxUkraine": 2,
7787
"BBC Russian": 2,
7888
"Meduza": 2,
7989
"Novaya Gazeta Europe": 2,

scripts/sync-offline-translations.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import { readFileSync, writeFileSync } from 'node:fs';
1919
import path from 'node:path';
2020

21-
const LOCALES = ['en', 'ar', 'bg', 'cs', 'de', 'el', 'es', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'th', 'tr', 'vi', 'zh'];
21+
const LOCALES = ['en', 'ar', 'bg', 'cs', 'de', 'el', 'es', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'th', 'tr', 'uk', 'vi', 'zh'];
2222
const OFFLINE_HTML = 'public/offline.html';
2323
const LOCALES_DIR = 'src/locales';
2424

scripts/translate-locales.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ const onlyArg = [...args].find(a => a.startsWith('--only='));
2929
const onlyLocales = onlyArg ? onlyArg.slice('--only='.length).split(',') : null;
3030

3131
const ROOT = proTest ? 'pro-test/src/locales' : 'src/locales';
32-
const LOCALES = ['ar', 'bg', 'cs', 'de', 'el', 'es', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'th', 'tr', 'vi', 'zh'];
32+
const LOCALES = ['ar', 'bg', 'cs', 'de', 'el', 'es', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'th', 'tr', 'uk', 'vi', 'zh'];
3333
const LANG_NAMES = {
3434
ar: 'Arabic', bg: 'Bulgarian', cs: 'Czech', de: 'German', el: 'Greek',
3535
es: 'Spanish', fr: 'French', hu: 'Hungarian', it: 'Italian', ja: 'Japanese',
3636
ko: 'Korean', nl: 'Dutch', pl: 'Polish', pt: 'Portuguese (Brazil)',
37-
ro: 'Romanian', ru: 'Russian', sv: 'Swedish', th: 'Thai', tr: 'Turkish',
37+
ro: 'Romanian', ru: 'Russian', sv: 'Swedish', th: 'Thai', tr: 'Turkish', uk: 'Ukrainian',
3838
vi: 'Vietnamese', zh: 'Simplified Chinese',
3939
};
4040
const BATCH_SIZE = 50;

server/worldmonitor/news/v1/_feeds.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ export const VARIANT_FEEDS: Record<string, Record<string, ServerFeed[]>> = {
5555
{ name: 'Híradó', url: gnLocale('site:hirado.hu when:2d', 'hu', 'HU', 'HU:hu'), lang: 'hu' },
5656
{ name: 'Portfolio.hu', url: 'https://portfolio.hu/rss/all.xml', lang: 'hu' },
5757
{ name: 'ATV', url: 'https://www.atv.hu/rss', lang: 'hu' },
58+
// Ukrainian (UK) — mirrors src/config/feeds.ts europe block.
59+
{ name: 'Ukrinform', url: 'https://www.ukrinform.ua/rss/block-lastnews', lang: 'uk' },
60+
{ name: 'Ukrainska Pravda', url: gnLocale('site:pravda.com.ua when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
61+
{ name: 'Hromadske', url: gnLocale('site:hromadske.ua when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
62+
{ name: 'Suspilne', url: gnLocale('site:suspilne.media when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
63+
{ name: 'ZN.UA', url: gnLocale('site:zn.ua when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
64+
{ name: 'RBC-Ukraine', url: gnLocale('site:rbc.ua when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
65+
{ name: 'Bihus.Info', url: 'https://bihus.info/feed/', lang: 'uk' },
66+
{ name: 'Slidstvo.Info', url: 'https://www.slidstvo.info/feed/', lang: 'uk' },
67+
{ name: 'Skhemy', url: gnLocale('site:schemes.media when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
68+
{ name: 'VoxUkraine', url: gnLocale('site:voxukraine.org when:2d', 'uk', 'UA', 'UA:uk'), lang: 'uk' },
5869
],
5970
middleeast: [
6071
{ name: 'BBC Middle East', url: 'https://feeds.bbci.co.uk/news/world/middle_east/rss.xml' },

shared/rss-allowed-domains.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,5 +308,16 @@
308308
"hirado.hu",
309309
"portfolio.hu",
310310
"www.portfolio.hu",
311-
"www.atv.hu"
311+
"www.atv.hu",
312+
"www.ukrinform.ua",
313+
"pravda.com.ua",
314+
"hromadske.ua",
315+
"suspilne.media",
316+
"zn.ua",
317+
"rbc.ua",
318+
"bihus.info",
319+
"slidstvo.info",
320+
"www.slidstvo.info",
321+
"schemes.media",
322+
"voxukraine.org"
312323
]

shared/source-tiers.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@
7474
"Híradó": 2,
7575
"Portfolio.hu": 2,
7676
"ATV": 2,
77+
"Ukrinform": 2,
78+
"Ukrainska Pravda": 2,
79+
"Hromadske": 2,
80+
"Suspilne": 2,
81+
"ZN.UA": 2,
82+
"RBC-Ukraine": 2,
83+
"Bihus.Info": 2,
84+
"Slidstvo.Info": 2,
85+
"Skhemy": 2,
86+
"VoxUkraine": 2,
7787
"BBC Russian": 2,
7888
"Meduza": 2,
7989
"Novaya Gazeta Europe": 2,

src/config/feeds.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,20 @@ const FULL_FEEDS: Record<string, Feed[]> = {
278278
{ name: 'in.gr', url: rss('https://www.in.gr/feed/'), lang: 'el' },
279279
{ name: 'iefimerida', url: rss('https://www.iefimerida.gr/rss.xml'), lang: 'el' },
280280
{ name: 'Proto Thema', url: rss('https://news.google.com/rss/search?q=site:protothema.gr+when:2d&hl=el&gl=GR&ceid=GR:el'), lang: 'el' },
281+
// Ukrainian (UK) — mainstream + investigative sources.
282+
// Direct RSS: ukrinform.ua, bihus.info, slidstvo.info (verified working).
283+
// Google News fallback (blocked from cloud IPs): pravda.com.ua, hromadske.ua,
284+
// suspilne.media, schemes.media, zn.ua, rbc.ua, voxukraine.org.
285+
{ name: 'Ukrinform', url: rss('https://www.ukrinform.ua/rss/block-lastnews'), lang: 'uk' },
286+
{ name: 'Ukrainska Pravda', url: rss('https://news.google.com/rss/search?q=site:pravda.com.ua+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
287+
{ name: 'Hromadske', url: rss('https://news.google.com/rss/search?q=site:hromadske.ua+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
288+
{ name: 'Suspilne', url: rss('https://news.google.com/rss/search?q=site:suspilne.media+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
289+
{ name: 'ZN.UA', url: rss('https://news.google.com/rss/search?q=site:zn.ua+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
290+
{ name: 'RBC-Ukraine', url: rss('https://news.google.com/rss/search?q=site:rbc.ua+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
291+
{ name: 'Bihus.Info', url: rss('https://bihus.info/feed/'), lang: 'uk' },
292+
{ name: 'Slidstvo.Info', url: rss('https://www.slidstvo.info/feed/'), lang: 'uk' },
293+
{ name: 'Skhemy', url: rss('https://news.google.com/rss/search?q=site:schemes.media+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
294+
{ name: 'VoxUkraine', url: rss('https://news.google.com/rss/search?q=site:voxukraine.org+when:2d&hl=uk&gl=UA&ceid=UA:uk'), lang: 'uk' },
281295
// Russia & Ukraine (independent sources)
282296
{ name: 'BBC Russian', url: rss('https://feeds.bbci.co.uk/russian/rss.xml'), lang: 'ru' },
283297
{ name: 'Meduza', url: rss('https://meduza.io/rss/all'), lang: 'ru' },

0 commit comments

Comments
 (0)