/*
* This file is part of Adblock Plus ,
* Copyright (C) 2006-2013 Eyeo GmbH
*
* Adblock Plus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* Adblock Plus is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Adblock Plus. If not, see .
*/
(function () {
const LOCALE = chrome.i18n.getMessage('@@ui_locale'),
ON_POPUP = (document.location.pathname == "/skin/popup.html");
function localizeFaqLink() {
const LOCALIZED_HOMEPAGE_LOCALES = ['es'];
if (ON_POPUP && LOCALIZED_HOMEPAGE_LOCALES.includes(LOCALE)) {
// update FAQ link to point to localized version
$('#help').prop('href', `https://privacybadger.org/${LOCALE}/#faq`);
}
}
function setTextDirection() {
function toggle_css_value(selector, property, from, to) {
let $els = $(selector);
$els.each(i => {
let $el = $($els[i]);
if ($el.css(property) === from) {
$el.css(property, to);
}
});
}
// https://www.w3.org/International/questions/qa-scripts#examples
// https://developer.chrome.com/webstore/i18n?csw=1#localeTable
// TODO duplicated in src/js/webrequest.js
const RTL_LOCALES = ['ar', 'he', 'fa'];
if (!RTL_LOCALES.includes(LOCALE)) {
return;
}
// set body text direction
document.body.setAttribute("dir", "rtl");
// popup page
if (ON_POPUP) {
// fix floats
['#privacyBadgerHeader img', '#header-image-stack', '#version'].forEach((selector) => {
toggle_css_value(selector, "float", "left", "right");
});
['#fittslaw', '#options', '#help', '#share', '.overlay_close'].forEach((selector) => {
toggle_css_value(selector, "float", "right", "left");
});
// options page
} else if (document.location.pathname == "/skin/options.html") {
// apply RTL workaround for jQuery UI tabs
// https://zoomicon.wordpress.com/2009/10/15/how-to-use-jqueryui-tabs-in-right-to-left-layout/
let css = document.createElement("style");
css.type = "text/css";
css.textContent = `
.ui-tabs { direction: rtl; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected,
.ui-tabs .ui-tabs-nav li.ui-state-default { float: right; }
.ui-tabs .ui-tabs-nav li a { float: right; }
`;
document.body.appendChild(css);
// fix floats
['.btn-silo', '.btn-silo div', '#allowlist-form > div > div > div'].forEach((selector) => {
toggle_css_value(selector, "float", "left", "right");
});
}
}
/**
* Loads and inserts i18n strings into matching elements.
*/
function loadI18nStrings() {
let els = document.querySelectorAll("[class^='i18n_']");
// replace element contents by their class names
for (let el of els) {
const key = el.className.split(/\s/)[0].slice(5),
prop = ("innerHTML" in el ? "innerHTML" : "textContent");
// get chrome.i18n placeholders, if any
let placeholders = el.dataset.i18n_contents_placeholders;
placeholders = (placeholders ? placeholders.split("@@") : []);
// replace contents
el[prop] = chrome.i18n.getMessage(key, placeholders);
}
// also replace alt, placeholder and title attributes
const ATTRS = [
'alt',
'placeholder',
'title',
];
// get all the elements that contain one or more of these attributes
els = document.querySelectorAll(
// for example: "[placeholder^='i18n_'], [title^='i18n_']"
"[" + ATTRS.join("^='i18n_'], [") + "^='i18n_']"
);
// for each element
for (let el of els) {
// for each attribute
for (let attr_type of ATTRS) {
// get the translation message key
let key = el.getAttribute(attr_type);
// attribute exists
if (key) {
// remove the i18n_ prefix
key = key.startsWith("i18n_") && key.slice(5);
}
if (!key) {
continue;
}
// get chrome.i18n placeholders, if any
// TODO multiple attributes are not supported
let placeholders = el.dataset.i18n_attribute_placeholders;
placeholders = (placeholders ? placeholders.split("@@") : []);
// update the attribute with the result of a translation lookup by KEY
el.setAttribute(attr_type, chrome.i18n.getMessage(key, placeholders));
}
}
}
// Fill in the strings as soon as possible
window.addEventListener("DOMContentLoaded", function () {
localizeFaqLink();
setTextDirection();
loadI18nStrings();
}, true);
}());