User:Mike Dillon/Scripts/i18n.js

var wgMessageCache = {};

var wgFallbackLanguage;

function wfAddMsg(lang, key, value) { if (!wgMessageCache[lang]) { wgMessageCache[lang] = {}; }   wgMessageCache[lang][key.toLowerCase] = value; }

function wfMsgReal(key, forContent, args) { function wfMsgGet(lang, key) { if (!wgMessageCache[lang]) return null; return wgMessageCache[lang][key.toLowerCase]; }

// Bail out of the key is null if (key == null) return null;

var msg = null;

// Look for message in user language if (!forContent) { msg = wfMsgGet(wgUserLanguage, key); }

// Else, use content language if (msg == null) { msg = wfMsgGet(wgContentLanguage, key); }

// Else, use fallback language if (msg == null && wgFallbackLanguage) { msg = wfMsgGet(wgFallbackLanguage, key); }

// Else, use fallback text if (msg == null) { msg = "<" + key.toLowerCase + ">"; }

// Replace positional placeholders (e.g. $1 or ${1}) if (args.length > 1) { var re = /\$(?:([1-9]\d*)|\{([1-9]\d*)\})/g;

var m;       var toReplace = []; while (m = re.exec(msg)) { toReplace.push({               'pos': re.lastIndex - m[0].length,                'len': m[0].length,                'arg': m[1] || m[2]            }); }

var adjust = 0; for (var n in toReplace) { var replacement = args[toReplace[n].arg]; if (replacement == null) continue; replacement = replacement.toString;

toReplace[n].pos += adjust;

msg = msg.substring(0, toReplace[n].pos) + replacement + msg.substring(toReplace[n].pos + toReplace[n].len);

adjust += replacement.length - toReplace[n].len; }   }

return msg; }

function wfMsg(key) { return wfMsgReal(key, false, arguments); }

function wfMsgForContent(key) { return wfMsgReal(key, true, arguments); }