Initial implementation of MathJax.Localization. Some experiments with French localization.
This commit is contained in:
parent
fc7aa04a44
commit
4ced117e05
|
@ -1,3 +1,5 @@
|
||||||
|
/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
|
||||||
|
/* vim: set ts=2 et sw=2 tw=80: */
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
*
|
*
|
||||||
* MathJax.js
|
* MathJax.js
|
||||||
|
@ -2476,3 +2478,313 @@ MathJax.Hub.Startup = {
|
||||||
}}
|
}}
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
|
|
||||||
|
MathJax.Localization = {
|
||||||
|
|
||||||
|
locale: "fr",
|
||||||
|
directory: "[MathJax]/localization",
|
||||||
|
strings: {
|
||||||
|
fr: {
|
||||||
|
isLoaded: true,
|
||||||
|
domains: {
|
||||||
|
"_": {
|
||||||
|
strings: {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// FontWarnings: {
|
||||||
|
// isLoaded: true,
|
||||||
|
// strings: {
|
||||||
|
// fonts:
|
||||||
|
// [
|
||||||
|
// ["p"],
|
||||||
|
// "MathJax peut utiliser soit les ",
|
||||||
|
// ["a",{href:"http://www.stixfonts.org/",target:"_blank"},"polices STIX"],
|
||||||
|
// " soit les ",
|
||||||
|
// ["a",{href:"http://www.mathjax.org/help-v2/fonts/",target:"_blank"},["polices TeX de MathJax"]],
|
||||||
|
// ". Téléchargez et installez une de ces familles pour rendre plus confortable votre utilisation de MathJax."
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
|
Menu: {
|
||||||
|
isLoaded: true,
|
||||||
|
strings: {
|
||||||
|
WebkitNativeMMLWarning:
|
||||||
|
|
||||||
|
"Votre navigateur ne semble pas comporter de support MathML, " +
|
||||||
|
"changer le mode de rendu pourrait rendre illisibles " +
|
||||||
|
"les expressions mathématiques.",
|
||||||
|
|
||||||
|
MSIENativeMMLWarning:
|
||||||
|
|
||||||
|
"Internet Explorer a besoin de module complémentaire MathPlayer " +
|
||||||
|
"pour afficher le MathML.",
|
||||||
|
|
||||||
|
OperaNativeMMLWarning:
|
||||||
|
|
||||||
|
"Le support MathML d'Opera est limité, changer le mode de rendu " +
|
||||||
|
"pourrait entrainer un affichage médiocre de certaines expressions.",
|
||||||
|
|
||||||
|
SafariNativeMMLWarning:
|
||||||
|
|
||||||
|
"Le support MathML natif de votre navigateur ne comporte pas " +
|
||||||
|
"toutes les fonctionnalités requises par MathJax, certaines " +
|
||||||
|
"expressions pourront donc ne pas s'afficher correctement.",
|
||||||
|
|
||||||
|
FirefoxNativeMMLWarning:
|
||||||
|
|
||||||
|
"Le support MathML natif de votre navigateur ne comporte pas " +
|
||||||
|
"toutes les fonctionnalités requises par MathJax, certaines " +
|
||||||
|
"expressions pourront donc ne pas s'afficher correctement.",
|
||||||
|
|
||||||
|
SwitchAnyway:
|
||||||
|
"Êtes vous certain de vouloir changer le mode de rendu ?\n\n" +
|
||||||
|
"Appuyez sur OK pour valider ou Annuler pour continuer avec le " +
|
||||||
|
"mode de rendu actuellement sélectionné.",
|
||||||
|
|
||||||
|
ScaleMath:
|
||||||
|
"Mise à l'échelle des expressions mathématiques (par rapport au " +
|
||||||
|
"text environnant) de %1%%",
|
||||||
|
|
||||||
|
NonZeroScale:
|
||||||
|
"L'échelle ne peut être nulle",
|
||||||
|
|
||||||
|
PercentScale:
|
||||||
|
"L'échelle doit être un pourcentage (e.g. 120%%)",
|
||||||
|
|
||||||
|
IE8warning:
|
||||||
|
"Ceci désactivera le menu de MathJax et les fonctionalités de " +
|
||||||
|
"zoom mais vous pourrez toujours obtenir le menu de MathJax " +
|
||||||
|
"en utilisant la commande Alt+Clic sur une expression.\n\n" +
|
||||||
|
"Êtes vous certain de vouloir choisir les options de MathPlayer?",
|
||||||
|
|
||||||
|
IE9warning:
|
||||||
|
"Le menu contextuel de MathJax sera désactivé, " +
|
||||||
|
"mais vous pourrez toujours obtenir le menu de MathJax " +
|
||||||
|
"en utilisant la commande Alt-Clic sur une expression.",
|
||||||
|
|
||||||
|
NoOriginalForm:
|
||||||
|
"Aucune forme originelle",
|
||||||
|
|
||||||
|
Close:
|
||||||
|
"Fermer",
|
||||||
|
|
||||||
|
EqSource:
|
||||||
|
"Source de l'équation MathJax"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_: function (messageId, englishPhrase) {
|
||||||
|
|
||||||
|
// These variables are used in string parsing
|
||||||
|
var plural = this.plural;
|
||||||
|
var args = arguments;
|
||||||
|
var i, s, result;
|
||||||
|
|
||||||
|
function parseNextUnicodePoint(appendToResult)
|
||||||
|
{
|
||||||
|
var n = s.charCodeAt(i);
|
||||||
|
if (n <= 0xD7FF || 0xE000 <= n) {
|
||||||
|
// Code points U+0000 to U+D7FF and U+E000 to U+FFFF.
|
||||||
|
// Append the character.
|
||||||
|
if (appendToResult) result += s[i]
|
||||||
|
i++;
|
||||||
|
return;
|
||||||
|
} else if (i+1 < m) {
|
||||||
|
// Code points U+10000 to U+10FFFF
|
||||||
|
// Append the surrogate pairs.
|
||||||
|
if (appendToResult) { result += s[i]; result += s[i+1]; }
|
||||||
|
i+=2
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Ignore lead surrogate at the end of the string.
|
||||||
|
// This should not happen with valid unicode string.
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseArgument(appendToResult)
|
||||||
|
{
|
||||||
|
if (!(/\d/.test(s[0]))) return false;
|
||||||
|
|
||||||
|
// %INTEGER argument substitution
|
||||||
|
var argIndex = s.match(/^\d+/)[0];
|
||||||
|
i += argIndex.length;
|
||||||
|
var key = +argIndex+1;
|
||||||
|
if (key in args) {
|
||||||
|
if (appendToResult) { result += args[key]; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalid index: just %INTEGER and continue
|
||||||
|
if (appendToResult) { result += "%" + argIndex; }
|
||||||
|
i++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseInteger(appendToResult)
|
||||||
|
{
|
||||||
|
var number = s.match(/^\{(\d+)\}/);
|
||||||
|
if (!number) return false;
|
||||||
|
|
||||||
|
// %{INTEGER} escaped integer
|
||||||
|
if (appendToResult) { result += number[1]; }
|
||||||
|
i += number[0].length;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseChoiceBlock(blockName, choiceFunction)
|
||||||
|
{
|
||||||
|
var pattern = "^\\{"+blockName+":%(\\d)+\\|";
|
||||||
|
var blockStart = s.match(pattern);
|
||||||
|
if (!blockStart) return false;
|
||||||
|
|
||||||
|
var key = +blockStart[1]+1;
|
||||||
|
if (!(key in args)) return false;
|
||||||
|
|
||||||
|
// %\{blockName:%INTEGER|form1|form2 ... \}
|
||||||
|
i = blockStart[0].length;
|
||||||
|
|
||||||
|
var choiceIndex = choiceFunction(args[key]), j = 1;
|
||||||
|
var isChosenBlock = (j === choiceIndex);
|
||||||
|
var blockFound = false;
|
||||||
|
|
||||||
|
while (i < m) {
|
||||||
|
if (s[i] == "|") {
|
||||||
|
// new choice block
|
||||||
|
i++; j++;
|
||||||
|
isChosenBlock = (j === choiceIndex);
|
||||||
|
if (isChosenBlock) blockFound = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (s[i] == "}") {
|
||||||
|
// closing brace
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (s[i] != "%" || i+1 == m) {
|
||||||
|
// normal char or % at the end of the string
|
||||||
|
parseNextUnicodePoint(isChosenBlock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep only the substring after the %
|
||||||
|
i++; s = s.substr(i); m -= i; i = 0;
|
||||||
|
|
||||||
|
// %INTEGER argument substitution
|
||||||
|
if (parseArgument(isChosenBlock)) continue;
|
||||||
|
|
||||||
|
// %{INTEGER} escaped integer
|
||||||
|
if (parseInteger(isChosenBlock)) continue;
|
||||||
|
|
||||||
|
// %CHAR: escaped character
|
||||||
|
parseNextUnicodePoint(isChosenBlock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!blockFound) {
|
||||||
|
i = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function transformString(string)
|
||||||
|
{
|
||||||
|
s = string;
|
||||||
|
i = 0;
|
||||||
|
m = s.length;
|
||||||
|
result = "";
|
||||||
|
|
||||||
|
while (i < m) {
|
||||||
|
if (s[i] != "%" || i+1 == m) {
|
||||||
|
// normal char or % at the end of the string
|
||||||
|
parseNextUnicodePoint(true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep only the substring after the %
|
||||||
|
i++; s = s.substr(i); m -= i; i = 0;
|
||||||
|
|
||||||
|
// %INTEGER argument substitution
|
||||||
|
if (parseArgument(true)) continue;
|
||||||
|
|
||||||
|
// %{INTEGER} escaped integer
|
||||||
|
if (parseInteger(true)) continue;
|
||||||
|
|
||||||
|
// %\{plural:%INTEGER|form1|form2 ... \} plural forms
|
||||||
|
if (parseChoiceBlock("plural", plural)) continue;
|
||||||
|
|
||||||
|
// %CHAR: escaped character
|
||||||
|
parseNextUnicodePoint(true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function transformHTMLSnippet(snippet)
|
||||||
|
{
|
||||||
|
for (key in snippet) {
|
||||||
|
var e = snippet[key];
|
||||||
|
if (typeof e === "string") {
|
||||||
|
snippet[key] = transformString(e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var lastIndex = e.length-1;
|
||||||
|
if (Array.isArray(e[lastIndex])) {
|
||||||
|
e[lastIndex] = transformHTMLSnippet(e[lastIndex]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return snippet;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to get the translated phrase or use the englishPhrase fallback
|
||||||
|
var phrase = englishPhrase;
|
||||||
|
var translationData = this.strings[this.locale];
|
||||||
|
if (translationData) {
|
||||||
|
if (translationData.isLoaded) {
|
||||||
|
var domain = "_";
|
||||||
|
if (Array.isArray(messageId) && messageId.length == 2) {
|
||||||
|
domain = messageId[0];
|
||||||
|
messageId = messageId[1];
|
||||||
|
}
|
||||||
|
if (domain in translationData.domains) {
|
||||||
|
domain = translationData.domains[domain]
|
||||||
|
if (domain.isLoaded && messageId in domain.strings) {
|
||||||
|
phrase = domain.strings[messageId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof phrase === "string") {
|
||||||
|
// handle the phrase as a simple string
|
||||||
|
return transformString(phrase);
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the phrase as a HTML snippet
|
||||||
|
return transformHTMLSnippet(phrase);
|
||||||
|
},
|
||||||
|
|
||||||
|
setLocale: function(locale) {
|
||||||
|
this.locale = locale;
|
||||||
|
// TODO
|
||||||
|
},
|
||||||
|
|
||||||
|
addTranslation: function (locale, domain, definition) {
|
||||||
|
// TODO
|
||||||
|
},
|
||||||
|
|
||||||
|
fontFamily: function () {
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
plural: function(n) {
|
||||||
|
if (n == 1) return 1;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
|
||||||
|
/* vim: set ts=2 et sw=2 tw=80: */
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
*
|
*
|
||||||
* MathJax/extensions/MathMenu.js
|
* MathJax/extensions/MathMenu.js
|
||||||
|
@ -33,6 +35,13 @@
|
||||||
signal: SIGNAL
|
signal: SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var _ = function (id) {
|
||||||
|
return MathJax.Localization._.apply(
|
||||||
|
MathJax.Localization,
|
||||||
|
[ ["Menu", id] ].concat([].slice.call(arguments,1))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
var isPC = HUB.Browser.isPC, isMSIE = HUB.Browser.isMSIE, isIE9 = ((document.documentMode||0) > 8);
|
var isPC = HUB.Browser.isPC, isMSIE = HUB.Browser.isMSIE, isIE9 = ((document.documentMode||0) > 8);
|
||||||
var ROUND = (isPC ? null : "5px");
|
var ROUND = (isPC ? null : "5px");
|
||||||
|
|
||||||
|
@ -690,7 +699,10 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (MENU.jax.originalText == null) {alert("No original form available"); return}
|
if (MENU.jax.originalText == null) {
|
||||||
|
alert(_("NoOriginalForm", "No original form available"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
MENU.ShowSource.Text(MENU.jax.originalText,event);
|
MENU.ShowSource.Text(MENU.jax.originalText,event);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -706,16 +718,17 @@
|
||||||
var w = MENU.ShowSource.Window(event); delete MENU.ShowSource.w;
|
var w = MENU.ShowSource.Window(event); delete MENU.ShowSource.w;
|
||||||
text = text.replace(/^\s*/,"").replace(/\s*$/,"");
|
text = text.replace(/^\s*/,"").replace(/\s*$/,"");
|
||||||
text = text.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
|
text = text.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
|
||||||
|
var title = _("EqSource", "MathJax Equation Source");
|
||||||
if (MENU.isMobile) {
|
if (MENU.isMobile) {
|
||||||
w.document.open();
|
w.document.open();
|
||||||
w.document.write("<html><head><meta name='viewport' content='width=device-width, initial-scale=1.0' /><title>MathJax Equation Source</title></head><body style='font-size:85%'>");
|
w.document.write("<html><head><meta name='viewport' content='width=device-width, initial-scale=1.0' /><title>"+title+"</title></head><body style='font-size:85%'>");
|
||||||
w.document.write("<pre>"+text+"</pre>");
|
w.document.write("<pre>"+text+"</pre>");
|
||||||
w.document.write("<hr><input type='button' value='Close' onclick='window.close()' />");
|
w.document.write("<hr><input type='button' value='"+_("Close", "Close")+"' onclick='window.close()' />");
|
||||||
w.document.write("</body></html>");
|
w.document.write("</body></html>");
|
||||||
w.document.close();
|
w.document.close();
|
||||||
} else {
|
} else {
|
||||||
w.document.open();
|
w.document.open();
|
||||||
w.document.write("<html><head><title>MathJax Equation Source</title></head><body style='font-size:85%'>");
|
w.document.write("<html><head><title>"+title+"</title></head><body style='font-size:85%'>");
|
||||||
w.document.write("<table><tr><td><pre>"+text+"</pre></td></tr></table>");
|
w.document.write("<table><tr><td><pre>"+text+"</pre></td></tr></table>");
|
||||||
w.document.write("</body></html>");
|
w.document.write("</body></html>");
|
||||||
w.document.close();
|
w.document.close();
|
||||||
|
@ -740,7 +753,7 @@
|
||||||
MENU.Scale = function () {
|
MENU.Scale = function () {
|
||||||
var HTMLCSS = OUTPUT["HTML-CSS"], nMML = OUTPUT.NativeMML, SVG = OUTPUT.SVG;
|
var HTMLCSS = OUTPUT["HTML-CSS"], nMML = OUTPUT.NativeMML, SVG = OUTPUT.SVG;
|
||||||
var SCALE = (HTMLCSS||nMML||SVG||{config:{scale:100}}).config.scale;
|
var SCALE = (HTMLCSS||nMML||SVG||{config:{scale:100}}).config.scale;
|
||||||
var scale = prompt("Scale all mathematics (compared to surrounding text) by",SCALE+"%");
|
var scale = prompt(_("ScaleMath", "Scale all mathematics (compared to surrounding text) by %1%%",SCALE));
|
||||||
if (scale) {
|
if (scale) {
|
||||||
if (scale.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)) {
|
if (scale.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)) {
|
||||||
scale = parseFloat(scale);
|
scale = parseFloat(scale);
|
||||||
|
@ -752,8 +765,9 @@
|
||||||
MENU.cookie.scale = scale;
|
MENU.cookie.scale = scale;
|
||||||
MENU.saveCookie(); HUB.Reprocess();
|
MENU.saveCookie(); HUB.Reprocess();
|
||||||
}
|
}
|
||||||
} else {alert("The scale should not be zero")}
|
} else {alert(_("NonZeroScale", "The scale should not be zero"))}
|
||||||
} else {alert("The scale should be a percentage (e.g., 120%)")}
|
} else {alert(_("PercentScale",
|
||||||
|
"The scale should be a percentage (e.g., 120%%)"))}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -791,8 +805,10 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (message) {
|
if (message) {
|
||||||
message += "\n\nSwitch the renderer anyway?\n\n" +
|
message += "\n\n";
|
||||||
"(Press OK to switch, CANCEL to continue with the current renderer)";
|
message += _("SwitchAnyway",
|
||||||
|
"Switch the renderer anyway?\n\n" +
|
||||||
|
"(Press OK to switch, CANCEL to continue with the current renderer)");
|
||||||
MENU.cookie.renderer = jax[0].id; MENU.saveCookie(); if (!confirm(message)) {return}
|
MENU.cookie.renderer = jax[0].id; MENU.saveCookie(); if (!confirm(message)) {return}
|
||||||
if (warned) {MENU.cookie[warned] = CONFIG.settings[warned] = true}
|
if (warned) {MENU.cookie[warned] = CONFIG.settings[warned] = true}
|
||||||
MENU.cookie.renderer = CONFIG.settings.renderer; MENU.saveCookie();
|
MENU.cookie.renderer = CONFIG.settings.renderer; MENU.saveCookie();
|
||||||
|
@ -805,28 +821,34 @@
|
||||||
};
|
};
|
||||||
MENU.Renderer.Messages = {
|
MENU.Renderer.Messages = {
|
||||||
MML: {
|
MML: {
|
||||||
WebKit: "Your browser doesn't seem to support MathML natively, " +
|
WebKit: _("WebkitNativeMMLWarning",
|
||||||
|
"Your browser doesn't seem to support MathML natively, " +
|
||||||
"so switching to MathML output may cause the mathematics " +
|
"so switching to MathML output may cause the mathematics " +
|
||||||
"on the page to become unreadable.",
|
"on the page to become unreadable."),
|
||||||
|
|
||||||
MSIE: "Internet Explorer requires the MathPlayer plugin " +
|
MSIE: _("MSIENativeMMLWarning",
|
||||||
"in order to process MathML output.",
|
"Internet Explorer requires the MathPlayer plugin " +
|
||||||
|
"in order to process MathML output."),
|
||||||
|
|
||||||
Opera: "Opera's support for MathML is limited, so switching to " +
|
Opera: _("OperaNativeMMLWarning",
|
||||||
"MathML output may cause some expressions to render poorly.",
|
"Opera's support for MathML is limited, so switching to " +
|
||||||
|
"MathML output may cause some expressions to render poorly."),
|
||||||
|
|
||||||
Safari: "Your browser's native MathML does not implement all the features " +
|
Safari: _("SafariNativeMMLWarning",
|
||||||
"used by MathJax, so some expressions may not render properly.",
|
"Your browser's native MathML does not implement all the features " +
|
||||||
|
"used by MathJax, so some expressions may not render properly."),
|
||||||
|
|
||||||
Firefox: "Your browser's native MathML does not implement all the features " +
|
Firefox: _("FirefoxNativeMMLWarning",
|
||||||
"used by MathJax, so some expressions may not render properly."
|
"Your browser's native MathML does not implement all the features " +
|
||||||
|
"used by MathJax, so some expressions may not render properly.")
|
||||||
},
|
},
|
||||||
|
|
||||||
SVG: {
|
SVG: {
|
||||||
MSIE: "SVG is not implemented in Internet Explorer prior to " +
|
MSIE: _("MSIESVGWarning",
|
||||||
|
"SVG is not implemented in Internet Explorer prior to " +
|
||||||
"IE9, or when the browser is emulating IE8 or below. " +
|
"IE9, or when the browser is emulating IE8 or below. " +
|
||||||
"Switching to SVG output will cause the mathemtics to " +
|
"Switching to SVG output will cause the mathemtics to " +
|
||||||
"not display properly."
|
"not display properly.")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -861,13 +883,15 @@
|
||||||
};
|
};
|
||||||
MENU.MPEvents.Messages = {
|
MENU.MPEvents.Messages = {
|
||||||
IE8warning:
|
IE8warning:
|
||||||
|
_("IE8warning",
|
||||||
"This will disable the MathJax menu and zoom features, " +
|
"This will disable the MathJax menu and zoom features, " +
|
||||||
"but you can Alt-Click on an expression to obtain the MathJax " +
|
"but you can Alt-Click on an expression to obtain the MathJax " +
|
||||||
"menu instead.\n\nReally change the MathPlayer settings?",
|
"menu instead.\n\nReally change the MathPlayer settings?"),
|
||||||
|
|
||||||
IE9warning:
|
IE9warning:
|
||||||
|
_("IE9warning",
|
||||||
"The MathJax contextual menu will be disabled, but you can " +
|
"The MathJax contextual menu will be disabled, but you can " +
|
||||||
"Alt-Click on an expression to obtain the MathJax menu instead."
|
"Alt-Click on an expression to obtain the MathJax menu instead.")
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user