566 lines
15 KiB
JavaScript
566 lines
15 KiB
JavaScript
"use strict";
|
|
|
|
!function(F, d) {
|
|
function t(a) {
|
|
return k.l10n._(a);
|
|
}
|
|
function G(a, b, c) {
|
|
return k.l10n.n(a, b, c);
|
|
}
|
|
function y(a) {
|
|
return a.format(0, ".", Ba);
|
|
}
|
|
function Ca(a) {
|
|
k.ajax.post("sync", ja, function(b) {
|
|
const c = [];
|
|
var f = b.pot, g = b.po;
|
|
const r = b.done || {
|
|
add: [],
|
|
del: [],
|
|
fuz: []
|
|
};
|
|
var n = r.add.length;
|
|
const u = r.del.length, z = r.fuz.length, B = r.trn || 0;
|
|
C.clear().load(g);
|
|
h.load(C);
|
|
Y(h);
|
|
if (n || u || z || B) {
|
|
if (f ? c.push(v(t("Merged from %s"), f)) : c.push(t("Merged from source code")),
|
|
n && c.push(v(G("%s new string added", "%s new strings added", n), y(n))), u && c.push(v(G("%s obsolete string removed", "%s obsolete strings removed", u), y(u))),
|
|
z && c.push(v(G("%s string marked Fuzzy", "%s strings marked Fuzzy", z), y(z))),
|
|
B && c.push(v(G("%s translation copied", "%s translations copied", B), y(B))), d(H).trigger("poUnsaved", []),
|
|
R(), Da && F.console) {
|
|
f = console;
|
|
g = -1;
|
|
for (n = r.add.length; ++g < n; ) f.log(" + " + String(r.add[g]));
|
|
n = r.del.length;
|
|
for (g = 0; g < n; g++) f.log(" - " + String(r.del[g]));
|
|
n = r.fuz.length;
|
|
for (g = 0; g < n; g++) f.log(" ~ " + String(r.fuz[g]));
|
|
}
|
|
} else f ? c.push(v(t("Strings up to date with %s"), f)) : c.push(t("Strings up to date with source code"));
|
|
k.notices.success(c.join(". "));
|
|
d(H).trigger("poMerge", [ b ]);
|
|
a && a();
|
|
}, a);
|
|
}
|
|
function Ea(a) {
|
|
const b = a.currentTarget;
|
|
a.stopImmediatePropagation();
|
|
b.disabled = !0;
|
|
ka();
|
|
b.disabled = !1;
|
|
}
|
|
function ka() {
|
|
const a = [];
|
|
C.each(function(b, c) {
|
|
h.validate(c) && a.push(c);
|
|
});
|
|
k.notices.clear();
|
|
la(a);
|
|
}
|
|
function Y(a) {
|
|
a.invalid && (la(a.invalid), a.invalid = null);
|
|
}
|
|
function la(a) {
|
|
const b = a.length;
|
|
if (0 === b) k.notices.success(t("No formatting errors detected")); else {
|
|
const c = [ v(G("%s possible error detected", "%s possible errors detected", b), b), t("Check the translations marked with a warning sign") ];
|
|
k.notices.warn(c.join(". ")).slow();
|
|
}
|
|
0 < b && h.current(a[0]);
|
|
}
|
|
function Fa(a) {
|
|
const b = a.id, c = k.apis, f = c.providers();
|
|
return c.create(a, f[b] || f._);
|
|
}
|
|
function ma() {
|
|
for (var a = -1, b, c = [], f = K, g = f.length, r = String(Ga); ++a < g; ) try {
|
|
b = f[a], null == b.src && (b.src = r), c.push(Fa(b));
|
|
} catch (n) {
|
|
k.notices.error(String(n));
|
|
}
|
|
return c;
|
|
}
|
|
function na(a) {
|
|
function b(f) {
|
|
Z = new Date().getTime();
|
|
K = f && f.apis || [];
|
|
0 === K.length ? N = aa("loco-apis-empty", f.html) : S = aa("loco-apis-batch", f.html);
|
|
c.remove();
|
|
a(K);
|
|
}
|
|
if (T || oa) k.notices.error("APIs not available in current mode"); else if (null == K || 0 === K.length || 10 < Math.round((new Date().getTime() - Z) / 1e3)) {
|
|
N && N.remove();
|
|
N = null;
|
|
S && S.remove();
|
|
S = null;
|
|
U && U.remove();
|
|
K = U = null;
|
|
var c = d('<div><div class="loco-loading"></div></div>').dialog({
|
|
dialogClass: "loco-modal loco-modal-no-close",
|
|
appendTo: "#loco-admin.wrap",
|
|
title: "Loading..",
|
|
modal: !0,
|
|
autoOpen: !0,
|
|
closeOnEscape: !1,
|
|
resizable: !1,
|
|
draggable: !1,
|
|
position: pa,
|
|
height: 200
|
|
});
|
|
k.ajax.get("apis", {
|
|
locale: String(D)
|
|
}, b);
|
|
} else Z = new Date().getTime(), a(K);
|
|
}
|
|
function aa(a, b) {
|
|
b = d(b);
|
|
b.attr("id", a);
|
|
b.dialog({
|
|
dialogClass: "loco-modal",
|
|
appendTo: "#loco-admin.wrap",
|
|
title: b.attr("title"),
|
|
modal: !0,
|
|
autoOpen: !1,
|
|
closeOnEscape: !0,
|
|
resizable: !1,
|
|
draggable: !1,
|
|
position: pa
|
|
});
|
|
return b;
|
|
}
|
|
function qa() {
|
|
na(function(a) {
|
|
a.length ? Ha() : ra();
|
|
});
|
|
}
|
|
function Ia(a) {
|
|
a.preventDefault();
|
|
na(function(b) {
|
|
b.length ? Ja() : ra();
|
|
});
|
|
return !1;
|
|
}
|
|
function ra() {
|
|
N ? N.dialog("open") : k.notices.error("Logic error. Unconfigured API modal missing");
|
|
}
|
|
function Ja() {
|
|
function a(e) {
|
|
a: {
|
|
var q = d(e.api).val();
|
|
for (var O, L = X || (X = ma()), P = L.length, Q = -1; ++Q < P; ) if (O = L[Q],
|
|
O.getId() === q) {
|
|
q = O;
|
|
break a;
|
|
}
|
|
k.notices.error("No " + q + " client");
|
|
q = void 0;
|
|
}
|
|
e = e.existing.checked;
|
|
M.text("Calculating....");
|
|
g = k.apis.createJob(q);
|
|
g.init(C, e);
|
|
r = q.toString();
|
|
M.text(v(t("%s unique source strings."), y(g.length)) + " " + v(t("%s characters will be sent for translation."), y(g.chars)));
|
|
E[0].disabled = g.length ? !1 : !0;
|
|
n = null;
|
|
}
|
|
function b(e) {
|
|
g && (B && e.fuzzy(0, !0), h.pasteMessage(e), e === h.active && h.setStatus(e),
|
|
h.unsave(e, 0), u++, z && !e.valid() && (z = !1));
|
|
}
|
|
function c(e, q) {
|
|
e = q ? 100 * e / q : 0;
|
|
M.text(v(t("Translation progress %s%%"), y(e)));
|
|
}
|
|
function f() {
|
|
E.removeClass("loco-loading");
|
|
if (g && n) {
|
|
var e = n.todo();
|
|
e && k.notices.warn(v(G("Translation job aborted with %s string remaining", "Translation job aborted with %s strings remaining", e), y(e))).slow();
|
|
e = [];
|
|
const q = n.did();
|
|
q && e.push(v(G("%1$s string translated via %2$s", "%1$s strings translated via %2$s", q), y(q), r));
|
|
u ? e.push(v(G("%s string updated", "%s strings updated", u), y(u))) : q && e.push(t("Nothing needed updating"));
|
|
e.length && k.notices.success(e.join(". ")).slow();
|
|
n = g = null;
|
|
}
|
|
u && (R(), h.rebuildSearch());
|
|
I && (I.off("dialogclose").dialog("close"), I = null);
|
|
h.fire("poAuto");
|
|
z || ka();
|
|
}
|
|
let g, r, n, u = 0, z = !0, B = !1, I = S.dialog("open");
|
|
const x = I.find("form"), E = x.find("button.button-primary"), M = d("#loco-job-progress");
|
|
E.removeClass("loco-loading");
|
|
E[0].disabled = !0;
|
|
k.notices.clear();
|
|
x.off("submit change");
|
|
a(x[0]);
|
|
x.on("change", function(e) {
|
|
e = e.target;
|
|
const q = e.name;
|
|
"api" !== q && "existing" !== q || a(e.form);
|
|
return !0;
|
|
}).on("submit", function(e) {
|
|
e.preventDefault();
|
|
E.addClass("loco-loading");
|
|
E[0].disabled = !0;
|
|
u = 0;
|
|
c(0);
|
|
B = e.target.fuzzy.checked;
|
|
n = g.dispatch().done(f).each(b).prog(c).stat();
|
|
});
|
|
I.off("dialogclose").on("dialogclose", function() {
|
|
g.abort();
|
|
I = null;
|
|
f();
|
|
});
|
|
}
|
|
function Ha() {
|
|
function a(l) {
|
|
if (l.isDefaultPrevented()) return !1;
|
|
var p = l.which;
|
|
let m = -1;
|
|
49 <= p && 57 >= p ? m = p - 49 : 97 <= p && 105 >= p && (m = p - 97);
|
|
return 0 <= m && 9 > m && (p = e && e.find("button.button-primary").eq(m)) && 1 === p.length ? (p.click(),
|
|
l.preventDefault(), l.stopPropagation(), !1) : !0;
|
|
}
|
|
function b(l, p) {
|
|
return function(m) {
|
|
m.preventDefault();
|
|
m.stopPropagation();
|
|
g();
|
|
m = h.current();
|
|
const A = h.getTargetOffset();
|
|
m.translate(p, A);
|
|
h.focus().reloadMessage(m);
|
|
};
|
|
}
|
|
function c(l, p, m, A) {
|
|
let ba = A.getId(), ca = P[ba], sa = String(ca + 1), Ka = A.getUrl(), ta = t("Use this translation");
|
|
A = String(A);
|
|
let ua = V && V[ba];
|
|
l = d('<button class="button button-primary"></button>').attr("tabindex", String(1 + M + ca)).on("click", b(l, p));
|
|
l.attr("accesskey", sa);
|
|
1 < q.length && (ta += " (" + sa + ")");
|
|
l.text(ta);
|
|
ua && ua.replaceWith(d('<div class="loco-api loco-api-result loco-api-' + ba + '"></div>').append(d('<div class="loco-api-credit">Translated by </div>').append(d('<a target="_blank" tabindex="-1"></a>').attr("href", Ka).text(A))).append(d("<blockquote " + I + "></blockquote>").text(p || "FAILED")).append(l));
|
|
++Q === O && (e && e.dialog("option", "title", t("Suggested translations") + " — " + m.label),
|
|
M += Q, x.attr("disabled") && x.attr("disabled", !1));
|
|
0 === ca && l.focus();
|
|
}
|
|
function f(l) {
|
|
const p = d('<div class="loco-api loco-api-loading"></div>').text("Calling " + l + " ...");
|
|
return V[l.getId()] = p;
|
|
}
|
|
function g(l) {
|
|
e && null == l && e.dialog("close");
|
|
V = P = e = null;
|
|
d(F).off("keydown", a);
|
|
}
|
|
function r(l) {
|
|
return function(p, m, A) {
|
|
L[l.getId()] = m;
|
|
c(p, m, A, l);
|
|
};
|
|
}
|
|
function n(l) {
|
|
L = va[l] || (va[l] = {});
|
|
let p = -1;
|
|
for (;++p < O; ) {
|
|
const m = q[p], A = m.getId();
|
|
e.append(f(m));
|
|
P[A] = p;
|
|
L[A] ? c(l, L[A], D, m) : m.translate(l, D, r(m));
|
|
}
|
|
}
|
|
const u = h.current();
|
|
if (!u) return !1;
|
|
var z = u.pluralized();
|
|
const B = z ? Math.min(h.getTargetOffset(), 1) : 0, I = 'lang="' + String(D) + '" dir="' + (D.isRTL() ? "RTL" : "LTR") + '"';
|
|
let x, E = u.source(null, B);
|
|
z ? (x = d('<select lang="en" name="s" disabled></select>'), u.eachSrc(function(l, p) {
|
|
var m = h.t();
|
|
m = l ? m._x("Plural", "Editor") : m._x("Single", "Editor");
|
|
m = d("<optgroup></optgroup>").attr("label", m);
|
|
x.append(m.append(d("<option></option>").attr("value", String(l)).text(p)));
|
|
}), x.val(String(B)), x.on("change", function(l) {
|
|
e.find("div.loco-api-result").remove();
|
|
V = {};
|
|
P = {};
|
|
Q = 0;
|
|
E = u.source(null, l.target.selectedIndex);
|
|
x.attr("disabled", "true");
|
|
n(E);
|
|
})) : x = d('<blockquote lang="en"></blockquote>').text(E);
|
|
let M = 99, e = (U || (U = aa("loco-apis-hint", "<div></div>"))).html("").append(d('<div class="loco-api"><p>Source text:</p></div>').append(x)).dialog("option", "title", t("Loading suggestions") + "...").off("dialogclose").on("dialogclose", g).dialog("open");
|
|
(z = u.translation(B)) && d('<div class="loco-api"><p>Current translation:</p></div>').append(d("<blockquote " + I + "></blockquote>").text(z)).append(d('<button class="button"></button>').attr("tabindex", String(++M)).text(t("Keep this translation")).on("click", function(l) {
|
|
l.preventDefault();
|
|
g();
|
|
})).appendTo(e);
|
|
const q = X || (X = ma()), O = q.length;
|
|
let L, P = {}, Q = 0, V = {};
|
|
n(E);
|
|
d(F).on("keydown", a);
|
|
return !0;
|
|
}
|
|
function La(a) {
|
|
const b = new FormData();
|
|
for (const c in a) a.hasOwnProperty(c) && b.append(c, a[c]);
|
|
return b;
|
|
}
|
|
function wa(a) {
|
|
let b = d.extend({
|
|
locale: String(C.locale() || "")
|
|
}, xa || {});
|
|
ya && ya.applyCreds(b);
|
|
da ? (b = La(b), b.append("po", new Blob([ String(C) ], {
|
|
type: "application/x-gettext"
|
|
}), String(b.path).split("/").pop() || "untitled.po")) : b.data = String(C);
|
|
k.ajax.post("save", b, function(c) {
|
|
a && a();
|
|
h.save(!0);
|
|
d("#loco-po-modified").text(c.datetime || "[datetime error]");
|
|
Y(h);
|
|
}, a);
|
|
}
|
|
function Ma() {
|
|
h.dirty && wa();
|
|
}
|
|
function Na() {
|
|
return t("Your changes will be lost if you continue without saving");
|
|
}
|
|
function Oa(a) {
|
|
function b() {
|
|
a.disabled = !1;
|
|
d(a).removeClass("loco-loading");
|
|
}
|
|
h.on("poUnsaved", function() {
|
|
a.disabled = !1;
|
|
d(a).addClass("button-primary");
|
|
}).on("poSave", function() {
|
|
a.disabled = !0;
|
|
d(a).removeClass("button-primary");
|
|
});
|
|
xa = d.extend({
|
|
path: ea
|
|
}, w.project || {});
|
|
d(a).on("click", function(c) {
|
|
c.preventDefault();
|
|
a.disabled = !0;
|
|
d(a).addClass("loco-loading");
|
|
wa(b);
|
|
return !1;
|
|
});
|
|
return !0;
|
|
}
|
|
function Pa(a) {
|
|
const b = w.project;
|
|
if (b) {
|
|
var c = function() {
|
|
a.disabled = !1;
|
|
d(a).removeClass("loco-loading");
|
|
};
|
|
h.on("poUnsaved", function() {
|
|
a.disabled = !0;
|
|
}).on("poSave", function() {
|
|
a.disabled = !1;
|
|
});
|
|
ja = {
|
|
bundle: b.bundle,
|
|
domain: b.domain,
|
|
type: T ? "pot" : "po",
|
|
path: ea || "",
|
|
sync: Qa || "",
|
|
mode: Ra || ""
|
|
};
|
|
d(a).on("click", function(f) {
|
|
f.preventDefault();
|
|
a.disabled = !0;
|
|
d(a).addClass("loco-loading");
|
|
Ca(c);
|
|
return !1;
|
|
});
|
|
a.disabled = !1;
|
|
}
|
|
return !0;
|
|
}
|
|
function Sa(a) {
|
|
h.on("poUnsaved", function() {
|
|
a.disabled = !0;
|
|
}).on("poSave poAuto", function() {
|
|
a.disabled = !1;
|
|
});
|
|
d(a).on("click", Ia);
|
|
a.disabled = !1;
|
|
return !0;
|
|
}
|
|
function Ta(a) {
|
|
d(a).on("click", Ea);
|
|
a.disabled = !1;
|
|
}
|
|
function Ua(a) {
|
|
a.disabled = !1;
|
|
d(a).on("click", function(b) {
|
|
b.preventDefault();
|
|
b = 1;
|
|
var c, f = /(\d+)$/;
|
|
for (c = "New message"; C.get(c); ) b = f.exec(c) ? Math.max(b, Number(RegExp.$1)) : b,
|
|
c = "New message " + ++b;
|
|
h.add(c);
|
|
return !1;
|
|
});
|
|
return !0;
|
|
}
|
|
function Va(a) {
|
|
a.disabled = !1;
|
|
d(a).on("click", function(b) {
|
|
b.preventDefault();
|
|
h.del();
|
|
return !1;
|
|
});
|
|
return !0;
|
|
}
|
|
function fa(a, b) {
|
|
a.disabled = !1;
|
|
d(a).on("click", function() {
|
|
let c = ea;
|
|
"archive" === b ? c = c.replace(/\.po$/, ".zip") : "binary" === b && (c = c.replace(/\.po$/, ".mo"));
|
|
const f = a.form;
|
|
f.path.value = c;
|
|
f.source.value = C.toString();
|
|
return !0;
|
|
});
|
|
return !0;
|
|
}
|
|
function ha(a) {
|
|
a.preventDefault();
|
|
return !1;
|
|
}
|
|
function R() {
|
|
var a = h.stats(), b = a.t, c = a.f, f = a.u;
|
|
b = v(G("%s string", "%s strings", b), y(b));
|
|
var g = [];
|
|
D && (b = v(t("%s%% translated"), a.p.replace("%", "")) + ", " + b, c && g.push(v(t("%s fuzzy"), y(c))),
|
|
f && g.push(v(t("%s untranslated"), y(f))), g.length && (b += " (" + g.join(", ") + ")"));
|
|
d("#loco-po-status").text(b);
|
|
}
|
|
function za(a, b) {
|
|
a = b.getAttribute("data-loco");
|
|
const c = W[a];
|
|
c && c(b, a) || d(b).addClass("loco-noop");
|
|
}
|
|
const k = F.loco, w = k && k.conf, H = document.getElementById("loco-editor-inner");
|
|
if (k && w && H) {
|
|
var Da = !!w.WP_DEBUG, ia = k.po.ref && k.po.ref.init(k, w), ja = null, xa = null, da = w.multipart, Wa = k.l10n, v = k.string.sprintf, Ba = w.wpnum && w.wpnum.thousands_sep || ",", D = w.locale, C = k.po.init(D).wrap(w.powrap), T = !D, Ga = k.locale.clone(w.source || {
|
|
lang: "en"
|
|
}), Xa = document.getElementById("loco-actions"), ea = w.popath, Qa = w.potpath, Ra = w.syncmode, J = document.getElementById("loco-fs"), ya = J && k.fs.init(J), oa = w.readonly;
|
|
J = !oa;
|
|
var K, X, va = {}, U, S, N, Z = 0, pa = {
|
|
my: "top",
|
|
at: "top",
|
|
of: "#loco-content"
|
|
};
|
|
!da || F.FormData && F.Blob || (da = !1, k.notices.warn("Your browser doesn't support Ajax file uploads. Falling back to standard postdata"));
|
|
ia || k.notices.warn("admin.js is out of date. Please empty your browser cache and reload the page.");
|
|
var Aa = function() {
|
|
var a, b = parseInt(d(H).css("min-height") || 0);
|
|
return function() {
|
|
for (var c = H, f = c.offsetTop || 0; (c = c.offsetParent) && c !== document.body; ) f += c.offsetTop || 0;
|
|
c = Math.max(b, F.innerHeight - f - 20);
|
|
a !== c && (H.style.height = String(c) + "px", a = c);
|
|
};
|
|
}();
|
|
Aa();
|
|
d(F).resize(Aa);
|
|
H.innerHTML = "";
|
|
var h = k.po.ed.init(H).localise(Wa);
|
|
k.po.kbd.init(h).add("save", J ? Ma : ha).add("hint", D && J && qa || ha).enable("copy", "clear", "enter", "next", "prev", "fuzzy", "save", "invis", "hint");
|
|
var W = {
|
|
save: J && Oa,
|
|
sync: J && Pa,
|
|
revert: function(a) {
|
|
h.on("poUnsaved", function() {
|
|
a.disabled = !1;
|
|
}).on("poSave", function() {
|
|
a.disabled = !0;
|
|
});
|
|
d(a).on("click", function(b) {
|
|
b.preventDefault();
|
|
location.reload();
|
|
return !1;
|
|
});
|
|
return !0;
|
|
},
|
|
invs: function(a) {
|
|
var b = d(a);
|
|
a.disabled = !1;
|
|
h.on("poInvs", function(c, f) {
|
|
b[f ? "addClass" : "removeClass"]("inverted");
|
|
});
|
|
b.on("click", function(c) {
|
|
c.preventDefault();
|
|
h.setInvs(!h.getInvs());
|
|
return !1;
|
|
});
|
|
k.tooltip.init(b);
|
|
return !0;
|
|
},
|
|
code: function(a) {
|
|
var b = d(a);
|
|
a.disabled = !1;
|
|
b.on("click", function(c) {
|
|
c.preventDefault();
|
|
c = !h.getMono();
|
|
b[c ? "addClass" : "removeClass"]("inverted");
|
|
h.setMono(c);
|
|
return !1;
|
|
});
|
|
k.tooltip.init(b);
|
|
return !0;
|
|
},
|
|
source: fa,
|
|
binary: T ? null : fa,
|
|
archive: T ? null : fa
|
|
};
|
|
T ? (W.add = J && Ua, W.del = J && Va) : (W.auto = Sa, W.lint = Ta);
|
|
d("#loco-editor > nav .button").each(za);
|
|
d("#loco-content > form .button").each(za);
|
|
d(Xa).on("submit", ha);
|
|
(function(a) {
|
|
function b(g) {
|
|
d(a.parentNode)[g || null == g ? "removeClass" : "addClass"]("invalid");
|
|
}
|
|
h.searchable(k.fulltext.init());
|
|
a.disabled = !1;
|
|
var c = a.value = "", f = k.watchtext(a, function(g) {
|
|
g = h.filter(g, !0);
|
|
b(g);
|
|
});
|
|
h.on("poFilter", function(g, r, n) {
|
|
c = f.val();
|
|
f.val(r || "");
|
|
b(n);
|
|
}).on("poMerge", function() {
|
|
c && h.filter(c);
|
|
});
|
|
})(document.getElementById("loco-search"));
|
|
h.on("poUnsaved", function() {
|
|
F.onbeforeunload = Na;
|
|
}).on("poSave", function() {
|
|
R();
|
|
F.onbeforeunload = null;
|
|
}).on("poHint", qa).on("poUpdate", R).on("poMeta", function(a, b) {
|
|
b = "CODE" === b.tagName ? b : b.getElementsByTagName("CODE")[0];
|
|
return b && ia ? (ia.load(b.textContent), a.preventDefault(), !1) : !0;
|
|
});
|
|
C.load(w.podata);
|
|
h.load(C);
|
|
(D = h.targetLocale) ? D.isRTL() && d(H).addClass("trg-rtl") : h.unlock();
|
|
R();
|
|
Y(h);
|
|
delete k.conf;
|
|
}
|
|
}(window, window.jQuery); |