Awesome, glad to see more discussion about this channel. I concur with those comments. I had to signal boost this video when the intro section didn't focus on the cheapness to knock the Iranians, but to talk about how sanctions (a political choice) have affected the lives of normal people.
Oh interesting, dunno why they use a slightly different list of languages codes:
Alright I had nothing to do this evening so here's my API version. It was noticeably slower when using @run-at document-idle, but since this version doesn't need to reference anything on the page, I moved it up to document-start.
version 3 (code cleanup and using language code 'no' instead of 'nb')
// ==UserScript==
// @name Wikipedia Language Redirector (Using Mediawiki API)
// @version v3
// @match https://en.wikipedia.org/wiki/*
// @description Redirects wikipedia pages to alternate language pages in order of predefined preference
// @author wheresmysurplusvalue
// @run-at document-start
// @license AGPL 3+
// ==/UserScript==
const LanguageList = ['no', 'nn', 'da', 'sv', 'eo', 'tok', 'ru', 'ja', 'zh'];
function main() {
if (LanguageList.length == 0) {
return;
}
const path = window.location.pathname;
const title = parseTitle(path);
if (title) {
resolveTitle(title)
.then(getLanguages)
.then(chooseLanguage)
.then(redirectLanguage)
.catch(err => console.error(err));
} else {
console.log("Article title could not be parsed:", path);
}
}
function redirectLanguage(pageLanguage) {
window.location.href = `https://${pageLanguage.code}.wikipedia.org/wiki/${pageLanguage.key}`;
}
function chooseLanguage(availableLanguages) {
const pageLanguage = filterLanguages(availableLanguages).next().value;
if (!pageLanguage) {
throw new Error(`Article not available in preferred languages: ${LanguageList}`);
}
return pageLanguage;
}
function* filterLanguages(availableLanguages) {
for (const langCode of LanguageList) {
for (const pageLanguage of availableLanguages) {
if (pageLanguage.code == langCode) {
yield pageLanguage;
}
}
}
}
function parseTitle(path) {
const regex = /^\/wiki\/(.*)/;
const match = path.match(regex);
if (!match) {
console.error(`Could not parse title from path: ${path}`);
return null;
}
const title = match[1];
console.log("Extracted article title:", title);
return title;
}
async function request(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! url: ${url}, status: ${response.status}`);
}
return await response.json();
}
async function resolveTitle(title) {
return getPage(title).then(data => data.key);
}
async function getPage(title) {
const url = `/w/rest.php/v1/page/${title}/bare`;
return requestPage(url, true);
}
async function requestPage(url, followRedirect) {
return request(url).then(data => {
console.log("data:", data);
if (followRedirect && data.redirect_target) {
return requestPage(data.redirect_target, followRedirect);
}
return data;
});
}
async function getLanguages(title) {
const url = `/w/rest.php/v1/page/${title}/links/language`;
return request(url);
}
main();
version 2 (added a call to the page API to follow redirects)
// ==UserScript==
// @name Wikipedia Language Redirector (Using Mediawiki API)
// @version v2
// @match https://en.wikipedia.org/wiki/*
// @description Redirects wikipedia pages to alternate language pages in order of predefined preference
// @author wheresmysurplusvalue
// @run-at document-start
// @license AGPL 3+
// ==/UserScript==
const LanguageList = ['nb', 'nn', 'da', 'sv', 'eo', 'tok', 'ru', 'ja', 'zh'];
function main() {
const path = window.location.pathname;
const title = getTitle(path);
if (title) {
getRealTitle(title)
.then(title => getLanguages(title))
.then(data => chooseLanguage(data));
} else {
console.log("Article title could not be parsed: ", path);
}
}
function chooseLanguage(availableLanguages) {
for (const langCode of LanguageList) {
for (const pageLanguage of availableLanguages) {
if (pageLanguage.code == langCode) {
console.log("Found match: ", langCode);
window.location.href = `https://${pageLanguage.code}.wikipedia.org/wiki/${pageLanguage.key}`;
return;
}
}
}
console.log("Article not available in preferred languages.");
}
function getTitle(path) {
const regex = /^\/wiki\/(.*)/;
const match = path.match(regex);
if (match) {
const title = match[1];
console.log("Extracted article title: ", title);
return title;
}
return null;
}
async function request(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching data:', error);
}
}
async function getLanguages(title) {
const url = `/w/rest.php/v1/page/${title}/links/language`;
return request(url);
}
async function getRealTitle(title) {
const url = `/w/rest.php/v1/page/${title}/bare`;
return getPage(url).then(data => {
console.log("Resolved title: ", data.key);
return data.key;
});
}
async function getPage(url) {
return request(url).then(data => {
console.log("data: ", data);
if (data.redirect_target) {
return getPage(data.redirect_target);
}
return data;
});
}
main();
version 1 (does not work if the page is redirected)
// ==UserScript==
// @name Wikipedia Language Redirector (Using Mediawiki API)
// @version v1
// @match https://en.wikipedia.org/wiki/*
// @description Redirects wikipedia pages to alternate language pages in order of predefined preference
// @author wheresmysurplusvalue
// @run-at document-start
// @license AGPL 3+
// ==/UserScript==
const LanguageList = ['nb', 'nn', 'da', 'sv', 'eo', 'tok', 'ru', 'ja', 'zh'];
function handleResponse(json) {
for (const langCode of LanguageList) {
for (const pageLanguage of json) {
if (pageLanguage.code == langCode) {
console.log("Found match: ", langCode);
window.location.href = `https://${pageLanguage.code}.wikipedia.org/wiki/${pageLanguage.key}`;
return;
}
}
}
console.log("Article not available in preferred languages.");
}
const path = window.location.pathname;
const title = getTitle(path);
if (title) {
getLanguages(title, handleResponse);
} else {
console.log("Article title could not be parsed: ", path);
}
function getTitle(path) {
const regex = /^\/wiki\/(.*)/;
const match = path.match(regex);
if (match) {
const title = match[1];
console.log("Extracted article title: ", title);
return title;
}
return null;
}
function getLanguages(title, callback) {
const request_url = `/w/rest.php/v1/page/${title}/links/language`;
console.log("Request url: ", request_url);
fetch(request_url)
.then(response => {
if (!response.ok) {
throw new Error("HTTP status code in error: " + response.statusText);
}
return response.json();
})
.then(data => callback(data))
.catch(error => {
console.error("Error: ", error);
});
}
Kudos to the authors for making it!
I was considering an alternate approach by calling Wikipedia's REST API Get languages GET /page/{title}/links/language to get all the available languages for a page. Then search the response for the first language in the list which is available, and redirect to that. It's an extra network request, but maybe more resilient to differences in how the HTML is rendered in the future.
See for example the languages list for the article on the Soviet Union: https://en.wikipedia.org/w/rest.php/v1/page/Soviet_Union/links/language
I started looking into this and this might be what the Accept-Language HTTP header^[https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept-Language] is used for? It seems to allow a list of languages in order of preference, and then websites can use this to decide which language to show content in.
There's probably a setting in about:config which will globally set Accept-Language for all pages you visit, or maybe you can try an extension like this to control it per site.
I tried using this addon to add a site setting for *.wikipedia.org to set Accept-Language to de, fr, but it's not working for me. It might be that my browser (IronFox on Android) has some settings to prevent browser fingerprinting which are interfering with this. (There's at least one setting "Request English versions of web pages - When enabled, strengthens fingerprinting protection")
Dunno if this helps, but maybe it gives a direction to look.
Sanction me once

You can't sanction me again
So nice of the pope to die on a Monday so that the megathread topic writes itself

Did the Resistance retaliate yet?


Nah still cookin

Has anyone here watched the show Derry Girls set in Ireland during the Troubles? It ended with
Tap for spoiler
a cameo by Chelsea fucking Clinton lmao, worst possible ending
Ursula von der Leyen getting harassed by anti-genocide protestors in Helsinki market square
https://streamable.com/ss72wo
https://streamable.com/i59yv6
No end to the genocide, no right to speak
Live stream and a news article for this one.

Demonstrators in the lobby of Ylen Mediatalo. Photo: Petteri Sopanen / Yle
On Saturday morning, a group of protesters arrived at Yle's Helsinki office to demand that Yle withdraw from Eurovision because Israel is participating in the competition.
Israel's participation has attracted strong criticism , as Israel is waging a war in the Palestinian territory of Gaza.
In the press release, the protesters say that Israel will get a platform to polish its own image in Eurovision.
wheresmysurplusvalue
0 post score0 comment score
This sounds similar to my experience trying Dobry cola in Russia after 2022, it tastes identical but with a different label.