MediaWiki:Common.js
Appearance
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
( function ( mw, $ ) {
'use strict';
var submissionPage = 'Project:Terminology submissions';
var otherValue = '__other__';
var languages = [
'English',
'Français',
'Deutsch',
'日本語',
'中文',
'Español',
'Italiano',
'Português',
'Ελληνικά',
'Русский',
'한국어',
'العربية',
'हिन्दी',
'Bahasa Indonesia',
'Nederlands',
'Polski',
'Türkçe',
'Українська',
'Tiếng Việt',
'ไทย'
];
function wrapNowiki( value ) {
return '<nowiki>' + String( value ).replace( /<\/nowiki\s*>/gi, '</nowiki>' ) + '</nowiki>';
}
function setStatus( form, message, type ) {
var status = form.querySelector( '.terminology-form-status' );
status.className = 'terminology-form-status' +
( type ? ' terminology-form-status--' + type : '' );
status.textContent = message;
}
function option( value, label, disabled, selected ) {
var item = document.createElement( 'option' );
item.value = value;
item.textContent = label;
item.disabled = !!disabled;
item.selected = !!selected;
return item;
}
function initialiseForm( form ) {
var controls, languageSelect, otherLanguage, translation, submit, term;
if ( form.getAttribute( 'data-terminology-ready' ) === 'yes' ) {
return;
}
form.setAttribute( 'data-terminology-ready', 'yes' );
term = form.querySelector( '.terminology-form-term' ).textContent.trim();
controls = form.querySelector( '.terminology-form-controls' );
controls.textContent = '';
languageSelect = document.createElement( 'select' );
languageSelect.className = 'terminology-language-select';
languageSelect.setAttribute( 'aria-label', 'Language' );
languageSelect.appendChild( option( '', 'Choose language', true, true ) );
languages.forEach( function ( language ) {
languageSelect.appendChild( option( language, language ) );
} );
languageSelect.appendChild( option( otherValue, 'Other language…' ) );
otherLanguage = document.createElement( 'input' );
otherLanguage.type = 'text';
otherLanguage.className = 'terminology-other-language';
otherLanguage.placeholder = 'Language name';
otherLanguage.setAttribute( 'aria-label', 'Other language name' );
otherLanguage.hidden = true;
translation = document.createElement( 'input' );
translation.type = 'text';
translation.className = 'terminology-translation-input';
translation.placeholder = 'Enter translation';
translation.setAttribute( 'aria-label', 'Translation' );
submit = document.createElement( 'button' );
submit.type = 'button';
submit.className = 'terminology-translation-submit';
submit.textContent = 'Submit translation';
controls.appendChild( languageSelect );
controls.appendChild( otherLanguage );
controls.appendChild( translation );
controls.appendChild( submit );
languageSelect.addEventListener( 'change', function () {
otherLanguage.hidden = languageSelect.value !== otherValue;
if ( !otherLanguage.hidden ) {
otherLanguage.focus();
}
} );
submit.addEventListener( 'click', function () {
var language = languageSelect.value === otherValue ?
otherLanguage.value.trim() : languageSelect.value;
var translatedTerm = translation.value.trim();
var sourcePage = String( mw.config.get( 'wgPageName' ) || '' ).replace( /_/g, ' ' );
var sectionTitle;
var sectionText;
if ( !language ) {
setStatus( form, 'Please choose or enter a language.', 'error' );
languageSelect.focus();
return;
}
if ( !translatedTerm ) {
setStatus( form, 'Please enter a translation.', 'error' );
translation.focus();
return;
}
sectionTitle = 'Translation: ' + term + ' — ' + language;
sectionText =
"* '''Source page:''' [[" + sourcePage + "]]\n" +
"* '''Term:''' " + wrapNowiki( term ) + "\n" +
"* '''Language:''' " + wrapNowiki( language ) + "\n" +
"* '''Translation:''' " + wrapNowiki( translatedTerm ) + "\n" +
"* '''Submitted by:''' [[User:InfernalAtom683|InfernalAtom683]] ([[User talk:InfernalAtom683|talk]]) 02:19, 17 July 2026 (CST)";
submit.disabled = true;
setStatus( form, 'Submitting…' );
new mw.Api().postWithToken( 'csrf', {
action: 'edit',
title: submissionPage,
section: 'new',
sectiontitle: sectionTitle,
text: sectionText,
summary: ( 'New terminology translation: ' + term + ' (' + language + ')' ).slice( 0, 240 ),
watchlist: 'nochange',
formatversion: 2
} ).done( function () {
translation.value = '';
setStatus( form, 'Translation submitted for review. Thank you!', 'success' );
} ).fail( function ( code, data ) {
var detail = data && data.error && data.error.info ? ' ' + data.error.info : '';
setStatus( form, 'Submission failed.' + detail, 'error' );
} ).always( function () {
submit.disabled = false;
} );
} );
}
function initialiseTerminologyForms( $content ) {
$content.find( '.terminology-translation-form' ).each( function () {
initialiseForm( this );
} );
}
mw.loader.using( 'mediawiki.api' ).then( function () {
mw.hook( 'wikipage.content' ).add( initialiseTerminologyForms );
} );
}( mediaWiki, jQuery ) );