MediaWiki:AjaxTranslation.js

From radlines.org
Jump to navigation Jump to search

Note: After saving, 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)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/**
 * Ajax Translations
 *
 * Translates layout templates (licenses templates)
 * See talk page for documentation.
 *
 * Maintainers: [[User:ערן]], [[User:Ilmari Karonen]], [[User:DieBuche]]
 * Last update: 2012-05-27
 */
// Avoid post-save expansion: <nowiki>
/*global jQuery:false, mediaWiki:false*/
/*jslint browser: true */
/*jshint curly:false */
(function (mw, $) {
	"use strict";

	if (typeof mw.libs.AjaxTranslations === 'object') {
		return;
	}

	var AjaxTranslations = {
		updateLangLinks: function () {
			if (typeof window.disableAjaxTranslation !== 'undefined') {
				return;
			}
			var langLinkRgx = new RegExp(
				'^(' +
					mw.RegExp.escape(mw.config.get('wgServer')) +
					'|)' +
					mw.RegExp.escape(mw.config.get('wgArticlePath')).replace("\\$1", '(Template:.*/[a-z]{2,3}(-[a-z]+)?)') +
					'$'
			);
			$('div.layouttemplate a, table.layouttemplate a').each(function () {
				var m = langLinkRgx.exec($(this).attr('href'));

				// No translation link, skip it
				if (m) {
					$(this).attr('title', decodeURIComponent(m[2]).replace(/_/g, ' '));
					$(this).click(function (e) {
						e.preventDefault();
						AjaxTranslations.loadAjaxTranslation(e);
					});
				}
				AjaxTranslations.state = 'Ok, ready';
			});
		},

		/** @param {jQuery.Event} e */
		loadAjaxTranslation: function (e) {
			var templateParts,
				aT = this,
				templateArgs = '',
				linkElement = e.target,
				templateName = linkElement.title;

			if (!templateName) {
				return;
			}

			templateName = templateName.replace(/[\s_]+/g, '_');
			templateParts = /^Template:(.*)\/([a-z]{2,3}(-[a-z]+)?)$/.exec(templateName);

			if (!templateParts || !templateParts.length) {
				return;
			}

			this.lastLayoutTemplate = $('[title="' + templateName.replace(/_/g, ' ') + '"]').parents('.layouttemplate');

			// try to find encoded template args, if supplied (EXPERIMENTAL)
			this.lastLayoutTemplate.find('.layouttemplateargs').each(function () {
				var args = this.title.split(/\s+/);
				args.shift();
				$.each(args, function (key, val) {
					if (!/\S/.test(val)) {
						return true;
					}
					templateArgs += '|' + decodeURIComponent(val.replace(/\+/g, ' ')).replace(/\|/g, '{{!}}');
				});
			});

			// {{urlencode:}} turns parser extension tags into garbage; we can't undo it, so we just give up if it's happened
			if (/\x7FUNIQ/.test(templateArgs)) {
				templateArgs = '';
			}

			$.ajax({
				url: mw.util.wikiScript('api'),
				type: 'POST',
				data: {
					format : 'json',
					action : 'parse',
					prop : 'text',
					text : '{{' + templateName + templateArgs + '}}',
					title : mw.config.get('wgPageName'),
					uselang : templateParts[2]
				},
				dataType: 'json',
				success: function (result) {
					if (result && result.parse && result.parse.text['*']) {
						aT.lastLayoutTemplate.replaceWith(result.parse.text['*']);
						$('.translatedTag').hide();
						aT.updateLangLinks();
					}
				}
			});

			e.preventDefault();
		}
	};

	AjaxTranslations.state = 'Waiting for DOM-ready';

	mw.loader.using(['mediawiki.util', 'mediawiki.RegExp'], function () {
		$(document).ready(AjaxTranslations.updateLangLinks);
	});

	mw.libs.AjaxTranslations = AjaxTranslations;

}(mediaWiki, jQuery));
//</nowiki>